/** * Returns true if this method declaration is a member of an interface type. */ public boolean isInterfaceMember() { // for a real class/interface the 3rd parent is a ClassOrInterfaceDeclaration, // for anonymous classes, the parent is e.g. a AllocationExpression Node potentialTypeDeclaration = getNthParent(3); return potentialTypeDeclaration instanceof ASTClassOrInterfaceDeclaration && ((ASTClassOrInterfaceDeclaration) potentialTypeDeclaration).isInterface(); }
@Override public Object visit(final ASTMethodDeclaration node, Object data) { Set<Modifier> unnecessary = EnumSet.noneOf(Modifier.class); if (node.isSyntacticallyPublic()) { unnecessary.add(Modifier.PUBLIC); } if (node.isSyntacticallyAbstract()) { unnecessary.add(Modifier.ABSTRACT); } checkDeclarationInInterfaceType(data, node, unnecessary); if (node.isFinal()) { // If the method is annotated by @SafeVarargs then it's ok if (!isSafeVarargs(node)) { if (node.isPrivate()) { reportUnnecessaryModifiers(data, node, Modifier.FINAL, "private methods cannot be overridden"); } else { final Node n = node.getNthParent(3); // A final method of an anonymous class / enum constant. Neither can be extended / overridden if (n instanceof ASTAllocationExpression || n instanceof ASTEnumConstant) { reportUnnecessaryModifiers(data, node, Modifier.FINAL, "an anonymous class cannot be extended"); } else if (n instanceof ASTClassOrInterfaceDeclaration && ((AccessNode) n).isFinal()) { reportUnnecessaryModifiers(data, node, Modifier.FINAL, "the method is already in a final class"); } } } } return data; }
/** * Returns true if this method declaration is a member of an interface type. */ public boolean isInterfaceMember() { // for a real class/interface the 3rd parent is a ClassOrInterfaceDeclaration, // for anonymous classes, the parent is e.g. a AllocationExpression Node potentialTypeDeclaration = getNthParent(3); return potentialTypeDeclaration instanceof ASTClassOrInterfaceDeclaration && ((ASTClassOrInterfaceDeclaration) potentialTypeDeclaration).isInterface(); }
@Override public Object visit(final ASTMethodDeclaration node, Object data) { Set<Modifier> unnecessary = EnumSet.noneOf(Modifier.class); if (node.isSyntacticallyPublic()) { unnecessary.add(Modifier.PUBLIC); } if (node.isSyntacticallyAbstract()) { unnecessary.add(Modifier.ABSTRACT); } checkDeclarationInInterfaceType(data, node, unnecessary); if (node.isFinal()) { // If the method is annotated by @SafeVarargs then it's ok if (!isSafeVarargs(node)) { if (node.isPrivate()) { reportUnnecessaryModifiers(data, node, Modifier.FINAL, "private methods cannot be overridden"); } else { final Node n = node.getNthParent(3); // A final method of an anonymous class / enum constant. Neither can be extended / overridden if (n instanceof ASTAllocationExpression || n instanceof ASTEnumConstant) { reportUnnecessaryModifiers(data, node, Modifier.FINAL, "an anonymous class cannot be extended"); } else if (n instanceof ASTClassOrInterfaceDeclaration && ((AccessNode) n).isFinal()) { reportUnnecessaryModifiers(data, node, Modifier.FINAL, "the method is already in a final class"); } } } } return data; }