From ea981d502527376bd783a2b1ff204384ea43c381 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <qtc-committer@nokia.com> Date: Mon, 9 Feb 2009 12:19:17 +0100 Subject: [PATCH] More annotations. --- src/shared/cplusplus/AST.h | 41 ++++++++++++++++++++-- src/shared/cplusplus/CheckDeclaration.cpp | 22 ++++++------ src/shared/cplusplus/CheckSpecifier.cpp | 4 +-- src/shared/cplusplus/Control.cpp | 1 - tests/auto/cplusplus/lookup/tst_lookup.cpp | 2 +- 5 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 0b957ede817..ac452311fac 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -60,6 +60,20 @@ CPLUSPLUS_BEGIN_HEADER CPLUSPLUS_BEGIN_NAMESPACE +template <typename _Tp> +class List: public Managed +{ + List(const List &other); + void operator =(const List &other); + +public: + List() + { } + + _Tp value; + List *next; +}; + class CPLUSPLUS_EXPORT AST: public Managed { AST(const AST &other); @@ -351,6 +365,9 @@ public: DeclaratorListAST *declarators; unsigned semicolon_token; +public: + List<Declaration *> *symbols; + public: virtual unsigned firstToken() const; virtual unsigned lastToken() const; @@ -423,7 +440,7 @@ public: BaseSpecifierAST *next; public: // annotations - BaseClass *base_class_symbol; + BaseClass *symbol; public: virtual unsigned firstToken() const; @@ -519,7 +536,7 @@ public: unsigned rbrace_token; public: // annotations - Class *class_symbol; + Class *symbol; public: virtual unsigned firstToken() const; @@ -921,6 +938,9 @@ public: CtorInitializerAST *ctor_initializer; StatementAST *function_body; +public: // annotations + Function *symbol; + public: virtual unsigned firstToken() const; virtual unsigned lastToken() const; @@ -1195,7 +1215,7 @@ public: DeclarationAST *linkage_body; public: // annotations - Namespace *namespace_symbol; + Namespace *symbol; public: virtual unsigned firstToken() const; @@ -1321,6 +1341,9 @@ public: unsigned equal_token; ExpressionAST *expression; +public: // annotations + Argument *symbol; + public: virtual unsigned firstToken() const; virtual unsigned lastToken() const; @@ -1858,6 +1881,9 @@ public: unsigned equal_token; ExpressionAST *type_id; +public: // annotations + Argument *symbol; + public: virtual unsigned firstToken() const; virtual unsigned lastToken() const; @@ -1880,6 +1906,9 @@ public: unsigned equal_token; ExpressionAST *type_id; +public: + Argument *symbol; + public: virtual unsigned firstToken() const; virtual unsigned lastToken() const; @@ -1914,6 +1943,9 @@ public: NameAST *name; unsigned semicolon_token; +public: // annotations + UsingDeclaration *symbol; + public: virtual unsigned firstToken() const; virtual unsigned lastToken() const; @@ -1932,6 +1964,9 @@ public: NameAST *name; unsigned semicolon_token; +public: + UsingNamespaceDirective *symbol; + public: virtual unsigned firstToken() const; virtual unsigned lastToken() const; diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index 48e6cd40fa2..179dd069879 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -136,6 +136,7 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast) } } + List<Declaration *> **decl_it = &ast->symbols; for (DeclaratorListAST *it = ast->declarators; it; it = it->next) { Name *name = 0; FullySpecifiedType declTy = semantic()->check(it->declarator, qualTy, @@ -179,6 +180,10 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast) else if (ty.isTypedef()) symbol->setStorage(Symbol::Typedef); + *decl_it = new (translationUnit()->memoryPool()) List<Declaration *>(); + (*decl_it)->value = symbol; + decl_it = &(*decl_it)->next; + _scope->enterSymbol(symbol); } return false; @@ -234,6 +239,7 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast) checkFunctionArguments(fun); + ast->symbol = fun; _scope->enterSymbol(fun); if (ast->ctor_initializer) { @@ -286,7 +292,7 @@ bool CheckDeclaration::visit(NamespaceAST *ast) Identifier *id = identifier(ast->identifier_token); Name *namespaceName = control()->nameId(id); Namespace *ns = control()->newNamespace(ast->firstToken(), namespaceName); - ast->namespace_symbol = ns; + ast->symbol = ns; _scope->enterSymbol(ns); semantic()->check(ast->linkage_body, ns->members()); // ### we'll do the merge later. @@ -311,6 +317,7 @@ bool CheckDeclaration::visit(ParameterDeclarationAST *ast) _scope, &argName); FullySpecifiedType exprTy = semantic()->check(ast->expression, _scope); Argument *arg = control()->newArgument(ast->firstToken(), argName); + ast->symbol = arg; if (ast->expression) arg->setInitializer(true); arg->setType(argTy); @@ -320,15 +327,6 @@ bool CheckDeclaration::visit(ParameterDeclarationAST *ast) bool CheckDeclaration::visit(TemplateDeclarationAST *ast) { -/* - Template *templ = control()->newTemplate(ast->firstToken()); - - for (DeclarationAST *param = ast->template_parameters; param; - param = param->next) { - semantic()->check(param, templ->members()); - } -*/ - Scope *previousScope = switchScope(new Scope(_scope->owner())); for (DeclarationAST *param = ast->template_parameters; param; param = param->next) { @@ -344,6 +342,7 @@ bool CheckDeclaration::visit(TypenameTypeParameterAST *ast) { Name *name = semantic()->check(ast->name, _scope); Argument *arg = control()->newArgument(ast->firstToken(), name); // ### new template type + ast->symbol = arg; _scope->enterSymbol(arg); return false; } @@ -352,6 +351,7 @@ bool CheckDeclaration::visit(TemplateTypeParameterAST *ast) { Name *name = semantic()->check(ast->name, _scope); Argument *arg = control()->newArgument(ast->firstToken(), name); // ### new template type + ast->symbol = arg; _scope->enterSymbol(arg); return false; } @@ -360,6 +360,7 @@ bool CheckDeclaration::visit(UsingAST *ast) { Name *name = semantic()->check(ast->name, _scope); UsingDeclaration *u = control()->newUsingDeclaration(ast->firstToken(), name); + ast->symbol = u; _scope->enterSymbol(u); return false; } @@ -368,6 +369,7 @@ bool CheckDeclaration::visit(UsingDirectiveAST *ast) { Name *name = semantic()->check(ast->name, _scope); UsingNamespaceDirective *u = control()->newUsingNamespaceDirective(ast->firstToken(), name); + ast->symbol = u; _scope->enterSymbol(u); return false; } diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp index bee510d31dc..20a3662e7b8 100644 --- a/src/shared/cplusplus/CheckSpecifier.cpp +++ b/src/shared/cplusplus/CheckSpecifier.cpp @@ -300,7 +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; + ast->symbol = klass; unsigned classKey = tokenKind(ast->classkey_token); if (classKey == T_CLASS) klass->setClassKey(Class::ClassKey); @@ -315,7 +315,7 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast) for (BaseSpecifierAST *base = ast->base_clause; base; base = base->next) { Name *baseClassName = semantic()->check(base->name, _scope); BaseClass *baseClass = control()->newBaseClass(ast->firstToken(), baseClassName); - base->base_class_symbol = baseClass; + base->symbol = baseClass; if (base->token_virtual) baseClass->setVirtual(true); if (base->token_access_specifier) { diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp index e44d84a1aee..4d708f4340c 100644 --- a/src/shared/cplusplus/Control.cpp +++ b/src/shared/cplusplus/Control.cpp @@ -51,7 +51,6 @@ // THE SOFTWARE. #include "Control.h" -#include "MemoryPool.h" #include "Literals.h" #include "LiteralTable.h" #include "TranslationUnit.h" diff --git a/tests/auto/cplusplus/lookup/tst_lookup.cpp b/tests/auto/cplusplus/lookup/tst_lookup.cpp index 38d193faf64..f3e6a570d5a 100644 --- a/tests/auto/cplusplus/lookup/tst_lookup.cpp +++ b/tests/auto/cplusplus/lookup/tst_lookup.cpp @@ -40,7 +40,7 @@ public: protected: virtual bool visit(ClassSpecifierAST *ast) { - Class *classSymbol = ast->class_symbol; + Class *classSymbol = ast->symbol; Q_ASSERT(classSymbol != 0); insert(ast, classSymbol); -- GitLab