Thrift: Fix a bug with local reflection and namespaces.
authorDavid Reiss <dreiss@apache.org>
Sat, 9 Feb 2008 02:51:43 +0000 (02:51 +0000)
committerDavid Reiss <dreiss@apache.org>
Sat, 9 Feb 2008 02:51:43 +0000 (02:51 +0000)
Summary:
References to "local reflections" in other thrift files were not given
namespace prefixes, give undefined symbol errors.  This change
distinguishes between relfection names being generated for declarations
(not namespaced) and those that could be external references (namespaced).

Reviewed By: mcslee

Test Plan:
Got the following files to build and link correctly with -dense.

==> test1.thrift <==
cpp_namespace ns
enum foo { bar }

==> test2.thrift <==
include "test1.thrift"
enum dummy_enum_workaround { I_AM_A_WORKAROUND }
struct baz {
  1: test1.foo qux
}

Revert Plan: ok

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665472 13f79535-47bb-0310-9956-ffa450edef68

compiler/cpp/src/generate/t_cpp_generator.cc
compiler/cpp/src/generate/t_cpp_generator.h

index 011f5eb..eb4b1dc 100644 (file)
@@ -659,7 +659,7 @@ void t_cpp_generator::generate_local_reflection(std::ofstream& out,
       indent_up();
       for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
         indent(out) << "&" <<
-          local_reflection_name("typespec", (*m_iter)->get_type()) << "," << endl;
+          local_reflection_name("typespec", (*m_iter)->get_type(), true) << "," << endl;
       }
       indent(out) << "&" <<
         local_reflection_name("typespec", g_type_void) << "," << endl;
@@ -2861,7 +2861,7 @@ string t_cpp_generator::type_to_enum(t_type* type) {
 /**
  * Returns the symbol name of the local reflection of a type.
  */
-string t_cpp_generator::local_reflection_name(const char* prefix, t_type* ttype) {
+string t_cpp_generator::local_reflection_name(const char* prefix, t_type* ttype, bool external) {
   ttype = get_true_type(ttype);
 
   // We have to use the program name as part of the identifier because
@@ -2870,6 +2870,7 @@ string t_cpp_generator::local_reflection_name(const char* prefix, t_type* ttype)
   // trlo = Thrift Reflection LOcal.
   string prog;
   string name;
+  string nspace;
 
   // TODO(dreiss): Would it be better to pregenerate the base types
   //               and put them in Thrift.{h,cpp} ?
@@ -2891,7 +2892,13 @@ string t_cpp_generator::local_reflection_name(const char* prefix, t_type* ttype)
     name = ttype->get_ascii_fingerprint();
   }
 
-  return string() + "trlo_" + prefix + "_" + prog + "_" + name;
+  if (external &&
+      ttype->get_program() != NULL &&
+      ttype->get_program() != program_) {
+    nspace = namespace_prefix(ttype->get_program()->get_cpp_namespace());
+  }
+
+  return nspace + "trlo_" + prefix + "_" + prog + "_" + name;
 }
 
 string t_cpp_generator::get_include_prefix(const t_program& program) const {
index bdbaf7d..ac11e3d 100644 (file)
@@ -150,7 +150,7 @@ class t_cpp_generator : public t_oop_generator {
   std::string function_signature(t_function* tfunction, std::string prefix="", bool name_params=true);
   std::string argument_list(t_struct* tstruct, bool name_params=true);
   std::string type_to_enum(t_type* ttype);
-  std::string local_reflection_name(const char*, t_type* ttype);
+  std::string local_reflection_name(const char*, t_type* ttype, bool external=false);
 
   // These handles checking gen_dense_ and checking for duplicates.
   void generate_local_reflection(std::ofstream& out, t_type* ttype, bool is_definition);