From 295e397a5a31a509addf5a86f2f49babcee16b42 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Tue, 28 Jun 2005 20:35:54 +0000 Subject: [PATCH] Patch for Devin Steffler. Fixed Bug 101287 'find decl/defn' navigation not working using ctags indexer & no ScannerInfo --- .../cdt/core/search/DOMSearchUtil.java | 24 +++++++ .../core/search/matching/CSearchPattern.java | 9 +++ .../CPPSelectionTestsCTagsIndexer.java | 24 ++++++- .../CPPSelectionTestsDOMIndexer.java | 24 +++++++ .../CSelectionTestsCTagsIndexer.java | 22 ++++++- .../CSelectionTestsDOMIndexer.java | 27 +++++++- .../ui/search/actions/FindAction.java | 65 ++++++++++--------- .../actions/OpenDeclarationsAction.java | 23 ++++++- .../search/actions/OpenDefinitionAction.java | 23 ++++++- 9 files changed, 202 insertions(+), 39 deletions(-) diff --git a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/core/search/DOMSearchUtil.java b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/core/search/DOMSearchUtil.java index 204293cf8c2..89213b36f13 100644 --- a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/core/search/DOMSearchUtil.java +++ b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/core/search/DOMSearchUtil.java @@ -93,6 +93,30 @@ public class DOMSearchUtil { return results.getSearchResults(); } + + /** + * This is a convenience method that uses the SearchEngine to find everything in the index + * that matches to a String. + * + * @param scope the scope to search within the index + * @param searchPattern the string used to search the index with + * @return + */ + public static Set getMatchesFromSearchEngine(ICSearchScope scope, String searchPattern, LimitTo limitTo) { + SearchEngine engine = new SearchEngine(); + BasicSearchResultCollector results = new BasicSearchResultCollector(); + + ICSearchPattern pattern = SearchEngine.createSearchPattern( searchPattern, ICSearchConstants.UNKNOWN_SEARCH_FOR, limitTo, true ); + + try { + engine.setWaitingPolicy(ICSearchConstants.FORCE_IMMEDIATE_SEARCH); + engine.search(CCorePlugin.getWorkspace(), pattern, scope, results, false); + } catch (InterruptedException e) { + return EMPTY_MATCHES; + } + + return results.getSearchResults(); + } private static CSearchPattern createPattern( IASTName searchName, LimitTo limitTo, boolean caseSensitive) { IBinding binding = searchName.resolveBinding(); diff --git a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java index b0ed2d22093..ffd6df27efd 100644 --- a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java +++ b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java @@ -43,6 +43,7 @@ import org.eclipse.cdt.core.search.IMatchLocatable; import org.eclipse.cdt.core.search.LineLocatable; import org.eclipse.cdt.core.search.OffsetLocatable; import org.eclipse.cdt.core.search.OrPattern; +import org.eclipse.cdt.core.search.SearchEngine; import org.eclipse.cdt.internal.core.CharOperation; import org.eclipse.cdt.internal.core.dom.parser.ISourceCodeParser; import org.eclipse.cdt.internal.core.dom.parser.c.ANSICParserExtensionConfiguration; @@ -75,6 +76,8 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte public static final int ACCURATE_MATCH = 2; public static final int INACCURATE_MATCH = 3; + private static SearchFor[] fSearchForValues = { CLASS_STRUCT, FUNCTION, VAR, UNION, METHOD, FIELD, ENUM, ENUMTOR, NAMESPACE }; + protected static class Requestor extends NullSourceElementRequestor { public int badCharacterOffset = -1; @@ -141,6 +144,12 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte pattern = createMacroPattern( patternString, limitTo, matchMode, caseSensitive ); } else if ( searchFor == INCLUDE){ pattern = createIncludePattern( patternString, limitTo, matchMode, caseSensitive); + } else if ( searchFor == UNKNOWN_SEARCH_FOR ) { + OrPattern orPattern = new OrPattern(); + for( int i=0; i 1) { // too many names selected + operationNotAvailable(CSEARCH_OPERATION_TOO_MANY_NAMES_MESSAGE); + return; + } + + foundName = (IASTName)names.get(0); } - - foundNode.accept( collector ); - - List names = null; - if (collector instanceof DOMSearchUtil.CPPNameCollector) { - names = ((DOMSearchUtil.CPPNameCollector)collector).nameList; - } else { - names = ((DOMSearchUtil.CNameCollector)collector).nameList; - } - - if (names.size() == 1) { // just right - clearStatusLine(); - } else if (names.size() == 0) { // no names selected - operationNotAvailable(CSEARCH_OPERATION_NO_NAMES_SELECTED_MESSAGE); - return; - } else if (names.size() > 1) { // too many names selected - operationNotAvailable(CSEARCH_OPERATION_TOO_MANY_NAMES_MESSAGE); - return; - } - - foundName = (IASTName)names.get(0); } LimitTo limitTo = getLimitTo(); @@ -223,7 +228,7 @@ public abstract class FindAction extends SelectionParseAction { if (searchScope == null) return; - CSearchQuery job = FindAction.createSearchQueryForName(foundName, limitTo, searchScope); + CSearchQuery job = createSearchQueryForName(foundName, limitTo, searchScope, selNode.selText); if (job == null) return; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsAction.java index 1c183ae7f45..bac7685c79c 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsAction.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsAction.java @@ -185,8 +185,27 @@ public class OpenDeclarationsAction extends SelectionParseAction implements IUpd } } } else if (selectedNames.length == 0){ - operationNotAvailable(CSEARCH_OPERATION_NO_NAMES_SELECTED_MESSAGE); - return; + // last try: search the index for the selected string, even if no name was found for that selection + ICElement[] scope = new ICElement[1]; + scope[0] = project; + Set matches = DOMSearchUtil.getMatchesFromSearchEngine( SearchEngine.createCSearchScope(scope), selNode.selText, ICSearchConstants.DECLARATIONS_DEFINITIONS ); + + if (matches != null && matches.size() > 0) { + Iterator itr = matches.iterator(); + while(itr.hasNext()) { + Object match = itr.next(); + if (match instanceof IMatch) { + IMatch theMatch = (IMatch)match; + storage.setFileName(theMatch.getLocation().toOSString()); + storage.setLocatable(theMatch.getLocatable()); + storage.setResource(ParserUtil.getResourceForFilename(theMatch.getLocation().toOSString())); + break; + } + } + } else { + operationNotAvailable(CSEARCH_OPERATION_NO_DECLARATION_MESSAGE); + return; + } } else { operationNotAvailable(CSEARCH_OPERATION_TOO_MANY_NAMES_MESSAGE); return; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDefinitionAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDefinitionAction.java index 4029e659b55..5b8ecdf7376 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDefinitionAction.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDefinitionAction.java @@ -199,8 +199,27 @@ public class OpenDefinitionAction extends SelectionParseAction implements } } } else if (selectedNames.length == 0){ - operationNotAvailable(CSEARCH_OPERATION_NO_NAMES_SELECTED_MESSAGE); - return; + // last try: search the index for the selected string, even if no name was found for that selection + ICElement[] scope = new ICElement[1]; + scope[0] = project; + Set matches = DOMSearchUtil.getMatchesFromSearchEngine( SearchEngine.createCSearchScope(scope), selNode.selText, ICSearchConstants.DEFINITIONS ); + + if (matches != null && matches.size() > 0) { + Iterator itr = matches.iterator(); + while(itr.hasNext()) { + Object match = itr.next(); + if (match instanceof IMatch) { + IMatch theMatch = (IMatch)match; + storage.setFileName(theMatch.getLocation().toOSString()); + storage.setLocatable(theMatch.getLocatable()); + storage.setResource(ParserUtil.getResourceForFilename(theMatch.getLocation().toOSString())); + break; + } + } + } else { + operationNotAvailable(CSEARCH_OPERATION_NO_DEFINITION_MESSAGE); + return; + } } else { operationNotAvailable(CSEARCH_OPERATION_TOO_MANY_NAMES_MESSAGE); return;