From 1dbdbbefe7b4977e88c13c42556b35e44eee747a Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 10 Nov 2009 14:03:40 +0100
Subject: [PATCH] Cleanup base base specifiers.

---
 src/libs/cplusplus/CheckUndefinedSymbols.cpp |  5 ----
 src/shared/cplusplus/AST.cpp                 | 10 +++-----
 src/shared/cplusplus/AST.h                   |  3 +--
 src/shared/cplusplus/ASTVisit.cpp            |  3 +--
 src/shared/cplusplus/ASTfwd.h                |  2 ++
 src/shared/cplusplus/CheckSpecifier.cpp      |  3 ++-
 src/shared/cplusplus/Parser.cpp              | 27 +++++++++++++-------
 src/shared/cplusplus/Parser.h                |  4 +--
 tests/auto/cplusplus/ast/tst_ast.cpp         | 10 ++++----
 9 files changed, 35 insertions(+), 32 deletions(-)

diff --git a/src/libs/cplusplus/CheckUndefinedSymbols.cpp b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
index 9368aa43fa4..f0291a09575 100644
--- a/src/libs/cplusplus/CheckUndefinedSymbols.cpp
+++ b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
@@ -286,11 +286,6 @@ void CheckUndefinedSymbols::endVisit(TemplateDeclarationAST *)
 
 bool CheckUndefinedSymbols::visit(ClassSpecifierAST *ast)
 {
-    if (ast->base_clause) {
-        unsigned line, col;
-        getTokenStartPosition(ast->firstToken(), &line, &col);
-    }
-
     bool hasQ_OBJECT_CHECK = false;
 
     if (ast->symbol) {
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 0ef6f91f4a3..ab2578c49ff 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -382,15 +382,13 @@ unsigned ClassSpecifierAST::lastToken() const
     if (lbrace_token)
         return lbrace_token + 1;
 
-    for (BaseSpecifierAST *it = base_clause; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
+    else if (base_clause_list)
+        return base_clause_list->lastToken();
 
-    if (colon_token)
+    else if (colon_token)
         return colon_token + 1;
 
-    if (name)
+    else if (name)
         return name->lastToken();
 
     for (SpecifierAST *it = attributes; it; it = it->next) {
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index da2c9d1fae6..fdaaf8100cf 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -478,7 +478,6 @@ public:
     unsigned virtual_token;
     unsigned access_specifier_token;
     NameAST *name;
-    BaseSpecifierAST *next;
 
 public: // annotations
     BaseClass *symbol;
@@ -571,7 +570,7 @@ public:
     SpecifierAST *attributes;
     NameAST *name;
     unsigned colon_token;
-    BaseSpecifierAST *base_clause;
+    BaseSpecifierListAST *base_clause_list;
     unsigned lbrace_token;
     DeclarationListAST *member_specifiers;
     unsigned rbrace_token;
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index aea713c4c75..9b48f3db6d9 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -163,8 +163,7 @@ void ClassSpecifierAST::accept0(ASTVisitor *visitor)
         for (SpecifierAST *it = attributes; it; it = it->next)
             accept(it, visitor);
         accept(name, visitor);
-        for (BaseSpecifierAST *it = base_clause; it; it = it->next)
-            accept(it, visitor);
+        accept(base_clause_list, visitor);
         for (DeclarationListAST *it = member_specifiers; it; it = it->next)
             accept(it, visitor);
     }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index d38aafc128c..94f36c7b01e 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -195,6 +195,8 @@ typedef List<ExpressionAST *> ExpressionListAST;
 typedef List<DeclarationAST *> DeclarationListAST;
 typedef List<StatementAST *> StatementListAST;
 typedef List<DeclaratorAST *> DeclaratorListAST;
+typedef List<BaseSpecifierAST *> BaseSpecifierListAST;
+
 typedef List<NameAST *> ObjCIdentifierListAST;
 typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST;
 typedef List<ObjCSelectorArgumentAST *> ObjCSelectorArgumentListAST;
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index 8c70f153d52..65909536fd0 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -328,7 +328,8 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
     _scope->enterSymbol(klass);
     _fullySpecifiedType.setType(klass);
 
-    for (BaseSpecifierAST *base = ast->base_clause; base; base = base->next) {
+    for (BaseSpecifierListAST *it = ast->base_clause_list; it; it = it->next) {
+        BaseSpecifierAST *base = it->value;
         Name *baseClassName = semantic()->check(base->name, _scope);
         BaseClass *baseClass = control()->newBaseClass(ast->firstToken(), baseClassName);
         base->symbol = baseClass;
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 40581cc9e91..dc89952cafa 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -1550,17 +1550,23 @@ bool Parser::parseClassSpecifier(SpecifierAST *&node)
     unsigned colon_token = 0;
 
     if (LA() == T_COLON || LA() == T_LBRACE) {
-        BaseSpecifierAST *base_clause = 0;
+        BaseSpecifierListAST *base_clause_list = 0;
+
         if (LA() == T_COLON) {
             colon_token = cursor();
-            parseBaseClause(base_clause);
+
+            parseBaseClause(base_clause_list);
+
             if (LA() != T_LBRACE) {
                 _translationUnit->error(cursor(), "expected `{' before `%s'", tok().spell());
-                unsigned saved = cursor();
+
+                const unsigned saved = cursor();
+
                 for (int n = 0; n < 3 && LA() != T_EOF_SYMBOL; ++n, consumeToken()) {
                     if (LA() == T_LBRACE)
                         break;
                 }
+
                 if (LA() != T_LBRACE)
                     rewind(saved);
             }
@@ -1571,7 +1577,7 @@ bool Parser::parseClassSpecifier(SpecifierAST *&node)
         ast->attributes = attributes;
         ast->name = name;
         ast->colon_token = colon_token;
-        ast->base_clause = base_clause;
+        ast->base_clause_list = base_clause_list;
 
         if (LA() == T_LBRACE)
             ast->lbrace_token = consumeToken();
@@ -1778,13 +1784,14 @@ bool Parser::parseInitDeclarator(DeclaratorAST *&node,
     return true;
 }
 
-bool Parser::parseBaseClause(BaseSpecifierAST *&node)
+bool Parser::parseBaseClause(BaseSpecifierListAST *&node)
 {
     DEBUG_THIS_RULE();
+
     if (LA() == T_COLON) {
-        consumeToken();
+        consumeToken(); // ### remove me
 
-        BaseSpecifierAST **ast = &node;
+        BaseSpecifierListAST **ast = &node;
         if (parseBaseSpecifier(*ast)) {
             ast = &(*ast)->next;
 
@@ -1895,7 +1902,7 @@ bool Parser::parseExpressionList(ExpressionListAST *&node)
     return false;
 }
 
-bool Parser::parseBaseSpecifier(BaseSpecifierAST *&node)
+bool Parser::parseBaseSpecifier(BaseSpecifierListAST *&node)
 {
     DEBUG_THIS_RULE();
     BaseSpecifierAST *ast = new (_pool) BaseSpecifierAST;
@@ -1918,7 +1925,9 @@ bool Parser::parseBaseSpecifier(BaseSpecifierAST *&node)
     parseName(ast->name);
     if (! ast->name)
         _translationUnit->error(cursor(), "expected class-name");
-    node = ast;
+
+    node = new (_pool) BaseSpecifierListAST;
+    node->value = ast;
     return true;
 }
 
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index d9ccf6ab490..2f0514d2697 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -84,8 +84,8 @@ public:
     bool parseAsmOperand();
     bool parseAsmClobberList();
     bool parseAssignmentExpression(ExpressionAST *&node);
-    bool parseBaseClause(BaseSpecifierAST *&node);
-    bool parseBaseSpecifier(BaseSpecifierAST *&node);
+    bool parseBaseClause(BaseSpecifierListAST *&node);
+    bool parseBaseSpecifier(BaseSpecifierListAST *&node);
     bool parseBlockDeclaration(DeclarationAST *&node);
     bool parseCppCastExpression(ExpressionAST *&node);
     bool parseCastExpression(ExpressionAST *&node);
diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp
index 43b2cb409f7..df015049a88 100644
--- a/tests/auto/cplusplus/ast/tst_ast.cpp
+++ b/tests/auto/cplusplus/ast/tst_ast.cpp
@@ -121,9 +121,9 @@ void tst_AST::template_id_1()
     QCOMPARE(ast->asTemplateId()->identifier_token, 1U);
     QCOMPARE(ast->asTemplateId()->less_token, 2U);
     QVERIFY(ast->asTemplateId()->template_arguments != 0);
-    QVERIFY(ast->asTemplateId()->template_arguments->template_argument != 0);
-    QVERIFY(ast->asTemplateId()->template_arguments->template_argument->asNumericLiteral() != 0);
-    QCOMPARE(ast->asTemplateId()->template_arguments->template_argument->asNumericLiteral()->literal_token, 3U);
+    QVERIFY(ast->asTemplateId()->template_arguments->value != 0);
+    QVERIFY(ast->asTemplateId()->template_arguments->value->asNumericLiteral() != 0);
+    QCOMPARE(ast->asTemplateId()->template_arguments->value->asNumericLiteral()->literal_token, 3U);
     QVERIFY(ast->asTemplateId()->template_arguments->next == 0);
     QCOMPARE(ast->asTemplateId()->greater_token, 4U);
 }
@@ -471,7 +471,7 @@ void tst_AST::cpp_initializer_or_function_declaration()
     QVERIFY(simple_named_ty != 0);
     QCOMPARE(simple_named_ty->identifier_token, 1U);
 
-    DeclaratorAST *declarator = simple_decl->declarators->declarator;
+    DeclaratorAST *declarator = simple_decl->declarators->value;
     QVERIFY(declarator != 0);
     QVERIFY(declarator->core_declarator != 0);
     QVERIFY(declarator->postfix_declarators != 0);
@@ -664,7 +664,7 @@ void tst_AST::objc_msg_send_expression()
 
         {// check the assignment
             QVERIFY(simpleDecl->declarators && !simpleDecl->declarators->next);
-            DeclaratorAST *declarator = simpleDecl->declarators->declarator;
+            DeclaratorAST *declarator = simpleDecl->declarators->value;
             QVERIFY(declarator);
             QVERIFY(!declarator->attributes);
 
-- 
GitLab