Fix go generator undefined Package name, also throwing exception (#7632)

* Fix go generator undefined Package, also throw exception in specific examples.

* Add test for go generator import problem

* Add new version of generated go file. Fix conflict.

* Add executable permission to generate_code.py script.

* Improve test quality, remove unwanted generated files, better naming

* Fix comments

* clang format

Co-authored-by: Derek Bailey <derekbailey@google.com>
This commit is contained in:
Saman
2022-11-22 16:21:25 -05:00
committed by GitHub
parent eead6c6219
commit 1cba8b2b49
9 changed files with 264 additions and 39 deletions

View File

@@ -79,7 +79,7 @@ static Namer::Config GoDefaultConfig() {
/*filename_extension=*/".go" };
}
} // namespace
} // namespace
class GoGenerator : public BaseGenerator {
public:
@@ -152,11 +152,11 @@ class GoGenerator : public BaseGenerator {
const IdlNamer namer_;
struct NamespacePtrLess {
bool operator()(const Namespace *a, const Namespace *b) const {
return *a < *b;
bool operator()(const Definition *a, const Definition *b) const {
return *a->defined_namespace < *b->defined_namespace;
}
};
std::set<const Namespace *, NamespacePtrLess> tracked_imported_namespaces_;
std::set<const Definition *, NamespacePtrLess> tracked_imported_namespaces_;
bool needs_math_import_ = false;
// Most field accessors need to retrieve and test the field offset first,
@@ -180,8 +180,7 @@ class GoGenerator : public BaseGenerator {
// Construct the name of the type for this enum.
std::string GetEnumTypeName(const EnumDef &enum_def) {
return WrapInNameSpaceAndTrack(enum_def.defined_namespace,
namer_.Type(enum_def));
return WrapInNameSpaceAndTrack(&enum_def, namer_.Type(enum_def));
}
// Create a type for the enum values.
@@ -907,13 +906,13 @@ class GoGenerator : public BaseGenerator {
if (ev.IsZero()) continue;
code += "\tcase " + namer_.EnumVariant(enum_def, ev) + ":\n";
code += "\t\tvar x " +
WrapInNameSpaceAndTrack(*ev.union_type.struct_def) +
WrapInNameSpaceAndTrack(ev.union_type.struct_def,
ev.union_type.struct_def->name) +
"\n";
code += "\t\tx.Init(table.Bytes, table.Pos)\n";
code += "\t\treturn &" +
WrapInNameSpaceAndTrack(enum_def.defined_namespace,
NativeName(enum_def)) +
WrapInNameSpaceAndTrack(&enum_def, NativeName(enum_def)) +
"{ Type: " + namer_.EnumVariant(enum_def, ev) +
", Value: x.UnPack() }\n";
}
@@ -1074,7 +1073,8 @@ class GoGenerator : public BaseGenerator {
code += "\tfor j := 0; j < " + length + "; j++ {\n";
if (field.value.type.element == BASE_TYPE_STRUCT) {
code += "\t\tx := " +
WrapInNameSpaceAndTrack(*field.value.type.struct_def) +
WrapInNameSpaceAndTrack(field.value.type.struct_def,
field.value.type.struct_def->name) +
"{}\n";
code += "\t\trcv." + field_field + "(&x, j)\n";
}
@@ -1241,7 +1241,8 @@ class GoGenerator : public BaseGenerator {
switch (type.base_type) {
case BASE_TYPE_STRING: return "[]byte";
case BASE_TYPE_VECTOR: return GenTypeGet(type.VectorType());
case BASE_TYPE_STRUCT: return WrapInNameSpaceAndTrack(*type.struct_def);
case BASE_TYPE_STRUCT:
return WrapInNameSpaceAndTrack(type.struct_def, type.struct_def->name);
case BASE_TYPE_UNION:
// fall through
default: return "*flatbuffers.Table";
@@ -1325,11 +1326,11 @@ class GoGenerator : public BaseGenerator {
} else if (IsVector(type)) {
return "[]" + NativeType(type.VectorType());
} else if (type.base_type == BASE_TYPE_STRUCT) {
return "*" + WrapInNameSpaceAndTrack(type.struct_def->defined_namespace,
return "*" + WrapInNameSpaceAndTrack(type.struct_def,
NativeName(*type.struct_def));
} else if (type.base_type == BASE_TYPE_UNION) {
return "*" + WrapInNameSpaceAndTrack(type.enum_def->defined_namespace,
NativeName(*type.enum_def));
return "*" +
WrapInNameSpaceAndTrack(type.enum_def, NativeName(*type.enum_def));
}
FLATBUFFERS_ASSERT(0);
return std::string();
@@ -1365,8 +1366,13 @@ class GoGenerator : public BaseGenerator {
code += "\n";
for (auto it = tracked_imported_namespaces_.begin();
it != tracked_imported_namespaces_.end(); ++it) {
code += "\t" + NamespaceImportName(*it) + " \"" +
NamespaceImportPath(*it) + "\"\n";
if ((*it)->defined_namespace->components.empty()) {
code += "\t" + (*it)->name + " \"" + (*it)->name + "\"\n";
} else {
code += "\t" + NamespaceImportName((*it)->defined_namespace) +
" \"" + NamespaceImportPath((*it)->defined_namespace) +
"\"\n";
}
}
}
code += ")\n\n";
@@ -1387,7 +1393,8 @@ class GoGenerator : public BaseGenerator {
Namespace &ns = go_namespace_.components.empty() ? *def.defined_namespace
: go_namespace_;
std::string code = "";
BeginFile(LastNamespacePart(ns), needs_imports, is_enum, &code);
BeginFile(ns.components.empty() ? def.name : LastNamespacePart(ns),
needs_imports, is_enum, &code);
code += classcode;
// Strip extra newlines at end of file to make it gofmt-clean.
while (code.length() > 2 && code.substr(code.length() - 2) == "\n\n") {
@@ -1412,16 +1419,14 @@ class GoGenerator : public BaseGenerator {
// Ensure that a type is prefixed with its go package import name if it is
// used outside of its namespace.
std::string WrapInNameSpaceAndTrack(const Namespace *ns,
std::string WrapInNameSpaceAndTrack(const Definition *def,
const std::string &name) {
if (CurrentNameSpace() == ns) return name;
tracked_imported_namespaces_.insert(ns);
return NamespaceImportName(ns) + "." + name;
}
std::string WrapInNameSpaceAndTrack(const Definition &def) {
return WrapInNameSpaceAndTrack(def.defined_namespace, def.name);
if (CurrentNameSpace() == def->defined_namespace) return name;
tracked_imported_namespaces_.insert(def);
if (def->defined_namespace->components.empty())
return def->name + "." + name;
else
return NamespaceImportName(def->defined_namespace) + "." + name;
}
const Namespace *CurrentNameSpace() const { return cur_name_space_; }

View File

@@ -196,7 +196,7 @@ class Namer {
result += ConvertCase(*d, config_.directories, Case::kUpperCamel);
result.push_back(kPathSeparator);
}
if (skip_trailing_seperator) result.pop_back();
if (skip_trailing_seperator && !result.empty()) result.pop_back();
return result;
}