percolate @optional/@required protocols down to ASTs for

properties declared in the protocol.

llvm-svn: 50662
This commit is contained in:
Fariborz Jahanian 2008-05-05 18:51:55 +00:00
parent 627c3074dd
commit 8d91686b0d
7 changed files with 36 additions and 7 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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,

View File

@ -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;
}