in compiler/cpp/src/thrift/generate/t_delphi_generator.cc [1636:1860]
void t_delphi_generator::generate_delphi_struct_definition(ostream& out,
t_struct* tstruct,
bool is_exception,
bool in_class,
bool is_result,
bool is_x_factory) {
bool is_final = (tstruct->annotations_.find("final") != tstruct->annotations_.end());
string struct_intf_name;
string struct_name;
string isset_name;
const vector<t_field*>& members = tstruct->get_members();
vector<t_field*>::const_iterator m_iter;
string exception_factory_name = normalize_clsnm(tstruct->get_name(), "", true) + "Factory";
if (is_exception) {
struct_intf_name = type_name(tstruct, false, false, true);
} else {
struct_intf_name = type_name(tstruct);
}
if (is_exception) {
struct_name = type_name(tstruct, true, (!is_x_factory), is_x_factory);
} else {
struct_name = type_name(tstruct, true);
}
if ((!is_exception) || is_x_factory) {
generate_delphi_doc(out, tstruct);
if(rtti_) {
indent(out) << "{$TYPEINFO ON}" << '\n';
indent(out) << "{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished])}" << '\n';
indent(out) << struct_intf_name << " = interface(IBaseWithTypeInfo)" << '\n';
} else {
indent(out) << struct_intf_name << " = interface(IBase)" << '\n';
}
indent_up();
generate_guid(out);
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
generate_delphi_property_reader_definition(out, *m_iter, is_exception);
generate_delphi_property_writer_definition(out, *m_iter, is_exception);
}
if (is_x_factory) {
out << '\n';
indent(out) << "// Create Exception Object" << '\n';
indent(out) << "function CreateException: " << type_name(tstruct, true, true) << ";" << '\n';
}
if (members.size() > 0) {
out << '\n';
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
generate_property(out, *m_iter, true, is_exception);
}
}
if (members.size() > 0) {
out << '\n';
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
generate_delphi_isset_reader_writer_definition(out, *m_iter, is_exception);
}
}
}
if (members.size() > 0) {
out << '\n';
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
isset_name = prop_name(*m_iter, is_exception, "__isset_");
indent(out) << "property " << isset_name << ": System.Boolean read Get" << isset_name << " write Set" << isset_name << ";"
<< '\n';
}
}
}
indent_down();
indent(out) << "end;"
<< render_deprecation_attribute(tstruct->annotations_, " {", "}")
<< '\n';
if(rtti_) {
indent(out) << "{$IFNDEF TYPEINFO_WAS_ON} {$TYPEINFO OFF} {$ENDIF}" << '\n';
}
indent(out) << '\n';
}
generate_delphi_doc(out, tstruct);
indent(out) << struct_name << " = ";
if (is_final) {
out << "sealed ";
}
out << "class(";
if (is_exception && (!is_x_factory)) {
out << "TException, IInterface, IBase, ISupportsToString";
} else {
out << "TInterfacedObject, IBase, ISupportsToString, " << struct_intf_name;
}
out << ")" << '\n';
if (is_exception && (!is_x_factory)) {
indent(out) << "public" << '\n';
indent_up();
indent(out) << "type" << '\n';
indent_up();
generate_delphi_struct_definition(out, tstruct, is_exception, in_class, is_result, true);
indent_down();
indent_down();
}
indent(out) << "private" << '\n';
indent_up();
if (is_exception && (!is_x_factory)) {
indent(out) << "F" << exception_factory_name << " :" << struct_intf_name << ";" << '\n' << '\n';
}
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
indent(out) << declare_field(*m_iter, false, "F", is_exception) << '\n';
}
if (members.size() > 0) {
indent(out) << '\n';
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
isset_name = prop_name(*m_iter, is_exception, "F__isset_");
indent(out) << isset_name << ": System.Boolean;" << '\n';
}
}
}
indent(out) << '\n';
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
generate_delphi_property_reader_definition(out, *m_iter, is_exception);
generate_delphi_property_writer_definition(out, *m_iter, is_exception);
}
if (tstruct->is_union()) {
out << '\n';
indent(out) << "// Clear values(for union's property setter)" << '\n';
indent(out) << "procedure ClearUnionValues;" << '\n';
}
if (members.size() > 0) {
out << '\n';
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
isset_name = prop_name(*m_iter, is_exception, "__isset_");
indent(out) << "function Get" << isset_name << ": System.Boolean;" << '\n';
indent(out) << "procedure Set" << isset_name << "( const value : System.Boolean);" << '\n';
}
}
}
if (is_exception && (!is_x_factory)) {
out << '\n';
indent_down();
indent(out) << "strict protected" << '\n';
indent_up();
indent(out) << "function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;" << '\n';
indent(out) << "function _AddRef: Integer; stdcall;" << '\n';
indent(out) << "function _Release: Integer; stdcall;" << '\n';
out << '\n';
}
indent_down();
indent(out) << "public" << '\n';
indent_up();
if ((members.size() > 0) && is_exception && (!is_x_factory)) {
indent(out) << "constructor Create; overload;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n';
indent(out) << "constructor Create(" << constructor_argument_list(tstruct, indent())
<< "); overload;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n';
} else {
indent(out) << "constructor Create;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n';
}
indent(out) << "destructor Destroy; override;" << '\n';
out << '\n';
indent(out) << "function ToString: string; override;" << '\n';
if (is_exception && (!is_x_factory)) {
out << '\n';
indent(out) << "// Exception Factory" << '\n';
indent(out) << "function " << exception_factory_name << ": " << struct_intf_name << ";" << '\n';
}
out << '\n';
indent(out) << "// IBase" << '\n';
indent(out) << "procedure Read( const iprot: IProtocol);" << '\n';
indent(out) << "procedure Write( const oprot: IProtocol);" << '\n';
if (is_exception && is_x_factory) {
out << '\n';
indent(out) << "// Create Exception Object" << '\n';
indent(out) << "function CreateException: " << type_name(tstruct, true, true) << ";" << '\n';
}
if (members.size() > 0) {
out << '\n';
indent(out) << "// Properties" << '\n';
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
generate_property(out, *m_iter, true, is_exception);
}
}
if (members.size() > 0) {
out << '\n';
indent(out) << "// isset" << '\n';
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
isset_name = prop_name(*m_iter, is_exception, "__isset_");
indent(out) << "property " << isset_name << ": System.Boolean read Get" << isset_name << " write Set" << isset_name << ";"
<< '\n';
}
}
}
indent_down();
indent(out) << "end;" << '\n' << '\n';
}