in compiler/cpp/src/thrift/generate/t_delphi_generator.cc [1379:1576]
void t_delphi_generator::generate_delphi_struct_impl(ostream& out,
string cls_prefix,
t_struct* tstruct,
bool is_exception,
bool is_result,
bool is_x_factory) {
if (is_exception && (!is_x_factory)) {
generate_delphi_struct_impl(out, cls_prefix, tstruct, is_exception, is_result, true);
}
string cls_nm;
string exception_factory_name;
if (is_exception) {
exception_factory_name = normalize_clsnm(tstruct->get_name(), "", true) + "Factory";
}
if (is_exception) {
cls_nm = type_name(tstruct, true, (!is_x_factory), is_x_factory, true);
} else {
cls_nm = type_name(tstruct, true, false);
}
std::ostringstream vars, code;
const vector<t_field*>& members = tstruct->get_members();
vector<t_field*>::const_iterator m_iter;
indent_up_impl();
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
t_type* t = (*m_iter)->get_type();
while (t->is_typedef()) {
t = ((t_typedef*)t)->get_type();
}
if ((*m_iter)->get_value() != nullptr) {
initialize_field(vars,
code,
prop_name((*m_iter)->get_name(), is_exception, ""),
t,
(*m_iter)->get_value());
if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
indent_impl(code) << prop_name((*m_iter), is_exception, "F__isset_") << " := True;"
<< '\n';
}
}
}
indent_down_impl();
indent_impl(out) << "constructor " << cls_prefix << cls_nm << "."
<< "Create;" << '\n';
if (!vars.str().empty()) {
out << "var" << '\n';
out << vars.str();
}
indent_impl(out) << "begin" << '\n';
indent_up_impl();
if (is_exception && (!is_x_factory)) {
indent_impl(out) << "inherited Create('');" << '\n';
} else {
indent_impl(out) << "inherited;" << '\n';
}
if (!code.str().empty()) {
out << code.str();
}
indent_down_impl();
indent_impl(out) << "end;" << '\n' << '\n';
if ((members.size() > 0) && is_exception && (!is_x_factory)) {
indent_impl(out) << "constructor " << cls_prefix << cls_nm << "."
<< "Create(" << constructor_argument_list(tstruct, indent_impl()) << ");"
<< '\n';
indent_impl(out) << "begin" << '\n';
indent_up_impl();
indent_impl(out) << "Create;" << '\n';
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
string propname = prop_name((*m_iter)->get_name(), is_exception);
string param_name = constructor_param_name((*m_iter)->get_name());
indent_impl(out) << propname << " := " << param_name << ";" << '\n';
}
indent_impl(out) << "UpdateMessageProperty;" << '\n';
indent_down_impl();
indent_impl(out) << "end;" << '\n' << '\n';
}
indent_impl(out) << "destructor " << cls_prefix << cls_nm << "."
<< "Destroy;" << '\n';
indent_impl(out) << "begin" << '\n';
indent_up_impl();
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
t_type* t = (*m_iter)->get_type();
while (t->is_typedef()) {
t = ((t_typedef*)t)->get_type();
}
finalize_field(out, prop_name(*m_iter, is_exception), t, (*m_iter)->get_value());
}
indent_impl(out) << "inherited;" << '\n';
indent_down_impl();
indent_impl(out) << "end;" << '\n' << '\n';
if (is_exception && (!is_x_factory)) {
indent_impl(out) << "function " << cls_prefix << cls_nm << "." << exception_factory_name
<< ": I" << exception_factory_name << ";" << '\n';
indent_impl(out) << "begin" << '\n';
indent_up_impl();
indent_impl(out) << "if F" << exception_factory_name << " = nil" << '\n';
indent_impl(out) << "then F" << exception_factory_name << " := T" << exception_factory_name << "Impl.Create;" << '\n' << '\n';
indent_impl(out) << "result := F" << exception_factory_name << ";" << '\n';
indent_down_impl();
indent_impl(out) << "end;" << '\n' << '\n';
indent_impl(out) << "function " << cls_prefix << cls_nm << ".QueryInterface(const IID: TGUID; out Obj): HRESULT;" << '\n';
indent_impl(out) << "begin" << '\n';
indent_up_impl();
indent_impl(out) << "if GetInterface(IID, Obj)" << '\n';
indent_impl(out) << "then result := S_OK" << '\n';
indent_impl(out) << "else result := E_NOINTERFACE;" << '\n';
indent_down_impl();
indent_impl(out) << "end;" << '\n' << '\n';
indent_impl(out) << "function " << cls_prefix << cls_nm << "._AddRef: Integer;" << '\n';
indent_impl(out) << "begin" << '\n';
indent_up_impl();
indent_impl(out) << "result := -1; // not refcounted" << '\n';
indent_down_impl();
indent_impl(out) << "end;" << '\n' << '\n';
indent_impl(out) << "function " << cls_prefix << cls_nm << "._Release: Integer;" << '\n';
indent_impl(out) << "begin" << '\n';
indent_up_impl();
indent_impl(out) << "result := -1; // not refcounted" << '\n';
indent_down_impl();
indent_impl(out) << "end;" << '\n' << '\n';
}
if (tstruct->is_union()) {
indent_impl(out) << "procedure " << cls_prefix << cls_nm << "."
<< "ClearUnionValues;" << '\n';
indent_impl(out) << "begin" << '\n';
indent_up_impl();
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
t_type* t = (*m_iter)->get_type();
while (t->is_typedef()) {
t = ((t_typedef*)t)->get_type();
}
generate_delphi_clear_union_value(out,
cls_prefix,
cls_nm,
t,
*m_iter,
"F",
is_exception,
tstruct->is_union(),
is_x_factory,
exception_factory_name);
}
indent_down_impl();
indent_impl(out) << "end;" << '\n' << '\n';
}
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
t_type* t = (*m_iter)->get_type();
while (t->is_typedef()) {
t = ((t_typedef*)t)->get_type();
}
generate_delphi_property_reader_impl(out, cls_prefix, cls_nm, t, *m_iter, "F", is_exception);
generate_delphi_property_writer_impl(out,
cls_prefix,
cls_nm,
t,
*m_iter,
"F",
is_exception,
tstruct->is_union(),
is_x_factory,
exception_factory_name);
if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
generate_delphi_isset_reader_writer_impl(out, cls_prefix, cls_nm, t, *m_iter, "F", is_exception);
}
}
generate_delphi_struct_reader_impl(out, cls_prefix, tstruct, is_exception, is_x_factory);
if (is_result) {
generate_delphi_struct_result_writer_impl(out, cls_prefix, tstruct, is_exception, is_x_factory);
} else {
generate_delphi_struct_writer_impl(out, cls_prefix, tstruct, is_exception, is_x_factory);
}
generate_delphi_struct_tostring_impl(out, cls_prefix, tstruct, is_exception, is_x_factory);
if (is_exception && is_x_factory) {
generate_delphi_create_exception_impl(out, cls_prefix, tstruct, is_exception);
}
}