Skip to content

Commit a6c7cc4

Browse files
committed
✨ implement OverridesMatchParentSynchronizationCodemod
1 parent 9094a80 commit a6c7cc4

File tree

3 files changed

+74
-0
lines changed

3 files changed

+74
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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.Codemod;
8+
import io.codemodder.CodemodExecutionPriority;
9+
import io.codemodder.CodemodInvocationContext;
10+
import io.codemodder.ReviewGuidance;
11+
import io.codemodder.providers.sonar.ProvidedSonarScan;
12+
import io.codemodder.providers.sonar.RuleIssues;
13+
import io.codemodder.providers.sonar.SonarPluginJavaParserChanger;
14+
import io.codemodder.providers.sonar.api.Issue;
15+
import java.util.Optional;
16+
import javax.inject.Inject;
17+
18+
/**
19+
* A codemod for automatically fixing overridden methods that do not match their parent methods in
20+
* synchronization.
21+
*/
22+
@Codemod(
23+
id = "sonar:java/overrides-match-synchronization-s3551",
24+
reviewGuidance = ReviewGuidance.MERGE_WITHOUT_REVIEW,
25+
executionPriority = CodemodExecutionPriority.HIGH)
26+
public final class OverridesMatchParentSynchronizationCodemod
27+
extends SonarPluginJavaParserChanger<SimpleName> {
28+
29+
@Inject
30+
public OverridesMatchParentSynchronizationCodemod(
31+
@ProvidedSonarScan(ruleId = "java:S3551") final RuleIssues issues) {
32+
super(issues, SimpleName.class);
33+
}
34+
35+
@Override
36+
public boolean onIssueFound(
37+
CodemodInvocationContext context, CompilationUnit cu, SimpleName methodName, Issue issue) {
38+
Optional<Node> parentNodeRef = methodName.getParentNode();
39+
if (parentNodeRef.isPresent()) {
40+
Node parentNode = parentNodeRef.get();
41+
if (parentNode instanceof MethodDeclaration method) {
42+
method.setSynchronized(true);
43+
return true;
44+
}
45+
}
46+
return false;
47+
}
48+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
This change adds missing synchronized keyword to methods that override a synchronized method in the parent class.
2+
Our changes look something like this:
3+
4+
```diff
5+
interface AcmeParent {
6+
synchronized void doThing();
7+
}
8+
9+
class AcmeChild implements AcmeParent {
10+
11+
@Override
12+
- void doThing() {
13+
+ synchronized void doThing() {
14+
thing();
15+
}
16+
17+
}
18+
```
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"summary" : "Added missing synchronized keyword (Sonar)",
3+
"change" : "Added missing synchronized keyword",
4+
"references" : [
5+
"https://rules.sonarsource.com/java/RSPEC-3551/",
6+
"https://wiki.sei.cmu.edu/confluence/display/java/TSM00-J.+Do+not+override+thread-safe+methods+with+methods+that+are+not+thread-safe"
7+
]
8+
}

0 commit comments

Comments
 (0)