From dc18c3165d1a1f77b52600c0f5bff5e72d911b8a Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Fri, 2 Oct 2009 10:10:59 +0000 Subject: [PATCH] Improve non c++ fallback navigation, follow up for bug 282335. --- .../search/actions/OpenDeclarationsJob.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsJob.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsJob.java index 1bf40d5d2fb..e798c5260e1 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsJob.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsJob.java @@ -72,6 +72,7 @@ import org.eclipse.cdt.core.model.ISourceReference; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.util.CElementBaseLabels; import org.eclipse.cdt.core.parser.util.ArrayUtil; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; @@ -599,7 +600,7 @@ class OpenDeclarationsJob extends Job implements ASTRunnable { if (ast instanceof ICPPASTTranslationUnit) { secondaryBindings= cppRemoveSecondaryBindings(primaryBindings, sourceName); } else { - secondaryBindings= Collections.emptyList(); + secondaryBindings= defaultRemoveSecondaryBindings(primaryBindings, sourceName); } // Convert bindings to CElements @@ -635,6 +636,38 @@ class OpenDeclarationsJob extends Job implements ASTRunnable { return false; } + private Collection defaultRemoveSecondaryBindings(Set primaryBindings, IASTName sourceName) { + if (sourceName != null) { + IBinding b= sourceName.resolveBinding(); + if (b != null && ! (b instanceof IProblemBinding)) { + try { + for (Iterator iterator = primaryBindings.iterator(); iterator.hasNext();) { + if (!checkOwnerNames(b, iterator.next())) + iterator.remove(); + } + } catch (DOMException e) { + // ignore + } + } + } + return Collections.emptyList(); + } + + private boolean checkOwnerNames(IBinding b1, IBinding b2) throws DOMException { + IBinding o1 = b1.getOwner(); + IBinding o2= b2.getOwner(); + if (o1 == o2) + return true; + + if (o1 == null || o2 == null) + return false; + + if (!CharArrayUtils.equals(o1.getNameCharArray(), o2.getNameCharArray())) + return false; + + return checkOwnerNames(o1, o2); + } + private Collection cppRemoveSecondaryBindings(Set primaryBindings, IASTName sourceName) { List result= new ArrayList(); String[] sourceQualifiedName= null;