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
This commit is contained in:
Fariborz Jahanian 2008-04-23 00:06:01 +00:00
Родитель 8b90455743
Коммит 628b96f34e
4 изменённых файлов: 63 добавлений и 21 удалений

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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