mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-15 08:48:52 +00:00
Support for required fields.
Change-Id: I560c7ca11b3d665eecafb528f3737b7e139ca9b0 Tested: on Linux and Windows.
This commit is contained in:
@@ -225,7 +225,9 @@ static void GenTable(const Parser &parser, StructDef &struct_def,
|
||||
++it) {
|
||||
auto &field = **it;
|
||||
if (!field.deprecated) {
|
||||
code += prefix + "VerifyField<" + GenTypeSize(parser, field.value.type);
|
||||
code += prefix + "VerifyField";
|
||||
if (field.required) code += "Required";
|
||||
code += "<" + GenTypeSize(parser, field.value.type);
|
||||
code += ">(verifier, " + NumToString(field.value.offset);
|
||||
code += " /* " + field.name + " */)";
|
||||
switch (field.value.type.base_type) {
|
||||
@@ -301,9 +303,19 @@ static void GenTable(const Parser &parser, StructDef &struct_def,
|
||||
code += " " + struct_def.name + "Builder &operator=(const ";
|
||||
code += struct_def.name + "Builder &);\n";
|
||||
code += " flatbuffers::Offset<" + struct_def.name;
|
||||
code += "> Finish() { return flatbuffers::Offset<" + struct_def.name;
|
||||
code += "> Finish() {\n auto o = flatbuffers::Offset<" + struct_def.name;
|
||||
code += ">(fbb_.EndTable(start_, ";
|
||||
code += NumToString(struct_def.fields.vec.size()) + ")); }\n};\n\n";
|
||||
code += NumToString(struct_def.fields.vec.size()) + "));\n";
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end();
|
||||
++it) {
|
||||
auto &field = **it;
|
||||
if (!field.deprecated && field.required) {
|
||||
code += " fbb_.Required(o, " + NumToString(field.value.offset);
|
||||
code += "); // " + field.name + "\n";
|
||||
}
|
||||
}
|
||||
code += " return o;\n }\n};\n\n";
|
||||
|
||||
// Generate a convenient CreateX function that uses the above builder
|
||||
// to create a table in one go.
|
||||
|
||||
@@ -554,8 +554,19 @@ static void GenStruct(const LanguageParameters &lang, const Parser &parser,
|
||||
}
|
||||
code += " public static int ";
|
||||
code += FunctionStart(lang, 'E') + "nd" + struct_def.name;
|
||||
code += "(FlatBufferBuilder builder) { return builder.";
|
||||
code += FunctionStart(lang, 'E') + "ndObject(); }\n";
|
||||
code += "(FlatBufferBuilder builder) {\n int o = builder.";
|
||||
code += FunctionStart(lang, 'E') + "ndObject();\n";
|
||||
for (auto it = struct_def.fields.vec.begin();
|
||||
it != struct_def.fields.vec.end();
|
||||
++it) {
|
||||
auto &field = **it;
|
||||
if (!field.deprecated && field.required) {
|
||||
code += " builder." + FunctionStart(lang, 'R') + "equired(o, ";
|
||||
code += NumToString(field.value.offset);
|
||||
code += "); // " + field.name + "\n";
|
||||
}
|
||||
}
|
||||
code += " return o;\n }\n";
|
||||
if (parser.root_struct_def == &struct_def) {
|
||||
code += " public static void ";
|
||||
code += FunctionStart(lang, 'F') + "inish" + struct_def.name;
|
||||
|
||||
@@ -376,6 +376,10 @@ void Parser::ParseField(StructDef &struct_def) {
|
||||
field.deprecated = field.attributes.Lookup("deprecated") != nullptr;
|
||||
if (field.deprecated && struct_def.fixed)
|
||||
Error("can't deprecate fields in a struct");
|
||||
field.required = field.attributes.Lookup("required") != nullptr;
|
||||
if (field.required && (struct_def.fixed ||
|
||||
IsScalar(field.value.type.base_type)))
|
||||
Error("only non-scalar fields in tables may be 'required'");
|
||||
auto nested = field.attributes.Lookup("nested_flatbuffer");
|
||||
if (nested) {
|
||||
if (nested->type.base_type != BASE_TYPE_STRING)
|
||||
|
||||
Reference in New Issue
Block a user