Add support for parsing proto map fields (#7613)

* Add support for proto 3 map to fbs gen

* Run clang-format

* Update proto golden test

* Rename variables

* Remove iostream

* Remove iostream

* Run clang format

Co-authored-by: Derek Bailey <derekbailey@google.com>
This commit is contained in:
Michael Le
2022-11-08 10:51:24 -08:00
committed by GitHub
parent dbc58ab77c
commit 001adf782d
12 changed files with 143 additions and 3 deletions

View File

@@ -507,6 +507,8 @@ CheckedError Parser::Next() {
case ')':
case '[':
case ']':
case '<':
case '>':
case ',':
case ':':
case ';':
@@ -2896,6 +2898,8 @@ CheckedError Parser::ParseProtoFields(StructDef *struct_def, bool isextend,
NEXT();
while (!Is(';')) { NEXT(); } // A variety of formats, just skip.
NEXT();
} else if (IsIdent("map")) {
ECHECK(ParseProtoMapField(struct_def));
} else {
std::vector<std::string> field_comment = doc_comment_;
// Parse the qualifier.
@@ -3030,6 +3034,41 @@ CheckedError Parser::ParseProtoFields(StructDef *struct_def, bool isextend,
return NoError();
}
CheckedError Parser::ParseProtoMapField(StructDef *struct_def) {
NEXT();
EXPECT('<');
Type key_type;
ECHECK(ParseType(key_type));
EXPECT(',');
Type value_type;
ECHECK(ParseType(value_type));
EXPECT('>');
auto field_name = attribute_;
NEXT();
EXPECT('=');
EXPECT(kTokenIntegerConstant);
EXPECT(';');
auto entry_table_name = ConvertCase(field_name, Case::kUpperCamel) + "Entry";
StructDef *entry_table;
ECHECK(StartStruct(entry_table_name, &entry_table));
entry_table->has_key = true;
FieldDef *key_field;
ECHECK(AddField(*entry_table, "key", key_type, &key_field));
key_field->key = true;
FieldDef *value_field;
ECHECK(AddField(*entry_table, "value", value_type, &value_field));
Type field_type;
field_type.base_type = BASE_TYPE_VECTOR;
field_type.element = BASE_TYPE_STRUCT;
field_type.struct_def = entry_table;
FieldDef *field;
ECHECK(AddField(*struct_def, field_name, field_type, &field));
return NoError();
}
CheckedError Parser::ParseProtoKey() {
if (token_ == '(') {
NEXT();