From e714b8461209f89ffefebbd2f87034f993511e1a Mon Sep 17 00:00:00 2001 From: Andrew Ferguson Date: Wed, 15 Nov 2006 10:14:30 +0000 Subject: [PATCH] Tidy up pdom binding resolution code, fix typedefs accessed by qualified names --- .../tests/IndexBindingResolutionTestBase.java | 2 + .../tests/IndexCPPBindingResolutionTest.java | 4 +- .../pdom/tests/PDOMPrettyPrinter.java | 35 +++ .../core/pdom/dom/c/PDOMCParameter.java | 3 + .../core/pdom/dom/cpp/PDOMCPPClassType.java | 201 ++++++------------ .../core/pdom/dom/cpp/PDOMCPPLinkage.java | 91 ++++---- .../core/pdom/dom/cpp/PDOMCPPNamespace.java | 122 ++++++----- .../core/pdom/dom/cpp/PDOMCPPParameter.java | 3 + .../core/pdom/dom/cpp/PDOMCPPTypedef.java | 2 +- 9 files changed, 227 insertions(+), 236 deletions(-) create mode 100644 core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMPrettyPrinter.java diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexBindingResolutionTestBase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexBindingResolutionTestBase.java index a6c53b520c7..ba328a27c0e 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexBindingResolutionTestBase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexBindingResolutionTestBase.java @@ -62,6 +62,8 @@ public abstract class IndexBindingResolutionTestBase extends PDOMTestBase { IFile file = TestSourceReader.createFile(cproject.getProject(), header, testData[0].toString()); CCoreInternals.getPDOMManager().setIndexerId(cproject, IPDOMManager.ID_FAST_INDEXER); assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor())); + + /* ((PDOM)CCoreInternals.getPDOMManager().getPDOM(cproject)).accept(new PDOMPrettyPrinter()); */ IFile cppfile= TestSourceReader.createFile(cproject.getProject(), references, testData[1].toString()); assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor())); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexCPPBindingResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexCPPBindingResolutionTest.java index e362c2329aa..273f0289518 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexCPPBindingResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexCPPBindingResolutionTest.java @@ -324,7 +324,7 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas // namespace n3 { c3::s3::u3::Int i10; } // namespace n1 { n2::Int i11; } // namespace n1 { namespace n2 { Int i12; }} - public void _testQualifiedNamesForTypedef() throws DOMException { + public void testQualifiedNamesForTypedef() throws DOMException { IBinding b0 = getBindingFromASTName("Int i0;", 3); assertQNEquals("n1::n2::Int", b0); IBinding b1= getBindingFromASTName("Int i1;", 3); @@ -675,4 +675,6 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas IBinding b23 = getBindingFromASTName("f;/*23*/", 1); IBinding b24 = getBindingFromASTName("f;/*24*/", 1); } + + public void _testAddressOfOverloadedMethod() throws DOMException { fail("aftodo"); } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMPrettyPrinter.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMPrettyPrinter.java new file mode 100644 index 00000000000..cc8d07f3a52 --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMPrettyPrinter.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2006 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Symbian - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.pdom.tests; + +import org.eclipse.cdt.core.dom.IPDOMNode; +import org.eclipse.cdt.core.dom.IPDOMVisitor; +import org.eclipse.core.runtime.CoreException; + +/** + * Dump the contents of the PDOM index to stdout (for when you need + * a lo-fidelity debugging tool) + */ +public class PDOMPrettyPrinter implements IPDOMVisitor { + StringBuffer indent = new StringBuffer(); + final String step = " "; //$NON-NLS-1$ + + public void leave(IPDOMNode node) throws CoreException { + if(indent.length()>=step.length()) + indent.setLength(indent.length()-step.length()); + } + + public boolean visit(IPDOMNode node) throws CoreException { + indent.append(step); + System.out.println(indent+""+node); + return true; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java index 485662a57a7..038c00ab165 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java @@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.db.Database; @@ -52,6 +53,8 @@ class PDOMCParameter extends PDOMNamedNode implements IParameter { db.putInt(record + NEXT_PARAM, 0); try { IType type = param.getType(); + while(type instanceof ITypedef) + type = ((ITypedef)type).getType(); if (type != null) { PDOMNode typeNode = getLinkageImpl().addType(this, type); db.putInt(record + TYPE, typeNode != null ? typeNode.getRecord() : 0); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java index 414c9232849..78af27ff078 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java @@ -8,6 +8,7 @@ * Contributors: * QNX - Initial API and implementation * Markus Schorn (Wind River Systems) + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; @@ -22,7 +23,6 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.IPDOMNode; import org.eclipse.cdt.core.dom.IPDOMVisitor; -import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTFieldReference; import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; @@ -328,18 +328,13 @@ ICPPClassScope, IPDOMMemberOwner { public IBinding getBinding(IASTName name, boolean resolve) throws DOMException { IASTNode parent = name.getParent(); - ASTNodeProperty prop = name.getPropertyInParent(); - - PDOMLinkage linkage; try { - linkage = getLinkageImpl(); - if (name instanceof ICPPASTQualifiedName) { IASTName lastName = ((ICPPASTQualifiedName)name).getLastName(); return lastName != null ? lastName.resolveBinding() : null; } - if(parent instanceof ICPPASTQualifiedName) { + if (parent instanceof ICPPASTQualifiedName) { IASTName[] names = ((ICPPASTQualifiedName)parent).getNames(); int index = ArrayUtil.indexOf(names, name); @@ -362,149 +357,93 @@ ICPPClassScope, IPDOMMemberOwner { } } - FindBindingByLinkageConstant visitor = new FindBindingByLinkageConstant(linkage, name.toCharArray(), PDOMCPPLinkage.CPPCLASSTYPE); - try { - accept(visitor); - } catch(CoreException e) { - if (e.getStatus().equals(Status.OK_STATUS)) { - return visitor.getResult(); - } else { - CCorePlugin.log(e); - } - } - visitor = new FindBindingByLinkageConstant(linkage, name.toCharArray(), PDOMCPPLinkage.CPPMETHOD); - try { - accept(visitor); - } catch(CoreException e) { - if (e.getStatus().equals(Status.OK_STATUS)) { - return visitor.getResult(); - } else { - CCorePlugin.log(e); - } - } - visitor = new FindBindingByLinkageConstant(linkage, name.toCharArray(), PDOMCPPLinkage.CPPFIELD); - try { - accept(visitor); - } catch(CoreException e) { - if (e.getStatus().equals(Status.OK_STATUS)) { - return visitor.getResult(); - } else { - CCorePlugin.log(e); - } - } - visitor = new FindBindingByLinkageConstant(linkage, name.toCharArray(), PDOMCPPLinkage.CPPENUMERATION); - try { - accept(visitor); - } catch(CoreException e) { - if (e.getStatus().equals(Status.OK_STATUS)) { - return visitor.getResult(); - } else { - CCorePlugin.log(e); - } - } - visitor = new FindBindingByLinkageConstant(linkage, name.toCharArray(), PDOMCPPLinkage.CPPENUMERATOR); - try { - accept(visitor); - } catch(CoreException e) { - if (e.getStatus().equals(Status.OK_STATUS)) { - return visitor.getResult(); - } else { - CCorePlugin.log(e); - } - } - return null; // not found in this scope + // aftodo - do we even need specify the type - we should + // expect only one name here anyway? + return searchCurrentScope(name.toCharArray(), new int[] { + PDOMCPPLinkage.CPPCLASSTYPE, + PDOMCPPLinkage.CPPMETHOD, + PDOMCPPLinkage.CPPFIELD, + PDOMCPPLinkage.CPPENUMERATION, + PDOMCPPLinkage.CPPENUMERATOR + }); } } IASTNode eParent = parent.getParent(); - if(parent instanceof IASTIdExpression) { - FindBindingByLinkageConstant visitor = new FindBindingByLinkageConstant(linkage, name.toCharArray(), PDOMCPPLinkage.CPPENUMERATOR); - try { - accept(visitor); - } catch(CoreException e) { - if (e.getStatus().equals(Status.OK_STATUS)) { - return visitor.getResult(); - } else { - CCorePlugin.log(e); - } - } + if (parent instanceof IASTIdExpression) { + return searchCurrentScope(name.toCharArray(), PDOMCPPLinkage.CPPENUMERATOR); } else if(eParent instanceof IASTFunctionCallExpression) { if(parent.getPropertyInParent().equals(IASTFunctionCallExpression.FUNCTION_NAME)) { - IType[] types = ((PDOMCPPLinkage)linkage).getTypes( - ((IASTFunctionCallExpression)eParent).getParameterExpression() - ); - if(types!=null) { - ILocalBindingIdentity bid = new CPPBindingIdentity.Holder( - new String(name.toCharArray()), - PDOMCPPLinkage.CPPFUNCTION, - types); - FindEquivalentBinding feb = new FindEquivalentBinding(linkage, bid); - try { - accept(feb); - } catch(CoreException e) { - if (e.getStatus().equals(Status.OK_STATUS)) { - return feb.getResult(); - } else { - CCorePlugin.log(e); - } - } - return feb.getResult(); - } + return searchCurrentScopeForFunction((IASTFunctionCallExpression)eParent, name); } else if(parent.getPropertyInParent().equals(IASTFunctionCallExpression.PARAMETERS)) { if(parent instanceof IASTFieldReference) { - FindBindingByLinkageConstant visitor = new FindBindingByLinkageConstant(linkage, name.toCharArray(), PDOMCPPLinkage.CPPFIELD); - try { - accept(visitor); - } catch(CoreException e) { - if (e.getStatus().equals(Status.OK_STATUS)) { - return visitor.getResult(); - } else { - CCorePlugin.log(e); - } - } - } - } - } else if(prop.equals(IASTFieldReference.FIELD_NAME)) { - FindBindingByLinkageConstant visitor = new FindBindingByLinkageConstant(linkage, name.toCharArray(), PDOMCPPLinkage.CPPFIELD); - try { - accept(visitor); - } catch(CoreException e) { - if (e.getStatus().equals(Status.OK_STATUS)) { - return visitor.getResult(); - } else { - CCorePlugin.log(e); + return searchCurrentScope(name.toCharArray(), PDOMCPPLinkage.CPPFIELD); } } + } else if(name.getPropertyInParent().equals(IASTFieldReference.FIELD_NAME)) { + return searchCurrentScope(name.toCharArray(), PDOMCPPLinkage.CPPFIELD); } else if (parent instanceof IASTNamedTypeSpecifier) { - FindBindingByLinkageConstant visitor = new FindBindingByLinkageConstant(linkage, name.toCharArray(), PDOMCPPLinkage.CPPCLASSTYPE); - try { - accept(visitor); - } catch(CoreException e) { - if (e.getStatus().equals(Status.OK_STATUS)) { - return visitor.getResult(); - } else { - CCorePlugin.log(e); - } - } - visitor = new FindBindingByLinkageConstant(linkage, name.toCharArray(), PDOMCPPLinkage.CPPENUMERATION); - try { - accept(visitor); - } catch(CoreException e) { - if (e.getStatus().equals(Status.OK_STATUS)) { - return visitor.getResult(); - } else { - CCorePlugin.log(e); - } - } + return searchCurrentScope(name.toCharArray(), new int[] { + PDOMCPPLinkage.CPPCLASSTYPE, + PDOMCPPLinkage.CPPENUMERATION, + PDOMCPPLinkage.CPPTYPEDEF + }); } } catch(CoreException e) { CCorePlugin.log(e); - return null; } return null; } + private PDOMBinding searchCurrentScopeForFunction(IASTFunctionCallExpression fce, IASTName name) throws CoreException { + try { + IType[] types = PDOMCPPLinkage.getTypes(fce.getParameterExpression()); + if(types!=null) { + ILocalBindingIdentity bid = new CPPBindingIdentity.Holder( + new String(name.toCharArray()), + PDOMCPPLinkage.CPPFUNCTION, + types); + FindEquivalentBinding feb = new FindEquivalentBinding(getLinkageImpl(), bid); + try { + accept(feb); + } catch(CoreException e) { + if (e.getStatus().equals(Status.OK_STATUS)) { + return feb.getResult(); + } else { + CCorePlugin.log(e); + } + } + return feb.getResult(); + } + } catch(DOMException de) { + CCorePlugin.log(de); + } + return null; + } + + + private IBinding searchCurrentScope(char[] name, int[] constants) throws CoreException { + IBinding result = null; + for(int i=0; result==null && i 0 ? bindings[0] : null; + + // aftodo - do we even need specify the type - we should + // expect only one name here anyway? + return searchCurrentScope(name.toCharArray(), new int[] { + PDOMCPPLinkage.CPPCLASSTYPE, + PDOMCPPLinkage.CPPNAMESPACE, + PDOMCPPLinkage.CPPFUNCTION, + PDOMCPPLinkage.CPPVARIABLE, + PDOMCPPLinkage.CPPENUMERATION, + PDOMCPPLinkage.CPPENUMERATOR + }); } } + + IASTNode eParent = parent.getParent(); if (parent instanceof IASTIdExpression) { - // reference - IASTNode eParent = parent.getParent(); if (eParent instanceof IASTFunctionCallExpression) { if(parent.getPropertyInParent().equals(IASTFunctionCallExpression.FUNCTION_NAME)) { - IType[] types = ((PDOMCPPLinkage)getLinkage()).getTypes( - ((IASTFunctionCallExpression)eParent).getParameterExpression() - ); - if(types!=null) { - ILocalBindingIdentity bid = new CPPBindingIdentity.Holder( - new String(name.toCharArray()), - PDOMCPPLinkage.CPPFUNCTION, - types); - FindEquivalentBinding feb = new FindEquivalentBinding(getLinkageImpl(), bid); - getIndex().accept(feb); - return feb.getResult(); - } + return searchCurrentScopeForFunction((IASTFunctionCallExpression)eParent, name); } } else { int desiredType = ((name.getParent() instanceof ICPPASTQualifiedName) && ((ICPPASTQualifiedName)name.getParent()).getLastName() != name) ? PDOMCPPLinkage.CPPNAMESPACE : PDOMCPPLinkage.CPPVARIABLE; - FindBindingByLinkageConstant visitor2 = new FindBindingByLinkageConstant(getLinkageImpl(), name.toCharArray(), desiredType); - getIndex().accept(visitor2); - if(visitor2.getResult()!=null) { - return visitor2.getResult(); - } - - visitor2 = new FindBindingByLinkageConstant(getLinkageImpl(), name.toCharArray(), PDOMCPPLinkage.CPPTYPEDEF); - getIndex().accept(visitor2); - if(visitor2.getResult()!=null) { - return visitor2.getResult(); - } - - return null; + + IBinding result = searchCurrentScope(name.toCharArray(), desiredType); + if(result!=null) + return result; + return searchCurrentScope(name.toCharArray(), PDOMCPPLinkage.CPPTYPEDEF); } } else if (parent instanceof IASTNamedTypeSpecifier) { - FindBindingsInBTree visitor = new FindBindingsInBTree(getLinkageImpl(), name.toCharArray(), PDOMCPPLinkage.CPPCLASSTYPE); - getIndex().accept(visitor); - IBinding[] bindings = visitor.getBinding(); - return bindings.length > 0 - ? bindings[0] - : null; + return searchCurrentScope(name.toCharArray(), new int[] { + PDOMCPPLinkage.CPPCLASSTYPE, + PDOMCPPLinkage.CPPENUMERATION, + PDOMCPPLinkage.CPPTYPEDEF + }); } - return null; } catch (CoreException e) { CCorePlugin.log(e); - return null; } + + return null; } + + private PDOMBinding searchCurrentScopeForFunction(IASTFunctionCallExpression fce, IASTName name) throws CoreException { + try { + IType[] types = PDOMCPPLinkage.getTypes(fce.getParameterExpression()); + if(types!=null) { + ILocalBindingIdentity bid = new CPPBindingIdentity.Holder( + new String(name.toCharArray()), + PDOMCPPLinkage.CPPFUNCTION, + types); + FindEquivalentBinding feb = new FindEquivalentBinding(getLinkageImpl(), bid); + getIndex().accept(feb); + return feb.getResult(); + } + } catch(DOMException de) { + CCorePlugin.log(de); + } + return null; + } + + private PDOMBinding searchCurrentScope(char[] name, int[] constants) throws CoreException { + PDOMBinding result = null; + for(int i=0; result==null && i