From bbae6f84db0041b3691bd7b2c645f31965df0327 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Fri, 13 Aug 2010 12:36:47 +0200 Subject: [PATCH] Create symbols for the fwd class declarations --- src/shared/cplusplus/AST.h | 2 +- src/shared/cplusplus/Bind.cpp | 25 +++++++++++++++++++++-- src/shared/cplusplus/CheckDeclaration.cpp | 6 +++--- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 8db76fb4597..0e1ba53eeb9 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -609,7 +609,7 @@ public: unsigned semicolon_token; public: - List<Declaration *> *symbols; + List<Symbol *> *symbols; public: SimpleDeclarationAST() diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp index 66ec14f34cf..350f5ae9f94 100644 --- a/src/shared/cplusplus/Bind.cpp +++ b/src/shared/cplusplus/Bind.cpp @@ -1569,7 +1569,28 @@ bool Bind::visit(SimpleDeclarationAST *ast) type = this->specifier(it->value, type); } - List<Declaration *> **symbolTail = &ast->symbols; + List<Symbol *> **symbolTail = &ast->symbols; + + if (! ast->declarator_list) { + ElaboratedTypeSpecifierAST *elabTypeSpec = 0; + for (SpecifierListAST *it = ast->decl_specifier_list; ! elabTypeSpec && it; it = it->next) + elabTypeSpec = it->value->asElaboratedTypeSpecifier(); + + if (elabTypeSpec && tokenKind(elabTypeSpec->classkey_token) != T_TYPENAME) { + unsigned sourceLocation = elabTypeSpec->firstToken(); + const Name *name = 0; + if (elabTypeSpec->name) { + sourceLocation = elabTypeSpec->name->firstToken(); + name = elabTypeSpec->name->name; + } + + ForwardClassDeclaration *decl = control()->newForwardClassDeclaration(sourceLocation, name); + _scope->addMember(decl); + + *symbolTail = new (translationUnit()->memoryPool()) List<Symbol *>(decl); + symbolTail = &(*symbolTail)->next; + } + } for (DeclaratorListAST *it = ast->declarator_list; it; it = it->next) { DeclaratorIdAST *declaratorId = 0; @@ -1601,7 +1622,7 @@ bool Bind::visit(SimpleDeclarationAST *ast) _scope->addMember(decl); - *symbolTail = new (translationUnit()->memoryPool()) List<Declaration *>(decl); + *symbolTail = new (translationUnit()->memoryPool()) List<Symbol *>(decl); symbolTail = &(*symbolTail)->next; } return false; diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index 39a98f6c2f8..f2b1b2c3916 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -187,7 +187,7 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast) const bool isQ_SIGNAL = ast->qt_invokable_token && tokenKind(ast->qt_invokable_token) == T_Q_SIGNAL; const bool isQ_INVOKABLE = ast->qt_invokable_token && tokenKind(ast->qt_invokable_token) == T_Q_INVOKABLE; - List<Declaration *> **decl_it = &ast->symbols; + List<Symbol *> **decl_it = &ast->symbols; for (DeclaratorListAST *it = ast->declarator_list; it; it = it->next) { const Name *name = 0; FullySpecifiedType declTy = semantic()->check(it->value, qualTy, @@ -230,7 +230,7 @@ bool CheckDeclaration::visit(SimpleDeclarationAST *ast) FullySpecifiedType initTy = semantic()->check(it->value->initializer, _scope); } - *decl_it = new (translationUnit()->memoryPool()) List<Declaration *>(); + *decl_it = new (translationUnit()->memoryPool()) List<Symbol *>(); (*decl_it)->value = symbol; decl_it = &(*decl_it)->next; @@ -841,7 +841,7 @@ bool CheckDeclaration::visit(ObjCPropertyDeclarationAST *ast) } List<ObjCPropertyDeclaration *> **lastSymbols = &ast->symbols; - for (List<Declaration*> *iter = simpleDecl->symbols; iter; iter = iter->next) { + for (List<Symbol *> *iter = simpleDecl->symbols; iter; iter = iter->next) { ObjCPropertyDeclaration *propDecl = control()->newObjCPropertyDeclaration(ast->firstToken(), iter->value->name()); propDecl->setType(iter->value->type()); -- GitLab