Skip to content

Commit

Permalink
Add Rule EC82: Make variable constant
Browse files Browse the repository at this point in the history
  • Loading branch information
Hachemi ATROUNE committed May 30, 2024
1 parent 716fe9b commit 9017297
Show file tree
Hide file tree
Showing 7 changed files with 116 additions and 18 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Deleted


## [1.6.2] - 2024-05-30

### Added

- EC82 rule : A variable is never reassigned and can be made constant

## [1.6.1] - 2024-05-15

### Changed
Expand Down
19 changes: 3 additions & 16 deletions src/main/java/fr/greencodeinitiative/java/JavaCheckRegistrar.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,7 @@
import java.util.Collections;
import java.util.List;

import fr.greencodeinitiative.java.checks.ArrayCopyCheck;
import fr.greencodeinitiative.java.checks.AvoidFullSQLRequest;
import fr.greencodeinitiative.java.checks.AvoidGettingSizeCollectionInLoop;
import fr.greencodeinitiative.java.checks.AvoidMultipleIfElseStatement;
import fr.greencodeinitiative.java.checks.AvoidRegexPatternNotStatic;
import fr.greencodeinitiative.java.checks.AvoidSQLRequestInLoop;
import fr.greencodeinitiative.java.checks.AvoidSetConstantInBatchUpdate;
import fr.greencodeinitiative.java.checks.AvoidSpringRepositoryCallInLoopOrStreamCheck;
import fr.greencodeinitiative.java.checks.AvoidStatementForDMLQueries;
import fr.greencodeinitiative.java.checks.AvoidUsageOfStaticCollections;
import fr.greencodeinitiative.java.checks.FreeResourcesOfAutoCloseableInterface;
import fr.greencodeinitiative.java.checks.IncrementCheck;
import fr.greencodeinitiative.java.checks.InitializeBufferWithAppropriateSize;
import fr.greencodeinitiative.java.checks.NoFunctionCallWhenDeclaringForLoop;
import fr.greencodeinitiative.java.checks.OptimizeReadFileExceptions;
import fr.greencodeinitiative.java.checks.*;
import org.sonar.plugins.java.api.CheckRegistrar;
import org.sonar.plugins.java.api.JavaCheck;
import org.sonarsource.api.sonarlint.SonarLintSide;
Expand Down Expand Up @@ -62,7 +48,8 @@ public class JavaCheckRegistrar implements CheckRegistrar {
InitializeBufferWithAppropriateSize.class,
AvoidSetConstantInBatchUpdate.class,
FreeResourcesOfAutoCloseableInterface.class,
AvoidMultipleIfElseStatement.class
AvoidMultipleIfElseStatement.class,
MakeVariableConstant.class
);

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/*
* ecoCode - Java language - Provides rules to reduce the environmental footprint of your Java programs
* Copyright © 2023 Green Code Initiative (https://www.ecocode.io)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.greencodeinitiative.java.checks;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import org.sonar.check.Rule;
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
import org.sonar.plugins.java.api.semantic.Symbol;
import org.sonar.plugins.java.api.tree.*;
import org.sonarsource.analyzer.commons.annotations.DeprecatedRuleKey;

@Rule(key = "EC82")
@DeprecatedRuleKey(repositoryKey = "greencodeinitiative-java", ruleKey = "S82")
public class MakeVariableConstant extends IssuableSubscriptionVisitor {
public static final String ERROR_MESSAGE = "A variable is never reassigned and can be made constant";

@Override
public List<Tree.Kind> nodesToVisit() {
return List.of(Tree.Kind.VARIABLE);
}

@Override
public void visitNode(Tree tree) {
VariableTree variableTree = (VariableTree) tree;
Symbol symbol = variableTree.symbol();
if (symbol.isVariableSymbol() && !symbol.isFinal()) {
boolean reassigned = isReassigned(symbol);
if (!reassigned) {
reportIssue(variableTree.simpleName(), ERROR_MESSAGE);
}
}
}

private boolean isReassigned(Symbol symbol) {
Tree parent = symbol.declaration().parent();
if (parent instanceof BlockTree) {
return isReassignedInBlock(symbol, (BlockTree) parent);
}
return false;
}

private boolean isReassignedInBlock(Symbol symbol, BlockTree blockTree) {
List<AssignmentExpressionTree> assignments = new ArrayList<>();
List<StatementTree> body = blockTree.body();

for (StatementTree statement : body) {
if (statement.is(Tree.Kind.EXPRESSION_STATEMENT)) {
ExpressionTree expression = ((ExpressionStatementTree) statement).expression();
if (expression.is(Tree.Kind.ASSIGNMENT)) {
assignments.add((AssignmentExpressionTree) expression);
}
}
}

for (AssignmentExpressionTree assignment : assignments) {
if (((IdentifierTree) assignment.variable()).symbol().equals(symbol)) {
return true;
}
}
return false;
}
}
7 changes: 7 additions & 0 deletions src/test/files/MakeVariableConstantTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
public class MakeVariableConstantTest {

public void testEc82() {
String test = "test"; // Noncompliant {{A variable is never reassigned and can be made constant}}
System.out.println("Hello World");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ void checkNumberRules() {
final JavaCheckRegistrar registrar = new JavaCheckRegistrar();
registrar.register(context);

assertThat(context.checkClasses()).hasSize(15);
assertThat(context.checkClasses()).hasSize(16);
assertThat(context.testCheckClasses()).isEmpty();

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ void init() {
RulesDefinition.Context context = new RulesDefinition.Context();
rulesDefinition.define(context);
repository = context.repository(rulesDefinition.repositoryKey());
rulesSize = 15;
rulesSize = 16;
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package fr.greencodeinitiative.java.checks;

import org.junit.jupiter.api.Test;
import org.sonar.java.checks.verifier.CheckVerifier;

public class MakeVariableConstantTest {

@Test
void test() {
CheckVerifier.newVerifier()
.onFile("src/test/files/MakeVariableConstantTest.java")
.withCheck(new MakeVariableConstant())
.verifyIssues();
}
}


0 comments on commit 9017297

Please sign in to comment.