all: rename IsInitialized as CheckInitialized

An Is prefix implies it returns a boolean.
A Check prefix better suggests that it could return an error.

Change-Id: I6ffcb32099a944c656c07654c294a0980efb2d0e
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/220338
Reviewed-by: Damien Neil <dneil@google.com>
This commit is contained in:
Joe Tsai 2020-02-20 10:05:37 -08:00 committed by Joe Tsai
parent 5e75048cc1
commit f26a9e7e30
17 changed files with 56 additions and 51 deletions

View File

@ -75,7 +75,7 @@ func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error {
if o.AllowPartial { if o.AllowPartial {
return nil return nil
} }
return proto.IsInitialized(m) return proto.CheckInitialized(m)
} }
type decoder struct { type decoder struct {

View File

@ -123,7 +123,7 @@ func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) {
if o.AllowPartial { if o.AllowPartial {
return enc.Bytes(), nil return enc.Bytes(), nil
} }
return enc.Bytes(), proto.IsInitialized(m) return enc.Bytes(), proto.CheckInitialized(m)
} }
type encoder struct { type encoder struct {

View File

@ -66,7 +66,7 @@ func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error {
if o.AllowPartial { if o.AllowPartial {
return nil return nil
} }
return proto.IsInitialized(m) return proto.CheckInitialized(m)
} }
type decoder struct { type decoder struct {

View File

@ -118,7 +118,7 @@ func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) {
if o.AllowPartial { if o.AllowPartial {
return out, nil return out, nil
} }
return out, proto.IsInitialized(m) return out, proto.CheckInitialized(m)
} }
type encoder struct { type encoder struct {

View File

@ -39,7 +39,7 @@ func Fuzz(data []byte) (score int) {
default: default:
panic("unmarshal ok with validation status: " + valid.String()) panic("unmarshal ok with validation status: " + valid.String())
} }
if proto.IsInitialized(m1) != nil && vinit { if proto.CheckInitialized(m1) != nil && vinit {
panic("validation reports partial message is initialized") panic("validation reports partial message is initialized")
} }
data1, err := proto.MarshalOptions{ data1, err := proto.MarshalOptions{

View File

@ -12,17 +12,17 @@ import (
piface "google.golang.org/protobuf/runtime/protoiface" piface "google.golang.org/protobuf/runtime/protoiface"
) )
func (mi *MessageInfo) isInitialized(in piface.IsInitializedInput) (piface.IsInitializedOutput, error) { func (mi *MessageInfo) checkInitialized(in piface.CheckInitializedInput) (piface.CheckInitializedOutput, error) {
var p pointer var p pointer
if ms, ok := in.Message.(*messageState); ok { if ms, ok := in.Message.(*messageState); ok {
p = ms.pointer() p = ms.pointer()
} else { } else {
p = in.Message.(*messageReflectWrapper).pointer() p = in.Message.(*messageReflectWrapper).pointer()
} }
return piface.IsInitializedOutput{}, mi.isInitializedPointer(p) return piface.CheckInitializedOutput{}, mi.checkInitializedPointer(p)
} }
func (mi *MessageInfo) isInitializedPointer(p pointer) error { func (mi *MessageInfo) checkInitializedPointer(p pointer) error {
mi.init() mi.init()
if !mi.needsInitCheck { if !mi.needsInitCheck {
return nil return nil

View File

@ -167,7 +167,7 @@ func makeWeakMessageFieldCoder(fd pref.FieldDescriptor) pointerCoderFuncs {
if !ok { if !ok {
return nil return nil
} }
return proto.IsInitialized(m) return proto.CheckInitialized(m)
}, },
merge: func(dst, src pointer, f *coderFieldInfo, opts mergeOptions) { merge: func(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {
sm, ok := src.WeakFields().get(f.num) sm, ok := src.WeakFields().get(f.num)
@ -219,7 +219,7 @@ func makeMessageFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCode
}, },
isInit: func(p pointer, f *coderFieldInfo) error { isInit: func(p pointer, f *coderFieldInfo) error {
m := asMessage(p.AsValueOf(ft).Elem()) m := asMessage(p.AsValueOf(ft).Elem())
return proto.IsInitialized(m) return proto.CheckInitialized(m)
}, },
merge: mergeMessage, merge: mergeMessage,
} }
@ -257,7 +257,7 @@ func consumeMessageInfo(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo,
} }
func isInitMessageInfo(p pointer, f *coderFieldInfo) error { func isInitMessageInfo(p pointer, f *coderFieldInfo) error {
return f.mi.isInitializedPointer(p.Elem()) return f.mi.checkInitializedPointer(p.Elem())
} }
func sizeMessage(m proto.Message, tagsize int, _ marshalOptions) int { func sizeMessage(m proto.Message, tagsize int, _ marshalOptions) int {
@ -307,7 +307,7 @@ func consumeMessageValue(b []byte, v pref.Value, _ wire.Number, wtyp wire.Type,
func isInitMessageValue(v pref.Value) error { func isInitMessageValue(v pref.Value) error {
m := v.Message().Interface() m := v.Message().Interface()
return proto.IsInitialized(m) return proto.CheckInitialized(m)
} }
var coderMessageValue = valueCoderFuncs{ var coderMessageValue = valueCoderFuncs{
@ -374,7 +374,7 @@ func makeGroupFieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderF
}, },
isInit: func(p pointer, f *coderFieldInfo) error { isInit: func(p pointer, f *coderFieldInfo) error {
m := asMessage(p.AsValueOf(ft).Elem()) m := asMessage(p.AsValueOf(ft).Elem())
return proto.IsInitialized(m) return proto.CheckInitialized(m)
}, },
merge: mergeMessage, merge: mergeMessage,
} }
@ -509,7 +509,7 @@ func consumeMessageSliceInfo(b []byte, p pointer, wtyp wire.Type, f *coderFieldI
func isInitMessageSliceInfo(p pointer, f *coderFieldInfo) error { func isInitMessageSliceInfo(p pointer, f *coderFieldInfo) error {
s := p.PointerSlice() s := p.PointerSlice()
for _, v := range s { for _, v := range s {
if err := f.mi.isInitializedPointer(v); err != nil { if err := f.mi.checkInitializedPointer(v); err != nil {
return err return err
} }
} }
@ -567,7 +567,7 @@ func isInitMessageSlice(p pointer, goType reflect.Type) error {
s := p.PointerSlice() s := p.PointerSlice()
for _, v := range s { for _, v := range s {
m := asMessage(v.AsValueOf(goType.Elem())) m := asMessage(v.AsValueOf(goType.Elem()))
if err := proto.IsInitialized(m); err != nil { if err := proto.CheckInitialized(m); err != nil {
return err return err
} }
} }
@ -629,7 +629,7 @@ func isInitMessageSliceValue(listv pref.Value) error {
list := listv.List() list := listv.List()
for i, llen := 0, list.Len(); i < llen; i++ { for i, llen := 0, list.Len(); i < llen; i++ {
m := list.Get(i).Message().Interface() m := list.Get(i).Message().Interface()
if err := proto.IsInitialized(m); err != nil { if err := proto.CheckInitialized(m); err != nil {
return err return err
} }
} }

View File

@ -320,7 +320,7 @@ func isInitMap(mapv reflect.Value, mapi *mapInfo, f *coderFieldInfo) error {
iter := mapRange(mapv) iter := mapRange(mapv)
for iter.Next() { for iter.Next() {
val := pointerOfValue(iter.Value()) val := pointerOfValue(iter.Value())
if err := mi.isInitializedPointer(val); err != nil { if err := mi.checkInitializedPointer(val); err != nil {
return err return err
} }
} }

View File

@ -148,8 +148,8 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) {
mi.methods.Flags |= piface.SupportUnmarshalDiscardUnknown mi.methods.Flags |= piface.SupportUnmarshalDiscardUnknown
mi.methods.Unmarshal = mi.unmarshal mi.methods.Unmarshal = mi.unmarshal
} }
if mi.methods.IsInitialized == nil { if mi.methods.CheckInitialized == nil {
mi.methods.IsInitialized = mi.isInitialized mi.methods.CheckInitialized = mi.checkInitialized
} }
if mi.methods.Merge == nil { if mi.methods.Merge == nil {
mi.methods.Merge = mi.merge mi.methods.Merge = mi.merge

View File

@ -10,23 +10,28 @@ import (
"google.golang.org/protobuf/runtime/protoiface" "google.golang.org/protobuf/runtime/protoiface"
) )
// IsInitialized returns an error if any required fields in m are not set. // Deprecated: Use CheckInitialized instead.
func IsInitialized(m Message) error { func IsInitialized(m Message) error {
return isInitialized(m.ProtoReflect()) return CheckInitialized(m)
} }
// IsInitialized returns an error if any required fields in m are not set. // CheckInitialized returns an error if any required fields in m are not set.
func isInitialized(m protoreflect.Message) error { func CheckInitialized(m Message) error {
if methods := protoMethods(m); methods != nil && methods.IsInitialized != nil { return checkInitialized(m.ProtoReflect())
_, err := methods.IsInitialized(protoiface.IsInitializedInput{ }
// CheckInitialized returns an error if any required fields in m are not set.
func checkInitialized(m protoreflect.Message) error {
if methods := protoMethods(m); methods != nil && methods.CheckInitialized != nil {
_, err := methods.CheckInitialized(protoiface.CheckInitializedInput{
Message: m, Message: m,
}) })
return err return err
} }
return isInitializedSlow(m) return checkInitializedSlow(m)
} }
func isInitializedSlow(m protoreflect.Message) error { func checkInitializedSlow(m protoreflect.Message) error {
md := m.Descriptor() md := m.Descriptor()
fds := md.Fields() fds := md.Fields()
for i, nums := 0, md.RequiredNumbers(); i < nums.Len(); i++ { for i, nums := 0, md.RequiredNumbers(); i < nums.Len(); i++ {
@ -43,21 +48,21 @@ func isInitializedSlow(m protoreflect.Message) error {
return true return true
} }
for i, list := 0, v.List(); i < list.Len() && err == nil; i++ { for i, list := 0, v.List(); i < list.Len() && err == nil; i++ {
err = isInitialized(list.Get(i).Message()) err = checkInitialized(list.Get(i).Message())
} }
case fd.IsMap(): case fd.IsMap():
if fd.MapValue().Message() == nil { if fd.MapValue().Message() == nil {
return true return true
} }
v.Map().Range(func(key protoreflect.MapKey, v protoreflect.Value) bool { v.Map().Range(func(key protoreflect.MapKey, v protoreflect.Value) bool {
err = isInitialized(v.Message()) err = checkInitialized(v.Message())
return err == nil return err == nil
}) })
default: default:
if fd.Message() == nil { if fd.Message() == nil {
return true return true
} }
err = isInitialized(v.Message()) err = checkInitialized(v.Message())
} }
return err == nil return err == nil
}) })

View File

@ -17,7 +17,7 @@ import (
weakpb "google.golang.org/protobuf/internal/testprotos/test/weak1" weakpb "google.golang.org/protobuf/internal/testprotos/test/weak1"
) )
func TestIsInitializedErrors(t *testing.T) { func TestCheckInitializedErrors(t *testing.T) {
type test struct { type test struct {
m proto.Message m proto.Message
want string want string
@ -76,13 +76,13 @@ func TestIsInitializedErrors(t *testing.T) {
t.SkipNow() t.SkipNow()
} }
err := proto.IsInitialized(tt.m) err := proto.CheckInitialized(tt.m)
got := "<nil>" got := "<nil>"
if err != nil { if err != nil {
got = fmt.Sprintf("%q", err) got = fmt.Sprintf("%q", err)
} }
if !strings.Contains(got, tt.want) { if !strings.Contains(got, tt.want) {
t.Errorf("IsInitialized(m):\n got: %v\nwant contains: %v\nMessage:\n%v", got, tt.want, prototext.Format(tt.m)) t.Errorf("CheckInitialized(m):\n got: %v\nwant contains: %v\nMessage:\n%v", got, tt.want, prototext.Format(tt.m))
} }
}) })
} }

View File

@ -95,7 +95,7 @@ func (o UnmarshalOptions) unmarshal(b []byte, message Message) (out protoiface.U
if allowPartial || (out.Flags&protoiface.UnmarshalInitialized != 0) { if allowPartial || (out.Flags&protoiface.UnmarshalInitialized != 0) {
return out, nil return out, nil
} }
return out, isInitialized(m) return out, checkInitialized(m)
} }
func (o UnmarshalOptions) unmarshalMessage(b []byte, m protoreflect.Message) error { func (o UnmarshalOptions) unmarshalMessage(b []byte, m protoreflect.Message) error {

View File

@ -43,7 +43,7 @@
// //
// • Reset clears the content of a message. // • Reset clears the content of a message.
// //
// • IsInitialized reports whether all required fields in a message are set. // • CheckInitialized reports whether all required fields in a message are set.
// //
// //
// Optional scalar constructors // Optional scalar constructors

View File

@ -136,7 +136,7 @@ func (o MarshalOptions) marshal(b []byte, message Message) (out protoiface.Marsh
if allowPartial { if allowPartial {
return out, nil return out, nil
} }
return out, isInitialized(m) return out, checkInitialized(m)
} }
func (o MarshalOptions) marshalMessage(b []byte, m protoreflect.Message) ([]byte, error) { func (o MarshalOptions) marshalMessage(b []byte, m protoreflect.Message) ([]byte, error) {

View File

@ -131,7 +131,7 @@ func TestSelfMarshalerWithDescriptor(t *testing.T) {
} }
} }
func TestDecodeFastIsInitialized(t *testing.T) { func TestDecodeFastCheckInitialized(t *testing.T) {
for _, test := range testValidMessages { for _, test := range testValidMessages {
if !test.checkFastInit { if !test.checkFastInit {
continue continue

View File

@ -22,7 +22,7 @@ type (
Marshal func(marshalInput) (marshalOutput, error) Marshal func(marshalInput) (marshalOutput, error)
Unmarshal func(unmarshalInput) (unmarshalOutput, error) Unmarshal func(unmarshalInput) (unmarshalOutput, error)
Merge func(mergeInput) mergeOutput Merge func(mergeInput) mergeOutput
IsInitialized func(isInitializedInput) (isInitializedOutput, error) CheckInitialized func(checkInitializedInput) (checkInitializedOutput, error)
} }
supportFlags = uint64 supportFlags = uint64
sizeInput = struct { sizeInput = struct {
@ -67,11 +67,11 @@ type (
pragma.NoUnkeyedLiterals pragma.NoUnkeyedLiterals
Flags uint8 Flags uint8
} }
isInitializedInput = struct { checkInitializedInput = struct {
pragma.NoUnkeyedLiterals pragma.NoUnkeyedLiterals
Message Message Message Message
} }
isInitializedOutput = struct { checkInitializedOutput = struct {
pragma.NoUnkeyedLiterals pragma.NoUnkeyedLiterals
} }
) )

View File

@ -37,8 +37,8 @@ type Methods = struct {
// Merge merges the contents of a source message into a destination message. // Merge merges the contents of a source message into a destination message.
Merge func(MergeInput) MergeOutput Merge func(MergeInput) MergeOutput
// IsInitialized returns an error if any required fields in the message are not set. // CheckInitialized returns an error if any required fields in the message are not set.
IsInitialized func(IsInitializedInput) (IsInitializedOutput, error) CheckInitialized func(CheckInitializedInput) (CheckInitializedOutput, error)
} }
// SupportFlags indicate support for optional features. // SupportFlags indicate support for optional features.
@ -154,14 +154,14 @@ const (
MergeComplete MergeOutputFlags = 1 << iota MergeComplete MergeOutputFlags = 1 << iota
) )
// IsInitializedInput is input to the IsInitialized method. // CheckInitializedInput is input to the CheckInitialized method.
type IsInitializedInput = struct { type CheckInitializedInput = struct {
pragma.NoUnkeyedLiterals pragma.NoUnkeyedLiterals
Message protoreflect.Message Message protoreflect.Message
} }
// IsInitializedOutput is output from the IsInitialized method. // CheckInitializedOutput is output from the CheckInitialized method.
type IsInitializedOutput = struct { type CheckInitializedOutput = struct {
pragma.NoUnkeyedLiterals pragma.NoUnkeyedLiterals
} }