]> granicus.if.org Git - clang/commitdiff
split the second half of ParseObjCMessageExpression into a new
authorChris Lattner <sabre@nondot.org>
Fri, 25 Jan 2008 18:59:06 +0000 (18:59 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 25 Jan 2008 18:59:06 +0000 (18:59 +0000)
ParseObjCMessageExpressionBody method.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46363 91177308-0d34-0410-b5e6-96231b3b80d8

Parse/ParseObjc.cpp
include/clang/Parse/Parser.h

index 34694ef5c5bbc54af7a3bbfff7e4145ba3495644..1bebe250af910a68f084ca4a1c0329f95d076096 100644 (file)
@@ -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());
 }
 
index 508dc306ad259510ef5be511c5a70c9fcf86cff0..ba1597d3f890b00ab0273fbe180fdf2cd21dda23 100644 (file)
@@ -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.