1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-09 17:25:38 +02:00

C/C++ search for operators, bug 295150.

This commit is contained in:
Markus Schorn 2009-11-18 08:32:07 +00:00
parent d8117374fc
commit 1cf5491c65
3 changed files with 57 additions and 3 deletions

View file

@ -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() {

View file

@ -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);
}

View file

@ -125,7 +125,7 @@ is to be searched:</p>
<tr>
<td width="49%">&nbsp;<samp>*</samp></td>
<td width="51%">Any string<p><b>Tip:<br>
</b> Use the character <samp>*</samp> to search for
</b> Use the character sequence <samp>\*</samp> to search for
operators that begin with *. See syntax examples in the table below.</td>
</tr>
<tr>
@ -137,11 +137,13 @@ is to be searched:</p>
<td width="51%">Nested elements</td>
</tr>
</table>
<!-- no support for function parameters
<p><b>Tip: </b>Do not use wild cards between the brackets of a function or
method pattern. For example, the search
string <samp>f( * )</samp> is an invalid search that results in a search for any function <samp>f</samp>
because
the asterisk is interpreted as a pointer rather than a wild card.</p>
-->
<h2>Syntax examples</h2>
<p>The table below provides syntax examples and an explanation for each example
to help you conduct an effective search.</p>
@ -163,6 +165,7 @@ to help you conduct an effective search.</p>
<td width="64%" height="32">&nbsp; <samp>::A</samp> </td>
<td width="36%" height="32">Searches for A not nested in anything</td>
</tr>
<!-- no support for function parameters
<tr>
<td width="64%" height="17">&nbsp; <samp>*()</samp></td>
<td width="36%" height="17">Any function taking no parameters</td>
@ -183,6 +186,7 @@ to help you conduct an effective search.</p>
<td width="36%" height="64">Will search for a function f, taking 2 parameters; one is a
const char array, the other is a reference to type A</td>
</tr>
-->
<tr>
<td width="64%" height="32">&nbsp;<samp>operator \*</samp></td>
<td width="36%" height="32">Finds only operator *</td>