assertion for IDEA-54448
authorAlexey Kudravtsev <cdr@intellij.com>
Mon, 24 May 2010 12:13:43 +0000 (16:13 +0400)
committerAlexey Kudravtsev <cdr@intellij.com>
Tue, 25 May 2010 07:38:47 +0000 (11:38 +0400)
platform/lang-impl/src/com/intellij/psi/impl/search/LowLevelSearchUtil.java
platform/util/src/com/intellij/util/text/StringSearcher.java

index a30eff2ac7fadf7c5deef9ab7c66400592c7ecf4..9b89e95838b6dcd3faa88edd2eda5d4079816091 100644 (file)
@@ -126,10 +126,11 @@ public class LowLevelSearchUtil {
     return true;
   }
   //@RequiresReadAction
-  public static boolean processElementsContainingWordInElement(final TextOccurenceProcessor processor,
-                                                               final PsiElement scope,
-                                                               final StringSearcher searcher,
-                                                               final boolean ignoreInjectedPsi, ProgressIndicator progress) {
+  public static boolean processElementsContainingWordInElement(@NotNull TextOccurenceProcessor processor,
+                                                               @NotNull PsiElement scope,
+                                                               @NotNull StringSearcher searcher,
+                                                               final boolean ignoreInjectedPsi,
+                                                               ProgressIndicator progress) {
     if (progress != null) progress.checkCanceled();
 
     PsiFile file = scope.getContainingFile();
@@ -139,6 +140,9 @@ public class LowLevelSearchUtil {
     int scopeStart = range.getStartOffset();
     int startOffset = scopeStart;
     int endOffset = range.getEndOffset();
+    if (endOffset > buffer.length()) {
+      LOG.error("Range for element: '"+scope+"' = "+range+" is out of file '" + file + "' range: " + file.getTextLength());
+    }
 
     do {
       if (progress != null) progress.checkCanceled();
@@ -156,6 +160,7 @@ public class LowLevelSearchUtil {
   }
 
   public static int searchWord(@NotNull CharSequence text, int startOffset, int endOffset, @NotNull StringSearcher searcher, @Nullable ProgressIndicator progress) {
+    LOG.assertTrue(endOffset <= text.length());
     for (int index = startOffset; index < endOffset; index++) {
       if (progress != null) progress.checkCanceled();
       //noinspection AssignmentToForLoopParameter
@@ -164,7 +169,7 @@ public class LowLevelSearchUtil {
       if (!searcher.isJavaIdentifier()) {
         return index;
       }
-      
+
       if (index > startOffset) {
         char c = text.charAt(index - 1);
         if (Character.isJavaIdentifierPart(c) && c != '$') {
index fb19588883b3be44fc0bbc2715892d231ecee185..503a0ba82d439f381b5e19275555184208b6d9ac 100644 (file)
@@ -73,21 +73,23 @@ public class StringSearcher {
   }
   
   public int scan(CharSequence text, int _start, int _end) {
-    if (myForwardDirection){
+    LOG.assertTrue(_start <= _end, _start - _end);
+    LOG.assertTrue(_end <= text.length(), text.length() - _end);
+    if (myForwardDirection) {
       int start = _start;
       int end = _end - myPatternLength;
 
-      while(start <= end){
+      while (start <= end) {
         int i = myPatternLength - 1;
         char lastChar = text.charAt(start + i);
-        if (!myCaseSensitive){
+        if (!myCaseSensitive) {
           lastChar = StringUtil.toLowerCase(lastChar);
         }
-        if (myPatternArray[i] == lastChar){
+        if (myPatternArray[i] == lastChar) {
           i--;
-          while(i >= 0){
+          while (i >= 0) {
             char c = text.charAt(start + i);
-            if (!myCaseSensitive){
+            if (!myCaseSensitive) {
               c = StringUtil.toLowerCase(c);
             }
             if (myPatternArray[i] != c) break;
@@ -98,9 +100,9 @@ public class StringSearcher {
 
         int step = 0 <= lastChar && lastChar < 128 ? mySearchTable[lastChar] : 1;
 
-        if (step <= 0){
+        if (step <= 0) {
           int index;
-          for(index = myPatternLength - 2; index >= 0; index--){
+          for (index = myPatternLength - 2; index >= 0; index--) {
             if (myPatternArray[index] == lastChar) break;
           }
           step = myPatternLength - index - 1;
@@ -114,17 +116,17 @@ public class StringSearcher {
     else {
       int start = 1;
       int end = text.length() - myPatternLength + 1;
-      while(start <= end){
+      while (start <= end) {
         int i = myPatternLength - 1;
         char lastChar = text.charAt(text.length() - (start + i));
-        if (!myCaseSensitive){
+        if (!myCaseSensitive) {
           lastChar = StringUtil.toLowerCase(lastChar);
         }
-        if (myPatternArray[myPatternLength - 1 - i] == lastChar){
+        if (myPatternArray[myPatternLength - 1 - i] == lastChar) {
           i--;
-          while(i >= 0){
+          while (i >= 0) {
             char c = text.charAt(text.length() - (start + i));
-            if (!myCaseSensitive){
+            if (!myCaseSensitive) {
               c = StringUtil.toLowerCase(c);
             }
             if (myPatternArray[myPatternLength - 1 - i] != c) break;
@@ -135,9 +137,9 @@ public class StringSearcher {
 
         int step = 0 <= lastChar && lastChar < 128 ? mySearchTable[lastChar] : 1;
 
-        if (step <= 0){
+        if (step <= 0) {
           int index;
-          for(index = myPatternLength - 2; index >= 0; index--){
+          for (index = myPatternLength - 2; index >= 0; index--) {
             if (myPatternArray[myPatternLength - 1 - index] == lastChar) break;
           }
           step = myPatternLength - index - 1;