diff --git a/include/flatbuffers/idl.h b/include/flatbuffers/idl.h index b564b1b27..cd70cb612 100644 --- a/include/flatbuffers/idl.h +++ b/include/flatbuffers/idl.h @@ -297,7 +297,8 @@ struct FieldDef : public Definition { flexbuffer(false), presence(kDefault), nested_flatbuffer(nullptr), - padding(0) {} + padding(0), + sibling_union_field(nullptr){} Offset Serialize(FlatBufferBuilder *builder, uint16_t id, const Parser &parser) const; @@ -342,6 +343,12 @@ struct FieldDef : public Definition { StructDef *nested_flatbuffer; // This field contains nested FlatBuffer data. size_t padding; // Bytes to always pad after this field. + + // sibling_union_field is always set to nullptr. The only exception is + // when FieldDef is a union field or an union type field. Therefore, + // sibling_union_field on a union field points to the union type field + // and vice-versa. + FieldDef *sibling_union_field; }; struct StructDef : public Definition { diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp index 9650cc9dd..360f0c744 100644 --- a/src/idl_parser.cpp +++ b/src/idl_parser.cpp @@ -970,6 +970,14 @@ CheckedError Parser::ParseField(StructDef &struct_def) { FieldDef *field; ECHECK(AddField(struct_def, name, type, &field)); + if (typefield) { + // We preserve the relation between the typefield + // and field, so we can easily map it in the code + // generators. + typefield->sibling_union_field = field; + field->sibling_union_field = typefield; + } + if (token_ == '=') { NEXT(); ECHECK(ParseSingleValue(&field->name, field->value, true));