Added test for TODOs in Django. Removed n^2 scan for merging comments.
authorDmitry Trofimov <dmitry.trofimov@jetbrains.com>
Fri, 25 Feb 2011 10:10:21 +0000 (13:10 +0300)
committerDmitry Trofimov <dmitry.trofimov@jetbrains.com>
Mon, 28 Feb 2011 11:29:34 +0000 (14:29 +0300)
platform/lang-impl/src/com/intellij/psi/impl/search/IndexPatternSearcher.java
platform/util/src/com/intellij/util/containers/ContainerUtil.java
platform/util/testSrc/com/intellij/util/containers/ContainerUtilTest.java

index df9be16654ebbad21f80737cdd4a52fbccf75e4b..41b29cf49babcdc5cd3315616ed14eb291b704b0 100644 (file)
@@ -39,6 +39,7 @@ import com.intellij.psi.tree.IElementType;
 import com.intellij.psi.tree.TokenSet;
 import com.intellij.util.Processor;
 import com.intellij.util.QueryExecutor;
+import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.text.CharSequenceSubSequence;
 import gnu.trove.TIntArrayList;
 import org.jetbrains.annotations.NotNull;
@@ -51,7 +52,8 @@ import java.util.regex.Pattern;
  * @author yole
  */
 public class IndexPatternSearcher implements QueryExecutor<IndexPatternOccurrence, IndexPatternSearch.SearchParameters> {
-  public boolean execute(@NotNull final IndexPatternSearch.SearchParameters queryParameters, @NotNull final Processor<IndexPatternOccurrence> consumer) {
+  public boolean execute(@NotNull final IndexPatternSearch.SearchParameters queryParameters,
+                         @NotNull final Processor<IndexPatternOccurrence> consumer) {
     final PsiFile file = queryParameters.getFile();
     VirtualFile virtualFile = file.getVirtualFile();
     if (file instanceof PsiBinaryFile || file instanceof PsiCompiledElement || virtualFile == null) {
@@ -161,29 +163,16 @@ public class IndexPatternSearcher implements QueryExecutor<IndexPatternOccurrenc
   }
 
   private static void mergeCommentLists(TIntArrayList commentStarts,
-                                       TIntArrayList commentEnds,
-                                       TIntArrayList commentStartsList,
-                                       TIntArrayList commentEndsList) {
+                                        TIntArrayList commentEnds,
+                                        TIntArrayList commentStartsList,
+                                        TIntArrayList commentEndsList) {
     if (commentStarts.size() == 0 && commentEnds.size() == 0) {
       commentStarts.add(commentStartsList.toNativeArray());
       commentEnds.add(commentEndsList.toNativeArray());
       return;
     }
 
-    // TODO: this is costly for large N !
-    for (int i = 0; i < commentStartsList.size(); i++) {
-      boolean found = false;
-      for (int j = 0; j < commentStarts.size(); j++) {
-        if (commentStarts.get(j) == commentStartsList.get(i) && commentEnds.get(j) == commentEndsList.get(i)) {
-          found = true;
-          break;
-        }
-      }
-      if (!found) {
-        commentStarts.add(commentStartsList.get(i));
-        commentEnds.add(commentEndsList.get(i));
-      }
-    }
+    ContainerUtil.mergeSortedArrays(commentStarts, commentEnds, commentStartsList, commentEndsList);
   }
 
   private static void findComments(final Lexer lexer,
index c388ba725271796e5107a67389a46670fda83fc2..f6f7f4979abef2af1821ff86ec5635c80e3b14dc 100644 (file)
@@ -20,6 +20,7 @@ import com.intellij.openapi.util.Condition;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.Factory;
 import com.intellij.util.*;
+import gnu.trove.TIntArrayList;
 import gnu.trove.TObjectHashingStrategy;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -1001,6 +1002,57 @@ public class ContainerUtil {
     return (List<T>)EmptyList.INSTANCE;
   }
 
+  /**
+   * Merge sorted points, which are sorted by x and with equal x by y.
+   * Result is put to x1 y1.
+   */
+  public static void mergeSortedArrays(TIntArrayList x1,
+                                       TIntArrayList y1,
+                                       TIntArrayList x2,
+                                       TIntArrayList y2) {
+    TIntArrayList newX = new TIntArrayList();
+    TIntArrayList newY = new TIntArrayList();
+
+    int i = 0;
+    int j = 0;
+
+    while (i < x1.size() && j < x2.size()) {
+      if (x1.get(i) < x2.get(j) || (x1.get(i) == x2.get(j) && y1.get(i) < y2.get(j))) {
+        newX.add(x1.get(i));
+        newY.add(y1.get(i));
+        i++;
+      }
+      else if (x1.get(i) > x2.get(j) || (x1.get(i) == x2.get(j) && y1.get(i) > y2.get(j))) {
+        newX.add(x2.get(j));
+        newY.add(y2.get(j));
+        j++;
+      }
+      else { //equals
+        newX.add(x1.get(i));
+        newY.add(y1.get(i));
+        i++;
+        j++;
+      }
+    }
+
+    while (i < x1.size()) {
+      newX.add(x1.get(i));
+      newY.add(y1.get(i));
+      i++;
+    }
+
+    while (j < x2.size()) {
+      newX.add(x2.get(j));
+      newY.add(y2.get(j));
+      j++;
+    }
+
+    x1.clear();
+    y1.clear();
+    x1.add(newX.toNativeArray());
+    y1.add(newY.toNativeArray());
+  }
+
   private static class EmptyList extends AbstractList<Object> implements RandomAccess, Serializable {
     private static final EmptyList INSTANCE = new EmptyList();
 
index c7e8d7f68faa31f74179c04b751a931c5297d4b1..34e0c723fba590c234091fa54a9e5f8c199f91bc 100644 (file)
@@ -17,6 +17,7 @@
 package com.intellij.util.containers;
 
 import com.intellij.openapi.util.Condition;
+import gnu.trove.TIntArrayList;
 
 import java.util.*;
 
@@ -90,4 +91,25 @@ public class ContainerUtilTest extends junit.framework.TestCase {
 
     assertEquals("abccba", log);
   }
+
+  public void testMergeSortedArrays() {
+    TIntArrayList x1 = new TIntArrayList(new int[]{0, 2, 4, 6});
+    TIntArrayList y1 = new TIntArrayList(new int[]{0, 2, 4, 6});
+    TIntArrayList x2 = new TIntArrayList(new int[]{1, 2, 2});
+    TIntArrayList y2 = new TIntArrayList(new int[]{1, 2, 3});
+    ContainerUtil.mergeSortedArrays(x1, y1, x2, y2);
+    assertEquals(new TIntArrayList(new int[]{0, 1, 2, 2, 4, 6}), x1);
+    assertEquals(new TIntArrayList(new int[]{0, 1, 2, 3, 4, 6}), y1);
+    x2 = new TIntArrayList(new int[]{1, 2, 2});
+    y2 = new TIntArrayList(new int[]{1, 2, 3});
+    ContainerUtil.mergeSortedArrays(x1, y1, x2, y2);
+    assertEquals(new TIntArrayList(new int[]{0, 1, 2, 2, 4, 6}), x1);
+    assertEquals(new TIntArrayList(new int[]{0, 1, 2, 3, 4, 6}), y1);
+
+    x2 = new TIntArrayList(new int[]{-1, -1, -2});
+    y2 = new TIntArrayList(new int[]{-1, -2, -3});
+    ContainerUtil.mergeSortedArrays(x1, y1, x2, y2);
+    assertEquals(new TIntArrayList(new int[]{-1, -1, -2, 0, 1, 2, 2, 4, 6}), x1);
+    assertEquals(new TIntArrayList(new int[]{-1, -2, -3, 0, 1, 2, 3, 4, 6}), y1);
+  }
 }