Don't use regexp matching for such a simple case.
authorMaxim Shafirov <max@jetbrains.com>
Fri, 12 Mar 2010 18:59:02 +0000 (21:59 +0300)
committerMaxim Shafirov <max@jetbrains.com>
Fri, 12 Mar 2010 19:18:44 +0000 (22:18 +0300)
platform/lang-impl/src/com/intellij/codeInspection/ex/DescriptorProviderInspection.java
platform/util/src/com/intellij/openapi/util/text/StringUtil.java

index e894b14d3d2bec90c8c817499b4e666c0c16d661..b56965123654c0024960c0d78a68d439f3a5d64e 100644 (file)
@@ -26,6 +26,7 @@ import com.intellij.openapi.components.PathMacroManager;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.util.Comparing;
 import com.intellij.openapi.util.JDOMUtil;
+import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vcs.FileStatus;
 import com.intellij.psi.PsiElement;
 import com.intellij.util.ArrayUtil;
@@ -39,7 +40,6 @@ import org.jetbrains.annotations.Nullable;
 
 import java.io.*;
 import java.util.*;
-import java.util.regex.Matcher;
 
 /**
  * @author max
@@ -263,7 +263,7 @@ public abstract class DescriptorProviderInspection extends InspectionTool implem
       @NonNls final String template = description.getDescriptionTemplate();
       int line = description instanceof ProblemDescriptor ? ((ProblemDescriptor)description).getLineNumber() : -1;
       final String text = description instanceof ProblemDescriptor ? ((ProblemDescriptor)description).getPsiElement().getText() : "";
-      @NonNls String problemText = template.replaceAll("#ref", Matcher.quoteReplacement(text)).replaceAll(" #loc ", " ");
+      @NonNls String problemText = StringUtil.replace(StringUtil.replace(template, "#ref", StringUtil.quoteReplacement(text)), " #loc ", " ");
 
       Element element = refEntity.getRefManager().export(refEntity, parentNode, line);
       @NonNls Element problemClassElement = new Element(InspectionsBundle.message("inspection.export.results.problem.element.tag"));
index c6c97d59bc19ff0d4358be5c0741f4886e5fecf2..c5f438560ed2a281807a8961f44b89646430629a 100644 (file)
@@ -17,7 +17,6 @@ package com.intellij.openapi.util.text;
 
 import com.intellij.CommonBundle;
 import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.util.Comparing;
 import com.intellij.openapi.util.TextRange;
 import com.intellij.util.ArrayUtil;
 import com.intellij.util.Function;
@@ -39,6 +38,9 @@ public class StringUtil {
   private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.util.text.StringUtil");
   @NonNls private static final String VOWELS = "aeiouy";
 
+  private StringUtil() {
+  }
+
   public static String replace(@NonNls @NotNull String text, @NonNls @NotNull String oldS, @NonNls @Nullable String newS) {
     return replace(text, oldS, newS, false);
   }
@@ -488,6 +490,40 @@ public class StringUtil {
     return s.substring(1, s.length() - 1);
   }
 
+  /**
+   * This is just an optimized version of Matcher.quoteReplacement
+   */
+  public static String quoteReplacement(String s) {
+    boolean needReplacements = false;
+
+    for (int i = 0; i < s.length(); i++) {
+      char c = s.charAt(i);
+      if (c == '\\' || c == '$') {
+        needReplacements = true;
+        break;
+      }
+    }
+
+    if (!needReplacements) return s;
+
+    StringBuilder sb = new StringBuilder(s.length() * 6 / 5);
+    for (int i = 0; i < s.length(); i++) {
+      char c = s.charAt(i);
+      if (c == '\\') {
+        sb.append('\\');
+        sb.append('\\');
+      }
+      else if (c == '$') {
+        sb.append('\\');
+        sb.append('$');
+      }
+      else {
+        sb.append(c);
+      }
+    }
+    return sb.toString();
+  }
+
   private static void unescapeStringCharacters(int length, @NotNull String s, @NotNull StringBuilder buffer) {
     boolean escaped = false;
     for (int idx = 0; idx < length; idx++) {