diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 1918ee795350053b8f717f3d5bf4debf9001cb5c..f5e3ac42fc57463e533e6a4aa54d57792cc895b8 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 eeb59eebcc0aeb02f334c4283febe187f204e656..cb929b868caac1c68d314fc79ed7fa951983bf31 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 12b1d1b6dfab24d2068ab0e65c6b928e086cf4ed..ecf3ae71fefe6164e1eab56cfc6d72b8fdc39481 100644 --- a/tests/auto/cplusplus/lookup/tst_lookup.cpp +++ b/tests/auto/cplusplus/lookup/tst_lookup.cpp @@ -1,6 +1,10 @@ #include <QtTest> #include <QObject> + +#include <AST.h> +#include <ASTVisitor.h> +#include <TranslationUnit.h> #include <CppDocument.h> #include <LookupContext.h> #include <Symbols.h> @@ -8,6 +12,29 @@ CPLUSPLUS_USE_NAMESPACE +class ClassSymbols: protected ASTVisitor, + public QMap<ClassSpecifierAST *, Class *> +{ +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)