reflect/protodesc: only check enum dependency syntax if resolved

For proto3 messages with an enum field that could not be resolved,
do not check the syntax of that enum dependency.

Change-Id: I7c646539351edc35243ab950d335f4018cc4c0e9
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/186001
Reviewed-by: Damien Neil <dneil@google.com>
This commit is contained in:
Joe Tsai 2019-07-12 17:27:43 -07:00
parent e182c917f0
commit 67da21c7ab
2 changed files with 15 additions and 1 deletions

View File

@ -159,7 +159,7 @@ func validateMessageDeclarations(ms []filedesc.Message, mds []*descriptorpb.Desc
if f.Cardinality() == protoreflect.Required {
return errors.New("message field %q using proto3 semantics cannot be required", f.FullName())
}
if f.Enum() != nil && f.Enum().Syntax() != protoreflect.Proto3 {
if f.Enum() != nil && !f.Enum().IsPlaceholder() && f.Enum().Syntax() != protoreflect.Proto3 {
return errors.New("message field %q using proto3 semantics may only depend on a proto3 enum", f.FullName())
}
}

View File

@ -831,6 +831,20 @@ func TestNewFile(t *testing.T) {
]
}]}]
`),
}, {
label: "proto3 message with unresolved enum",
inDesc: mustParseFile(`
name: "test.proto"
package: ""
syntax: "proto3"
message_type: [{
name: "M"
field: [
{name:"enum" number:1 label:LABEL_OPTIONAL type:TYPE_ENUM type_name:".fizz.buzz.Enum"}
]
}]
`),
inOpts: []option{allowUnresolvable()},
// TODO: Test field and oneof handling in validateMessageDeclarations
// TODO: Test unmarshalDefault
// TODO: Test validateExtensionDeclarations