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
  */