summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Geyer <jensg@apache.org>2023-04-20 17:29:53 +0200
committerJens Geyer <Jens-G@users.noreply.github.com>2023-04-20 18:20:52 +0200
commit6945c4e1c71c71846430bd6dcfb102bd4123771a (patch)
treefac62c5c3ed92e913375f6262ac8854e850b546a
parent2891e4a7dc216a548008f4a8fceb1c6e2fe6f84d (diff)
downloadthrift-6945c4e1c71c71846430bd6dcfb102bd4123771a.tar.gz
THRIFT-5703 Haxe 4.30 emits "Local variable retval used without being initialized" on generated code
Client: hx Patch: Jens Geyer
-rw-r--r--compiler/cpp/src/thrift/generate/t_haxe_generator.cc73
1 files changed, 38 insertions, 35 deletions
diff --git a/compiler/cpp/src/thrift/generate/t_haxe_generator.cc b/compiler/cpp/src/thrift/generate/t_haxe_generator.cc
index ee65591b0..166f78e7c 100644
--- a/compiler/cpp/src/thrift/generate/t_haxe_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_haxe_generator.cc
@@ -201,6 +201,7 @@ public:
std::string type_name(t_type* ttype, bool in_container = false, bool in_init = false);
std::string base_type_name(t_base_type* tbase, bool in_container = false);
std::string declare_field(t_field* tfield, bool init = false);
+ std::string render_default_value_for_type(t_type* type, bool allow_null);
std::string function_signature_combined(t_function* tfunction);
std::string function_signature_normal(t_function* tfunction);
std::string argument_list(t_struct* tstruct);
@@ -1878,8 +1879,9 @@ void t_haxe_generator::generate_service_client(t_service* tservice) {
string retval = tmp("retval");
if (!((*f_iter)->is_oneway() || (*f_iter)->get_returntype()->is_void())) {
- f_service_ << indent() << "var " << retval << " : " << type_name((*f_iter)->get_returntype()) << ";"
- << endl;
+ f_service_ << indent() << "var " << retval << " : " << type_name((*f_iter)->get_returntype())
+ << " = " << render_default_value_for_type((*f_iter)->get_returntype(),true)
+ << ";" << endl;
}
if ((*f_iter)->is_oneway()) {
@@ -2736,50 +2738,51 @@ string t_haxe_generator::base_type_name(t_base_type* type, bool in_container) {
* @param ttype The type
*/
string t_haxe_generator::declare_field(t_field* tfield, bool init) {
- // TODO(mcslee): do we ever need to initialize the field?
string result = "var " + tfield->get_name() + " : " + type_name(tfield->get_type());
if (init) {
t_type* ttype = get_true_type(tfield->get_type());
if (ttype->is_base_type() && tfield->get_value() != nullptr) {
result += " = " + render_const_value_str( ttype, tfield->get_value());
- } else if (ttype->is_base_type()) {
- t_base_type::t_base tbase = ((t_base_type*)ttype)->get_base();
- switch (tbase) {
- case t_base_type::TYPE_VOID:
- throw "NO T_VOID CONSTRUCT";
- case t_base_type::TYPE_STRING:
- result += " = null";
- break;
- case t_base_type::TYPE_UUID:
- result += " = uuid.Uuid.NIL";
- break;
- case t_base_type::TYPE_BOOL:
- result += " = false";
- break;
- case t_base_type::TYPE_I8:
- case t_base_type::TYPE_I16:
- case t_base_type::TYPE_I32:
- case t_base_type::TYPE_I64:
- result += " = 0";
- break;
- case t_base_type::TYPE_DOUBLE:
- result += " = (double)0";
- break;
- default:
- throw "unhandled type";
- }
-
- } else if (ttype->is_enum()) {
- result += " = 0";
- } else if (ttype->is_container()) {
- result += " = new " + type_name(ttype, false, true) + "()";
} else {
- result += " = new " + type_name(ttype, false, true) + "()";
+ result += " = " + render_default_value_for_type( ttype, false);
}
}
return result + ";";
}
+string t_haxe_generator::render_default_value_for_type( t_type* type, bool allow_null) {
+ t_type* ttype = get_true_type(type);
+
+ if (ttype->is_base_type()) {
+ t_base_type::t_base tbase = ((t_base_type*)ttype)->get_base();
+ switch (tbase) {
+ case t_base_type::TYPE_VOID:
+ throw "NO T_VOID CONSTRUCT";
+ case t_base_type::TYPE_STRING:
+ return "null";
+ case t_base_type::TYPE_UUID:
+ return "uuid.Uuid.NIL";
+ case t_base_type::TYPE_BOOL:
+ return "false";
+ case t_base_type::TYPE_I8:
+ case t_base_type::TYPE_I16:
+ case t_base_type::TYPE_I32:
+ case t_base_type::TYPE_I64:
+ return "0";
+ case t_base_type::TYPE_DOUBLE:
+ return "0.0";
+ default:
+ throw "unhandled type";
+ }
+ } else if (ttype->is_enum()) {
+ return "0";
+ } else if (ttype->is_container()) {
+ return allow_null ? "null" : "new " + type_name(ttype, false, true) + "()";
+ } else {
+ return allow_null ? "null" : "new " + type_name(ttype, false, true) + "()";
+ }
+}
+
/**
* Renders a function signature of the form 'type name(args)'
*