forked from OSchip/llvm-project
Move implicit Obj-C param creation into ObjCMethodDecl.
- Add ObjCMethodDecl::createImplicitParams. - Remove ObjCMethodDecl::set{Self,Cmd}Decl - Remove Sema::CreateImplicitParameter No (intended) functionality change. llvm-svn: 55356
This commit is contained in:
parent
54ef9f5831
commit
279d1ccc57
|
@ -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; }
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue