[cfe-commits] r45046 - in /cfe/trunk: AST/Decl.cpp Driver/RewriteTest.cpp Sema/SemaDeclObjC.cpp include/clang/AST/DeclObjC.h

Steve Naroff snaroff at apple.com
Fri Dec 14 15:37:57 PST 2007


Author: snaroff
Date: Fri Dec 14 17:37:57 2007
New Revision: 45046

URL: http://llvm.org/viewvc/llvm-project?rev=45046&view=rev
Log:

- Remove getInstanceMethods/getClassMethods API on ObjcInterfaceDecl, ObjcProtocolDecl, and ObjcCategoryDecl. These methods are replaced by the respective iterators on each class.
- Add getInstanceMethodForSelector to ObjcInterfaceDecl, ObjcProtocolDecl, and ObjcCatgoryDecl. This hook will do a "shallow" lookup. This is a convenience method that reducing some of the iterator usage.
- Various changes to convert all clients to the above API's...
 

Modified:
    cfe/trunk/AST/Decl.cpp
    cfe/trunk/Driver/RewriteTest.cpp
    cfe/trunk/Sema/SemaDeclObjC.cpp
    cfe/trunk/include/clang/AST/DeclObjC.h

Modified: cfe/trunk/AST/Decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/AST/Decl.cpp?rev=45046&r1=45045&r2=45046&view=diff

==============================================================================
--- cfe/trunk/AST/Decl.cpp (original)
+++ cfe/trunk/AST/Decl.cpp Fri Dec 14 17:37:57 2007
@@ -409,36 +409,24 @@
 /// the class, its categories, and its super classes (using a linear search).
 ObjcMethodDecl *ObjcInterfaceDecl::lookupInstanceMethod(Selector &Sel) {
   ObjcInterfaceDecl* ClassDecl = this;
+  ObjcMethodDecl *MethodDecl = 0;
+  
   while (ClassDecl != NULL) {
-    ObjcMethodDecl **methods = ClassDecl->getInstanceMethods();
-    int methodCount = ClassDecl->getNumInstanceMethods();
-    for (int i = 0; i < methodCount; ++i) {
-      if (methods[i]->getSelector() == Sel) {
-        return methods[i];
-      }
-    }
+    if ((MethodDecl = ClassDecl->getInstanceMethodForSelector(Sel)))
+      return MethodDecl;
+      
     // Didn't find one yet - look through protocols.
     ObjcProtocolDecl **protocols = ClassDecl->getReferencedProtocols();
     int numProtocols = ClassDecl->getNumIntfRefProtocols();
     for (int pIdx = 0; pIdx < numProtocols; pIdx++) {
-      ObjcMethodDecl **methods = protocols[pIdx]->getInstanceMethods();
-      int methodCount = protocols[pIdx]->getNumInstanceMethods();
-      for (int i = 0; i < methodCount; ++i) {
-        if (methods[i]->getSelector() == Sel) {
-          return methods[i];
-        }
-      }
+      if ((MethodDecl = protocols[pIdx]->getInstanceMethodForSelector(Sel)))
+        return MethodDecl;
     }
     // Didn't find one yet - now look through categories.
     ObjcCategoryDecl *CatDecl = ClassDecl->getCategoryList();
     while (CatDecl) {
-      ObjcMethodDecl **methods = CatDecl->getInstanceMethods();
-      int methodCount = CatDecl->getNumInstanceMethods();
-      for (int i = 0; i < methodCount; ++i) {
-        if (methods[i]->getSelector() == Sel) {
-          return methods[i];
-        }
-      }
+      if ((MethodDecl = CatDecl->getInstanceMethodForSelector(Sel)))
+        return MethodDecl;
       CatDecl = CatDecl->getNextClassCategory();
     }
     ClassDecl = ClassDecl->getSuperClass();
@@ -450,36 +438,24 @@
 // class, its categories, and its super classes (using a linear search).
 ObjcMethodDecl *ObjcInterfaceDecl::lookupClassMethod(Selector &Sel) {
   ObjcInterfaceDecl* ClassDecl = this;
+  ObjcMethodDecl *MethodDecl = 0;
+
   while (ClassDecl != NULL) {
-    ObjcMethodDecl **methods = ClassDecl->getClassMethods();
-    int methodCount = ClassDecl->getNumClassMethods();
-    for (int i = 0; i < methodCount; ++i) {
-      if (methods[i]->getSelector() == Sel) {
-        return methods[i];
-      }
-    }
+    if ((MethodDecl = ClassDecl->getClassMethodForSelector(Sel)))
+      return MethodDecl;
+
     // Didn't find one yet - look through protocols.
     ObjcProtocolDecl **protocols = ClassDecl->getReferencedProtocols();
     int numProtocols = ClassDecl->getNumIntfRefProtocols();
     for (int pIdx = 0; pIdx < numProtocols; pIdx++) {
-      ObjcMethodDecl **methods = protocols[pIdx]->getClassMethods();
-      int methodCount = protocols[pIdx]->getNumClassMethods();
-      for (int i = 0; i < methodCount; ++i) {
-        if (methods[i]->getSelector() == Sel) {
-          return methods[i];
-        }
-      }
+      if ((MethodDecl = protocols[pIdx]->getClassMethodForSelector(Sel)))
+        return MethodDecl;
     }
     // Didn't find one yet - now look through categories.
     ObjcCategoryDecl *CatDecl = ClassDecl->getCategoryList();
     while (CatDecl) {
-      ObjcMethodDecl **methods = CatDecl->getClassMethods();
-      int methodCount = CatDecl->getNumClassMethods();
-      for (int i = 0; i < methodCount; ++i) {
-        if (methods[i]->getSelector() == Sel) {
-          return methods[i];
-        }
-      }
+      if ((MethodDecl = CatDecl->getClassMethodForSelector(Sel)))
+        return MethodDecl;
       CatDecl = CatDecl->getNextClassCategory();
     }
     ClassDecl = ClassDecl->getSuperClass();
@@ -532,19 +508,17 @@
 // lookupInstanceMethod - Lookup a instance method in the protocol and protocols
 // it inherited.
 ObjcMethodDecl *ObjcProtocolDecl::lookupInstanceMethod(Selector &Sel) {
-  ObjcMethodDecl *const*methods = getInstanceMethods();
-  int methodCount = getNumInstanceMethods();
-  for (int i = 0; i < methodCount; ++i) {
-    if (methods[i]->getSelector() == Sel) {
-      return methods[i];
-    }
-  }
+  ObjcMethodDecl *MethodDecl = NULL;
+  
+  if ((MethodDecl = getInstanceMethodForSelector(Sel)))
+    return MethodDecl;
+    
   if (getNumReferencedProtocols() > 0) {
     ObjcProtocolDecl **RefPDecl = getReferencedProtocols();
     
     for (int i = 0; i < getNumReferencedProtocols(); i++) {
-      if (ObjcMethodDecl *Method = RefPDecl[i]->lookupInstanceMethod(Sel))
-        return Method;
+      if ((MethodDecl = RefPDecl[i]->getInstanceMethodForSelector(Sel)))
+        return MethodDecl;
     }
   }
   return NULL;
@@ -553,20 +527,33 @@
 // lookupInstanceMethod - Lookup a class method in the protocol and protocols
 // it inherited.
 ObjcMethodDecl *ObjcProtocolDecl::lookupClassMethod(Selector &Sel) {
-  ObjcMethodDecl *const*methods = getClassMethods();
-  int methodCount = getNumClassMethods();
-  for (int i = 0; i < methodCount; ++i) {
-    if (methods[i]->getSelector() == Sel) {
-      return methods[i];
-    }
-  }
+  ObjcMethodDecl *MethodDecl = NULL;
+
+  if ((MethodDecl = getClassMethodForSelector(Sel)))
+    return MethodDecl;
+    
   if (getNumReferencedProtocols() > 0) {
     ObjcProtocolDecl **RefPDecl = getReferencedProtocols();
     
     for (int i = 0; i < getNumReferencedProtocols(); i++) {
-      if (ObjcMethodDecl *Method = RefPDecl[i]->lookupClassMethod(Sel))
-        return Method;
+      if ((MethodDecl = RefPDecl[i]->getClassMethodForSelector(Sel)))
+        return MethodDecl;
     }
   }
   return NULL;
 }
+
+ObjcInterfaceDecl *const ObjcMethodDecl::getClassInterface() const {
+  if (ObjcInterfaceDecl *ID = dyn_cast<ObjcInterfaceDecl>(MethodContext))
+    return ID;
+  if (ObjcCategoryDecl *CD = dyn_cast<ObjcCategoryDecl>(MethodContext))
+    return CD->getClassInterface();
+  if (ObjcImplementationDecl *IMD = 
+      dyn_cast<ObjcImplementationDecl>(MethodContext))
+    return IMD->getClassInterface();
+  if (ObjcCategoryImplDecl *CID = 
+      dyn_cast<ObjcCategoryImplDecl>(MethodContext))
+    return CID->getClassInterface();
+  assert(false && "unknown method context");
+  return 0;
+}

Modified: cfe/trunk/Driver/RewriteTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/RewriteTest.cpp?rev=45046&r1=45045&r2=45046&view=diff

==============================================================================
--- cfe/trunk/Driver/RewriteTest.cpp (original)
+++ cfe/trunk/Driver/RewriteTest.cpp Fri Dec 14 17:37:57 2007
@@ -144,7 +144,7 @@
     void RewriteCategoryDecl(ObjcCategoryDecl *Dcl);
     void RewriteProtocolDecl(ObjcProtocolDecl *Dcl);
     void RewriteForwardProtocolDecl(ObjcForwardProtocolDecl *Dcl);
-    void RewriteMethodDeclarations(int nMethods, ObjcMethodDecl **Methods);
+    void RewriteMethodDeclaration(ObjcMethodDecl *Method);
     void RewriteProperties(int nProperties, ObjcPropertyDecl **Properties);
     void RewriteFunctionDecl(FunctionDecl *FD);
     void RewriteObjcQualifiedInterfaceTypes(Decl *Dcl);
@@ -398,18 +398,15 @@
                       typedefString.c_str(), typedefString.size());
 }
 
-void RewriteTest::RewriteMethodDeclarations(int nMethods, ObjcMethodDecl **Methods) {
-  for (int i = 0; i < nMethods; i++) {
-    ObjcMethodDecl *Method = Methods[i];
-    SourceLocation LocStart = Method->getLocStart();
-    SourceLocation LocEnd = Method->getLocEnd();
-    
-    if (SM->getLineNumber(LocEnd) > SM->getLineNumber(LocStart)) {
-      Rewrite.InsertText(LocStart, "/* ", 3);
-      Rewrite.ReplaceText(LocEnd, 1, ";*/ ", 4);
-    } else {
-      Rewrite.InsertText(LocStart, "// ", 3);
-    }
+void RewriteTest::RewriteMethodDeclaration(ObjcMethodDecl *Method) {
+  SourceLocation LocStart = Method->getLocStart();
+  SourceLocation LocEnd = Method->getLocEnd();
+    
+  if (SM->getLineNumber(LocEnd) > SM->getLineNumber(LocStart)) {
+	Rewrite.InsertText(LocStart, "/* ", 3);
+	Rewrite.ReplaceText(LocEnd, 1, ";*/ ", 4);
+  } else {
+	Rewrite.InsertText(LocStart, "// ", 3);
   }
 }
 
@@ -431,10 +428,13 @@
   // FIXME: handle category headers that are declared across multiple lines.
   Rewrite.ReplaceText(LocStart, 0, "// ", 3);
   
-  RewriteMethodDeclarations(CatDecl->getNumInstanceMethods(),
-                            CatDecl->getInstanceMethods());
-  RewriteMethodDeclarations(CatDecl->getNumClassMethods(),
-                            CatDecl->getClassMethods());
+  for (ObjcCategoryDecl::instmeth_iterator I = CatDecl->instmeth_begin(), 
+       E = CatDecl->instmeth_end(); I != E; ++I)
+    RewriteMethodDeclaration(*I);
+  for (ObjcCategoryDecl::classmeth_iterator I = CatDecl->classmeth_begin(), 
+       E = CatDecl->classmeth_end(); I != E; ++I)
+    RewriteMethodDeclaration(*I);
+
   // Lastly, comment out the @end.
   Rewrite.ReplaceText(CatDecl->getAtEndLoc(), 0, "// ", 3);
 }
@@ -447,10 +447,13 @@
   // FIXME: handle protocol headers that are declared across multiple lines.
   Rewrite.ReplaceText(LocStart, 0, "// ", 3);
   
-  RewriteMethodDeclarations(PDecl->getNumInstanceMethods(),
-                            PDecl->getInstanceMethods());
-  RewriteMethodDeclarations(PDecl->getNumClassMethods(),
-                            PDecl->getClassMethods());
+  for (ObjcProtocolDecl::instmeth_iterator I = PDecl->instmeth_begin(), 
+       E = PDecl->instmeth_end(); I != E; ++I)
+    RewriteMethodDeclaration(*I);
+  for (ObjcProtocolDecl::classmeth_iterator I = PDecl->classmeth_begin(), 
+       E = PDecl->classmeth_end(); I != E; ++I)
+    RewriteMethodDeclaration(*I);
+
   // Lastly, comment out the @end.
   SourceLocation LocEnd = PDecl->getAtEndLoc();
   Rewrite.ReplaceText(LocEnd, 0, "// ", 3);
@@ -619,11 +622,13 @@
     
   RewriteProperties(ClassDecl->getNumPropertyDecl(),
                     ClassDecl->getPropertyDecl());
-  RewriteMethodDeclarations(ClassDecl->getNumInstanceMethods(),
-                            ClassDecl->getInstanceMethods());
-  RewriteMethodDeclarations(ClassDecl->getNumClassMethods(),
-                            ClassDecl->getClassMethods());
-  
+  for (ObjcInterfaceDecl::instmeth_iterator I = ClassDecl->instmeth_begin(), 
+       E = ClassDecl->instmeth_end(); I != E; ++I)
+    RewriteMethodDeclaration(*I);
+  for (ObjcInterfaceDecl::classmeth_iterator I = ClassDecl->classmeth_begin(), 
+       E = ClassDecl->classmeth_end(); I != E; ++I)
+    RewriteMethodDeclaration(*I);
+
   // Lastly, comment out the @end.
   Rewrite.ReplaceText(ClassDecl->getAtEndLoc(), 0, "// ", 3);
 }
@@ -1843,31 +1848,27 @@
         objc_protocol_methods = true;
       }
       
-      // Output instance methods declared in this protocol.
-      int NumMethods = PDecl->getNumInstanceMethods();
-      if (NumMethods > 0) {
+	  int NumMethods = PDecl->getNumInstanceMethods();
+	  if(NumMethods > 0) {
         Result += "\nstatic struct _objc_protocol_method_list "
                "_OBJC_PROTOCOL_INSTANCE_METHODS_";
         Result += PDecl->getName();
         Result += " __attribute__ ((section (\"__OBJC, __cat_inst_meth\")))= "
           "{\n\t" + utostr(NumMethods) + "\n";
         
-        ObjcMethodDecl **Methods = PDecl->getInstanceMethods();
-        Result += "\t,{{(SEL)\"";
-        Result += Methods[0]->getSelector().getName().c_str();
-        Result += "\", \"\"}\n";
-                       
-        for (int i = 1; i < NumMethods; i++) {
-          Result += "\t  ,{(SEL)\"";
-          Result += Methods[i]->getSelector().getName().c_str();
-          std::string MethodTypeString;
-          Context->getObjcEncodingForMethodDecl(Methods[i], MethodTypeString);
-          Result += "\", \"";
-          Result += MethodTypeString;
-          Result += "\"}\n";
-        }
-        Result += "\t }\n};\n";
-      }
+		// Output instance methods declared in this protocol.
+		for (ObjcProtocolDecl::instmeth_iterator I = PDecl->instmeth_begin(), 
+			 E = PDecl->instmeth_end(); I != E; ++I) {
+		  Result += "\t  ,{(SEL)\"";
+		  Result += (*I)->getSelector().getName().c_str();
+		  std::string MethodTypeString;
+		  Context->getObjcEncodingForMethodDecl((*I), MethodTypeString);
+		  Result += "\", \"";
+		  Result += MethodTypeString;
+		  Result += "\"}\n";
+		}
+		Result += "\t }\n};\n";
+	  }
       
       // Output class methods declared in this protocol.
       NumMethods = PDecl->getNumClassMethods();
@@ -1880,16 +1881,13 @@
         Result += utostr(NumMethods);
         Result += "\n";
         
-        ObjcMethodDecl **Methods = PDecl->getClassMethods();
-        Result += "\t,{{(SEL)\"";
-        Result += Methods[0]->getSelector().getName().c_str();
-        Result += "\", \"\"}\n";
-            
-        for (int i = 1; i < NumMethods; i++) {
+		// Output instance methods declared in this protocol.
+		for (ObjcProtocolDecl::classmeth_iterator I = PDecl->classmeth_begin(), 
+			 E = PDecl->classmeth_end(); I != E; ++I) {
           Result += "\t  ,{(SEL)\"";
-          Result += Methods[i]->getSelector().getName().c_str();
+          Result += (*I)->getSelector().getName().c_str();
           std::string MethodTypeString;
-          Context->getObjcEncodingForMethodDecl(Methods[i], MethodTypeString);
+          Context->getObjcEncodingForMethodDecl((*I), MethodTypeString);
           Result += "\", \"";
           Result += MethodTypeString;
           Result += "\"}\n";
@@ -1936,14 +1934,14 @@
         "{\n\t0, \"";
       Result += PDecl->getName();
       Result += "\", 0, ";
-      if (PDecl->getInstanceMethods() > 0) {
+      if (PDecl->getNumInstanceMethods() > 0) {
         Result += "&_OBJC_PROTOCOL_INSTANCE_METHODS_";
         Result += PDecl->getName();
         Result += ", ";
       }
       else
         Result += "0, ";
-      if (PDecl->getClassMethods() > 0) {
+      if (PDecl->getNumClassMethods() > 0) {
         Result += "&_OBJC_PROTOCOL_CLASS_METHODS_";
         Result += PDecl->getName();
         Result += "\n";

Modified: cfe/trunk/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaDeclObjC.cpp?rev=45046&r1=45045&r2=45046&view=diff

==============================================================================
--- cfe/trunk/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/Sema/SemaDeclObjC.cpp Fri Dec 14 17:37:57 2007
@@ -452,25 +452,27 @@
              const llvm::DenseSet<Selector> &InsMap,
              const llvm::DenseSet<Selector> &ClsMap) {
   // check unimplemented instance methods.
-  ObjcMethodDecl** methods = PDecl->getInstanceMethods();
-  for (int j = 0; j < PDecl->getNumInstanceMethods(); j++) {
-    if (!InsMap.count(methods[j]->getSelector()) && 
-        methods[j]->getImplementationControl() != ObjcMethodDecl::Optional) {
-      Diag(methods[j]->getLocation(), diag::warn_undef_method_impl,
-           methods[j]->getSelector().getName());
+  for (ObjcProtocolDecl::instmeth_iterator I = PDecl->instmeth_begin(), 
+       E = PDecl->instmeth_end(); I != E; ++I) {
+    ObjcMethodDecl *method = *I;
+    if (!InsMap.count(method->getSelector()) && 
+        method->getImplementationControl() != ObjcMethodDecl::Optional) {
+      Diag(method->getLocation(), diag::warn_undef_method_impl,
+           method->getSelector().getName());
       IncompleteImpl = true;
     }
   }
   // check unimplemented class methods
-  methods = PDecl->getClassMethods();
-  for (int j = 0; j < PDecl->getNumClassMethods(); j++)
-    if (!ClsMap.count(methods[j]->getSelector()) &&
-        methods[j]->getImplementationControl() != ObjcMethodDecl::Optional) {
-      Diag(methods[j]->getLocation(), diag::warn_undef_method_impl,
-           methods[j]->getSelector().getName());
+  for (ObjcProtocolDecl::classmeth_iterator I = PDecl->classmeth_begin(), 
+       E = PDecl->classmeth_end(); I != E; ++I) {
+    ObjcMethodDecl *method = *I;
+    if (!ClsMap.count(method->getSelector()) &&
+        method->getImplementationControl() != ObjcMethodDecl::Optional) {
+      Diag(method->getLocation(), diag::warn_undef_method_impl,
+           method->getSelector().getName());
       IncompleteImpl = true;
     }
-  
+  }
   // Check on this protocols's referenced protocols, recursively
   ObjcProtocolDecl** RefPDecl = PDecl->getReferencedProtocols();
   for (int i = 0; i < PDecl->getNumReferencedProtocols(); i++)
@@ -533,11 +535,11 @@
     InsMap.insert((*I)->getSelector());
   
   bool IncompleteImpl = false;
-  ObjcMethodDecl *const* methods = CatClassDecl->getInstanceMethods();
-  for (int j = 0; j < CatClassDecl->getNumInstanceMethods(); j++)
-    if (!InsMap.count(methods[j]->getSelector())) {
-      Diag(methods[j]->getLocation(), diag::warn_undef_method_impl,
-           methods[j]->getSelector().getName());
+  for (ObjcCategoryDecl::instmeth_iterator I = CatClassDecl->instmeth_begin(),
+       E = CatClassDecl->instmeth_end(); I != E; ++I)
+    if (!InsMap.count((*I)->getSelector())) {
+      Diag((*I)->getLocation(), diag::warn_undef_method_impl,
+           (*I)->getSelector().getName());
       IncompleteImpl = true;
     }
   llvm::DenseSet<Selector> ClsMap;
@@ -548,11 +550,11 @@
        I != E; ++I)
     ClsMap.insert((*I)->getSelector());
   
-  methods = CatClassDecl->getClassMethods();
-  for (int j = 0; j < CatClassDecl->getNumClassMethods(); j++)
-    if (!ClsMap.count(methods[j]->getSelector())) {
-      Diag(methods[j]->getLocation(), diag::warn_undef_method_impl,
-           methods[j]->getSelector().getName());
+  for (ObjcCategoryDecl::classmeth_iterator I = CatClassDecl->classmeth_begin(),
+       E = CatClassDecl->classmeth_end(); I != E; ++I)
+    if (!ClsMap.count((*I)->getSelector())) {
+      Diag((*I)->getLocation(), diag::warn_undef_method_impl,
+           (*I)->getSelector().getName());
       IncompleteImpl = true;
     }
   

Modified: cfe/trunk/include/clang/AST/DeclObjC.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=45046&r1=45045&r2=45046&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/DeclObjC.h (original)
+++ cfe/trunk/include/clang/AST/DeclObjC.h Fri Dec 14 17:37:57 2007
@@ -27,6 +27,125 @@
 class ObjcProtocolDecl;
 class ObjcCategoryDecl;
 class ObjcPropertyDecl;
+
+/// ObjcMethodDecl - Represents an instance or class method declaration.
+/// ObjC methods can be declared within 4 contexts: class interfaces,
+/// categories, protocols, and class implementations. While C++ member
+/// functions leverage C syntax, Objective-C method syntax is modeled after 
+/// Smalltalk (using colons to specify argument types/expressions). 
+/// Here are some brief examples:
+///
+/// Setter/getter instance methods:
+/// - (void)setMenu:(NSMenu *)menu;
+/// - (NSMenu *)menu; 
+/// 
+/// Instance method that takes 2 NSView arguments:
+/// - (void)replaceSubview:(NSView *)oldView with:(NSView *)newView;
+///
+/// Getter class method:
+/// + (NSMenu *)defaultMenu;
+///
+/// A selector represents a unique name for a method. The selector names for
+/// the above methods are setMenu:, menu, replaceSubview:with:, and defaultMenu.
+///
+class ObjcMethodDecl : public Decl {
+public:
+  enum ImplementationControl { None, Required, Optional };
+private:
+  /// Bitfields must be first fields in this class so they pack with those
+  /// declared in class Decl.
+  /// instance (true) or class (false) method.
+  bool IsInstance : 1;
+  bool IsVariadic : 1;
+  
+  /// @required/@optional
+  ImplementationControl DeclImplementation : 2;
+  
+  /// in, inout, etc.
+  ObjcDeclQualifier objcDeclQualifier : 6;
+  
+  // Context this method is declared in.
+  NamedDecl *MethodContext;
+  
+  // A unigue name for this method.
+  Selector SelName;
+  
+  // Type of this method.
+  QualType MethodDeclType;
+  /// ParamInfo - new[]'d array of pointers to VarDecls for the formal
+  /// parameters of this Method.  This is null if there are no formals.  
+  ParmVarDecl **ParamInfo;
+  int NumMethodParams;  // -1 if no parameters
+  
+  /// List of attributes for this method declaration.
+  AttributeList *MethodAttrs;
+  
+  SourceLocation EndLoc; // the location of the ';' or '{'.
+  
+  // The following are only used for method definitions, null otherwise.
+  // FIXME: space savings opportunity, consider a sub-class.
+  Stmt *Body;
+  ParmVarDecl *SelfDecl;
+public:
+  ObjcMethodDecl(SourceLocation beginLoc, SourceLocation endLoc,
+                 Selector SelInfo, QualType T,
+                 Decl *contextDecl,
+                 ParmVarDecl **paramInfo = 0, int numParams=-1,
+                 AttributeList *M = 0, bool isInstance = true,
+                 bool isVariadic = false,
+                 ImplementationControl impControl = None,
+                 Decl *PrevDecl = 0)
+  : Decl(ObjcMethod, beginLoc),
+    IsInstance(isInstance), IsVariadic(isVariadic),
+    DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None),
+    MethodContext(static_cast<NamedDecl*>(contextDecl)),
+    SelName(SelInfo), MethodDeclType(T), 
+    ParamInfo(paramInfo), NumMethodParams(numParams),
+    MethodAttrs(M), EndLoc(endLoc), Body(0), SelfDecl(0) {}
+  virtual ~ObjcMethodDecl();
+  
+  ObjcDeclQualifier getObjcDeclQualifier() const { return objcDeclQualifier; }
+  void setObjcDeclQualifier(ObjcDeclQualifier QV) { objcDeclQualifier = QV; }
+  
+  // Location information, modeled after the Stmt API.
+  SourceLocation getLocStart() const { return getLocation(); }
+  SourceLocation getLocEnd() const { return EndLoc; }
+  
+  NamedDecl *getMethodContext() const { return MethodContext; }
+  
+  ObjcInterfaceDecl *const getClassInterface() const;
+  
+  Selector getSelector() const { return SelName; }
+  QualType getResultType() const { return MethodDeclType; }
+  
+  int getNumParams() const { return NumMethodParams; }
+  ParmVarDecl *getParamDecl(int i) const {
+    assert(i < getNumParams() && "Illegal param #");
+    return ParamInfo[i];
+  }  
+  void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams);
+  
+  AttributeList *getMethodAttrs() const {return MethodAttrs;}
+  bool isInstance() const { return IsInstance; }
+  bool isVariadic() const { return IsVariadic; }
+  
+  // Related to protocols declared in  @protocol
+  void setDeclImplementation(ImplementationControl ic) { 
+    DeclImplementation = ic; 
+  }
+  ImplementationControl getImplementationControl() const { 
+    return DeclImplementation; 
+  }
+  Stmt *const getBody() const { return Body; }
+  void setBody(Stmt *B) { Body = B; }
+
+  ParmVarDecl *const getSelfDecl() const { return SelfDecl; }
+  void setSelfDecl(ParmVarDecl *PVD) { SelfDecl = PVD; }
+  
+  // Implement isa/cast/dyncast/etc.
+  static bool classof(const Decl *D) { return D->getKind() == ObjcMethod; }
+  static bool classof(const ObjcMethodDecl *D) { return true; }
+};
   
 /// ObjcInterfaceDecl - Represents an ObjC class declaration. For example:
 ///
@@ -118,10 +237,7 @@
   ivar_iterator ivar_begin() const { return Ivars; }
   ivar_iterator ivar_end() const { return Ivars + ivar_size();}
   
-  ObjcMethodDecl** getInstanceMethods() const { return InstanceMethods; }
   int getNumInstanceMethods() const { return NumInstanceMethods; }
-  
-  ObjcMethodDecl** getClassMethods() const { return ClassMethods; }
   int getNumClassMethods() const { return NumClassMethods; }
   
   typedef ObjcMethodDecl * const * instmeth_iterator;
@@ -160,6 +276,28 @@
   }
   ObjcIvarDecl *lookupInstanceVariable(IdentifierInfo *ivarName,
                                        ObjcInterfaceDecl *&clsDeclared);
+									   
+  // Get the local instance method declared in this interface.
+  ObjcMethodDecl *getInstanceMethodForSelector(Selector &Sel) {
+    for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); 
+	     I != E; ++I) {
+      if ((*I)->getSelector() == Sel)
+        return *I;
+    }
+	return 0;
+  }
+  // Get the local class method declared in this interface.
+  ObjcMethodDecl *getClassMethodForSelector(Selector &Sel) {
+    for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 
+	     I != E; ++I) {
+      if ((*I)->getSelector() == Sel)
+        return *I;
+    }
+	return 0;
+  }
+  // Lookup the instance method. First, we search locally. If a method isn't
+  // found, we look through the reference protocols. Lastly, we look categories
+  // defined for this class.
   ObjcMethodDecl *lookupInstanceMethod(Selector &Sel);
   ObjcMethodDecl *lookupClassMethod(Selector &Sel);
 
@@ -291,12 +429,39 @@
     return ReferencedProtocols; 
   }
   int getNumReferencedProtocols() const { return NumReferencedProtocols; }
-  
-  ObjcMethodDecl** getInstanceMethods() const { return InstanceMethods; }
   int getNumInstanceMethods() const { return NumInstanceMethods; }
-  
-  ObjcMethodDecl** getClassMethods() const { return ClassMethods; }
   int getNumClassMethods() const { return NumClassMethods; }
+
+  typedef ObjcMethodDecl * const * instmeth_iterator;
+  instmeth_iterator instmeth_begin() const { return InstanceMethods; }
+  instmeth_iterator instmeth_end() const {
+    return InstanceMethods+(NumInstanceMethods == -1 ? 0 : NumInstanceMethods);
+  }
+  
+  typedef ObjcMethodDecl * const * classmeth_iterator;
+  classmeth_iterator classmeth_begin() const { return ClassMethods; }
+  classmeth_iterator classmeth_end() const {
+    return ClassMethods+(NumClassMethods == -1 ? 0 : NumClassMethods);
+  }
+
+  // Get the local instance method declared in this interface.
+  ObjcMethodDecl *getInstanceMethodForSelector(Selector &Sel) {
+    for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); 
+	     I != E; ++I) {
+      if ((*I)->getSelector() == Sel)
+        return *I;
+    }
+	return 0;
+  }
+  // Get the local class method declared in this interface.
+  ObjcMethodDecl *getClassMethodForSelector(Selector &Sel) {
+    for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 
+	     I != E; ++I) {
+      if ((*I)->getSelector() == Sel)
+        return *I;
+    }
+	return 0;
+  }
   
   ObjcMethodDecl *lookupInstanceMethod(Selector &Sel);
   ObjcMethodDecl *lookupClassMethod(Selector &Sel);
@@ -452,12 +617,39 @@
     return ReferencedProtocols; 
   }
   int getNumReferencedProtocols() const { return NumReferencedProtocols; }
-  
-  ObjcMethodDecl **getInstanceMethods() const { return InstanceMethods; }
   int getNumInstanceMethods() const { return NumInstanceMethods; }
-  
-  ObjcMethodDecl **getClassMethods() const { return ClassMethods; }
   int getNumClassMethods() const { return NumClassMethods; }
+
+  typedef ObjcMethodDecl * const * instmeth_iterator;
+  instmeth_iterator instmeth_begin() const { return InstanceMethods; }
+  instmeth_iterator instmeth_end() const {
+    return InstanceMethods+(NumInstanceMethods == -1 ? 0 : NumInstanceMethods);
+  }
+  
+  typedef ObjcMethodDecl * const * classmeth_iterator;
+  classmeth_iterator classmeth_begin() const { return ClassMethods; }
+  classmeth_iterator classmeth_end() const {
+    return ClassMethods+(NumClassMethods == -1 ? 0 : NumClassMethods);
+  }
+
+  // Get the local instance method declared in this interface.
+  ObjcMethodDecl *getInstanceMethodForSelector(Selector &Sel) {
+    for (instmeth_iterator I = instmeth_begin(), E = instmeth_end(); 
+	     I != E; ++I) {
+      if ((*I)->getSelector() == Sel)
+        return *I;
+    }
+	return 0;
+  }
+  // Get the local class method declared in this interface.
+  ObjcMethodDecl *getClassMethodForSelector(Selector &Sel) {
+    for (classmeth_iterator I = classmeth_begin(), E = classmeth_end(); 
+	     I != E; ++I) {
+      if ((*I)->getSelector() == Sel)
+        return *I;
+    }
+	return 0;
+  }
   
   void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
                   ObjcMethodDecl **clsMethods, unsigned numClsMembers,
@@ -629,138 +821,6 @@
   static bool classof(const ObjcImplementationDecl *D) { return true; }
 };
 
-/// ObjcMethodDecl - Represents an instance or class method declaration.
-/// ObjC methods can be declared within 4 contexts: class interfaces,
-/// categories, protocols, and class implementations. While C++ member
-/// functions leverage C syntax, Objective-C method syntax is modeled after 
-/// Smalltalk (using colons to specify argument types/expressions). 
-/// Here are some brief examples:
-///
-/// Setter/getter instance methods:
-/// - (void)setMenu:(NSMenu *)menu;
-/// - (NSMenu *)menu; 
-/// 
-/// Instance method that takes 2 NSView arguments:
-/// - (void)replaceSubview:(NSView *)oldView with:(NSView *)newView;
-///
-/// Getter class method:
-/// + (NSMenu *)defaultMenu;
-///
-/// A selector represents a unique name for a method. The selector names for
-/// the above methods are setMenu:, menu, replaceSubview:with:, and defaultMenu.
-///
-class ObjcMethodDecl : public Decl {
-public:
-  enum ImplementationControl { None, Required, Optional };
-private:
-  /// Bitfields must be first fields in this class so they pack with those
-  /// declared in class Decl.
-  /// instance (true) or class (false) method.
-  bool IsInstance : 1;
-  bool IsVariadic : 1;
-  
-  /// @required/@optional
-  ImplementationControl DeclImplementation : 2;
-  
-  /// in, inout, etc.
-  ObjcDeclQualifier objcDeclQualifier : 6;
-  
-  // Context this method is declared in.
-  NamedDecl *MethodContext;
-  
-  // A unigue name for this method.
-  Selector SelName;
-  
-  // Type of this method.
-  QualType MethodDeclType;
-  /// ParamInfo - new[]'d array of pointers to VarDecls for the formal
-  /// parameters of this Method.  This is null if there are no formals.  
-  ParmVarDecl **ParamInfo;
-  int NumMethodParams;  // -1 if no parameters
-  
-  /// List of attributes for this method declaration.
-  AttributeList *MethodAttrs;
-  
-  SourceLocation EndLoc; // the location of the ';' or '{'.
-  
-  // The following are only used for method definitions, null otherwise.
-  // FIXME: space savings opportunity, consider a sub-class.
-  Stmt *Body;
-  ParmVarDecl *SelfDecl;
-public:
-  ObjcMethodDecl(SourceLocation beginLoc, SourceLocation endLoc,
-                 Selector SelInfo, QualType T,
-                 Decl *contextDecl,
-                 ParmVarDecl **paramInfo = 0, int numParams=-1,
-                 AttributeList *M = 0, bool isInstance = true,
-                 bool isVariadic = false,
-                 ImplementationControl impControl = None,
-                 Decl *PrevDecl = 0)
-  : Decl(ObjcMethod, beginLoc),
-    IsInstance(isInstance), IsVariadic(isVariadic),
-    DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None),
-    MethodContext(static_cast<NamedDecl*>(contextDecl)),
-    SelName(SelInfo), MethodDeclType(T), 
-    ParamInfo(paramInfo), NumMethodParams(numParams),
-    MethodAttrs(M), EndLoc(endLoc), Body(0), SelfDecl(0) {}
-  virtual ~ObjcMethodDecl();
-  
-  ObjcDeclQualifier getObjcDeclQualifier() const { return objcDeclQualifier; }
-  void setObjcDeclQualifier(ObjcDeclQualifier QV) { objcDeclQualifier = QV; }
-  
-  // Location information, modeled after the Stmt API.
-  SourceLocation getLocStart() const { return getLocation(); }
-  SourceLocation getLocEnd() const { return EndLoc; }
-  
-  NamedDecl *getMethodContext() const { return MethodContext; }
-  
-  ObjcInterfaceDecl *const getClassInterface() const {
-    if (ObjcInterfaceDecl *ID = dyn_cast<ObjcInterfaceDecl>(MethodContext))
-      return ID;
-    if (ObjcCategoryDecl *CD = dyn_cast<ObjcCategoryDecl>(MethodContext))
-      return CD->getClassInterface();
-    if (ObjcImplementationDecl *IMD = 
-        dyn_cast<ObjcImplementationDecl>(MethodContext))
-      return IMD->getClassInterface();
-    if (ObjcCategoryImplDecl *CID = 
-        dyn_cast<ObjcCategoryImplDecl>(MethodContext))
-      return CID->getClassInterface();
-    assert(false && "unknown method context");
-    return 0;
-  }
-  
-  Selector getSelector() const { return SelName; }
-  QualType getResultType() const { return MethodDeclType; }
-  
-  int getNumParams() const { return NumMethodParams; }
-  ParmVarDecl *getParamDecl(int i) const {
-    assert(i < getNumParams() && "Illegal param #");
-    return ParamInfo[i];
-  }  
-  void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams);
-  
-  AttributeList *getMethodAttrs() const {return MethodAttrs;}
-  bool isInstance() const { return IsInstance; }
-  bool isVariadic() const { return IsVariadic; }
-  
-  // Related to protocols declared in  @protocol
-  void setDeclImplementation(ImplementationControl ic) { 
-    DeclImplementation = ic; 
-  }
-  ImplementationControl getImplementationControl() const { 
-    return DeclImplementation; 
-  }
-  Stmt *const getBody() const { return Body; }
-  void setBody(Stmt *B) { Body = B; }
-
-  ParmVarDecl *const getSelfDecl() const { return SelfDecl; }
-  void setSelfDecl(ParmVarDecl *PVD) { SelfDecl = PVD; }
-  
-  // Implement isa/cast/dyncast/etc.
-  static bool classof(const Decl *D) { return D->getKind() == ObjcMethod; }
-  static bool classof(const ObjcMethodDecl *D) { return true; }
-};
-  
 /// ObjcCompatibleAliasDecl - Represents alias of a class. This alias is 
 /// declared as @compatibility_alias alias class.
 class ObjcCompatibleAliasDecl : public ScopedDecl {





More information about the cfe-commits mailing list