void t_delphi_generator::generate_delphi_struct_impl()

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