Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Kubitz2021-09-09 06:56:59 +0000
committerLars Vogel2021-09-10 16:54:48 +0000
commite5b5814ba9b6f497470b731ddb919224046d6d1a (patch)
tree19b09281946cd722a089aad8792ff4de5e7a6bb6 /org.eclipse.search/search/org/eclipse/search
parent9f8c0aa760f5576ee96a78f0675c56e1a37a6d62 (diff)
downloadeclipse.platform.text-e5b5814ba9b6f497470b731ddb919224046d6d1a.tar.gz
eclipse.platform.text-e5b5814ba9b6f497470b731ddb919224046d6d1a.tar.xz
eclipse.platform.text-e5b5814ba9b6f497470b731ddb919224046d6d1a.zip
Bug 575893 - [performance] improve file search: non-regexpI20210911-1800I20210910-1800
Use Pattern.quote for non-wildcards in non-regexp search instead of escaping each single character. Change-Id: I061506448cdde5ab17ad1b9c551111472acf47eb Signed-off-by: Joerg Kubitz <jkubitz-eclipse@gmx.de> Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.text/+/185193 Tested-by: Platform Bot <platform-bot@eclipse.org> Reviewed-by: Lars Vogel <Lars.Vogel@vogella.com>
Diffstat (limited to 'org.eclipse.search/search/org/eclipse/search')
-rw-r--r--org.eclipse.search/search/org/eclipse/search/internal/core/text/PatternConstructor.java57
1 files changed, 27 insertions, 30 deletions
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/core/text/PatternConstructor.java b/org.eclipse.search/search/org/eclipse/search/internal/core/text/PatternConstructor.java
index b785782b8da..287fb18d688 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/core/text/PatternConstructor.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/core/text/PatternConstructor.java
@@ -66,7 +66,7 @@ public class PatternConstructor {
if (isWholeWord && len > 0 && isWordChar(pattern.charAt(len - 1))) {
buffer.append("\\b"); //$NON-NLS-1$
}
- pattern= buffer.toString();
+ pattern= buffer.toString();
}
int regexOptions= Pattern.MULTILINE;
@@ -183,6 +183,12 @@ public class PatternConstructor {
public static StringBuilder appendAsRegEx(boolean isStringMatcher, String pattern, StringBuilder buffer) {
+ if (!isStringMatcher) {
+ buffer.append(Pattern.quote(pattern));
+ return buffer;
+ }
+ // isStringMatcher: '*' and '?' wildcards and '\' as escape
+ StringBuilder quoted = new StringBuilder();
boolean isEscaped= false;
for (int i = 0; i < pattern.length(); i++) {
char c = pattern.charAt(i);
@@ -190,59 +196,46 @@ public class PatternConstructor {
// the backslash
case '\\':
// the backslash is escape char in string matcher
- if (isStringMatcher && !isEscaped) {
+ if (!isEscaped) {
isEscaped= true;
}
else {
- buffer.append("\\\\"); //$NON-NLS-1$
- isEscaped= false;
- }
- break;
- // characters that need to be escaped in the regex.
- case '(':
- case ')':
- case '{':
- case '}':
- case '.':
- case '[':
- case ']':
- case '$':
- case '^':
- case '+':
- case '|':
- if (isEscaped) {
- buffer.append("\\\\"); //$NON-NLS-1$
+ quoted.append(c);
isEscaped= false;
}
- buffer.append('\\');
- buffer.append(c);
break;
case '?':
- if (isStringMatcher && !isEscaped) {
+ if (!isEscaped) {
+ if (quoted.length() > 0) { // flush quote
+ buffer.append(Pattern.quote(quoted.toString()));
+ quoted = new StringBuilder();
+ }
buffer.append('.');
}
else {
- buffer.append('\\');
- buffer.append(c);
+ quoted.append(c);
isEscaped= false;
}
break;
case '*':
- if (isStringMatcher && !isEscaped) {
+ if (!isEscaped) {
+ if (quoted.length() > 0) { // flush quote
+ buffer.append(Pattern.quote(quoted.toString()));
+ quoted = new StringBuilder();
+ }
buffer.append(".*"); //$NON-NLS-1$
}
else {
- buffer.append('\\');
- buffer.append(c);
+ quoted.append(c);
isEscaped= false;
}
break;
default:
if (isEscaped) {
- buffer.append("\\\\"); //$NON-NLS-1$
+ quoted.append("\\"); //$NON-NLS-1$
isEscaped= false;
}
- buffer.append(c);
+ quoted.append(c);
break;
}
}
@@ -250,6 +243,10 @@ public class PatternConstructor {
buffer.append("\\\\"); //$NON-NLS-1$
isEscaped= false;
}
+ if (quoted.length() > 0) { // flush quote
+ buffer.append(Pattern.quote(quoted.toString()));
+ quoted = new StringBuilder();
+ }
return buffer;
}

Back to the top