From 94f1a13a14bc4052b0e07fffa1a3ea3237d7ad88 Mon Sep 17 00:00:00 2001 From: Andrew Ferguson Date: Mon, 13 Nov 2006 14:25:14 +0000 Subject: [PATCH] Improve accuracy of index based binding resolution this patch * improves pdom resolution binding (PDOMC*Linkage.resolveBinding) * fixes some broken binding resolution test data * has PDOMCPPField store type information * has PDOMCPPNamespaceAlias store what it is aliasing --- .../pdom/tests/CCompositeTypeTests.java | 4 + .../internal/pdom/tests/CFunctionTests.java | 5 + .../internal/pdom/tests/CPPFieldTests.java | 17 +- .../internal/pdom/tests/CPPFunctionTests.java | 5 + .../internal/pdom/tests/CPPVariableTests.java | 5 + .../internal/pdom/tests/CVariableTests.java | 5 + .../cdt/internal/pdom/tests/DefDeclTests.java | 9 +- .../pdom/tests/FilesOnReindexTests.java | 4 + .../tests/IndexCBindingResolutionTest.java | 34 ++- .../tests/IndexCPPBindingResolutionTest.java | 257 +++++++++-------- .../cdt/internal/pdom/tests/MethodTests.java | 5 + .../internal/pdom/tests/NamespaceTests.java | 6 +- .../OverloadsWithinCommonHeaderTests.java | 2 - .../cdt/internal/pdom/tests/PDOMTestBase.java | 3 +- .../overloadsWithinCommonHeader/class.h | 23 -- .../eclipse/cdt/core/dom/ast/ASTTypeUtil.java | 12 +- .../cdt/core/parser/util/ArrayUtil.java | 31 ++- .../core/dom/parser/cpp/CPPSemantics.java | 6 +- .../eclipse/cdt/internal/core/pdom/PDOM.java | 4 +- .../internal/core/pdom/dom/PDOMBinding.java | 26 +- .../core/pdom/dom/c/PDOMCLinkage.java | 16 ++ .../core/pdom/dom/c/PDOMCTypedef.java | 15 +- .../core/pdom/dom/cpp/PDOMCPPBinding.java | 4 +- .../core/pdom/dom/cpp/PDOMCPPClassType.java | 250 ++++++++++++++--- .../core/pdom/dom/cpp/PDOMCPPField.java | 51 +--- .../core/pdom/dom/cpp/PDOMCPPLinkage.java | 262 +++++++++++++----- .../core/pdom/dom/cpp/PDOMCPPMethod.java | 9 - .../core/pdom/dom/cpp/PDOMCPPNamespace.java | 58 ++-- .../pdom/dom/cpp/PDOMCPPNamespaceAlias.java | 16 +- .../core/pdom/dom/cpp/PDOMCPPTypedef.java | 34 ++- .../core/pdom/dom/cpp/PDOMCPPVariable.java | 2 +- 31 files changed, 799 insertions(+), 381 deletions(-) delete mode 100644 core/org.eclipse.cdt.core.tests/resources/pdomtests/overloadsWithinCommonHeader/class.h diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CCompositeTypeTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CCompositeTypeTests.java index b19459810bf..745b48b47e2 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CCompositeTypeTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CCompositeTypeTests.java @@ -22,6 +22,7 @@ import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.NullProgressMonitor; /** @@ -47,6 +48,9 @@ public class CCompositeTypeTests extends PDOMTestBase { protected void tearDown() throws Exception { pdom.releaseReadLock(); + if (project != null) { + project.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); + } } //TODO PDOM does not distinguish between a struct or union in C diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CFunctionTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CFunctionTests.java index 4f119a3c04b..016ba03728a 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CFunctionTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CFunctionTests.java @@ -18,6 +18,8 @@ import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.NullProgressMonitor; /** * Tests for verifying whether the PDOM correctly stores information about @@ -40,6 +42,9 @@ public class CFunctionTests extends PDOMTestBase { protected void tearDown() throws Exception { pdom.releaseReadLock(); + if (project != null) { + project.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); + } } public void testExternCFunction() throws Exception { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPFieldTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPFieldTests.java index f7e9f46f491..097d16b70da 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPFieldTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPFieldTests.java @@ -22,7 +22,9 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.NullProgressMonitor; /** * Tests for verifying whether the PDOM correctly stores information about @@ -45,6 +47,9 @@ public class CPPFieldTests extends PDOMTestBase { protected void tearDown() throws Exception { pdom.releaseReadLock(); + if (project != null) { + project.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); + } } public void testFieldDeclarations() throws Exception { @@ -101,23 +106,19 @@ public class CPPFieldTests extends PDOMTestBase { assertTrue(field.isStatic()); } - public void _testIntField() throws Exception { - // Type information not yet stored in PDOM. + public void testIntField() throws Exception { assertFieldType(pdom, "Class1::c1a", IBasicType.t_int); } - public void _testDoubleField() throws Exception { - // Type information not yet stored in PDOM. + public void testDoubleField() throws Exception { assertFieldType(pdom, "Class1::c1b", IBasicType.t_double); } - public void _testCharField() throws Exception { - // Type information not yet stored in PDOM. + public void testCharField() throws Exception { assertFieldType(pdom, "Class2::c2a", IBasicType.t_char); } - public void _testFloatField() throws Exception { - // Type information not yet stored in PDOM. + public void testFloatField() throws Exception { assertFieldType(pdom, "Class2::c2b", IBasicType.t_float); } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPFunctionTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPFunctionTests.java index 945c91f50b4..956fb226e7b 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPFunctionTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPFunctionTests.java @@ -24,7 +24,9 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.NullProgressMonitor; /** * Tests for verifying whether the PDOM correctly stores information about @@ -48,6 +50,9 @@ public class CPPFunctionTests extends PDOMTestBase { protected void tearDown() throws Exception { pdom.releaseReadLock(); + if (project != null) { + project.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); + } } public void testFunctionType() throws Exception { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPVariableTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPVariableTests.java index d24d0730449..4d47ab81f17 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPVariableTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPVariableTests.java @@ -18,6 +18,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.NullProgressMonitor; /** * Tests for verifying whether the PDOM correctly stores information about @@ -40,6 +42,9 @@ public class CPPVariableTests extends PDOMTestBase { protected void tearDown() throws Exception { pdom.releaseReadLock(); + if (project != null) { + project.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); + } } public void testCPPAutoVariable() throws Exception { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CVariableTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CVariableTests.java index c7443d1772b..2c3cd61f74c 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CVariableTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CVariableTests.java @@ -18,6 +18,8 @@ import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.NullProgressMonitor; /** * Tests for verifying whether the PDOM correctly stores information about @@ -40,6 +42,9 @@ public class CVariableTests extends PDOMTestBase { protected void tearDown() throws Exception { pdom.releaseReadLock(); + if (project != null) { + project.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); + } } public void testCAutoVariable() throws Exception { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/DefDeclTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/DefDeclTests.java index 22097b6feb0..81cb0ee03b5 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/DefDeclTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/DefDeclTests.java @@ -28,6 +28,7 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.testplugin.util.TestSourceReader; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; @@ -44,14 +45,15 @@ public class DefDeclTests extends PDOMTestBase { private String projectName = null; protected PDOM pdom; - + protected ICProject cproject; + public static Test suite() { return suite(DefDeclTests.class); } protected void setUp() throws Exception { String requiredName = "defDeclTests"; - ICProject cproject = createProject(requiredName); + cproject = createProject(requiredName); this.projectName = cproject.getElementName(); pdom = (PDOM) CCoreInternals.getPDOMManager().getPDOM(cproject); pdom.acquireReadLock(); @@ -59,6 +61,9 @@ public class DefDeclTests extends PDOMTestBase { protected void tearDown() throws Exception { pdom.releaseReadLock(); + if (cproject != null) { + cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); + } } private IBinding findSingleBinding(String elName) throws CoreException { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/FilesOnReindexTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/FilesOnReindexTests.java index 9fbec96994b..243343bfbdc 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/FilesOnReindexTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/FilesOnReindexTests.java @@ -23,6 +23,7 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; @@ -48,6 +49,9 @@ public class FilesOnReindexTests extends PDOMTestBase { protected void tearDown() throws Exception { pdom.releaseReadLock(); + if (project != null) { + project.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); + } } public void testFilesOnReindex() throws CoreException, InterruptedException { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexCBindingResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexCBindingResolutionTest.java index d7f7291e862..ccab235f22e 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexCBindingResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IndexCBindingResolutionTest.java @@ -42,43 +42,41 @@ public class IndexCBindingResolutionTest extends IndexBindingResolutionTestBase // // header file // struct S {}; union U {}; enum E {ER1,ER2,ER3}; - // int var1; C var2; S *var3; void func1(E); void func2(S); + // int var1; S var2; S *var3; void func1(E); void func2(S); // typedef int Int; typedef int *IntPtr; + // void func3(int** ppi); void func4(int); // // referencing file // #include "header.h" // void references() { // struct S s; /*s*/ union U u; /*u*/ E e; /*e*/ - // var1 = 1; /*var1*/ var2 = c; /*var2*/ var3 = &s; /*var3*/ - // func(e); /*func1*/ func(var1); /*func2*/ func(c); /*func3*/ + // var1 = 1; /*var1*/ var2 = s; /*var2*/ var3 = &s; /*var3*/ + // func1(e); /*func1*/ func1(var1); /*func2*/ func2(s); /*func3*/ // Int a; /*a*/ // IntPtr b = &a; /*b*/ - // func(*b); /*func4*/ func(a); /*func5*/ + // func3(*b); /*func4*/ func4(a); /*func5*/ // } public void testSimpleGlobalBindings() throws IOException { IBinding b2 = getBindingFromASTName("S s;", 1); IBinding b3 = getBindingFromASTName("s;", 1); IBinding b4 = getBindingFromASTName("U u;", 1); IBinding b5 = getBindingFromASTName("u; ", 1); + IBinding b6 = getBindingFromASTName("E e; ", 1); IBinding b7 = getBindingFromASTName("e; ", 1); IBinding b8 = getBindingFromASTName("var1 = 1;", 4); - IBinding b9 = getBindingFromASTName("var2 = c;", 4); + IBinding b9 = getBindingFromASTName("var2 = s;", 4); IBinding b10 = getBindingFromASTName("var3 = &s;", 4); - IBinding b11 = getBindingFromASTName("func(e);", 4); - IBinding b13 = getBindingFromASTName("func(c);", 4); - IBinding b15 = getBindingFromASTName("a; ", 1); - IBinding b17 = getBindingFromASTName("b = &a; /*b*/", 1); - IBinding b19 = getBindingFromASTName("b); /*func4*/", 1); - IBinding b20 = getBindingFromASTName("func(a);", 4); - IBinding b21 = getBindingFromASTName("a); /*func5*/", 1); - } - - public void _testSimpleGlobalBindings() throws IOException { - IBinding b6 = getBindingFromASTName("E e; ", 1); - IBinding b12 = getBindingFromASTName("func1(var1);", 4); + IBinding b11 = getBindingFromASTName("func1(e);", 5); + IBinding b12 = getBindingFromASTName("func1(var1);", 5); + IBinding b13 = getBindingFromASTName("func2(s);", 5); IBinding b14 = getBindingFromASTName("Int a; ", 3); + IBinding b15 = getBindingFromASTName("a; ", 1); IBinding b16 = getBindingFromASTName("IntPtr b = &a; ", 6); - IBinding b18 = getBindingFromASTName("func2(*b);", 4); + IBinding b17 = getBindingFromASTName("b = &a; /*b*/", 1); + IBinding b18 = getBindingFromASTName("func3(*b);", 5); + IBinding b19 = getBindingFromASTName("b); /*func4*/", 1); + IBinding b20 = getBindingFromASTName("func4(a);", 5); + IBinding b21 = getBindingFromASTName("a); /*func5*/", 1); } public void _testEnumeratorInFileScope() {fail("todo");} 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 1e1be2d7692..e362c2329aa 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 @@ -47,33 +47,34 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas // // header file // class C { // public: - // int field; - // struct CS { long* l; C *method(CS *); }; - // CS cs; - // long * CS::* ouch; - // long * CS::* autsch; - // C * CS:: method(CS *); + // int field; + // struct CS { long* l; C *method(CS **); }; + // CS cs; + // CS **cspp; + // long * CS::* ouch; + // long * CS::* autsch; + // C * CS::* method(CS **); // }; // // referencing file // #include "header.h" // void references() { - // C *cp = new C(); - // long l = 5, *lp; - // lp = &l; - // cp->cs.*cp->ouch = lp = cp->cs.*cp->autsch; - // &(cp->cs)->*cp->autsch = lp = &(cp->cs)->*cp->ouch; - // cp->cs.*method(cp);/*1*/ &(cp->cs)->*method(cp);/*2*/ + // C *cp = new C(); + // long l = 5, *lp; + // lp = &l; + // cp->cs.*cp->ouch = lp = cp->cs.*cp->autsch; + // &(cp->cs)->*cp->autsch = lp = &(cp->cs)->*cp->ouch; + // cp->cs.*method(cp->cspp);/*1*/ &(cp->cs)->*method(cp->cspp);/*2*/ // } - public void _testPointerToMemberFields() throws IOException { + public void testPointerToMemberFields() throws IOException { IBinding b0 = getBindingFromASTName("cs.*cp->o", 2); - IBinding b1 = getBindingFromASTName("ouch = lp;", 4); + IBinding b1 = getBindingFromASTName("ouch = lp", 4); IBinding b2 = getBindingFromASTName("autsch;", 6); - IBinding b3 = getBindingFromASTName("cs)->*c->a", 2); + IBinding b3 = getBindingFromASTName("cs)->*cp->a", 2); IBinding b4 = getBindingFromASTName("autsch = lp", 6); IBinding b5 = getBindingFromASTName("ouch;", 4); - IBinding b6 = getBindingFromASTName("method(cp);/*1*/", 6); - IBinding b7 = getBindingFromASTName("method(cp);/*2*/", 6); + IBinding b6 = getBindingFromASTName("method(cp->cspp);/*1*/", 6); + IBinding b7 = getBindingFromASTName("method(cp->cspp);/*2*/", 6); } // // header file @@ -81,7 +82,7 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas // int var1; C var2; S *var3; void func(E); void func(C); // namespace ns {} // typedef int Int; typedef int *IntPtr; - + // void func(int*); void func(int); // // referencing file // #include "header.h" // void references() { @@ -94,7 +95,6 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas // } // class C2 : public C {}; /*base*/ // struct S2 : public S {}; /*base*/ - // union U2 : public U {}; /*base*/ public void testSimpleGlobalBindings() throws IOException { IBinding b0 = getBindingFromASTName("C c; ", 1); IBinding b1 = getBindingFromASTName("c; ", 1); @@ -102,32 +102,26 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas IBinding b3 = getBindingFromASTName("s;", 1); IBinding b4 = getBindingFromASTName("U u;", 1); IBinding b5 = getBindingFromASTName("u; ", 1); + IBinding b6 = getBindingFromASTName("E e; ", 1); IBinding b7 = getBindingFromASTName("e; ", 1); IBinding b8 = getBindingFromASTName("var1 = 1;", 4); IBinding b9 = getBindingFromASTName("var2 = c;", 4); IBinding b10 = getBindingFromASTName("var3 = &s;", 4); IBinding b11 = getBindingFromASTName("func(e);", 4); + IBinding b12 = getBindingFromASTName("func(var1);", 4); IBinding b13 = getBindingFromASTName("func(c);", 4); + IBinding b14 = getBindingFromASTName("Int a; ", 3); IBinding b15 = getBindingFromASTName("a; ", 1); + IBinding b16 = getBindingFromASTName("IntPtr b = &a; ", 6); IBinding b17 = getBindingFromASTName("b = &a; /*b*/", 1); + IBinding b18 = getBindingFromASTName("func(*b);", 4); IBinding b19 = getBindingFromASTName("b); /*func4*/", 1); IBinding b20 = getBindingFromASTName("func(a);", 4); IBinding b21 = getBindingFromASTName("a); /*func5*/", 1); IBinding b22 = getBindingFromASTName("C2 : public", 2); - IBinding b24 = getBindingFromASTName("S2 : public", 2); - IBinding b26 = getBindingFromASTName("U2 : public", 2); - } - - public void _testSimpleGlobalBindings() throws IOException { - /* note the test data from above follows through to this test */ - IBinding b6 = getBindingFromASTName("E e; ", 1); - IBinding b12 = getBindingFromASTName("func(var1);", 4); - IBinding b14 = getBindingFromASTName("Int a; ", 3); - IBinding b16 = getBindingFromASTName("IntPtr b = &a; ", 6); - IBinding b18 = getBindingFromASTName("func(*b);", 4); IBinding b23 = getBindingFromASTName("C {}; /*base*/", 1); - IBinding b25 = getBindingFromASTName("S {}; /*base*/", 1); - IBinding b27 = getBindingFromASTName("U {}; /*base*/", 1); + IBinding b24 = getBindingFromASTName("S2 : public", 2); + IBinding b25 = getBindingFromASTName("S {}; /*base*/", 1); } @@ -148,7 +142,7 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas // } // }; //} - public void _testSingletonQualifiedName() { + public void testSingletonQualifiedName() { IBinding b0 = getBindingFromASTName("TopC c", 4); IBinding b1 = getBindingFromASTName("TopS s", 4); IBinding b2 = getBindingFromASTName("TopU u", 4); @@ -169,98 +163,98 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas // // header content // namespace n1 { namespace n2 { struct S {}; } } - // class c1 { class c2 { struct S {}; }; + // class c1 { public: class c2 { public: struct S {}; }; }; // struct s1 { struct s2 { struct S {}; }; }; // union u1 { struct u2 { struct S {}; }; }; - // namespace n3 { class c3 { struct s3 { union u3 { struct S {}; }; }; }; } + // namespace n3 { class c3 { public: struct s3 { union u3 { struct S {}; }; }; }; } // // reference content // void reference() { - // ::n1::n2::S s0; n1::n2::S s1; - // ::c1::c2::S s2; c1::c2::S s3; - // ::s1::s2::S s4; s1::s2::S s5; - // ::u1::u2::S s6; u1::u2::S s7; - // ::n3::c3::s3::u3::S s8; - // n3::c3::s3::u3::S s9; + // ::n1::n2::S _s0; n1::n2::S _s1; + // ::c1::c2::S _s2; c1::c2::S _s3; + // ::s1::s2::S _s4; s1::s2::S _s5; + // ::u1::u2::S _s6; u1::u2::S _s7; + // ::n3::c3::s3::u3::S _s8; + // n3::c3::s3::u3::S _s9; // } - // namespace n3 { c3::s3::u3::S s10; } - // namespace n1 { n2::S s11; } - // namespace n1 { namespace n2 { S s12; }} - public void _testQualifiedNamesForStruct() throws DOMException { - IBinding b0 = getBindingFromASTName("S s0;", 1); + // namespace n3 { c3::s3::u3::S _s10; } + // namespace n1 { n2::S _s11; } + // namespace n1 { namespace n2 { S _s12; }} + public void testQualifiedNamesForStruct() throws DOMException { + IBinding b0 = getBindingFromASTName("S _s0;", 1); assertQNEquals("n1::n2::S", b0); - IBinding b1 = getBindingFromASTName("S s1;", 1); + IBinding b1 = getBindingFromASTName("S _s1;", 1); assertQNEquals("n1::n2::S", b1); - IBinding b2 = getBindingFromASTName("S s2;", 1); + IBinding b2 = getBindingFromASTName("S _s2;", 1); assertQNEquals("c1::c2::S", b2); - IBinding b3 = getBindingFromASTName("S s3;", 1); + IBinding b3 = getBindingFromASTName("S _s3;", 1); assertQNEquals("c1::c2::S", b3); - IBinding b4 = getBindingFromASTName("S s4;", 1); + IBinding b4 = getBindingFromASTName("S _s4;", 1); assertQNEquals("s1::s2::S", b4); - IBinding b5 = getBindingFromASTName("S s5;", 1); + IBinding b5 = getBindingFromASTName("S _s5;", 1); assertQNEquals("s1::s2::S", b5); - IBinding b6 = getBindingFromASTName("S s6;", 1); + IBinding b6 = getBindingFromASTName("S _s6;", 1); assertQNEquals("u1::u2::S", b6); - IBinding b7 = getBindingFromASTName("S s7;", 1); + IBinding b7 = getBindingFromASTName("S _s7;", 1); assertQNEquals("u1::u2::S", b7); - IBinding b8 = getBindingFromASTName("S s8;", 1); + IBinding b8 = getBindingFromASTName("S _s8;", 1); assertQNEquals("n3::c3::s3::u3::S", b8); - IBinding b9 = getBindingFromASTName("S s9;", 1); + IBinding b9 = getBindingFromASTName("S _s9;", 1); assertQNEquals("n3::c3::s3::u3::S", b9); - IBinding b10 = getBindingFromASTName("S s10;", 1); + IBinding b10 = getBindingFromASTName("S _s10;", 1); assertQNEquals("n3::c3::s3::u3::S", b10); - IBinding b11 = getBindingFromASTName("S s11;", 1); + IBinding b11 = getBindingFromASTName("S _s11;", 1); assertQNEquals("n1::n2::S", b11); - IBinding b12 = getBindingFromASTName("S s12;", 1); + IBinding b12 = getBindingFromASTName("S _s12;", 1); assertQNEquals("n1::n2::S", b12); } // // header content // namespace n1 { namespace n2 { union U {}; } } - // class c1 { class c2 { union U {}; }; + // class c1 { public: class c2 { public: union U {}; }; }; // struct s1 { struct s2 { union U {}; }; }; // union u1 { struct u2 { union U {}; }; }; - // namespace n3 { class c3 { struct s3 { union u3 { union U {}; }; }; }; } + // namespace n3 { class c3 { public: struct s3 { union u3 { union U {}; }; }; }; } // // reference content // void reference() { - // ::n1::n2::U u0; n1::n2::U u1; - // ::c1::c2::U u2; c1::c2::U u3; - // ::s1::s2::U u4; s1::s2::U u5; - // ::u1::u2::U u6; u1::u2::U u7; - // ::n3::c3::s3::u3::U u8; - // n3::c3::s3::u3::U u9; + // ::n1::n2::U _u0; n1::n2::U _u1; + // ::c1::c2::U _u2; c1::c2::U _u3; + // ::s1::s2::U _u4; s1::s2::U _u5; + // ::u1::u2::U _u6; u1::u2::U _u7; + // ::n3::c3::s3::u3::U _u8; + // n3::c3::s3::u3::U _u9; // } - // namespace n3 { c3::s3::u3::U u10; } - // namespace n1 { n2::U u11; } - // namespace n1 { namespace n2 { U u12; }} - public void _testQualifiedNamesForUnion() throws DOMException { - IBinding b0 = getBindingFromASTName("S s0;", 1); - assertQNEquals("n1::n2::S", b0); - IBinding b1 = getBindingFromASTName("S s1;", 1); - assertQNEquals("n1::n2::S", b1); - IBinding b2 = getBindingFromASTName("S s2;", 1); - assertQNEquals("c1::c2::S", b2); - IBinding b3 = getBindingFromASTName("S s3;", 1); - assertQNEquals("c1::c2::S", b3); - IBinding b4 = getBindingFromASTName("S s4;", 1); - assertQNEquals("s1::s2::S", b4); - IBinding b5 = getBindingFromASTName("S s5;", 1); - assertQNEquals("s1::s2::S", b5); - IBinding b6 = getBindingFromASTName("S s6;", 1); - assertQNEquals("u1::u2::S", b6); - IBinding b7 = getBindingFromASTName("S s7;", 1); - assertQNEquals("u1::u2::S", b7); - IBinding b8 = getBindingFromASTName("S s8;", 1); - assertQNEquals("n3::c3::s3::u3::S", b8); - IBinding b9 = getBindingFromASTName("S s9;", 1); - assertQNEquals("n3::c3::s3::u3::S", b9); - IBinding b10 = getBindingFromASTName("S s10;", 1); - assertQNEquals("n3::c3::s3::u3::S", b10); - IBinding b11 = getBindingFromASTName("S s11;", 1); - assertQNEquals("n1::n2::S", b11); - IBinding b12 = getBindingFromASTName("C s12;", 1); - assertQNEquals("n1::n2::S", b12); + // namespace n3 { c3::s3::u3::U _u10; } + // namespace n1 { n2::U _u11; } + // namespace n1 { namespace n2 { U _u12; }} + public void testQualifiedNamesForUnion() throws DOMException { + IBinding b0 = getBindingFromASTName("U _u0;", 1); + assertQNEquals("n1::n2::U", b0); + IBinding b1 = getBindingFromASTName("U _u1;", 1); + assertQNEquals("n1::n2::U", b1); + IBinding b2 = getBindingFromASTName("U _u2;", 1); + assertQNEquals("c1::c2::U", b2); + IBinding b3 = getBindingFromASTName("U _u3;", 1); + assertQNEquals("c1::c2::U", b3); + IBinding b4 = getBindingFromASTName("U _u4;", 1); + assertQNEquals("s1::s2::U", b4); + IBinding b5 = getBindingFromASTName("U _u5;", 1); + assertQNEquals("s1::s2::U", b5); + IBinding b6 = getBindingFromASTName("U _u6;", 1); + assertQNEquals("u1::u2::U", b6); + IBinding b7 = getBindingFromASTName("U _u7;", 1); + assertQNEquals("u1::u2::U", b7); + IBinding b8 = getBindingFromASTName("U _u8;", 1); + assertQNEquals("n3::c3::s3::u3::U", b8); + IBinding b9 = getBindingFromASTName("U _u9;", 1); + assertQNEquals("n3::c3::s3::u3::U", b9); + IBinding b10 = getBindingFromASTName("U _u10;", 1); + assertQNEquals("n3::c3::s3::u3::U", b10); + IBinding b11 = getBindingFromASTName("U _u11;", 1); + assertQNEquals("n1::n2::U", b11); + IBinding b12 = getBindingFromASTName("U _u12;", 1); + assertQNEquals("n1::n2::U", b12); } // // header content @@ -269,45 +263,45 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas // struct s1 { struct s2 { class C {}; }; }; // union u1 { union u2 { class C {}; }; }; // namespace n3 { class c3 { public: struct s3 { union u3 { class C {}; }; }; }; } - // + // // reference content // void reference() { - // ::n1::n2::C c0; n1::n2::C c1; - // ::c1::c2::C c2; c1::c2::C c3; - // ::s1::s2::C c4; s1::s2::C c5; - // ::u1::u2::C c6; u1::u2::C c7; - // ::n3::c3::s3::u3::C c8; - // n3::c3::s3::u3::C c9; + // ::n1::n2::C _c0; n1::n2::C _c1; + // ::c1::c2::C _c2; c1::c2::C _c3; + // ::s1::s2::C _c4; s1::s2::C _c5; + // ::u1::u2::C _c6; u1::u2::C _c7; + // ::n3::c3::s3::u3::C _c8; + // n3::c3::s3::u3::C _c9; // } - // namespace n3 { c3::s3::u3::C c10; } - // namespace n1 { n2::C c11; } - // namespace n1 { namespace n2 { C c12; }} - public void _testQualifiedNamesForClass() throws DOMException { - IBinding b0 = getBindingFromASTName("C c0;", 1); + // namespace n3 { c3::s3::u3::C _c10; } + // namespace n1 { n2::C _c11; } + // namespace n1 { namespace n2 { C _c12; }} + public void testQualifiedNamesForClass() throws DOMException { + IBinding b0 = getBindingFromASTName("C _c0;", 1); assertQNEquals("n1::n2::C", b0); - IBinding b1 = getBindingFromASTName("C c1;", 1); + IBinding b1 = getBindingFromASTName("C _c1;", 1); assertQNEquals("n1::n2::C", b1); - IBinding b2 = getBindingFromASTName("C c2;", 1); + IBinding b2 = getBindingFromASTName("C _c2;", 1); assertQNEquals("c1::c2::C", b2); - IBinding b3 = getBindingFromASTName("C c3;", 1); + IBinding b3 = getBindingFromASTName("C _c3;", 1); assertQNEquals("c1::c2::C", b3); - IBinding b4 = getBindingFromASTName("C c4;", 1); + IBinding b4 = getBindingFromASTName("C _c4;", 1); assertQNEquals("s1::s2::C", b4); - IBinding b5 = getBindingFromASTName("C c5;", 1); + IBinding b5 = getBindingFromASTName("C _c5;", 1); assertQNEquals("s1::s2::C", b5); - IBinding b6 = getBindingFromASTName("C c6;", 1); + IBinding b6 = getBindingFromASTName("C _c6;", 1); assertQNEquals("u1::u2::C", b6); - IBinding b7 = getBindingFromASTName("C c7;", 1); + IBinding b7 = getBindingFromASTName("C _c7;", 1); assertQNEquals("u1::u2::C", b7); - IBinding b8 = getBindingFromASTName("C c8;", 1); + IBinding b8 = getBindingFromASTName("C _c8;", 1); assertQNEquals("n3::c3::s3::u3::C", b8); - IBinding b9 = getBindingFromASTName("C c9;", 1); + IBinding b9 = getBindingFromASTName("C _c9;", 1); assertQNEquals("n3::c3::s3::u3::C", b9); - IBinding b10 = getBindingFromASTName("C c10;", 1); + IBinding b10 = getBindingFromASTName("C _c10;", 1); assertQNEquals("n3::c3::s3::u3::C", b10); - IBinding b11 = getBindingFromASTName("C c11;", 1); + IBinding b11 = getBindingFromASTName("C _c11;", 1); assertQNEquals("n1::n2::C", b11); - IBinding b12 = getBindingFromASTName("C c12;", 1); + IBinding b12 = getBindingFromASTName("C _c12;", 1); assertQNEquals("n1::n2::C", b12); } @@ -389,10 +383,10 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas // void m1() { e1 = ER1; } // static void m2() { e2 = ER2; } // }; - public void _testEnumeratorInStructScope() { + public void testEnumeratorInStructScope() { IBinding b0 = getBindingFromASTName("E e1", 1); - IBinding b1 = getBindingFromASTName("ER1; }", 1); - IBinding b2 = getBindingFromASTName("ER2; }", 1); + IBinding b1 = getBindingFromASTName("ER1; }", 3); + IBinding b2 = getBindingFromASTName("ER2; }", 3); } // // header content @@ -405,10 +399,10 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas // void m1() { e1 = ER1; } // static void m2() { e2 = ER2; } // }; - public void _testEnumeratorInUnionScope() { + public void testEnumeratorInUnionScope() { IBinding b0 = getBindingFromASTName("E e1", 1); - IBinding b1 = getBindingFromASTName("ER1; }", 1); - IBinding b2 = getBindingFromASTName("ER2; }", 1); + IBinding b1 = getBindingFromASTName("ER1; }", 3); + IBinding b2 = getBindingFromASTName("ER2; }", 3); } // // header content @@ -421,10 +415,10 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas // void f1() { e1 = ER1; } // static void f2() { e2 = ER2; } // }; - public void _testEnumeratorInNamespaceScope() { + public void testEnumeratorInNamespaceScope() { IBinding b0 = getBindingFromASTName("E e1", 1); - IBinding b1 = getBindingFromASTName("ER1; }", 1); - IBinding b2 = getBindingFromASTName("ER2; }", 1); + IBinding b1 = getBindingFromASTName("ER1; }", 3); + IBinding b2 = getBindingFromASTName("ER2; }", 3); } // // teh header @@ -537,13 +531,14 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas // // header file - // class C {C* cp;}; + // class C {public: C* cp;}; // C foo(C c); // C* foo(C* c); // int foo(int i); // int foo(int i, C c); // // referencing content + // #include "header.h" // void references() { // C c, *cp; // foo/*a*/(cp[1]); // IASTArraySubscriptExpression @@ -653,7 +648,7 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas // fni4 = &f;/*20*/ fnlp4 = &f;/*21*/ fnS4 = &f;/*22*/ fnU4 = &f;/*23*/ fnE4 = &f;/*24*/ // fE = &f;/*25*/ // } - public void _testAddressOfOverloadedFunction() throws DOMException { + public void testAddressOfOverloadedFunction() throws DOMException { IBinding b0 = getBindingFromASTName("f;/*0*/", 1); IBinding b1 = getBindingFromASTName("f;/*1*/", 1); IBinding b2 = getBindingFromASTName("f;/*2*/", 1); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/MethodTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/MethodTests.java index e38d6e50e94..ea5e4227dfd 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/MethodTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/MethodTests.java @@ -24,6 +24,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.NullProgressMonitor; /** * Tests for verifying whether the PDOM correctly stores information about @@ -45,6 +47,9 @@ public class MethodTests extends PDOMTestBase { protected void tearDown() throws Exception { pdom.releaseReadLock(); + if (project != null) { + project.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); + } } public void testMethodParameters() throws Exception { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/NamespaceTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/NamespaceTests.java index 5f753ed21a1..e6fe63ac165 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/NamespaceTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/NamespaceTests.java @@ -27,6 +27,7 @@ import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; @@ -48,7 +49,7 @@ public class NamespaceTests extends PDOMTestBase { protected void setUp() throws Exception { if (pdom == null) { - ICProject project = createProject("namespaceTests", true); + project = createProject("namespaceTests", true); pdom = (PDOM)CCoreInternals.getPDOMManager().getPDOM(project); } pdom.acquireReadLock(); @@ -56,6 +57,9 @@ public class NamespaceTests extends PDOMTestBase { protected void tearDown() throws Exception { pdom.releaseReadLock(); + if (project != null) { + project.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); + } } public void _testAlias() throws Exception { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/OverloadsWithinCommonHeaderTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/OverloadsWithinCommonHeaderTests.java index 6aa016b1608..bb4ba73356a 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/OverloadsWithinCommonHeaderTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/OverloadsWithinCommonHeaderTests.java @@ -50,8 +50,6 @@ public class OverloadsWithinCommonHeaderTests extends PDOMTestBase { pdom.releaseReadLock(); } - public void testDummy() {} - public void testOverloadedInCommonHeader_ClassScope() throws CoreException { Pattern[] ManyOverloadedQuxPath = makePatternArray(new String[] {"ManyOverloaded","qux"}); IBinding[] ManyOverloadedQux = pdom.findBindings(ManyOverloadedQuxPath, new NullProgressMonitor()); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTestBase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTestBase.java index 80d735ecec2..a34ddd6606b 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTestBase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTestBase.java @@ -28,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember; +import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.testplugin.CProjectHelper; @@ -185,7 +186,7 @@ public class PDOMTestBase extends BaseTestCase { public static final void assertFunctionRefCount(PDOM pdom, Class[] args, IBinding[] bindingPool, int refCount) throws CoreException { IBinding[] bindings = findIFunctions(args, bindingPool); assertEquals(1, bindings.length); - IName[] refs = pdom.getReferences(bindings[0]); + IName[] refs = pdom.findNames(bindings[0], IIndex.FIND_REFERENCES); assertEquals(refCount, refs.length); } diff --git a/core/org.eclipse.cdt.core.tests/resources/pdomtests/overloadsWithinCommonHeader/class.h b/core/org.eclipse.cdt.core.tests/resources/pdomtests/overloadsWithinCommonHeader/class.h deleted file mode 100644 index 7d6e5b7f207..00000000000 --- a/core/org.eclipse.cdt.core.tests/resources/pdomtests/overloadsWithinCommonHeader/class.h +++ /dev/null @@ -1,23 +0,0 @@ -class ManyOverloaded { -public: - void qux() {} - void qux(int i) {} - void qux(int i, char c) {} - void qux(ManyOverloaded* ptr) {} - void qux(ManyOverloaded nptr) {} -}; - -void quux() {} -void quux(int i) {} -void quux(int i, char c) {} -void quux(ManyOverloaded* ptr) {} -void quux(ManyOverloaded nptr) {} - - -namespace corge { - void grault() {} - void grault(int i) {} - void grault(int i, char c) {} - void grault(ManyOverloaded* ptr) {} - void grault(ManyOverloaded nptr) {} -} 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 3eb39fcf56e..5a166d73e50 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 @@ -16,6 +16,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICBasicType; import org.eclipse.cdt.core.dom.ast.c.ICPointerType; import org.eclipse.cdt.core.dom.ast.c.ICQualifierType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; @@ -196,7 +197,16 @@ public class ASTTypeUtil { // } // } catch (DOMException e) {} // result.append(SPACE); - result.append(((ICompositeType)type).getName()); + if(type instanceof ICPPClassType) { + try { + String qn = CPPVisitor.renderQualifiedName(((ICPPClassType)type).getQualifiedName()); + result.append(qn); + } catch(DOMException de) { + result.append(((ICompositeType)type).getName()); + } + } else { + result.append(((ICompositeType)type).getName()); + } } else if (type instanceof ICPPReferenceType) { result.append(Keywords.cpAMPER); } else if (type instanceof ICPPTemplateTypeParameter) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ArrayUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ArrayUtil.java index 44efa9ce25c..2e99007fc99 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ArrayUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/ArrayUtil.java @@ -185,11 +185,34 @@ public class ArrayUtil { return temp; } + /** + * Returns whether the specified array contains the specified object. Comparison is by + * object identity. + * @param array the array to search + * @param obj the object to search for + * @return true if the specified array contains the specified object, or the specified array is null + */ public static boolean contains( Object [] array, Object obj ){ - if( array == null ) return false; - for( int i = 0; i < array.length; i++ ) - if( array[i] == obj ) return true; - return false; + return indexOf(array, obj)!=-1; + } + + /** + * Returns the index into the specified array of the specified object, or -1 if the array does not + * contain the object, or if the array is null. Comparison is by object identity. + * @param array the array to search + * @param obj the object to search for + * @return the index into the specified array of the specified object, or -1 if the array does not + * contain the object, or if the array is null + */ + public static int indexOf(Object[] array, Object obj) { + int result = -1; + if(array!=null) { + for(int i=0; i0) { + // make sure we're the class they're talking about + PDOMBinding binding = (PDOMBinding) pdom.findBinding(names[index-1]); + if(!equals(binding)) { + return null; + } + } else { + // ok - just search us and return null if there is nothing in here + } + } + } + + 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 + } + } + + 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); + } + } + } 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(); + } + } 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); + } + } + } 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); + } + } + } + } catch(CoreException e) { + CCorePlugin.log(e); + return null; + } + return null; } - public IScope getParent() throws DOMException { - return null; - } - // Not implemented - + public Object clone() {fail();return null;} public IField findField(String name) throws DOMException {fail();return null;} public IBinding[] getFriends() throws DOMException {fail();return null;} public ICPPMethod[] getImplicitMethods() {fail(); return null;} public IBinding[] find(String name) throws DOMException {fail();return null;} public ICPPField[] getDeclaredFields() throws DOMException {fail();return null;} - - public IScope getScope() throws DOMException { + + public IScope getParent() throws DOMException { try { - return (IScope)getParentNode(); + IBinding parent = getParentBinding(); + if(parent instanceof IScope) { + return (IScope) parent; + } } catch(CoreException ce) { CCorePlugin.log(ce); - return null; } + + return null; } - + public boolean mayHaveChildren() { return true; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPField.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPField.java index 15f991ae5c9..7d19530a95a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPField.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPField.java @@ -14,53 +14,32 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; -import org.eclipse.cdt.internal.core.Util; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; import org.eclipse.cdt.internal.core.pdom.PDOM; -import org.eclipse.cdt.internal.core.pdom.db.Database; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; -import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCAnnotation; import org.eclipse.core.runtime.CoreException; /** * @author Doug Schaefer * */ -class PDOMCPPField extends PDOMCPPBinding implements ICPPField { - - /** - * Offset of annotation information (relative to the beginning of the - * record). - */ - private static final int ANNOTATION = PDOMBinding.RECORD_SIZE + 0; // byte - - /** - * The size in bytes of a PDOMCPPField record in the database. - */ - protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 1; +class PDOMCPPField extends PDOMCPPVariable implements ICPPField { public PDOMCPPField(PDOM pdom, PDOMCPPClassType parent, ICPPField field) throws CoreException { - super(pdom, parent, field.getNameCharArray()); - try { - Database db = pdom.getDB(); - db.putByte(record + ANNOTATION, PDOMCPPAnnotation.encodeAnnotation(field)); - } catch (DOMException e) { - throw new CoreException(Util.createStatus(e)); - } + super(pdom, parent, field); } public PDOMCPPField(PDOM pdom, int bindingRecord) { super(pdom, bindingRecord); } + // @Override protected int getRecordSize() { return RECORD_SIZE; } + // @Override public int getNodeType() { return PDOMCPPLinkage.CPPFIELD; } @@ -73,41 +52,31 @@ class PDOMCPPField extends PDOMCPPBinding implements ICPPField { return null; } } - - public String[] getQualifiedName() throws DOMException { - return CPPVisitor.getQualifiedName( this ); - } public int getVisibility() throws DOMException { - return PDOMCPPAnnotation.getVisibility(getByte(record + ANNOTATION)); + return PDOMCPPAnnotation.getVisibility(getByte(record + ANNOTATIONS)); } + // @Override public boolean isMutable() throws DOMException { - return getBit(getByte(record + ANNOTATION), PDOMCPPAnnotation.MUTABLE_OFFSET); - } - - public IType getType() throws DOMException { - // TODO - return null; + return getBit(getByte(record + ANNOTATIONS), PDOMCPPAnnotation.MUTABLE_OFFSET); } + // @Override public boolean isAuto() throws DOMException { // ISO/IEC 14882:2003 9.2.6 return false; } + // @Override public boolean isExtern() throws DOMException { // ISO/IEC 14882:2003 9.2.6 return false; } + // @Override public boolean isRegister() throws DOMException { // ISO/IEC 14882:2003 9.2.6 return false; } - - public boolean isStatic() throws DOMException { - return getBit(getByte(record + ANNOTATION), PDOMCAnnotation.STATIC_OFFSET); - } - } 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 94f392a5336..c449423a04a 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 @@ -13,24 +13,29 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpressionList; import org.eclipse.cdt.core.dom.ast.IASTFieldReference; import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; -import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; 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.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IEnumerator; +import org.eclipse.cdt.core.dom.ast.IFunctionType; 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.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldReference; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias; @@ -43,19 +48,21 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; 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.ICPPNamespaceAlias; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; import org.eclipse.cdt.core.model.ILanguage; +import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.bid.IBindingIdentityFactory; import org.eclipse.cdt.internal.core.dom.bid.ILocalBindingIdentity; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTIdExpression; +import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBlockScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPImplicitMethod; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVariable; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPSemantics; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.dom.FindBindingByLinkageConstant; import org.eclipse.cdt.internal.core.pdom.dom.FindEquivalentBinding; @@ -65,6 +72,7 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Status; @@ -123,9 +131,10 @@ class PDOMCPPLinkage extends PDOMLinkage { IBinding binding = name.resolveBinding(); - if (binding == null || binding instanceof IProblemBinding) + if (binding == null || binding instanceof IProblemBinding) { // Can't tell what it is return null; + } if (binding instanceof IParameter) // Skip parameters (TODO and others I'm sure) @@ -288,6 +297,7 @@ class PDOMCPPLinkage extends PDOMLinkage { private PDOMBinding _resolveBinding(IASTName name) throws CoreException, DOMException { // mstodo revisit + IBinding origBinding = name.getBinding(); if (origBinding != null) return adaptBinding(origBinding); @@ -298,6 +308,7 @@ class PDOMCPPLinkage extends PDOMLinkage { return resolveBinding(names[0]); IASTName lastName = names[names.length - 1]; PDOMBinding nsBinding = adaptBinding(names[names.length - 2].resolveBinding()); + // aftodo - namespace aliases? if (nsBinding instanceof IScope) { return (PDOMBinding) ((IScope)nsBinding).getBinding(lastName, true); } @@ -319,21 +330,68 @@ class PDOMCPPLinkage extends PDOMLinkage { // reference IASTNode eParent = parent.getParent(); if (eParent instanceof IASTFunctionCallExpression) { - if(parent.getPropertyInParent().equals(IASTFunctionCallExpression.FUNCTION_NAME)) { - return resolveFunctionCall((IASTFunctionCallExpression) eParent, (IASTIdExpression) parent, name); + if (parent.getPropertyInParent().equals(IASTFunctionCallExpression.FUNCTION_NAME)) { + return resolveFunctionCall( + (IASTFunctionCallExpression) eParent, + (IASTIdExpression) parent, name); + } else if (parent.getPropertyInParent().equals(IASTFunctionCallExpression.PARAMETERS)) { + int constant = (name.getParent() instanceof ICPPASTQualifiedName + && ((ICPPASTQualifiedName) name.getParent()).getLastName() != name) + ? CPPNAMESPACE : CPPVARIABLE; + FindBindingByLinkageConstant finder = new FindBindingByLinkageConstant( + this, name.toCharArray(), constant); + getIndex().accept(finder); + return finder.getResult(); } } else { - int constant = (name.getParent() instanceof ICPPASTQualifiedName - && ((ICPPASTQualifiedName)name.getParent()).getLastName() != name) - ? CPPNAMESPACE : CPPVARIABLE; - FindBindingByLinkageConstant finder = new FindBindingByLinkageConstant(this, name.toCharArray(), constant); + // if the address of me is taken, and assigned to something, + // find out the type of the thing I'm assigned to + if (eParent instanceof IASTUnaryExpression) { + IASTUnaryExpression unaryExp = (IASTUnaryExpression) eParent; + if (unaryExp.getOperator() == IASTUnaryExpression.op_amper) { + IASTNode epParent = eParent.getParent(); + if (epParent instanceof IASTBinaryExpression) { + if (((IASTBinaryExpression) epParent).getOperator() == IASTBinaryExpression.op_assign) { + IASTExpression left = ((IASTBinaryExpression) epParent).getOperand1(); + IType type = CPPSemantics.getUltimateType(left.getExpressionType(), false); + if (type instanceof IFunctionType) { + ILocalBindingIdentity lbi = new CPPBindingIdentity.Holder( + new String(name.toCharArray()), + CPPFUNCTION, + ((IFunctionType) type).getParameterTypes()); + FindEquivalentBinding feb = new FindEquivalentBinding(this, lbi); + getIndex().accept(feb); + return feb.getResult(); + } + } + } + } + } + + FindBindingByLinkageConstant finder = new FindBindingByLinkageConstant(this, name.toCharArray(), CPPVARIABLE); getIndex().accept(finder); + + if (finder.getResult() == null) { + finder = new FindBindingByLinkageConstant(this, name + .toCharArray(), CPPENUMERATOR); + getIndex().accept(finder); + } return finder.getResult(); } } else if (parent instanceof IASTNamedTypeSpecifier) { FindBindingByLinkageConstant finder = new FindBindingByLinkageConstant(this, name.toCharArray(), CPPCLASSTYPE); getIndex().accept(finder); PDOMBinding result = finder.getResult(); + if(result==null) { + finder = new FindBindingByLinkageConstant(this, name.toCharArray(), CPPENUMERATION); + getIndex().accept(finder); + result = finder.getResult(); + } + if(result==null) { + finder = new FindBindingByLinkageConstant(this, name.toCharArray(), CPPTYPEDEF); + getIndex().accept(finder); + result = finder.getResult(); + } return result; } else if (parent instanceof ICPPASTNamespaceAlias) { FindBindingByLinkageConstant finder = new FindBindingByLinkageConstant(this, name.toCharArray(), CPPNAMESPACE); @@ -349,8 +407,31 @@ class PDOMCPPLinkage extends PDOMLinkage { if(name.getPropertyInParent().equals(IASTFieldReference.FIELD_NAME)) { return resolveFunctionCall((IASTFunctionCallExpression) eParent, fieldOwner, name); } + } else { + IBinding fieldOwnerBinding = fieldOwner.getName().getBinding(); + if(fieldOwnerBinding instanceof ICPPVariable) { + IType type = ((ICPPVariable)fieldOwnerBinding).getType(); + if(type instanceof ICompositeType) { + PDOMBinding pdomFOB = adaptBinding( (ICompositeType) type); + FindBindingByLinkageConstant visitor = new FindBindingByLinkageConstant(this, name.toCharArray(), PDOMCPPLinkage.CPPFIELD); + try { + ((PDOMBinding)pdomFOB).accept(visitor); + } catch (CoreException e) { + if (e.getStatus().equals(Status.OK_STATUS)) { + return visitor.getResult(); + } + else { + throw e; + } + } + } + } } } + } else if(parent instanceof ICPPASTBaseSpecifier) { + FindBindingByLinkageConstant finder = new FindBindingByLinkageConstant(this, name.toCharArray(), CPPCLASSTYPE); + getIndex().accept(finder); + return finder.getResult(); } return null; @@ -361,11 +442,17 @@ class PDOMCPPLinkage extends PDOMLinkage { * @param paramExp the parameter expression to get types for (null indicates void function/method) * @return an array of types or null if types could not be determined (because of missing semantic information in the AST) */ - public IType[] getTypes(IASTExpression paramExp) { + public IType[] getTypes(IASTExpression paramExp) throws DOMException { IType[] types = null; if(paramExp==null) { // void function/method types = new IType[0]; + } else if(paramExp instanceof ICPPASTNewExpression) { + // aftodo - I'm not 100% sure why a new expression doesn't + // have a pointer type already + ICPPASTNewExpression exp3 = (ICPPASTNewExpression) paramExp; + IType type = exp3.getExpressionType(); + types = new IType[] {new CPPPointerType(type)}; } else { if(paramExp instanceof IASTExpressionList) { IASTExpressionList list = (IASTExpressionList) paramExp; @@ -374,21 +461,22 @@ class PDOMCPPLinkage extends PDOMLinkage { for(int i=0; i0) { + // make sure we're the namespace they're talking about + PDOMBinding binding = (PDOMBinding) pdom.findBinding(names[index-1]); // index == 0 ? + if(binding instanceof PDOMCPPNamespaceAlias) { + // aftodo - this needs a review - do we want to assign to binding + // or just check against this? + binding = (PDOMBinding) ((PDOMCPPNamespaceAlias) binding).getBinding(); + } + if(!equals(binding)) { + return null; + } + } else { + // ok - just search us and return null if there is nothing in here + } + } } - // make sure we're the namespace they're talking about - if (nsname != null && !equals(pdom.findBinding(nsname))) - return null; // Look up the name FindBindingsInBTree visitor = new FindBindingsInBTree(getLinkageImpl(), name.toCharArray(), @@ -167,15 +184,22 @@ class PDOMCPPNamespace extends PDOMCPPBinding } } } else { - FindBindingsInBTree visitor = new FindBindingsInBTree(getLinkageImpl(), name.toCharArray(), - (name.getParent() instanceof ICPPASTQualifiedName - && ((ICPPASTQualifiedName)name.getParent()).getLastName() != name) - ? PDOMCPPLinkage.CPPNAMESPACE : PDOMCPPLinkage.CPPVARIABLE); - getIndex().accept(visitor); - IBinding[] bindings = visitor.getBinding(); - return bindings.length > 0 - ? bindings[0] - : null; + 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; } } else if (parent instanceof IASTNamedTypeSpecifier) { FindBindingsInBTree visitor = new FindBindingsInBTree(getLinkageImpl(), name.toCharArray(), PDOMCPPLinkage.CPPCLASSTYPE); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespaceAlias.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespaceAlias.java index 6684188e31f..8f5937ed506 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespaceAlias.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespaceAlias.java @@ -11,11 +11,13 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceAlias; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.core.runtime.CoreException; @@ -27,9 +29,14 @@ import org.eclipse.core.runtime.CoreException; class PDOMCPPNamespaceAlias extends PDOMCPPBinding implements ICPPNamespaceAlias { + private static final int NAMESPACE_BINDING = PDOMCPPBinding.RECORD_SIZE + 0; + protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 4; + public PDOMCPPNamespaceAlias(PDOM pdom, PDOMNode parent, ICPPNamespaceAlias alias) throws CoreException { super(pdom, parent, alias.getNameCharArray()); + PDOMBinding namespace = getLinkageImpl().adaptBinding(alias.getBinding()); + pdom.getDB().putInt(record + NAMESPACE_BINDING, namespace.getRecord()); } public PDOMCPPNamespaceAlias(PDOM pdom, int record) { @@ -45,7 +52,7 @@ class PDOMCPPNamespaceAlias extends PDOMCPPBinding implements } public ICPPNamespaceScope getNamespaceScope() throws DOMException { - throw new PDOMNotImplementedError(); + return (ICPPNamespaceScope) getBinding(); } public IBinding[] getMemberBindings() throws DOMException { @@ -57,7 +64,12 @@ class PDOMCPPNamespaceAlias extends PDOMCPPBinding implements } public IBinding getBinding() { - throw new PDOMNotImplementedError(); + try { + return (IBinding) getLinkageImpl().getNode(getPDOM().getDB().getInt(record + NAMESPACE_BINDING)); + } catch(CoreException ce) { + CCorePlugin.log(ce); + } + return null; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java index 1a0a47c2de7..0ab13a967d0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java @@ -17,16 +17,16 @@ import org.eclipse.cdt.core.dom.ast.IASTName; 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.dom.parser.ITypeContainer; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.core.runtime.CoreException; /** * @author Doug Schaefer */ -class PDOMCPPTypedef extends PDOMBinding implements ITypedef { +class PDOMCPPTypedef extends PDOMBinding implements ITypedef, ITypeContainer { private static final int TYPE = PDOMBinding.RECORD_SIZE + 0; @@ -67,12 +67,30 @@ class PDOMCPPTypedef extends PDOMBinding implements ITypedef { } } - public boolean isSameType(IType type) { - throw new PDOMNotImplementedError(); + public boolean isSameType(IType o) { + if( o == this ) + return true; + if( o instanceof ITypedef ) + try { + IType t = getType(); + if( t != null ) + return t.isSameType( ((ITypedef)o).getType()); + return false; + } catch ( DOMException e ) { + return false; + } + + try { + IType t = getType(); + if( t != null ) + return t.isSameType( o ); + } catch(DOMException de) { + CCorePlugin.log(de); + } + + return false; } - public Object clone() { - throw new PDOMNotImplementedError(); - } - + public Object clone() { fail(); return null; } + public void setType(IType type) { fail(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java index 35ff906be71..9ef5c4acbc6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java @@ -41,7 +41,7 @@ class PDOMCPPVariable extends PDOMCPPBinding implements ICPPVariable { * Offset of annotation information (relative to the beginning of the * record). */ - private static final int ANNOTATIONS = PDOMBinding.RECORD_SIZE + 4; // byte + protected static final int ANNOTATIONS = PDOMBinding.RECORD_SIZE + 4; // byte /** * The size in bytes of a PDOMCPPVariable record in the database.