From: Fariborz Jahanian Date: Wed, 5 Sep 2007 23:08:20 +0000 (+0000) Subject: Patch for parsing objective-c style method calls. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a65ff6c81f5b278000839988bb532114fd8c6797;p=clang Patch for parsing objective-c style method calls. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41731 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp index cb65c1c27a..21f59e32b7 100644 --- a/Parse/ParseObjc.cpp +++ b/Parse/ParseObjc.cpp @@ -941,7 +941,47 @@ Parser::ExprResult Parser::ParseObjCExpression() { /// nonempty-expr-list , assignment-expression /// Parser::ExprResult Parser::ParseObjCMessageExpression() { - assert(false && "Unimp"); + assert(Tok.getKind() == tok::l_square && "'[' expected"); + SourceLocation Loc = ConsumeBracket(); // consume '[' + // Parse receiver + // FIXME: receiver as type-name/class-name + ParseAssignmentExpression(); + // Parse objc-selector + IdentifierInfo *selIdent = ParseObjCSelector(); + if (Tok.getKind() == tok::colon) { + while (1) { + // Each iteration parses a single keyword argument. + if (Tok.getKind() != tok::colon) { + Diag(Tok, diag::err_expected_colon); + SkipUntil(tok::semi); + return 0; + } + ConsumeToken(); // Eat the ':'. + /// Parse the expression after ':' + ParseAssignmentExpression(); + IdentifierInfo *keywordSelector = ParseObjCSelector(); + + if (!keywordSelector && Tok.getKind() != tok::colon) + break; + // We have a selector or a colon, continue parsing. + } + // Parse the, optional, argument list, comma separated. + while (Tok.getKind() == tok::comma) { + ConsumeToken(); + /// Parse the expression after ',' + ParseAssignmentExpression(); + } + } else if (!selIdent) { + Diag(Tok, diag::err_expected_ident); // missing selector name. + SkipUntil(tok::semi); + return 0; + } + if (Tok.getKind() != tok::r_square) { + Diag(Tok, diag::err_expected_rsquare); + SkipUntil(tok::semi); + return 0; + } + ConsumeBracket(); // consume ']' return 0; } diff --git a/test/Parser/objc-messaging-1.m b/test/Parser/objc-messaging-1.m new file mode 100644 index 0000000000..3f6168f6b2 --- /dev/null +++ b/test/Parser/objc-messaging-1.m @@ -0,0 +1,14 @@ +// RUN: clang %s -parse-noop +int main () +{ + int i,j; + struct S *p; + [p ii]; + [p if: 1 :2]; + [p inout: 1 :2 another:(2,3,4)]; + [p inout: 1 :2 another:(2,3,4), 6,6,8]; + [p inout: 1 :2 another:(2,3,4), (6,4,5),6,8]; + [p inout: 1 :2 another:(i+10), (i,j-1,5),6,8]; + [p long: 1 :2 another:(i+10), (i,j-1,5),6,8]; + [p : "Hello\n" :2 another:(i+10), (i,j-1,5),6,8]; +}