diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/BasicSearchTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/BasicSearchTest.java index c0d84fb1f13..55812e5eb33 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/BasicSearchTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/search/BasicSearchTest.java @@ -379,4 +379,14 @@ public class BasicSearchTest extends BaseUITestCase { query= makeProjectQuery("f"); assertOccurrences(query, 6); } + + // struct S { + // bool operator<(const S&, const S&); + // }; + + // // empty + public void testOverloadedOperatorNoSpace_408870() throws Exception { + CSearchQuery query = makeProjectQuery("operator<"); + assertOccurrences(query, 1); + } } diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/opentype/ElementSelectionDialog.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/opentype/ElementSelectionDialog.java index 893d9cfb11d..ba6b04b6ac3 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/opentype/ElementSelectionDialog.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/opentype/ElementSelectionDialog.java @@ -54,6 +54,7 @@ import org.eclipse.cdt.ui.browser.typeinfo.TypeSelectionDialog; import org.eclipse.cdt.internal.core.browser.IndexModelUtil; import org.eclipse.cdt.internal.ui.ICHelpContextIds; +import org.eclipse.cdt.internal.ui.search.CSearchUtil; /** * A dialog to select an element from a filterable list of elements. @@ -349,6 +350,7 @@ public class ElementSelectionDialog extends TypeSelectionDialog { } protected void scheduleUpdate(String filterText) { + filterText= CSearchUtil.adjustSearchStringForOperators(filterText); char[] newPrefix= toPrefix(filterText); final char[] currentPrefix= fUpdateJob.getCurrentPrefix(); final boolean equivalentPrefix= isEquivalentPrefix(currentPrefix, newPrefix); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchPage.java index 3191200469c..f50c53cdcdc 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchPage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchPage.java @@ -439,7 +439,7 @@ public class CSearchPage extends DialogPage implements ISearchPage { final String text = patternCombo.getText(); final char[] newChars= event.text.toCharArray(); final StringBuilder result= new StringBuilder(newChars.length); - boolean relax= prefix(text, event.start, result).contains(Keywords.OPERATOR + " "); //$NON-NLS-1$ + boolean relax= prefix(text, event.start, result).contains(Keywords.OPERATOR); for (final char c : newChars) { switch (c) { case '_': @@ -459,7 +459,6 @@ public class CSearchPage extends DialogPage implements ISearchPage { case '%': case '^': case '(': case ')': case '[': case ']': if (prefix(text, event.start, result).endsWith(Keywords.OPERATOR)) { - result.append(' '); relax= true; } if (relax) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchPatternQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchPatternQuery.java index 6ae17d19ab7..fd2a6a95a32 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchPatternQuery.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchPatternQuery.java @@ -74,6 +74,9 @@ public class CSearchPatternQuery extends CSearchQuery { int flags) throws PatternSyntaxException { super(scope, flags); this.scopeDesc = scopeDesc; + + // adjust the pattern string to accomodate searches for operators + patternStr = CSearchUtil.adjustSearchStringForOperators(patternStr); // remove spurious whitespace, which will make the search fail 100% of the time this.patternStr = patternStr.trim(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchUtil.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchUtil.java index 0995da90ff2..65d016b135b 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchUtil.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchUtil.java @@ -66,4 +66,36 @@ public class CSearchUtil { } return isWrite; } + + + /** + * Returns true whether 'ch' could the first character of an overloadable C++ operator. + */ + private static boolean isOperatorChar(char ch) { + switch (ch) { + case '&': case '|': case '+': case '-': + case '!': case '=': case '>': case '<': + case '%': case '^': case '(': case ')': + case '[': case '~': + return true; + default: + return false; + } + } + + /** + * If 'searchStr' contains the name of an overloadable operator with no + * space between 'operator' and the operator (e.g. 'operator<'), insert + * a space (yielding e.g. 'operator <'). This is necessary because the + * binding names for overloaded operators in the index contain such a + * space, and the search wouldn't find them otherwise. + */ + public static String adjustSearchStringForOperators(String searchStr) { + int operatorIndex = searchStr.indexOf("operator"); //$NON-NLS-1$ + int operatorCharIndex = operatorIndex + 8; // "operator" is 8 characters + if (operatorCharIndex < searchStr.length() && isOperatorChar(searchStr.charAt(operatorCharIndex))) { + searchStr = searchStr.substring(0, operatorCharIndex) + ' ' + searchStr.substring(operatorCharIndex); + } + return searchStr; + } }