зеркало из https://github.com/microsoft/clang.git
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:
Родитель
8b90455743
Коммит
628b96f34e
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче