Эх сурвалжийг харах

Generate a warning for duplicated enum values, when allow_alias option isn't
set.

liujisi@google.com 12 жил өмнө
parent
commit
cb77c4c381

+ 16 - 6
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();
       }

+ 3 - 1
src/google/protobuf/descriptor_unittest.cc

@@ -4001,7 +4001,9 @@ TEST_F(ValidationErrorTest, DisallowEnumAlias) {
     "  options { allow_alias: false }"
     "}",
     "foo.proto: Bar: NUMBER: "
-    "\"ENUM_B\" uses the same enum value as \"ENUM_A\"\n");
+    "\"ENUM_B\" uses the same enum value as \"ENUM_A\". "
+    "If this is intended, set 'option allow_alias = true;' to the enum "
+    "definition.\n");
 }
 
 // ===================================================================

+ 1 - 0
src/google/protobuf/unittest.proto

@@ -434,6 +434,7 @@ message TestNestedMessageHasBits {
 
 // Test an enum that has multiple values with the same number.
 enum TestEnumWithDupValue {
+  option allow_alias = true;
   FOO1 = 1;
   BAR1 = 2;
   BAZ = 3;