From 216e7d6a9a7d061cdfd91b56db4ec2985cb4096e Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Tue, 21 Nov 2006 00:44:23 +0000 Subject: [PATCH] Fix thrift compiler typedef support Summary: Typedefed containers were wonk'd Reviewed By: martin git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664877 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_cpp_generator.cc | 28 +++++++----- compiler/cpp/src/generate/t_cpp_generator.h | 2 +- compiler/cpp/src/generate/t_java_generator.cc | 8 ++-- compiler/cpp/src/generate/t_php_generator.cc | 44 ++++++++++--------- compiler/cpp/src/generate/t_py_generator.cc | 8 ++-- 5 files changed, 49 insertions(+), 41 deletions(-) diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc index 01345c75..78278a27 100644 --- a/compiler/cpp/src/generate/t_cpp_generator.cc +++ b/compiler/cpp/src/generate/t_cpp_generator.cc @@ -102,7 +102,7 @@ void t_cpp_generator::close_generator() { */ void t_cpp_generator::generate_typedef(t_typedef* ttypedef) { f_types_ << - indent() << "typedef " << type_name(ttypedef->get_type()) << " " << ttypedef->get_symbolic() << ";" << endl << + indent() << "typedef " << type_name(ttypedef->get_type(), true) << " " << ttypedef->get_symbolic() << ";" << endl << endl; } @@ -1277,9 +1277,9 @@ void t_cpp_generator::generate_deserialize_field(ofstream& out, string name = prefix + tfield->get_name(); if (type->is_struct() || type->is_xception()) { - generate_deserialize_struct(out, (t_struct*)(tfield->get_type()), name); + generate_deserialize_struct(out, (t_struct*)type, name); } else if (type->is_container()) { - generate_deserialize_container(out, tfield->get_type(), name); + generate_deserialize_container(out, type, name); } else if (type->is_base_type() || type->is_enum()) { indent(out) << "xfer += iprot->"; @@ -1478,11 +1478,11 @@ void t_cpp_generator::generate_serialize_field(ofstream& out, if (type->is_struct() || type->is_xception()) { generate_serialize_struct(out, - (t_struct*)(tfield->get_type()), + (t_struct*)type, prefix + tfield->get_name()); } else if (type->is_container()) { generate_serialize_container(out, - tfield->get_type(), + type, prefix + tfield->get_name()); } else if (type->is_base_type() || type->is_enum()) { @@ -1704,7 +1704,7 @@ string t_cpp_generator::namespace_close(string ns) { * @param ttype The type * @return String of the type name, i.e. std::set */ -string t_cpp_generator::type_name(t_type* ttype) { +string t_cpp_generator::type_name(t_type* ttype, bool in_typedef) { if (ttype->is_base_type()) { return base_type_name(((t_base_type*)ttype)->get_base()); } @@ -1720,27 +1720,33 @@ string t_cpp_generator::type_name(t_type* ttype) { if (ttype->is_map()) { t_map* tmap = (t_map*) ttype; return "std::map<" + - type_name(tmap->get_key_type()) + ", " + - type_name(tmap->get_val_type()) + "> "; + type_name(tmap->get_key_type(), in_typedef) + ", " + + type_name(tmap->get_val_type(), in_typedef) + "> "; } if (ttype->is_set()) { t_set* tset = (t_set*) ttype; - return "std::set<" + type_name(tset->get_elem_type()) + "> "; + return "std::set<" + type_name(tset->get_elem_type(), in_typedef) + "> "; } if (ttype->is_list()) { t_list* tlist = (t_list*) ttype; - return "std::vector<" + type_name(tlist->get_elem_type()) + "> "; + return "std::vector<" + type_name(tlist->get_elem_type(), in_typedef) + "> "; + } + + string class_prefix; + if (in_typedef && (ttype->is_struct() || ttype->is_xception())) { + class_prefix = "class "; } // Check if it needs to be namespaced t_program* program = ttype->get_program(); if (program != NULL && program != program_) { return + class_prefix + namespace_prefix(program->get_cpp_namespace()) + ttype->get_name(); } - return ttype->get_name(); + return class_prefix + ttype->get_name(); } /** diff --git a/compiler/cpp/src/generate/t_cpp_generator.h b/compiler/cpp/src/generate/t_cpp_generator.h index 45cbdac5..6070e37e 100644 --- a/compiler/cpp/src/generate/t_cpp_generator.h +++ b/compiler/cpp/src/generate/t_cpp_generator.h @@ -114,7 +114,7 @@ class t_cpp_generator : public t_oop_generator { std::string namespace_prefix(std::string ns); std::string namespace_open(std::string ns); std::string namespace_close(std::string ns); - std::string type_name(t_type* ttype); + std::string type_name(t_type* ttype, bool in_typedef=false); std::string base_type_name(t_base_type::t_base tbase); std::string declare_field(t_field* tfield, bool init=false); std::string function_signature(t_function* tfunction, std::string prefix=""); diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc index f61db382..21ade437 100644 --- a/compiler/cpp/src/generate/t_java_generator.cc +++ b/compiler/cpp/src/generate/t_java_generator.cc @@ -923,10 +923,10 @@ void t_java_generator::generate_deserialize_field(ofstream& out, if (type->is_struct() || type->is_xception()) { generate_deserialize_struct(out, - (t_struct*)(tfield->get_type()), + (t_struct*)type, name); } else if (type->is_container()) { - generate_deserialize_container(out, tfield->get_type(), name); + generate_deserialize_container(out, type, name); } else if (type->is_base_type() || type->is_enum()) { indent(out) << @@ -1130,11 +1130,11 @@ void t_java_generator::generate_serialize_field(ofstream& out, if (type->is_struct() || type->is_xception()) { generate_serialize_struct(out, - (t_struct*)(tfield->get_type()), + (t_struct*)type, prefix + tfield->get_name()); } else if (type->is_container()) { generate_serialize_container(out, - tfield->get_type(), + type, prefix + tfield->get_name()); } else if (type->is_base_type() || type->is_enum()) { diff --git a/compiler/cpp/src/generate/t_php_generator.cc b/compiler/cpp/src/generate/t_php_generator.cc index 4e01edf1..dd848e73 100644 --- a/compiler/cpp/src/generate/t_php_generator.cc +++ b/compiler/cpp/src/generate/t_php_generator.cc @@ -158,26 +158,28 @@ void t_php_generator::generate_php_struct_definition(ofstream& out, out << endl; - out << - indent() << "public function __construct($vals=null) {" << endl; - indent_up(); - out << - indent() << "if (is_array($vals)) {" << endl; - indent_up(); - for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + // Generate constructor from array + if (members.size() > 0) { + out << + indent() << "public function __construct($vals=null) {" << endl; + indent_up(); + out << + indent() << "if (is_array($vals)) {" << endl; + indent_up(); + for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { + out << + indent() << "if (isset($vals['" << (*m_iter)->get_name() << "'])) {" << endl << + indent() << " $this->" << (*m_iter)->get_name() << " = $vals['" << (*m_iter)->get_name() << "'];" << endl << + indent() << "}" << endl; + } + indent_down(); out << - indent() << "if (isset($vals['" << (*m_iter)->get_name() << "'])) {" << endl << - indent() << " $this->" << (*m_iter)->get_name() << " = $vals['" << (*m_iter)->get_name() << "'];" << endl << indent() << "}" << endl; + indent_down(); + out << + indent() << "}" << endl << + endl; } - indent_down(); - out << - indent() << "}" << endl; - - indent_down(); - out << - indent() << "}" << endl << - endl; generate_php_struct_reader(out, tstruct); generate_php_struct_writer(out, tstruct); @@ -947,10 +949,10 @@ void t_php_generator::generate_deserialize_field(ofstream &out, if (type->is_struct() || type->is_xception()) { generate_deserialize_struct(out, - (t_struct*)(tfield->get_type()), + (t_struct*)type, name); } else if (type->is_container()) { - generate_deserialize_container(out, tfield->get_type(), name); + generate_deserialize_container(out, type, name); } else if (type->is_base_type() || type->is_enum()) { if (binary_inline_) { @@ -1254,11 +1256,11 @@ void t_php_generator::generate_serialize_field(ofstream &out, if (type->is_struct() || type->is_xception()) { generate_serialize_struct(out, - (t_struct*)(tfield->get_type()), + (t_struct*)type, prefix + tfield->get_name()); } else if (type->is_container()) { generate_serialize_container(out, - tfield->get_type(), + type, prefix + tfield->get_name()); } else if (type->is_base_type() || type->is_enum()) { diff --git a/compiler/cpp/src/generate/t_py_generator.cc b/compiler/cpp/src/generate/t_py_generator.cc index c753b7bf..1cbcfd94 100644 --- a/compiler/cpp/src/generate/t_py_generator.cc +++ b/compiler/cpp/src/generate/t_py_generator.cc @@ -896,10 +896,10 @@ void t_py_generator::generate_deserialize_field(ofstream &out, if (type->is_struct() || type->is_xception()) { generate_deserialize_struct(out, - (t_struct*)(tfield->get_type()), + (t_struct*)type, name); } else if (type->is_container()) { - generate_deserialize_container(out, tfield->get_type(), name); + generate_deserialize_container(out, type, name); } else if (type->is_base_type() || type->is_enum()) { indent(out) << name << " = iprot."; @@ -1088,11 +1088,11 @@ void t_py_generator::generate_serialize_field(ofstream &out, if (type->is_struct() || type->is_xception()) { generate_serialize_struct(out, - (t_struct*)(tfield->get_type()), + (t_struct*)type, prefix + tfield->get_name()); } else if (type->is_container()) { generate_serialize_container(out, - tfield->get_type(), + type, prefix + tfield->get_name()); } else if (type->is_base_type() || type->is_enum()) { -- 2.17.1