From 1cf5491c651d7a0c03c442a2c0cd47156d2809be Mon Sep 17 00:00:00 2001
From: Markus Schorn
Date: Wed, 18 Nov 2009 08:32:07 +0000
Subject: [PATCH] C/C++ search for operators, bug 295150.
---
.../internal/ui/search/PDOMSearchPage.java | 32 ++++++++++++++++++-
.../ui/search/PDOMSearchPatternQuery.java | 22 ++++++++++++-
.../concepts/cdt_c_search.htm | 6 +++-
3 files changed, 57 insertions(+), 3 deletions(-)
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPage.java
index 7142bcf8f83..1610f90bc98 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPage.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPage.java
@@ -57,6 +57,7 @@ import org.eclipse.ui.PlatformUI;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.parser.Keywords;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
@@ -344,15 +345,37 @@ public class PDOMSearchPage extends DialogPage implements ISearchPage {
patternCombo = new Combo( result, SWT.SINGLE | SWT.BORDER );
patternCombo.addVerifyListener(new VerifyListener() {
public void verifyText(VerifyEvent e) {
+ final String text = patternCombo.getText();
+ boolean relax= text.contains(Keywords.OPERATOR + " "); //$NON-NLS-1$
char[] chars= e.text.toCharArray();
StringBuilder result= new StringBuilder(chars.length);
- for (char c : chars) {
+ for (int i = 0; i < chars.length; i++) {
+ final char c = chars[i];
switch (c) {
case '_':
case ':': // scope operator
case '?': case '*': // wild cards
+ case '\\': // escaping wild-cards
result.append(c);
break;
+ case ' ':
+ if (prefix(text, e, e.start+i).endsWith(Keywords.OPERATOR)) {
+ relax= true;
+ result.append(c);
+ }
+ break;
+ case '&': case '|': case '+': case '-':
+ case '!': case '=': case '>': case '<':
+ case '%': case '^': case '(': case ')':
+ case '[': case ']':
+ if (prefix(text, e, e.start+i).endsWith(Keywords.OPERATOR)) {
+ result.append(' ');
+ relax= true;
+ }
+ if (relax)
+ result.append(c);
+ break;
+ case '~':
default:
if (Character.isLetterOrDigit(c)) {
result.append(c);
@@ -362,6 +385,13 @@ public class PDOMSearchPage extends DialogPage implements ISearchPage {
e.text= result.toString();
}
}
+
+ private String prefix(String text, VerifyEvent e, int length) {
+ StringBuilder result= new StringBuilder(length);
+ result.append(text, 0, e.start);
+ result.append(e.text, 0, length-e.start);
+ return result.toString();
+ }
});
patternCombo.addModifyListener( new ModifyListener() {
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPatternQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPatternQuery.java
index 00402c34894..4cbe2ae5e09 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPatternQuery.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchPatternQuery.java
@@ -23,6 +23,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
+import org.eclipse.osgi.util.NLS;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
@@ -89,6 +90,22 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery {
for (int i = 0; i < n; ++i) {
char c = patternStr.charAt(i);
switch (c) {
+ case '\\':
+ if (i+1 < n) {
+ switch(patternStr.charAt(i+1)) {
+ case '?':
+ buff.append("\\?"); //$NON-NLS-1$
+ break;
+ case '*':
+ buff.append("\\*"); //$NON-NLS-1$
+ break;
+ default:
+ buff.append('\\');
+ }
+ } else {
+ buff.append('\\');
+ }
+ break;
case '*':
buff.append(".*"); //$NON-NLS-1$
break;
@@ -104,6 +121,9 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery {
buff = new StringBuffer();
}
break;
+ case '|': case '+': case '^': case '(': case ')': case '[': case ']':
+ buff.append('\\').append(c);
+ break;
default:
buff.append(c);
}
@@ -186,7 +206,7 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery {
@Override
public String getResultLabel(int numMatches) {
- String patternInScope = CSearchMessages.bind(
+ String patternInScope = NLS.bind(
CSearchMessages.PDOMSearchPatternQuery_PatternQuery_labelPatternInScope, patternStr, scopeDesc);
return getResultLabel(patternInScope, numMatches);
}
diff --git a/doc/org.eclipse.cdt.doc.user/concepts/cdt_c_search.htm b/doc/org.eclipse.cdt.doc.user/concepts/cdt_c_search.htm
index 1d279efece2..ccbfafd1ca7 100644
--- a/doc/org.eclipse.cdt.doc.user/concepts/cdt_c_search.htm
+++ b/doc/org.eclipse.cdt.doc.user/concepts/cdt_c_search.htm
@@ -125,7 +125,7 @@ is to be searched:
| * |
Any string Tip:
- Use the character * to search for
+ Use the character sequence \* to search for
operators that begin with *. See syntax examples in the table below. |
@@ -137,11 +137,13 @@ is to be searched:
| Nested elements |
+
Syntax examples
The table below provides syntax examples and an explanation for each example
to help you conduct an effective search.
@@ -163,6 +165,7 @@ to help you conduct an effective search.
::A |
Searches for A not nested in anything |
+
| operator \* |
Finds only operator * |