From 55dcea05dd0ae8679e539b8888c8b169dfce1552 Mon Sep 17 00:00:00 2001 From: Andrew Ferguson Date: Fri, 2 Feb 2007 20:49:17 +0000 Subject: [PATCH] 172454: additionally distinguish bindings by type constant in btree indices --- .../internal/index/tests/IndexBugsTests.java | 13 +++--- .../tests/IndexCBindingResolutionTest.java | 16 +++++++ .../tests/IndexCPPBindingResolutionTest.java | 16 +++++++ .../internal/core/pdom/dom/FindBinding.java | 20 ++++++++- .../core/pdom/dom/c/PDOMCEnumeration.java | 8 ++-- .../core/pdom/dom/c/PDOMCLinkage.java | 43 ++++++++++--------- .../core/pdom/dom/c/PDOMCStructure.java | 8 ++-- .../core/pdom/dom/cpp/PDOMCPPClassType.java | 8 ++-- .../core/pdom/dom/cpp/PDOMCPPEnumeration.java | 8 ++-- .../core/pdom/indexer/IndexerASTVisitor.java | 7 +++ 10 files changed, 104 insertions(+), 43 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java index 0ec218c3d9e..9a32bfe3f89 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java @@ -399,7 +399,7 @@ public class IndexBugsTests extends BaseTestCase { // typedef struct S20070201 { // int a; // } S20070201; - public void _test172454_1() throws Exception { + public void test172454_1() throws Exception { waitForIndexer(); String content= getContentsForTest(1)[0].toString(); @@ -434,7 +434,7 @@ public class IndexBugsTests extends BaseTestCase { // typedef struct S20070201 { // int a; // } S20070201; - public void _test172454_2() throws Exception { + public void test172454_2() throws Exception { waitForIndexer(); String content= getContentsForTest(1)[0].toString(); @@ -447,7 +447,7 @@ public class IndexBugsTests extends BaseTestCase { assertEquals(2, bindings.length); IBinding struct, typedef; - if (bindings[0] instanceof ICCompositeTypeScope) { + if (bindings[0] instanceof ICPPClassType) { struct= bindings[0]; typedef= bindings[1]; } @@ -456,9 +456,12 @@ public class IndexBugsTests extends BaseTestCase { typedef= bindings[0]; } - assertTrue(struct instanceof ICompositeType); + assertTrue(struct instanceof ICPPClassType); + assertTrue(((ICPPClassType)struct).getKey()==ICompositeType.k_struct); assertTrue(typedef instanceof ITypedef); - assertTrue(((ITypedef) typedef).getType() instanceof ICCompositeTypeScope); + IType aliased = ((ITypedef) typedef).getType(); + assertTrue(aliased instanceof ICPPClassType); + assertTrue(((ICPPClassType)aliased).getKey()==ICompositeType.k_struct); assertTrue(((ITypedef) typedef).isSameType((ICompositeType) struct)); } finally { 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 ccab235f22e..320870d9305 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 @@ -16,6 +16,8 @@ import junit.framework.TestSuite; import org.eclipse.cdt.core.dom.IPDOMManager; 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.testplugin.CProjectHelper; import org.eclipse.core.runtime.Path; @@ -79,6 +81,20 @@ public class IndexCBindingResolutionTest extends IndexBindingResolutionTestBase IBinding b21 = getBindingFromASTName("a); /*func5*/", 1); } + // typedef struct S {int a;} S; + // typedef enum E {A,B} E; + + // struct A { + // S *s; + // E *e; + // }; + public void testTypedef() { + IBinding b1 = getBindingFromASTName("S", 1); + assertTrue(b1 instanceof ICompositeType); + IBinding b2 = getBindingFromASTName("E", 1); + assertTrue(b2 instanceof IEnumeration); + } + public void _testEnumeratorInFileScope() {fail("todo");} public void _testEnumeratorInStructScope() {fail("todo");} public void _testEnumeratorInUnionScope() {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 95666bb1e7e..98a6ac1c427 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 @@ -17,6 +17,7 @@ import junit.framework.TestSuite; import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; @@ -958,4 +959,19 @@ public class IndexCPPBindingResolutionTest extends IndexBindingResolutionTestBas assertEquals(4, index.findNames(binding2, IIndex.FIND_DECLARATIONS).length); } + // typedef struct S {int a;} S; + // typedef enum E {A,B} E; + + // class A { + // public: + // S *s; + // E *e; + // }; + public void testTypedef() { + IBinding b1 = getBindingFromASTName("S", 1); + assertTrue(b1 instanceof ICPPClassType); + IBinding b2 = getBindingFromASTName("E", 1); + assertTrue(b2 instanceof IEnumeration); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/FindBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/FindBinding.java index 2361280e887..be526b3e580 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/FindBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/FindBinding.java @@ -34,7 +34,13 @@ public class FindBinding { public int compare(int record1, int record2) throws CoreException { IString nm1 = PDOMNamedNode.getDBName(pdom, record1); IString nm2 = PDOMNamedNode.getDBName(pdom, record2); - return nm1.compare(nm2); + int cmp = nm1.compare(nm2); + if(cmp == 0) { + int t1 = PDOMNamedNode.getNodeType(pdom, record1); + int t2 = PDOMNamedNode.getNodeType(pdom, record2); + return t1 < t2 ? -1 : (t1 > t2 ? 1 : 0); + } + return cmp; } } @@ -46,7 +52,17 @@ public class FindBinding { return nm1.compare(name); } public boolean visit(int record) throws CoreException { - result[0] = pdom.getBinding(record); + PDOMNamedNode nnode = (PDOMNamedNode) PDOMLinkage.getLinkage(pdom, record).getNode(record); + if(nnode.hasName(name)) { + int constant = nnode.getNodeType(); + for(int i=0; i