Skip to content

Commit df3120c

Browse files
authored
Add Sonar codemod and first rule (#240)
This change introduces a Sonar plugin and fixes the first thing that Sonar finds - S1161/missing `@Override`.
1 parent b7e53cf commit df3120c

File tree

57 files changed

+1076
-103
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1076
-103
lines changed

core-codemods/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ dependencies {
2121
implementation(project(":plugins:codemodder-plugin-llm"))
2222
implementation(project(":plugins:codemodder-plugin-aws"))
2323
implementation(project(":plugins:codemodder-plugin-pmd"))
24+
implementation(project(":plugins:codemodder-plugin-sonar"))
2425
implementation(libs.juniversalchardet)
2526
implementation(libs.dom4j)
2627
implementation(libs.commons.jexl)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package io.codemodder.codemods;
2+
3+
import com.github.javaparser.ast.CompilationUnit;
4+
import com.github.javaparser.ast.Node;
5+
import com.github.javaparser.ast.body.MethodDeclaration;
6+
import com.github.javaparser.ast.expr.SimpleName;
7+
import io.codemodder.*;
8+
import io.codemodder.providers.sonar.ProvidedSonarScan;
9+
import io.codemodder.providers.sonar.RuleIssues;
10+
import io.codemodder.providers.sonar.SonarPluginJavaParserChanger;
11+
import io.codemodder.providers.sonar.api.Issue;
12+
import java.util.Optional;
13+
import javax.inject.Inject;
14+
15+
/** A codemod for automatically fixing missing @Override annotations. */
16+
@Codemod(
17+
id = "sonar:java/add-missing-override-s1161",
18+
reviewGuidance = ReviewGuidance.MERGE_WITHOUT_REVIEW,
19+
executionPriority = CodemodExecutionPriority.HIGH)
20+
public final class AddMissingOverrideCodemod extends SonarPluginJavaParserChanger<SimpleName> {
21+
22+
@Inject
23+
public AddMissingOverrideCodemod(
24+
@ProvidedSonarScan(ruleId = "java:S1161") final RuleIssues issues) {
25+
super(issues, SimpleName.class, RegionNodeMatcher.MATCHES_START);
26+
}
27+
28+
@Override
29+
public boolean onIssueFound(
30+
final CodemodInvocationContext context,
31+
final CompilationUnit cu,
32+
final SimpleName methodName,
33+
final Issue issue) {
34+
35+
Optional<Node> parentNodeRef = methodName.getParentNode();
36+
if (parentNodeRef.isPresent()) {
37+
Node parentNode = parentNodeRef.get();
38+
if (parentNode instanceof MethodDeclaration method) {
39+
method.addAnnotation(Override.class);
40+
return true;
41+
}
42+
}
43+
return true;
44+
}
45+
}

core-codemods/src/main/java/io/codemodder/codemods/DisableAutomaticDirContextDeserializationCodemod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public final class DisableAutomaticDirContextDeserializationCodemod
1818
@Inject
1919
public DisableAutomaticDirContextDeserializationCodemod(
2020
@SemgrepScan(ruleId = "disable-dircontext-deserialization") final RuleSarif sarif) {
21-
super(sarif, ObjectCreationExpr.class, RegionExtractor.FROM_FIRST_LOCATION);
21+
super(sarif, ObjectCreationExpr.class, SourceCodeRegionExtractor.FROM_SARIF_FIRST_LOCATION);
2222
}
2323

2424
@Override

core-codemods/src/main/java/io/codemodder/codemods/InputResourceLeakCodemod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public final class InputResourceLeakCodemod extends SarifPluginJavaParserChanger
2020
@Inject
2121
public InputResourceLeakCodemod(
2222
@ProvidedCodeQLScan(ruleId = "java/input-resource-leak") final RuleSarif sarif) {
23-
super(sarif, Expression.class, RegionExtractor.FROM_FIRST_LOCATION);
23+
super(sarif, Expression.class, SourceCodeRegionExtractor.FROM_SARIF_FIRST_LOCATION);
2424
}
2525

2626
@Override

core-codemods/src/main/java/io/codemodder/codemods/InsecureCookieCodemod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class InsecureCookieCodemod extends SarifPluginJavaParserChanger<MethodCa
2424
@Inject
2525
public InsecureCookieCodemod(
2626
@ProvidedCodeQLScan(ruleId = "java/insecure-cookie") final RuleSarif sarif) {
27-
super(sarif, MethodCallExpr.class, RegionExtractor.FROM_FIRST_LOCATION);
27+
super(sarif, MethodCallExpr.class, SourceCodeRegionExtractor.FROM_SARIF_FIRST_LOCATION);
2828
}
2929

3030
@Override

core-codemods/src/main/java/io/codemodder/codemods/JDBCResourceLeakCodemod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public final class JDBCResourceLeakCodemod extends SarifPluginJavaParserChanger<
2020
@Inject
2121
public JDBCResourceLeakCodemod(
2222
@ProvidedCodeQLScan(ruleId = "java/database-resource-leak") final RuleSarif sarif) {
23-
super(sarif, MethodCallExpr.class, RegionExtractor.FROM_FIRST_LOCATION);
23+
super(sarif, MethodCallExpr.class, SourceCodeRegionExtractor.FROM_SARIF_FIRST_LOCATION);
2424
}
2525

2626
@Override

core-codemods/src/main/java/io/codemodder/codemods/JEXLInjectionCodemod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public final class JEXLInjectionCodemod extends SarifPluginJavaParserChanger<Exp
3939
@Inject
4040
public JEXLInjectionCodemod(
4141
@ProvidedCodeQLScan(ruleId = "java/jexl-expression-injection") final RuleSarif sarif) {
42-
super(sarif, Expression.class, RegionExtractor.FROM_FIRST_LOCATION);
42+
super(sarif, Expression.class, SourceCodeRegionExtractor.FROM_SARIF_FIRST_LOCATION);
4343
}
4444

4545
@Override

core-codemods/src/main/java/io/codemodder/codemods/OptimizeJacksonStringUsageCodemod.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ public final class OptimizeJacksonStringUsageCodemod
2525
@Inject
2626
public OptimizeJacksonStringUsageCodemod(
2727
@SemgrepScan(ruleId = "optimize-jackson-string-usage") RuleSarif semgrepSarif) {
28-
super(semgrepSarif, ExpressionStmt.class, RegionExtractor.FROM_FIRST_THREADFLOW_EVENT);
28+
super(
29+
semgrepSarif,
30+
ExpressionStmt.class,
31+
SourceCodeRegionExtractor.FROM_SARIF_FIRST_THREADFLOW_EVENT);
2932
}
3033

3134
/**
@@ -38,8 +41,8 @@ public OptimizeJacksonStringUsageCodemod(
3841
* <li>The resulting String is used nowhere else besides the readValue() call.
3942
* </ol>
4043
*
41-
* We've configured the {@link RegionExtractor} to pull the first data flow event, which is the
42-
* IOUtils#toString() call.
44+
* We've configured the {@link SourceCodeRegionExtractor} to pull the first data flow event, which
45+
* is the IOUtils#toString() call.
4346
*/
4447
@Override
4548
public boolean onResultFound(
@@ -71,7 +74,10 @@ public boolean onResultFound(
7174
Optional<MethodCallExpr> readValueCallOpt =
7275
ASTs.findMethodBodyFrom(varDeclStmt).get().findAll(ExpressionStmt.class).stream()
7376
.filter(stmt -> stmt.getRange().isPresent())
74-
.filter(stmt -> EXACT_MATCH.matches(lastRegion, stmt.getRange().get()))
77+
.filter(
78+
stmt ->
79+
EXACT_MATCH.matches(
80+
SourceCodeRegion.fromSarif(lastRegion), stmt.getRange().get()))
7581
.map(stmt -> stmt.getExpression().asVariableDeclarationExpr())
7682
.map(vde -> vde.getVariable(0).getInitializer().get().asMethodCallExpr())
7783
.findFirst();

core-codemods/src/main/java/io/codemodder/codemods/OutputResourceLeakCodemod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public final class OutputResourceLeakCodemod extends SarifPluginJavaParserChange
2020
@Inject
2121
public OutputResourceLeakCodemod(
2222
@ProvidedCodeQLScan(ruleId = "java/output-resource-leak") final RuleSarif sarif) {
23-
super(sarif, Expression.class, RegionExtractor.FROM_FIRST_LOCATION);
23+
super(sarif, Expression.class, SourceCodeRegionExtractor.FROM_SARIF_FIRST_LOCATION);
2424
}
2525

2626
@Override

core-codemods/src/main/java/io/codemodder/codemods/SanitizeApacheMultipartFilenameCodemod.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,10 @@ public final class SanitizeApacheMultipartFilenameCodemod
2121
@Inject
2222
public SanitizeApacheMultipartFilenameCodemod(
2323
@SemgrepScan(ruleId = "sanitize-apache-multipart-filename") RuleSarif semgrepSarif) {
24-
super(semgrepSarif, MethodCallExpr.class, RegionExtractor.FROM_FIRST_THREADFLOW_EVENT);
24+
super(
25+
semgrepSarif,
26+
MethodCallExpr.class,
27+
SourceCodeRegionExtractor.FROM_SARIF_FIRST_THREADFLOW_EVENT);
2528
}
2629

2730
@Override

0 commit comments

Comments
 (0)