mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-28 11:38:05 +00:00
[C#] Fix collision of member if union name is "Value" (#7648)
* Fix C/C++ Create<Type>Direct with sorted vectors If a struct has a key the vector has to be sorted. To sort the vector you can't use "const". * Changes due to code review * Improve code readability * Add generate of JSON schema to string to lib * option indent_step is supported * Remove unused variables * Fix break in test * Fix style to be consistent with rest of the code * [TS] Fix reserved words as arguments (#6955) * [TS] Fix generation of reserved words in object api (#7106) * [TS] Fix generation of object api * [TS] Fix MakeCamel -> ConvertCase * [C#] Fix collision of field name and type name * [TS] Add test for struct of struct of struct * Update generated files * Add missing files * [TS] Fix query of null/undefined fields in object api * [C#] Fix collision of member if enum name is "Value" * Fix due to style guide Co-authored-by: Derek Bailey <derekbailey@google.com>
This commit is contained in:
@@ -1425,20 +1425,23 @@ class CSharpGenerator : public BaseGenerator {
|
|||||||
code += "public ";
|
code += "public ";
|
||||||
}
|
}
|
||||||
auto union_name = enum_def.name + "Union";
|
auto union_name = enum_def.name + "Union";
|
||||||
|
auto class_member = std::string("Value");
|
||||||
|
if (class_member == enum_def.name) { class_member += "_"; };
|
||||||
code += "class " + union_name + " {\n";
|
code += "class " + union_name + " {\n";
|
||||||
// Type
|
// Type
|
||||||
code += " public " + enum_def.name + " Type { get; set; }\n";
|
code += " public " + enum_def.name + " Type { get; set; }\n";
|
||||||
// Value
|
// Value
|
||||||
code += " public object Value { get; set; }\n";
|
code += " public object " + class_member + " { get; set; }\n";
|
||||||
code += "\n";
|
code += "\n";
|
||||||
// Constructor
|
// Constructor
|
||||||
code += " public " + union_name + "() {\n";
|
code += " public " + union_name + "() {\n";
|
||||||
code += " this.Type = " + enum_def.name + "." +
|
code += " this.Type = " + enum_def.name + "." +
|
||||||
enum_def.Vals()[0]->name + ";\n";
|
enum_def.Vals()[0]->name + ";\n";
|
||||||
code += " this.Value = null;\n";
|
code += " this." + class_member + " = null;\n";
|
||||||
code += " }\n\n";
|
code += " }\n\n";
|
||||||
// As<T>
|
// As<T>
|
||||||
code += " public T As<T>() where T : class { return this.Value as T; }\n";
|
code += " public T As<T>() where T : class { return this." + class_member +
|
||||||
|
" as T; }\n";
|
||||||
// As, From
|
// As, From
|
||||||
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
|
for (auto it = enum_def.Vals().begin(); it != enum_def.Vals().end(); ++it) {
|
||||||
auto &ev = **it;
|
auto &ev = **it;
|
||||||
@@ -1459,7 +1462,8 @@ class CSharpGenerator : public BaseGenerator {
|
|||||||
code += " " + accessibility + " static " + union_name + " From" +
|
code += " " + accessibility + " static " + union_name + " From" +
|
||||||
ev.name + "(" + type_name + " _" + lower_ev_name +
|
ev.name + "(" + type_name + " _" + lower_ev_name +
|
||||||
") { return new " + union_name + "{ Type = " + Name(enum_def) +
|
") { return new " + union_name + "{ Type = " + Name(enum_def) +
|
||||||
"." + Name(ev) + ", Value = _" + lower_ev_name + " }; }\n";
|
"." + Name(ev) + ", " + class_member + " = _" + lower_ev_name +
|
||||||
|
" }; }\n";
|
||||||
}
|
}
|
||||||
code += "\n";
|
code += "\n";
|
||||||
// Pack()
|
// Pack()
|
||||||
@@ -1581,6 +1585,8 @@ class CSharpGenerator : public BaseGenerator {
|
|||||||
bool is_vector) const {
|
bool is_vector) const {
|
||||||
auto &code = *code_ptr;
|
auto &code = *code_ptr;
|
||||||
std::string varialbe_name = "_o." + camel_name;
|
std::string varialbe_name = "_o." + camel_name;
|
||||||
|
std::string class_member = "Value";
|
||||||
|
if (class_member == camel_name) class_member += "_";
|
||||||
std::string type_suffix = "";
|
std::string type_suffix = "";
|
||||||
std::string func_suffix = "()";
|
std::string func_suffix = "()";
|
||||||
std::string indent = " ";
|
std::string indent = " ";
|
||||||
@@ -1608,7 +1614,8 @@ class CSharpGenerator : public BaseGenerator {
|
|||||||
} else {
|
} else {
|
||||||
code += indent + " case " + NamespacedName(enum_def) + "." + ev.name +
|
code += indent + " case " + NamespacedName(enum_def) + "." + ev.name +
|
||||||
":\n";
|
":\n";
|
||||||
code += indent + " " + varialbe_name + ".Value = this." + camel_name;
|
code += indent + " " + varialbe_name + "." + class_member +
|
||||||
|
" = this." + camel_name;
|
||||||
if (IsString(ev.union_type)) {
|
if (IsString(ev.union_type)) {
|
||||||
code += "AsString" + func_suffix + ";\n";
|
code += "AsString" + func_suffix + ";\n";
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user