aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWouter van Oortmerssen <wvo@google.com>2016-06-17 18:16:11 -0700
committerWouter van Oortmerssen <wvo@google.com>2016-06-20 11:47:04 -0700
commit3639032d1e2224663202f79ca33c5039eed95f29 (patch)
tree1a22e00b573a8fd9003bd9f8f4a7a42ac43f60ba
parent6e177bf03f027880abfca69ebfda8e4d8b1d2da7 (diff)
downloadflatbuffers-3639032d1e2224663202f79ca33c5039eed95f29.tar.gz
Allow unions of table types with the same name but from different namespaces.
Also fixed most codegenerators using the wrong namespace when multiple namespace were used in a file, with some files not being generated. Change-Id: Ib42969221239d7244e431cbd667ef69200fc415f Tested: on Linux. Bug: 29338474
-rw-r--r--include/flatbuffers/code_generators.h23
-rw-r--r--src/idl_gen_general.cpp36
-rw-r--r--src/idl_gen_go.cpp5
-rw-r--r--src/idl_gen_php.cpp7
-rw-r--r--src/idl_gen_python.cpp5
-rw-r--r--src/idl_parser.cpp8
-rw-r--r--tests/MyGame/Example/Any.cs1
-rw-r--r--tests/MyGame/Example/Any.go1
-rw-r--r--tests/MyGame/Example/Any.java3
-rw-r--r--tests/MyGame/Example/Any.php2
-rw-r--r--tests/MyGame/Example/Any.py1
-rw-r--r--tests/MyGame/Example2/Monster.cs23
-rw-r--r--tests/MyGame/Example2/Monster.go18
-rw-r--r--tests/MyGame/Example2/Monster.java23
-rw-r--r--tests/MyGame/Example2/Monster.php79
-rw-r--r--tests/MyGame/Example2/Monster.py15
-rw-r--r--tests/monster_test.bfbsbin3008 -> 3152 bytes
-rwxr-xr-xtests/monster_test.fbs6
-rw-r--r--tests/monster_test_generated.h43
-rw-r--r--tests/monster_test_generated.js59
-rw-r--r--tests/namespace_test/NamespaceC/TableInC.cs38
-rw-r--r--tests/namespace_test/NamespaceC/TableInC.go46
-rw-r--r--tests/namespace_test/NamespaceC/TableInC.java38
-rw-r--r--tests/namespace_test/NamespaceC/TableInC.php100
-rw-r--r--tests/namespace_test/NamespaceC/TableInC.py39
25 files changed, 584 insertions, 35 deletions
diff --git a/include/flatbuffers/code_generators.h b/include/flatbuffers/code_generators.h
index 95fa0c1a..dc5f6bdd 100644
--- a/include/flatbuffers/code_generators.h
+++ b/include/flatbuffers/code_generators.h
@@ -24,11 +24,12 @@ class BaseGenerator {
virtual bool generate() = 0;
static const std::string NamespaceDir(const Parser &parser,
- const std::string &path) {
+ const std::string &path,
+ const Namespace &ns) {
EnsureDirExists(path.c_str());
if (parser.opts.one_file) return path;
std::string namespace_dir = path; // Either empty or ends in separator.
- auto &namespaces = parser.namespaces_.back()->components;
+ auto &namespaces = ns.components;
for (auto it = namespaces.begin(); it != namespaces.end(); ++it) {
namespace_dir += *it + kPathSeparator;
EnsureDirExists(namespace_dir.c_str());
@@ -41,14 +42,17 @@ class BaseGenerator {
const std::string &file_name)
: parser_(parser),
path_(path),
- file_name_(file_name),
- namespace_dir_(BaseGenerator::NamespaceDir(parser, path)){};
- virtual ~BaseGenerator(){};
+ file_name_(file_name) {};
+ virtual ~BaseGenerator() {};
// No copy/assign.
BaseGenerator &operator=(const BaseGenerator &);
BaseGenerator(const BaseGenerator &);
+ const std::string NamespaceDir(const Namespace &ns) {
+ return BaseGenerator::NamespaceDir(parser_, path_, ns);
+ }
+
const char *FlatBuffersGeneratedWarning() {
return "automatically generated by the FlatBuffers compiler,"
" do not modify\n\n";
@@ -66,9 +70,9 @@ class BaseGenerator {
return true;
}
- std::string FullNamespace(const char *separator) {
+ std::string FullNamespace(const char *separator, const Namespace &ns) {
std::string namespace_name;
- auto &namespaces = parser_.namespaces_.back()->components;
+ auto &namespaces = ns.components;
for (auto it = namespaces.begin(); it != namespaces.end(); ++it) {
if (namespace_name.length()) namespace_name += separator;
namespace_name += *it;
@@ -76,15 +80,14 @@ class BaseGenerator {
return namespace_name;
}
- const std::string LastNamespacePart() {
- auto &namespaces = parser_.namespaces_.back()->components;
+ const std::string LastNamespacePart(const Namespace &ns) {
+ auto &namespaces = ns.components;
if (namespaces.size()) return *(namespaces.end() - 1); else return std::string("");
}
const Parser &parser_;
const std::string &path_;
const std::string &file_name_;
- const std::string namespace_dir_;
};
} // namespace flatbuffers
diff --git a/src/idl_gen_general.cpp b/src/idl_gen_general.cpp
index a0b837a2..36dbd64b 100644
--- a/src/idl_gen_general.cpp
+++ b/src/idl_gen_general.cpp
@@ -1129,27 +1129,32 @@ class GeneralGenerator : public BaseGenerator {
for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end();
++it) {
std::string enumcode;
- GenEnum(lang, parser_, **it, &enumcode);
+ auto &enum_def = **it;
+ GenEnum(lang, parser_, enum_def, &enumcode);
if (parser_.opts.one_file) {
one_file_code += enumcode;
} else {
- if (!SaveType(lang, (**it).name, enumcode, false)) return false;
+ if (!SaveType(lang, enum_def.name, *enum_def.defined_namespace,
+ enumcode, false)) return false;
}
}
for (auto it = parser_.structs_.vec.begin();
it != parser_.structs_.vec.end(); ++it) {
std::string declcode;
- GenStruct(lang, parser_, **it, &declcode);
+ auto &struct_def = **it;
+ GenStruct(lang, parser_, struct_def, &declcode);
if (parser_.opts.one_file) {
one_file_code += declcode;
} else {
- if (!SaveType(lang, (**it).name, declcode, true)) return false;
+ if (!SaveType(lang, struct_def.name, *struct_def.defined_namespace,
+ declcode, true)) return false;
}
}
if (parser_.opts.one_file) {
- return SaveType(lang, file_name_, one_file_code, true);
+ return SaveType(lang, file_name_, *parser_.namespaces_.back(),
+ one_file_code, true);
}
return true;
}
@@ -1157,12 +1162,13 @@ class GeneralGenerator : public BaseGenerator {
// Save out the generated code for a single class while adding
// declaration boilerplate.
bool SaveType(const LanguageParameters &lang, const std::string &defname,
- const std::string &classcode, bool needs_includes) {
+ const Namespace &ns, const std::string &classcode,
+ bool needs_includes) {
if (!classcode.length()) return true;
std::string code;
code = code + "// " + FlatBuffersGeneratedWarning();
- std::string namespace_name = FullNamespace(".");
+ std::string namespace_name = FullNamespace(".", ns);
if (!namespace_name.empty()) {
code += lang.namespace_ident + namespace_name + lang.namespace_begin;
code += "\n\n";
@@ -1170,7 +1176,7 @@ class GeneralGenerator : public BaseGenerator {
if (needs_includes) code += lang.includes;
code += classcode;
if (!namespace_name.empty()) code += lang.namespace_end;
- auto filename = namespace_dir_ + defname + lang.file_extension;
+ auto filename = NamespaceDir(ns) + defname + lang.file_extension;
return SaveFile(filename.c_str(), code, false);
}
};
@@ -1188,19 +1194,25 @@ std::string GeneralMakeRule(const Parser &parser, const std::string &path,
auto lang = language_parameters[parser.opts.lang];
std::string make_rule;
- std::string directory =
- BaseGenerator::NamespaceDir(parser, path) + kPathSeparator;
for (auto it = parser.enums_.vec.begin(); it != parser.enums_.vec.end();
++it) {
+ auto &enum_def = **it;
if (make_rule != "") make_rule += " ";
- make_rule += directory + (**it).name + lang.file_extension;
+ std::string directory =
+ BaseGenerator::NamespaceDir(parser, path, *enum_def.defined_namespace) +
+ kPathSeparator;
+ make_rule += directory + enum_def.name + lang.file_extension;
}
for (auto it = parser.structs_.vec.begin(); it != parser.structs_.vec.end();
++it) {
+ auto &struct_def = **it;
if (make_rule != "") make_rule += " ";
- make_rule += directory + (**it).name + lang.file_extension;
+ std::string directory =
+ BaseGenerator::NamespaceDir(parser, path, *struct_def.defined_namespace) +
+ kPathSeparator;
+ make_rule += directory + struct_def.name + lang.file_extension;
}
make_rule += ": ";
diff --git a/src/idl_gen_go.cpp b/src/idl_gen_go.cpp
index 5841e121..5c60c105 100644
--- a/src/idl_gen_go.cpp
+++ b/src/idl_gen_go.cpp
@@ -664,9 +664,10 @@ class GoGenerator : public BaseGenerator {
if (!classcode.length()) return true;
std::string code = "";
- BeginFile(LastNamespacePart(), needs_imports, &code);
+ BeginFile(LastNamespacePart(*def.defined_namespace), needs_imports, &code);
code += classcode;
- std::string filename = namespace_dir_ + def.name + ".go";
+ std::string filename =
+ NamespaceDir(*def.defined_namespace) + def.name + ".go";
return SaveFile(filename.c_str(), code, false);
}
};
diff --git a/src/idl_gen_php.cpp b/src/idl_gen_php.cpp
index 599d5571..68ddc817 100644
--- a/src/idl_gen_php.cpp
+++ b/src/idl_gen_php.cpp
@@ -985,11 +985,12 @@ namespace php {
if (!classcode.length()) return true;
std::string code = "";
- BeginFile(FullNamespace("\\"), needs_imports, &code);
+ BeginFile(FullNamespace("\\", *def.defined_namespace),
+ needs_imports, &code);
code += classcode;
- std::string filename =
- namespace_dir_ + kPathSeparator + def.name + ".php";
+ std::string filename = NamespaceDir(*def.defined_namespace) +
+ kPathSeparator + def.name + ".php";
return SaveFile(filename.c_str(), code, false);
}
};
diff --git a/src/idl_gen_python.cpp b/src/idl_gen_python.cpp
index 7b8d168c..5f5c6be3 100644
--- a/src/idl_gen_python.cpp
+++ b/src/idl_gen_python.cpp
@@ -652,9 +652,10 @@ class PythonGenerator : public BaseGenerator {
}
std::string code = "";
- BeginFile(LastNamespacePart(), needs_imports, &code);
+ BeginFile(LastNamespacePart(*def.defined_namespace), needs_imports, &code);
code += classcode;
- std::string filename = namespace_dir_ + kPathSeparator + def.name + ".py";
+ std::string filename = NamespaceDir(*def.defined_namespace) +
+ kPathSeparator + def.name + ".py";
return SaveFile(filename.c_str(), code, false);
}
};
diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp
index 66e794b3..518283de 100644
--- a/src/idl_parser.cpp
+++ b/src/idl_parser.cpp
@@ -1180,7 +1180,13 @@ CheckedError Parser::ParseEnum(bool is_union, EnumDef **dest) {
auto full_name = value_name;
std::vector<std::string> value_comment = doc_comment_;
EXPECT(kTokenIdentifier);
- if (is_union) ECHECK(ParseNamespacing(&full_name, &value_name));
+ if (is_union) {
+ ECHECK(ParseNamespacing(&full_name, &value_name));
+ // Since we can't namespace the actual enum identifiers, turn
+ // namespace parts into part of the identifier.
+ value_name = full_name;
+ std::replace(value_name.begin(), value_name.end(), '.', '_');
+ }
auto prevsize = enum_def.vals.vec.size();
auto value = enum_def.vals.vec.size()
? enum_def.vals.vec.back()->value + 1
diff --git a/tests/MyGame/Example/Any.cs b/tests/MyGame/Example/Any.cs
index 1f018ad8..8fdc2fca 100644
--- a/tests/MyGame/Example/Any.cs
+++ b/tests/MyGame/Example/Any.cs
@@ -8,6 +8,7 @@ public enum Any : byte
NONE = 0,
Monster = 1,
TestSimpleTableWithEnum = 2,
+ MyGame_Example2_Monster = 3,
};
diff --git a/tests/MyGame/Example/Any.go b/tests/MyGame/Example/Any.go
index 0322364c..df9f823f 100644
--- a/tests/MyGame/Example/Any.go
+++ b/tests/MyGame/Example/Any.go
@@ -6,4 +6,5 @@ const (
AnyNONE = 0
AnyMonster = 1
AnyTestSimpleTableWithEnum = 2
+ AnyMyGame_Example2_Monster = 3
)
diff --git a/tests/MyGame/Example/Any.java b/tests/MyGame/Example/Any.java
index 27dc1bcb..25d74af5 100644
--- a/tests/MyGame/Example/Any.java
+++ b/tests/MyGame/Example/Any.java
@@ -7,8 +7,9 @@ public final class Any {
public static final byte NONE = 0;
public static final byte Monster = 1;
public static final byte TestSimpleTableWithEnum = 2;
+ public static final byte MyGame_Example2_Monster = 3;
- private static final String[] names = { "NONE", "Monster", "TestSimpleTableWithEnum", };
+ private static final String[] names = { "NONE", "Monster", "TestSimpleTableWithEnum", "MyGame_Example2_Monster", };
public static String name(int e) { return names[e]; }
};
diff --git a/tests/MyGame/Example/Any.php b/tests/MyGame/Example/Any.php
index f04f4ad3..da691760 100644
--- a/tests/MyGame/Example/Any.php
+++ b/tests/MyGame/Example/Any.php
@@ -8,11 +8,13 @@ class Any
const NONE = 0;
const Monster = 1;
const TestSimpleTableWithEnum = 2;
+ const MyGame_Example2_Monster = 3;
private static $names = array(
"NONE",
"Monster",
"TestSimpleTableWithEnum",
+ "MyGame_Example2_Monster",
);
public static function Name($e)
diff --git a/tests/MyGame/Example/Any.py b/tests/MyGame/Example/Any.py
index b642ede0..f1b8d519 100644
--- a/tests/MyGame/Example/Any.py
+++ b/tests/MyGame/Example/Any.py
@@ -6,4 +6,5 @@ class Any(object):
NONE = 0
Monster = 1
TestSimpleTableWithEnum = 2
+ MyGame_Example2_Monster = 3
diff --git a/tests/MyGame/Example2/Monster.cs b/tests/MyGame/Example2/Monster.cs
new file mode 100644
index 00000000..e6c512ab
--- /dev/null
+++ b/tests/MyGame/Example2/Monster.cs
@@ -0,0 +1,23 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+namespace MyGame.Example2
+{
+
+using System;
+using FlatBuffers;
+
+public sealed class Monster : Table {
+ public static Monster GetRootAsMonster(ByteBuffer _bb) { return GetRootAsMonster(_bb, new Monster()); }
+ public static Monster GetRootAsMonster(ByteBuffer _bb, Monster obj) { return (obj.__init(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
+ public Monster __init(int _i, ByteBuffer _bb) { bb_pos = _i; bb = _bb; return this; }
+
+
+ public static void StartMonster(FlatBufferBuilder builder) { builder.StartObject(0); }
+ public static Offset<MyGame.Example2.Monster> EndMonster(FlatBufferBuilder builder) {
+ int o = builder.EndObject();
+ return new Offset<MyGame.Example2.Monster>(o);
+ }
+};
+
+
+}
diff --git a/tests/MyGame/Example2/Monster.go b/tests/MyGame/Example2/Monster.go
new file mode 100644
index 00000000..e12b0545
--- /dev/null
+++ b/tests/MyGame/Example2/Monster.go
@@ -0,0 +1,18 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package Example2
+
+import (
+ flatbuffers "github.com/google/flatbuffers/go"
+)
+type Monster struct {
+ _tab flatbuffers.Table
+}
+
+func (rcv *Monster) Init(buf []byte, i flatbuffers.UOffsetT) {
+ rcv._tab.Bytes = buf
+ rcv._tab.Pos = i
+}
+
+func MonsterStart(builder *flatbuffers.Builder) { builder.StartObject(0) }
+func MonsterEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { return builder.EndObject() }
diff --git a/tests/MyGame/Example2/Monster.java b/tests/MyGame/Example2/Monster.java
new file mode 100644
index 00000000..6432494f
--- /dev/null
+++ b/tests/MyGame/Example2/Monster.java
@@ -0,0 +1,23 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package MyGame.Example2;
+
+import java.nio.*;
+import java.lang.*;
+import java.util.*;
+import com.google.flatbuffers.*;
+
+@SuppressWarnings("unused")
+public final class Monster extends Table {
+ public static Monster getRootAsMonster(ByteBuffer _bb) { return getRootAsMonster(_bb, new Monster()); }
+ public static Monster getRootAsMonster(ByteBuffer _bb, Monster obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__init(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
+ public Monster __init(int _i, ByteBuffer _bb) { bb_pos = _i; bb = _bb; return this; }
+
+
+ public static void startMonster(FlatBufferBuilder builder) { builder.startObject(0); }
+ public static int endMonster(FlatBufferBuilder builder) {
+ int o = builder.endObject();
+ return o;
+ }
+};
+
diff --git a/tests/MyGame/Example2/Monster.php b/tests/MyGame/Example2/Monster.php
new file mode 100644
index 00000000..b00f150e
--- /dev/null
+++ b/tests/MyGame/Example2/Monster.php
@@ -0,0 +1,79 @@
+<?php
+// automatically generated by the FlatBuffers compiler, do not modify
+
+namespace MyGame\Example2;
+
+use \Google\FlatBuffers\Struct;
+use \Google\FlatBuffers\Table;
+use \Google\FlatBuffers\ByteBuffer;
+use \Google\FlatBuffers\FlatBufferBuilder;
+
+class Monster extends Table
+{
+ /**
+ * @param ByteBuffer $bb
+ * @return Monster
+ */
+ public static function getRootAsMonster(ByteBuffer $bb)
+ {
+ $obj = new Monster();
+ return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));
+ }
+
+ public static function MonsterIdentifier()
+ {
+ return "MONS";
+ }
+
+ public static function MonsterBufferHasIdentifier(ByteBuffer $buf)
+ {
+ return self::__has_identifier($buf, self::MonsterIdentifier());
+ }
+
+ public static function MonsterExtension()
+ {
+ return "mon";
+ }
+
+ /**
+ * @param int $_i offset
+ * @param ByteBuffer $_bb
+ * @return Monster
+ **/
+ public function init($_i, ByteBuffer $_bb)
+ {
+ $this->bb_pos = $_i;
+ $this->bb = $_bb;
+ return $this;
+ }
+
+ /**
+ * @param FlatBufferBuilder $builder
+ * @return void
+ */
+ public static function startMonster(FlatBufferBuilder $builder)
+ {
+ $builder->StartObject(0);
+ }
+
+ /**
+ * @param FlatBufferBuilder $builder
+ * @return Monster
+ */
+ public static function createMonster(FlatBufferBuilder $builder, )
+ {
+ $builder->startObject(0);
+ $o = $builder->endObject();
+ return $o;
+ }
+
+ /**
+ * @param FlatBufferBuilder $builder
+ * @return int table offset
+ */
+ public static function endMonster(FlatBufferBuilder $builder)
+ {
+ $o = $builder->endObject();
+ return $o;
+ }
+}
diff --git a/tests/MyGame/Example2/Monster.py b/tests/MyGame/Example2/Monster.py
new file mode 100644
index 00000000..0b98211e
--- /dev/null
+++ b/tests/MyGame/Example2/Monster.py
@@ -0,0 +1,15 @@
+# automatically generated by the FlatBuffers compiler, do not modify
+
+# namespace: Example2
+
+import flatbuffers
+
+class Monster(object):
+ __slots__ = ['_tab']
+
+ # Monster
+ def Init(self, buf, pos):
+ self._tab = flatbuffers.table.Table(buf, pos)
+
+def MonsterStart(builder): builder.StartObject(0)
+def MonsterEnd(builder): return builder.EndObject()
diff --git a/tests/monster_test.bfbs b/tests/monster_test.bfbs
index e16b2bd1..e131ac8c 100644
--- a/tests/monster_test.bfbs
+++ b/tests/monster_test.bfbs
Binary files differ
diff --git a/tests/monster_test.fbs b/tests/monster_test.fbs
index 08e72d4a..7ddaa582 100755
--- a/tests/monster_test.fbs
+++ b/tests/monster_test.fbs
@@ -2,13 +2,17 @@
include "include_test1.fbs";
+namespace MyGame.Example2;
+
+table Monster {} // Test having same name as below, but in different namespace.
+
namespace MyGame.Example;
attribute "priority";
enum Color:byte (bit_flags) { Red = 0, Green, Blue = 3, }
-union Any { Monster, TestSimpleTableWithEnum } // TODO: add more elements
+union Any { Monster, TestSimpleTableWithEnum, MyGame.Example2.Monster }
struct Test { a:short; b:byte; }
diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h
index 60abbdec..50fbc28c 100644
--- a/tests/monster_test_generated.h
+++ b/tests/monster_test_generated.h
@@ -6,6 +6,12 @@
#include "flatbuffers/flatbuffers.h"
namespace MyGame {
+namespace Example2 {
+
+struct Monster;
+
+} // namespace Example2
+
namespace Example {
struct Test;
@@ -37,12 +43,13 @@ enum Any {
Any_NONE = 0,
Any_Monster = 1,
Any_TestSimpleTableWithEnum = 2,
+ Any_MyGame_Example2_Monster = 3,
Any_MIN = Any_NONE,
- Any_MAX = Any_TestSimpleTableWithEnum
+ Any_MAX = Any_MyGame_Example2_Monster
};
inline const char **EnumNamesAny() {
- static const char *names[] = { "NONE", "Monster", "TestSimpleTableWithEnum", nullptr };
+ static const char *names[] = { "NONE", "Monster", "TestSimpleTableWithEnum", "MyGame_Example2_Monster", nullptr };
return names;
}
@@ -98,6 +105,37 @@ MANUALLY_ALIGNED_STRUCT(16) Vec3 FLATBUFFERS_FINAL_CLASS {
};
STRUCT_END(Vec3, 32);
+} // namespace Example
+
+namespace Example2 {
+
+struct Monster FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+ bool Verify(flatbuffers::Verifier &verifier) const {
+ return VerifyTableStart(verifier) &&
+ verifier.EndTable();
+ }
+};
+
+struct MonsterBuilder {
+ flatbuffers::FlatBufferBuilder &fbb_;
+ flatbuffers::uoffset_t start_;
+ MonsterBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
+ MonsterBuilder &operator=(const MonsterBuilder &);
+ flatbuffers::Offset<Monster> Finish() {
+ auto o = flatbuffers::Offset<Monster>(fbb_.EndTable(start_, 0));
+ return o;
+ }
+};
+
+inline flatbuffers::Offset<Monster> CreateMonster(flatbuffers::FlatBufferBuilder &_fbb) {
+ MonsterBuilder builder_(_fbb);
+ return builder_.Finish();
+}
+
+} // namespace Example2
+
+namespace Example {
+
struct TestSimpleTableWithEnum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
enum {
VT_COLOR = 4
@@ -424,6 +462,7 @@ inline bool VerifyAny(flatbuffers::Verifier &verifier, const void *union_obj, An
case Any_NONE: return true;
case Any_Monster: return verifier.VerifyTable(reinterpret_cast<const Monster *>(union_obj));
case Any_TestSimpleTableWithEnum: return verifier.VerifyTable(reinterpret_cast<const TestSimpleTableWithEnum *>(union_obj));
+ case Any_MyGame_Example2_Monster: return verifier.VerifyTable(reinterpret_cast<const MyGame::Example2::Monster *>(union_obj));
default: return false;
}
}
diff --git a/tests/monster_test_generated.js b/tests/monster_test_generated.js
index f967b9d8..f67e8480 100644
--- a/tests/monster_test_generated.js
+++ b/tests/monster_test_generated.js
@@ -13,6 +13,11 @@ MyGame.Example = MyGame.Example || {};
/**
* @const
*/
+MyGame.Example2 = MyGame.Example2 || {};
+
+/**
+ * @const
+*/
MyGame.OtherNameSpace = MyGame.OtherNameSpace || {};
/**
@@ -30,7 +35,59 @@ MyGame.Example.Color = {
MyGame.Example.Any = {
NONE: 0,
Monster: 1,
- TestSimpleTableWithEnum: 2
+ TestSimpleTableWithEnum: 2,
+ MyGame_Example2_Monster: 3
+};
+
+/**
+ * @constructor
+ */
+MyGame.Example2.Monster = function() {
+ /**
+ * @type {flatbuffers.ByteBuffer}
+ */
+ this.bb = null;
+
+ /**
+ * @type {number}
+ */
+ this.bb_pos = 0;
+};
+
+/**
+ * @param {number} i
+ * @param {flatbuffers.ByteBuffer} bb
+ * @returns {MyGame.Example2.Monster}
+ */
+MyGame.Example2.Monster.prototype.__init = function(i, bb) {
+ this.bb_pos = i;
+ this.bb = bb;
+ return this;
+};
+
+/**
+ * @param {flatbuffers.ByteBuffer} bb
+ * @param {MyGame.Example2.Monster=} obj
+ * @returns {MyGame.Example2.Monster}
+ */
+MyGame.Example2.Monster.getRootAsMonster = function(bb, obj) {
+ return (obj || new MyGame.Example2.Monster).__init(bb.readInt32(bb.position()) + bb.position(), bb);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ */
+MyGame.Example2.Monster.startMonster = function(builder) {
+ builder.startObject(0);
+};
+
+/**
+ * @param {flatbuffers.Builder} builder
+ * @returns {flatbuffers.Offset}
+ */
+MyGame.Example2.Monster.endMonster = function(builder) {
+ var offset = builder.endObject();
+ return offset;
};
/**
diff --git a/tests/namespace_test/NamespaceC/TableInC.cs b/tests/namespace_test/NamespaceC/TableInC.cs
new file mode 100644
index 00000000..0f75dfec
--- /dev/null
+++ b/tests/namespace_test/NamespaceC/TableInC.cs
@@ -0,0 +1,38 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+namespace NamespaceC
+{
+
+using System;
+using FlatBuffers;
+
+public sealed class TableInC : Table {
+ public static TableInC GetRootAsTableInC(ByteBuffer _bb) { return GetRootAsTableInC(_bb, new TableInC()); }
+ public static TableInC GetRootAsTableInC(ByteBuffer _bb, TableInC obj) { return (obj.__init(_bb.GetInt(_bb.Position) + _bb.Position, _bb)); }
+ public TableInC __init(int _i, ByteBuffer _bb) { bb_pos = _i; bb = _bb; return this; }
+
+ public NamespaceA.TableInFirstNS ReferToA1 { get { return GetReferToA1(new NamespaceA.TableInFirstNS()); } }
+ public NamespaceA.TableInFirstNS GetReferToA1(NamespaceA.TableInFirstNS obj) { int o = __offset(4); return o != 0 ? obj.__init(__indirect(o + bb_pos), bb) : null; }
+ public SecondTableInA ReferToA2 { get { return GetReferToA2(new SecondTableInA()); } }
+ public SecondTableInA GetReferToA2(SecondTableInA obj) { int o = __offset(6); return o != 0 ? obj.__init(__indirect(o + bb_pos), bb) : null; }
+
+ public static Offset<NamespaceC.TableInC> CreateTableInC(FlatBufferBuilder builder,
+ Offset<NamespaceA.TableInFirstNS> refer_to_a1Offset = default(Offset<NamespaceA.TableInFirstNS>),
+ Offset<SecondTableInA> refer_to_a2Offset = default(Offset<SecondTableInA>)) {
+ builder.StartObject(2);
+ TableInC.AddReferToA2(builder, refer_to_a2Offset);
+ TableInC.AddReferToA1(builder, refer_to_a1Offset);
+ return TableInC.EndTableInC(builder);
+ }
+
+ public static void StartTableInC(FlatBufferBuilder builder) { builder.StartObject(2); }
+ public static void AddReferToA1(FlatBufferBuilder builder, Offset<NamespaceA.TableInFirstNS> referToA1Offset) { builder.AddOffset(0, referToA1Offset.Value, 0); }
+ public static void AddReferToA2(FlatBufferBuilder builder, Offset<SecondTableInA> referToA2Offset) { builder.AddOffset(1, referToA2Offset.Value, 0); }
+ public static Offset<NamespaceC.TableInC> EndTableInC(FlatBufferBuilder builder) {
+ int o = builder.EndObject();
+ return new Offset<NamespaceC.TableInC>(o);
+ }
+};
+
+
+}
diff --git a/tests/namespace_test/NamespaceC/TableInC.go b/tests/namespace_test/NamespaceC/TableInC.go
new file mode 100644
index 00000000..dc75c45c
--- /dev/null
+++ b/tests/namespace_test/NamespaceC/TableInC.go
@@ -0,0 +1,46 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package NamespaceC
+
+import (
+ flatbuffers "github.com/google/flatbuffers/go"
+)
+type TableInC struct {
+ _tab flatbuffers.Table
+}
+
+func (rcv *TableInC) Init(buf []byte, i flatbuffers.UOffsetT) {
+ rcv._tab.Bytes = buf
+ rcv._tab.Pos = i
+}
+
+func (rcv *TableInC) ReferToA1(obj *TableInFirstNS) *TableInFirstNS {
+ o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
+ if o != 0 {
+ x := rcv._tab.Indirect(o + rcv._tab.Pos)
+ if obj == nil {
+ obj = new(TableInFirstNS)
+ }
+ obj.Init(rcv._tab.Bytes, x)
+ return obj
+ }
+ return nil
+}
+
+func (rcv *TableInC) ReferToA2(obj *SecondTableInA) *SecondTableInA {
+ o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
+ if o != 0 {
+ x := rcv._tab.Indirect(o + rcv._tab.Pos)
+ if obj == nil {
+ obj = new(SecondTableInA)
+ }
+ obj.Init(rcv._tab.Bytes, x)
+ return obj
+ }
+ return nil
+}
+
+func TableInCStart(builder *flatbuffers.Builder) { builder.StartObject(2) }
+func TableInCAddReferToA1(builder *flatbuffers.Builder, referToA1 flatbuffers.UOffsetT) { builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(referToA1), 0) }
+func TableInCAddReferToA2(builder *flatbuffers.Builder, referToA2 flatbuffers.UOffsetT) { builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(referToA2), 0) }
+func TableInCEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { return builder.EndObject() }
diff --git a/tests/namespace_test/NamespaceC/TableInC.java b/tests/namespace_test/NamespaceC/TableInC.java
new file mode 100644
index 00000000..cf1bca18
--- /dev/null
+++ b/tests/namespace_test/NamespaceC/TableInC.java
@@ -0,0 +1,38 @@
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package NamespaceC;
+
+import java.nio.*;
+import java.lang.*;
+import java.util.*;
+import com.google.flatbuffers.*;
+
+@SuppressWarnings("unused")
+public final class TableInC extends Table {
+ public static TableInC getRootAsTableInC(ByteBuffer _bb) { return getRootAsTableInC(_bb, new TableInC()); }
+ public static TableInC getRootAsTableInC(ByteBuffer _bb, TableInC obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__init(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
+ public TableInC __init(int _i, ByteBuffer _bb) { bb_pos = _i; bb = _bb; return this; }
+
+ public NamespaceA.TableInFirstNS referToA1() { return referToA1(new NamespaceA.TableInFirstNS()); }
+ public NamespaceA.TableInFirstNS referToA1(NamespaceA.TableInFirstNS obj) { int o = __offset(4); return o != 0 ? obj.__init(__indirect(o + bb_pos), bb) : null; }
+ public SecondTableInA referToA2() { return referToA2(new SecondTableInA()); }
+ public SecondTableInA referToA2(SecondTableInA obj) { int o = __offset(6); return o != 0 ? obj.__init(__indirect(o + bb_pos), bb) : null; }
+
+ public static int createTableInC(FlatBufferBuilder builder,
+ int refer_to_a1Offset,
+ int refer_to_a2Offset) {
+ builder.startObject(2);
+ TableInC.addReferToA2(builder, refer_to_a2Offset);
+ TableInC.addReferToA1(builder, refer_to_a1Offset);
+ return TableInC.endTableInC(builder);
+ }
+
+ public static void startTableInC(FlatBufferBuilder builder) { builder.startObject(2); }
+ public static void addReferToA1(FlatBufferBuilder builder, int referToA1Offset) { builder.addOffset(0, referToA1Offset, 0); }
+ public static void addReferToA2(FlatBufferBuilder builder, int referToA2Offset) { builder.addOffset(1, referToA2Offset, 0); }
+ public static int endTableInC(FlatBufferBuilder builder) {
+ int o = builder.endObject();
+ return o;
+ }
+};
+
diff --git a/tests/namespace_test/NamespaceC/TableInC.php b/tests/namespace_test/NamespaceC/TableInC.php
new file mode 100644
index 00000000..116aea1f
--- /dev/null
+++ b/tests/namespace_test/NamespaceC/TableInC.php
@@ -0,0 +1,100 @@
+<?php
+// automatically generated by the FlatBuffers compiler, do not modify
+
+namespace NamespaceC;
+
+use \Google\FlatBuffers\Struct;
+use \Google\FlatBuffers\Table;
+use \Google\FlatBuffers\ByteBuffer;
+use \Google\FlatBuffers\FlatBufferBuilder;
+
+class TableInC extends Table
+{
+ /**
+ * @param ByteBuffer $bb
+ * @return TableInC
+ */
+ public static function getRootAsTableInC(ByteBuffer $bb)
+ {
+ $obj = new TableInC();
+ return ($obj->init($bb->getInt($bb->getPosition()) + $bb->getPosition(), $bb));
+ }
+
+ /**
+ * @param int $_i offset
+ * @param ByteBuffer $_bb
+ * @return TableInC
+ **/
+ public function init($_i, ByteBuffer $_bb)
+ {
+ $this->bb_pos = $_i;
+ $this->bb = $_bb;
+ return $this;
+ }
+
+ public function getReferToA1()
+ {
+ $obj = new TableInFirstNS();
+ $o = $this->__offset(4);
+ return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0;
+ }
+
+ public function getReferToA2()
+ {
+ $obj = new SecondTableInA();
+ $o = $this->__offset(6);
+ return $o != 0 ? $obj->init($this->__indirect($o + $this->bb_pos), $this->bb) : 0;
+ }
+
+ /**
+ * @param FlatBufferBuilder $builder
+ * @return void
+ */
+ public static function startTableInC(FlatBufferBuilder $builder)
+ {
+ $builder->StartObject(2);
+ }
+
+ /**
+ * @param FlatBufferBuilder $builder
+ * @return TableInC
+ */
+ public static function createTableInC(FlatBufferBuilder $builder, $refer_to_a1, $refer_to_a2)
+ {
+ $builder->startObject(2);
+ self::addReferToA1($builder, $refer_to_a1);
+ self::addReferToA2($builder, $refer_to_a2);
+ $o = $builder->endObject();
+ return $o;
+ }
+
+ /**
+ * @param FlatBufferBuilder $builder
+ * @param int
+ * @return void
+ */
+ public static function addReferToA1(FlatBufferBuilder $builder, $referToA1)
+ {
+ $builder->addOffsetX(0, $referToA1, 0);
+ }
+
+ /**
+ * @param FlatBufferBuilder $builder
+ * @param int
+ * @return void
+ */
+ public static function addReferToA2(FlatBufferBuilder $builder, $referToA2)
+ {
+ $builder->addOffsetX(1, $referToA2, 0);
+ }
+
+ /**
+ * @param FlatBufferBuilder $builder
+ * @return int table offset
+ */
+ public static function endTableInC(FlatBufferBuilder $builder)
+ {
+ $o = $builder->endObject();
+ return $o;
+ }
+}
diff --git a/tests/namespace_test/NamespaceC/TableInC.py b/tests/namespace_test/NamespaceC/TableInC.py
new file mode 100644
index 00000000..5a4376ed
--- /dev/null
+++ b/tests/namespace_test/NamespaceC/TableInC.py
@@ -0,0 +1,39 @@
+# automatically generated by the FlatBuffers compiler, do not modify
+
+# namespace: NamespaceC
+
+import flatbuffers
+
+class TableInC(object):
+ __slots__ = ['_tab']
+
+ # TableInC
+ def Init(self, buf, pos):
+ self._tab = flatbuffers.table.Table(buf, pos)
+
+ # TableInC
+ def ReferToA1(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
+ if o != 0:
+ x = self._tab.Indirect(o + self._tab.Pos)
+ from .TableInFirstNS import TableInFirstNS
+ obj = TableInFirstNS()
+ obj.Init(self._tab.Bytes, x)
+ return obj
+ return None
+
+ # TableInC
+ def ReferToA2(self):
+ o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))
+ if o != 0:
+ x = self._tab.Indirect(o + self._tab.Pos)
+ from .SecondTableInA import SecondTableInA
+ obj = SecondTableInA()
+ obj.Init(self._tab.Bytes, x)
+ return obj
+ return None
+
+def TableInCStart(builder): builder.StartObject(2)
+def TableInCAddReferToA1(builder, referToA1): builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(referToA1), 0)
+def TableInCAddReferToA2(builder, referToA2): builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(referToA2), 0)
+def TableInCEnd(builder): return builder.EndObject()