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 3c1570c..d759693 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 @@ -104,8 +104,14 @@ public class FinalGuardPlugin implements Plugin { } } + private static boolean isJava17OrHigher() { + return System.getProperty("java.version").compareTo("17") >= 0; + } + private static final Configuration configuration = new Configuration(); + private static final boolean isJava17OrHigher = isJava17OrHigher(); + @Override public String getName() { return getClass().getName(); @@ -140,7 +146,6 @@ public class FinalGuardPlugin implements Plugin { private final Trees trees; private final Map variableInfoMap = new LinkedHashMap<>(); private final Set reassignedVariables = new HashSet<>(); - private String currentMethod; public FinalVariableAnalyzer(CompilationUnitTree compilationUnit, JavacTask task) { this.compilationUnit = compilationUnit; @@ -149,50 +154,45 @@ public class FinalGuardPlugin implements Plugin { @Override public Void visitMethod(MethodTree node, Void p) { - final String previousMethod = currentMethod; - currentMethod = node.getName().toString(); variableInfoMap.clear(); reassignedVariables.clear(); - // Analyze parameters first - for (VariableTree param : node.getParameters()) { - final String varName = param.getName().toString(); - variableInfoMap.put(varName, new VariableInfo(param, VariableType.METHOD_PARAM)); - } - - // Then analyze method body super.visitMethod(node, p); // Check for variables that could be final checkForFinalCandidates(); - - currentMethod = previousMethod; return null; } @Override public Void visitVariable(VariableTree node, Void p) { - if (currentMethod != null) { - final String varName = node.getName().toString(); - final Tree parent = getCurrentPath().getParentPath().getLeaf(); - final VariableType type; - if (parent instanceof LambdaExpressionTree) { - type = VariableType.LAMBDA_PARAM; - } else if (parent instanceof ForLoopTree || parent instanceof EnhancedForLoopTree) { - type = VariableType.LOOP_PARAM; - } else if (parent instanceof CatchTree) { - type = VariableType.CATCH_PARAM; - } else if (parent instanceof TryTree) { - type = VariableType.TRY_WITH_PARAM; - } else if (parent instanceof MethodTree) { - type = VariableType.METHOD_PARAM; - } else if (parent instanceof BlockTree) { - type = VariableType.LOCAL_VAR; - } else { - type = VariableType.LOCAL_VAR; + final String varName = node.getName().toString(); + final TreePath currentPath = getCurrentPath(); + final TreePath parentPath = currentPath.getParentPath(); + final Tree parent = parentPath.getLeaf(); + final VariableType type; + if (parent instanceof LambdaExpressionTree) { + type = VariableType.LAMBDA_PARAM; + } else if (parent instanceof ForLoopTree || parent instanceof EnhancedForLoopTree) { + type = VariableType.LOOP_PARAM; + } else if (parent instanceof CatchTree) { + type = VariableType.CATCH_PARAM; + } else if (parent instanceof TryTree) { + type = VariableType.TRY_WITH_PARAM; + } else if (parent instanceof MethodTree) { + type = VariableType.METHOD_PARAM; + if(isJava17OrHigher && ((MethodTree) parent).getName().contentEquals("")) { + final TreePath grandParentPath = parentPath.getParentPath(); + if(grandParentPath.getLeaf().getKind() == Tree.Kind.RECORD) { + return super.visitVariable(node, p); + } } - variableInfoMap.put(varName, new VariableInfo(node, type)); + } else if (parent instanceof BlockTree) { + type = VariableType.LOCAL_VAR; + } else { + type = VariableType.LOCAL_VAR; } + variableInfoMap.put(varName, new VariableInfo(node, type)); 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 cf51140..edb337c 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 @@ -165,7 +165,8 @@ public class PluginTest { LOCAL_VAR.getMessage("result"), LOCAL_VAR.getMessage("size"), METHOD_PARAM.getMessage("t1s") - )) + )), + Arguments.of(prefix + "TestCase12.java", Collections.emptyList()) ); } } diff --git a/finalguard/finalguard-javac-plugin/src/test/resources/net/woggioni/finalguard/test/TestCase12.java b/finalguard/finalguard-javac-plugin/src/test/resources/net/woggioni/finalguard/test/TestCase12.java new file mode 100644 index 0000000..11561bb --- /dev/null +++ b/finalguard/finalguard-javac-plugin/src/test/resources/net/woggioni/finalguard/test/TestCase12.java @@ -0,0 +1,4 @@ +import java.util.Arrays; + +public record TestCase12(double x, double y) { +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 2d2656b..884b3d0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ -lys.catalog.version=2025.09.30 -version.myGradlePlugins=2025.11.18 +lys.catalog.version=2025.11.18 +version.myGradlePlugins=2025.11.19 version.gradle=8.12 gitea.maven.url = https://gitea.woggioni.net/api/packages/woggioni/maven