From abef8fe885ac30657d00fb930f5df45cdb91bd62 Mon Sep 17 00:00:00 2001 From: Ghost Khiari Date: Tue, 19 May 2026 14:33:08 +0200 Subject: [PATCH 1/4] GCI82- without tests --- CHANGELOG.md | 1 + .../MakeNonReassignedVariablesConstants.java | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5c8c92c..6fe368da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [#122](https://github.com/green-code-initiative/creedengo-java/issues/122) GCI82 - remove false positive triggered on pattern variables of `instanceof`, record patterns and `switch` patterns (e.g. `if (o instanceof final String s)`) - [#69](https://github.com/green-code-initiative/creedengo-java/issues/69) correction of NullPointer in GCI79 rule + technical refactoring of GCI79 - update integration tests system to use the new component "creedengo-integration-test" - compatibility updates for SonarQube up to 26.2.0 diff --git a/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java b/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java index 495bc4e2..bbcecdb0 100644 --- a/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java +++ b/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java @@ -25,6 +25,16 @@ public List nodesToVisit() { @Override public void visitNode(@Nonnull Tree tree) { VariableTree variableTree = (VariableTree) tree; + + // Issue #122 : skip pattern variables (instanceof pattern, record pattern, switch pattern). + // Pattern variables are scope-limited to their branch and cannot meaningfully be made + // "more final". SonarJava does not consistently expose the `final` modifier on pattern + // variables, which would produce a false positive when the user has explicitly written + // `final` — e.g. `if (o instanceof final String s)`. + if (isPatternVariable(variableTree)) { + return; + } + if (LOGGER.isDebugEnabled()) { LOGGER.debug("Variable > {}", getVariableNameForLogger(variableTree)); LOGGER.debug(" => isNotFinalAndNotStatic(variableTree) = {}", isNotFinalAndNotStatic(variableTree)); @@ -39,6 +49,21 @@ public void visitNode(@Nonnull Tree tree) { } } + /** + * Returns {@code true} when the given variable is a pattern variable, i.e. it is the variable + * bound by a type pattern in: + * + * In all those cases, the {@code VariableTree} is the direct child of a {@code TypePatternTree}. + */ + private static boolean isPatternVariable(VariableTree variableTree) { + Tree parent = variableTree.parent(); + return parent != null && parent.is(Kind.TYPE_PATTERN); + } + private static boolean isNotReassigned(VariableTree variableTree) { return variableTree.symbol() .usages() From eb2f1230e4eb61fbe16ca73df34592b5ed827846 Mon Sep 17 00:00:00 2001 From: Ghost Khiari Date: Tue, 19 May 2026 15:31:45 +0200 Subject: [PATCH 2/4] GCI82 tests --- .../checks/GCI82/MakeNonReassignedVariablesConstants.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java index dc192cdd..cad39728 100644 --- a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java +++ b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java @@ -41,6 +41,12 @@ public void parameterReassigned(String reassigned) { logger.info(reassigned); } + public void parameterNotReassignedInstance() { + if (o instanceof final String k) { + logger.info(k); + } + } + public void parameterNotReassigned(final String notReassigned) { logger.info(notReassigned); } @@ -107,13 +113,13 @@ void reassignedInMethod() { String varDefinedInMethodReassignedInMethod = "0"; // Compliant String varDefinedInMethodInFinalMethod = "0"; // Noncompliant {{The variable is never reassigned and can be 'final'}} String varDefinedInMethodNotReassignedInMethod = "0"; // Compliant (the String was passed as a non-final parameter to the method) - this.parameterReassigned(varDefinedInMethodReassignedInMethod); this.parameterReassigned(this.varDefinedInClassReassignedInMethod); this.parameterNotReassigned(varDefinedInMethodInFinalMethod); this.parameterNotReassigned(this.varDefinedInClassInFinalMethod); this.parameterNotReassignedNotFinal(varDefinedInMethodNotReassignedInMethod); this.parameterNotReassignedNotFinal(this.varDefinedInClassNotReassignedInMethod); + this.parameterNotReassignedInstance(); } void reassignedInConstructor(){ From b65e0f9368815609d9bd5a2363da77910685f143 Mon Sep 17 00:00:00 2001 From: Ghost Khiari Date: Tue, 19 May 2026 15:51:47 +0200 Subject: [PATCH 3/4] GCI82 tests --- .../java/checks/GCI82/MakeNonReassignedVariablesConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java index cad39728..631551f0 100644 --- a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java +++ b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java @@ -119,7 +119,7 @@ void reassignedInMethod() { this.parameterNotReassigned(this.varDefinedInClassInFinalMethod); this.parameterNotReassignedNotFinal(varDefinedInMethodNotReassignedInMethod); this.parameterNotReassignedNotFinal(this.varDefinedInClassNotReassignedInMethod); - this.parameterNotReassignedInstance(); + this.parameterNotReassignedInstance();// Compliant } void reassignedInConstructor(){ From 7f434159f64e1e18d0826be6825c099a5e25994c Mon Sep 17 00:00:00 2001 From: Mohamed MEZIANE Date: Tue, 19 May 2026 16:09:02 +0200 Subject: [PATCH 4/4] GCI82: fix test - declare Object o as final to avoid false trigger --- .../java/checks/GCI82/MakeNonReassignedVariablesConstants.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java index 631551f0..693af408 100644 --- a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java +++ b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java @@ -42,6 +42,8 @@ public void parameterReassigned(String reassigned) { } public void parameterNotReassignedInstance() { + final Object o = new Object(); + // instanceof with final keyword - Compliant (pattern variable is skipped) if (o instanceof final String k) { logger.info(k); }