don't cancel search on ProcessCanceledExceptions from too long regexp processing
authorAnna.Kozlova <anna.kozlova@jetbrains.com>
Thu, 17 Nov 2016 10:23:04 +0000 (11:23 +0100)
committerAnna.Kozlova <anna.kozlova@jetbrains.com>
Thu, 17 Nov 2016 13:29:36 +0000 (14:29 +0100)
 Caused by: com.intellij.openapi.progress.ProcessCanceledException
 at com.intellij.openapi.util.text.StringUtil$9.checkCanceled(StringUtil.java:3192)
 ...
 at java.util.regex.Matcher.find(Matcher.java:637)
 at com.intellij.openapi.vcs.IssueNavigationConfiguration.findIssueLinks(IssueNavigationConfiguration.java:98)
 at com.intellij.psi.impl.source.resolve.reference.ArbitraryPlaceUrlReferenceProvider$1.lambda$compute$0(ArbitraryPlaceUrlReferenceProvider.java:51)

platform/vcs-api/src/com/intellij/openapi/vcs/IssueNavigationConfiguration.java

index b5458fc19353553e6dd8b2ba41164e0ba0b30e31..99e492b5e37853804c380c5d150fd40295c8f467 100644 (file)
@@ -21,6 +21,7 @@ import com.intellij.openapi.components.PersistentStateComponent;
 import com.intellij.openapi.components.State;
 import com.intellij.openapi.components.Storage;
 import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.progress.ProcessCanceledException;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.SimpleModificationTracker;
 import com.intellij.openapi.util.TextRange;
@@ -92,22 +93,27 @@ public class IssueNavigationConfiguration extends SimpleModificationTracker
 
   public List<LinkMatch> findIssueLinks(CharSequence text) {
     final List<LinkMatch> result = new ArrayList<>();
-    for (IssueNavigationLink link : myLinks) {
-      Pattern issuePattern = link.getIssuePattern();
-      Matcher m = issuePattern.matcher(text);
-      while (m.find()) {
-        try {
-          String replacement = issuePattern.matcher(m.group(0)).replaceFirst(link.getLinkRegexp());
-          addMatch(result, new TextRange(m.start(), m.end()), replacement);
-        }
-        catch (Exception e) {
-          LOG.debug("Malformed regex replacement. IssueLink: " + link + "; text: " + text, e);
+    try {
+      for (IssueNavigationLink link : myLinks) {
+        Pattern issuePattern = link.getIssuePattern();
+        Matcher m = issuePattern.matcher(text);
+        while (m.find()) {
+          try {
+            String replacement = issuePattern.matcher(m.group(0)).replaceFirst(link.getLinkRegexp());
+            addMatch(result, new TextRange(m.start(), m.end()), replacement);
+          }
+          catch (Exception e) {
+            LOG.debug("Malformed regex replacement. IssueLink: " + link + "; text: " + text, e);
+          }
         }
       }
+      Matcher m = URLUtil.URL_PATTERN.matcher(text);
+      while (m.find()) {
+        addMatch(result, new TextRange(m.start(), m.end()), m.group());
+      }
     }
-    Matcher m = URLUtil.URL_PATTERN.matcher(text);
-    while (m.find()) {
-      addMatch(result, new TextRange(m.start(), m.end()), m.group());
+    catch (ProcessCanceledException e) {
+      //skip too long processing completely
     }
     Collections.sort(result);
     return result;