aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google/protobuf/descriptor.cc
diff options
context:
space:
mode:
authorGravatar liujisi@google.com <liujisi@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2012-12-28 23:41:54 +0000
committerGravatar liujisi@google.com <liujisi@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2012-12-28 23:41:54 +0000
commitcb77c4c381ea36e1de8ee947b564424c573fa279 (patch)
tree8b5d6db5cf5beddb5845dfd0c119ef5166f57f0e /src/google/protobuf/descriptor.cc
parent4770277ec7a285f0f96e9a88af9d4992b7f4b50b (diff)
Generate a warning for duplicated enum values, when allow_alias option isn't
set.
Diffstat (limited to 'src/google/protobuf/descriptor.cc')
-rw-r--r--src/google/protobuf/descriptor.cc22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc
index f808b833..c941aacc 100644
--- a/src/google/protobuf/descriptor.cc
+++ b/src/google/protobuf/descriptor.cc
@@ -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();
}