From ec56a9557dfff45b1ac090b576d7e2d41cc02b26 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Fri, 11 Jul 2014 19:37:14 +0200 Subject: [PATCH] skip leading .* in reg exp used for todo pattern when building index: it makes sense for todo highlighting but increases matching due to backtracking enormously (IDEA-74104) --- .../impl/id/PlatformIdTableBuilding.java | 2 +- .../psi/impl/cache/impl/todo/TodoIndex.java | 2 +- .../com/intellij/psi/search/IndexPattern.java | 20 ++++++++++++++----- .../psi/impl/cache/impl/BaseFilterLexer.java | 2 +- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/platform/editor-ui-ex/src/com/intellij/psi/impl/cache/impl/id/PlatformIdTableBuilding.java b/platform/editor-ui-ex/src/com/intellij/psi/impl/cache/impl/id/PlatformIdTableBuilding.java index 330dcfdf5e6a..6a3dd82b237e 100644 --- a/platform/editor-ui-ex/src/com/intellij/psi/impl/cache/impl/id/PlatformIdTableBuilding.java +++ b/platform/editor-ui-ex/src/com/intellij/psi/impl/cache/impl/id/PlatformIdTableBuilding.java @@ -213,7 +213,7 @@ public abstract class PlatformIdTableBuilding { } OccurrenceConsumer occurrenceConsumer = new OccurrenceConsumer(null, true); for (IndexPattern indexPattern : indexPatterns) { - Pattern pattern = indexPattern.getPattern(); + Pattern pattern = indexPattern.getOptimizedIndexingPattern(); if (pattern != null) { Matcher matcher = pattern.matcher(chars); while (matcher.find()) { diff --git a/platform/editor-ui-ex/src/com/intellij/psi/impl/cache/impl/todo/TodoIndex.java b/platform/editor-ui-ex/src/com/intellij/psi/impl/cache/impl/todo/TodoIndex.java index 09b379e8078b..d955354cca7f 100644 --- a/platform/editor-ui-ex/src/com/intellij/psi/impl/cache/impl/todo/TodoIndex.java +++ b/platform/editor-ui-ex/src/com/intellij/psi/impl/cache/impl/todo/TodoIndex.java @@ -127,7 +127,7 @@ public class TodoIndex extends FileBasedIndexExtension @Override public int getVersion() { - return 7; + return 8; } @Override diff --git a/platform/indexing-api/src/com/intellij/psi/search/IndexPattern.java b/platform/indexing-api/src/com/intellij/psi/search/IndexPattern.java index fc5de78f9407..96c12bda1841 100644 --- a/platform/indexing-api/src/com/intellij/psi/search/IndexPattern.java +++ b/platform/indexing-api/src/com/intellij/psi/search/IndexPattern.java @@ -29,6 +29,7 @@ import java.util.regex.PatternSyntaxException; */ public class IndexPattern { @NotNull private String myPatternString; + private Pattern myOptimizedIndexingPattern; private boolean myCaseSensitive; private Pattern myPattern; @@ -53,6 +54,10 @@ public class IndexPattern { return myPattern; } + public Pattern getOptimizedIndexingPattern() { + return myOptimizedIndexingPattern; + } + public boolean isCaseSensitive() { return myCaseSensitive; } @@ -68,16 +73,21 @@ public class IndexPattern { } private void compilePattern() { - try{ - if (myCaseSensitive){ - myPattern = Pattern.compile(myPatternString); + try { + int flags = 0; + if (!myCaseSensitive) { + flags = Pattern.CASE_INSENSITIVE; } - else{ - myPattern = Pattern.compile(myPatternString, Pattern.CASE_INSENSITIVE); + myPattern = Pattern.compile(myPatternString, flags); + String optimizedPattern = myPatternString; + if (optimizedPattern.startsWith(".*")) { + optimizedPattern = optimizedPattern.substring(".*".length()); } + myOptimizedIndexingPattern = Pattern.compile(optimizedPattern, flags); } catch(PatternSyntaxException e){ myPattern = null; + myOptimizedIndexingPattern = null; } } diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/BaseFilterLexer.java b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/BaseFilterLexer.java index cc9dddf396ea..ab774d182cbb 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/BaseFilterLexer.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/BaseFilterLexer.java @@ -76,7 +76,7 @@ public abstract class BaseFilterLexer extends DelegateLexer implements IdTableBu todoScanningState = new TodoScanningState(patterns, matchers); for (int i = 0; i < patterns.length; ++i) { - Pattern pattern = patterns[i].getPattern(); + Pattern pattern = patterns[i].getOptimizedIndexingPattern(); if (pattern != null) { matchers[i] = pattern.matcher("");