string t_hs_generator::render_hs_type()

in thrift/compiler/generate/t_hs_generator.cc [2213:2278]


string t_hs_generator::render_hs_type(const t_type* type, bool needs_parens) {
  type = type->get_true_type();
  string type_repr;

  if (type->is_base_type()) {
    t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
    switch (tbase) {
      case t_base_type::TYPE_VOID:
        return "()";
      case t_base_type::TYPE_STRING:
        if (use_string_) {
          return "String";
        } else if (use_strict_text_) {
          return "T.Text";
        } else {
          return "LT.Text";
        }
      case t_base_type::TYPE_BINARY:
        return "BS.ByteString";
      case t_base_type::TYPE_BOOL:
        return "Bool";
      case t_base_type::TYPE_BYTE:
        return use_int_ ? "Int.Int" : "Int.Int8";
      case t_base_type::TYPE_I16:
        return use_int_ ? "Int.Int" : "Int.Int16";
      case t_base_type::TYPE_I32:
        return use_int_ ? "Int.Int" : "Int.Int32";
      case t_base_type::TYPE_I64:
        return use_int_ ? "Int.Int" : "Int.Int64";
      case t_base_type::TYPE_FLOAT:
        return "Float";
      case t_base_type::TYPE_DOUBLE:
        return "Double";
    }

  } else if (type->is_enum()) {
    return qualified_type_name((t_enum*)type);

  } else if (type->is_struct() || type->is_xception()) {
    return qualified_type_name((t_struct*)type);

  } else if (type->is_map()) {
    const t_type* ktype = ((t_map*)type)->get_key_type();
    const t_type* vtype = ((t_map*)type)->get_val_type();
    type_repr = "Map.HashMap " + render_hs_type(ktype, true) + " " +
        render_hs_type(vtype, true);

  } else if (type->is_set()) {
    const t_type* etype = ((t_set*)type)->get_elem_type();
    type_repr = "Set.HashSet " + render_hs_type(etype, true);

  } else if (type->is_list()) {
    const t_type* etype = ((t_list*)type)->get_elem_type();
    string inner_type = render_hs_type(etype, true);
    if (use_list_)
      type_repr = "[" + inner_type + "]";
    else
      type_repr = "Vector.Vector " + inner_type;

  } else {
    throw std::runtime_error(
        "INVALID TYPE IN type_to_enum: " + type->get_name());
  }

  return needs_parens ? "(" + type_repr + ")" : type_repr;
}