void PrintObjCCategoryImplDecl(ObjCCategoryImplDecl *PID);
void PrintObjCCategoryDecl(ObjCCategoryDecl *PID);
void PrintObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *AID);
+ void PrintObjCPropertyDecl(ObjCPropertyDecl *PD);
};
} // end anonymous namespace
Out << "}\n";
}
- int NumProperties = OID->getNumPropertyDecl();
- if (NumProperties > 0) {
- for (int i = 0; i < NumProperties; i++) {
- ObjCPropertyDecl *PDecl = OID->getPropertyDecl()[i];
- Out << "@property";
- if (PDecl->getPropertyAttributes() != ObjCPropertyDecl::OBJC_PR_noattr) {
- bool first = true;
- Out << " (";
- if (PDecl->getPropertyAttributes() &
- ObjCPropertyDecl::OBJC_PR_readonly) {
- Out << (first ? ' ' : ',') << "readonly";
- first = false;
- }
-
- if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) {
- Out << (first ? ' ' : ',') << "getter = "
- << PDecl->getGetterName()->getName();
- first = false;
- }
- if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) {
- Out << (first ? ' ' : ',') << "setter = "
- << PDecl->getSetterName()->getName();
- first = false;
- }
-
- if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_assign) {
- Out << (first ? ' ' : ',') << "assign";
- first = false;
- }
-
- if (PDecl->getPropertyAttributes() &
- ObjCPropertyDecl::OBJC_PR_readwrite) {
- Out << (first ? ' ' : ',') << "readwrite";
- first = false;
- }
-
- if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_retain) {
- Out << (first ? ' ' : ',') << "retain";
- first = false;
- }
-
- if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_copy) {
- Out << (first ? ' ' : ',') << "copy";
- first = false;
- }
-
- if (PDecl->getPropertyAttributes() &
- ObjCPropertyDecl::OBJC_PR_nonatomic) {
- Out << (first ? ' ' : ',') << "nonatomic";
- first = false;
- }
- Out << " )";
- }
- Out << ' ' << PDecl->getType().getAsString()
- << ' ' << PDecl->getName();
-
- Out << ";\n";
- }
- }
+ for (ObjCInterfaceDecl::classprop_iterator I = OID->classprop_begin(),
+ E = OID->classprop_end(); I != E; ++I)
+ PrintObjCPropertyDecl(*I);
Out << "@end\n";
// FIXME: implement the rest...
void DeclPrinter::PrintObjCProtocolDecl(ObjCProtocolDecl *PID) {
Out << "@protocol " << PID->getName() << '\n';
+
+ for (ObjCProtocolDecl::classprop_iterator I = PID->classprop_begin(),
+ E = PID->classprop_end(); I != E; ++I)
+ PrintObjCPropertyDecl(*I);
+ Out << "@end\n";
// FIXME: implement the rest...
}
<< PID->getClassInterface()->getName()
<< '(' << PID->getName() << ");\n";
// Output property declarations.
- int NumProperties = PID->getNumPropertyDecl();
- if (NumProperties > 0) {
- for (int i = 0; i < NumProperties; i++) {
- ObjCPropertyDecl *PDecl = PID->getPropertyDecl()[i];
- Out << "@property";
- if (PDecl->getPropertyAttributes() != ObjCPropertyDecl::OBJC_PR_noattr) {
- bool first = true;
- Out << " (";
- if (PDecl->getPropertyAttributes() &
- ObjCPropertyDecl::OBJC_PR_readonly) {
- Out << (first ? ' ' : ',') << "readonly";
- first = false;
- }
-
- if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) {
- Out << (first ? ' ' : ',') << "getter = "
- << PDecl->getGetterName()->getName();
- first = false;
- }
- if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) {
- Out << (first ? ' ' : ',') << "setter = "
- << PDecl->getSetterName()->getName();
- first = false;
- }
-
- if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_assign) {
- Out << (first ? ' ' : ',') << "assign";
- first = false;
- }
-
- if (PDecl->getPropertyAttributes() &
- ObjCPropertyDecl::OBJC_PR_readwrite) {
- Out << (first ? ' ' : ',') << "readwrite";
- first = false;
- }
-
- if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_retain) {
- Out << (first ? ' ' : ',') << "retain";
- first = false;
- }
-
- if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_copy) {
- Out << (first ? ' ' : ',') << "copy";
- first = false;
- }
-
- if (PDecl->getPropertyAttributes() &
- ObjCPropertyDecl::OBJC_PR_nonatomic) {
- Out << (first ? ' ' : ',') << "nonatomic";
- first = false;
- }
- Out << " )";
- }
- Out << ' ' << PDecl->getType().getAsString()
- << ' ' << PDecl->getName();
-
- Out << ";\n";
- }
- }
-
+ for (ObjCCategoryDecl::classprop_iterator I = PID->classprop_begin(),
+ E = PID->classprop_end(); I != E; ++I)
+ PrintObjCPropertyDecl(*I);
Out << "@end\n";
// FIXME: implement the rest...
<< ' ' << AID->getClassInterface()->getName() << ";\n";
}
+/// PrintObjCPropertyDecl - print a property declaration.
+///
+void DeclPrinter::PrintObjCPropertyDecl(ObjCPropertyDecl *PDecl) {
+
+ Out << "@property";
+ if (PDecl->getPropertyAttributes() != ObjCPropertyDecl::OBJC_PR_noattr) {
+ bool first = true;
+ Out << " (";
+ if (PDecl->getPropertyAttributes() &
+ ObjCPropertyDecl::OBJC_PR_readonly) {
+ Out << (first ? ' ' : ',') << "readonly";
+ first = false;
+ }
+
+ if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) {
+ Out << (first ? ' ' : ',') << "getter = "
+ << PDecl->getGetterName()->getName();
+ first = false;
+ }
+ if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) {
+ Out << (first ? ' ' : ',') << "setter = "
+ << PDecl->getSetterName()->getName();
+ first = false;
+ }
+
+ if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_assign) {
+ Out << (first ? ' ' : ',') << "assign";
+ first = false;
+ }
+
+ if (PDecl->getPropertyAttributes() &
+ ObjCPropertyDecl::OBJC_PR_readwrite) {
+ Out << (first ? ' ' : ',') << "readwrite";
+ first = false;
+ }
+
+ if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_retain) {
+ Out << (first ? ' ' : ',') << "retain";
+ first = false;
+ }
+
+ if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_copy) {
+ Out << (first ? ' ' : ',') << "copy";
+ first = false;
+ }
+
+ if (PDecl->getPropertyAttributes() &
+ ObjCPropertyDecl::OBJC_PR_nonatomic) {
+ Out << (first ? ' ' : ',') << "nonatomic";
+ first = false;
+ }
+ Out << " )";
+ }
+ Out << ' ' << PDecl->getType().getAsString()
+ << ' ' << PDecl->getName();
+
+ Out << ";\n";
+}
+
//===----------------------------------------------------------------------===//
/// ASTPrinter - Pretty-printer of ASTs
void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
+ typedef ObjCPropertyDecl * const * classprop_iterator;
+ classprop_iterator classprop_begin() const { return PropertyDecl; }
+ classprop_iterator classprop_end() const {
+ return PropertyDecl+NumPropertyDecl;
+ }
bool isForwardDecl() const { return ForwardDecl; }
void setForwardDecl(bool val) { ForwardDecl = val; }
/// protocol class methods
ObjCMethodDecl **ClassMethods; // Null if not defined
unsigned NumClassMethods; // 0 if none
-
+
+ /// protocol properties
+ ObjCPropertyDecl **PropertyDecl; // Null if no property
+ unsigned NumPropertyDecl; // 0 if none
+
bool isForwardProtoDecl; // declared with @protocol.
SourceLocation EndLoc; // marks the '>' or identifier.
ReferencedProtocols(0), NumReferencedProtocols(0),
InstanceMethods(0), NumInstanceMethods(0),
ClassMethods(0), NumClassMethods(0),
+ PropertyDecl(0), NumPropertyDecl(0),
isForwardProtoDecl(true) {
AllocReferencedProtocols(numRefProtos);
}
unsigned getNumReferencedProtocols() const { return NumReferencedProtocols; }
unsigned getNumInstanceMethods() const { return NumInstanceMethods; }
unsigned getNumClassMethods() const { return NumClassMethods; }
+
+ unsigned getNumPropertyDecl() const { return NumPropertyDecl; }
+
+ ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; }
+ ObjCPropertyDecl **getPropertyDecl() { return PropertyDecl; }
+
+ void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
+
+ typedef ObjCPropertyDecl * const * classprop_iterator;
+ classprop_iterator classprop_begin() const { return PropertyDecl; }
+ classprop_iterator classprop_end() const {
+ return PropertyDecl+NumPropertyDecl;
+ }
typedef ObjCMethodDecl * const * instmeth_iterator;
instmeth_iterator instmeth_begin() const { return InstanceMethods; }
unsigned getNumInstanceMethods() const { return NumInstanceMethods; }
unsigned getNumClassMethods() const { return NumClassMethods; }
- void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
unsigned getNumPropertyDecl() const { return NumPropertyDecl; }
ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; }
+ void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
+
+ typedef ObjCPropertyDecl * const * classprop_iterator;
+ classprop_iterator classprop_begin() const { return PropertyDecl; }
+ classprop_iterator classprop_end() const {
+ return PropertyDecl+NumPropertyDecl;
+ }
+
typedef ObjCMethodDecl * const * instmeth_iterator;
instmeth_iterator instmeth_begin() const { return InstanceMethods; }
instmeth_iterator instmeth_end() const {