diff options
author | Jens Geyer <jensg@apache.org> | 2014-11-30 15:07:18 +0100 |
---|---|---|
committer | Jens Geyer <jensg@apache.org> | 2014-11-30 15:24:08 +0100 |
commit | 527b6d9c86a7e5cde14cbb09a0e3103be0791c3a (patch) | |
tree | 0494794c37a050af5ecc001c5efb61e8d5ef8c3b /compiler | |
parent | 200150d330b0f2ad986ff4993f1c45c64e4736a3 (diff) | |
download | thrift-527b6d9c86a7e5cde14cbb09a0e3103be0791c3a.tar.gz |
THRIFT-2854 Go Struct writer and reader looses important error information
Client: Go
Patch: Chi Vinh Le <cvl@chinet.info>
This closes #291
Fixes error reporting in go generator
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/cpp/src/generate/t_go_generator.cc | 56 |
1 files changed, 28 insertions, 28 deletions
diff --git a/compiler/cpp/src/generate/t_go_generator.cc b/compiler/cpp/src/generate/t_go_generator.cc index 7610da4e9..e1f4942de 100644 --- a/compiler/cpp/src/generate/t_go_generator.cc +++ b/compiler/cpp/src/generate/t_go_generator.cc @@ -1234,14 +1234,14 @@ void t_go_generator::generate_go_struct_reader(ofstream& out, << endl; indent_up(); out << indent() << "if _, err := iprot.ReadStructBegin(); err != nil {" << endl << indent() - << " return fmt.Errorf(\"%T read error: %s\", p, err)" << endl << indent() << "}" << endl; + << " return thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)" << endl << indent() << "}" << endl; // Loop over reading in fields indent(out) << "for {" << endl; indent_up(); // Read beginning field marker out << indent() << "_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()" << endl << indent() << "if err != nil {" << endl << indent() - << " return fmt.Errorf(\"%T field %d read error: %s\", p, fieldId, err)" << endl << indent() + << " return thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)" << endl << indent() << "}" << endl; // Check for field STOP marker and break out << indent() << "if fieldTypeId == thrift.STOP { break; }" << endl; @@ -1302,7 +1302,7 @@ void t_go_generator::generate_go_struct_reader(ofstream& out, << " return err" << endl << indent() << "}" << endl; indent_down(); out << indent() << "}" << endl << indent() << "if err := iprot.ReadStructEnd(); err != nil {" - << endl << indent() << " return fmt.Errorf(\"%T read struct end error: %s\", p, err)" << endl + << endl << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)" << endl << indent() << "}" << endl << indent() << "return nil" << endl; indent_down(); out << indent() << "}" << endl << endl; @@ -1338,7 +1338,7 @@ void t_go_generator::generate_go_struct_writer(ofstream& out, indent(out) << "func (p *" << tstruct_name << ") Write(oprot thrift.TProtocol) error {" << endl; indent_up(); out << indent() << "if err := oprot.WriteStructBegin(\"" << name << "\"); err != nil {" << endl - << indent() << " return fmt.Errorf(\"%T write struct begin error: %s\", p, err) }" << endl; + << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err) }" << endl; string field_name; string escape_field_name; @@ -1363,9 +1363,9 @@ void t_go_generator::generate_go_struct_writer(ofstream& out, // Write the struct map out << indent() << "if err := oprot.WriteFieldStop(); err != nil {" << endl << indent() - << " return fmt.Errorf(\"write field stop error: %s\", err) }" << endl << indent() + << " return thrift.PrependError(\"write field stop error: \", err) }" << endl << indent() << "if err := oprot.WriteStructEnd(); err != nil {" << endl << indent() - << " return fmt.Errorf(\"write struct stop error: %s\", err) }" << endl << indent() + << " return thrift.PrependError(\"write struct stop error: \", err) }" << endl << indent() << "return nil" << endl; indent_down(); out << indent() << "}" << endl << endl; @@ -1395,16 +1395,16 @@ void t_go_generator::generate_go_struct_writer(ofstream& out, out << indent() << "if err := oprot.WriteFieldBegin(\"" << escape_field_name << "\", " << type_to_enum((*f_iter)->get_type()) << ", " << field_id << "); err != nil {" << endl - << indent() << " return fmt.Errorf(\"%T write field begin error " << field_id << ":" - << escape_field_name << ": %s\", p, err); }" << endl; + << indent() << " return thrift.PrependError(fmt.Sprintf(\"%T write field begin error " << field_id << ":" + << escape_field_name << ": \", p), err) }" << endl; // Write field contents generate_serialize_field(out, *f_iter, "p."); // Write field closer out << indent() << "if err := oprot.WriteFieldEnd(); err != nil {" << endl << indent() - << " return fmt.Errorf(\"%T write field end error " << field_id << ":" << escape_field_name - << ": %s\", p, err); }" << endl; + << " return thrift.PrependError(fmt.Sprintf(\"%T write field end error " << field_id << ":" << escape_field_name + << ": \", p), err) }" << endl; if (field_required == t_field::T_OPTIONAL) { indent_down(); @@ -2450,8 +2450,8 @@ void t_go_generator::generate_deserialize_field(ofstream& out, out << "ReadI32()"; } - out << "; err != nil {" << endl << indent() << "return fmt.Errorf(\"error reading field " - << tfield->get_key() << ": %s\", err)" << endl; + out << "; err != nil {" << endl << indent() << "return thrift.PrependError(\"error reading field " + << tfield->get_key() << ": \", err)" << endl; out << "} else {" << endl; string wrap; @@ -2490,7 +2490,7 @@ void t_go_generator::generate_deserialize_struct(ofstream& out, out << indent() << prefix << eq << (pointer_field ? "&" : ""); generate_go_struct_initializer(out, tstruct); out << indent() << "if err := " << prefix << ".Read(iprot); err != nil {" << endl << indent() - << " return fmt.Errorf(\"%T error reading struct: %s\", " << prefix << ", err)" << endl + << " return thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", " << prefix << "), err)" << endl << indent() << "}" << endl; } @@ -2514,21 +2514,21 @@ void t_go_generator::generate_deserialize_container(ofstream& out, if (ttype->is_map()) { out << indent() << "_, _, size, err := iprot.ReadMapBegin()" << endl << indent() << "if err != nil {" << endl << indent() - << " return fmt.Errorf(\"error reading map begin: %s\", err)" << endl << indent() << "}" + << " return thrift.PrependError(\"error reading map begin: \", err)" << endl << indent() << "}" << endl << indent() << "tMap := make(" << type_to_go_type(orig_type) << ", size)" << endl << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tMap" << endl; } else if (ttype->is_set()) { t_set* t = (t_set*)ttype; out << indent() << "_, size, err := iprot.ReadSetBegin()" << endl << indent() << "if err != nil {" << endl << indent() - << " return fmt.Errorf(\"error reading set begin: %s\", err)" << endl << indent() << "}" + << " return thrift.PrependError(\"error reading set begin: \", err)" << endl << indent() << "}" << endl << indent() << "tSet := make(map[" << type_to_go_key_type(t->get_elem_type()->get_true_type()) << "]bool, size)" << endl << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSet" << endl; } else if (ttype->is_list()) { out << indent() << "_, size, err := iprot.ReadListBegin()" << endl << indent() << "if err != nil {" << endl << indent() - << " return fmt.Errorf(\"error reading list begin: %s\", err)" << endl << indent() << "}" + << " return thrift.PrependError(\"error reading list begin: \", err)" << endl << indent() << "}" << endl << indent() << "tSlice := make(" << type_to_go_type(orig_type) << ", 0, size)" << endl << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSlice" << endl; @@ -2558,15 +2558,15 @@ void t_go_generator::generate_deserialize_container(ofstream& out, // Read container end if (ttype->is_map()) { out << indent() << "if err := iprot.ReadMapEnd(); err != nil {" << endl << indent() - << " return fmt.Errorf(\"error reading map end: %s\", err)" << endl << indent() << "}" + << " return thrift.PrependError(\"error reading map end: \", err)" << endl << indent() << "}" << endl; } else if (ttype->is_set()) { out << indent() << "if err := iprot.ReadSetEnd(); err != nil {" << endl << indent() - << " return fmt.Errorf(\"error reading set end: %s\", err)" << endl << indent() << "}" + << " return thrift.PrependError(\"error reading set end: \", err)" << endl << indent() << "}" << endl; } else if (ttype->is_list()) { out << indent() << "if err := iprot.ReadListEnd(); err != nil {" << endl << indent() - << " return fmt.Errorf(\"error reading list end: %s\", err)" << endl << indent() << "}" + << " return thrift.PrependError(\"error reading list end: \", err)" << endl << indent() << "}" << endl; } } @@ -2697,9 +2697,9 @@ void t_go_generator::generate_serialize_field(ofstream& out, out << "WriteI32(int32(" << name << "))"; } - out << "; err != nil {" << endl << indent() << "return fmt.Errorf(\"%T." + out << "; err != nil {" << endl << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T." << escape_string(tfield->get_name()) << " (" << tfield->get_key() - << ") field write error: %s\", p, err) }" << endl; + << ") field write error: \", p), err) }" << endl; } else { throw "compiler error: Invalid type in generate_serialize_field '" + type->get_name() + "' for field '" + name + "'"; @@ -2715,7 +2715,7 @@ void t_go_generator::generate_serialize_field(ofstream& out, void t_go_generator::generate_serialize_struct(ofstream& out, t_struct* tstruct, string prefix) { (void)tstruct; out << indent() << "if err := " << prefix << ".Write(oprot); err != nil {" << endl << indent() - << " return fmt.Errorf(\"%T error writing struct: %s\", " << prefix << ", err)" << endl + << " return thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", " << prefix << "), err)" << endl << indent() << "}" << endl; } @@ -2731,19 +2731,19 @@ void t_go_generator::generate_serialize_container(ofstream& out, << type_to_enum(((t_map*)ttype)->get_key_type()) << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << "len(" << prefix << ")); err != nil {" << endl << indent() - << " return fmt.Errorf(\"error writing map begin: %s\", err)" << endl << indent() << "}" + << " return thrift.PrependError(\"error writing map begin: \", err)" << endl << indent() << "}" << endl; } else if (ttype->is_set()) { out << indent() << "if err := oprot.WriteSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " << "len(" << prefix << ")); err != nil {" << endl << indent() - << " return fmt.Errorf(\"error writing set begin: %s\", err)" << endl << indent() << "}" + << " return thrift.PrependError(\"error writing set begin: \", err)" << endl << indent() << "}" << endl; } else if (ttype->is_list()) { out << indent() << "if err := oprot.WriteListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << "len(" << prefix << ")); err != nil {" << endl << indent() - << " return fmt.Errorf(\"error writing list begin: %s\", err)" << endl << indent() << "}" + << " return thrift.PrependError(\"error writing list begin: \", err)" << endl << indent() << "}" << endl; } else { throw "compiler error: Invalid type in generate_serialize_container '" + ttype->get_name() @@ -2776,15 +2776,15 @@ void t_go_generator::generate_serialize_container(ofstream& out, if (ttype->is_map()) { out << indent() << "if err := oprot.WriteMapEnd(); err != nil {" << endl << indent() - << " return fmt.Errorf(\"error writing map end: %s\", err)" << endl << indent() << "}" + << " return thrift.PrependError(\"error writing map end: \", err)" << endl << indent() << "}" << endl; } else if (ttype->is_set()) { out << indent() << "if err := oprot.WriteSetEnd(); err != nil {" << endl << indent() - << " return fmt.Errorf(\"error writing set end: %s\", err)" << endl << indent() << "}" + << " return thrift.PrependError(\"error writing set end: \", err)" << endl << indent() << "}" << endl; } else if (ttype->is_list()) { out << indent() << "if err := oprot.WriteListEnd(); err != nil {" << endl << indent() - << " return fmt.Errorf(\"error writing list end: %s\", err)" << endl << indent() << "}" + << " return thrift.PrependError(\"error writing list end: \", err)" << endl << indent() << "}" << endl; } } |