From bbae6f84db0041b3691bd7b2c645f31965df0327 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Fri, 13 Aug 2010 12:36:47 +0200 Subject: 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(-) (limited to 'src/shared/cplusplus') diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 8db76fb459..0e1ba53eeb 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -609,7 +609,7 @@ public: unsigned semicolon_token; public: - List *symbols; + List *symbols; public: SimpleDeclarationAST() diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp index 66ec14f34c..350f5ae9f9 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 **symbolTail = &ast->symbols; + List **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(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(decl); + *symbolTail = new (translationUnit()->memoryPool()) List(decl); symbolTail = &(*symbolTail)->next; } return false; diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index 39a98f6c2f..f2b1b2c391 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 **decl_it = &ast->symbols; + List **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(); + *decl_it = new (translationUnit()->memoryPool()) List(); (*decl_it)->value = symbol; decl_it = &(*decl_it)->next; @@ -841,7 +841,7 @@ bool CheckDeclaration::visit(ObjCPropertyDeclarationAST *ast) } List **lastSymbols = &ast->symbols; - for (List *iter = simpleDecl->symbols; iter; iter = iter->next) { + for (List *iter = simpleDecl->symbols; iter; iter = iter->next) { ObjCPropertyDeclaration *propDecl = control()->newObjCPropertyDeclaration(ast->firstToken(), iter->value->name()); propDecl->setType(iter->value->type()); -- cgit v1.2.1