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