Skip to content

Commit 46a2f3f

Browse files
authored
[dart] fix bug which generated wrong code (#8780)
1 parent 7675121 commit 46a2f3f

3 files changed

Lines changed: 33 additions & 23 deletions

File tree

dart/test/keyword_test_keyword_test_generated.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:typed_data' show Uint8List;
77
import 'package:flat_buffers/flat_buffers.dart' as fb;
88

99

10+
1011
enum Abc {
1112
$void(0),
1213
where(1),

src/idl_gen_dart.cpp

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ class DartGenerator : public BaseGenerator {
9191
DartKeywords()) {}
9292

9393
template <typename T>
94-
void import_generator(const std::vector<T*>& definitions,
94+
void import_generator(const std::string& current_namespace,
95+
const std::vector<T*>& definitions,
9596
const std::string& included,
9697
std::set<std::string>& imports) {
9798
for (const auto& item : definitions) {
@@ -102,10 +103,13 @@ class DartGenerator : public BaseGenerator {
102103
std::string filename =
103104
namer_.File(filebase + (component.empty() ? "" : "_" + component));
104105

105-
imports.emplace("import './" + filename + "'" +
106-
(component.empty()
107-
? ";\n"
108-
: " as " + ImportAliasName(component) + ";\n"));
106+
std::string rename_namespace =
107+
component == current_namespace ? "" : component;
108+
imports.emplace(
109+
"import './" + filename + "'" +
110+
(rename_namespace.empty()
111+
? ";\n"
112+
: " as " + ImportAliasName(rename_namespace) + ";\n"));
109113
}
110114
}
111115
}
@@ -118,22 +122,6 @@ class DartGenerator : public BaseGenerator {
118122
GenerateEnums(namespace_code);
119123
GenerateStructs(namespace_code);
120124

121-
std::set<std::string> imports;
122-
123-
for (const auto& included_file : parser_.GetIncludedFiles()) {
124-
if (included_file.filename == parser_.file_being_parsed_) continue;
125-
126-
import_generator(parser_.structs_.vec, included_file.filename, imports);
127-
import_generator(parser_.enums_.vec, included_file.filename, imports);
128-
}
129-
130-
std::string import_code = "";
131-
for (const auto& file : imports) {
132-
import_code += file;
133-
}
134-
135-
import_code += import_code.empty() ? "" : "\n";
136-
137125
for (auto kv = namespace_code.begin(); kv != namespace_code.end(); ++kv) {
138126
code.clear();
139127
code = code + "// " + FlatBuffersGeneratedWarning() + "\n";
@@ -158,8 +146,21 @@ class DartGenerator : public BaseGenerator {
158146
}
159147

160148
code += "\n";
161-
code += import_code;
149+
std::set<std::string> imports;
150+
for (const auto& included_file : parser_.GetIncludedFiles()) {
151+
if (included_file.filename == parser_.file_being_parsed_) continue;
152+
153+
import_generator(kv->first, parser_.structs_.vec,
154+
included_file.filename, imports);
155+
import_generator(kv->first, parser_.enums_.vec, included_file.filename,
156+
imports);
157+
}
158+
159+
for (const auto& import_code : imports) {
160+
code += import_code;
161+
}
162162

163+
code += "\n";
163164
code += kv->second;
164165

165166
if (!SaveFile(Filename(kv->first).c_str(), code, false)) {
@@ -397,7 +398,14 @@ class DartGenerator : public BaseGenerator {
397398
} else if (type.enum_def->is_union) {
398399
return "dynamic";
399400
} else if (type.base_type != BASE_TYPE_VECTOR) {
400-
return namer_.Type(*type.enum_def);
401+
const std::string cur_namespace = namer_.Namespace(*current_namespace);
402+
std::string enum_namespace =
403+
namer_.Namespace(*type.enum_def->defined_namespace);
404+
std::string typeName = namer_.Type(*type.enum_def);
405+
if (enum_namespace != "" && enum_namespace != cur_namespace) {
406+
typeName = enum_namespace + "." + typeName;
407+
}
408+
return typeName;
401409
}
402410
}
403411

tests/monster_extra_my_game_generated.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:typed_data' show Uint8List;
77
import 'package:flat_buffers/flat_buffers.dart' as fb;
88

99

10+
1011
class MonsterExtra {
1112
MonsterExtra._(this._bc, this._bcOffset);
1213
factory MonsterExtra(List<int> bytes) {

0 commit comments

Comments
 (0)