From 4618de85e9d4201f525e907322379fbc8268879c Mon Sep 17 00:00:00 2001 From: "Morille, Amelie (ITDV XF) - AF" Date: Tue, 20 May 2025 16:08:34 +0200 Subject: [PATCH] fix(GCI82): update GCI82 rule to handle record types and adjust test cases --- CHANGELOG.md | 1 + .../creedengo/java/integration/tests/GCIRulesIT.java | 4 ++-- .../java/checks/MakeNonReassignedVariablesConstants.java | 7 ++++++- .../java/checks/MakeNonReassignedVariablesConstants.java | 9 ++++++++- src/test/files/MakeNonReassignedVariablesConstants.java | 7 ++++++- .../checks/MakeNonReassignedVariablesConstantsTest.java | 1 - 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a688cf..3e79f9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - correction of technical problem with Integration tests (because of Maven format in technical answer to "sonar-orchestrator-junit5" library) - upgrade JDK from 11 to 17 - [#4](https://github.com/green-code-initiative/creedengo-java/issues/4) Improvement: "++i" statement is not so bad +- [#105](https://github.com/green-code-initiative/creedengo-java/pull/105) fix GCI82 rule to handle record types and adjust test cases ### Deleted 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 3a51b72..84538c6 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 @@ -440,8 +440,8 @@ void testGCI82() { String filePath = "src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java"; String ruleId = "creedengo-java:GCI82"; String ruleMsg = "The variable is never reassigned and can be 'final'"; - int[] startLines = new int[]{7, 12, 13, 45}; - int[] endLines = new int[]{7, 12, 13, 45}; + int[] startLines = new int[]{7, 17, 18 ,50}; + int[] endLines = new int[]{7, 17, 18 ,50}; checkIssuesForFile(filePath, ruleId, ruleMsg, startLines, endLines); } diff --git a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java index bef640d..7206313 100644 --- a/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java +++ b/src/it/test-projects/creedengo-java-plugin-test-project/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java @@ -8,6 +8,11 @@ public class MakeNonReassignedVariablesConstants { private Object myNonFinalAndReassignedObject = new Object(); // Compliant private final Object myFinalAndNotReassignedObject = new Object(); // Compliant + private record myRecord( + String myImplicitlyFinalStringField, // Compliant + Integer myImplicitlyFinalIntField) // Compliant + { } + private static final String CONSTANT = "toto"; // Compliant private String varDefinedInClassNotReassigned = "0"; // Noncompliant {{The variable is never reassigned and can be 'final'}} private String varDefinedInClassNotUsed = "0"; // Noncompliant {{The variable is never reassigned and can be 'final'}} @@ -66,4 +71,4 @@ void classVariableReassignedBis() { logger.info(myFinalAndNotReassignedObject.toString()); } -} \ No newline at end of file +} 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 6533256..9c40a85 100644 --- a/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java +++ b/src/main/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstants.java @@ -30,7 +30,7 @@ public void visitNode(@Nonnull Tree tree) { LOGGER.debug(" => usages = " + variableTree.symbol().usages().size()); LOGGER.debug(" => isNotReassigned = " + isNotReassigned(variableTree)); - if (isNotFinalAndNotStatic(variableTree) && isNotReassigned(variableTree)) { + if (isNotFromRecord(variableTree) && isNotFinalAndNotStatic(variableTree) && isNotReassigned(variableTree)) { reportIssue(tree, MESSAGE_RULE); } else { super.visitNode(tree); @@ -80,6 +80,13 @@ private static boolean isNotFinalAndNotStatic(VariableTree variableTree) { return hasNoneOf(variableTree.modifiers(), Modifier.FINAL, Modifier.STATIC); } + private static boolean isNotFromRecord(VariableTree variableTree) { + Tree parent = variableTree.parent(); + if (parent == null) return false; + + return !parent.is(Kind.RECORD); + } + private static boolean hasNoneOf(ModifiersTree modifiersTree, Modifier... unexpectedModifiers) { return !hasAnyOf(modifiersTree, unexpectedModifiers); } diff --git a/src/test/files/MakeNonReassignedVariablesConstants.java b/src/test/files/MakeNonReassignedVariablesConstants.java index bef640d..7206313 100644 --- a/src/test/files/MakeNonReassignedVariablesConstants.java +++ b/src/test/files/MakeNonReassignedVariablesConstants.java @@ -8,6 +8,11 @@ public class MakeNonReassignedVariablesConstants { private Object myNonFinalAndReassignedObject = new Object(); // Compliant private final Object myFinalAndNotReassignedObject = new Object(); // Compliant + private record myRecord( + String myImplicitlyFinalStringField, // Compliant + Integer myImplicitlyFinalIntField) // Compliant + { } + private static final String CONSTANT = "toto"; // Compliant private String varDefinedInClassNotReassigned = "0"; // Noncompliant {{The variable is never reassigned and can be 'final'}} private String varDefinedInClassNotUsed = "0"; // Noncompliant {{The variable is never reassigned and can be 'final'}} @@ -66,4 +71,4 @@ void classVariableReassignedBis() { logger.info(myFinalAndNotReassignedObject.toString()); } -} \ No newline at end of file +} diff --git a/src/test/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstantsTest.java b/src/test/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstantsTest.java index 837a632..9cd5de1 100644 --- a/src/test/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstantsTest.java +++ b/src/test/java/org/greencodeinitiative/creedengo/java/checks/MakeNonReassignedVariablesConstantsTest.java @@ -29,5 +29,4 @@ void test() { .withCheck(new MakeNonReassignedVariablesConstants()) .verifyIssues(); } - }