From 74a5e23e0f21ae471884f8ad286d6218ff1dbbd9 Mon Sep 17 00:00:00 2001 From: Aman Sharma Date: Thu, 20 Oct 2022 00:05:36 +0200 Subject: [PATCH 1/3] Introduce failing test cases --- .../PrivateFieldWrittenButNotRead.java | 13 +++++++++++++ .../PrivateFieldWrittenButNotRead.java.expected | 6 ++++++ 2 files changed, 19 insertions(+) create mode 100644 sorald/src/test/resources/processor_test_files/S1068_UnusedPrivateField/PrivateFieldWrittenButNotRead.java create mode 100644 sorald/src/test/resources/processor_test_files/S1068_UnusedPrivateField/PrivateFieldWrittenButNotRead.java.expected diff --git a/sorald/src/test/resources/processor_test_files/S1068_UnusedPrivateField/PrivateFieldWrittenButNotRead.java b/sorald/src/test/resources/processor_test_files/S1068_UnusedPrivateField/PrivateFieldWrittenButNotRead.java new file mode 100644 index 000000000..1dbf42935 --- /dev/null +++ b/sorald/src/test/resources/processor_test_files/S1068_UnusedPrivateField/PrivateFieldWrittenButNotRead.java @@ -0,0 +1,13 @@ +public class PrivateFieldWrittenButNotRead { + private int x; + + private String foo; + + public PrivateFieldWrittenButNotRead(int x, int y) { + this.x = x + y; + } + + public void initialize(String bar) { + foo = bar; + } +} diff --git a/sorald/src/test/resources/processor_test_files/S1068_UnusedPrivateField/PrivateFieldWrittenButNotRead.java.expected b/sorald/src/test/resources/processor_test_files/S1068_UnusedPrivateField/PrivateFieldWrittenButNotRead.java.expected new file mode 100644 index 000000000..5385b90cd --- /dev/null +++ b/sorald/src/test/resources/processor_test_files/S1068_UnusedPrivateField/PrivateFieldWrittenButNotRead.java.expected @@ -0,0 +1,6 @@ +public class PrivateFieldWrittenButNotRead { + + public PrivateFieldWrittenButNotRead(int x, int y) { } + + public void initialize(String bar) { } +} From ad136539ecd6780627b633141840b5eb5702702b Mon Sep 17 00:00:00 2001 From: Aman Sharma Date: Thu, 20 Oct 2022 00:09:49 +0200 Subject: [PATCH 2/3] Remove field writes if they are not read --- .../processor/UnusedPrivateFieldProcessor.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/sorald/src/main/java/sorald/processor/UnusedPrivateFieldProcessor.java b/sorald/src/main/java/sorald/processor/UnusedPrivateFieldProcessor.java index ce8735a97..31a4ea044 100644 --- a/sorald/src/main/java/sorald/processor/UnusedPrivateFieldProcessor.java +++ b/sorald/src/main/java/sorald/processor/UnusedPrivateFieldProcessor.java @@ -1,12 +1,29 @@ package sorald.processor; +import java.util.List; import sorald.annotations.ProcessorAnnotation; +import spoon.reflect.code.CtFieldWrite; +import spoon.reflect.code.CtStatement; +import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtField; +import spoon.reflect.visitor.filter.TypeFilter; @ProcessorAnnotation(key = "S1068", description = "Unused \"private\" fields should be removed") public class UnusedPrivateFieldProcessor extends SoraldAbstractProcessor> { @Override protected void repairInternal(CtField element) { + removeAllUnusedPrivateFieldWrites(element); 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> unusedFieldWrites = + parentClass.filterChildren(new TypeFilter<>(CtFieldWrite.class)).list(); + for (CtFieldWrite unusedFieldWrite : unusedFieldWrites) { + CtStatement statement = unusedFieldWrite.getParent(CtStatement.class); + statement.delete(); + } + } } From 0084232e119f963a8b0a6b9dd96cac9d4436cf67 Mon Sep 17 00:00:00 2001 From: Aman Sharma Date: Thu, 20 Oct 2022 00:19:46 +0200 Subject: [PATCH 3/3] Indicate noncompliance --- .../PrivateFieldWrittenButNotRead.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sorald/src/test/resources/processor_test_files/S1068_UnusedPrivateField/PrivateFieldWrittenButNotRead.java b/sorald/src/test/resources/processor_test_files/S1068_UnusedPrivateField/PrivateFieldWrittenButNotRead.java index 1dbf42935..036e7735a 100644 --- a/sorald/src/test/resources/processor_test_files/S1068_UnusedPrivateField/PrivateFieldWrittenButNotRead.java +++ b/sorald/src/test/resources/processor_test_files/S1068_UnusedPrivateField/PrivateFieldWrittenButNotRead.java @@ -1,7 +1,7 @@ public class PrivateFieldWrittenButNotRead { - private int x; + private int x; // Noncompliant - private String foo; + private String foo; // Noncompliant public PrivateFieldWrittenButNotRead(int x, int y) { this.x = x + y;