diff --git a/src/idl_gen_go.cpp b/src/idl_gen_go.cpp index 1f6b103ea..5f1bcf5e8 100644 --- a/src/idl_gen_go.cpp +++ b/src/idl_gen_go.cpp @@ -85,7 +85,33 @@ static void EnumMember(const EnumDef &enum_def, const EnumVal ev, // End enum code. static void EndEnum(std::string *code_ptr) { std::string &code = *code_ptr; - code += ")\n"; + code += ")\n\n"; +} + +// Begin enum name code. +static void BeginEnumNames(const EnumDef &enum_def, std::string *code_ptr) { + std::string &code = *code_ptr; + code += "var EnumNames"; + code += enum_def.name; + code += " = map[int]string{\n"; +} + +// A single enum name member. +static void EnumNameMember(const EnumDef &enum_def, const EnumVal ev, + std::string *code_ptr) { + std::string &code = *code_ptr; + code += "\t"; + code += enum_def.name; + code += ev.name; + code += ":\""; + code += ev.name; + code += "\",\n"; +} + +// End enum name code. +static void EndEnumNames(std::string *code_ptr) { + std::string &code = *code_ptr; + code += "}\n\n"; } // Initialize a new struct or table from existing data. @@ -597,6 +623,15 @@ static void GenEnum(const EnumDef &enum_def, std::string *code_ptr) { EnumMember(enum_def, ev, code_ptr); } EndEnum(code_ptr); + + BeginEnumNames(enum_def, code_ptr); + for (auto it = enum_def.vals.vec.begin(); + it != enum_def.vals.vec.end(); + ++it) { + auto &ev = **it; + EnumNameMember(enum_def, ev, code_ptr); + } + EndEnumNames(code_ptr); } // Returns the function name that is able to read a value of the given type. diff --git a/tests/MyGame/Example/Any.go b/tests/MyGame/Example/Any.go index df9f823fc..d69b141b7 100644 --- a/tests/MyGame/Example/Any.go +++ b/tests/MyGame/Example/Any.go @@ -8,3 +8,11 @@ const ( AnyTestSimpleTableWithEnum = 2 AnyMyGame_Example2_Monster = 3 ) + +var EnumNamesAny = map[int]string{ + AnyNONE:"NONE", + AnyMonster:"Monster", + AnyTestSimpleTableWithEnum:"TestSimpleTableWithEnum", + AnyMyGame_Example2_Monster:"MyGame_Example2_Monster", +} + diff --git a/tests/MyGame/Example/Color.go b/tests/MyGame/Example/Color.go index 09f6d5805..d1eac5406 100644 --- a/tests/MyGame/Example/Color.go +++ b/tests/MyGame/Example/Color.go @@ -7,3 +7,10 @@ const ( ColorGreen = 2 ColorBlue = 8 ) + +var EnumNamesColor = map[int]string{ + ColorRed:"Red", + ColorGreen:"Green", + ColorBlue:"Blue", +} + diff --git a/tests/go_test.go b/tests/go_test.go index e4e96de8c..75d6b1f57 100644 --- a/tests/go_test.go +++ b/tests/go_test.go @@ -100,6 +100,9 @@ func TestAll(t *testing.T) { // Verify that vtables are deduplicated when written: CheckVtableDeduplication(t.Fatalf) + // Verify the enum names + CheckEnumNames(t.Fatalf) + // Verify that the Go code used in FlatBuffers documentation passes // some sanity checks: CheckDocExample(generated, off, t.Fatalf) @@ -1314,6 +1317,37 @@ func CheckFinishedBytesError(fail func(string, ...interface{})) { b.FinishedBytes() } +// CheckEnumNames checks that the generated enum names are correct. +func CheckEnumNames(fail func(string, ...interface{})) { + type testEnumNames struct { + EnumNames map[int]string + Expected map[int]string + } + data := [...]testEnumNames{ + {example.EnumNamesAny, + map[int]string{ + example.AnyNONE: "NONE", + example.AnyMonster: "Monster", + example.AnyTestSimpleTableWithEnum: "TestSimpleTableWithEnum", + }, + }, + {example.EnumNamesColor, + map[int]string{ + example.ColorRed: "Red", + example.ColorGreen: "Green", + example.ColorBlue: "Blue", + }, + }, + } + for _, t := range data { + for val, name := range t.Expected { + if name != t.EnumNames[val] { + fail("enum name is not equal") + } + } + } +} + // CheckDocExample checks that the code given in FlatBuffers documentation // is syntactically correct. func CheckDocExample(buf []byte, off flatbuffers.UOffsetT, fail func(string, ...interface{})) {