diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2009-07-31 16:03:48 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2009-07-31 16:03:48 +0200 |
commit | 4a0da2c6f2663d9469bfd929fa682b6df7d42ab7 (patch) | |
tree | d8fb1fbbeacaadad06024ecd5ce8e84c8f30d547 /src/shared/cplusplus/Parser.cpp | |
parent | b713f1772a4de8330bcdd96a00b9cf103541e008 (diff) | |
download | qt-creator-4a0da2c6f2663d9469bfd929fa682b6df7d42ab7.tar.gz |
Added Semantic checks for ObjC methods.
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index d0a7b05bcb..ee8e714f64 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -2967,7 +2967,7 @@ bool Parser::parseObjCMessageExpression(ExpressionAST *&node) ast->lbracket_token = consumeToken(); parseObjCMessageReceiver(ast->receiver_expression); - parseObjCMessageArguments(ast->argument_list); + parseObjCMessageArguments(ast->selector, ast->argument_list); match(T_RBRACKET, &(ast->rbracket_token)); node = ast; @@ -2979,25 +2979,34 @@ bool Parser::parseObjCMessageReceiver(ExpressionAST *&node) return parseExpression(node); } -bool Parser::parseObjCMessageArguments(ObjCMessageArgumentListAST *& node) +bool Parser::parseObjCMessageArguments(ObjCSelectorAST *&selNode, ObjCMessageArgumentListAST *& argNode) { if (LA() == T_RBRACKET) return false; // nothing to do. unsigned start = cursor(); - ObjCMessageArgumentListAST *ast = new (_pool) ObjCMessageArgumentListAST; - ObjCMessageArgumentAST *argument = 0; + ObjCSelectorArgumentAST *selectorArgument = 0; + ObjCMessageArgumentAST *messageArgument = 0; - if (parseObjCSelectorArg(argument)) { - ast->arg = argument; - ObjCMessageArgumentListAST *lastArgument = ast; + if (parseObjCSelectorArg(selectorArgument, messageArgument)) { + ObjCSelectorArgumentListAST *selAst = new (_pool) ObjCSelectorArgumentListAST; + selAst->argument = selectorArgument; + ObjCSelectorArgumentListAST *lastSelector = selAst; - while (parseObjCSelectorArg(argument)) { + ObjCMessageArgumentListAST *argAst = new (_pool) ObjCMessageArgumentListAST; + argAst->arg = messageArgument; + ObjCMessageArgumentListAST *lastArgument = argAst; + + while (parseObjCSelectorArg(selectorArgument, messageArgument)) { // accept the selector args. + lastSelector->next = new (_pool) ObjCSelectorArgumentListAST; + lastSelector = lastSelector->next; + lastSelector->argument = selectorArgument; + lastArgument->next = new (_pool) ObjCMessageArgumentListAST; lastArgument = lastArgument->next; - lastArgument->arg = argument; + lastArgument->arg = messageArgument; } if (LA() == T_COMMA) { @@ -3011,17 +3020,24 @@ bool Parser::parseObjCMessageArguments(ObjCMessageArgumentListAST *& node) lastExpression = &(binaryExpression->right_expression); } } + + ObjCSelectorWithArgumentsAST *selWithArgs = new (_pool) ObjCSelectorWithArgumentsAST; + selWithArgs->selector_arguments = selAst; + + selNode = selWithArgs; + argNode = argAst; } else { rewind(start); - ast->arg = new (_pool) ObjCMessageArgumentAST; - parseObjCSelector(ast->arg->parameter_key_identifier); + ObjCSelectorWithoutArgumentsAST *sel = new (_pool) ObjCSelectorWithoutArgumentsAST; + parseObjCSelector(sel->name_token); + selNode = sel; + argNode = 0; } - node = ast; return true; } -bool Parser::parseObjCSelectorArg(ObjCMessageArgumentAST *&node) +bool Parser::parseObjCSelectorArg(ObjCSelectorArgumentAST *&selNode, ObjCMessageArgumentAST *&argNode) { unsigned selector_token = 0; if (!parseObjCSelector(selector_token)) @@ -3030,12 +3046,12 @@ bool Parser::parseObjCSelectorArg(ObjCMessageArgumentAST *&node) if (LA() != T_COLON) return false; - ObjCMessageArgumentAST *argument = new (_pool) ObjCMessageArgumentAST; - argument->parameter_key_identifier = selector_token; - argument->colon_token = consumeToken(); + selNode = new (_pool) ObjCSelectorArgumentAST; + selNode->name_token = selector_token; + selNode->colon_token = consumeToken(); - parseAssignmentExpression(argument->parameter_value_expression); - node = argument; + argNode = new (_pool) ObjCMessageArgumentAST; + parseAssignmentExpression(argNode->parameter_value_expression); return true; } |