From df0991b7ded0533554d3665e782273b6c8736376 Mon Sep 17 00:00:00 2001
From: Xun Liu <xun@pinterest.com>
Date: Wed, 14 Sep 2016 10:33:06 -0700
Subject: [PATCH] serialize fully qualified struct & enum name in schema binary

---
 src/idl_parser.cpp      |   9 ++++++---
 tests/monster_test.bfbs | Bin 3152 -> 3384 bytes
 tests/test.cpp          |  10 +++++++++-
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp
index d845b837..6a5808db 100644
--- a/src/idl_parser.cpp
+++ b/src/idl_parser.cpp
@@ -1977,7 +1977,8 @@ std::set<std::string> Parser::GetIncludedFilesRecursive(
 // Schema serialization functionality:
 
 template<typename T> bool compareName(const T* a, const T* b) {
-    return a->name < b->name;
+    return a->defined_namespace->GetFullyQualifiedName(a->name)
+        < b->defined_namespace->GetFullyQualifiedName(b->name);
 }
 
 template<typename T> void AssignIndices(const std::vector<T *> &defvec) {
@@ -2023,8 +2024,9 @@ Offset<reflection::Object> StructDef::Serialize(FlatBufferBuilder *builder,
       (*it)->Serialize(builder,
                        static_cast<uint16_t>(it - fields.vec.begin()), parser));
   }
+  auto qualified_name = defined_namespace->GetFullyQualifiedName(name);
   return reflection::CreateObject(*builder,
-                                  builder->CreateString(name),
+                                  builder->CreateString(qualified_name),
                                   builder->CreateVectorOfSortedTables(
                                     &field_offsets),
                                   fixed,
@@ -2061,8 +2063,9 @@ Offset<reflection::Enum> EnumDef::Serialize(FlatBufferBuilder *builder,
   for (auto it = vals.vec.begin(); it != vals.vec.end(); ++it) {
     enumval_offsets.push_back((*it)->Serialize(builder));
   }
+  auto qualified_name = defined_namespace->GetFullyQualifiedName(name);
   return reflection::CreateEnum(*builder,
-                                builder->CreateString(name),
+                                builder->CreateString(qualified_name),
                                 builder->CreateVector(enumval_offsets),
                                 is_union,
                                 underlying_type.Serialize(builder),
diff --git a/tests/monster_test.bfbs b/tests/monster_test.bfbs
index e131ac8c2ee97914bfc1c02ce683ac4f5ecb43d6..0369f896935ecf0822e50268c42f9fa4dfb9da87 100644
GIT binary patch
literal 3384
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

literal 3152
zcmaJ@PiS0a5T8vp$!`8^(i+<}jS@>KMMTmx1d$wKY+41Af{8J=bd$VwSKhu|cHf4^
zlXxg1QaniT&_fSB6e;4N^b|@dB1NPG3F4^)Pab;c#b|5o^Y@$CZ}(Y(AIzKYd-I$5
zX6Bo3-WwK?=`+*wU>F(6N>WnND+4l!mEb8d3Yr9+1}(LTbb){0Bl0fhTPcww=6<)x
zF8D%Pq#bhV3@3mCB{82pH>Z10Rw@U0W?-8;bzv{AbR>GgxE=u!`)07A`dgTP4O#$E
zzWGNKfx)`Sk5Lq<pV*%|ZXCvBcH?ZW<Sox!$dxL-H?}-m4r-xSg``_!?S&6;UE{n4
z-w{%CP=CRzh4V$~F635x?}K7km<j47NV=hug#V^bpC;jrI)piM<o0^{G>Vu5(%iYZ
z88BIa&y1CRkAONrZ<YNrJ!1^#LE|9W{d7-bZKv%!(BnI#y*X%i+OK<j@moV4kAt?)
zRy{9h_)J~KOgqkBOm*M)yfw@+kg*N~@!8psXF(@GNVA-&mP_vhtA2gWQyY9ws~L^l
za)K9W^P?NK=%ww;8TW7KFXnua%ZSnCgFeOc_afGxK`BIHo`By#K-a+^fEPf6ogl1t
zAs+`Hgn_G=PeHE$egjVY3i=7_Pe4nc3f9+wOM#yT9|iZp?}Cz`9jveZ8AZdWeCA;o
zbPyDx9&*)cZlj#9h1Fv4;TX>3Z=O%4ZwL4z@`mD>Tezk8{3(%3kYU-gjq@3j*Y(_K
z(?)8Fyora+TMc{`JM)$#RZ6Qicor|nMAJ@i@yNqRFQ=y{<$2T3Jb33{wr>SIi;8lw
z&{8axm2%my;gwu^qOr7H0sgRzHSq@;_(HB$s85V9=Y#c=IlRl8{qAk>L%8+MejHzm
z;WrJRmPb+ayu7wAzJ6+~Y5xbqr$&Jvlvnq~*JAiR!*`tr{yBN2iFfhF{b#(#fdlLQ
z68s>l+xZ{IJO7DaG<^Ct_yIY-FW&i2{6)j39)b_Zv3>E*f8uW%zH8)h6!ptd#j{7y
zFP;|<in#lRYkM2GjEppKXkm);N|kT}^IMRE^`o36#Jo>lQtSxUv`d=-$Xm<%xp1YP
z&uep(P4q0(bn+T>dbI|vU$C~kz$?-Akk-BQ<GRQ;a6K}lwprKi{2O;AWb<T!eS`Xk
zUDZiKpIzAH{23j)U(h*fI(_57r{$31S^uui$I(rCaX-2sVPBzrTzgpqK7}Z0pXZ6z
zpz(sqFXlU6%NLk;;dT?poVXk=hZ_|S>o&a;)+(<cFP*SP9OI;p8}w(j(ZeT9M|<`I
z*zZ7RbaB#tF<AG4uw31M$0_yQdLnb4MNaqycG0jG(lf@4k>FQ{y^?F^L%v${f;FGV
zB9AS$Hl7P{)<06Zzl)K)QZ1INMJ*Ez?j+u2u}^$&b|vm_dnXd@>TfHb0luyfOJMQ#
z(RbIcG`SRFP`?clzGLpzKpd>gLPg|T)9;A)yJz(i@WthQQ?>2Eb1mfpwj<eV*zvVy
zTHi3%L#14kd;i#dV6Pp(ocW<m=8AUa!(0fa-$Kgh=Lyhvz|w!_jegl#*8_q-GMk+{
z;PjCg>T=I@eB3@ac{;0SN(pyw4a;rISLURMjqjLVpRadO65N+q@(~dIUG!G*buo(t
z@JSHmw?UUd7eLhSXxvTbJMTRe@0)GCFJEDv)bne_NE|*#(y93rt>-P^+BKH{;#fcH
zX0LY_+~tcAGru2$tgqk~0`?M!z~zc^7Vk~d@A(}(E@K=&H)MCgY4aF}djI#IMmg_@
zt4n5zIdH?}-sP0J=V;w!_7>g%cN;AS1DYrMdu9DJY&Oq`c6dId1>_J+Ykdja{Nep}
z-*rlD(4U0f6ssZnzXH0~$Ui%SWzF#JNj>I^zECHp_tZLv^+f3yfS0X|o6pRn(;?dZ
ZvtkN#{13eqV_b)o{C-fc>2D+E{{r&+C1U^p

diff --git a/tests/test.cpp b/tests/test.cpp
index 45eb1fe2..2cc04fa0 100644
--- a/tests/test.cpp
+++ b/tests/test.cpp
@@ -433,7 +433,7 @@ void ReflectionTest(uint8_t *flatbuf, size_t length) {
   // Make sure the schema is what we expect it to be.
   auto &schema = *reflection::GetSchema(bfbsfile.c_str());
   auto root_table = schema.root_table();
-  TEST_EQ_STR(root_table->name()->c_str(), "Monster");
+  TEST_EQ_STR(root_table->name()->c_str(), "MyGame.Example.Monster");
   auto fields = root_table->fields();
   auto hp_field_ptr = fields->LookupByKey("hp");
   TEST_NOTNULL(hp_field_ptr);
@@ -446,6 +446,14 @@ void ReflectionTest(uint8_t *flatbuf, size_t length) {
   TEST_NOTNULL(friendly_field_ptr->attributes());
   TEST_NOTNULL(friendly_field_ptr->attributes()->LookupByKey("priority"));
 
+  // Make sure the table index is what we expect it to be.
+  auto pos_field_ptr = fields->LookupByKey("pos");
+  TEST_NOTNULL(pos_field_ptr);
+  TEST_EQ(pos_field_ptr->type()->base_type(), reflection::Obj);
+  auto pos_table_ptr = schema.objects()->Get(pos_field_ptr->type()->index());
+  TEST_NOTNULL(pos_table_ptr);
+  TEST_EQ_STR(pos_table_ptr->name()->c_str(), "MyGame.Example.Vec3");
+
   // Now use it to dynamically access a buffer.
   auto &root = *flatbuffers::GetAnyRoot(flatbuf);
   auto hp = flatbuffers::GetFieldI<uint16_t>(root, hp_field);
-- 
GitLab