diff options
-rw-r--r-- | clang/Driver/ASTConsumers.cpp | 6 | ||||
-rw-r--r-- | clang/include/clang/AST/DeclObjC.h | 16 | ||||
-rw-r--r-- | clang/include/clang/Parse/Action.h | 3 | ||||
-rw-r--r-- | clang/lib/AST/DeclObjC.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Parse/ParseObjc.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Sema/Sema.h | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 8 |
7 files changed, 36 insertions, 7 deletions
diff --git a/clang/Driver/ASTConsumers.cpp b/clang/Driver/ASTConsumers.cpp index 684b11eaedb..20d4ce2a886 100644 --- a/clang/Driver/ASTConsumers.cpp +++ b/clang/Driver/ASTConsumers.cpp @@ -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; diff --git a/clang/include/clang/AST/DeclObjC.h b/clang/include/clang/AST/DeclObjC.h index 5e927089621..7947b3dc38a 100644 --- a/clang/include/clang/AST/DeclObjC.h +++ b/clang/include/clang/AST/DeclObjC.h @@ -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; } diff --git a/clang/include/clang/Parse/Action.h b/clang/include/clang/Parse/Action.h index f0d51582974..5d094ae8926 100644 --- a/clang/include/clang/Parse/Action.h +++ b/clang/include/clang/Parse/Action.h @@ -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; } diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp index 89f6d2c5019..0cb777d8deb 100644 --- a/clang/lib/AST/DeclObjC.cpp +++ b/clang/lib/AST/DeclObjC.cpp @@ -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); } diff --git a/clang/lib/Parse/ParseObjc.cpp b/clang/lib/Parse/ParseObjc.cpp index d1b1c25c5a7..8d404a9aafc 100644 --- a/clang/lib/Parse/ParseObjc.cpp +++ b/clang/lib/Parse/ParseObjc.cpp @@ -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; diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 68a834c6b4c..6375fad0869 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -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, diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index afac82ca76f..3b488108961 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -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; } |