Added Semantic checks for ObjC methods.

This commit is contained in:
Erik Verbruggen
2009-07-31 16:03:48 +02:00
parent b713f1772a
commit 4a0da2c6f2
22 changed files with 281 additions and 35 deletions

View File

@@ -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;
}