void t_delphi_generator::generate_delphi_struct_definition()

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