Improve enum generation for Erlang
Notable changes:
* Added comment for every enum
* Introduce type for enum
* Restrict enum type values to defined by user instead of just by type
diff --git a/compiler/cpp/src/thrift/generate/t_erl_generator.cc b/compiler/cpp/src/thrift/generate/t_erl_generator.cc
index e381110..3ed13c9 100644
--- a/compiler/cpp/src/thrift/generate/t_erl_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_erl_generator.cc
@@ -557,19 +557,37 @@
void t_erl_generator::generate_enum(t_enum* tenum) {
vector<t_enum_value*> constants = tenum->get_constants();
vector<t_enum_value*>::iterator c_iter;
+ vector<string> value_names;
+ vector<string>::iterator names_iter;
v_enums_.push_back(tenum);
v_enum_names_.push_back(atomify(tenum->get_name()));
+ f_types_hrl_file_ << "%% enum " << tenum->get_name() << "\n" << "\n";
+
for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
int value = (*c_iter)->get_value();
string name = (*c_iter)->get_name();
- indent(f_types_hrl_file_) << "-define(" << constify(make_safe_for_module_name(program_name_))
- << "_" << constify(tenum->get_name()) << "_" << constify(name) << ", "
- << value << ")." << '\n';
+ string define_name = constify(make_safe_for_module_name(program_name_)) + "_" +
+ constify(tenum->get_name()) + "_" + constify(name);
+ indent(f_types_hrl_file_) << "-define(" << define_name << ", " << value << ")." << '\n';
+ value_names.push_back(define_name);
}
-
f_types_hrl_file_ << '\n';
+
+ string enum_definition = "-type " + type_name(tenum) + "() :: ";
+ string value_indent(enum_definition.size(), ' ');
+ f_types_hrl_file_ << enum_definition;
+ bool names_iter_first = false;
+ for (names_iter = value_names.begin(); names_iter != value_names.end(); ++names_iter) {
+ if (names_iter_first) {
+ f_types_hrl_file_ << " |" << "\n" << value_indent;
+ } else {
+ names_iter_first = true;
+ }
+ indent(f_types_hrl_file_) << "?" << *names_iter;
+ }
+ f_types_hrl_file_ << ".\n" << "\n";
}
void t_erl_generator::generate_enum_info(t_enum* tenum){