From 456630b5a011ff03fa175284137e2e8388a0b86c Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Thu, 8 May 2014 20:03:40 -0700 Subject: [PATCH] Bug 424571 - C++ indexer cannot find a derived class if the base class in its declaration is written with namespace --- .../core/pdom/dom/cpp/PDOMCPPLinkage.java | 24 ++++++++++++------- .../typehierarchy/CppTypeHierarchyTest.java | 11 ++++++--- 2 files changed, 23 insertions(+), 12 deletions(-) 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 452733fd3f6..83bbde90dd2 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 @@ -1011,17 +1011,10 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { if (parentNode instanceof ICPPASTQualifiedName) { if (name != ((ICPPASTQualifiedName) parentNode).getLastName()) return; + name = (IASTName) parentNode; parentNode = parentNode.getParent(); } - if (name.getPropertyInParent() == ICPPASTBaseSpecifier.NAME || - (name.getPropertyInParent() == ICPPASTTemplateId.TEMPLATE_NAME && - parentNode.getPropertyInParent() == ICPPASTBaseSpecifier.NAME)) { - pdomName.setIsBaseSpecifier(); - } else if (parentNode instanceof ICPPASTUsingDirective) { - IASTNode parent= name.getParent(); - if (parent instanceof ICPPASTQualifiedName) { - name = (IASTName) parent; - } + if (parentNode instanceof ICPPASTUsingDirective) { IScope container= CPPVisitor.getContainingScope(name); boolean doit= false; PDOMCPPNamespace containerNS= null; @@ -1100,6 +1093,19 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { } } } + } else { + if (name.getPropertyInParent() == ICPPASTTemplateId.TEMPLATE_NAME) { + name = (IASTName) parentNode; + parentNode = parentNode.getParent(); + } + if (parentNode instanceof ICPPASTQualifiedName) { + if (name != ((ICPPASTQualifiedName) parentNode).getLastName()) + return; + name = (IASTName) parentNode; + parentNode = parentNode.getParent(); + } + if (name.getPropertyInParent() == ICPPASTBaseSpecifier.NAME) + pdomName.setIsBaseSpecifier(); } } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/typehierarchy/CppTypeHierarchyTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/typehierarchy/CppTypeHierarchyTest.java index e43324452c1..f1f12768f74 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/typehierarchy/CppTypeHierarchyTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/typehierarchy/CppTypeHierarchyTest.java @@ -840,13 +840,18 @@ public class CppTypeHierarchyTest extends TypeHierarchyBaseTest { checkMethodTable(new String[] {"field1 : T", "method1() : T"}); } + // namespace ns { + // // template // class A { // public: // int field1; // int method1(); // }; - // class B : public A { + // + // } + // + // class B : public ns::A { // public: // int field2; // int method2(); @@ -863,7 +868,7 @@ public class CppTypeHierarchyTest extends TypeHierarchyBaseTest { openTypeHierarchy(editor); tree= getHierarchyViewer().getTree(); - item1= checkTreeNode(tree, 0, "A"); + item1= checkTreeNode(tree, 0, "ns::A"); assertEquals(1, tree.getItemCount()); getHierarchyViewer().expandAll(); @@ -875,7 +880,7 @@ public class CppTypeHierarchyTest extends TypeHierarchyBaseTest { editor.selectAndReveal(content.indexOf("B"), 1); openTypeHierarchy(editor); tree= getHierarchyViewer().getTree(); - item1= checkTreeNode(tree, 0, "A"); + item1= checkTreeNode(tree, 0, "ns::A"); assertEquals(1, tree.getItemCount()); item2= checkTreeNode(item1, 0, "B");