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