From 37f471698abd3c2cc5789702d2c5a11fae6324b6 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 19 May 2010 11:11:07 +0000 Subject: [PATCH] Bug 311164: Correct getDefinitions() for specializations. --- .../parser/tests/ast2/AST2TemplateTests.java | 31 +++++++++++++++++++ .../tests/ast2/DOMSelectionParseTest.java | 24 -------------- .../index/tests/IndexLocationTest.java | 2 +- .../dom/parser/cpp/semantics/CPPVisitor.java | 3 +- .../eclipse/cdt/ui/tests/BaseUITestCase.java | 13 ++++++-- .../selection/CPPSelectionTestsNoIndexer.java | 14 +++++++++ 6 files changed, 57 insertions(+), 30 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 53856abd519..2e9a6752e5a 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -19,6 +19,7 @@ import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUti import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.getUltimateType; import junit.framework.TestSuite; +import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; @@ -4963,4 +4964,34 @@ public class AST2TemplateTests extends AST2BaseTest { final String code= getAboveComment(); parseAndCheckBindings(code); } + + // template class CT {}; + // template<> class CT {}; + // template<> class CT {}; + public void testBug311164() throws Exception { + CPPASTNameBase.sAllowNameComputation= true; + final String code= getAboveComment(); + parseAndCheckBindings(code); + BindingAssertionHelper bh= new BindingAssertionHelper(code, true); + final IASTTranslationUnit tu = bh.getTranslationUnit(); + + IBinding b= bh.assertNonProblem("CT {", 2); + IName[] names = tu.getDeclarationsInAST(b); + assertEquals(1, names.length); + assertEquals("CT", names[0].toString()); + names= tu.getReferences(b); + assertEquals(2, names.length); + assertEquals("CT", names[0].toString()); + assertEquals("CT", names[1].toString()); + + b= bh.assertNonProblem("CT", 0); + names = tu.getDeclarationsInAST(b); + assertEquals(1, names.length); + assertEquals("CT", names[0].toString()); + + b= bh.assertNonProblem("CT", 0); + names = tu.getDeclarationsInAST(b); + assertEquals(1, names.length); + assertEquals("CT", names[0].toString()); + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseTest.java index 1d47a06389b..10749535072 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseTest.java @@ -33,7 +33,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; 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.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; @@ -1728,28 +1727,5 @@ public class DOMSelectionParseTest extends DOMSelectionParseBaseTest { assertEquals(offset, loc.getNodeOffset()); assertEquals(length, loc.getNodeLength()); } - - public void testBug92632() throws Exception - { - StringBuffer buffer = new StringBuffer(); - buffer.append("namespace N{ \n"); //$NON-NLS-1$ - buffer.append(" template < class T > class AAA { T _t; };\n"); //$NON-NLS-1$ - buffer.append("} \n"); //$NON-NLS-1$ - buffer.append("N::AAA a; \n"); //$NON-NLS-1$ - - String code = buffer.toString(); - int index = code.indexOf("AAA"); //$NON-NLS-1$ - IASTNode node = parse( code, index, index + 8, true ); - assertNotNull( node ); - assertTrue( node instanceof IASTName ); - assertTrue( ((IASTName)node).resolveBinding() instanceof ICPPTemplateInstance ); - assertEquals( ((IASTName)node).toString(), "AAA" ); //$NON-NLS-1$ - IName[] decls = getDeclarationOffTU((IASTName)node); - assertEquals(decls.length, 1); - assertEquals( decls[0].toString(), "AAA" ); //$NON-NLS-1$ - assertEquals( ((ASTNode)decls[0]).getOffset(), 53); - assertEquals( ((ASTNode)decls[0]).getLength(), 3); - } - } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexLocationTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexLocationTest.java index 7625241f2c4..41ba5fc97ac 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexLocationTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexLocationTest.java @@ -197,8 +197,8 @@ public class IndexLocationTest extends BaseTestCase { assertTrue(content2.getFile("external2.h").exists()); IIndex index = CCorePlugin.getIndexManager().getIndex(cproject); - TestSourceReader.waitUntilFileIsIndexed(index, file, 10000); CCorePlugin.getIndexManager().reindex(cproject); + TestSourceReader.waitUntilFileIsIndexed(index, file, 10000); waitForIndexer(cproject); index.acquireReadLock(); try { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index e5dd7d4b487..c5c2bb4a552 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -1437,10 +1437,9 @@ public class CPPVisitor extends ASTQueries { } private boolean isDeclarationsBinding(IBinding nameBinding) { - nameBinding= unwindBinding(nameBinding); if (nameBinding != null) { for (IBinding binding : bindings) { - if (nameBinding.equals(unwindBinding(binding))) { + if (nameBinding.equals(binding)) { return true; } // a using declaration is a declaration for the references of its delegates diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseUITestCase.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseUITestCase.java index 6abd14d1e8c..80395d5a6f5 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseUITestCase.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseUITestCase.java @@ -337,13 +337,16 @@ public class BaseUITestCase extends BaseTestCase { final protected TreeItem checkTreeNode(Tree tree, int i0, int i1, String label) { TreeItem item= null; String itemText= null; + SWTException ex= null; + String firstItemText= null; for (int millis=0; millis < 5000; millis= millis==0 ? 1 : millis*2) { runEventQueue(millis); TreeItem root= tree.getItem(i0); + ex= null; try { TreeItem firstItem= root.getItem(0); - final String text= firstItem.getText(); - if (text.length() > 0 && !text.equals("...")) { + firstItemText= firstItem.getText(); + if (firstItemText.length() > 0 && !firstItemText.equals("...")) { item= root.getItem(i1); itemText= item.getText(); assertNotNull("Unexpected tree node " + itemText, label); @@ -362,9 +365,13 @@ public class BaseUITestCase extends BaseTestCase { return null; } catch (SWTException e) { // widget was disposed, try again. + ex= e; } } - assertEquals("Timeout expired waiting for tree node {" + i0 + "," + i1 + "}", label, itemText); + if (ex != null) + throw ex; + + assertEquals("Timeout expired waiting for tree node {" + i0 + "," + i1 + "}; firstItem=" + firstItemText, label, itemText); return null; } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java index 139cc68ea0a..c751a35c10e 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java @@ -1139,4 +1139,18 @@ public class CPPSelectionTestsNoIndexer extends BaseUITestCase { IASTNode node= testF3(file, offset); assertContents(code, node.getFileLocation().getNodeOffset(), "func(T a, T b)"); } + + // namespace N { + // template class AAA { T _t; }; + // } + // N::AAA a; + public void testBug92632() throws Exception { + String code= getContentsForTest(1)[0].toString(); + IFile file = importFile("testBug92632.cpp", code); + int index = code.indexOf("AAA"); //$NON-NLS-1$ + IASTNode node= testF3(file, index); + assertContents(code, node.getFileLocation().getNodeOffset(), "AAA"); + node= testF3(file, index+4); + assertContents(code, node.getFileLocation().getNodeOffset(), "AAA"); + } }