From 5a13f622cf41383f8c14e21149309ce9bc5c366e Mon Sep 17 00:00:00 2001 From: Will Hughes Date: Wed, 23 Mar 2022 17:56:14 +1300 Subject: [PATCH] Correctly parse lists of enums in Dart generated code (#7157) * Correctly parse lists of enums in Dart generated code * Add a test for #6869 * Commit generated code * Fixed missing newline-at-eof --- dart/test/flat_buffers_test.dart | 16 +++++++++++++++ dart/test/list_of_enums.fbs | 10 ++++++++++ src/idl_gen_dart.cpp | 20 ++++++++++++++++++- tests/DartTest.sh | 2 ++ ...onster_test_my_game.example_generated.dart | 2 +- 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 dart/test/list_of_enums.fbs diff --git a/dart/test/flat_buffers_test.dart b/dart/test/flat_buffers_test.dart index 8cee6b281..04875a0bc 100644 --- a/dart/test/flat_buffers_test.dart +++ b/dart/test/flat_buffers_test.dart @@ -13,6 +13,7 @@ import 'package:test_reflective_loader/test_reflective_loader.dart'; import './monster_test_my_game.example_generated.dart' as example; import './monster_test_my_game.example2_generated.dart' as example2; +import './list_of_enums_generated.dart' as example3; main() { defineReflectiveSuite(() { @@ -20,6 +21,7 @@ main() { defineReflectiveTests(ObjectAPITest); defineReflectiveTests(CheckOtherLangaugesData); defineReflectiveTests(GeneratorTest); + defineReflectiveTests(ListOfEnumsTest); }); } @@ -902,3 +904,17 @@ class GeneratorTest { same(example.AnyAmbiguousAliasesTypeId.values)); } } + +// See #6869 +@reflectiveTest +class ListOfEnumsTest { + void test_listOfEnums() async { + var mytable = example3.MyTableObjectBuilder( + options: [example3.OptionsEnum.A, example3.OptionsEnum.B, example3.OptionsEnum.C]); + var bytes = mytable.toBytes(); + var mytable_read = example3.MyTable(bytes); + expect(mytable_read.options![0].value, example3.OptionsEnum.A.value); + expect(mytable_read.options![1].value, example3.OptionsEnum.B.value); + expect(mytable_read.options![2].value, example3.OptionsEnum.C.value); + } +} diff --git a/dart/test/list_of_enums.fbs b/dart/test/list_of_enums.fbs new file mode 100644 index 000000000..a4272a43b --- /dev/null +++ b/dart/test/list_of_enums.fbs @@ -0,0 +1,10 @@ +enum OptionsEnum : uint32 +{ + A = 1, + B = 2, + C = 3 +} + +table MyTable { + options : [OptionsEnum]; +} diff --git a/src/idl_gen_dart.cpp b/src/idl_gen_dart.cpp index ff2c1a5d5..3b8660bfd 100644 --- a/src/idl_gen_dart.cpp +++ b/src/idl_gen_dart.cpp @@ -308,7 +308,7 @@ class DartGenerator : public BaseGenerator { "> {\n"; code += " const _" + name + "Reader();\n\n"; code += " @override\n"; - code += " int get size => 1;\n\n"; + code += " int get size => " + EnumSize(enum_def.underlying_type) + ";\n\n"; code += " @override\n"; code += " " + name + " read(" + _kFb + ".BufferContext bc, int offset) =>\n"; @@ -339,6 +339,24 @@ class DartGenerator : public BaseGenerator { } } + static std::string EnumSize(const Type &type) { + switch (type.base_type) { + case BASE_TYPE_BOOL: + case BASE_TYPE_CHAR: + case BASE_TYPE_UTYPE: + case BASE_TYPE_UCHAR: return "1"; + case BASE_TYPE_SHORT: + case BASE_TYPE_USHORT: return "2"; + case BASE_TYPE_INT: + case BASE_TYPE_UINT: + case BASE_TYPE_FLOAT: return "4"; + case BASE_TYPE_LONG: + case BASE_TYPE_ULONG: + case BASE_TYPE_DOUBLE: return "8"; + default: return "1"; + } + } + std::string GenReaderTypeName(const Type &type, Namespace *current_namespace, const FieldDef &def, bool parent_is_vector = false, bool lazy = true, diff --git a/tests/DartTest.sh b/tests/DartTest.sh index 36d1b1495..653f77720 100755 --- a/tests/DartTest.sh +++ b/tests/DartTest.sh @@ -25,6 +25,8 @@ cp monster_test.fbs ../dart/test cd ../dart +../flatc --dart --gen-object-api -o ./test ./test/list_of_enums.fbs + # update packages dart pub get # Execute the sample. diff --git a/tests/monster_test_my_game.example_generated.dart b/tests/monster_test_my_game.example_generated.dart index dd816d97b..4c9557368 100644 --- a/tests/monster_test_my_game.example_generated.dart +++ b/tests/monster_test_my_game.example_generated.dart @@ -152,7 +152,7 @@ class _LongEnumReader extends fb.Reader { const _LongEnumReader(); @override - int get size => 1; + int get size => 8; @override LongEnum read(fb.BufferContext bc, int offset) =>