diff --git a/src/idl_gen_dart.cpp b/src/idl_gen_dart.cpp index a4df1f4dfcb..6ec78d83b04 100644 --- a/src/idl_gen_dart.cpp +++ b/src/idl_gen_dart.cpp @@ -89,7 +89,8 @@ class DartGenerator : public BaseGenerator { DartKeywords()) {} template - void import_generator(const std::vector &definitions, + void import_generator(const std::string ¤t_namespace, + const std::vector &definitions, const std::string &included, std::set &imports) { for (const auto &item : definitions) { @@ -100,10 +101,11 @@ class DartGenerator : public BaseGenerator { std::string filename = namer_.File(filebase + (component.empty() ? "" : "_" + component)); + std::string rename_namespace = component == current_namespace ? "" : component; imports.emplace("import './" + filename + "'" + - (component.empty() + (rename_namespace.empty() ? ";\n" - : " as " + ImportAliasName(component) + ";\n")); + : " as " + ImportAliasName(rename_namespace) + ";\n")); } } } @@ -116,20 +118,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"; @@ -152,8 +140,19 @@ 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)) { return false; } @@ -386,7 +385,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; } }