]> granicus.if.org Git - clang/commitdiff
Add a method prototype slot/getter to the ObjCMessageExpr AST.
authorSteve Naroff <snaroff@apple.com>
Sat, 3 Nov 2007 16:37:59 +0000 (16:37 +0000)
committerSteve Naroff <snaroff@apple.com>
Sat, 3 Nov 2007 16:37:59 +0000 (16:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43666 91177308-0d34-0410-b5e6-96231b3b80d8

AST/Expr.cpp
Sema/SemaExpr.cpp
include/clang/AST/Expr.h

index 14ef48c7de8ecdaff5646a2d53e48d47c11b542e..ffb34f59cad25d0db0c995b583c6de1ab4ff9de3 100644 (file)
@@ -871,9 +871,11 @@ unsigned OCUVectorElementExpr::getEncodedElementAccess() const {
 
 // constructor for instance messages.
 ObjCMessageExpr::ObjCMessageExpr(Expr *receiver, Selector selInfo,
-                QualType retType, SourceLocation LBrac, SourceLocation RBrac,
+                QualType retType, ObjcMethodDecl *mproto,
+                SourceLocation LBrac, SourceLocation RBrac,
                 Expr **ArgExprs)
-  : Expr(ObjCMessageExprClass, retType), SelName(selInfo), ClassName(0) {
+  : Expr(ObjCMessageExprClass, retType), SelName(selInfo), 
+    MethodProto(mproto), ClassName(0) {
   unsigned numArgs = selInfo.getNumArgs();
   SubExprs = new Expr*[numArgs+1];
   SubExprs[RECEIVER] = receiver;
@@ -888,9 +890,11 @@ ObjCMessageExpr::ObjCMessageExpr(Expr *receiver, Selector selInfo,
 // constructor for class messages. 
 // FIXME: clsName should be typed to ObjCInterfaceType
 ObjCMessageExpr::ObjCMessageExpr(IdentifierInfo *clsName, Selector selInfo,
-                QualType retType, SourceLocation LBrac, SourceLocation RBrac,
+                QualType retType, ObjcMethodDecl *mproto,
+                SourceLocation LBrac, SourceLocation RBrac,
                 Expr **ArgExprs)
-  : Expr(ObjCMessageExprClass, retType), SelName(selInfo), ClassName(clsName) {
+  : Expr(ObjCMessageExprClass, retType), SelName(selInfo), 
+    MethodProto(mproto), ClassName(clsName) {
   unsigned numArgs = selInfo.getNumArgs();
   SubExprs = new Expr*[numArgs+1];
   SubExprs[RECEIVER] = 0;
index 30aa7b3001914e4cc3d5d54b4c95a1df425f4902..bc371c77d0033171ad4c4e2b109b8d5ce4fe5f03 100644 (file)
@@ -2074,8 +2074,8 @@ Sema::ExprResult Sema::ActOnClassMessage(
         return true;
     }
   }
-  return new ObjCMessageExpr(receiverName, Sel, returnType, lbrac, rbrac,
-                             ArgExprs);
+  return new ObjCMessageExpr(receiverName, Sel, returnType, Method,
+                             lbrac, rbrac, ArgExprs);
 }
 
 // ActOnInstanceMessage - used for both unary and keyword messages.
@@ -2091,9 +2091,10 @@ Sema::ExprResult Sema::ActOnInstanceMessage(
   Expr *RExpr = static_cast<Expr *>(receiver);
   QualType receiverType = RExpr->getType();
   QualType returnType;
+  ObjcMethodDecl *Method;
   
   if (receiverType == Context.getObjcIdType()) {
-    ObjcMethodDecl *Method = InstanceMethodPool[Sel].Method;
+    Method = InstanceMethodPool[Sel].Method;
     if (!Method) {
       Diag(lbrac, diag::warn_method_not_found, std::string("-"), Sel.getName(),
            SourceRange(lbrac, rbrac));
@@ -2119,7 +2120,7 @@ Sema::ExprResult Sema::ActOnInstanceMessage(
     // FIXME: consider using InstanceMethodPool, since it will be faster
     // than the following method (which can do *many* linear searches). The
     // idea is to add class info to InstanceMethodPool...
-    ObjcMethodDecl *Method = ClassDecl->lookupInstanceMethod(Sel);
+    Method = ClassDecl->lookupInstanceMethod(Sel);
     if (!Method) {
       Diag(lbrac, diag::warn_method_not_found, std::string("-"), Sel.getName(),
            SourceRange(lbrac, rbrac));
@@ -2131,5 +2132,6 @@ Sema::ExprResult Sema::ActOnInstanceMessage(
           return true;
     }
   }
-  return new ObjCMessageExpr(RExpr, Sel, returnType, lbrac, rbrac, ArgExprs);
+  return new ObjCMessageExpr(RExpr, Sel, returnType, Method, lbrac, rbrac, 
+                             ArgExprs);
 }
index f4d2af485f63ba626eb61bc0f3205ee695a5b351..3b8a1c0138e2f9b41c529fa74b79d117c3afeb95 100644 (file)
@@ -1181,6 +1181,11 @@ class ObjCMessageExpr : public Expr {
   // A unigue name for this message.
   Selector SelName;
   
+  // A method prototype for this message (optional). 
+  // FIXME: Since method decls contain the selector, and most messages have a
+  // prototype, consider devising a scheme for unifying SelName/MethodProto.
+  ObjcMethodDecl *MethodProto;
+  
   IdentifierInfo *ClassName; // optional - 0 for instance messages.
   
   SourceLocation LBracloc, RBracloc;
@@ -1188,11 +1193,13 @@ public:
   // constructor for class messages. 
   // FIXME: clsName should be typed to ObjCInterfaceType
   ObjCMessageExpr(IdentifierInfo *clsName, Selector selInfo,
-                  QualType retType, SourceLocation LBrac, SourceLocation RBrac,
+                  QualType retType, ObjcMethodDecl *methDecl,
+                  SourceLocation LBrac, SourceLocation RBrac,
                   Expr **ArgExprs);
   // constructor for instance messages.
   ObjCMessageExpr(Expr *receiver, Selector selInfo,
-                  QualType retType, SourceLocation LBrac, SourceLocation RBrac,
+                  QualType retType, ObjcMethodDecl *methDecl,
+                  SourceLocation LBrac, SourceLocation RBrac,
                   Expr **ArgExprs);
   ~ObjCMessageExpr() {
     delete [] SubExprs;
@@ -1203,6 +1210,9 @@ public:
   
   const Selector &getSelector() const { return SelName; }
   Selector &getSelector() { return SelName; }
+
+  const ObjcMethodDecl *getMethodDecl() const { return MethodProto; }
+  ObjcMethodDecl *getMethodDecl() { return MethodProto; }
   
   const IdentifierInfo *getClassName() const { return ClassName; }
   IdentifierInfo *getClassName() { return ClassName; }