|
|
|
@ -4132,16 +4132,26 @@ void DescriptorBuilder::ValidateFieldOptions(FieldDescriptor* field, |
|
|
|
|
void DescriptorBuilder::ValidateEnumOptions(EnumDescriptor* enm, |
|
|
|
|
const EnumDescriptorProto& proto) { |
|
|
|
|
VALIDATE_OPTIONS_FROM_ARRAY(enm, value, EnumValue); |
|
|
|
|
if (!enm->options().allow_alias()) { |
|
|
|
|
if (!enm->options().has_allow_alias() || !enm->options().allow_alias()) { |
|
|
|
|
map<int, string> used_values; |
|
|
|
|
for (int i = 0; i < enm->value_count(); ++i) { |
|
|
|
|
const EnumValueDescriptor* enum_value = enm->value(i); |
|
|
|
|
if (used_values.find(enum_value->number()) != used_values.end()) { |
|
|
|
|
AddError(enm->full_name(), proto, |
|
|
|
|
DescriptorPool::ErrorCollector::NUMBER, |
|
|
|
|
"\"" + enum_value->full_name() + |
|
|
|
|
"\" uses the same enum value as \"" + |
|
|
|
|
used_values[enum_value->number()] + "\""); |
|
|
|
|
string error = |
|
|
|
|
"\"" + enum_value->full_name() + |
|
|
|
|
"\" uses the same enum value as \"" + |
|
|
|
|
used_values[enum_value->number()] + "\". If this is intended, set " |
|
|
|
|
"'option allow_alias = true;' to the enum definition."; |
|
|
|
|
if (!enm->options().allow_alias()) { |
|
|
|
|
// Generate error if duplicated enum values are explicitly disallowed.
|
|
|
|
|
AddError(enm->full_name(), proto, |
|
|
|
|
DescriptorPool::ErrorCollector::NUMBER, |
|
|
|
|
error); |
|
|
|
|
} else { |
|
|
|
|
// Generate warning if duplicated values are found but the option
|
|
|
|
|
// isn't set.
|
|
|
|
|
GOOGLE_LOG(ERROR) << error; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
used_values[enum_value->number()] = enum_value->full_name(); |
|
|
|
|
} |
|
|
|
|