Skip to content

Commit

Permalink
fix(S1068): delete field writes of violated field only (#921)
Browse files Browse the repository at this point in the history
* Modify tests

* fix(S1068): delete field writes of corresponding field only

* Add syntactic sugar

* Add tribute
  • Loading branch information
algomaster99 authored Oct 23, 2022
1 parent fe67971 commit 88b580a
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package sorald.processor;

import java.util.List;
import java.util.stream.Collectors;
import sorald.annotations.ProcessorAnnotation;
import spoon.reflect.code.CtFieldWrite;
import spoon.reflect.code.CtStatement;
Expand All @@ -12,18 +13,25 @@
public class UnusedPrivateFieldProcessor extends SoraldAbstractProcessor<CtField<?>> {
@Override
protected void repairInternal(CtField<?> element) {
removeAllUnusedPrivateFieldWrites(element);
// Delete the field
element.delete();
}

/** Removes all writes to the given field that are not read anywhere. */
private static void removeAllUnusedPrivateFieldWrites(CtField<?> field) {
CtClass<?> parentClass = field.getParent(CtClass.class);
List<CtFieldWrite<?>> unusedFieldWrites =
parentClass.filterChildren(new TypeFilter<>(CtFieldWrite.class)).list();
// Delete its usage
List<CtFieldWrite> unusedFieldWrites = getFieldWritesOfSpecifiedField(element);

for (CtFieldWrite<?> unusedFieldWrite : unusedFieldWrites) {
CtStatement statement = unusedFieldWrite.getParent(CtStatement.class);
statement.delete();
}
}

private static List<CtFieldWrite> getFieldWritesOfSpecifiedField(CtField<?> field) {
CtClass<?> parentClass = field.getParent(CtClass.class);
return parentClass
.filterChildren(new TypeFilter<>(CtFieldWrite.class))
.list(CtFieldWrite.class)
.stream()
.filter(fw -> fw.getVariable().getSimpleName().equals(field.getSimpleName()))
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,18 @@ public class PrivateFieldWrittenButNotRead {

private String foo; // Noncompliant

private long zhang;

public PrivateFieldWrittenButNotRead(int x, int y) {
this.x = x + y;
}

public void initialize(String bar) {
foo = bar;
zhang = 234324L;
}

public long getZhang() {
return zhang;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
public class PrivateFieldWrittenButNotRead {
private long zhang;

public PrivateFieldWrittenButNotRead(int x, int y) { }

public void initialize(String bar) { }
}
public void initialize(String bar) {
zhang = 234324L;
}

public long getZhang() {
return zhang;
}
}

0 comments on commit 88b580a

Please sign in to comment.