aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Cozzette <acozzette@google.com>2016-09-29 14:29:23 -0700
committerAdam Cozzette <acozzette@google.com>2016-10-04 07:19:54 -0700
commit149659b72a61ea6f1c537ef8741be50b6826cb91 (patch)
tree6d596e010963156fa822cf5adc2fb5dfcc479a6b
parent858db7a202a36c57aeed998ef088a03cae48e582 (diff)
downloadprotobuf-149659b72a61ea6f1c537ef8741be50b6826cb91.tar.gz
protobuf-149659b72a61ea6f1c537ef8741be50b6826cb91.tar.bz2
protobuf-149659b72a61ea6f1c537ef8741be50b6826cb91.zip
Do strict enum name checking only for proto3
There seem to already be .proto files out there that have conflicting enum names, which will not be able to build successfully for some languages (like C#). To prevent this problem from spreading, let's make it an error for proto3 but just issue a warning for proto2. This fixes issue #2179.
-rw-r--r--src/google/protobuf/descriptor.cc19
-rw-r--r--src/google/protobuf/descriptor_unittest.cc17
2 files changed, 27 insertions, 9 deletions
diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc
index 4dccb585..be1e1d69 100644
--- a/src/google/protobuf/descriptor.cc
+++ b/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);
+ }
}
}
}
diff --git a/src/google/protobuf/descriptor_unittest.cc b/src/google/protobuf/descriptor_unittest.cc
index 07953416..f6b3f1c5 100644
--- a/src/google/protobuf/descriptor_unittest.cc
+++ b/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' "