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. 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