1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 424571 - C++ indexer cannot find a derived class if the base class

in its declaration is written with namespace
This commit is contained in:
Sergey Prigogin 2014-05-08 20:03:40 -07:00
parent 774de9a0ea
commit 456630b5a0
2 changed files with 23 additions and 12 deletions

View file

@ -1011,17 +1011,10 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
if (parentNode instanceof ICPPASTQualifiedName) { if (parentNode instanceof ICPPASTQualifiedName) {
if (name != ((ICPPASTQualifiedName) parentNode).getLastName()) if (name != ((ICPPASTQualifiedName) parentNode).getLastName())
return; return;
name = (IASTName) parentNode;
parentNode = parentNode.getParent(); parentNode = parentNode.getParent();
} }
if (name.getPropertyInParent() == ICPPASTBaseSpecifier.NAME || if (parentNode instanceof ICPPASTUsingDirective) {
(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;
}
IScope container= CPPVisitor.getContainingScope(name); IScope container= CPPVisitor.getContainingScope(name);
boolean doit= false; boolean doit= false;
PDOMCPPNamespace containerNS= null; 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();
} }
} }

View file

@ -840,13 +840,18 @@ public class CppTypeHierarchyTest extends TypeHierarchyBaseTest {
checkMethodTable(new String[] {"field1 : T", "method1() : T"}); checkMethodTable(new String[] {"field1 : T", "method1() : T"});
} }
// namespace ns {
//
// template<typename T> // template<typename T>
// class A { // class A {
// public: // public:
// int field1; // int field1;
// int method1(); // int method1();
// }; // };
// class B : public A<int> { //
// }
//
// class B : public ns::A<int> {
// public: // public:
// int field2; // int field2;
// int method2(); // int method2();
@ -863,7 +868,7 @@ public class CppTypeHierarchyTest extends TypeHierarchyBaseTest {
openTypeHierarchy(editor); openTypeHierarchy(editor);
tree= getHierarchyViewer().getTree(); tree= getHierarchyViewer().getTree();
item1= checkTreeNode(tree, 0, "A"); item1= checkTreeNode(tree, 0, "ns::A");
assertEquals(1, tree.getItemCount()); assertEquals(1, tree.getItemCount());
getHierarchyViewer().expandAll(); getHierarchyViewer().expandAll();
@ -875,7 +880,7 @@ public class CppTypeHierarchyTest extends TypeHierarchyBaseTest {
editor.selectAndReveal(content.indexOf("B"), 1); editor.selectAndReveal(content.indexOf("B"), 1);
openTypeHierarchy(editor); openTypeHierarchy(editor);
tree= getHierarchyViewer().getTree(); tree= getHierarchyViewer().getTree();
item1= checkTreeNode(tree, 0, "A"); item1= checkTreeNode(tree, 0, "ns::A");
assertEquals(1, tree.getItemCount()); assertEquals(1, tree.getItemCount());
item2= checkTreeNode(item1, 0, "B"); item2= checkTreeNode(item1, 0, "B");