vendor/google.golang.org/protobuf/internal/impl/merge.go
changeset 260 445e01aede7e
parent 256 6d9efbef00a9
equal deleted inserted replaced
259:db4911b0c721 260:445e01aede7e
     7 import (
     7 import (
     8 	"fmt"
     8 	"fmt"
     9 	"reflect"
     9 	"reflect"
    10 
    10 
    11 	"google.golang.org/protobuf/proto"
    11 	"google.golang.org/protobuf/proto"
    12 	pref "google.golang.org/protobuf/reflect/protoreflect"
    12 	"google.golang.org/protobuf/reflect/protoreflect"
    13 	piface "google.golang.org/protobuf/runtime/protoiface"
    13 	"google.golang.org/protobuf/runtime/protoiface"
    14 )
    14 )
    15 
    15 
    16 type mergeOptions struct{}
    16 type mergeOptions struct{}
    17 
    17 
    18 func (o mergeOptions) Merge(dst, src proto.Message) {
    18 func (o mergeOptions) Merge(dst, src proto.Message) {
    19 	proto.Merge(dst, src)
    19 	proto.Merge(dst, src)
    20 }
    20 }
    21 
    21 
    22 // merge is protoreflect.Methods.Merge.
    22 // merge is protoreflect.Methods.Merge.
    23 func (mi *MessageInfo) merge(in piface.MergeInput) piface.MergeOutput {
    23 func (mi *MessageInfo) merge(in protoiface.MergeInput) protoiface.MergeOutput {
    24 	dp, ok := mi.getPointer(in.Destination)
    24 	dp, ok := mi.getPointer(in.Destination)
    25 	if !ok {
    25 	if !ok {
    26 		return piface.MergeOutput{}
    26 		return protoiface.MergeOutput{}
    27 	}
    27 	}
    28 	sp, ok := mi.getPointer(in.Source)
    28 	sp, ok := mi.getPointer(in.Source)
    29 	if !ok {
    29 	if !ok {
    30 		return piface.MergeOutput{}
    30 		return protoiface.MergeOutput{}
    31 	}
    31 	}
    32 	mi.mergePointer(dp, sp, mergeOptions{})
    32 	mi.mergePointer(dp, sp, mergeOptions{})
    33 	return piface.MergeOutput{Flags: piface.MergeComplete}
    33 	return protoiface.MergeOutput{Flags: protoiface.MergeComplete}
    34 }
    34 }
    35 
    35 
    36 func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) {
    36 func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) {
    37 	mi.init()
    37 	mi.init()
    38 	if dst.IsNil() {
    38 	if dst.IsNil() {
    62 			xi := getExtensionFieldInfo(xt)
    62 			xi := getExtensionFieldInfo(xt)
    63 			if xi.funcs.merge == nil {
    63 			if xi.funcs.merge == nil {
    64 				continue
    64 				continue
    65 			}
    65 			}
    66 			dx := (*dext)[num]
    66 			dx := (*dext)[num]
    67 			var dv pref.Value
    67 			var dv protoreflect.Value
    68 			if dx.Type() == sx.Type() {
    68 			if dx.Type() == sx.Type() {
    69 				dv = dx.Value()
    69 				dv = dx.Value()
    70 			}
    70 			}
    71 			if !dv.IsValid() && xi.unmarshalNeedsValue {
    71 			if !dv.IsValid() && xi.unmarshalNeedsValue {
    72 				dv = xt.New()
    72 				dv = xt.New()
    83 			*du = append(*du, *su...)
    83 			*du = append(*du, *su...)
    84 		}
    84 		}
    85 	}
    85 	}
    86 }
    86 }
    87 
    87 
    88 func mergeScalarValue(dst, src pref.Value, opts mergeOptions) pref.Value {
    88 func mergeScalarValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
    89 	return src
    89 	return src
    90 }
    90 }
    91 
    91 
    92 func mergeBytesValue(dst, src pref.Value, opts mergeOptions) pref.Value {
    92 func mergeBytesValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
    93 	return pref.ValueOfBytes(append(emptyBuf[:], src.Bytes()...))
    93 	return protoreflect.ValueOfBytes(append(emptyBuf[:], src.Bytes()...))
    94 }
    94 }
    95 
    95 
    96 func mergeListValue(dst, src pref.Value, opts mergeOptions) pref.Value {
    96 func mergeListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
    97 	dstl := dst.List()
    97 	dstl := dst.List()
    98 	srcl := src.List()
    98 	srcl := src.List()
    99 	for i, llen := 0, srcl.Len(); i < llen; i++ {
    99 	for i, llen := 0, srcl.Len(); i < llen; i++ {
   100 		dstl.Append(srcl.Get(i))
   100 		dstl.Append(srcl.Get(i))
   101 	}
   101 	}
   102 	return dst
   102 	return dst
   103 }
   103 }
   104 
   104 
   105 func mergeBytesListValue(dst, src pref.Value, opts mergeOptions) pref.Value {
   105 func mergeBytesListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
   106 	dstl := dst.List()
   106 	dstl := dst.List()
   107 	srcl := src.List()
   107 	srcl := src.List()
   108 	for i, llen := 0, srcl.Len(); i < llen; i++ {
   108 	for i, llen := 0, srcl.Len(); i < llen; i++ {
   109 		sb := srcl.Get(i).Bytes()
   109 		sb := srcl.Get(i).Bytes()
   110 		db := append(emptyBuf[:], sb...)
   110 		db := append(emptyBuf[:], sb...)
   111 		dstl.Append(pref.ValueOfBytes(db))
   111 		dstl.Append(protoreflect.ValueOfBytes(db))
   112 	}
   112 	}
   113 	return dst
   113 	return dst
   114 }
   114 }
   115 
   115 
   116 func mergeMessageListValue(dst, src pref.Value, opts mergeOptions) pref.Value {
   116 func mergeMessageListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
   117 	dstl := dst.List()
   117 	dstl := dst.List()
   118 	srcl := src.List()
   118 	srcl := src.List()
   119 	for i, llen := 0, srcl.Len(); i < llen; i++ {
   119 	for i, llen := 0, srcl.Len(); i < llen; i++ {
   120 		sm := srcl.Get(i).Message()
   120 		sm := srcl.Get(i).Message()
   121 		dm := proto.Clone(sm.Interface()).ProtoReflect()
   121 		dm := proto.Clone(sm.Interface()).ProtoReflect()
   122 		dstl.Append(pref.ValueOfMessage(dm))
   122 		dstl.Append(protoreflect.ValueOfMessage(dm))
   123 	}
   123 	}
   124 	return dst
   124 	return dst
   125 }
   125 }
   126 
   126 
   127 func mergeMessageValue(dst, src pref.Value, opts mergeOptions) pref.Value {
   127 func mergeMessageValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
   128 	opts.Merge(dst.Message().Interface(), src.Message().Interface())
   128 	opts.Merge(dst.Message().Interface(), src.Message().Interface())
   129 	return dst
   129 	return dst
   130 }
   130 }
   131 
   131 
   132 func mergeMessage(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {
   132 func mergeMessage(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {