Repository: thrift Updated Branches: refs/heads/master 90ea4f64c -> 86284da84
THRIFT-3413 Thrift code generation bug in Go when extending service Client: Go Patch: Jens Geyer Project: http://git-wip-us.apache.org/repos/asf/thrift/repo Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/86284da8 Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/86284da8 Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/86284da8 Branch: refs/heads/master Commit: 86284da8495bcaeca9d9632374ada63cbf388ead Parents: 90ea4f6 Author: Jens Geyer <[email protected]> Authored: Tue Nov 10 23:23:07 2015 +0100 Committer: Jens Geyer <[email protected]> Committed: Wed Nov 11 01:33:39 2015 +0100 ---------------------------------------------------------------------- compiler/cpp/src/generate/t_go_generator.cc | 61 ++++++++++++++++++++---- 1 file changed, 53 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/thrift/blob/86284da8/compiler/cpp/src/generate/t_go_generator.cc ---------------------------------------------------------------------- diff --git a/compiler/cpp/src/generate/t_go_generator.cc b/compiler/cpp/src/generate/t_go_generator.cc index 77463cf..b198d48 100644 --- a/compiler/cpp/src/generate/t_go_generator.cc +++ b/compiler/cpp/src/generate/t_go_generator.cc @@ -250,11 +250,13 @@ public: std::string go_imports_begin(bool ttypes); std::string go_imports_end(); std::string render_includes(bool ttypes); + std::string render_included_programs(); std::string render_import_protection(); std::string render_fastbinary_includes(); std::string declare_argument(t_field* tfield); std::string render_field_initial_value(t_field* tfield, const string& name, bool optional_field); std::string type_name(t_type* ttype); + std::string module_name(t_type* ttype); std::string function_signature(t_function* tfunction, std::string prefix = ""); std::string function_signature_if(t_function* tfunction, std::string prefix = "", @@ -764,6 +766,28 @@ void t_go_generator::init_generator() { f_const_values_ << endl << "func init() {" << endl; } + +string t_go_generator::render_included_programs() { + const vector<t_program*>& includes = program_->get_includes(); + string result = ""; + + for (size_t i = 0; i < includes.size(); ++i) { + string go_module = get_real_go_module(includes[i]); + size_t found = 0; + for (size_t j = 0; j < go_module.size(); j++) { + // Import statement uses slashes ('/') in namespace + if (go_module[j] == '.') { + go_module[j] = '/'; + found = j + 1; + } + } + + result += "\t\"" + gen_package_prefix_ + go_module + "\"\n"; + } + + return result; +} + /** * Renders all the imports necessary for including another Thrift program. * If ttypes include the additional imports for ttypes.go. @@ -1468,7 +1492,7 @@ void t_go_generator::generate_go_struct_reader(ofstream& out, field_id = (*f_iter)->get_key(); // if negative id, ensure we generate a valid method name - string field_method_prefix("readField"); + string field_method_prefix("ReadField"); if (field_id < 0) { field_method_prefix += "_"; @@ -1543,7 +1567,7 @@ void t_go_generator::generate_go_struct_reader(ofstream& out, for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { string field_type_name(publicize((*f_iter)->get_type()->get_name())); string field_name(publicize((*f_iter)->get_name())); - string field_method_prefix("readField"); + string field_method_prefix("ReadField"); int32_t field_id = (*f_iter)->get_key(); if (field_id < 0) { @@ -2104,6 +2128,7 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << " \"strconv\"" << endl; f_remote << indent() << " \"strings\"" << endl; f_remote << indent() << " \"" + gen_thrift_import_ + "\"" << endl; + f_remote << indent() << render_included_programs(); f_remote << indent() << " \"" << service_module << "\"" << endl; f_remote << indent() << ")" << endl; f_remote << indent() << endl; @@ -2301,7 +2326,7 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << " Usage()" << endl; f_remote << indent() << " return" << endl; f_remote << indent() << "}" << endl; - f_remote << indent() << "argvalue" << i << " := byte(tmp" << i << ")" << endl; + f_remote << indent() << "argvalue" << i << " := int8(tmp" << i << ")" << endl; break; case t_base_type::TYPE_I16: @@ -2311,7 +2336,7 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << " Usage()" << endl; f_remote << indent() << " return" << endl; f_remote << indent() << "}" << endl; - f_remote << indent() << "argvalue" << i << " := byte(tmp" << i << ")" << endl; + f_remote << indent() << "argvalue" << i << " := int16(tmp" << i << ")" << endl; break; case t_base_type::TYPE_I32: @@ -2356,6 +2381,11 @@ void t_go_generator::generate_service_remote(t_service* tservice) { string jsProt(tmp("jsProt")); string err2(tmp("err")); std::string tstruct_name(publicize(the_type->get_name())); + std::string tstruct_module( module_name(the_type)); + if(tstruct_module.empty()) { + tstruct_module = package_name_; + } + f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << endl; f_remote << indent() << mbTrans << " := thrift.NewTMemoryBufferLen(len(" << arg << "))" << endl; @@ -2369,7 +2399,7 @@ void t_go_generator::generate_service_remote(t_service* tservice) { f_remote << indent() << factory << " := thrift.NewTSimpleJSONProtocolFactory()" << endl; f_remote << indent() << jsProt << " := " << factory << ".GetProtocol(" << mbTrans << ")" << endl; - f_remote << indent() << "argvalue" << i << " := " << package_name_ << ".New" << tstruct_name + f_remote << indent() << "argvalue" << i << " := " << tstruct_module << ".New" << tstruct_name << "()" << endl; f_remote << indent() << err2 << " := argvalue" << i << "." << read_method_name_ << "(" << jsProt << ")" << endl; f_remote << indent() << "if " << err2 << " != nil {" << endl; @@ -2412,7 +2442,11 @@ void t_go_generator::generate_service_remote(t_service* tservice) { } if (the_type->is_typedef()) { - f_remote << indent() << "value" << i << " := " << package_name_ << "." + std::string typedef_module( module_name(the_type)); + if(typedef_module.empty()) { + typedef_module = package_name_; + } + f_remote << indent() << "value" << i << " := " << typedef_module << "." << publicize(the_type->get_name()) << "(argvalue" << i << ")" << endl; } else { f_remote << indent() << "value" << i << " := argvalue" << i << endl; @@ -3401,6 +3435,17 @@ string t_go_generator::argument_list(t_struct* tstruct) { string t_go_generator::type_name(t_type* ttype) { t_program* program = ttype->get_program(); + string module( module_name(ttype)); + if( ! module.empty()) { + return module + "." + ttype->get_name(); + } + + return ttype->get_name(); +} + +string t_go_generator::module_name(t_type* ttype) { + t_program* program = ttype->get_program(); + if (program != NULL && program != program_) { string module(get_real_go_module(program)); // for namespaced includes, only keep part after dot. @@ -3408,10 +3453,10 @@ string t_go_generator::type_name(t_type* ttype) { if (dot != string::npos) { module = module.substr(dot + 1); } - return module + "." + ttype->get_name(); + return module; } - return ttype->get_name(); + return ""; } /**
