summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorJens Geyer <jensg@apache.org>2014-11-30 15:07:18 +0100
committerJens Geyer <jensg@apache.org>2014-11-30 15:24:08 +0100
commit527b6d9c86a7e5cde14cbb09a0e3103be0791c3a (patch)
tree0494794c37a050af5ecc001c5efb61e8d5ef8c3b /compiler
parent200150d330b0f2ad986ff4993f1c45c64e4736a3 (diff)
downloadthrift-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.cc56
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;
}
}