Finish defining Action API for message expressions.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42059 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp
index d61d621..87cc277 100644
--- a/Parse/ParseObjc.cpp
+++ b/Parse/ParseObjc.cpp
@@ -1051,11 +1051,18 @@
   }
   ConsumeBracket(); // consume ']'
   
+  if (KeyInfo.size()) {
+    // We've just parsed a keyword message.
+    if (ReceiverName) 
+      return Actions.ActOnKeywordMessage(ReceiverName, 
+                                            &KeyInfo[0], KeyInfo.size());
+    return Actions.ActOnKeywordMessage(ReceiverExpr, 
+                                            &KeyInfo[0], KeyInfo.size());
+  }
+  // We've just parsed a unary message (a message with no arguments).
   if (ReceiverName) 
-    return Actions.ActOnMessageExpression(ReceiverName, 
-                                          &KeyInfo[0], KeyInfo.size());
-  return Actions.ActOnMessageExpression(ReceiverExpr, 
-                                          &KeyInfo[0], KeyInfo.size());
+    return Actions.ActOnUnaryMessage(ReceiverName, selIdent);
+  return Actions.ActOnUnaryMessage(ReceiverExpr, selIdent);
 }
 
 Parser::ExprResult Parser::ParseObjCStringLiteral() {
diff --git a/Sema/Sema.h b/Sema/Sema.h
index c1d3a3a..5272444 100644
--- a/Sema/Sema.h
+++ b/Sema/Sema.h
@@ -371,6 +371,19 @@
   virtual DeclTy *ObjcBuildMethodDeclaration(SourceLocation MethodLoc, 
  	     	    tok::TokenKind MethodType, TypeTy *ReturnType,
      		    IdentifierInfo *SelectorName, AttributeList *AttrList);
+                    
+  // This actions handles keyword message to classes.
+  virtual ExprResult ActOnKeywordMessage(IdentifierInfo *receivingClassName, 
+    ObjcKeywordMessage *Keywords, unsigned NumKeywords);
+  // This action handles keyword messages to instances.
+  virtual ExprResult ActOnKeywordMessage(ExprTy *receiver, 
+    ObjcKeywordMessage *Keywords, unsigned NumKeywords);
+    
+  // This actions handles keyword message to classes.
+  virtual ExprResult ActOnUnaryMessage(IdentifierInfo *receivingClassName, 
+                                    IdentifierInfo *selName);
+  // This action handles keyword messages to instances.
+  virtual ExprResult ActOnUnaryMessage(ExprTy *receiver, IdentifierInfo *sName);
 private:
   // UsualUnaryConversions - promotes integers (C99 6.3.1.1p2) and converts
   // functions and arrays to their respective pointers (C99 6.3.2.1). 
diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp
index da1981f..d7136a3 100644
--- a/Sema/SemaExpr.cpp
+++ b/Sema/SemaExpr.cpp
@@ -1855,3 +1855,29 @@
   QualType t = Context.getPointerType(Context.CharTy);
   return new ObjCEncodeExpr(t, EncodedType, AtLoc, RParenLoc);
 }
+
+// This actions handles keyword message to classes.
+Sema::ExprResult Sema::ActOnKeywordMessage(IdentifierInfo *receivingClassName, 
+    ObjcKeywordMessage *Keywords, unsigned NumKeywords)
+{
+  return 0;
+}
+
+// This action handles keyword messages to instances.
+Sema::ExprResult Sema::ActOnKeywordMessage(ExprTy *receiver, 
+    ObjcKeywordMessage *Keywords, unsigned NumKeywords) {
+  return 0;
+}
+    
+// This actions handles keyword message to classes.
+Sema::ExprResult Sema::ActOnUnaryMessage(IdentifierInfo *receivingClassName, 
+                                         IdentifierInfo *selName) {
+  return 0;
+}
+
+// This action handles keyword messages to instances.
+Sema::ExprResult Sema::ActOnUnaryMessage(ExprTy *receiver, 
+                                         IdentifierInfo *selName) {
+  return 0;
+}
+
diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h
index 2d7e8f4..548ff1a 100644
--- a/include/clang/Parse/Action.h
+++ b/include/clang/Parse/Action.h
@@ -460,15 +460,24 @@
     return 0;
   }
   // This actions handles keyword message to classes.
-  virtual DeclTy *ActOnMessageExpression(IdentifierInfo *receivingClassName, 
+  virtual ExprResult ActOnKeywordMessage(IdentifierInfo *receivingClassName, 
     ObjcKeywordMessage *Keywords, unsigned NumKeywords) {
     return 0;
   }
   // This action handles keyword messages to instances.
-  virtual DeclTy *ActOnMessageExpression(ExprTy *receiver, 
+  virtual ExprResult ActOnKeywordMessage(ExprTy *receiver, 
     ObjcKeywordMessage *Keywords, unsigned NumKeywords) {
     return 0;
   }
+  // This actions handles keyword message to classes.
+  virtual ExprResult ActOnUnaryMessage(IdentifierInfo *receivingClassName, 
+                                    IdentifierInfo *selName) {
+    return 0;
+  }
+  // This action handles keyword messages to instances.
+  virtual ExprResult ActOnUnaryMessage(ExprTy *receiver,IdentifierInfo *sName) {
+    return 0;
+  }
   virtual DeclTy *ObjcClassDeclaration(Scope *S, SourceLocation AtClassLoc,
                                        IdentifierInfo **IdentList,
                                        unsigned NumElts) {