summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Parser.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2009-07-31 16:03:48 +0200
committerErik Verbruggen <erik.verbruggen@nokia.com>2009-07-31 16:03:48 +0200
commit4a0da2c6f2663d9469bfd929fa682b6df7d42ab7 (patch)
treed8fb1fbbeacaadad06024ecd5ce8e84c8f30d547 /src/shared/cplusplus/Parser.cpp
parentb713f1772a4de8330bcdd96a00b9cf103541e008 (diff)
downloadqt-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.cpp52
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;
}