mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-22 06:58:28 +00:00
Merge branch 'master' of https://github.com/google/flatbuffers
This commit is contained in:
@@ -85,7 +85,33 @@ static void EnumMember(const EnumDef &enum_def, const EnumVal ev,
|
|||||||
// End enum code.
|
// End enum code.
|
||||||
static void EndEnum(std::string *code_ptr) {
|
static void EndEnum(std::string *code_ptr) {
|
||||||
std::string &code = *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.
|
// 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);
|
EnumMember(enum_def, ev, code_ptr);
|
||||||
}
|
}
|
||||||
EndEnum(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.
|
// Returns the function name that is able to read a value of the given type.
|
||||||
|
|||||||
@@ -8,3 +8,11 @@ const (
|
|||||||
AnyTestSimpleTableWithEnum = 2
|
AnyTestSimpleTableWithEnum = 2
|
||||||
AnyMyGame_Example2_Monster = 3
|
AnyMyGame_Example2_Monster = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var EnumNamesAny = map[int]string{
|
||||||
|
AnyNONE:"NONE",
|
||||||
|
AnyMonster:"Monster",
|
||||||
|
AnyTestSimpleTableWithEnum:"TestSimpleTableWithEnum",
|
||||||
|
AnyMyGame_Example2_Monster:"MyGame_Example2_Monster",
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,3 +7,10 @@ const (
|
|||||||
ColorGreen = 2
|
ColorGreen = 2
|
||||||
ColorBlue = 8
|
ColorBlue = 8
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var EnumNamesColor = map[int]string{
|
||||||
|
ColorRed:"Red",
|
||||||
|
ColorGreen:"Green",
|
||||||
|
ColorBlue:"Blue",
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -100,6 +100,9 @@ func TestAll(t *testing.T) {
|
|||||||
// Verify that vtables are deduplicated when written:
|
// Verify that vtables are deduplicated when written:
|
||||||
CheckVtableDeduplication(t.Fatalf)
|
CheckVtableDeduplication(t.Fatalf)
|
||||||
|
|
||||||
|
// Verify the enum names
|
||||||
|
CheckEnumNames(t.Fatalf)
|
||||||
|
|
||||||
// Verify that the Go code used in FlatBuffers documentation passes
|
// Verify that the Go code used in FlatBuffers documentation passes
|
||||||
// some sanity checks:
|
// some sanity checks:
|
||||||
CheckDocExample(generated, off, t.Fatalf)
|
CheckDocExample(generated, off, t.Fatalf)
|
||||||
@@ -1314,6 +1317,37 @@ func CheckFinishedBytesError(fail func(string, ...interface{})) {
|
|||||||
b.FinishedBytes()
|
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
|
// CheckDocExample checks that the code given in FlatBuffers documentation
|
||||||
// is syntactically correct.
|
// is syntactically correct.
|
||||||
func CheckDocExample(buf []byte, off flatbuffers.UOffsetT, fail func(string, ...interface{})) {
|
func CheckDocExample(buf []byte, off flatbuffers.UOffsetT, fail func(string, ...interface{})) {
|
||||||
|
|||||||
Reference in New Issue
Block a user