summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r--src/shared/cplusplus/Parser.cpp38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 958d740a58..d754b234f4 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -2988,15 +2988,30 @@ bool Parser::parseObjCMessageExpression(ExpressionAST *&node)
if (LA() != T_LBRACKET)
return false;
- ObjCMessageExpressionAST *ast = new (_pool) ObjCMessageExpressionAST;
- ast->lbracket_token = consumeToken();
+ unsigned start = cursor();
- parseObjCMessageReceiver(ast->receiver_expression);
- parseObjCMessageArguments(ast->selector, ast->argument_list);
+ unsigned lbracket_token = consumeToken();
+ ExpressionAST *receiver_expression = 0;
+ ObjCSelectorAST *selector = 0;
+ ObjCMessageArgumentListAST *argument_list = 0;
- match(T_RBRACKET, &(ast->rbracket_token));
- node = ast;
- return true;
+ if (parseObjCMessageReceiver(receiver_expression) &&
+ parseObjCMessageArguments(selector, argument_list)) {
+
+ ObjCMessageExpressionAST *ast = new (_pool) ObjCMessageExpressionAST;
+ ast->lbracket_token = lbracket_token;
+ ast->receiver_expression = receiver_expression;
+ ast->selector = selector;
+ ast->argument_list = argument_list;
+
+ match(T_RBRACKET, &(ast->rbracket_token));
+ node = ast;
+
+ return true;
+ }
+
+ rewind(start);
+ return false;
}
bool Parser::parseObjCMessageReceiver(ExpressionAST *&node)
@@ -3051,15 +3066,20 @@ bool Parser::parseObjCMessageArguments(ObjCSelectorAST *&selNode, ObjCMessageArg
selNode = selWithArgs;
argNode = argAst;
+ return true;
} else {
rewind(start);
+ unsigned name_token = 0;
+ if (!parseObjCSelector(name_token))
+ return false;
ObjCSelectorWithoutArgumentsAST *sel = new (_pool) ObjCSelectorWithoutArgumentsAST;
- parseObjCSelector(sel->name_token);
+ sel->name_token = name_token;
selNode = sel;
argNode = 0;
+ return true;
}
- return true;
+ return false;
}
bool Parser::parseObjCSelectorArg(ObjCSelectorArgumentAST *&selNode, ObjCMessageArgumentAST *&argNode)