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
This commit is contained in:
Will Hughes
2022-03-23 17:56:14 +13:00
committed by GitHub
parent 23a7e4e0b0
commit 5a13f622cf
5 changed files with 48 additions and 2 deletions

View File

@@ -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.example_generated.dart' as example;
import './monster_test_my_game.example2_generated.dart' as example2; import './monster_test_my_game.example2_generated.dart' as example2;
import './list_of_enums_generated.dart' as example3;
main() { main() {
defineReflectiveSuite(() { defineReflectiveSuite(() {
@@ -20,6 +21,7 @@ main() {
defineReflectiveTests(ObjectAPITest); defineReflectiveTests(ObjectAPITest);
defineReflectiveTests(CheckOtherLangaugesData); defineReflectiveTests(CheckOtherLangaugesData);
defineReflectiveTests(GeneratorTest); defineReflectiveTests(GeneratorTest);
defineReflectiveTests(ListOfEnumsTest);
}); });
} }
@@ -902,3 +904,17 @@ class GeneratorTest {
same(example.AnyAmbiguousAliasesTypeId.values)); 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);
}
}

View File

@@ -0,0 +1,10 @@
enum OptionsEnum : uint32
{
A = 1,
B = 2,
C = 3
}
table MyTable {
options : [OptionsEnum];
}

View File

@@ -308,7 +308,7 @@ class DartGenerator : public BaseGenerator {
"> {\n"; "> {\n";
code += " const _" + name + "Reader();\n\n"; code += " const _" + name + "Reader();\n\n";
code += " @override\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 += " @override\n";
code += code +=
" " + name + " read(" + _kFb + ".BufferContext bc, int offset) =>\n"; " " + 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, std::string GenReaderTypeName(const Type &type, Namespace *current_namespace,
const FieldDef &def, const FieldDef &def,
bool parent_is_vector = false, bool lazy = true, bool parent_is_vector = false, bool lazy = true,

View File

@@ -25,6 +25,8 @@ cp monster_test.fbs ../dart/test
cd ../dart cd ../dart
../flatc --dart --gen-object-api -o ./test ./test/list_of_enums.fbs
# update packages # update packages
dart pub get dart pub get
# Execute the sample. # Execute the sample.

View File

@@ -152,7 +152,7 @@ class _LongEnumReader extends fb.Reader<LongEnum> {
const _LongEnumReader(); const _LongEnumReader();
@override @override
int get size => 1; int get size => 8;
@override @override
LongEnum read(fb.BufferContext bc, int offset) => LongEnum read(fb.BufferContext bc, int offset) =>