From 824c567e570ee19822aff1024bbcb9aac2ebe890 Mon Sep 17 00:00:00 2001 From: Ayoub RHNABRI <63043459+arhnabri@users.noreply.github.com> Date: Tue, 19 May 2026 17:01:34 +0200 Subject: [PATCH 1/9] [Rule GCI82] Resolve Bug [#122] : final keyword is not recognized when using instanceof pattern . --- CHANGELOG.md | 1 + .../MakeNonReassignedVariablesConstants.java | 36 +++++++++++++++++++ .../MakeNonReassignedVariablesConstants.java | 24 +++++-------- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5c8c92c..a387d5dc 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) resolve bug : final keyword is not recognized when using instanceof pattern - [#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/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..0fb12c68 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 @@ -129,6 +129,42 @@ void reassignedInConstructor(){ o = new notReassignedInConstructorNotFinal(this.varDefinedInClassNotReassignedInConstructor); } + + public String nonReasignedVariablewithPatternInstanceOfShouldBeNonCompliant() + { + final String o = "NON-COMPLIANT"; + + if (o instanceof String var) { // Noncompliant {{The variable is never reassigned and can be 'final'}} + return var; + } + + return ""; + } + + + public String nonReasignedVariablewithPatternInstanceOfWithfinalShouldBeCompliant() + { + final String o = "COMPLIANT"; + + if (o instanceof final String var) { // Compliant : here final keyword should be recognized and not trigger the rule + return var; + } + + return ""; + } + + public String reasignedVariablewithPatternInstanceOfShouldBeCompliant() + { + final String o = "COMPLIANT"; + + if (o instanceof String var) { // Compliant : Variable is reassigned + var = "REASSIGN"; + return var; + } + + return ""; + } + } class reassignedInConstructor{ 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..07ea24a3 100644 --- a/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java +++ b/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java @@ -24,7 +24,9 @@ public List nodesToVisit() { @Override public void visitNode(@Nonnull Tree tree) { - VariableTree variableTree = (VariableTree) tree; + + final VariableTree variableTree = (VariableTree) tree;; + if (LOGGER.isDebugEnabled()) { LOGGER.debug("Variable > {}", getVariableNameForLogger(variableTree)); LOGGER.debug(" => isNotFinalAndNotStatic(variableTree) = {}", isNotFinalAndNotStatic(variableTree)); @@ -32,6 +34,7 @@ public void visitNode(@Nonnull Tree tree) { LOGGER.debug(" => isNotReassigned = {}", isNotReassigned(variableTree)); LOGGER.debug(" => isPassedAsNonFinalParameter = {}", isPassedAsNonFinalParameter(variableTree)); } + if (isNotFinalAndNotStatic(variableTree) && isNotReassigned(variableTree)) { reportIssue(tree, MESSAGE_RULE); } else { @@ -47,6 +50,10 @@ private static boolean isNotReassigned(VariableTree variableTree) { && !isPassedAsNonFinalParameter(variableTree); // if a variable is passed into a method as a non-final parameter, it may have been reassigned } + + + + private static boolean isPassedAsNonFinalParameter(VariableTree variableTree) { return variableTree.symbol() .usages() @@ -112,20 +119,7 @@ private static boolean parentIsKind(Tree tree, Kind... orKind) { } private static boolean isNotFinalAndNotStatic(VariableTree variableTree) { - return hasNoneOf(variableTree.modifiers(), Modifier.FINAL, Modifier.STATIC); - } - - private static boolean hasNoneOf(ModifiersTree modifiersTree, Modifier... unexpectedModifiers) { - return !hasAnyOf(modifiersTree, unexpectedModifiers); - } - - private static boolean hasAnyOf(ModifiersTree modifiersTree, Modifier... expectedModifiers) { - for(Modifier expectedModifier : expectedModifiers) { - if (hasModifier(modifiersTree, expectedModifier)) { - return true; - } - } - return false; + return !variableTree.symbol().isFinal() && !variableTree.symbol().isStatic(); } public static boolean hasModifier(ModifiersTree modifiersTree, Modifier expectedModifier) { From e196a69897299ab4d63c5cdf398b29b6ce231c97 Mon Sep 17 00:00:00 2001 From: Ayoub RHNABRI <63043459+arhnabri@users.noreply.github.com> Date: Tue, 19 May 2026 17:01:34 +0200 Subject: [PATCH 2/9] [Rule GCI82] Resolve Bug [#122] : final keyword is not recognized when using instanceof pattern . --- CHANGELOG.md | 1 + .../MakeNonReassignedVariablesConstants.java | 36 +++++++++++++++++++ .../MakeNonReassignedVariablesConstants.java | 24 +++++-------- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5c8c92c..a387d5dc 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) resolve bug : final keyword is not recognized when using instanceof pattern - [#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/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..0fb12c68 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 @@ -129,6 +129,42 @@ void reassignedInConstructor(){ o = new notReassignedInConstructorNotFinal(this.varDefinedInClassNotReassignedInConstructor); } + + public String nonReasignedVariablewithPatternInstanceOfShouldBeNonCompliant() + { + final String o = "NON-COMPLIANT"; + + if (o instanceof String var) { // Noncompliant {{The variable is never reassigned and can be 'final'}} + return var; + } + + return ""; + } + + + public String nonReasignedVariablewithPatternInstanceOfWithfinalShouldBeCompliant() + { + final String o = "COMPLIANT"; + + if (o instanceof final String var) { // Compliant : here final keyword should be recognized and not trigger the rule + return var; + } + + return ""; + } + + public String reasignedVariablewithPatternInstanceOfShouldBeCompliant() + { + final String o = "COMPLIANT"; + + if (o instanceof String var) { // Compliant : Variable is reassigned + var = "REASSIGN"; + return var; + } + + return ""; + } + } class reassignedInConstructor{ 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..07ea24a3 100644 --- a/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java +++ b/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java @@ -24,7 +24,9 @@ public List nodesToVisit() { @Override public void visitNode(@Nonnull Tree tree) { - VariableTree variableTree = (VariableTree) tree; + + final VariableTree variableTree = (VariableTree) tree;; + if (LOGGER.isDebugEnabled()) { LOGGER.debug("Variable > {}", getVariableNameForLogger(variableTree)); LOGGER.debug(" => isNotFinalAndNotStatic(variableTree) = {}", isNotFinalAndNotStatic(variableTree)); @@ -32,6 +34,7 @@ public void visitNode(@Nonnull Tree tree) { LOGGER.debug(" => isNotReassigned = {}", isNotReassigned(variableTree)); LOGGER.debug(" => isPassedAsNonFinalParameter = {}", isPassedAsNonFinalParameter(variableTree)); } + if (isNotFinalAndNotStatic(variableTree) && isNotReassigned(variableTree)) { reportIssue(tree, MESSAGE_RULE); } else { @@ -47,6 +50,10 @@ private static boolean isNotReassigned(VariableTree variableTree) { && !isPassedAsNonFinalParameter(variableTree); // if a variable is passed into a method as a non-final parameter, it may have been reassigned } + + + + private static boolean isPassedAsNonFinalParameter(VariableTree variableTree) { return variableTree.symbol() .usages() @@ -112,20 +119,7 @@ private static boolean parentIsKind(Tree tree, Kind... orKind) { } private static boolean isNotFinalAndNotStatic(VariableTree variableTree) { - return hasNoneOf(variableTree.modifiers(), Modifier.FINAL, Modifier.STATIC); - } - - private static boolean hasNoneOf(ModifiersTree modifiersTree, Modifier... unexpectedModifiers) { - return !hasAnyOf(modifiersTree, unexpectedModifiers); - } - - private static boolean hasAnyOf(ModifiersTree modifiersTree, Modifier... expectedModifiers) { - for(Modifier expectedModifier : expectedModifiers) { - if (hasModifier(modifiersTree, expectedModifier)) { - return true; - } - } - return false; + return !variableTree.symbol().isFinal() && !variableTree.symbol().isStatic(); } public static boolean hasModifier(ModifiersTree modifiersTree, Modifier expectedModifier) { From 239440a5413334bec9c3d90ad0886de13a46a232 Mon Sep 17 00:00:00 2001 From: Ayoub RHNABRI <63043459+arhnabri@users.noreply.github.com> Date: Tue, 19 May 2026 17:45:09 +0200 Subject: [PATCH 3/9] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../java/checks/MakeNonReassignedVariablesConstants.java | 4 ---- 1 file changed, 4 deletions(-) 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 07ea24a3..1635f7d8 100644 --- a/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java +++ b/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java @@ -50,10 +50,6 @@ private static boolean isNotReassigned(VariableTree variableTree) { && !isPassedAsNonFinalParameter(variableTree); // if a variable is passed into a method as a non-final parameter, it may have been reassigned } - - - - private static boolean isPassedAsNonFinalParameter(VariableTree variableTree) { return variableTree.symbol() .usages() From c56aec7d20130fe5dd6ce0e8580fc11c03992916 Mon Sep 17 00:00:00 2001 From: Ayoub RHNABRI <63043459+arhnabri@users.noreply.github.com> Date: Tue, 19 May 2026 17:47:17 +0200 Subject: [PATCH 4/9] remove unnecessary trailing --- .../java/checks/MakeNonReassignedVariablesConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 07ea24a3..8926a3b6 100644 --- a/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java +++ b/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java @@ -25,7 +25,7 @@ public List nodesToVisit() { @Override public void visitNode(@Nonnull Tree tree) { - final VariableTree variableTree = (VariableTree) tree;; + final VariableTree variableTree = (VariableTree) tree; if (LOGGER.isDebugEnabled()) { LOGGER.debug("Variable > {}", getVariableNameForLogger(variableTree)); From ddbceb907a22f289a087553e606638c2600e0756 Mon Sep 17 00:00:00 2001 From: Ayoub RHNABRI <63043459+arhnabri@users.noreply.github.com> Date: Tue, 19 May 2026 17:51:45 +0200 Subject: [PATCH 5/9] add comment --- .../java/checks/MakeNonReassignedVariablesConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 11b7d4f4..2d0a0e1f 100644 --- a/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java +++ b/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java @@ -113,7 +113,7 @@ private static boolean parentIsKind(Tree tree, Kind... orKind) { } private static boolean isNotFinalAndNotStatic(VariableTree variableTree) { - return !variableTree.symbol().isFinal() && !variableTree.symbol().isStatic(); + return !variableTree.symbol().isFinal() && !variableTree.symbol().isStatic(); // use symbol instead of modifiers since in case of type_pattern modifiers is always empty } public static boolean hasModifier(ModifiersTree modifiersTree, Modifier expectedModifier) { From b9cd91f4456a0764936a93400514ce02235e9e24 Mon Sep 17 00:00:00 2001 From: Ayoub RHNABRI <63043459+arhnabri@users.noreply.github.com> Date: Tue, 19 May 2026 17:57:56 +0200 Subject: [PATCH 6/9] resolve spilling cammelcase --- .../checks/GCI82/MakeNonReassignedVariablesConstants.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 0fb12c68..5bb2e54c 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 @@ -130,7 +130,7 @@ void reassignedInConstructor(){ } - public String nonReasignedVariablewithPatternInstanceOfShouldBeNonCompliant() + public String nonReasignedVariableWithPatternInstanceOfShouldBeNonCompliant() { final String o = "NON-COMPLIANT"; @@ -142,7 +142,7 @@ public String nonReasignedVariablewithPatternInstanceOfShouldBeNonCompliant() } - public String nonReasignedVariablewithPatternInstanceOfWithfinalShouldBeCompliant() + public String nonReasignedVariableWithPatternInstanceOfWithFinalShouldBeCompliant() { final String o = "COMPLIANT"; @@ -153,7 +153,7 @@ public String nonReasignedVariablewithPatternInstanceOfWithfinalShouldBeComplian return ""; } - public String reasignedVariablewithPatternInstanceOfShouldBeCompliant() + public String reasignedVariableWithPatternInstanceOfShouldBeCompliant() { final String o = "COMPLIANT"; From cd0bb97e01fa2ca8b52c692b71072a6641567d83 Mon Sep 17 00:00:00 2001 From: Ayoub RHNABRI <63043459+arhnabri@users.noreply.github.com> Date: Tue, 19 May 2026 18:03:25 +0200 Subject: [PATCH 7/9] solve It test use case --- .../checks/GCI82/MakeNonReassignedVariablesConstants.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 5bb2e54c..d367cd9e 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 @@ -132,7 +132,7 @@ void reassignedInConstructor(){ public String nonReasignedVariableWithPatternInstanceOfShouldBeNonCompliant() { - final String o = "NON-COMPLIANT"; + final Object o = "NON-COMPLIANT"; if (o instanceof String var) { // Noncompliant {{The variable is never reassigned and can be 'final'}} return var; @@ -144,7 +144,7 @@ public String nonReasignedVariableWithPatternInstanceOfShouldBeNonCompliant() public String nonReasignedVariableWithPatternInstanceOfWithFinalShouldBeCompliant() { - final String o = "COMPLIANT"; + final Object o = "COMPLIANT"; if (o instanceof final String var) { // Compliant : here final keyword should be recognized and not trigger the rule return var; @@ -155,7 +155,7 @@ public String nonReasignedVariableWithPatternInstanceOfWithFinalShouldBeComplian public String reasignedVariableWithPatternInstanceOfShouldBeCompliant() { - final String o = "COMPLIANT"; + final Object o = "COMPLIANT"; if (o instanceof String var) { // Compliant : Variable is reassigned var = "REASSIGN"; From e23b68a676986e72d13227d2093789390e989a63 Mon Sep 17 00:00:00 2001 From: Ayoub RHNABRI <63043459+arhnabri@users.noreply.github.com> Date: Tue, 19 May 2026 18:06:28 +0200 Subject: [PATCH 8/9] resolve method brace style --- .../GCI82/MakeNonReassignedVariablesConstants.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) 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 d367cd9e..33888bfe 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 @@ -130,8 +130,7 @@ void reassignedInConstructor(){ } - public String nonReasignedVariableWithPatternInstanceOfShouldBeNonCompliant() - { + public String nonReasignedVariableWithPatternInstanceOfShouldBeNonCompliant() { final Object o = "NON-COMPLIANT"; if (o instanceof String var) { // Noncompliant {{The variable is never reassigned and can be 'final'}} @@ -142,8 +141,7 @@ public String nonReasignedVariableWithPatternInstanceOfShouldBeNonCompliant() } - public String nonReasignedVariableWithPatternInstanceOfWithFinalShouldBeCompliant() - { + public String nonReasignedVariableWithPatternInstanceOfWithFinalShouldBeCompliant() { final Object o = "COMPLIANT"; if (o instanceof final String var) { // Compliant : here final keyword should be recognized and not trigger the rule @@ -153,8 +151,7 @@ public String nonReasignedVariableWithPatternInstanceOfWithFinalShouldBeComplian return ""; } - public String reasignedVariableWithPatternInstanceOfShouldBeCompliant() - { + public String reasignedVariableWithPatternInstanceOfShouldBeCompliant() { final Object o = "COMPLIANT"; if (o instanceof String var) { // Compliant : Variable is reassigned From 90cca96022e12fe043847614b3ccb038bf96e001 Mon Sep 17 00:00:00 2001 From: Ayoub RHNABRI <63043459+arhnabri@users.noreply.github.com> Date: Wed, 20 May 2026 09:45:43 +0200 Subject: [PATCH 9/9] Update GCIRulesIT.java fix GCI82 IT --- .../creedengo/java/integration/tests/GCIRulesIT.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/it/java/org/greencodeinitiative/creedengo/java/integration/tests/GCIRulesIT.java b/src/it/java/org/greencodeinitiative/creedengo/java/integration/tests/GCIRulesIT.java index ec6730ca..1850cfba 100644 --- a/src/it/java/org/greencodeinitiative/creedengo/java/integration/tests/GCIRulesIT.java +++ b/src/it/java/org/greencodeinitiative/creedengo/java/integration/tests/GCIRulesIT.java @@ -426,8 +426,8 @@ void testGCI82() { String filePath = "src/main/java/org/greencodeinitiative/creedengo/java/checks/GCI82/MakeNonReassignedVariablesConstants.java"; String ruleId = "creedengo-java:GCI82"; String ruleMsg = "The variable is never reassigned and can be 'final'"; - int[] startLines = new int[]{9, 14, 15, 20, 26, 29, 48, 75, 108, 121, 146}; - int[] endLines = new int[]{9, 14, 15, 20, 26, 29, 48, 75, 108, 121, 146}; + int[] startLines = new int[]{9, 14, 15, 20, 26, 29, 48, 75, 108, 121, 136, 179}; + int[] endLines = new int[]{9, 14, 15, 20, 26, 29, 48, 75, 108, 121, 136, 179}; checkIssuesForFile(filePath, ruleId, ruleMsg, startLines, endLines); }