summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorstefan301 <32997632+stefan301@users.noreply.github.com>2020-03-23 17:39:26 +0100
committerGitHub <noreply@github.com>2020-03-23 09:39:26 -0700
commit3af73593453d70585542aad617f62e4f041b6ada (patch)
treeb627b45f40df5caa2cdf9ca0ae27f33b9ea99d1f /src
parentc4231c3cb99159978ca5f0669a07ef1aa02b88e3 (diff)
downloadflatbuffers-3af73593453d70585542aad617f62e4f041b6ada.tar.gz
flatbuffers-3af73593453d70585542aad617f62e4f041b6ada.tar.bz2
flatbuffers-3af73593453d70585542aad617f62e4f041b6ada.zip
[csharp] flatc should generate a 'Create…' method for tables with struct field… (#5818)
* flatc should generate a 'Create…' method for tables with struct fields when also generating the object based api (C#) https://stackoverflow.com/questions/60724317/flatc-should-generate-a-create-method-for-tables-with-struct-fields-when-al * missing namespace fixed: C:\projects\flatbuffers\tests\namespace_test\NamespaceA\TableInFirstNS.cs(30,7): error CS0246: The type or namespace name 'StructInNestedNST' could not be found (are you missing a using directive or an assembly reference?) [C:\projects\flatbuffers\tests\FlatBuffers.Test\FlatBuffers.Test.csproj] Co-authored-by: stefan301 <Stefan.Felkel@de.Zuken.com>
Diffstat (limited to 'src')
-rw-r--r--src/idl_gen_csharp.cpp43
1 files changed, 32 insertions, 11 deletions
diff --git a/src/idl_gen_csharp.cpp b/src/idl_gen_csharp.cpp
index 7db40fab..0bcd132c 100644
--- a/src/idl_gen_csharp.cpp
+++ b/src/idl_gen_csharp.cpp
@@ -947,7 +947,8 @@ class CSharpGenerator : public BaseGenerator {
}
// JVM specifications restrict default constructor params to be < 255.
// Longs and doubles take up 2 units, so we set the limit to be < 127.
- if (has_no_struct_fields && num_fields && num_fields < 127) {
+ if ((has_no_struct_fields || opts.generate_object_based_api) &&
+ num_fields && num_fields < 127) {
struct_has_create = true;
// Generate a table constructor of the form:
// public static int createName(FlatBufferBuilder builder, args...)
@@ -959,13 +960,22 @@ class CSharpGenerator : public BaseGenerator {
auto &field = **it;
if (field.deprecated) continue;
code += ",\n ";
- code += GenTypeBasic(field.value.type);
- code += " ";
- code += field.name;
- if (!IsScalar(field.value.type.base_type)) code += "Offset";
+ if (IsStruct(field.value.type) && opts.generate_object_based_api) {
+ code += WrapInNameSpace(
+ field.value.type.struct_def->defined_namespace,
+ GenTypeName_ObjectAPI(field.value.type.struct_def->name, opts));
+ code += " ";
+ code += field.name;
+ code += " = null";
+ } else {
+ code += GenTypeBasic(field.value.type);
+ code += " ";
+ code += field.name;
+ if (!IsScalar(field.value.type.base_type)) code += "Offset";
- code += " = ";
- code += GenDefaultValueBasic(field);
+ code += " = ";
+ code += GenDefaultValueBasic(field);
+ }
}
code += ") {\n builder.";
code += "StartTable(";
@@ -980,8 +990,16 @@ class CSharpGenerator : public BaseGenerator {
size == SizeOf(field.value.type.base_type))) {
code += " " + struct_def.name + ".";
code += "Add";
- code += MakeCamel(field.name) + "(builder, " + field.name;
- if (!IsScalar(field.value.type.base_type)) code += "Offset";
+ code += MakeCamel(field.name) + "(builder, ";
+ if (IsStruct(field.value.type) &&
+ opts.generate_object_based_api) {
+ code += GenTypePointer(field.value.type) + ".Pack(builder, " +
+ field.name + ")";
+ } else {
+ code += field.name;
+ if (!IsScalar(field.value.type.base_type)) code += "Offset";
+ }
+
code += ");\n";
}
}
@@ -1643,8 +1661,11 @@ class CSharpGenerator : public BaseGenerator {
} else {
code += ",\n";
if (field.value.type.struct_def->fixed) {
- code += " " + GenTypeGet(field.value.type) +
- ".Pack(builder, _o." + camel_name + ")";
+ if (opts.generate_object_based_api)
+ code += " _o." + camel_name;
+ else
+ code += " " + GenTypeGet(field.value.type) +
+ ".Pack(builder, _o." + camel_name + ")";
} else {
code += " _" + field.name;
}