Generate type declaration from typdef
Remove type erasure from type definition and strictly follow type definitions.
diff --git a/compiler/cpp/src/thrift/generate/t_erl_generator.cc b/compiler/cpp/src/thrift/generate/t_erl_generator.cc
index 3ed13c9..f2c0a64 100644
--- a/compiler/cpp/src/thrift/generate/t_erl_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_erl_generator.cc
@@ -132,6 +132,7 @@
std::string render_member_type(t_field* field);
std::string render_member_value(t_field* field);
std::string render_member_requiredness(t_field* field);
+ std::string render_typedef_type(t_type* ttype);
std::string render_string_type();
// std::string render_default_value(t_type* type);
@@ -478,12 +479,13 @@
}
/**
- * Generates a typedef. no op
+ * Generates a typedef.
*
* @param ttypedef The type definition
*/
void t_erl_generator::generate_typedef(t_typedef* ttypedef) {
- (void)ttypedef;
+ t_type* type = ttypedef->get_type();
+ f_types_hrl_file_ << "-type " << type_name(ttypedef) << "() :: " << render_typedef_type(type) << ".\n" << "\n";
}
@@ -866,6 +868,44 @@
}
}
+string t_erl_generator::render_typedef_type(t_type* ttype) {
+ if (ttype->is_base_type()) {
+ t_base_type::t_base tbase = ((t_base_type*)ttype)->get_base();
+ switch (tbase) {
+ case t_base_type::TYPE_STRING:
+ return render_string_type();
+ case t_base_type::TYPE_BOOL:
+ return "boolean()";
+ case t_base_type::TYPE_I8:
+ case t_base_type::TYPE_I16:
+ case t_base_type::TYPE_I32:
+ case t_base_type::TYPE_I64:
+ return "integer()";
+ case t_base_type::TYPE_DOUBLE:
+ return "float()";
+ default:
+ throw "compiler error: unsupported base type " + t_base_type::t_base_name(tbase);
+ }
+ }
+ else if (ttype->is_enum()) {
+ return type_name(ttype) + "()";
+ } else if (ttype->is_struct() || ttype->is_xception() || ttype->is_typedef()) {
+ return type_name(ttype) + "()";
+ } else if (ttype->is_map()) {
+ if (maps_) {
+ return "map()";
+ } else {
+ return "dict:dict()";
+ }
+ } else if (ttype->is_set()) {
+ return "sets:set()";
+ } else if (ttype->is_list()) {
+ return "list()";
+ } else {
+ throw "compiler error: unsupported type " + ttype->get_name();
+ }
+}
+
/**
* Generates a struct
*/