|
@@ -902,10 +902,8 @@ bool Parser::ParseMessageField(FieldDescriptorProto* field,
|
|
|
const LocationRecorder& field_location,
|
|
|
const FileDescriptorProto* containing_file) {
|
|
|
{
|
|
|
- LocationRecorder location(field_location,
|
|
|
- FieldDescriptorProto::kLabelFieldNumber);
|
|
|
FieldDescriptorProto::Label label;
|
|
|
- if (ParseLabel(&label, containing_file)) {
|
|
|
+ if (ParseLabel(&label, field_location, containing_file)) {
|
|
|
field->set_label(label);
|
|
|
if (label == FieldDescriptorProto::LABEL_OPTIONAL &&
|
|
|
syntax_identifier_ == "proto3") {
|
|
@@ -2206,18 +2204,22 @@ bool Parser::ParseMethodOptions(const LocationRecorder& parent_location,
|
|
|
// -------------------------------------------------------------------
|
|
|
|
|
|
bool Parser::ParseLabel(FieldDescriptorProto::Label* label,
|
|
|
+ const LocationRecorder& field_location,
|
|
|
const FileDescriptorProto* containing_file) {
|
|
|
+ if (!LookingAt("optional") && !LookingAt("repeated") && !LookingAt("required")) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ LocationRecorder location(field_location,
|
|
|
+ FieldDescriptorProto::kLabelFieldNumber);
|
|
|
if (TryConsume("optional")) {
|
|
|
*label = FieldDescriptorProto::LABEL_OPTIONAL;
|
|
|
- return true;
|
|
|
} else if (TryConsume("repeated")) {
|
|
|
*label = FieldDescriptorProto::LABEL_REPEATED;
|
|
|
- return true;
|
|
|
- } else if (TryConsume("required")) {
|
|
|
+ } else {
|
|
|
+ Consume("required");
|
|
|
*label = FieldDescriptorProto::LABEL_REQUIRED;
|
|
|
- return true;
|
|
|
}
|
|
|
- return false;
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
bool Parser::ParseType(FieldDescriptorProto::Type* type,
|