diff --git a/finalguard/finalguard-javac-plugin/build.gradle b/finalguard/finalguard-javac-plugin/build.gradle index 988dbc8..7793624 100644 --- a/finalguard/finalguard-javac-plugin/build.gradle +++ b/finalguard/finalguard-javac-plugin/build.gradle @@ -39,6 +39,7 @@ test { sourceSets["test"].resources.srcDirs systemProperty("test.compilation.classpath", String.join(File.pathSeparator, testCompilationClassPath.collect { it.toString() })) + jvmArgs('--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED') } diff --git a/finalguard/finalguard-javac-plugin/src/main/java/net/woggioni/finalguard/FinalGuardPlugin.java b/finalguard/finalguard-javac-plugin/src/main/java/net/woggioni/finalguard/FinalGuardPlugin.java index 9ebf946..77ee349 100644 --- a/finalguard/finalguard-javac-plugin/src/main/java/net/woggioni/finalguard/FinalGuardPlugin.java +++ b/finalguard/finalguard-javac-plugin/src/main/java/net/woggioni/finalguard/FinalGuardPlugin.java @@ -21,6 +21,8 @@ import com.sun.source.util.TaskListener; import com.sun.source.util.TreePath; import com.sun.source.util.TreePathScanner; import com.sun.source.util.Trees; +import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.tree.TreeInfo; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; @@ -42,6 +44,8 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import static com.sun.tools.javac.code.Flags.RECORD; + public class FinalGuardPlugin implements Plugin { public static final String DEFAULT_LEVEL_KEY = "default.level"; public static final String EXCLUDE_KEY = "exclude"; @@ -192,11 +196,18 @@ public class FinalGuardPlugin implements Plugin { @Override public Void visitMethod(MethodTree node, Void p) { - variableInfoMap.clear(); - reassignedVariables.clear(); + if (node.getName().contentEquals("")) { + TreePath classPath = getCurrentPath().getParentPath(); + if (classPath != null && classPath.getParentPath() != null + && classPath.getParentPath().getLeaf().getKind() == Tree.Kind.NEW_CLASS) { + return null; // skip implicit constructor of anonymous class + } + } super.visitMethod(node, p); // Check for variables that could be final checkForFinalCandidates(); + variableInfoMap.clear(); + reassignedVariables.clear(); return null; } @@ -222,8 +233,7 @@ public class FinalGuardPlugin implements Plugin { } else { type = VariableType.METHOD_PARAM; if (isJava17OrHigher && ((MethodTree) parent).getName().contentEquals("")) { - final TreePath grandParentPath = parentPath.getParentPath(); - if (grandParentPath.getLeaf().getKind() == Tree.Kind.RECORD) { + if(TreeInfo.isCanonicalConstructor((JCTree) parent)) { return super.visitVariable(node, p); } } diff --git a/finalguard/finalguard-javac-plugin/src/test/java/net/woggioni/finalguard/PluginTest.java b/finalguard/finalguard-javac-plugin/src/test/java/net/woggioni/finalguard/PluginTest.java index 2d710aa..339e9bb 100644 --- a/finalguard/finalguard-javac-plugin/src/test/java/net/woggioni/finalguard/PluginTest.java +++ b/finalguard/finalguard-javac-plugin/src/test/java/net/woggioni/finalguard/PluginTest.java @@ -154,7 +154,24 @@ public class PluginTest { )), Arguments.of(prefix + "TestCase12.java", Collections.emptyList()), Arguments.of(prefix + "TestCase13.java", Arrays.asList(ABSTRACT_METHOD_PARAM.getMessage("x"), ABSTRACT_METHOD_PARAM.getMessage("y"))), - Arguments.of(prefix + "TestCase14.java", Arrays.asList(ABSTRACT_METHOD_PARAM.getMessage("x"), ABSTRACT_METHOD_PARAM.getMessage("y"))) + Arguments.of(prefix + "TestCase14.java", Arrays.asList(ABSTRACT_METHOD_PARAM.getMessage("x"), ABSTRACT_METHOD_PARAM.getMessage("y"))), + Arguments.of(prefix + "TestCase15.java", + Arrays.asList( + LOCAL_VAR.getMessage("a"), + METHOD_PARAM.getMessage("source"))), + Arguments.of(prefix + "TestCase16.java", + Arrays.asList( + METHOD_PARAM.getMessage("c"), + LOCAL_VAR.getMessage("d"), + METHOD_PARAM.getMessage("e"), + LOCAL_VAR.getMessage("f") + ) + ), + Arguments.of(prefix + "TestCase17.java", + Arrays.asList( + METHOD_PARAM.getMessage("a") + ) + ) ); } } diff --git a/finalguard/finalguard-javac-plugin/src/test/resources/net/woggioni/finalguard/test/TestCase15.java b/finalguard/finalguard-javac-plugin/src/test/resources/net/woggioni/finalguard/test/TestCase15.java new file mode 100644 index 0000000..7dc1175 --- /dev/null +++ b/finalguard/finalguard-javac-plugin/src/test/resources/net/woggioni/finalguard/test/TestCase15.java @@ -0,0 +1,24 @@ +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class TestCase15 { + public static void foo() { + final InputStream source = null; + final InputStream is = new FilterInputStream(source) { + + @Override + public int read() throws IOException { + int a = 5; + return a; + } + }; + } + + static class Bar extends FilterInputStream { + + public Bar(InputStream source) { + super(source); + } + }; +} \ No newline at end of file diff --git a/finalguard/finalguard-javac-plugin/src/test/resources/net/woggioni/finalguard/test/TestCase16.java b/finalguard/finalguard-javac-plugin/src/test/resources/net/woggioni/finalguard/test/TestCase16.java new file mode 100644 index 0000000..1aa5e84 --- /dev/null +++ b/finalguard/finalguard-javac-plugin/src/test/resources/net/woggioni/finalguard/test/TestCase16.java @@ -0,0 +1,18 @@ +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +public record TestCase16(double a, double b) { + TestCase16(double c) { + this(c, 2.0); + + int d = 42; + System.out.println(d); + } + + double foo(double e) { + int f = 42; + System.out.println(f); + return a; + } +} \ No newline at end of file diff --git a/finalguard/finalguard-javac-plugin/src/test/resources/net/woggioni/finalguard/test/TestCase17.java b/finalguard/finalguard-javac-plugin/src/test/resources/net/woggioni/finalguard/test/TestCase17.java new file mode 100644 index 0000000..50a8fe4 --- /dev/null +++ b/finalguard/finalguard-javac-plugin/src/test/resources/net/woggioni/finalguard/test/TestCase17.java @@ -0,0 +1,9 @@ +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +public record TestCase17(String s) { + TestCase17(double a) { + this(""); + } +} \ No newline at end of file diff --git a/finalguard/src/main/java/net/woggioni/gradle/finalguard/FinalGuardPlugin.java b/finalguard/src/main/java/net/woggioni/gradle/finalguard/FinalGuardPlugin.java index b701787..69fd857 100644 --- a/finalguard/src/main/java/net/woggioni/gradle/finalguard/FinalGuardPlugin.java +++ b/finalguard/src/main/java/net/woggioni/gradle/finalguard/FinalGuardPlugin.java @@ -76,6 +76,7 @@ public class FinalGuardPlugin implements Plugin { appendOption(xpluginArg, EXCLUDE_KEY, excludedPrefix); } options.getCompilerArgs().add(xpluginArg.toString()); + options.getAllCompilerArgs().add("-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED"); }); }); }