diff --git a/languages/clang/tests/test_duchain.h b/languages/clang/tests/test_duchain.h --- a/languages/clang/tests/test_duchain.h +++ b/languages/clang/tests/test_duchain.h @@ -59,6 +59,7 @@ void testBaseClasses(); void testReparseBaseClasses(); void testReparseBaseClassesTemplates(); + void testGetInheriters(); void testGlobalFunctionDeclaration(); void testFunctionDefinitionVsDeclaration(); void testEnsureNoDoubleVisit(); diff --git a/languages/clang/tests/test_duchain.cpp b/languages/clang/tests/test_duchain.cpp --- a/languages/clang/tests/test_duchain.cpp +++ b/languages/clang/tests/test_duchain.cpp @@ -584,6 +584,44 @@ } } +// TODO: Move this test to kdevplatform. +void TestDUChain::testGetInheriters() +{ + TestFile file("class Base { class Inner {}; }; class Inherited : public Base, Base::Inner {};", "cpp"); + QVERIFY(file.parseAndWait()); + + DUChainReadLocker lock; + DUContext* top = file.topContext().data(); + QVERIFY(top); + + QCOMPARE(top->localDeclarations().count(), 2); + Declaration* baseDecl = top->localDeclarations().first(); + QCOMPARE(baseDecl->identifier(), Identifier("Base")); + + DUContext* baseCtx = baseDecl->internalContext(); + QVERIFY(baseCtx); + QCOMPARE(baseCtx->localDeclarations().count(), 1); + + Declaration* innerDecl = baseCtx->localDeclarations().first(); + QCOMPARE(innerDecl->identifier(), Identifier("Inner")); + + Declaration* inheritedDecl = top->localDeclarations()[1]; + QVERIFY(inheritedDecl); + QCOMPARE(inheritedDecl->identifier(), Identifier("Inherited")); + + uint maxAllowedSteps = uint(-1); + auto baseInheriters = DUChainUtils::getInheriters(baseDecl, maxAllowedSteps); + QCOMPARE(baseInheriters, QList() << inheritedDecl); + + maxAllowedSteps = uint(-1); + auto innerInheriters = DUChainUtils::getInheriters(innerDecl, maxAllowedSteps); + QCOMPARE(innerInheriters, QList() << inheritedDecl); + + maxAllowedSteps = uint(-1); + auto inheritedInheriters = DUChainUtils::getInheriters(inheritedDecl, maxAllowedSteps); + QCOMPARE(inheritedInheriters.count(), 0); +} + void TestDUChain::testGlobalFunctionDeclaration() { TestFile file("void foo(int arg1, char arg2);\n", "cpp");