]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3119 Report only one violation per block of commented out lines of code
authorEvgeny Mandrikov <mandrikov@gmail.com>
Wed, 4 Jul 2012 18:15:05 +0000 (00:15 +0600)
committerEvgeny Mandrikov <mandrikov@gmail.com>
Wed, 4 Jul 2012 19:01:38 +0000 (01:01 +0600)
plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/CommentedOutCodeLineCheck.java
plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/ast/check/CommentedOutCodeLineCheckTest.java

index 97cb1230c7f588fdff125624873dbf376a3ad5b5..be273ded716dc200e65bbf114d6af4309b797aa8 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.java.ast.check;
 
+import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.puppycrawl.tools.checkstyle.api.DetailAST;
 import com.puppycrawl.tools.checkstyle.api.TextBlock;
@@ -35,6 +36,7 @@ import org.sonar.squid.api.SourceFile;
 import org.sonar.squid.recognizer.CodeRecognizer;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -133,18 +135,34 @@ public class CommentedOutCodeLineCheck extends JavaAstVisitor {
    */
   @Override
   public void leaveFile(DetailAST ast) {
-    SourceFile sourceFile = (SourceFile) peekSourceCode();
+    List<Integer> commentedOutCodeLines = Lists.newArrayList();
     for (TextBlock comment : comments) {
       String[] lines = comment.getText();
       for (int i = 0; i < lines.length; i++) {
         if (codeRecognizer.isLineOfCode(lines[i])) {
-          CheckMessage message = new CheckMessage(this, "This block of commented-out lines of code should be removed.");
-          message.setLine(comment.getStartLineNo() + i);
-          sourceFile.log(message);
+          // Mark all remaining lines from this comment as a commented out lines of code
+          for (int j = i; j < lines.length; j++) {
+            commentedOutCodeLines.add(comment.getStartLineNo() + j);
+          }
           break;
         }
       }
     }
+
+    // Greedy algorithm to split lines on blocks and to report only one violation per block
+    SourceFile sourceFile = (SourceFile) peekSourceCode();
+    Collections.sort(commentedOutCodeLines);
+    int prev = Integer.MIN_VALUE;
+    for (int i = 0; i < commentedOutCodeLines.size(); i++) {
+      int current = commentedOutCodeLines.get(i);
+      if (prev + 1 < current) {
+        CheckMessage message = new CheckMessage(this, "This block of commented-out lines of code should be removed.");
+        message.setLine(current);
+        sourceFile.log(message);
+      }
+      prev = current;
+    }
+
     comments = null;
   }
 
index f04f10e0b3a9b14871bf15a66a09cd46a9e570c7..d75ba9c1602a90ff04ba41a7bc31c5522706b076 100644 (file)
@@ -54,19 +54,10 @@ public class CommentedOutCodeLineCheckTest {
     CheckMessages checkMessages = new CheckMessages(sourceFile);
 
     checkMessages.assertNext().atLine(32).withMessage("This block of commented-out lines of code should be removed.");
-    checkMessages.assertNext().atLine(33);
-    checkMessages.assertNext().atLine(34);
-
     checkMessages.assertNext().atLine(38);
-
     checkMessages.assertNext().atLine(44);
-    checkMessages.assertNext().atLine(45);
-    checkMessages.assertNext().atLine(46);
-
     checkMessages.assertNext().atLine(50);
-
     checkMessages.assertNext().atLine(66);
-
     checkMessages.assertNext().atLine(75);
 
     checkMessages.assertNoMore();