From a7219736b6081888a35aa5f58fcec4abc8dfad44 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Tue, 10 Nov 2009 14:24:32 +0100 Subject: [PATCH] Cleanup Postfix operators. --- src/libs/cplusplus/ResolveExpression.cpp | 4 ++-- src/plugins/cppeditor/cppeditor.cpp | 7 ++++--- src/shared/cplusplus/AST.cpp | 6 ++---- src/shared/cplusplus/AST.h | 10 +++++----- src/shared/cplusplus/ASTVisit.cpp | 3 +-- src/shared/cplusplus/ASTfwd.h | 1 + src/shared/cplusplus/CheckExpression.cpp | 4 ++-- src/shared/cplusplus/Parser.cpp | 10 +++++----- tests/auto/cplusplus/ast/tst_ast.cpp | 4 ++-- 9 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 5999c9531de..277f31b2582 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -208,8 +208,8 @@ bool ResolveExpression::visit(PostfixExpressionAST *ast) { accept(ast->base_expression); - for (PostfixAST *fx = ast->postfix_expressions; fx; fx = fx->next) { - accept(fx); + for (PostfixListAST *it = ast->postfix_expressions; it; it = it->next) { + accept(it->value); } return false; diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 5925a50f518..ec036230935 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -318,10 +318,11 @@ protected: virtual bool visit(PostfixExpressionAST *ast) { accept(ast->base_expression); - for (PostfixAST *it = ast->postfix_expressions; it; it = it->next) { - if (it->asMemberAccess() != 0) + for (PostfixListAST *it = ast->postfix_expressions; it; it = it->next) { + PostfixAST *fx = it->value; + if (fx->asMemberAccess() != 0) continue; // skip members - accept(it); + accept(fx); } return false; } diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 987c6a1664b..035f5dae37a 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -1331,10 +1331,8 @@ unsigned PostfixExpressionAST::firstToken() const unsigned PostfixExpressionAST::lastToken() const { - for (PostfixAST *it = postfix_expressions; it; it = it->next) { - if (! it->next) - return it->lastToken(); - } + if (postfix_expressions) + return postfix_expressions->lastToken(); return base_expression->lastToken(); } diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 310b3d39e2b..bd5b91f4ad3 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -66,6 +66,10 @@ public: : value(_Tp()), next(0) { } + List(const _Tp &value) + : value(value), next(0) + { } + unsigned firstToken() const { if (value) @@ -1459,12 +1463,8 @@ protected: class CPLUSPLUS_EXPORT PostfixAST: public AST { -public: - PostfixAST *next; - public: virtual PostfixAST *asPostfix() { return this; } - }; class CPLUSPLUS_EXPORT CallAST: public PostfixAST @@ -1592,7 +1592,7 @@ class CPLUSPLUS_EXPORT PostfixExpressionAST: public ExpressionAST { public: ExpressionAST *base_expression; - PostfixAST *postfix_expressions; + PostfixListAST *postfix_expressions; public: virtual PostfixExpressionAST *asPostfixExpression() { return this; } diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp index c9e86fb07fb..53454711403 100644 --- a/src/shared/cplusplus/ASTVisit.cpp +++ b/src/shared/cplusplus/ASTVisit.cpp @@ -662,8 +662,7 @@ void PostfixExpressionAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { accept(base_expression, visitor); - for (PostfixAST *it = postfix_expressions; it; it = it->next) - accept(it, visitor); + accept(postfix_expressions, visitor); } visitor->endVisit(this); } diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h index 1eae7c3fff6..9bbf9681f0f 100644 --- a/src/shared/cplusplus/ASTfwd.h +++ b/src/shared/cplusplus/ASTfwd.h @@ -199,6 +199,7 @@ typedef List<BaseSpecifierAST *> BaseSpecifierListAST; typedef List<EnumeratorAST *> EnumeratorListAST; typedef List<MemInitializerAST *> MemInitializerListAST; typedef List<NewArrayDeclaratorAST *> NewArrayDeclaratorListAST; +typedef List<PostfixAST *> PostfixListAST; typedef List<NameAST *> ObjCIdentifierListAST; typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST; diff --git a/src/shared/cplusplus/CheckExpression.cpp b/src/shared/cplusplus/CheckExpression.cpp index 763258dfda7..25de7e62c6d 100644 --- a/src/shared/cplusplus/CheckExpression.cpp +++ b/src/shared/cplusplus/CheckExpression.cpp @@ -251,8 +251,8 @@ bool CheckExpression::visit(TypeConstructorCallAST *ast) bool CheckExpression::visit(PostfixExpressionAST *ast) { FullySpecifiedType exprTy = semantic()->check(ast->base_expression, _scope); - for (PostfixAST *fx = ast->postfix_expressions; fx; fx = fx->next) { - accept(fx); // ### not exactly. + for (PostfixListAST *it = ast->postfix_expressions; it; it = it->next) { + accept(it->value); // ### not exactly. } return false; } diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 9179f21db13..f9519736163 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -3599,7 +3599,7 @@ bool Parser::parsePostfixExpression(ExpressionAST *&node) { DEBUG_THIS_RULE(); if (parseCorePostfixExpression(node)) { - PostfixAST *postfix_expressions = 0, + PostfixListAST *postfix_expressions = 0, **postfix_ptr = &postfix_expressions; while (LA()) { if (LA() == T_LPAREN) { @@ -3607,19 +3607,19 @@ bool Parser::parsePostfixExpression(ExpressionAST *&node) ast->lparen_token = consumeToken(); parseExpressionList(ast->expression_list); match(T_RPAREN, &ast->rparen_token); - *postfix_ptr = ast; + *postfix_ptr = new (_pool) PostfixListAST(ast); postfix_ptr = &(*postfix_ptr)->next; } else if (LA() == T_LBRACKET) { ArrayAccessAST *ast = new (_pool) ArrayAccessAST; ast->lbracket_token = consumeToken(); parseExpression(ast->expression); match(T_RBRACKET, &ast->rbracket_token); - *postfix_ptr = ast; + *postfix_ptr = new (_pool) PostfixListAST(ast); postfix_ptr = &(*postfix_ptr)->next; } else if (LA() == T_PLUS_PLUS || LA() == T_MINUS_MINUS) { PostIncrDecrAST *ast = new (_pool) PostIncrDecrAST; ast->incr_decr_token = consumeToken(); - *postfix_ptr = ast; + *postfix_ptr = new (_pool) PostfixListAST(ast); postfix_ptr = &(*postfix_ptr)->next; } else if (LA() == T_DOT || LA() == T_ARROW) { MemberAccessAST *ast = new (_pool) MemberAccessAST; @@ -3629,7 +3629,7 @@ bool Parser::parsePostfixExpression(ExpressionAST *&node) if (! parseNameId(ast->member_name)) _translationUnit->error(cursor(), "expected unqualified-id before token `%s'", tok().spell()); - *postfix_ptr = ast; + *postfix_ptr = new (_pool) PostfixListAST(ast); postfix_ptr = &(*postfix_ptr)->next; } else break; } // while diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp index df015049a88..c653b7fdcf6 100644 --- a/tests/auto/cplusplus/ast/tst_ast.cpp +++ b/tests/auto/cplusplus/ast/tst_ast.cpp @@ -574,7 +574,7 @@ void tst_AST::normal_array_access() { QVERIFY(postfixExpr->postfix_expressions && !postfixExpr->postfix_expressions->next); - ArrayAccessAST *rhs = postfixExpr->postfix_expressions->asArrayAccess(); + ArrayAccessAST *rhs = postfixExpr->postfix_expressions->value->asArrayAccess(); QVERIFY(rhs && rhs->expression); SimpleNameAST *b = rhs->expression->asSimpleName(); QVERIFY(b); @@ -620,7 +620,7 @@ void tst_AST::array_access_with_nested_expression() { QVERIFY(postfixExpr->postfix_expressions && !postfixExpr->postfix_expressions->next); - ArrayAccessAST *rhs = postfixExpr->postfix_expressions->asArrayAccess(); + ArrayAccessAST *rhs = postfixExpr->postfix_expressions->value->asArrayAccess(); QVERIFY(rhs && rhs->expression); SimpleNameAST *b = rhs->expression->asSimpleName(); QVERIFY(b); -- GitLab