public boolean isKnownFinal(MemberInfo field) { FieldDefinition fd = fields.get(field); return fd != null && fd.isFinal(); }
public boolean isKnownEffectivelyFinal(MemberInfo field) { FieldDefinition fd = fields.get(field); return fd != null && (fd.isFinal() || initializedInCtor.contains(fd)); }
private boolean badFieldName(FieldDefinition fd) { String fieldName = fd.getName(); return !fd.isFinal() && fieldName.length() > 1 && Character.isLetter(fieldName.charAt(0)) && !Character.isLowerCase(fieldName.charAt(0)) && fieldName.indexOf('_') == -1 && Character.isLetter(fieldName.charAt(1)) && Character.isLowerCase(fieldName.charAt(1)); }
void setStaticFinalFields(Frame frame) { frame.fieldValues.forEach((mi, expr) -> { FieldDefinition fd = fields.get(mi); if(fd != null && fd.isStatic() && (fd.isFinal() || (fd.isPrivate() || fd.isPackagePrivate()) && initializedInCtor.contains(fd))) { values.put(mi, expr); } }); }
void mergeConstructor(MethodDefinition md, Frame frame, FrameContext fc) { ctorFields.put(new MemberInfo(md), frame.fieldValues); frame.fieldValues.forEach((mi, expr) -> { FieldDefinition fd = fields.get(mi); if (fd != null && !fd.isStatic() && (fd.isFinal() || (fd.isPrivate() || fd.isPackagePrivate()) && initializedInCtor.contains(fd))) { // TODO: better merging values.merge(mi, expr, (e1, e2) -> SourceAnnotator.makePhiNode(e1, e2, fc)); } }); }
private boolean checkNull(FieldContext fc, FieldDefinition fd, TypeDefinition td, FieldRecord fieldRecord, int flags) { if(!Flags.testAny(flags, FieldStats.WRITE_NONNULL) && Flags.testAny(flags, FieldStats.READ)) { int priority = 0; if(fd.isFinal() && fd.isStatic()) { priority += 20; String lcName = fd.getName().toLowerCase(Locale.ENGLISH); if (lcName.contains("null") || lcName.contains("zero") || lcName.contains("empty")) { priority += 15; } } else if(fd.isPublic()) { priority += 10; } priority += tweakForSerialization(fd, td); fc.report("FieldIsAlwaysNull", priority, getWriteAnnotations(fieldRecord)); return true; } return false; }
@Override protected void visitType(TypeDefinition td) { if(!td.isPublic()) return; for(FieldDefinition fd : td.getDeclaredFields()) { if(!fd.isStatic() && !fd.isFinal() && fd.isPublic()) { getOrCreate(td); return; } } }
@FieldVisitor public void visitField(FieldDefinition fd, FieldContext fc) { if(fd.getName().equals("serialVersionUID")) { if(!fd.isFinal()) { fc.report("SerialVersionUidNotFinal", 0); } if(!fd.isStatic()) { fc.report("SerialVersionUidNotStatic", 0); } if(fd.getFieldType().getSimpleType() == JvmType.Integer) { fc.report("SerialVersionUidNotLong", 0); } } } }
private boolean checkWrite(FieldContext fc, FieldDefinition fd, TypeDefinition td, FieldRecord fieldRecord, int flags, boolean isConstantType) { if(!Flags.testAny(flags, FieldStats.WRITE)) { if(fd.isStatic() && fd.isFinal() && isConstantType) return false; WarningAnnotation<?>[] anno = {}; int priority = 0; String warningType = fd.isPublic() || fd.isProtected() ? "UnwrittenPublicField" : "UnwrittenPrivateField"; if (fieldRecord != null && fieldRecord.firstRead != null) { anno = fieldRecord.firstRead.getAnnotations(); } if(fd.isPublic()) { priority += 5; } priority += tweakForSerialization(fd, td); if(fd.getFieldType().getSimpleType() == JvmType.Boolean) { priority += 5; } if(fd.getName().equalsIgnoreCase("debug")) { priority += 5; } fc.report(warningType, priority, anno); return true; } return false; }
@AstVisitor(nodes = AstNodes.EXPRESSIONS) public void visit(Expression expr, NodeChain nc, MethodContext mc, MethodDefinition md, Mutability m) { FieldDefinition fd = getField(expr, md); if (fd == null) return; Expression value = Exprs.getChild(expr, expr.getArguments().size() - 1); ParameterDefinition pd = getParameter(value); if (pd == null) return; if (!Types.isMutable(fd.getFieldType()) && !m.isKnownMutable(fd.getFieldType())) return; int priority = 0; if (md.isProtected() || fd.isProtected()) priority += 10; if (md.isVarArgs() && pd.getPosition() == md.getParameters().size() - 1) priority += 10; if (nc.getParent() == null && nc.getRoot().getBody().size() == 1) priority += 15; else if (!fd.isFinal()) priority += 3; String type = fd.isStatic() ? "ExposeMutableStaticFieldViaParameter" : "ExposeMutableFieldViaParameter"; mc.report(type, priority, expr, Roles.FIELD_TYPE.create(fd.getFieldType())); }
if(fd.isStatic() && fd.isFinal() && isConstantType) return; if (fieldRecord != null && !fd.isStatic() && fd.isFinal() && fieldRecord.constant != null) { fc.report("FieldShouldBeStatic", 0, fieldRecord.firstWrite.getAnnotations()); return; if(fd.isPublic()) { priority += 5; if(fd.isFinal()) { priority += 5; if(fd.isStatic()) { if(td.isEnum() && fieldRecord != null && !fd.isStatic()) { boolean mutable = fieldRecord.mutable; if(fd.isPublic() && (!fd.isFinal() || mutable)) { fc.report("MutableEnumField", 0, getWriteAnnotations(fieldRecord)); return; if(!fd.isFinal() && Flags.testAny(flags, FieldStats.WRITE_CONSTRUCTOR) && !Flags.testAny(flags, FieldStats.WRITE_CLASS | FieldStats.WRITE_PACKAGE | FieldStats.WRITE_OUTSIDE)) { String type = "StaticFieldShouldBeRefactoredToFinal"; if(mutable || !fd.isFinal()) { String type = null; WarningAnnotation<?>[] anno = ArrayUtilities.append(getWriteAnnotations(fieldRecord), type = td.isInterface() ? "StaticFieldShouldBeNonInterfacePackagePrivate" : "StaticFieldShouldBePackagePrivate";
if (definition != null && definition.isFinal() && definition.getConstantValue() != null) { node.getParent().remove(); return null;
if (definition != null && definition.isFinal() && definition.getConstantValue() != null) { node.getParent().remove(); return null;
if (definition != null && definition.isFinal() && definition.getConstantValue() != null) { node.getParent().remove(); return null;
if (f.isStatic() && f.isFinal() && !f.hasConstantValue()) { nv.addExistingName(f.getName());
if (f.isStatic() && f.isFinal() && !f.hasConstantValue()) { nv.addExistingName(f.getName());
if (f.isStatic() && f.isFinal() && !f.hasConstantValue()) { nv.addExistingName(f.getName());
resolvedField.isFinal() && StringUtilities.equals(resolvedField.getDeclaringType().getInternalName(), _context.getCurrentType().getInternalName())) {
resolvedField.isFinal() && StringUtilities.equals(resolvedField.getDeclaringType().getInternalName(), _context.getCurrentType().getInternalName())) {
resolvedField.isFinal() && StringUtilities.equals(resolvedField.getDeclaringType().getInternalName(), _context.getCurrentType().getInternalName())) {