From 8b7a529a11d5cc4ccb78e1a84c5bf9066d66e1d9 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 7 Oct 2010 13:47:54 +0000 Subject: [PATCH] Bug 311164: Follow up on fix to improve mark occurrences feature. --- .../eclipse/cdt/core/dom/ast/ASTTypeUtil.java | 2 ++ .../internal/core/dom/parser/ASTInternal.java | 20 ++++++++++++++++++ .../parser/cpp/semantics/CPPTemplates.java | 13 ++++++++++++ .../dom/parser/cpp/semantics/CPPVisitor.java | 16 +++----------- .../search/PDOMSearchTextSelectionQuery.java | 21 ++----------------- .../cdt/internal/ui/viewsupport/IndexUI.java | 3 ++- 6 files changed, 42 insertions(+), 33 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java index 8e194b2a9b1..c4e1ab5bf72 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java @@ -416,6 +416,8 @@ public class ASTTypeUtil { needSpace= appendCVQ(result, needSpace, qt.isConst(), qt.isVolatile()); } else if (type instanceof ITypedef) { result.append(((ITypedef) type).getNameCharArray()); + } else if (type instanceof IProblemBinding) { + result.append('?'); } else if (type != null) { result.append('@').append(type.hashCode()); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java index 359aca1e23b..fd373a2bc78 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java @@ -15,6 +15,8 @@ import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.cdt.core.index.IIndexBinding; +import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalBinding; import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalFunction; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding; @@ -172,4 +174,22 @@ public class ASTInternal { ((ICPPInternalBinding) b).addDefinition(declaration); } } + + public static boolean hasDeclaration(IBinding binding) { + if (binding instanceof ICPPInternalBinding) { + ICPPInternalBinding internal= (ICPPInternalBinding) binding; + if (internal.getDefinition() != null) + return true; + IASTNode[] decls= internal.getDeclarations(); + return decls != null && decls.length > 0 && decls[0] != null; + } + if (binding instanceof IIndexBinding) { + try { + return IndexFilter.ALL_DECLARED.acceptBinding(binding); + } catch (CoreException e) { + } + return false; + } + return binding != null; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index 95716c576ca..5ccd79e3157 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -2314,4 +2314,17 @@ public class CPPTemplates { } return ObjectMap.EMPTY_MAP; } + + public static IBinding findDeclarationForSpecialization(IBinding binding) { + while (binding instanceof ICPPSpecialization) { + if (ASTInternal.hasDeclaration(binding)) + return binding; + + IBinding original= ((ICPPSpecialization) binding).getSpecializedBinding(); + if (original == null) + return binding; + binding= original; + } + return binding; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 61bc31e8668..737901c7225 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -1264,6 +1264,7 @@ public class CPPVisitor extends ASTQueries { public CollectDeclarationsAction(IBinding binding) { + binding = CPPTemplates.findDeclarationForSpecialization(binding); shouldVisitNames = true; this.decls = new IASTName[DEFAULT_LIST_SIZE]; @@ -1410,17 +1411,6 @@ public class CPPVisitor extends ASTQueries { } - protected static IBinding unwindBinding(IBinding binding) { - while (true) { - if (binding instanceof ICPPSpecialization) { - binding= ((ICPPSpecialization) binding).getSpecializedBinding(); - } else { - break; - } - } - return binding; - } - public static class CollectReferencesAction extends ASTVisitor { private static final int DEFAULT_LIST_SIZE = 8; private IASTName[] refs; @@ -1438,7 +1428,7 @@ public class CPPVisitor extends ASTQueries { shouldVisitNames = true; this.refs = new IASTName[DEFAULT_LIST_SIZE]; - binding = unwindBinding(binding); + binding = CPPTemplates.findDeclarationForSpecialization(binding); this.bindings = new IBinding[] {binding}; if (binding instanceof ICPPUsingDeclaration) { @@ -1536,7 +1526,7 @@ public class CPPVisitor extends ASTQueries { } private boolean isReferenceBinding(IBinding nameBinding) { - nameBinding= unwindBinding(nameBinding); + nameBinding = CPPTemplates.findDeclarationForSpecialization(nameBinding); if (nameBinding != null) { for (IBinding binding : bindings) { if (nameBinding.equals(binding)) { 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 a05b16814e5..049400e3d8f 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,13 +25,12 @@ 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; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.model.ASTCache.ASTRunnable; import org.eclipse.cdt.internal.ui.editor.ASTProvider; @@ -73,7 +72,7 @@ public class PDOMSearchTextSelectionQuery extends PDOMSearchQuery { } } binding = index.findBinding(searchName); - binding= findDeclarationForSpecialization(binding); + binding= CPPTemplates.findDeclarationForSpecialization(binding); if (binding != null) { label= labelForBinding(index, binding, label); createMatches(index, binding); @@ -84,22 +83,6 @@ 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; - } }); } 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 acf74188773..b368dd841b0 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 @@ -82,6 +82,7 @@ import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; 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; @@ -514,7 +515,7 @@ public class IndexUI { for (ICPPTemplateInstance inst : instances) { - if (!IndexFilter.ALL_DECLARED.acceptBinding(inst)) { + if (!ASTInternal.hasDeclaration(inst)) { result.add(inst); } }