void t_markdown_generator::print_const_value()

in compiler/cpp/src/thrift/generate/t_markdown_generator.cc [751:874]


void t_markdown_generator::print_const_value(t_type* type, t_const_value* tvalue) {

  // if tvalue is an identifier, the constant content is already shown elsewhere
  if (tvalue->get_type() == t_const_value::CV_IDENTIFIER) {
    string fname = make_file_name(program_->get_name());
    string name = escape_html(tvalue->get_identifier());
    f_out_ << "[```" << name << "```]("
      + make_file_link(fname)
      + "#constant-" + str_to_id(name) + ")";
    return;
  }

  t_type* truetype = type;
  while (truetype->is_typedef()) {
    truetype = ((t_typedef*)truetype)->get_type();
  }

  bool first = true;
  if (truetype->is_base_type()) {
    t_base_type::t_base tbase = ((t_base_type*)truetype)->get_base();
    f_out_ << "```";
    switch (tbase) {
    case t_base_type::TYPE_STRING:
      f_out_ << escape_html(get_escaped_string(tvalue));
      break;
    case t_base_type::TYPE_BOOL:
      f_out_ << ((tvalue->get_integer() != 0) ? "true" : "false");
      break;
    case t_base_type::TYPE_I8:
      f_out_ << tvalue->get_integer();
      break;
    case t_base_type::TYPE_I16:
      f_out_ << tvalue->get_integer();
      break;
    case t_base_type::TYPE_I32:
      f_out_ << tvalue->get_integer();
      break;
    case t_base_type::TYPE_I64:
      f_out_ << tvalue->get_integer();
      break;
    case t_base_type::TYPE_DOUBLE:
      if (tvalue->get_type() == t_const_value::CV_INTEGER) {
        f_out_ << tvalue->get_integer();
      } else {
        f_out_ << tvalue->get_double();
      }
      break;
    default:
      f_out_ << "UNKNOWN BASE TYPE";
      break;
    }
    f_out_ << "```";
  } else if (truetype->is_enum()) {
    f_out_ << escape_html(truetype->get_name()) << "."
           << escape_html(tvalue->get_identifier_name());
  } else if (truetype->is_struct() || truetype->is_xception()) {
    f_out_ << "{ ";
    const vector<t_field*>& fields = ((t_struct*)truetype)->get_members();
    vector<t_field*>::const_iterator f_iter;
    const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = tvalue->get_map();
    map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator v_iter;
    for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
      t_type* field_type = nullptr;
      for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
        if ((*f_iter)->get_name() == v_iter->first->get_string()) {
          field_type = (*f_iter)->get_type();
        }
      }
      if (field_type == nullptr) {
        throw "type error: " + truetype->get_name() + " has no field "
            + v_iter->first->get_string();
      }
      if (!first) {
        f_out_ << ", ";
      }
      first = false;
      f_out_ << escape_html(v_iter->first->get_string()) << " = ";
      print_const_value(field_type, v_iter->second);
    }
    f_out_ << " }";
  } else if (truetype->is_map()) {
    f_out_ << "{ ";
    map<t_const_value*, t_const_value*, t_const_value::value_compare> map_elems = tvalue->get_map();
    map<t_const_value*, t_const_value*, t_const_value::value_compare>::iterator map_iter;
    for (map_iter = map_elems.begin(); map_iter != map_elems.end(); map_iter++) {
      if (!first) {
        f_out_ << ", ";
      }
      first = false;
      print_const_value(((t_map*)truetype)->get_key_type(), map_iter->first);
      f_out_ << " = ";
      print_const_value(((t_map*)truetype)->get_val_type(), map_iter->second);
    }
    f_out_ << " }";
  } else if (truetype->is_list()) {
    f_out_ << "{ ";
    vector<t_const_value*> list_elems = tvalue->get_list();
    ;
    vector<t_const_value*>::iterator list_iter;
    for (list_iter = list_elems.begin(); list_iter != list_elems.end(); list_iter++) {
      if (!first) {
        f_out_ << ", ";
      }
      first = false;
      print_const_value(((t_list*)truetype)->get_elem_type(), *list_iter);
    }
    f_out_ << " }";
  } else if (truetype->is_set()) {
    f_out_ << "{ ";
    vector<t_const_value*> list_elems = tvalue->get_list();
    ;
    vector<t_const_value*>::iterator list_iter;
    for (list_iter = list_elems.begin(); list_iter != list_elems.end(); list_iter++) {
      if (!first) {
        f_out_ << ", ";
      }
      first = false;
      print_const_value(((t_set*)truetype)->get_elem_type(), *list_iter);
    }
    f_out_ << " }";
  } else {
    f_out_ << "UNKNOWN TYPE";
  }
}