diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2008-04-23 00:06:01 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2008-04-23 00:06:01 +0000 |
commit | 628b96f34e93b643b6e15e75eabb8d96079a7e27 (patch) | |
tree | f165388e7343cdf09821dc06855ec5980e7eb66a | |
parent | 8b9045574329ebac6270dfab7ebadce3179bced1 (diff) |
Patch to build AST for property implementation declarations and
to print declaration from its AST.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50117 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | Driver/ASTConsumers.cpp | 26 | ||||
-rw-r--r-- | include/clang/AST/DeclObjC.h | 15 | ||||
-rw-r--r-- | lib/AST/DeclObjC.cpp | 9 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 34 |
4 files changed, 63 insertions, 21 deletions
diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp index 9653526afb..eaee94e51d 100644 --- a/Driver/ASTConsumers.cpp +++ b/Driver/ASTConsumers.cpp @@ -53,6 +53,7 @@ namespace { void PrintObjCCategoryDecl(ObjCCategoryDecl *PID); void PrintObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *AID); void PrintObjCPropertyDecl(ObjCPropertyDecl *PD); + void PrintObjCPropertyImplDecl(ObjCPropertyImplDecl *PID); }; } // end anonymous namespace @@ -228,6 +229,10 @@ void DeclPrinter::PrintObjCImplementationDecl(ObjCImplementationDecl *OID) { } } + for (ObjCImplementationDecl::propimpl_iterator I = OID->propimpl_begin(), + E = OID->propimpl_end(); I != E; ++I) + PrintObjCPropertyImplDecl(*I); + Out << "@end\n"; } @@ -287,7 +292,10 @@ void DeclPrinter::PrintObjCCategoryImplDecl(ObjCCategoryImplDecl *PID) { Out << "@implementation " << PID->getClassInterface()->getName() << '(' << PID->getName() << ");\n"; - + for (ObjCCategoryImplDecl::propimpl_iterator I = PID->propimpl_begin(), + E = PID->propimpl_end(); I != E; ++I) + PrintObjCPropertyImplDecl(*I); + Out << "@end\n"; // FIXME: implement the rest... } @@ -367,7 +375,21 @@ void DeclPrinter::PrintObjCPropertyDecl(ObjCPropertyDecl *PDecl) { Out << ";\n"; } - + +/// PrintObjCPropertyImplDecl - Print an objective-c property implementation +/// declaration syntax. +/// +void DeclPrinter::PrintObjCPropertyImplDecl(ObjCPropertyImplDecl *PID) { + if (PID->getPropertyImplementation() == + ObjCPropertyImplDecl::OBJC_PR_IMPL_SYNTHSIZE) + Out << "\n@synthesize "; + else + Out << "\n@dynamic "; + Out << PID->getPropertyDecl()->getName(); + if (PID->getPropertyIvarDecl()) + Out << "=" << PID->getPropertyIvarDecl()->getName(); + Out << ";\n"; +} //===----------------------------------------------------------------------===// /// ASTPrinter - Pretty-printer of ASTs diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 72c8e025a8..93a3457764 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -1106,9 +1106,18 @@ private: /// Null for @dynamic. Required for @synthesize. ObjCIvarDecl *PropertyIvarDecl; public: - ObjCPropertyImplDecl(SourceLocation atLoc, SourceLocation L) - : Decl(ObjCPropertyImpl, L), AtLoc(atLoc), PropertyDecl(0), - PropertyImplementation(OBJC_PR_IMPL_None), PropertyIvarDecl(0) {} + ObjCPropertyImplDecl(SourceLocation atLoc, SourceLocation L, + ObjCPropertyDecl *property, + PropertyImplKind propertyKind, + ObjCIvarDecl *ivarDecl) + : Decl(ObjCPropertyImpl, L), AtLoc(atLoc), PropertyDecl(property), + PropertyImplementation(propertyKind), PropertyIvarDecl(ivarDecl){} + + static ObjCPropertyImplDecl *Create(ASTContext &C, SourceLocation atLoc, + SourceLocation L, + ObjCPropertyDecl *property, + PropertyImplKind propertyKind, + ObjCIvarDecl *ivarDecl); void setPropertyDecl(ObjCPropertyDecl *property) { PropertyDecl = property; } ObjCPropertyDecl *getPropertyDecl() const { return PropertyDecl; } diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index d3592e1416..ef4a6e1c3d 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -517,5 +517,14 @@ ObjCInterfaceDecl *ObjCMethodDecl::getClassInterface() { return 0; } +ObjCPropertyImplDecl *ObjCPropertyImplDecl::Create(ASTContext &C, + SourceLocation atLoc, + SourceLocation L, + ObjCPropertyDecl *property, + PropertyImplKind kind, + ObjCIvarDecl *ivar) { + void *Mem = C.getAllocator().Allocate<ObjCPropertyImplDecl>(); + return new (Mem) ObjCPropertyImplDecl(atLoc, L, property, kind, ivar); +} diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 234bead575..61449fc457 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -949,8 +949,9 @@ Sema::DeclTy *Sema::ActOnPropertyImplDecl(SourceLocation AtLoc, ObjCInterfaceDecl* IDecl = 0; // Find the class or category class where this property must have // a declaration. - if (ObjCImplementationDecl *IC = - dyn_cast<ObjCImplementationDecl>(ClassImpDecl)) { + ObjCImplementationDecl *IC = 0; + ObjCCategoryImplDecl* CatImplClass = 0; + if ((IC = dyn_cast<ObjCImplementationDecl>(ClassImpDecl))) { IDecl = getObjCInterfaceDecl(IC->getIdentifier()); // We always synthesize an interface for an implementation // without an interface decl. So, IDecl is always non-zero. @@ -964,8 +965,7 @@ Sema::DeclTy *Sema::ActOnPropertyImplDecl(SourceLocation AtLoc, return 0; } } - else if (ObjCCategoryImplDecl* CatImplClass = - dyn_cast<ObjCCategoryImplDecl>(ClassImpDecl)) { + else if ((CatImplClass = dyn_cast<ObjCCategoryImplDecl>(ClassImpDecl))) { if (Synthesize) { Diag(AtLoc, diag::error_synthesize_category_decl); return 0; @@ -994,14 +994,14 @@ Sema::DeclTy *Sema::ActOnPropertyImplDecl(SourceLocation AtLoc, Diag(AtLoc, diag::error_bad_property_context); return 0; } - + ObjCIvarDecl *Ivar = 0; // Check that we have a valid, previously declared ivar for @synthesize if (Synthesize) { // @synthesize if (!PropertyIvar) PropertyIvar = PropertyId; // Check that this is a previously declared 'ivar' in 'IDecl' interface - ObjCIvarDecl *Ivar = IDecl->FindIvarDeclaration(PropertyIvar); + Ivar = IDecl->FindIvarDeclaration(PropertyIvar); if (!Ivar) { Diag(PropertyLoc, diag::error_missing_property_ivar_decl, PropertyId->getName()); @@ -1020,15 +1020,17 @@ Sema::DeclTy *Sema::ActOnPropertyImplDecl(SourceLocation AtLoc, return 0; } assert (property && "ActOnPropertyImplDecl - property declaration missing"); - // TODO: Build the property implementation AST, pushes it into its - // class/cateogory implementation's vector of property implementations -#if 0 - ObjCCategoryImplDecl *PIDecl = - ObjCCategoryImplDecl::Create(AtLoc, PropertyLoc, property, - Synthesize ? ObjCPropertyImplDecl::OBJC_PR_IMPL_SYNTHSIZE - : ObjCPropertyImplDecl::OBJC_PR_IMPL_DYNAMIC, - PropertyId, PropertyIvar); -#endif - return 0; + ObjCPropertyImplDecl *PIDecl = + ObjCPropertyImplDecl::Create(Context, AtLoc, PropertyLoc, property, + (Synthesize ? + ObjCPropertyImplDecl::OBJC_PR_IMPL_SYNTHSIZE + : ObjCPropertyImplDecl::OBJC_PR_IMPL_DYNAMIC), + Ivar); + if (IC) + IC->addPropertyImplementation(PIDecl); + else + CatImplClass->addPropertyImplementation(PIDecl); + + return PIDecl; } |