From 199157e8f47f60e0746645964f8fe53138ee2cfe Mon Sep 17 00:00:00 2001 From: Baptiste Lepilleur <baptiste.lepilleur@gmail.com> Date: Fri, 7 Oct 2016 18:42:29 +0200 Subject: [PATCH] flatc java generator: namespace_test2.fbs is missing namespace prefix for referToA2() return type (#4040) * Fix flatc generating incorrect java/c# code for namespace_test2.fbs. In code for TableInC, method referToA2() returned type SecondTableInA instead of NamespaceA.SecondTableInA. * Updated generated code. * Fixed indendation. --- src/idl_gen_general.cpp | 12 ++++++++++-- tests/MyGame/Example2/Monster.cs | 4 ++-- tests/namespace_test/NamespaceA/TableInFirstNS.cs | 4 ++-- tests/namespace_test/NamespaceC/TableInC.cs | 12 ++++++------ tests/namespace_test/NamespaceC/TableInC.java | 4 ++-- 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/idl_gen_general.cpp b/src/idl_gen_general.cpp index 30899d4d..3f72e92f 100644 --- a/src/idl_gen_general.cpp +++ b/src/idl_gen_general.cpp @@ -210,17 +210,21 @@ class GeneralGenerator : public BaseGenerator { GeneralGenerator(const Parser &parser, const std::string &path, const std::string &file_name) : BaseGenerator(parser, path, file_name, "", "."), - lang_(language_parameters[parser_.opts.lang]) { + lang_(language_parameters[parser_.opts.lang]), + cur_name_space_( nullptr ) { assert(parser_.opts.lang <= IDLOptions::kMAX); }; GeneralGenerator &operator=(const GeneralGenerator &); bool generate() { std::string one_file_code; + cur_name_space_ = parser_.namespaces_.back(); for (auto it = parser_.enums_.vec.begin(); it != parser_.enums_.vec.end(); ++it) { std::string enumcode; auto &enum_def = **it; + if (!parser_.opts.one_file) + cur_name_space_ = enum_def.defined_namespace; GenEnum(enum_def, &enumcode); if (parser_.opts.one_file) { one_file_code += enumcode; @@ -234,6 +238,8 @@ class GeneralGenerator : public BaseGenerator { it != parser_.structs_.vec.end(); ++it) { std::string declcode; auto &struct_def = **it; + if (!parser_.opts.one_file) + cur_name_space_ = struct_def.defined_namespace; GenStruct(struct_def, &declcode); if (parser_.opts.one_file) { one_file_code += declcode; @@ -270,7 +276,7 @@ class GeneralGenerator : public BaseGenerator { return SaveFile(filename.c_str(), code, false); } - const Namespace *CurrentNameSpace() { return parser_.namespaces_.back(); } + const Namespace *CurrentNameSpace() { return cur_name_space_; } std::string FunctionStart(char upper) { return std::string() + (lang_.language == IDLOptions::kJava @@ -1363,6 +1369,8 @@ void GenStruct(StructDef &struct_def, std::string *code_ptr) { code += "\n\n"; } const LanguageParameters & lang_; + // This tracks the current namespace used to determine if a type need to be prefixed by its namespace + const Namespace *cur_name_space_; }; } // namespace general diff --git a/tests/MyGame/Example2/Monster.cs b/tests/MyGame/Example2/Monster.cs index 6b1602ed..2a0b6de4 100644 --- a/tests/MyGame/Example2/Monster.cs +++ b/tests/MyGame/Example2/Monster.cs @@ -17,9 +17,9 @@ public struct Monster : IFlatbufferObject public static void StartMonster(FlatBufferBuilder builder) { builder.StartObject(0); } - public static Offset<MyGame.Example2.Monster> EndMonster(FlatBufferBuilder builder) { + public static Offset<Monster> EndMonster(FlatBufferBuilder builder) { int o = builder.EndObject(); - return new Offset<MyGame.Example2.Monster>(o); + return new Offset<Monster>(o); } }; diff --git a/tests/namespace_test/NamespaceA/TableInFirstNS.cs b/tests/namespace_test/NamespaceA/TableInFirstNS.cs index f1c7e96b..3b5659af 100644 --- a/tests/namespace_test/NamespaceA/TableInFirstNS.cs +++ b/tests/namespace_test/NamespaceA/TableInFirstNS.cs @@ -24,9 +24,9 @@ public struct TableInFirstNS : IFlatbufferObject public static void AddFooTable(FlatBufferBuilder builder, Offset<NamespaceA.NamespaceB.TableInNestedNS> fooTableOffset) { builder.AddOffset(0, fooTableOffset.Value, 0); } public static void AddFooEnum(FlatBufferBuilder builder, NamespaceA.NamespaceB.EnumInNestedNS fooEnum) { builder.AddSbyte(1, (sbyte)fooEnum, 0); } public static void AddFooStruct(FlatBufferBuilder builder, Offset<NamespaceA.NamespaceB.StructInNestedNS> fooStructOffset) { builder.AddStruct(2, fooStructOffset.Value, 0); } - public static Offset<NamespaceA.TableInFirstNS> EndTableInFirstNS(FlatBufferBuilder builder) { + public static Offset<TableInFirstNS> EndTableInFirstNS(FlatBufferBuilder builder) { int o = builder.EndObject(); - return new Offset<NamespaceA.TableInFirstNS>(o); + return new Offset<TableInFirstNS>(o); } }; diff --git a/tests/namespace_test/NamespaceC/TableInC.cs b/tests/namespace_test/NamespaceC/TableInC.cs index 6dddcd4d..fa53ec52 100644 --- a/tests/namespace_test/NamespaceC/TableInC.cs +++ b/tests/namespace_test/NamespaceC/TableInC.cs @@ -16,11 +16,11 @@ public struct TableInC : IFlatbufferObject public TableInC __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; } public NamespaceA.TableInFirstNS? ReferToA1 { get { int o = __p.__offset(4); return o != 0 ? (NamespaceA.TableInFirstNS?)(new NamespaceA.TableInFirstNS()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } } - public SecondTableInA? ReferToA2 { get { int o = __p.__offset(6); return o != 0 ? (SecondTableInA?)(new SecondTableInA()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } } + public NamespaceA.SecondTableInA? ReferToA2 { get { int o = __p.__offset(6); return o != 0 ? (NamespaceA.SecondTableInA?)(new NamespaceA.SecondTableInA()).__assign(__p.__indirect(o + __p.bb_pos), __p.bb) : null; } } - public static Offset<NamespaceC.TableInC> CreateTableInC(FlatBufferBuilder builder, + public static Offset<TableInC> CreateTableInC(FlatBufferBuilder builder, Offset<NamespaceA.TableInFirstNS> refer_to_a1Offset = default(Offset<NamespaceA.TableInFirstNS>), - Offset<SecondTableInA> refer_to_a2Offset = default(Offset<SecondTableInA>)) { + Offset<NamespaceA.SecondTableInA> refer_to_a2Offset = default(Offset<NamespaceA.SecondTableInA>)) { builder.StartObject(2); TableInC.AddReferToA2(builder, refer_to_a2Offset); TableInC.AddReferToA1(builder, refer_to_a1Offset); @@ -29,10 +29,10 @@ public struct TableInC : IFlatbufferObject 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) { + public static void AddReferToA2(FlatBufferBuilder builder, Offset<NamespaceA.SecondTableInA> referToA2Offset) { builder.AddOffset(1, referToA2Offset.Value, 0); } + public static Offset<TableInC> EndTableInC(FlatBufferBuilder builder) { int o = builder.EndObject(); - return new Offset<NamespaceC.TableInC>(o); + return new Offset<TableInC>(o); } }; diff --git a/tests/namespace_test/NamespaceC/TableInC.java b/tests/namespace_test/NamespaceC/TableInC.java index 12658ed6..56d49545 100644 --- a/tests/namespace_test/NamespaceC/TableInC.java +++ b/tests/namespace_test/NamespaceC/TableInC.java @@ -16,8 +16,8 @@ public final class TableInC extends Table { public NamespaceA.TableInFirstNS referToA1() { return referToA1(new NamespaceA.TableInFirstNS()); } public NamespaceA.TableInFirstNS referToA1(NamespaceA.TableInFirstNS obj) { int o = __offset(4); return o != 0 ? obj.__assign(__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.__assign(__indirect(o + bb_pos), bb) : null; } + public NamespaceA.SecondTableInA referToA2() { return referToA2(new NamespaceA.SecondTableInA()); } + public NamespaceA.SecondTableInA referToA2(NamespaceA.SecondTableInA obj) { int o = __offset(6); return o != 0 ? obj.__assign(__indirect(o + bb_pos), bb) : null; } public static int createTableInC(FlatBufferBuilder builder, int refer_to_a1Offset, -- GitLab