]> granicus.if.org Git - clang/commitdiff
Move implicit Obj-C param creation into ObjCMethodDecl.
authorDaniel Dunbar <daniel@zuster.org>
Tue, 26 Aug 2008 06:07:48 +0000 (06:07 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 26 Aug 2008 06:07:48 +0000 (06:07 +0000)
 - Add ObjCMethodDecl::createImplicitParams.
 - Remove ObjCMethodDecl::set{Self,Cmd}Decl
 - Remove Sema::CreateImplicitParameter

No (intended) functionality change.

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

include/clang/AST/DeclObjC.h
lib/Sema/Sema.h
lib/Sema/SemaDecl.cpp
lib/Sema/SemaDeclObjC.cpp

index 7d16b54f637252bc18772f74090f1c7bc95638f1..0cbe4241f9f8c98ec2ee2eedcf3a84ea14ebbd9a 100644 (file)
@@ -131,8 +131,12 @@ private:
   // The following are only used for method definitions, null otherwise.
   // FIXME: space savings opportunity, consider a sub-class.
   Stmt *Body;
-  // Decls for implicit parameters
+
+  /// SelfDecl - Decl for the implicit self parameter. This is lazily
+  /// constructed by createImplicitParams.
   ImplicitParamDecl *SelfDecl;
+  /// CmdDecl - Decl for the implicit _cmd parameter. This is lazily
+  /// constructed by createImplicitParams.
   ImplicitParamDecl *CmdDecl;
   
   ObjCMethodDecl(SourceLocation beginLoc, SourceLocation endLoc,
@@ -207,10 +211,14 @@ public:
   }  
   void setMethodParams(ParmVarDecl **NewParamInfo, unsigned NumParams);
 
+  /// createImplicitParams - Used to lazily create the self and cmd
+  /// implict parameters. This must be called prior to using getSelfDecl()
+  /// or getCmdDecl(). The call is ignored if the implicit paramters
+  /// have already been created.
+  void createImplicitParams(ASTContext &Context);
+
   ImplicitParamDecl * getSelfDecl() const { return SelfDecl; }
-  void setSelfDecl(ImplicitParamDecl *decl) { SelfDecl = decl; }
   ImplicitParamDecl * getCmdDecl() const { return CmdDecl; }
-  void setCmdDecl(ImplicitParamDecl *decl) { CmdDecl = decl; }
   
   bool isInstance() const { return IsInstance; }
   bool isVariadic() const { return IsVariadic; }
index 4bfbcb9939a03aafa7c5df207fe8824b991e9c0d..1ce4d804c0e4c09df72bd76c136b24ef907b9d46 100644 (file)
@@ -299,8 +299,6 @@ private:
   
   /// Helpers for dealing with function parameters
   bool CheckParmsForFunctionDef(FunctionDecl *FD);
-  ImplicitParamDecl *CreateImplicitParameter(Scope *S, IdentifierInfo *Id, 
-                                       SourceLocation IdLoc, QualType Type);
   void CheckCXXDefaultArguments(FunctionDecl *FD);
   void CheckExtraCXXDefaultArguments(Declarator &D);
 
index ad83908e4512944e7d72a9fdaa66687d461667b8..c6f8c22b087959cb5be6d885a59198d198a71d5f 100644 (file)
@@ -493,21 +493,6 @@ bool Sema::CheckParmsForFunctionDef(FunctionDecl *FD) {
   return HasInvalidParm;
 }
 
-/// CreateImplicitParameter - Creates an implicit function parameter
-/// in the scope S and with the given type. This routine is used, for
-/// example, to create the implicit "self" parameter in an Objective-C
-/// method.
-ImplicitParamDecl *
-Sema::CreateImplicitParameter(Scope *S, IdentifierInfo *Id, 
-                              SourceLocation IdLoc, QualType Type) {
-  ImplicitParamDecl *New = ImplicitParamDecl::Create(Context, CurContext,
-      IdLoc, Id, Type, 0);
-  if (Id)
-    PushOnScopeChains(New, S);
-
-  return New;
-}
-
 /// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
 /// no declarator (e.g. "struct foo;") is parsed.
 Sema::DeclTy *Sema::ParsedFreeStandingDeclSpec(Scope *S, DeclSpec &DS) {
index b02df056c82716340282a9530d22271b2cb00eff..d98c3065f52a3abfa9375a39537d1c55fd5a17e5 100644 (file)
@@ -40,28 +40,12 @@ void Sema::ObjCActOnStartOfMethodDef(Scope *FnBodyScope, DeclTy *D) {
 
   // Create Decl objects for each parameter, entrring them in the scope for
   // binding to their use.
-  struct DeclaratorChunk::ParamInfo PI;
 
   // Insert the invisible arguments, self and _cmd!
-  PI.Ident = &Context.Idents.get("self");
-  PI.IdentLoc = SourceLocation(); // synthesized vars have a null location.
-  QualType selfTy;
-  if (MDecl->isInstance()) {
-    selfTy = Context.getObjCIdType();
-    if (ObjCInterfaceDecl *OID = MDecl->getClassInterface()) {
-      // There may be no interface context due to error in declaration of the 
-      // interface (which has been reported). Recover gracefully
-      selfTy = Context.getObjCInterfaceType(OID);
-      selfTy = Context.getPointerType(selfTy);
-    }
-  } else // we have a factory method.
-    selfTy = Context.getObjCClassType();
-  getCurMethodDecl()->setSelfDecl(CreateImplicitParameter(FnBodyScope,
-        PI.Ident, PI.IdentLoc, selfTy));
+  MDecl->createImplicitParams(Context);
   
-  PI.Ident = &Context.Idents.get("_cmd");
-  getCurMethodDecl()->setCmdDecl(CreateImplicitParameter(FnBodyScope,
-        PI.Ident, PI.IdentLoc, Context.getObjCSelType()));
+  PushOnScopeChains(MDecl->getSelfDecl(), FnBodyScope);
+  PushOnScopeChains(MDecl->getCmdDecl(), FnBodyScope);
 
   // Introduce all of the other parameters into this scope.
   for (unsigned i = 0, e = MDecl->getNumParams(); i != e; ++i) {