percolate @optional/@required protocols down to ASTs for
properties declared in the protocol. llvm-svn: 50662
This commit is contained in:
parent
627c3074dd
commit
8d91686b0d
|
@ -320,7 +320,11 @@ void DeclPrinter::PrintObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *AID) {
|
|||
/// PrintObjCPropertyDecl - print a property declaration.
|
||||
///
|
||||
void DeclPrinter::PrintObjCPropertyDecl(ObjCPropertyDecl *PDecl) {
|
||||
|
||||
if (PDecl->getPropertyImplementation() == ObjCPropertyDecl::Required)
|
||||
Out << "@required\n";
|
||||
else if (PDecl->getPropertyImplementation() == ObjCPropertyDecl::Optional)
|
||||
Out << "@optional\n";
|
||||
|
||||
Out << "@property";
|
||||
if (PDecl->getPropertyAttributes() != ObjCPropertyDecl::OBJC_PR_noattr) {
|
||||
bool first = true;
|
||||
|
|
|
@ -1066,10 +1066,15 @@ public:
|
|||
OBJC_PR_nonatomic = 0x40,
|
||||
OBJC_PR_setter = 0x80
|
||||
};
|
||||
|
||||
enum PropertyControl { None, Required, Optional };
|
||||
private:
|
||||
QualType DeclType;
|
||||
unsigned PropertyAttributes : 8;
|
||||
|
||||
// @required/@optional
|
||||
unsigned PropertyImplementation : 2;
|
||||
|
||||
IdentifierInfo *GetterName; // getter name of NULL if no getter
|
||||
IdentifierInfo *SetterName; // setter name of NULL if no setter
|
||||
|
||||
|
@ -1078,7 +1083,8 @@ private:
|
|||
PropertyAttributes(OBJC_PR_noattr), GetterName(0), SetterName(0) {}
|
||||
public:
|
||||
static ObjCPropertyDecl *Create(ASTContext &C, SourceLocation L,
|
||||
IdentifierInfo *Id, QualType T);
|
||||
IdentifierInfo *Id, QualType T,
|
||||
PropertyControl propControl = None);
|
||||
QualType getType() const { return DeclType; }
|
||||
QualType getCanonicalType() const { return DeclType.getCanonicalType(); }
|
||||
|
||||
|
@ -1095,6 +1101,14 @@ public:
|
|||
IdentifierInfo *getSetterName() const { return SetterName; }
|
||||
void setSetterName(IdentifierInfo *Id) { SetterName = Id; }
|
||||
|
||||
// Related to @optional/@required declared in @protocol
|
||||
void setPropertyImplementation(PropertyControl pc) {
|
||||
PropertyImplementation = pc;
|
||||
}
|
||||
PropertyControl getPropertyImplementation() const {
|
||||
return PropertyControl(PropertyImplementation);
|
||||
}
|
||||
|
||||
static bool classof(const Decl *D) {
|
||||
return D->getKind() == ObjCProperty;
|
||||
}
|
||||
|
|
|
@ -685,7 +685,8 @@ public:
|
|||
}
|
||||
// ActOnProperty - called to build one property AST
|
||||
virtual DeclTy *ActOnProperty (Scope *S, SourceLocation AtLoc,
|
||||
FieldDeclarator &FD, ObjCDeclSpec &ODS) {
|
||||
FieldDeclarator &FD, ObjCDeclSpec &ODS,
|
||||
tok::ObjCKeywordKind MethodImplKind) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -112,7 +112,8 @@ ObjCCompatibleAliasDecl::Create(ASTContext &C,
|
|||
ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C,
|
||||
SourceLocation L,
|
||||
IdentifierInfo *Id,
|
||||
QualType T) {
|
||||
QualType T,
|
||||
PropertyControl propControl) {
|
||||
void *Mem = C.getAllocator().Allocate<ObjCPropertyDecl>();
|
||||
return new (Mem) ObjCPropertyDecl(L, Id, T);
|
||||
}
|
||||
|
|
|
@ -271,7 +271,8 @@ void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl,
|
|||
FieldDeclarator &FD = FieldDeclarators[i];
|
||||
// Install the property declarator into interfaceDecl.
|
||||
DeclTy *Property = Actions.ActOnProperty(CurScope,
|
||||
DS.getSourceRange().getBegin(), FD, OCDS);
|
||||
DS.getSourceRange().getBegin(), FD, OCDS,
|
||||
MethodImplKind);
|
||||
allProperties.push_back(Property);
|
||||
}
|
||||
continue;
|
||||
|
|
|
@ -676,7 +676,9 @@ public:
|
|||
DeclTy **allProperties = 0, unsigned pNum = 0);
|
||||
|
||||
virtual DeclTy *ActOnProperty(Scope *S, SourceLocation AtLoc,
|
||||
FieldDeclarator &FD, ObjCDeclSpec &ODS);
|
||||
FieldDeclarator &FD, ObjCDeclSpec &ODS,
|
||||
tok::ObjCKeywordKind MethodImplKind);
|
||||
|
||||
virtual DeclTy *ActOnPropertyImplDecl(SourceLocation AtLoc,
|
||||
SourceLocation PropertyLoc,
|
||||
bool ImplKind, DeclTy *ClassImplDecl,
|
||||
|
|
|
@ -1022,7 +1022,8 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration(
|
|||
|
||||
Sema::DeclTy *Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,
|
||||
FieldDeclarator &FD,
|
||||
ObjCDeclSpec &ODS) {
|
||||
ObjCDeclSpec &ODS,
|
||||
tok::ObjCKeywordKind MethodImplKind) {
|
||||
QualType T = GetTypeForDeclarator(FD.D, S);
|
||||
ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, AtLoc,
|
||||
FD.D.getIdentifier(), T);
|
||||
|
@ -1055,6 +1056,11 @@ Sema::DeclTy *Sema::ActOnProperty(Scope *S, SourceLocation AtLoc,
|
|||
if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_nonatomic)
|
||||
PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_nonatomic);
|
||||
|
||||
if (MethodImplKind == tok::objc_required)
|
||||
PDecl->setPropertyImplementation(ObjCPropertyDecl::Required);
|
||||
else if (MethodImplKind == tok::objc_optional)
|
||||
PDecl->setPropertyImplementation(ObjCPropertyDecl::Optional);
|
||||
|
||||
return PDecl;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue