瀏覽代碼

Merge pull request #2204 from acozzette/enum-names

Do strict enum name checking only for proto3
Adam Cozzette 9 年之前
父節點
當前提交
640c947458
共有 2 個文件被更改,包括 27 次插入9 次删除
  1. 14 5
      src/google/protobuf/descriptor.cc
  2. 13 4
      src/google/protobuf/descriptor_unittest.cc

+ 14 - 5
src/google/protobuf/descriptor.cc

@@ -4707,11 +4707,20 @@ void DescriptorBuilder::CheckEnumValueUniqueness(
     // stripping should de-dup the labels in this case).
     if (!inserted && insert_result.first->second->name() != value->name() &&
         insert_result.first->second->number() != value->number()) {
-      AddError(value->full_name(), proto.value(i),
-               DescriptorPool::ErrorCollector::NAME,
-               "When enum name is stripped and label is PascalCased (" +
-                   stripped + "), this value label conflicts with " +
-                   values[stripped]->name());
+      string error_message =
+          "When enum name is stripped and label is PascalCased (" + stripped +
+          "), this value label conflicts with " + values[stripped]->name() +
+          ". This will make the proto fail to compile for some languages, such "
+          "as C#.";
+      // There are proto2 enums out there with conflicting names, so to preserve
+      // compatibility we issue only a warning for proto2.
+      if (result->file()->syntax() == FileDescriptor::SYNTAX_PROTO2) {
+        AddWarning(value->full_name(), proto.value(i),
+                   DescriptorPool::ErrorCollector::NAME, error_message);
+      } else {
+        AddError(value->full_name(), proto.value(i),
+                 DescriptorPool::ErrorCollector::NAME, error_message);
+      }
     }
   }
 }

+ 13 - 4
src/google/protobuf/descriptor_unittest.cc

@@ -5565,6 +5565,7 @@ TEST_F(ValidationErrorTest, MapEntryConflictsWithEnum) {
 
 TEST_F(ValidationErrorTest, EnumValuesConflictWhenPrefixesStripped) {
   BuildFileWithErrors(
+      "syntax: 'proto3'"
       "name: 'foo.proto' "
       "enum_type {"
       "  name: 'FooEnum' "
@@ -5572,9 +5573,11 @@ TEST_F(ValidationErrorTest, EnumValuesConflictWhenPrefixesStripped) {
       "  value { name: 'BAZ' number: 1 }"
       "}",
       "foo.proto: BAZ: NAME: When enum name is stripped and label is "
-      "PascalCased (Baz), this value label conflicts with FOO_ENUM_BAZ\n");
+      "PascalCased (Baz), this value label conflicts with FOO_ENUM_BAZ. This "
+      "will make the proto fail to compile for some languages, such as C#.\n");
 
   BuildFileWithErrors(
+      "syntax: 'proto3'"
       "name: 'foo.proto' "
       "enum_type {"
       "  name: 'FooEnum' "
@@ -5582,9 +5585,11 @@ TEST_F(ValidationErrorTest, EnumValuesConflictWhenPrefixesStripped) {
       "  value { name: 'BAZ' number: 1 }"
       "}",
       "foo.proto: BAZ: NAME: When enum name is stripped and label is "
-      "PascalCased (Baz), this value label conflicts with FOOENUM_BAZ\n");
+      "PascalCased (Baz), this value label conflicts with FOOENUM_BAZ. This "
+      "will make the proto fail to compile for some languages, such as C#.\n");
 
   BuildFileWithErrors(
+      "syntax: 'proto3'"
       "name: 'foo.proto' "
       "enum_type {"
       "  name: 'FooEnum' "
@@ -5593,9 +5598,11 @@ TEST_F(ValidationErrorTest, EnumValuesConflictWhenPrefixesStripped) {
       "}",
       "foo.proto: BAR__BAZ: NAME: When enum name is stripped and label is "
       "PascalCased (BarBaz), this value label conflicts with "
-      "FOO_ENUM_BAR_BAZ\n");
+      "FOO_ENUM_BAR_BAZ. This "
+      "will make the proto fail to compile for some languages, such as C#.\n");
 
   BuildFileWithErrors(
+      "syntax: 'proto3'"
       "name: 'foo.proto' "
       "enum_type {"
       "  name: 'FooEnum' "
@@ -5604,11 +5611,13 @@ TEST_F(ValidationErrorTest, EnumValuesConflictWhenPrefixesStripped) {
       "}",
       "foo.proto: BAR_BAZ: NAME: When enum name is stripped and label is "
       "PascalCased (BarBaz), this value label conflicts with "
-      "FOO_ENUM__BAR_BAZ\n");
+      "FOO_ENUM__BAR_BAZ. This "
+      "will make the proto fail to compile for some languages, such as C#.\n");
 
   // This isn't an error because the underscore will cause the PascalCase to
   // differ by case (BarBaz vs. Barbaz).
   BuildFile(
+      "syntax: 'proto3'"
       "name: 'foo.proto' "
       "enum_type {"
       "  name: 'FooEnum' "