From e33e3b36231f49ac3b3103e8f26f9a27c6b1892d Mon Sep 17 00:00:00 2001 From: Michael Davenport Date: Fri, 7 Feb 2025 14:28:33 -0700 Subject: [PATCH 1/2] add test (DuplicateBlockTest): nested duplication not double counted --- .../decomposition/DuplicateBlockTest.java | 7 +++++ ...FindErrors_when_NestedDuplicateBlocks.java | 31 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/test/resources/edu/byu/cs240/checkstyle/decomposition/testInputs/duplicateBlock/should_FindErrors_when_NestedDuplicateBlocks.java diff --git a/src/test/java/edu/byu/cs240/checkstyle/decomposition/DuplicateBlockTest.java b/src/test/java/edu/byu/cs240/checkstyle/decomposition/DuplicateBlockTest.java index b26a4d4..cfb8f23 100644 --- a/src/test/java/edu/byu/cs240/checkstyle/decomposition/DuplicateBlockTest.java +++ b/src/test/java/edu/byu/cs240/checkstyle/decomposition/DuplicateBlockTest.java @@ -60,4 +60,11 @@ public void should_FindErrors_when_DuplicateBlocks() throws CheckstyleException testFiles(3, fileName); } + @Test + @DisplayName("Should find the correct number of errors in code that has nested duplicate blocks") + public void should_FindErrors_when_NestedDuplicateBlocks() throws CheckstyleException { + String fileName = "testInputs/duplicateBlock/should_FindErrors_when_NestedDuplicateBlocks.java"; + testFiles(2, fileName); + } + } \ No newline at end of file diff --git a/src/test/resources/edu/byu/cs240/checkstyle/decomposition/testInputs/duplicateBlock/should_FindErrors_when_NestedDuplicateBlocks.java b/src/test/resources/edu/byu/cs240/checkstyle/decomposition/testInputs/duplicateBlock/should_FindErrors_when_NestedDuplicateBlocks.java new file mode 100644 index 0000000..f568192 --- /dev/null +++ b/src/test/resources/edu/byu/cs240/checkstyle/decomposition/testInputs/duplicateBlock/should_FindErrors_when_NestedDuplicateBlocks.java @@ -0,0 +1,31 @@ +class should_FindErrors_when_DuplicateBlocks { + public void hi() { + int i = 7; + int j = 4; + if(i > j) { + if (i <= j) { + System.out.println(i + j); + System.out.println(i - j); + System.out.println(j - i); + } + } + i = 2; + j = 0; + if(i > j) { + if (i <= j) { + System.out.println(i + j); + System.out.println(i - j); + System.out.println(j - i); + } + } + i = 17; + j = 17; + if(i > j) { + if (i <= j) { + System.out.println(i + j); + System.out.println(i - j); + System.out.println(j - i); + } + } + } +} \ No newline at end of file From f80fec987bfe98f4e02c2a5f88a48a6a59014f8f Mon Sep 17 00:00:00 2001 From: Michael Davenport Date: Fri, 7 Feb 2025 14:31:13 -0700 Subject: [PATCH 2/2] add functionality to prevent duplicate duplicate reporting --- .../decomposition/AbstractDuplicateCheck.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/edu/byu/cs240/checkstyle/decomposition/AbstractDuplicateCheck.java b/src/main/java/edu/byu/cs240/checkstyle/decomposition/AbstractDuplicateCheck.java index 0598b71..81e7319 100644 --- a/src/main/java/edu/byu/cs240/checkstyle/decomposition/AbstractDuplicateCheck.java +++ b/src/main/java/edu/byu/cs240/checkstyle/decomposition/AbstractDuplicateCheck.java @@ -20,6 +20,8 @@ public abstract class AbstractDuplicateCheck extends AbstractCheck { protected int minComplexity = 50; + protected DetailAST inViolationAST = null; + /** * Sets the minimum complexity of the check @@ -44,6 +46,10 @@ public void visitToken(DetailAST ast) { return; } + if(inViolationAST != null) { + return; + } + int complexity = TreeUtils.astComplexity(ast); if (complexity < minComplexity) { return; @@ -52,6 +58,7 @@ public void visitToken(DetailAST ast) { for (DetailAST original : checkedAst.keySet()) { if (astEquals(original, ast)) { logViolation(ast, original); + inViolationAST = ast; return; } } @@ -59,6 +66,13 @@ public void visitToken(DetailAST ast) { checkedAst.put(ast, getFilePath()); } + @Override + public void leaveToken(DetailAST ast) { + if(inViolationAST == ast) { + inViolationAST = null; + } + super.leaveToken(ast); + } /** * Logs violations of duplicates.