From c507baf019adbab8e004e20e82fbb193700ae385 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Fri, 17 Apr 2009 13:43:09 +0000 Subject: [PATCH] Optimizes C/C++ search without wild-cards, bug 272688 --- .../eclipse/cdt/internal/core/pdom/PDOM.java | 47 +++++++++++++++++++ .../internal/ui/search/PDOMSearchPage.java | 27 +++++++++-- .../ui/search/PDOMSearchPatternQuery.java | 3 +- 3 files changed, 70 insertions(+), 7 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 4ee586d826c..9ab95d1aecc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -515,6 +515,21 @@ public class PDOM extends PlatformObject implements IPDOM { if (monitor == null) { monitor= new NullProgressMonitor(); } + // check for some easy cases + char[][] simpleNames= extractSimpleNames(pattern); + if (simpleNames != null) { + if (simpleNames.length == 1) { + return findBindings(simpleNames[0], isFullyQualified, filter, monitor); + } else if (isFullyQualified) { + return findBindings(simpleNames, filter, monitor); + } + } + + char[] prefix= extractPrefix(pattern); + if (prefix != null) { + return findBindingsForPrefix(prefix, isFullyQualified, filter, monitor); + } + BindingFinder finder = new BindingFinder(pattern, isFullyQualified, filter, monitor); for (PDOMLinkage linkage : getLinkageList()) { if (filter.acceptLinkage(linkage)) { @@ -531,6 +546,38 @@ public class PDOM extends PlatformObject implements IPDOM { return finder.getBindings(); } + private char[][] extractSimpleNames(Pattern[] pattern) { + char[][] result= new char[pattern.length][]; + int i= 0; + for (Pattern p : pattern) { + char[] input= p.pattern().toCharArray(); + for (char c : input) { + if (!Character.isLetterOrDigit(c) && c != '_') { + return null; + } + } + result[i++]= input; + } + return result; + } + + private char[] extractPrefix(Pattern[] pattern) { + if (pattern.length != 1) + return null; + + String p= pattern[0].pattern(); + if (p.endsWith(".*")) { //$NON-NLS-1$ + char[] input= p.substring(0, p.length()-2).toCharArray(); + for (char c : input) { + if (!Character.isLetterOrDigit(c) && c != '_') { + return null; + } + } + return input; + } + return null; + } + public IIndexFragmentBinding[] findMacroContainers(Pattern pattern, IndexFilter filter, IProgressMonitor monitor) throws CoreException { if (monitor == null) { monitor= new NullProgressMonitor(); 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 3248f64ac9c..7142bcf8f83 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2008 QNX Software Systems and others. + * Copyright (c) 2006, 2009 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -34,6 +34,8 @@ import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.VerifyEvent; +import org.eclipse.swt.events.VerifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; @@ -340,10 +342,25 @@ public class PDOMSearchPage extends DialogPage implements ISearchPage { // Pattern combo patternCombo = new Combo( result, SWT.SINGLE | SWT.BORDER ); - patternCombo.addSelectionListener( new SelectionAdapter() { - @Override - public void widgetSelected( SelectionEvent e ) { - //handlePatternSelected(); + patternCombo.addVerifyListener(new VerifyListener() { + public void verifyText(VerifyEvent e) { + char[] chars= e.text.toCharArray(); + StringBuilder result= new StringBuilder(chars.length); + for (char c : chars) { + switch (c) { + case '_': + case ':': // scope operator + case '?': case '*': // wild cards + result.append(c); + break; + default: + if (Character.isLetterOrDigit(c)) { + result.append(c); + } + break; + } + e.text= result.toString(); + } } }); 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 2d530d0a924..2346b0fb14c 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2008 QNX Software Systems and others. + * Copyright (c) 2006, 2009 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -96,7 +96,6 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery { case '?': buff.append('.'); break; - case '.': case ':': if (buff.length() > 0) { if (isCaseSensitive)