diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 4cefd9a012998859b51aaae71743ecf0ce0bddb3..fe28c1d27d8220883ddf3daf7ba60ec4aa3bdd94 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -1959,25 +1959,6 @@ unsigned ObjCMessageExpressionAST::lastToken() const return lbracket_token + 1; } -unsigned ObjCMessageArgumentListAST::firstToken() const -{ - if (arg) - return arg->firstToken(); - // ### assert? - return 0; -} - -unsigned ObjCMessageArgumentListAST::lastToken() const -{ - for (const ObjCMessageArgumentListAST *it = this; it; it = it->next) { - if (! it->next && it->arg) { - return it->arg->lastToken(); - } - } - // ### assert? - return 0; -} - unsigned ObjCMessageArgumentAST::firstToken() const { return parameter_value_expression->firstToken(); diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 084913fc91f713290aa4274935522e79f4dc8c10..129c132f94cb4b05cf69a00905a41165e8a3f940 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -2211,22 +2211,6 @@ protected: virtual void accept0(ASTVisitor *visitor); }; -class CPLUSPLUS_EXPORT ObjCMessageArgumentListAST: public AST -{ -public: - ObjCMessageArgumentAST *arg; - ObjCMessageArgumentListAST *next; - -public: - virtual ObjCMessageArgumentListAST *asObjCMessageArgumentList() { return this; } - - virtual unsigned firstToken() const; - virtual unsigned lastToken() const; - -protected: - virtual void accept0(ASTVisitor *visitor); -}; - class CPLUSPLUS_EXPORT ObjCMessageExpressionAST: public ExpressionAST { public: diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp index 8095946f0a2a024b407153c46a2dad8deb69853d..2f60cdf461661f73731b7c8f557d7818026453e2 100644 --- a/src/shared/cplusplus/ASTVisit.cpp +++ b/src/shared/cplusplus/ASTVisit.cpp @@ -958,14 +958,6 @@ void ObjCMessageArgumentAST::accept0(ASTVisitor *visitor) visitor->endVisit(this); } -void ObjCMessageArgumentListAST::accept0(ASTVisitor *visitor) -{ - if (visitor->visit(this)) { - accept(arg, visitor); - } - visitor->endVisit(this); -} - void ObjCMessageExpressionAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h index fff0c9f7d52c9208f2df6982b10eb8e032253bb2..ddb4886e78e30542844b03bd1d2b0c61088d9b0c 100644 --- a/src/shared/cplusplus/ASTVisitor.h +++ b/src/shared/cplusplus/ASTVisitor.h @@ -91,6 +91,13 @@ public: void accept(AST *ast); + template <typename _Tp> + void accept(List<_Tp> *it) + { + for (; it; it = it->next) + accept(it->value); + } + virtual bool preVisit(AST *) { return true; } virtual void postVisit(AST *) {} diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h index c562384bf9a3d28c8ba381dbb02dc61a3ff5b7b3..119758e63b5e459867f6a66cdd0b6384894bb561 100644 --- a/src/shared/cplusplus/ASTfwd.h +++ b/src/shared/cplusplus/ASTfwd.h @@ -132,7 +132,6 @@ class ObjCInstanceVariablesDeclarationAST; class ObjCMessageArgumentAST; class ObjCMessageArgumentDeclarationAST; class ObjCMessageArgumentDeclarationListAST; -class ObjCMessageArgumentListAST; class ObjCMessageExpressionAST; class ObjCMethodDeclarationAST; class ObjCMethodPrototypeAST; @@ -201,6 +200,7 @@ typedef List<DeclarationAST *> DeclarationListAST; typedef List<StatementAST *> StatementListAST; typedef List<DeclaratorAST *> DeclaratorListAST; typedef List<NameAST *> ObjCIdentifierListAST; +typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST; typedef ExpressionListAST TemplateArgumentListAST; diff --git a/src/shared/cplusplus/CheckExpression.cpp b/src/shared/cplusplus/CheckExpression.cpp index 3703577ed0e8884215aff2d66b631692adf138e8..14ced9509a68d222c245ff55ddc10092853f00bf 100644 --- a/src/shared/cplusplus/CheckExpression.cpp +++ b/src/shared/cplusplus/CheckExpression.cpp @@ -369,7 +369,7 @@ bool CheckExpression::visit(ObjCMessageExpressionAST *ast) semantic()->check(ast->receiver_expression, _scope); (void) semantic()->check(ast->selector, _scope); - accept(ast->argument_list); + accept(ast->argument_list); // ### not necessary. return false; } diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 8cfa100c6ee9683a7efe69cdd9616c0d7c8c83ce..06a938763a685e950f6af7ad33636d33aa3ee5f4 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -3257,7 +3257,7 @@ bool Parser::parseObjCMessageArguments(ObjCSelectorAST *&selNode, ObjCMessageArg ObjCSelectorArgumentListAST *lastSelector = selAst; ObjCMessageArgumentListAST *argAst = new (_pool) ObjCMessageArgumentListAST; - argAst->arg = messageArgument; + argAst->value = messageArgument; ObjCMessageArgumentListAST *lastArgument = argAst; while (parseObjCSelectorArg(selectorArgument, messageArgument)) { @@ -3268,11 +3268,11 @@ bool Parser::parseObjCMessageArguments(ObjCSelectorAST *&selNode, ObjCMessageArg lastArgument->next = new (_pool) ObjCMessageArgumentListAST; lastArgument = lastArgument->next; - lastArgument->arg = messageArgument; + lastArgument->value = messageArgument; } if (LA() == T_COMMA) { - ExpressionAST **lastExpression = &(lastArgument->arg->parameter_value_expression); + ExpressionAST **lastExpression = &(lastArgument->value->parameter_value_expression); while (LA() == T_COMMA) { BinaryExpressionAST *binaryExpression = new (_pool) BinaryExpressionAST;