From e39bead08b29d705da853cd5dbe24daef0b8440a Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Wed, 18 Jan 2006 18:35:23 +0000 Subject: [PATCH] PDOM - Extended resolveBinding and openDeclaration to C. --- .../core/pdom/dom/c/PDOMCLinkage.java | 74 ++++++++++++------- .../core/pdom/dom/c/PDOMCStructure.java | 10 ++- .../core/pdom/dom/cpp/PDOMCPPLinkage.java | 2 +- .../cdt/core/search/DOMSearchUtil.java | 62 ++++++++-------- 4 files changed, 91 insertions(+), 57 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java index cad6925eca9..77cbf116add 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java @@ -12,7 +12,10 @@ package org.eclipse.cdt.internal.core.pdom.dom.c; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; +import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; +import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IBinding; @@ -23,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IVariable; +import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; import org.eclipse.cdt.internal.core.pdom.PDOMDatabase; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; @@ -108,44 +112,46 @@ public class PDOMCLinkage extends PDOMLinkage { } private static final class FindBinding extends PDOMNode.NodeVisitor { - private final IBinding binding; - public PDOMBinding pdomBinding; - public FindBinding(PDOMDatabase pdom, IBinding binding) { - super(pdom, binding.getNameCharArray()); - this.binding = binding; + PDOMBinding pdomBinding; + final int desiredType; + public FindBinding(PDOMDatabase pdom, char[] name, int desiredType) { + super(pdom, name); + this.desiredType = desiredType; } public boolean visit(int record) throws CoreException { if (record == 0) return true; PDOMBinding tBinding = pdom.getBinding(record); if (!tBinding.hasName(name)) + // no more bindings with our desired name return false; - switch (tBinding.getBindingType()) { - case CVARIABLE: - if (binding instanceof IVariable) - pdomBinding = tBinding; - break; - case CFUNCTION: - if (binding instanceof IFunction) - pdomBinding = tBinding; - break; - case CSTRUCTURE: - if (binding instanceof ICompositeType) - pdomBinding = tBinding; - break; - case CFIELD: - if (binding instanceof IField) - pdomBinding = tBinding; - break; - } - return pdomBinding == null; + if (tBinding.getBindingType() != desiredType) + // wrong type, try again + return true; + + // got it + pdomBinding = tBinding; + return false; } } + + protected int getBindingType(IBinding binding) { + if (binding instanceof IVariable) + return CVARIABLE; + else if (binding instanceof IFunction) + return CFUNCTION; + else if (binding instanceof ICompositeType) + return CSTRUCTURE; + else if (binding instanceof IField) + return CFIELD; + else + return 0; + } public PDOMBinding adaptBinding(IBinding binding) throws CoreException { PDOMNode parent = getParent(binding); if (parent == this) { - FindBinding visitor = new FindBinding(pdom, binding); + FindBinding visitor = new FindBinding(pdom, binding.getNameCharArray(), getBindingType(binding)); getIndex().visit(visitor); return visitor.pdomBinding; } else if (parent instanceof PDOMMemberOwner) { @@ -179,6 +185,24 @@ public class PDOMCLinkage extends PDOMLinkage { } public PDOMBinding resolveBinding(IASTName name) throws CoreException { + IASTNode parent = name.getParent(); + if (parent instanceof IASTIdExpression) { + // reference + IASTNode eParent = parent.getParent(); + if (eParent instanceof IASTFunctionCallExpression) { + FindBinding visitor = new FindBinding(pdom, name.toCharArray(), CFUNCTION); + getIndex().visit(visitor); + return visitor.pdomBinding; + } else { + FindBinding visitor = new FindBinding(pdom, name.toCharArray(), CVARIABLE); + getIndex().visit(visitor); + return visitor.pdomBinding; + } + } else if (parent instanceof ICASTElaboratedTypeSpecifier) { + FindBinding visitor = new FindBinding(pdom, name.toCharArray(), CSTRUCTURE); + getIndex().visit(visitor); + return visitor.pdomBinding; + } return null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java index 88495d858e6..8bf59b34de2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.internal.core.pdom.dom.c; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.ICompositeType; @@ -18,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.internal.core.pdom.PDOMDatabase; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMMember; import org.eclipse.cdt.internal.core.pdom.dom.PDOMMemberOwner; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; @@ -50,7 +52,13 @@ public class PDOMCStructure extends PDOMMemberOwner implements ICompositeType { } public IField findField(String name) throws DOMException { - throw new PDOMNotImplementedError(); + try { + PDOMMember[] members = findMembers(name.toCharArray()); + return (PDOMCField)members[0]; + } catch (CoreException e) { + CCorePlugin.log(e); + return null; + } } public IScope getCompositeScope() throws DOMException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index b21d585cee8..48e75fa4b93 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -139,7 +139,7 @@ public class PDOMCPPLinkage extends PDOMLinkage { } } - public int getBindingType(IBinding binding) { + protected int getBindingType(IBinding binding) { if (binding instanceof ICPPVariable) return CPPVARIABLE; else if (binding instanceof ICPPFunction) 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 bb23cae5a74..9e306aa4e65 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 @@ -350,38 +350,40 @@ public class DOMSearchUtil { } IBinding binding = searchName.resolveBinding(); - names = getNames(tu, binding, limitTo); - - if (names == null || names.length == 0) { // try alternate strategies - try { - // fix for 86829, 95224 - if ((binding instanceof ICPPConstructor || (binding instanceof ICPPMethod && ((ICPPMethod)binding).isDestructor())) - && binding.getScope() instanceof ICPPClassScope) { - binding = ((ICPPClassScope)binding.getScope()).getClassType(); - names = getNames(tu, binding, limitTo); - } else if (binding instanceof PDOMBinding) { - try { - ArrayList pdomNames = new ArrayList(); - // First decls - PDOMName name = ((PDOMBinding)binding).getFirstDeclaration(); - while (name != null) { - pdomNames.add(name); - name = name.getNextInBinding(); - } - // Next defs - name = ((PDOMBinding)binding).getFirstDefinition(); - while (name != null) { - pdomNames.add(name); - name = name.getNextInBinding(); - } - names = (IASTName[])pdomNames.toArray(new IASTName[pdomNames.size()]); - } catch (CoreException e) { - CCorePlugin.log(e); - } + if (binding instanceof PDOMBinding) { + try { + ArrayList pdomNames = new ArrayList(); + // First decls + PDOMName name = ((PDOMBinding)binding).getFirstDeclaration(); + while (name != null) { + pdomNames.add(name); + name = name.getNextInBinding(); } - } catch (DOMException e) {} + // Next defs + name = ((PDOMBinding)binding).getFirstDefinition(); + while (name != null) { + pdomNames.add(name); + name = name.getNextInBinding(); + } + names = (IASTName[])pdomNames.toArray(new IASTName[pdomNames.size()]); + } catch (CoreException e) { + CCorePlugin.log(e); + } + } else { + names = getNames(tu, binding, limitTo); + + if (names == null || names.length == 0) { // try alternate strategies + try { + // fix for 86829, 95224 + if ((binding instanceof ICPPConstructor || (binding instanceof ICPPMethod && ((ICPPMethod)binding).isDestructor())) + && binding.getScope() instanceof ICPPClassScope) { + binding = ((ICPPClassScope)binding.getScope()).getClassType(); + names = getNames(tu, binding, limitTo); + } + } catch (DOMException e) {} + } } - + return names; }