Introduce nominal types
diff --git a/compiler/cpp/src/thrift/generate/t_erl_generator.cc b/compiler/cpp/src/thrift/generate/t_erl_generator.cc
index 323b41f..37810a9 100644
--- a/compiler/cpp/src/thrift/generate/t_erl_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_erl_generator.cc
@@ -50,6 +50,11 @@
enum class SetsTo {V1, V2};
/**
+ * Helper enum for type declaration
+ */
+enum class TypeDeclaraion {Type, Nominal};
+
+/**
* Erlang code generator.
*
*/
@@ -70,6 +75,7 @@
export_types_lines_first_ = true;
string_to_ = StringTo::Both;
sets_to_ = SetsTo::V1;
+ type_declaration_ = TypeDeclaraion::Type;
for( iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) {
if( iter->first.compare("legacynames") == 0) {
@@ -100,6 +106,15 @@
} else {
throw "unknown set option value:" + set_to_value;
}
+ } else if( iter->first.compare("type") == 0) {
+ auto type_to_value = iter->second;
+ if( type_to_value.compare("type") == 0) {
+ type_declaration_ = TypeDeclaraion::Type;
+ } else if( type_to_value.compare("nominal") == 0) {
+ type_declaration_ = TypeDeclaraion::Nominal;
+ } else {
+ throw "unknown type option value:" + type_to_value;
+ }
} else {
throw "unknown option erl:" + iter->first;
}
@@ -138,6 +153,7 @@
std::string render_type(t_type* type);
std::string render_base_type(t_type* type);
std::string render_string_type();
+ std::string render_type_declaration();
std::string render_const_name(std::string name);
std::string render_const_name(std::string sname, std::string name);
@@ -236,6 +252,9 @@
/* sets type definition strategy */
SetsTo sets_to_;
+ /* type declaration strategy */
+ TypeDeclaraion type_declaration_;
+
/**
* add function to export list
*/
@@ -490,13 +509,8 @@
* @param ttypedef The type definition
*/
void t_erl_generator::generate_typedef(t_typedef* ttypedef) {
- // t_type* type = ttypedef->get_type();
- // if (type->is_base_type()) {
- // f_types_hrl_file_ << "-nominal ";
- // } else {
- // f_types_hrl_file_ << "-type ";
- // }
- f_types_hrl_file_ << "-type " << type_name(ttypedef) << "() :: " << render_typedef_type(ttypedef) << ".\n" << "\n";
+ f_types_hrl_file_ << render_type_declaration() << type_name(ttypedef)
+ << "() :: " << render_typedef_type(ttypedef) << ".\n" << "\n";
}
@@ -587,7 +601,7 @@
}
f_types_hrl_file_ << '\n';
- string enum_definition = "-type " + type_name(tenum) + "() :: ";
+ string enum_definition = render_type_declaration() + type_name(tenum) + "() :: ";
string value_indent(enum_definition.size(), ' ');
f_types_hrl_file_ << enum_definition;
bool names_iter_first = false;
@@ -884,6 +898,17 @@
}
}
+string t_erl_generator::render_type_declaration() {
+ switch (type_declaration_) {
+ case TypeDeclaraion::Type:
+ return "-type ";
+ case TypeDeclaraion::Nominal:
+ return "-nominal ";
+ default:
+ throw "compiler error: unsupported type declaration";
+ }
+}
+
string t_erl_generator::render_member_requiredness(t_field* field) {
switch (field->get_req()) {
case t_field::T_REQUIRED:
@@ -959,7 +984,8 @@
buf << "}).";
out << buf.str() << '\n';
- out << "-type " + type_name(tstruct) << "() :: #" + type_name(tstruct) + "{}." << '\n' << '\n';
+ out << render_type_declaration() << type_name(tstruct)
+ << "() :: #" + type_name(tstruct) + "{}." << '\n' << '\n';
}
/**
@@ -1428,4 +1454,5 @@
" app_prefix= Application prefix for generated Erlang files.\n"
" maps: Generate maps instead of dicts.\n"
" string= Define string as 'string', 'binary' or 'both'. Default is 'both'.\n"
- " set= Define sets implementation, supported 'v1' and 'v2'. Default is 'v1'.\n")
+ " set= Define sets implementation, supported 'v1' and 'v2'. Default is 'v1'.\n"
+ " type= Define type declaration, supported 'type' and 'nominal'. Default is 'type'.\n")