/** * Java 9 introduce private method in interfaces. * Before Java 9, an abstract class with private methods can not be turned into an interface. */ private boolean supportPrivateMethod(ClassTree tree) { return !hasPrivateMethod(tree) || javaVersionAsInt >= 9; }
@Override public void visitNode(Tree tree) { ClassTree classTree = (ClassTree) tree; if (classTree.superClass() == null && classIsAbstract(classTree) && classHasNoFieldAndProtectedMethod(classTree) && classHasNoAutoValueOrImmutableAnnotation(classTree) && supportPrivateMethod(classTree)) { IdentifierTree simpleName = classTree.simpleName(); reportIssue( simpleName, "Convert the abstract class \"" + simpleName.name() + "\" into an interface." + context.getJavaVersion().java8CompatibilityMessage()); } }
@Override public void visitClass(ClassTree tree) { if(classIsAbstract(tree) && classHasNoField(tree) && !classHasProtectedMethod(tree)) { context.addIssue(tree, this, "Convert the abstract class \""+tree.simpleName().name()+"\" into an interface"); } super.visitClass(tree); }
private static boolean classHasNoFieldAndProtectedMethod(ClassTree tree) { return tree.members().stream() .noneMatch(member -> member.is(Tree.Kind.VARIABLE) || (member.is(Tree.Kind.METHOD) && isProtectedOrOverriding((MethodTree) member))); }
@Override public void scanFile(JavaFileScannerContext context) { this.context = context; scan(context.getTree()); }
@Override public void visitNode(Tree tree) { ClassTree classTree = (ClassTree) tree; if (classTree.superClass() == null && classIsAbstract(classTree) && classHasNoFieldAndProtectedMethod(classTree) && classHasNoAutoValueOrImmutableAnnotation(classTree) && supportPrivateMethod(classTree)) { IdentifierTree simpleName = classTree.simpleName(); reportIssue( simpleName, "Convert the abstract class \"" + simpleName.name() + "\" into an interface." + context.getJavaVersion().java8CompatibilityMessage()); } }
private static boolean classHasNoFieldAndProtectedMethod(ClassTree tree) { return tree.members().stream() .noneMatch(member -> member.is(Tree.Kind.VARIABLE) || (member.is(Tree.Kind.METHOD) && isProtectedOrOverriding((MethodTree) member))); }
/** * Java 9 introduce private method in interfaces. * Before Java 9, an abstract class with private methods can not be turned into an interface. */ private boolean supportPrivateMethod(ClassTree tree) { return !hasPrivateMethod(tree) || javaVersionAsInt >= 9; }