Uses more description name for method implementation kind argument.

Moves such argument as the last argument and uses defaul value.

llvm-svn: 42073
This commit is contained in:
Fariborz Jahanian 2007-09-18 00:25:23 +00:00
parent a9deb50918
commit 0c74e9d161
5 changed files with 41 additions and 42 deletions

View File

@ -216,7 +216,7 @@ Parser::DeclTy *Parser::ParseObjCAtInterfaceDeclaration(
void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl,
tok::ObjCKeywordKind contextKey) {
llvm::SmallVector<DeclTy*, 32> allMethods;
tok::ObjCKeywordKind pi = tok::objc_not_keyword;
tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword;
while (1) {
if (Tok.getKind() == tok::at) {
SourceLocation AtLoc = ConsumeToken(); // the "@"
@ -226,12 +226,12 @@ void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl,
break;
} else if (ocKind == tok::objc_required) { // protocols only
ConsumeToken();
pi = ocKind;
MethodImplKind = ocKind;
if (contextKey != tok::objc_protocol)
Diag(AtLoc, diag::err_objc_protocol_required);
} else if (ocKind == tok::objc_optional) { // protocols only
ConsumeToken();
pi = ocKind;
MethodImplKind = ocKind;
if (contextKey != tok::objc_protocol)
Diag(AtLoc, diag::err_objc_protocol_optional);
} else if (ocKind == tok::objc_property) {
@ -243,7 +243,7 @@ void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl,
}
}
if (Tok.getKind() == tok::minus || Tok.getKind() == tok::plus) {
DeclTy *methodPrototype = ParseObjCMethodPrototype(interfaceDecl, pi);
DeclTy *methodPrototype = ParseObjCMethodPrototype(interfaceDecl, MethodImplKind);
allMethods.push_back(methodPrototype);
// Consume the ';' here, since ParseObjCMethodPrototype() is re-used for
// method definitions.
@ -367,15 +367,15 @@ void Parser::ParseObjCPropertyDecl(DeclTy *interfaceDecl) {
/// objc-method-attributes: [OBJC2]
/// __attribute__((deprecated))
///
Parser::DeclTy *Parser::ParseObjCMethodPrototype(DeclTy *IDecl,
tok::ObjCKeywordKind& pi) {
Parser::DeclTy *Parser::ParseObjCMethodPrototype(DeclTy *IDecl,
tok::ObjCKeywordKind MethodImplKind) {
assert((Tok.getKind() == tok::minus || Tok.getKind() == tok::plus) &&
"expected +/-");
tok::TokenKind methodType = Tok.getKind();
SourceLocation methodLoc = ConsumeToken();
DeclTy *MDecl = ParseObjCMethodDecl(pi, methodType, methodLoc);
DeclTy *MDecl = ParseObjCMethodDecl(methodType, methodLoc, MethodImplKind);
// Since this rule is used for both method declarations and definitions,
// the caller is (optionally) responsible for consuming the ';'.
return MDecl;
@ -484,8 +484,8 @@ Parser::TypeTy *Parser::ParseObjCTypeName() {
/// objc-keyword-attributes: [OBJC2]
/// __attribute__((unused))
///
Parser::DeclTy *Parser::ParseObjCMethodDecl(tok::ObjCKeywordKind& pi,
tok::TokenKind mType, SourceLocation mLoc) {
Parser::DeclTy *Parser::ParseObjCMethodDecl(tok::TokenKind mType, SourceLocation mLoc,
tok::ObjCKeywordKind MethodImplKind) {
TypeTy *ReturnType = 0;
AttributeList *methodAttrs = 0;
@ -551,10 +551,10 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(tok::ObjCKeywordKind& pi,
// If attributes exist after the method, parse them.
if (getLang().ObjC2 && Tok.getKind() == tok::kw___attribute)
methodAttrs = ParseAttributes();
return Actions.ObjcBuildMethodDeclaration(pi, mLoc, mType,
return Actions.ObjcBuildMethodDeclaration(mLoc, mType,
ReturnType,
&KeyInfo[0], KeyInfo.size(),
methodAttrs);
methodAttrs, MethodImplKind);
} else if (!selIdent) {
Diag(Tok, diag::err_expected_ident); // missing selector name.
}
@ -562,9 +562,9 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(tok::ObjCKeywordKind& pi,
if (getLang().ObjC2 && Tok.getKind() == tok::kw___attribute)
methodAttrs = ParseAttributes();
return Actions.ObjcBuildMethodDeclaration(pi,
mLoc, mType, ReturnType,
selIdent, methodAttrs);
return Actions.ObjcBuildMethodDeclaration(mLoc, mType, ReturnType,
selIdent, methodAttrs,
MethodImplKind);
}
/// objc-protocol-refs:
@ -917,8 +917,7 @@ void Parser::ParseObjCInstanceMethodDefinition() {
assert(Tok.getKind() == tok::minus &&
"ParseObjCInstanceMethodDefinition(): Expected '-'");
// FIXME: @optional/@protocol??
tok::ObjCKeywordKind pi = tok::objc_not_keyword;
ParseObjCMethodPrototype(ObjcImpDecl, pi);
ParseObjCMethodPrototype(ObjcImpDecl);
// parse optional ';'
if (Tok.getKind() == tok::semi)
ConsumeToken();
@ -937,8 +936,7 @@ void Parser::ParseObjCClassMethodDefinition() {
assert(Tok.getKind() == tok::plus &&
"ParseObjCClassMethodDefinition(): Expected '+'");
// FIXME: @optional/@protocol??
tok::ObjCKeywordKind pi = tok::objc_not_keyword;
ParseObjCMethodPrototype(ObjcImpDecl, pi);
ParseObjCMethodPrototype(ObjcImpDecl);
// parse optional ';'
if (Tok.getKind() == tok::semi)
ConsumeToken();

View File

@ -368,15 +368,15 @@ public:
virtual void ObjcAddMethodsToClass(DeclTy *ClassDecl,
DeclTy **allMethods, unsigned allNum);
virtual DeclTy *ObjcBuildMethodDeclaration(tok::ObjCKeywordKind& pi,
SourceLocation MethodLoc,
virtual DeclTy *ObjcBuildMethodDeclaration(SourceLocation MethodLoc,
tok::TokenKind MethodType, TypeTy *ReturnType,
ObjcKeywordDecl *Keywords, unsigned NumKeywords,
AttributeList *AttrList);
virtual DeclTy *ObjcBuildMethodDeclaration(tok::ObjCKeywordKind& pi,
SourceLocation MethodLoc,
AttributeList *AttrList,
tok::ObjCKeywordKind MethodImplKind);
virtual DeclTy *ObjcBuildMethodDeclaration(SourceLocation MethodLoc,
tok::TokenKind MethodType, TypeTy *ReturnType,
IdentifierInfo *SelectorName, AttributeList *AttrList);
IdentifierInfo *SelectorName, AttributeList *AttrList,
tok::ObjCKeywordKind MethodImplKind);
// This actions handles keyword message to classes.
virtual ExprResult ActOnKeywordMessage(IdentifierInfo *receivingClassName,

View File

@ -1264,11 +1264,11 @@ void Sema::ObjcAddMethodsToClass(DeclTy *ClassDecl,
return;
}
Sema::DeclTy *Sema::ObjcBuildMethodDeclaration(tok::ObjCKeywordKind& pi,
SourceLocation MethodLoc,
Sema::DeclTy *Sema::ObjcBuildMethodDeclaration(SourceLocation MethodLoc,
tok::TokenKind MethodType, TypeTy *ReturnType,
ObjcKeywordDecl *Keywords, unsigned NumKeywords,
AttributeList *AttrList) {
AttributeList *AttrList,
tok::ObjCKeywordKind MethodDeclKind) {
assert(NumKeywords && "Selector must be specified");
// Derive the selector name from the keyword declarations.
@ -1306,17 +1306,17 @@ Sema::DeclTy *Sema::ObjcBuildMethodDeclaration(tok::ObjCKeywordKind& pi,
SelName, resultDeclType,
0, -1, AttrList, MethodType == tok::minus);
ObjcMethod->setMethodParams(&Params[0], NumKeywords);
if (pi == tok::objc_optional)
if (MethodDeclKind == tok::objc_optional)
ObjcMethod->setDeclImplementation(ObjcMethodDecl::Optional);
else
ObjcMethod->setDeclImplementation(ObjcMethodDecl::Required);
return ObjcMethod;
}
Sema::DeclTy *Sema::ObjcBuildMethodDeclaration(tok::ObjCKeywordKind& pi,
SourceLocation MethodLoc,
Sema::DeclTy *Sema::ObjcBuildMethodDeclaration(SourceLocation MethodLoc,
tok::TokenKind MethodType, TypeTy *ReturnType,
IdentifierInfo *SelectorName, AttributeList *AttrList) {
IdentifierInfo *SelectorName, AttributeList *AttrList,
tok::ObjCKeywordKind MethodDeclKind) {
const char *methodName = SelectorName->getName();
SelectorInfo &SelName = Context.getSelectorInfo(methodName,
methodName+strlen(methodName));
@ -1324,7 +1324,7 @@ Sema::DeclTy *Sema::ObjcBuildMethodDeclaration(tok::ObjCKeywordKind& pi,
ObjcMethodDecl* ObjcMethod = new ObjcMethodDecl(MethodLoc,
SelName, resultDeclType, 0, -1,
AttrList, MethodType == tok::minus);
if (pi == tok::objc_optional)
if (MethodDeclKind == tok::objc_optional)
ObjcMethod->setDeclImplementation(ObjcMethodDecl::Optional);
else
ObjcMethod->setDeclImplementation(ObjcMethodDecl::Required);

View File

@ -453,15 +453,17 @@ public:
IdentifierInfo **ProtoRefNames, unsigned NumProtoRefs) {
return 0;
}
virtual DeclTy *ObjcBuildMethodDeclaration(tok::ObjCKeywordKind& pi,
SourceLocation MethodLoc, tok::TokenKind MethodType, TypeTy *ReturnType,
virtual DeclTy *ObjcBuildMethodDeclaration(SourceLocation MethodLoc,
tok::TokenKind MethodType, TypeTy *ReturnType,
ObjcKeywordDecl *Keywords, unsigned NumKeywords,
AttributeList *AttrList) {
AttributeList *AttrList,
tok::ObjCKeywordKind MethodImplKind) {
return 0;
}
virtual DeclTy *ObjcBuildMethodDeclaration(tok::ObjCKeywordKind& pi,
SourceLocation MethodLoc, tok::TokenKind MethodType, TypeTy *ReturnType,
IdentifierInfo *SelectorName, AttributeList *AttrList) {
virtual DeclTy *ObjcBuildMethodDeclaration(SourceLocation MethodLoc,
tok::TokenKind MethodType, TypeTy *ReturnType,
IdentifierInfo *SelectorName, AttributeList *AttrList,
tok::ObjCKeywordKind MethodImplKind) {
return 0;
}
// This actions handles keyword message to classes.

View File

@ -290,10 +290,9 @@ private:
TypeTy *ParseObjCTypeName();
void ParseObjCMethodRequirement();
DeclTy *ParseObjCMethodPrototype(DeclTy *classOrCat,
tok::ObjCKeywordKind& pi);
DeclTy *ParseObjCMethodDecl(tok::ObjCKeywordKind& pi,
tok::TokenKind mType,
SourceLocation mLoc);
tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword);
DeclTy *ParseObjCMethodDecl(tok::TokenKind mType, SourceLocation mLoc,
tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword);
void ParseObjCPropertyAttribute(DeclTy *interfaceDecl);
void ParseObjCPropertyDecl(DeclTy *interfaceDecl);