mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-02 20:15:34 +00:00
Made user-defined attributes available in the reflection data.
Tested: on Linux. Bug: 27923233 Change-Id: Ic16675650e4a8e138c163f1e2131a3aad7008ada
This commit is contained in:
@@ -1784,7 +1784,7 @@ CheckedError Parser::DoParse(const char *source, const char **include_paths,
|
||||
auto name = attribute_;
|
||||
EXPECT(kTokenStringConstant);
|
||||
EXPECT(';');
|
||||
known_attributes_.insert(name);
|
||||
known_attributes_[name] = false;
|
||||
} else if (token_ == kTokenService) {
|
||||
ECHECK(ParseService());
|
||||
} else {
|
||||
@@ -1853,13 +1853,13 @@ void Parser::Serialize() {
|
||||
AssignIndices(enums_.vec);
|
||||
std::vector<Offset<reflection::Object>> object_offsets;
|
||||
for (auto it = structs_.vec.begin(); it != structs_.vec.end(); ++it) {
|
||||
auto offset = (*it)->Serialize(&builder_);
|
||||
auto offset = (*it)->Serialize(&builder_, *this);
|
||||
object_offsets.push_back(offset);
|
||||
(*it)->serialized_location = offset.o;
|
||||
}
|
||||
std::vector<Offset<reflection::Enum>> enum_offsets;
|
||||
for (auto it = enums_.vec.begin(); it != enums_.vec.end(); ++it) {
|
||||
auto offset = (*it)->Serialize(&builder_);
|
||||
auto offset = (*it)->Serialize(&builder_, *this);
|
||||
enum_offsets.push_back(offset);
|
||||
(*it)->serialized_location = offset.o;
|
||||
}
|
||||
@@ -1875,13 +1875,13 @@ void Parser::Serialize() {
|
||||
builder_.Finish(schema_offset, reflection::SchemaIdentifier());
|
||||
}
|
||||
|
||||
Offset<reflection::Object> StructDef::Serialize(FlatBufferBuilder *builder)
|
||||
const {
|
||||
Offset<reflection::Object> StructDef::Serialize(FlatBufferBuilder *builder,
|
||||
const Parser &parser) const {
|
||||
std::vector<Offset<reflection::Field>> field_offsets;
|
||||
for (auto it = fields.vec.begin(); it != fields.vec.end(); ++it) {
|
||||
field_offsets.push_back(
|
||||
(*it)->Serialize(builder,
|
||||
static_cast<uint16_t>(it - fields.vec.begin())));
|
||||
static_cast<uint16_t>(it - fields.vec.begin()), parser));
|
||||
}
|
||||
return reflection::CreateObject(*builder,
|
||||
builder->CreateString(name),
|
||||
@@ -1889,11 +1889,13 @@ Offset<reflection::Object> StructDef::Serialize(FlatBufferBuilder *builder)
|
||||
&field_offsets),
|
||||
fixed,
|
||||
static_cast<int>(minalign),
|
||||
static_cast<int>(bytesize));
|
||||
static_cast<int>(bytesize),
|
||||
SerializeAttributes(builder, parser));
|
||||
}
|
||||
|
||||
Offset<reflection::Field> FieldDef::Serialize(FlatBufferBuilder *builder,
|
||||
uint16_t id) const {
|
||||
uint16_t id,
|
||||
const Parser &parser) const {
|
||||
return reflection::CreateField(*builder,
|
||||
builder->CreateString(name),
|
||||
value.type.Serialize(builder),
|
||||
@@ -1907,12 +1909,14 @@ Offset<reflection::Field> FieldDef::Serialize(FlatBufferBuilder *builder,
|
||||
: 0.0,
|
||||
deprecated,
|
||||
required,
|
||||
key);
|
||||
key,
|
||||
SerializeAttributes(builder, parser));
|
||||
// TODO: value.constant is almost always "0", we could save quite a bit of
|
||||
// space by sharing it. Same for common values of value.type.
|
||||
}
|
||||
|
||||
Offset<reflection::Enum> EnumDef::Serialize(FlatBufferBuilder *builder) const {
|
||||
Offset<reflection::Enum> EnumDef::Serialize(FlatBufferBuilder *builder,
|
||||
const Parser &parser) const {
|
||||
std::vector<Offset<reflection::EnumVal>> enumval_offsets;
|
||||
for (auto it = vals.vec.begin(); it != vals.vec.end(); ++it) {
|
||||
enumval_offsets.push_back((*it)->Serialize(builder));
|
||||
@@ -1921,7 +1925,8 @@ Offset<reflection::Enum> EnumDef::Serialize(FlatBufferBuilder *builder) const {
|
||||
builder->CreateString(name),
|
||||
builder->CreateVector(enumval_offsets),
|
||||
is_union,
|
||||
underlying_type.Serialize(builder));
|
||||
underlying_type.Serialize(builder),
|
||||
SerializeAttributes(builder, parser));
|
||||
}
|
||||
|
||||
Offset<reflection::EnumVal> EnumVal::Serialize(FlatBufferBuilder *builder) const
|
||||
@@ -1942,4 +1947,26 @@ Offset<reflection::Type> Type::Serialize(FlatBufferBuilder *builder) const {
|
||||
(enum_def ? enum_def->index : -1));
|
||||
}
|
||||
|
||||
flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<
|
||||
reflection::KeyValue>>>
|
||||
Definition::SerializeAttributes(FlatBufferBuilder *builder,
|
||||
const Parser &parser) const {
|
||||
std::vector<flatbuffers::Offset<reflection::KeyValue>> attrs;
|
||||
for (auto kv : attributes.dict) {
|
||||
auto it = parser.known_attributes_.find(kv.first);
|
||||
assert(it != parser.known_attributes_.end());
|
||||
if (!it->second) { // Custom attribute.
|
||||
attrs.push_back(
|
||||
reflection::CreateKeyValue(*builder, builder->CreateString(kv.first),
|
||||
builder->CreateString(
|
||||
kv.second->constant)));
|
||||
}
|
||||
}
|
||||
if (attrs.size()) {
|
||||
return builder->CreateVectorOfSortedTables(&attrs);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace flatbuffers
|
||||
|
||||
Reference in New Issue
Block a user