Fix [C#] Object API - Invalid Property Name used in UnPackTo for unio… (#7751)

* Fix [C#] Object API - Invalid Property Name used in UnPackTo for union fieldhttps://github.com/google/flatbuffers/issues/7750, also fixes invalid Code generated in WriteJson for Unions named Value.

* Test added: new schema union_value_collision.fbs with a Union named Value and a union field named value. The generated C# code now compiles when NetTest.bat. The Code generated with an older flatc.exe didn't compile because of a mismatch of the property name (Value vs. Value_).

* branch was not up-to-date with master

* BASE_OPTS + CPP_OPTS removed and union_value_collision_generated.h deleted

Co-authored-by: Derek Bailey <derekbailey@google.com>
This commit is contained in:
Stefan F
2023-01-07 21:37:22 +01:00
committed by GitHub
parent 06f2a3dce9
commit b5802b57f2
5 changed files with 362 additions and 4 deletions

View File

@@ -1525,7 +1525,7 @@ class CSharpGenerator : public BaseGenerator {
" _o, "
"Newtonsoft.Json.JsonSerializer serializer) {\n";
code += " if (_o == null) return;\n";
code += " serializer.Serialize(writer, _o.Value);\n";
code += " serializer.Serialize(writer, _o." + class_member + ");\n";
code += " }\n";
code +=
" public override object ReadJson(Newtonsoft.Json.JsonReader "
@@ -1562,8 +1562,8 @@ class CSharpGenerator : public BaseGenerator {
code += " default: break;\n";
} else {
auto type_name = GenTypeGet_ObjectAPI(ev.union_type, opts);
code += " case " + Name(enum_def) + "." + Name(ev) +
": _o.Value = serializer.Deserialize<" + type_name +
code += " case " + Name(enum_def) + "." + Name(ev) + ": _o." +
class_member + " = serializer.Deserialize<" + type_name +
">(reader); break;\n";
}
}
@@ -1586,7 +1586,7 @@ class CSharpGenerator : public BaseGenerator {
auto &code = *code_ptr;
std::string varialbe_name = "_o." + camel_name;
std::string class_member = "Value";
if (class_member == camel_name) class_member += "_";
if (class_member == enum_def.name) class_member += "_";
std::string type_suffix = "";
std::string func_suffix = "()";
std::string indent = " ";