diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 1918ee79535..f5e3ac42fc5 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -515,6 +515,9 @@ public: DeclarationAST *member_specifiers; unsigned rbrace_token; +public: // annotations + Class *class_symbol; + public: virtual unsigned firstToken() const; virtual unsigned lastToken() const; diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp index eeb59eebcc0..cb929b868ca 100644 --- a/src/shared/cplusplus/CheckSpecifier.cpp +++ b/src/shared/cplusplus/CheckSpecifier.cpp @@ -300,6 +300,7 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast) { Name *className = semantic()->check(ast->name, _scope); Class *klass = control()->newClass(ast->firstToken(), className); + ast->class_symbol = klass; unsigned classKey = tokenKind(ast->classkey_token); if (classKey == T_CLASS) klass->setClassKey(Class::ClassKey); diff --git a/tests/auto/cplusplus/lookup/tst_lookup.cpp b/tests/auto/cplusplus/lookup/tst_lookup.cpp index 12b1d1b6dfa..ecf3ae71fef 100644 --- a/tests/auto/cplusplus/lookup/tst_lookup.cpp +++ b/tests/auto/cplusplus/lookup/tst_lookup.cpp @@ -1,6 +1,10 @@ #include #include + +#include +#include +#include #include #include #include @@ -8,6 +12,29 @@ CPLUSPLUS_USE_NAMESPACE +class ClassSymbols: protected ASTVisitor, + public QMap +{ +public: + ClassSymbols(Control *control) + : ASTVisitor(control) + { } + + void operator()(AST *ast) + { accept(ast); } + +protected: + virtual bool visit(ClassSpecifierAST *ast) + { + Class *classSymbol = ast->class_symbol; + Q_ASSERT(classSymbol != 0); + + insert(ast, classSymbol); + + return true; + } +}; + class tst_Lookup: public QObject { Q_OBJECT @@ -50,6 +77,17 @@ void tst_Lookup::base_class_defined_1() QCOMPARE(candidates.size(), 1); QCOMPARE(candidates.at(0), baseClass); + + TranslationUnit *unit = doc->translationUnit(); + QVERIFY(unit != 0); + + TranslationUnitAST *ast = unit->ast()->asTranslationUnit(); + QVERIFY(ast != 0); + + ClassSymbols classSymbols(doc->control()); + classSymbols(ast); + + QCOMPARE(classSymbols.size(), 2); } QTEST_APPLESS_MAIN(tst_Lookup)