Use enum's const name instead of value (avoid magic number)
diff --git a/compiler/cpp/src/thrift/generate/t_erl_generator.cc b/compiler/cpp/src/thrift/generate/t_erl_generator.cc
index c3e5245..5a40e6d 100644
--- a/compiler/cpp/src/thrift/generate/t_erl_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_erl_generator.cc
@@ -138,6 +138,7 @@
std::string render_type(t_type* type);
std::string render_base_type(t_type* type);
std::string render_string_type();
+ std::string render_const_name(std::string sname, std::string name);
// std::string render_default_value(t_type* type);
std::string render_default_value(t_field* field);
@@ -488,6 +489,12 @@
* @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";
}
@@ -562,7 +569,7 @@
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> const_names;
vector<string>::iterator names_iter;
v_enums_.push_back(tenum);
@@ -573,10 +580,9 @@
for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
int value = (*c_iter)->get_value();
string name = (*c_iter)->get_name();
- 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);
+ string const_name = render_const_name(tenum->get_name(), name);
+ indent(f_types_hrl_file_) << "-define(" << const_name << ", " << value << ")." << '\n';
+ const_names.push_back(const_name);
}
f_types_hrl_file_ << '\n';
@@ -584,7 +590,7 @@
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) {
+ for (names_iter = const_names.begin(); names_iter != const_names.end(); ++names_iter) {
if (names_iter_first) {
f_types_hrl_file_ << " |" << "\n" << value_indent;
} else {
@@ -595,6 +601,10 @@
f_types_hrl_file_ << ".\n" << "\n";
}
+string t_erl_generator::render_const_name(std::string sname, std::string name) {
+ return constify(make_safe_for_module_name(program_name_)) + "_" + constify(sname) + "_" + constify(name);
+}
+
void t_erl_generator::generate_enum_info(t_enum* tenum){
vector<t_enum_value*> constants = tenum->get_constants();
size_t num_constants = constants.size();
@@ -679,7 +689,8 @@
throw "compiler error: no const of base type " + t_base_type::t_base_name(tbase);
}
} else if (type->is_enum()) {
- indent(out) << value->get_integer();
+ string name = (((t_enum*)type)->get_constant_by_value(value->get_integer()))->get_name();
+ indent(out) << "?" << render_const_name(type->get_name(), name);
} else if (type->is_struct() || type->is_xception()) {
out << "#" << type_name(type) << "{";