diff --git a/dart/test/keyword_test_keyword_test_generated.dart b/dart/test/keyword_test_keyword_test_generated.dart index b9f7640068c..4f5d464ae09 100644 --- a/dart/test/keyword_test_keyword_test_generated.dart +++ b/dart/test/keyword_test_keyword_test_generated.dart @@ -7,6 +7,7 @@ import 'dart:typed_data' show Uint8List; import 'package:flat_buffers/flat_buffers.dart' as fb; + enum Abc { $void(0), where(1), diff --git a/src/idl_gen_dart.cpp b/src/idl_gen_dart.cpp index b221e049601..d0b0930168a 100644 --- a/src/idl_gen_dart.cpp +++ b/src/idl_gen_dart.cpp @@ -91,7 +91,8 @@ class DartGenerator : public BaseGenerator { DartKeywords()) {} template - void import_generator(const std::vector& definitions, + void import_generator(const std::string& current_namespace, + const std::vector& definitions, const std::string& included, std::set& imports) { for (const auto& item : definitions) { @@ -102,10 +103,13 @@ class DartGenerator : public BaseGenerator { std::string filename = namer_.File(filebase + (component.empty() ? "" : "_" + component)); - imports.emplace("import './" + filename + "'" + - (component.empty() - ? ";\n" - : " as " + ImportAliasName(component) + ";\n")); + std::string rename_namespace = + component == current_namespace ? "" : component; + imports.emplace( + "import './" + filename + "'" + + (rename_namespace.empty() + ? ";\n" + : " as " + ImportAliasName(rename_namespace) + ";\n")); } } } @@ -118,22 +122,6 @@ class DartGenerator : public BaseGenerator { GenerateEnums(namespace_code); GenerateStructs(namespace_code); - std::set imports; - - for (const auto& included_file : parser_.GetIncludedFiles()) { - if (included_file.filename == parser_.file_being_parsed_) continue; - - import_generator(parser_.structs_.vec, included_file.filename, imports); - import_generator(parser_.enums_.vec, included_file.filename, imports); - } - - std::string import_code = ""; - for (const auto& file : imports) { - import_code += file; - } - - import_code += import_code.empty() ? "" : "\n"; - for (auto kv = namespace_code.begin(); kv != namespace_code.end(); ++kv) { code.clear(); code = code + "// " + FlatBuffersGeneratedWarning() + "\n"; @@ -158,8 +146,21 @@ class DartGenerator : public BaseGenerator { } code += "\n"; - code += import_code; + std::set imports; + for (const auto& included_file : parser_.GetIncludedFiles()) { + if (included_file.filename == parser_.file_being_parsed_) continue; + + import_generator(kv->first, parser_.structs_.vec, + included_file.filename, imports); + import_generator(kv->first, parser_.enums_.vec, included_file.filename, + imports); + } + + for (const auto& import_code : imports) { + code += import_code; + } + code += "\n"; code += kv->second; if (!SaveFile(Filename(kv->first).c_str(), code, false)) { @@ -397,7 +398,14 @@ class DartGenerator : public BaseGenerator { } else if (type.enum_def->is_union) { return "dynamic"; } else if (type.base_type != BASE_TYPE_VECTOR) { - return namer_.Type(*type.enum_def); + const std::string cur_namespace = namer_.Namespace(*current_namespace); + std::string enum_namespace = + namer_.Namespace(*type.enum_def->defined_namespace); + std::string typeName = namer_.Type(*type.enum_def); + if (enum_namespace != "" && enum_namespace != cur_namespace) { + typeName = enum_namespace + "." + typeName; + } + return typeName; } } diff --git a/tests/monster_extra_my_game_generated.dart b/tests/monster_extra_my_game_generated.dart index 77ce07f50a8..833dfe50a3d 100644 --- a/tests/monster_extra_my_game_generated.dart +++ b/tests/monster_extra_my_game_generated.dart @@ -7,6 +7,7 @@ import 'dart:typed_data' show Uint8List; import 'package:flat_buffers/flat_buffers.dart' as fb; + class MonsterExtra { MonsterExtra._(this._bc, this._bcOffset); factory MonsterExtra(List bytes) {