Skip to content

Commit 9362e5f

Browse files
authored
Sonar codemod for removing useless pair of parentheses (#263)
Reference https://rules.sonarsource.com/java/RSPEC-1110/ Example https://sonarcloud.io/project/issues?fileUuids=AYvtrjqILCzGLicz7AZK&resolved=false&types=CODE_SMELL&id=nahsra_WebGoat_10_23&open=AYxpiFaZ3tHz5h5vzy97&tab=code **NOTE** When having 2+ useless pair of parentheses, each pair will raise a sonar issue, meaning that we are just removing the reported single pair. ![Captura de pantalla 2023-12-14 a la(s) 12 52 18 p m](https://github.com/pixee/codemodder-java/assets/14047435/4ca313e9-048a-436f-96a5-fbe0e054079a) inner useless parentheses ![Captura de pantalla 2023-12-14 a la(s) 12 53 39 p m](https://github.com/pixee/codemodder-java/assets/14047435/61e7bc94-cace-4f46-99fe-59cfaf9419f8) outer useless parentheses ![Captura de pantalla 2023-12-14 a la(s) 12 52 36 p m](https://github.com/pixee/codemodder-java/assets/14047435/3b41a2a0-0ee6-448d-9d06-2b3c531bf60e)
1 parent b0fc70d commit 9362e5f

File tree

7 files changed

+1611
-0
lines changed

7 files changed

+1611
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package io.codemodder.codemods;
2+
3+
import com.github.javaparser.ast.CompilationUnit;
4+
import com.github.javaparser.ast.expr.EnclosedExpr;
5+
import com.github.javaparser.ast.expr.Expression;
6+
import io.codemodder.Codemod;
7+
import io.codemodder.CodemodExecutionPriority;
8+
import io.codemodder.CodemodInvocationContext;
9+
import io.codemodder.ReviewGuidance;
10+
import io.codemodder.providers.sonar.ProvidedSonarScan;
11+
import io.codemodder.providers.sonar.RuleIssues;
12+
import io.codemodder.providers.sonar.SonarPluginJavaParserChanger;
13+
import io.codemodder.providers.sonar.api.Issue;
14+
import javax.inject.Inject;
15+
16+
/** Codemod to remove useless pair of parentheses */
17+
@Codemod(
18+
id = "sonar:java/remove-useless-parentheses-s1110",
19+
reviewGuidance = ReviewGuidance.MERGE_WITHOUT_REVIEW,
20+
executionPriority = CodemodExecutionPriority.HIGH)
21+
public final class RemoveUselessParenthesesCodemod
22+
extends SonarPluginJavaParserChanger<EnclosedExpr> {
23+
24+
@Inject
25+
public RemoveUselessParenthesesCodemod(
26+
@ProvidedSonarScan(ruleId = "java:S1110") final RuleIssues issues) {
27+
super(issues, EnclosedExpr.class);
28+
}
29+
30+
@Override
31+
public boolean onIssueFound(
32+
final CodemodInvocationContext context,
33+
final CompilationUnit cu,
34+
final EnclosedExpr enclosedExpr,
35+
final Issue issue) {
36+
37+
Expression innerExpr = enclosedExpr.getInner();
38+
enclosedExpr.replace(innerExpr);
39+
40+
return true;
41+
}
42+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
This change removes redundant parentheses. These extra parentheses make it harder to understand the code.
2+
3+
Our changes look something like this:
4+
5+
```diff
6+
7+
- int leftOver = (int) (((bitCount >>> 3)) & 0x3f);
8+
+ int leftOver = (int) ((bitCount >>> 3) & 0x3f);
9+
10+
```
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"summary" : "Remove useless parentheses (Sonar).",
3+
"change" : "Remove useless parentheses",
4+
"references" : [
5+
"https://rules.sonarsource.com/java/RSPEC-1110/"
6+
]
7+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.codemodder.codemods;
2+
3+
import io.codemodder.testutils.CodemodTestMixin;
4+
import io.codemodder.testutils.Metadata;
5+
6+
@Metadata(
7+
codemodType = RemoveUselessParenthesesCodemod.class,
8+
testResourceDir = "remove-useless-parentheses-s1110",
9+
renameTestFile = "src/main/java/org/owasp/webgoat/lessons/challenges/challenge7/MD5.java",
10+
dependencies = {})
11+
final class RemoveUselessParenthesesCodemodTest implements CodemodTestMixin {}

0 commit comments

Comments
 (0)