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 "@"
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) {
}
}
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.
/// 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;
/// 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;
// 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.
}
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:
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();
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();
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,
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.
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));
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);
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.
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);