|
@@ -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();
|
|
|
}
|