зеркало из https://github.com/microsoft/clang-1.git
Some code clean up in the form of name changes for functions which
process method definitions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43967 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
7964c9f61e
Коммит
360300ca2e
|
@ -1160,7 +1160,7 @@ Parser::DeclTy *Parser::ParseObjCInstanceMethodDefinition() {
|
||||||
Diag (Tok, diag::err_expected_lbrace);
|
Diag (Tok, diag::err_expected_lbrace);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return ObjcParseFunctionDefinition(MDecl);
|
return ObjcParseMethodDefinition(MDecl);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// objc-method-def: objc-method-proto ';'[opt] '{' body '}'
|
/// objc-method-def: objc-method-proto ';'[opt] '{' body '}'
|
||||||
|
@ -1177,7 +1177,7 @@ Parser::DeclTy *Parser::ParseObjCClassMethodDefinition() {
|
||||||
Diag (Tok, diag::err_expected_lbrace);
|
Diag (Tok, diag::err_expected_lbrace);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return ObjcParseFunctionDefinition(MDecl);
|
return ObjcParseMethodDefinition(MDecl);
|
||||||
}
|
}
|
||||||
|
|
||||||
Parser::ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) {
|
Parser::ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) {
|
||||||
|
|
|
@ -465,7 +465,9 @@ Parser::DeclTy *Parser::ParseFunctionDefinition(Declarator &D) {
|
||||||
return ParseFunctionStatementBody(Res, BraceLoc, BraceLoc);
|
return ParseFunctionStatementBody(Res, BraceLoc, BraceLoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
Parser::DeclTy *Parser::ObjcParseFunctionDefinition(DeclTy *D) {
|
/// ObjcParseMethodDefinition - This routine parses a method definition and
|
||||||
|
/// returns its AST.
|
||||||
|
Parser::DeclTy *Parser::ObjcParseMethodDefinition(DeclTy *D) {
|
||||||
// We should have an opening brace now.
|
// We should have an opening brace now.
|
||||||
if (Tok.isNot(tok::l_brace)) {
|
if (Tok.isNot(tok::l_brace)) {
|
||||||
Diag(Tok, diag::err_expected_fn_body);
|
Diag(Tok, diag::err_expected_fn_body);
|
||||||
|
@ -480,12 +482,12 @@ Parser::DeclTy *Parser::ObjcParseFunctionDefinition(DeclTy *D) {
|
||||||
|
|
||||||
SourceLocation BraceLoc = Tok.getLocation();
|
SourceLocation BraceLoc = Tok.getLocation();
|
||||||
|
|
||||||
// Enter a scope for the function body.
|
// Enter a scope for the method body.
|
||||||
EnterScope(Scope::FnScope|Scope::DeclScope);
|
EnterScope(Scope::FnScope|Scope::DeclScope);
|
||||||
|
|
||||||
// Tell the actions module that we have entered a function definition with the
|
// Tell the actions module that we have entered a method definition with the
|
||||||
// specified Declarator for the function.
|
// specified Declarator for the method.
|
||||||
DeclTy *Res = Actions.ObjcActOnStartOfFunctionDef(CurScope, D);
|
DeclTy *Res = Actions.ObjcActOnStartOfMethodDef(CurScope, D);
|
||||||
|
|
||||||
return ParseFunctionStatementBody(Res, BraceLoc, BraceLoc);
|
return ParseFunctionStatementBody(Res, BraceLoc, BraceLoc);
|
||||||
}
|
}
|
||||||
|
|
|
@ -172,7 +172,7 @@ public:
|
||||||
//
|
//
|
||||||
QualType GetTypeForDeclarator(Declarator &D, Scope *S);
|
QualType GetTypeForDeclarator(Declarator &D, Scope *S);
|
||||||
|
|
||||||
QualType ObjcGetTypeForDeclarator(DeclTy *D, Scope *S);
|
QualType ObjcGetTypeForMethodDefinition(DeclTy *D, Scope *S);
|
||||||
|
|
||||||
|
|
||||||
virtual TypeResult ActOnTypeName(Scope *S, Declarator &D);
|
virtual TypeResult ActOnTypeName(Scope *S, Declarator &D);
|
||||||
|
@ -184,12 +184,13 @@ private:
|
||||||
//
|
//
|
||||||
virtual DeclTy *isTypeName(const IdentifierInfo &II, Scope *S) const;
|
virtual DeclTy *isTypeName(const IdentifierInfo &II, Scope *S) const;
|
||||||
virtual DeclTy *ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup);
|
virtual DeclTy *ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup);
|
||||||
virtual DeclTy *ObjcActOnDeclarator(Scope *S, DeclTy *D, DeclTy *LastInGroup);
|
virtual DeclTy *ObjcActOnMethodDefinition(Scope *S, DeclTy *D,
|
||||||
|
DeclTy *LastInGroup);
|
||||||
void AddInitializerToDecl(DeclTy *dcl, ExprTy *init);
|
void AddInitializerToDecl(DeclTy *dcl, ExprTy *init);
|
||||||
virtual DeclTy *FinalizeDeclaratorGroup(Scope *S, DeclTy *Group);
|
virtual DeclTy *FinalizeDeclaratorGroup(Scope *S, DeclTy *Group);
|
||||||
|
|
||||||
virtual DeclTy *ActOnStartOfFunctionDef(Scope *S, Declarator &D);
|
virtual DeclTy *ActOnStartOfFunctionDef(Scope *S, Declarator &D);
|
||||||
virtual DeclTy *ObjcActOnStartOfFunctionDef(Scope *S, DeclTy *D);
|
virtual DeclTy *ObjcActOnStartOfMethodDef(Scope *S, DeclTy *D);
|
||||||
virtual DeclTy *ActOnFunctionDefBody(DeclTy *Decl, StmtTy *Body);
|
virtual DeclTy *ActOnFunctionDefBody(DeclTy *Decl, StmtTy *Body);
|
||||||
|
|
||||||
/// Scope actions.
|
/// Scope actions.
|
||||||
|
@ -231,7 +232,7 @@ private:
|
||||||
/// More parsing and symbol table subroutines...
|
/// More parsing and symbol table subroutines...
|
||||||
ParmVarDecl *ParseParamDeclarator(DeclaratorChunk &FI, unsigned ArgNo,
|
ParmVarDecl *ParseParamDeclarator(DeclaratorChunk &FI, unsigned ArgNo,
|
||||||
Scope *FnBodyScope);
|
Scope *FnBodyScope);
|
||||||
ParmVarDecl *ObjcParseParamDeclarator(ParmVarDecl *param, Scope *FnBodyScope);
|
ParmVarDecl *ObjcBuildMethodParameter(ParmVarDecl *param, Scope *FnBodyScope);
|
||||||
|
|
||||||
ScopedDecl *LookupScopedDecl(IdentifierInfo *II, unsigned NSI,
|
ScopedDecl *LookupScopedDecl(IdentifierInfo *II, unsigned NSI,
|
||||||
SourceLocation IdLoc, Scope *S);
|
SourceLocation IdLoc, Scope *S);
|
||||||
|
|
|
@ -544,14 +544,16 @@ bool Sema::CheckInitializer(Expr *&Init, QualType &DeclType, bool isStatic) {
|
||||||
return hadError;
|
return hadError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ObjcActOnMethodDefinition - Build the AST node for a method definition
|
||||||
|
/// header. Return this AST.
|
||||||
Sema::DeclTy *
|
Sema::DeclTy *
|
||||||
Sema::ObjcActOnDeclarator(Scope *S, DeclTy *D, DeclTy *lastDecl) {
|
Sema::ObjcActOnMethodDefinition(Scope *S, DeclTy *D, DeclTy *lastDecl) {
|
||||||
ObjcMethodDecl *MDecl = dyn_cast<ObjcMethodDecl>(static_cast<Decl *>(D));
|
ObjcMethodDecl *MDecl = dyn_cast<ObjcMethodDecl>(static_cast<Decl *>(D));
|
||||||
|
|
||||||
ScopedDecl *LastDeclarator = dyn_cast_or_null<ScopedDecl>((Decl *)lastDecl);
|
ScopedDecl *LastDeclarator = dyn_cast_or_null<ScopedDecl>((Decl *)lastDecl);
|
||||||
const char *name = MDecl->getSelector().getName().c_str();
|
const char *name = MDecl->getSelector().getName().c_str();
|
||||||
IdentifierInfo *II = &Context.Idents.get(name);
|
IdentifierInfo *II = &Context.Idents.get(name);
|
||||||
assert (II && "ObjcActOnDeclarator - selector name is missing");
|
assert (II && "ObjcActOnMethodDefinition - selector name is missing");
|
||||||
|
|
||||||
// The scope passed in may not be a decl scope. Zip up the scope tree until
|
// The scope passed in may not be a decl scope. Zip up the scope tree until
|
||||||
// we find one that is.
|
// we find one that is.
|
||||||
|
@ -559,20 +561,17 @@ Sema::ObjcActOnDeclarator(Scope *S, DeclTy *D, DeclTy *lastDecl) {
|
||||||
S = S->getParent();
|
S = S->getParent();
|
||||||
|
|
||||||
ScopedDecl *New;
|
ScopedDecl *New;
|
||||||
QualType R = ObjcGetTypeForDeclarator(MDecl, S);
|
QualType R = ObjcGetTypeForMethodDefinition(MDecl, S);
|
||||||
assert(!R.isNull() && "ObjcGetTypeForDeclarator() returned null type");
|
assert(!R.isNull() && "ObjcGetTypeForMethodDefinition() returned null type");
|
||||||
|
|
||||||
FunctionDecl *NewFD = new FunctionDecl(MDecl->getLocation(), II, R,
|
FunctionDecl *NewFD = new FunctionDecl(MDecl->getLocation(), II, R,
|
||||||
FunctionDecl::Static,
|
FunctionDecl::Static,
|
||||||
false, LastDeclarator);
|
false, LastDeclarator);
|
||||||
New = NewFD;
|
New = NewFD;
|
||||||
|
|
||||||
// If this has an identifier, add it to the scope stack.
|
New->setNext(II->getFETokenInfo<ScopedDecl>());
|
||||||
if (II) {
|
II->setFETokenInfo(New);
|
||||||
New->setNext(II->getFETokenInfo<ScopedDecl>());
|
S->AddDecl(New);
|
||||||
II->setFETokenInfo(New);
|
|
||||||
S->AddDecl(New);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (S->getParent() == 0)
|
if (S->getParent() == 0)
|
||||||
AddTopLevelDecl(New, LastDeclarator);
|
AddTopLevelDecl(New, LastDeclarator);
|
||||||
|
@ -890,18 +889,11 @@ Sema::ParseParamDeclarator(DeclaratorChunk &FTI, unsigned ArgNo,
|
||||||
return New;
|
return New;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called from Sema::ObjcParseStartOfFunctionDef().
|
// Called from Sema::ObjcParseStartOfMethodDef().
|
||||||
ParmVarDecl *
|
ParmVarDecl *
|
||||||
Sema::ObjcParseParamDeclarator(ParmVarDecl *PI, Scope *FnScope) {
|
Sema::ObjcBuildMethodParameter(ParmVarDecl *PI, Scope *FnScope) {
|
||||||
|
|
||||||
IdentifierInfo *II = PI->getIdentifier();
|
IdentifierInfo *II = PI->getIdentifier();
|
||||||
// TODO: CHECK FOR CONFLICTS, multiple decls with same name in one scope.
|
|
||||||
// Can this happen for params? We already checked that they don't conflict
|
|
||||||
// among each other. Here they can only shadow globals, which is ok.
|
|
||||||
if (/*Decl *PrevDecl = */LookupScopedDecl(II, Decl::IDNS_Ordinary,
|
|
||||||
PI->getLocation(), FnScope)) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: Handle storage class (auto, register). No declarator?
|
// FIXME: Handle storage class (auto, register). No declarator?
|
||||||
// TODO: Chain to previous parameter with the prevdeclarator chain?
|
// TODO: Chain to previous parameter with the prevdeclarator chain?
|
||||||
|
@ -1031,7 +1023,9 @@ Sema::DeclTy *Sema::ActOnFunctionDefBody(DeclTy *D, StmtTy *Body) {
|
||||||
return FD;
|
return FD;
|
||||||
}
|
}
|
||||||
|
|
||||||
Sema::DeclTy *Sema::ObjcActOnStartOfFunctionDef(Scope *FnBodyScope, DeclTy *D) {
|
/// ObjcActOnStartOfMethodDef - This routine sets up parameters; invisible
|
||||||
|
/// and user declared, in the method definition's AST.
|
||||||
|
Sema::DeclTy *Sema::ObjcActOnStartOfMethodDef(Scope *FnBodyScope, DeclTy *D) {
|
||||||
assert(CurFunctionDecl == 0 && "Function parsing confused");
|
assert(CurFunctionDecl == 0 && "Function parsing confused");
|
||||||
ObjcMethodDecl *MDecl = dyn_cast<ObjcMethodDecl>(static_cast<Decl *>(D));
|
ObjcMethodDecl *MDecl = dyn_cast<ObjcMethodDecl>(static_cast<Decl *>(D));
|
||||||
|
|
||||||
|
@ -1040,7 +1034,7 @@ Sema::DeclTy *Sema::ObjcActOnStartOfFunctionDef(Scope *FnBodyScope, DeclTy *D) {
|
||||||
Scope *GlobalScope = FnBodyScope->getParent();
|
Scope *GlobalScope = FnBodyScope->getParent();
|
||||||
|
|
||||||
FunctionDecl *FD =
|
FunctionDecl *FD =
|
||||||
static_cast<FunctionDecl*>(ObjcActOnDeclarator(GlobalScope, D, 0));
|
static_cast<FunctionDecl*>(ObjcActOnMethodDefinition(GlobalScope, D, 0));
|
||||||
CurFunctionDecl = FD;
|
CurFunctionDecl = FD;
|
||||||
|
|
||||||
// Create Decl objects for each parameter, adding them to the FunctionDecl.
|
// Create Decl objects for each parameter, adding them to the FunctionDecl.
|
||||||
|
@ -1059,16 +1053,16 @@ Sema::DeclTy *Sema::ObjcActOnStartOfFunctionDef(Scope *FnBodyScope, DeclTy *D) {
|
||||||
PDecl = new ParmVarDecl(SourceLocation(/*FIXME*/),
|
PDecl = new ParmVarDecl(SourceLocation(/*FIXME*/),
|
||||||
&Context.Idents.get("self"),
|
&Context.Idents.get("self"),
|
||||||
Context.getObjcIdType(), VarDecl::None, 0);
|
Context.getObjcIdType(), VarDecl::None, 0);
|
||||||
Params.push_back(ObjcParseParamDeclarator(PDecl, FnBodyScope));
|
Params.push_back(ObjcBuildMethodParameter(PDecl, FnBodyScope));
|
||||||
PDecl = new ParmVarDecl(SourceLocation(/*FIXME*/),
|
PDecl = new ParmVarDecl(SourceLocation(/*FIXME*/),
|
||||||
&Context.Idents.get("_cmd"),
|
&Context.Idents.get("_cmd"),
|
||||||
Context.getObjcSelType(), VarDecl::None, 0);
|
Context.getObjcSelType(), VarDecl::None, 0);
|
||||||
Params.push_back(ObjcParseParamDeclarator(PDecl, FnBodyScope));
|
Params.push_back(ObjcBuildMethodParameter(PDecl, FnBodyScope));
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < MDecl->getNumParams(); i++) {
|
for (int i = 0; i < MDecl->getNumParams(); i++) {
|
||||||
PDecl = MDecl->getParamDecl(i);
|
PDecl = MDecl->getParamDecl(i);
|
||||||
Params.push_back(ObjcParseParamDeclarator(PDecl, FnBodyScope));
|
Params.push_back(ObjcBuildMethodParameter(PDecl, FnBodyScope));
|
||||||
}
|
}
|
||||||
|
|
||||||
FD->setParams(&Params[0], Params.size());
|
FD->setParams(&Params[0], Params.size());
|
||||||
|
|
|
@ -325,9 +325,9 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S) {
|
||||||
return T;
|
return T;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ObjcGetTypeForDeclarator - Convert the type for the specified declarator to Type
|
/// ObjcGetTypeForMethodDefinition - Builds the type for a method definition
|
||||||
/// instances.
|
/// declarator
|
||||||
QualType Sema::ObjcGetTypeForDeclarator(DeclTy *D, Scope *S) {
|
QualType Sema::ObjcGetTypeForMethodDefinition(DeclTy *D, Scope *S) {
|
||||||
ObjcMethodDecl *MDecl = dyn_cast<ObjcMethodDecl>(static_cast<Decl *>(D));
|
ObjcMethodDecl *MDecl = dyn_cast<ObjcMethodDecl>(static_cast<Decl *>(D));
|
||||||
QualType T = MDecl->getResultType();
|
QualType T = MDecl->getResultType();
|
||||||
llvm::SmallVector<QualType, 16> ArgTys;
|
llvm::SmallVector<QualType, 16> ArgTys;
|
||||||
|
@ -346,20 +346,9 @@ QualType Sema::ObjcGetTypeForDeclarator(DeclTy *D, Scope *S) {
|
||||||
ParmVarDecl *PDecl = MDecl->getParamDecl(i);
|
ParmVarDecl *PDecl = MDecl->getParamDecl(i);
|
||||||
QualType ArgTy = PDecl->getType();
|
QualType ArgTy = PDecl->getType();
|
||||||
assert(!ArgTy.isNull() && "Couldn't parse type?");
|
assert(!ArgTy.isNull() && "Couldn't parse type?");
|
||||||
//
|
|
||||||
// Perform the default function/array conversion (C99 6.7.5.3p[7,8]).
|
// Perform the default function/array conversion (C99 6.7.5.3p[7,8]).
|
||||||
// This matches the conversion that is done in
|
// This matches the conversion that is done in
|
||||||
// Sema::ParseParamDeclarator(). Without this conversion, the
|
// Sema::ObjcBuildMethodParameter().
|
||||||
// argument type in the function prototype *will not* match the
|
|
||||||
// type in ParmVarDecl (which makes the code generator unhappy).
|
|
||||||
//
|
|
||||||
// FIXME: We still apparently need the conversion in
|
|
||||||
// Sema::ParseParamDeclarator(). This doesn't make any sense, since
|
|
||||||
// it should be driving off the type being created here.
|
|
||||||
//
|
|
||||||
// FIXME: If a source translation tool needs to see the original type,
|
|
||||||
// then we need to consider storing both types somewhere...
|
|
||||||
//
|
|
||||||
if (const ArrayType *AT = ArgTy->getAsArrayType())
|
if (const ArrayType *AT = ArgTy->getAsArrayType())
|
||||||
ArgTy = Context.getPointerType(AT->getElementType());
|
ArgTy = Context.getPointerType(AT->getElementType());
|
||||||
else if (ArgTy->isFunctionType())
|
else if (ArgTy->isFunctionType())
|
||||||
|
|
|
@ -107,7 +107,8 @@ public:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual DeclTy *ObjcActOnDeclarator(Scope *S, DeclTy *D,DeclTy *LastInGroup) {
|
virtual DeclTy *ObjcActOnMethodDefinition(Scope *S, DeclTy *D,
|
||||||
|
DeclTy *LastInGroup) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/// AddInitializerToDecl - This action is called immediately after
|
/// AddInitializerToDecl - This action is called immediately after
|
||||||
|
@ -134,9 +135,9 @@ public:
|
||||||
return ActOnDeclarator(FnBodyScope, D, 0);
|
return ActOnDeclarator(FnBodyScope, D, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual DeclTy *ObjcActOnStartOfFunctionDef(Scope *FnBodyScope, DeclTy *D) {
|
virtual DeclTy *ObjcActOnStartOfMethodDef(Scope *FnBodyScope, DeclTy *D) {
|
||||||
// Default to ActOnDeclarator.
|
// Default to ActOnDeclarator.
|
||||||
return ObjcActOnDeclarator(FnBodyScope, D, 0);
|
return ObjcActOnMethodDefinition(FnBodyScope, D, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ActOnFunctionDefBody - This is called when a function body has completed
|
/// ActOnFunctionDefBody - This is called when a function body has completed
|
||||||
|
|
|
@ -250,7 +250,7 @@ private:
|
||||||
DeclTy *ParseExternalDeclaration();
|
DeclTy *ParseExternalDeclaration();
|
||||||
DeclTy *ParseDeclarationOrFunctionDefinition();
|
DeclTy *ParseDeclarationOrFunctionDefinition();
|
||||||
DeclTy *ParseFunctionDefinition(Declarator &D);
|
DeclTy *ParseFunctionDefinition(Declarator &D);
|
||||||
DeclTy *ObjcParseFunctionDefinition(DeclTy *D);
|
DeclTy *ObjcParseMethodDefinition(DeclTy *D);
|
||||||
void ParseKNRParamDeclarations(Declarator &D);
|
void ParseKNRParamDeclarations(Declarator &D);
|
||||||
void ParseSimpleAsm();
|
void ParseSimpleAsm();
|
||||||
void ParseAsmStringLiteral();
|
void ParseAsmStringLiteral();
|
||||||
|
|
Загрузка…
Ссылка в новой задаче