From 1558c3a6e8f303528501301d63276043cb54edf9 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 21 Oct 2009 14:55:21 +0000 Subject: [PATCH] Proper template support in search for references, bug 268726. --- .../ui/callhierarchy/CHHistoryAction.java | 1 + .../internal/ui/callhierarchy/CHQueries.java | 47 +----------- .../internal/ui/callhierarchy/CHViewPart.java | 13 ---- .../ui/search/PDOMSearchElementQuery.java | 8 +- .../internal/ui/search/PDOMSearchQuery.java | 73 ++++++++++++++----- .../search/PDOMSearchTextSelectionQuery.java | 29 ++++++-- .../cdt/internal/ui/viewsupport/IndexUI.java | 73 +++++++++++++++---- 7 files changed, 143 insertions(+), 101 deletions(-) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHHistoryAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHHistoryAction.java index cbb6e579369..1f098043ab0 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHHistoryAction.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHHistoryAction.java @@ -27,6 +27,7 @@ public class CHHistoryAction extends Action { final static int LABEL_OPTIONS= CElementBaseLabels.M_PARAMETER_TYPES | CElementBaseLabels.ALL_FULLY_QUALIFIED | + CElementBaseLabels.TEMPLATE_ARGUMENTS | CElementBaseLabels.MF_POST_FILE_QUALIFIED; private CHViewPart fViewPart; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHQueries.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHQueries.java index 33976ada495..456d3d46f85 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHQueries.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHQueries.java @@ -12,7 +12,6 @@ package org.eclipse.cdt.internal.ui.callhierarchy; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import org.eclipse.core.runtime.CoreException; @@ -22,19 +21,15 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexName; -import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ISourceReference; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; import org.eclipse.cdt.internal.core.model.ext.ICElementHandle; import org.eclipse.cdt.internal.ui.viewsupport.IndexUI; @@ -98,52 +93,12 @@ public class CHQueries { private static void findCalledBy1(IIndex index, IBinding callee, boolean includeOrdinaryCalls, ICProject project, CalledByResult result) throws CoreException { findCalledBy2(index, callee, includeOrdinaryCalls, project, result); - List specializations = findSpecializations(callee); + List specializations = IndexUI.findSpecializations(callee); for (IBinding spec : specializations) { findCalledBy2(index, spec, includeOrdinaryCalls, project, result); } } - private static List findSpecializations(IBinding callee) throws CoreException { - try { - List result= null; - - IBinding owner = callee.getOwner(); - if (owner != null) { - List specializedOwners= findSpecializations(owner); - if (!specializedOwners.isEmpty()) { - result= new ArrayList(specializedOwners.size()); - - for (IBinding specOwner : specializedOwners) { - if (specOwner instanceof ICPPClassSpecialization) { - result.add(((ICPPClassSpecialization) specOwner).specializeMember(callee)); - } - } - } - } - - if (callee instanceof ICPPInstanceCache) { - final List instances= Arrays.asList(((ICPPInstanceCache) callee).getAllInstances()); - if (!instances.isEmpty()) { - if (result == null) - result= new ArrayList(instances.size()); - - - for (ICPPTemplateInstance inst : instances) { - if (!IndexFilter.ALL_DECLARED.acceptBinding(inst)) { - result.add(inst); - } - } - } - } - - if (result != null) { - return result; - } - } catch (DOMException e) { - } - return Collections.emptyList(); - } private static void findCalledBy2(IIndex index, IBinding callee, boolean includeOrdinaryCalls, ICProject project, CalledByResult result) throws CoreException { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHViewPart.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHViewPart.java index 667c412d049..90ea0265827 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHViewPart.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/callhierarchy/CHViewPart.java @@ -92,7 +92,6 @@ public class CHViewPart extends ViewPart { private static final String TRUE = String.valueOf(true); private static final String KEY_WORKING_SET_FILTER = "workingSetFilter"; //$NON-NLS-1$ private static final String KEY_FILTER_VARIABLES = "variableFilter"; //$NON-NLS-1$ -// private static final String KEY_FILTER_MACROS = "macroFilter"; //$NON-NLS-1$ private static final String KEY_SHOW_FILES= "showFilesInLabels"; //$NON-NLS-1$ private IMemento fMemento; @@ -114,7 +113,6 @@ public class CHViewPart extends ViewPart { // filters, sorter private ViewerFilter fVariableFilter; -// private ViewerFilter fMacroFilter; private ViewerComparator fSorterAlphaNumeric; private ViewerComparator fSorterReferencePosition; private WorkingSetFilterUI fWorkingSetFilterUI; @@ -123,7 +121,6 @@ public class CHViewPart extends ViewPart { private Action fReferencedByAction; private Action fMakesReferenceToAction; private Action fFilterVariablesAction; -// private Action fFilterMacrosAction; private Action fShowFilesInLabelsAction; private Action fNextAction; private Action fPreviousAction; @@ -252,12 +249,10 @@ public class CHViewPart extends ViewPart { private void initializeActionStates() { boolean referencedBy= true; boolean filterVariables= false; -// boolean filterMacros= false; boolean showFiles= false; if (fMemento != null) { filterVariables= TRUE.equals(fMemento.getString(KEY_FILTER_VARIABLES)); -// filterMacros= TRUE.equals(fMemento.getString(KEY_FILTER_MACROS)); showFiles= TRUE.equals(fMemento.getString(KEY_SHOW_FILES)); } @@ -268,8 +263,6 @@ public class CHViewPart extends ViewPart { fMakesReferenceToAction.setChecked(!referencedBy); fContentProvider.setComputeReferencedBy(referencedBy); -// fFilterMacrosAction.setChecked(filterMacros); -// fFilterMacrosAction.run(); fFilterVariablesAction.setChecked(filterVariables); fFilterVariablesAction.run(); updateSorter(); @@ -287,7 +280,6 @@ public class CHViewPart extends ViewPart { if (fWorkingSetFilterUI != null) { fWorkingSetFilterUI.saveState(memento, KEY_WORKING_SET_FILTER); } -// memento.putString(KEY_FILTER_MACROS, String.valueOf(fFilterMacrosAction.isChecked())); memento.putString(KEY_FILTER_VARIABLES, String.valueOf(fFilterVariablesAction.isChecked())); memento.putString(KEY_SHOW_FILES, String.valueOf(fShowFilesInLabelsAction.isChecked())); super.saveState(memento); @@ -507,7 +499,6 @@ public class CHViewPart extends ViewPart { tm.add(fNextAction); tm.add(fPreviousAction); tm.add(new Separator()); -// tm.add(fFilterMacrosAction); tm.add(fFilterVariablesAction); tm.add(new Separator()); tm.add(fReferencedByAction); @@ -518,16 +509,12 @@ public class CHViewPart extends ViewPart { // local menu IMenuManager mm = actionBars.getMenuManager(); -// tm.add(fNext); -// tm.add(fPrevious); -// tm.add(new Separator()); fWorkingSetFilterUI.fillActionBars(actionBars); mm.add(fReferencedByAction); mm.add(fMakesReferenceToAction); mm.add(new Separator()); mm.add(fShowFilesInLabelsAction); mm.add(new Separator()); -// mm.add(fFilterMacrosAction); mm.add(fFilterVariablesAction); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElementQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElementQuery.java index 4a9254b1117..946acb5d269 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElementQuery.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchElementQuery.java @@ -32,10 +32,13 @@ import org.eclipse.cdt.internal.ui.viewsupport.IndexUI; public class PDOMSearchElementQuery extends PDOMSearchQuery { private ISourceReference element; + private String label; public PDOMSearchElementQuery(ICElement[] scope, ISourceReference element, int flags) { super(scope, flags | IIndex.SEARCH_ACROSS_LANGUAGE_BOUNDARIES); this.element = element; + this.label= (element instanceof ICElement) ? + ((ICElement) element).getElementName() : CSearchMessages.PDOMSearchElementQuery_something; } @Override @@ -44,6 +47,7 @@ public class PDOMSearchElementQuery extends PDOMSearchQuery { if (element instanceof ICElement) { IBinding binding= IndexUI.elementToBinding(index, (ICElement) element); if (binding != null) { + label= labelForBinding(index, binding, label); createMatches(index, binding); } } @@ -55,8 +59,6 @@ public class PDOMSearchElementQuery extends PDOMSearchQuery { @Override public String getResultLabel(int numMatches) { - String pattern = (element instanceof ICElement) ? - ((ICElement) element).getElementName() : CSearchMessages.PDOMSearchElementQuery_something; - return getResultLabel(pattern, numMatches); + return getResultLabel(label, numMatches); } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java index 3d81371c57f..03b03c50969 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchQuery.java @@ -14,9 +14,12 @@ *******************************************************************************/ package org.eclipse.cdt.internal.ui.search; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; @@ -30,6 +33,7 @@ import org.eclipse.core.runtime.Status; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Region; +import org.eclipse.osgi.util.NLS; import org.eclipse.search.ui.ISearchQuery; import org.eclipse.search.ui.ISearchResult; import org.eclipse.ui.IEditorInput; @@ -54,11 +58,13 @@ import org.eclipse.cdt.core.index.IndexLocationFactory; 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.model.util.CElementBaseLabels; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.core.browser.ASTTypeInfo; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; +import org.eclipse.cdt.internal.core.model.ext.ICElementHandle; import org.eclipse.cdt.internal.ui.search.LineSearchElement.Match; import org.eclipse.cdt.internal.ui.util.Messages; @@ -72,6 +78,12 @@ public abstract class PDOMSearchQuery implements ISearchQuery { public static final int FIND_DECLARATIONS_DEFINITIONS = FIND_DECLARATIONS | FIND_DEFINITIONS; public static final int FIND_ALL_OCCURANCES = FIND_DECLARATIONS | FIND_DEFINITIONS | FIND_REFERENCES; + protected final static int LABEL_FLAGS= + CElementBaseLabels.M_PARAMETER_TYPES | + CElementBaseLabels.ALL_FULLY_QUALIFIED | + CElementBaseLabels.TEMPLATE_ARGUMENTS; + + protected PDOMSearchResult result = new PDOMSearchResult(this); protected int flags; @@ -111,6 +123,18 @@ public abstract class PDOMSearchQuery implements ISearchQuery { } } + protected String labelForBinding(final IIndex index, IBinding binding, String defaultLabel) throws CoreException { + IIndexName[] names= index.findNames(binding, IIndex.FIND_DECLARATIONS_DEFINITIONS); + if (names.length > 0) { + ICElementHandle elem= IndexUI.getCElementForName((ICProject) null, index, names[0]); + if (elem != null) { + return CElementBaseLabels.getElementLabel(elem, LABEL_FLAGS); + } + } + return defaultLabel; + } + + public String getLabel() { String type; if ((flags & FIND_REFERENCES) != 0) @@ -128,12 +152,13 @@ public abstract class PDOMSearchQuery implements ISearchQuery { // Report pattern and number of matches String label; if ((flags & FIND_REFERENCES) != 0) - label = CSearchMessages.bind(CSearchMessages.PDOMSearchQuery_refs_result_label, pattern); + label = NLS.bind(CSearchMessages.PDOMSearchQuery_refs_result_label, pattern); else if ((flags & FIND_DECLARATIONS) != 0) - label =CSearchMessages.bind(CSearchMessages.PDOMSearchQuery_decls_result_label, pattern); + label = NLS.bind(CSearchMessages.PDOMSearchQuery_decls_result_label, pattern); else - label = CSearchMessages.bind(CSearchMessages.PDOMSearchQuery_defs_result_label, pattern); - String countLabel = Messages.format(CSearchMessages.CSearchResultCollector_matches, new Integer(matchCount)); + label = NLS.bind(CSearchMessages.PDOMSearchQuery_defs_result_label, pattern); + String countLabel = Messages.format(CSearchMessages.CSearchResultCollector_matches, new Integer( + matchCount)); return label + " " + countLabel; //$NON-NLS-1$ } @@ -159,7 +184,7 @@ public abstract class PDOMSearchQuery implements ISearchQuery { return false; // i.e. keep it } - private void createMatchesFromNames(IIndex index, Map> fileMatches, IIndexName[] names, boolean isPolymorphicOnly) + private void createMatchesFromNames(IIndex index, Map> fileMatches, Collection names, boolean isPolymorphicOnly) throws CoreException { if (names == null) return; @@ -212,7 +237,7 @@ public abstract class PDOMSearchQuery implements ISearchQuery { return matches; } - private void collectNames(IIndex index, IIndexName[] names, IIndexName[] polymorphicNames) throws CoreException { + private void collectNames(IIndex index, Collection names, Collection polymorphicNames) throws CoreException { // group all matched names by files Map> fileMatches = new HashMap>(); createMatchesFromNames(index, fileMatches, names, false); @@ -271,27 +296,30 @@ public abstract class PDOMSearchQuery implements ISearchQuery { protected void createMatches(IIndex index, IBinding[] bindings) throws CoreException { if (bindings == null) return; - IIndexName[] names= null; - IIndexName[] polymorphicNames= null; + List names= new ArrayList(); + List polymorphicNames= null; for (IBinding binding : bindings) { if (binding != null) { - IIndexName[] bindingNames= index.findNames(binding, flags); - if (names == null) { - names = bindingNames; - } else { - names= (IIndexName[]) ArrayUtil.addAll(IIndexName.class, names, bindingNames); - } + createMatches1(index, binding, names); + if ((flags & FIND_REFERENCES) != 0) { + List specializations = IndexUI.findSpecializations(binding); + if (!specializations.isEmpty()) { + for (IBinding spec : specializations) { + createMatches1(index, spec, names); + } + } + if (binding instanceof ICPPMethod) { ICPPMethod m= (ICPPMethod) binding; try { ICPPMethod[] msInBases = ClassTypeHelper.findOverridden(m); - for (ICPPMethod mInBase : msInBases) { - bindingNames= index.findNames(mInBase, FIND_REFERENCES); + if (msInBases.length > 0) { if (polymorphicNames == null) { - polymorphicNames = bindingNames; - } else { - polymorphicNames= (IIndexName[]) ArrayUtil.addAll(IIndexName.class, names, bindingNames); + polymorphicNames= new ArrayList(); + } + for (ICPPMethod mInBase : msInBases) { + createMatches1(index, mInBase, polymorphicNames); } } } catch (DOMException e) { @@ -301,11 +329,16 @@ public abstract class PDOMSearchQuery implements ISearchQuery { } } } - if (names != null) { + if (!names.isEmpty()) { collectNames(index, names, polymorphicNames); } } + private void createMatches1(IIndex index, IBinding binding, List names) throws CoreException { + IIndexName[] bindingNames= index.findNames(binding, flags); + names.addAll(Arrays.asList(bindingNames)); + } + protected void createLocalMatches(IASTTranslationUnit ast, IBinding binding) { if (binding != null) { Set names= new HashSet(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTextSelectionQuery.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTextSelectionQuery.java index d4271762e69..b92fa941e1e 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTextSelectionQuery.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/PDOMSearchTextSelectionQuery.java @@ -25,7 +25,9 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.ITranslationUnit; @@ -38,16 +40,15 @@ import org.eclipse.cdt.internal.ui.editor.ASTProvider; * Query for searching the index based on a text selection. */ public class PDOMSearchTextSelectionQuery extends PDOMSearchQuery { - private ITranslationUnit tu; private ITextSelection selection; - private String searchText; + private String label; public PDOMSearchTextSelectionQuery(ICElement[] scope, ITranslationUnit tu, ITextSelection selection, int flags) { super(scope, flags | IIndex.SEARCH_ACROSS_LANGUAGE_BOUNDARIES); this.tu = tu; this.selection = selection; - this.searchText= selection.getText(); + this.label= selection.getText(); } @Override @@ -57,7 +58,7 @@ public class PDOMSearchTextSelectionQuery extends PDOMSearchQuery { if (ast != null) { IASTName searchName= ast.getNodeSelector(null).findEnclosingName(selection.getOffset(), selection.getLength()); if (searchName != null) { - searchText= searchName.toString(); + label= searchName.toString(); IBinding binding= searchName.resolveBinding(); if (binding instanceof IProblemBinding == false) { if (binding != null) { @@ -72,7 +73,9 @@ public class PDOMSearchTextSelectionQuery extends PDOMSearchQuery { } } binding = index.findBinding(searchName); + binding= findDeclarationForSpecialization(binding); if (binding != null) { + label= labelForBinding(index, binding, label); createMatches(index, binding); return Status.OK_STATUS; } @@ -81,11 +84,27 @@ public class PDOMSearchTextSelectionQuery extends PDOMSearchQuery { } return Status.OK_STATUS; } + + private IBinding findDeclarationForSpecialization(IBinding binding) { + while (binding instanceof ICPPSpecialization) { + try { + if (IndexFilter.ALL_DECLARED.acceptBinding(binding)) + return binding; + } catch (CoreException e) { + } + + IBinding original= ((ICPPSpecialization) binding).getSpecializedBinding(); + if (original == null) + return binding; + binding= original; + } + return binding; + } }); } @Override public String getResultLabel(int numMatches) { - return getResultLabel(searchText, numMatches); + return getResultLabel(label, numMatches); } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/IndexUI.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/IndexUI.java index e7e31dbc85b..d64e606dc72 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/IndexUI.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/IndexUI.java @@ -12,6 +12,9 @@ package org.eclipse.cdt.internal.ui.viewsupport; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import java.util.Properties; import org.eclipse.core.resources.IFile; @@ -51,12 +54,14 @@ import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; @@ -80,6 +85,7 @@ import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.core.dom.parser.ASTQueries; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; import org.eclipse.cdt.internal.core.model.ASTCache.ASTRunnable; import org.eclipse.cdt.internal.core.model.ext.CElementHandleFactory; import org.eclipse.cdt.internal.core.model.ext.ICElementHandle; @@ -108,8 +114,7 @@ public class IndexUI { String name= element.getElementName(); name= name.substring(name.lastIndexOf(':')+1); IIndexBinding[] bindings= index.findBindings(name.toCharArray(), IndexFilter.ALL, new NullProgressMonitor()); - for (int i = 0; i < bindings.length; i++) { - IIndexBinding binding = bindings[i]; + for (IIndexBinding binding : bindings) { if (checkBinding(binding, element)) { return binding; } @@ -187,16 +192,15 @@ public class IndexUI { IIndexFileLocation location= IndexLocationFactory.getIFL(tu); if (location != null) { IIndexFile[] files= index.getFiles(location); - for (int i = 0; i < files.length; i++) { - IIndexFile file = files[i]; + for (IIndexFile file : files) { if (linkageID == -1 || file.getLinkageID() == linkageID) { String elementName= element.getElementName(); int idx= elementName.lastIndexOf(":")+1; //$NON-NLS-1$ ISourceRange pos= sf.getSourceRange(); IRegion region = getConvertedRegion(tu, file, pos.getIdStartPos()+idx, pos.getIdLength()-idx); IIndexName[] names= file.findNames(region.getOffset(), region.getLength()); - for (int j = 0; j < names.length; j++) { - IIndexName name = names[j]; + for (IIndexName name2 : names) { + IIndexName name = name2; if (!name.isReference() && elementName.endsWith(new String(name.getSimpleID()))) { return name; } @@ -240,8 +244,7 @@ public class IndexUI { IIndexFileLocation location= IndexLocationFactory.getIFL(tu); if (location != null) { IIndexFile[] files= index.getFiles(location); - for (int j=0; j bestDiff) { break; @@ -286,8 +288,7 @@ public class IndexUI { IIndexName[] defs= index.findNames(binding, IIndex.FIND_DEFINITIONS | IIndex.SEARCH_ACROSS_LANGUAGE_BOUNDARIES); ArrayList result= new ArrayList(); - for (int i = 0; i < defs.length; i++) { - IIndexName in = defs[i]; + for (IIndexName in : defs) { ICElementHandle definition= getCElementForName((ICProject) null, index, in); if (definition != null) { result.add(definition); @@ -379,8 +380,8 @@ public class IndexUI { throws CoreException { if (binding != null) { IIndexName[] names= index.findNames(binding, IIndex.FIND_DECLARATIONS); - for (int i = 0; i < names.length; i++) { - ICElementHandle elem= getCElementForName(preferProject, index, names[i]); + for (IIndexName name : names) { + ICElementHandle elem= getCElementForName(preferProject, index, name); if (elem != null) { return elem; } @@ -478,4 +479,48 @@ public class IndexUI { } return input; } + + /** + * Searches for all specializations that depend on the definition of the given binding. + */ + public static List findSpecializations(IBinding binding) throws CoreException { + try { + List result= null; + + IBinding owner = binding.getOwner(); + if (owner != null) { + List specializedOwners= findSpecializations(owner); + if (!specializedOwners.isEmpty()) { + result= new ArrayList(specializedOwners.size()); + + for (IBinding specOwner : specializedOwners) { + if (specOwner instanceof ICPPClassSpecialization) { + result.add(((ICPPClassSpecialization) specOwner).specializeMember(binding)); + } + } + } + } + + if (binding instanceof ICPPInstanceCache) { + final List instances= Arrays.asList(((ICPPInstanceCache) binding).getAllInstances()); + if (!instances.isEmpty()) { + if (result == null) + result= new ArrayList(instances.size()); + + + for (ICPPTemplateInstance inst : instances) { + if (!IndexFilter.ALL_DECLARED.acceptBinding(inst)) { + result.add(inst); + } + } + } + } + + if (result != null) { + return result; + } + } catch (DOMException e) { + } + return Collections.emptyList(); + } }