From: Chris Lattner Date: Fri, 25 Jan 2008 18:59:06 +0000 (+0000) Subject: split the second half of ParseObjCMessageExpression into a new X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=699b66138ac307a32e238463e0eff513ff17d337;p=clang split the second half of ParseObjCMessageExpression into a new ParseObjCMessageExpressionBody method. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46363 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp index 34694ef5c5..1bebe250af 100644 --- a/Parse/ParseObjc.cpp +++ b/Parse/ParseObjc.cpp @@ -1262,6 +1262,30 @@ Parser::ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) { /// expression /// class-name /// type-name +Parser::ExprResult Parser::ParseObjCMessageExpression() { + assert(Tok.is(tok::l_square) && "'[' expected"); + SourceLocation LBracLoc = ConsumeBracket(); // consume '[' + + // Parse receiver + if (Tok.is(tok::identifier) && + (Actions.isTypeName(*Tok.getIdentifierInfo(), CurScope) + || Tok.isNamedIdentifier("super"))) { + IdentifierInfo *ReceiverName = Tok.getIdentifierInfo(); + ConsumeToken(); + return ParseObjCMessageExpressionBody(LBracLoc, ReceiverName, 0); + } + + ExprResult Res = ParseAssignmentExpression(); + if (Res.isInvalid) { + Diag(Tok, diag::err_invalid_receiver_to_message); + SkipUntil(tok::identifier); + return Res; + } + return ParseObjCMessageExpressionBody(LBracLoc, 0, Res.Val); +} + +/// ParseObjCMessageExpressionBody - Having parsed "'[' objc-receiver", parse +/// the rest of a message expression. /// /// objc-message-args: /// objc-selector @@ -1281,26 +1305,10 @@ Parser::ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) { /// assignment-expression /// nonempty-expr-list , assignment-expression /// -Parser::ExprResult Parser::ParseObjCMessageExpression() { - assert(Tok.is(tok::l_square) && "'[' expected"); - SourceLocation LBracloc = ConsumeBracket(); // consume '[' - IdentifierInfo *ReceiverName = 0; - ExprTy *ReceiverExpr = 0; - // Parse receiver - if (Tok.is(tok::identifier) && - (Actions.isTypeName(*Tok.getIdentifierInfo(), CurScope) - || Tok.isNamedIdentifier("super"))) { - ReceiverName = Tok.getIdentifierInfo(); - ConsumeToken(); - } else { - ExprResult Res = ParseAssignmentExpression(); - if (Res.isInvalid) { - Diag(Tok, diag::err_invalid_receiver_to_message); - SkipUntil(tok::identifier); - return Res; - } - ReceiverExpr = Res.Val; - } +Parser::ExprResult +Parser::ParseObjCMessageExpressionBody(SourceLocation LBracLoc, + IdentifierInfo *ReceiverName, + ExprTy *ReceiverExpr) { // Parse objc-selector SourceLocation Loc; IdentifierInfo *selIdent = ParseObjCSelector(Loc); @@ -1357,7 +1365,7 @@ Parser::ExprResult Parser::ParseObjCMessageExpression() { SkipUntil(tok::semi); return true; } - SourceLocation RBracloc = ConsumeBracket(); // consume ']' + SourceLocation RBracLoc = ConsumeBracket(); // consume ']' unsigned nKeys = KeyIdents.size(); if (nKeys == 0) @@ -1367,9 +1375,9 @@ Parser::ExprResult Parser::ParseObjCMessageExpression() { // We've just parsed a keyword message. if (ReceiverName) return Actions.ActOnClassMessage(CurScope, - ReceiverName, Sel, LBracloc, RBracloc, + ReceiverName, Sel, LBracLoc, RBracLoc, &KeyExprs[0], KeyExprs.size()); - return Actions.ActOnInstanceMessage(ReceiverExpr, Sel, LBracloc, RBracloc, + return Actions.ActOnInstanceMessage(ReceiverExpr, Sel, LBracLoc, RBracLoc, &KeyExprs[0], KeyExprs.size()); } diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index 508dc306ad..ba1597d3f8 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -368,7 +368,10 @@ private: ExprResult ParseObjCSelectorExpression(SourceLocation AtLoc); ExprResult ParseObjCProtocolExpression(SourceLocation AtLoc); ExprResult ParseObjCMessageExpression(); - + ExprResult ParseObjCMessageExpressionBody(SourceLocation LBracloc, + IdentifierInfo *ReceiverName, + ExprTy *ReceiverExpr); + //===--------------------------------------------------------------------===// // C99 6.8: Statements and Blocks.