1*1c12ee1eSDan Willemsen// Copyright 2019 The Go Authors. All rights reserved. 2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style 3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file. 4*1c12ee1eSDan Willemsen 5*1c12ee1eSDan Willemsenpackage irregular 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "google.golang.org/protobuf/encoding/prototext" 9*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protodesc" 10*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protoreflect" 11*1c12ee1eSDan Willemsen "google.golang.org/protobuf/runtime/protoiface" 12*1c12ee1eSDan Willemsen 13*1c12ee1eSDan Willemsen "google.golang.org/protobuf/types/descriptorpb" 14*1c12ee1eSDan Willemsen) 15*1c12ee1eSDan Willemsen 16*1c12ee1eSDan Willemsentype IrregularMessage struct { 17*1c12ee1eSDan Willemsen set bool 18*1c12ee1eSDan Willemsen value string 19*1c12ee1eSDan Willemsen} 20*1c12ee1eSDan Willemsen 21*1c12ee1eSDan Willemsenfunc (m *IrregularMessage) ProtoReflect() protoreflect.Message { return (*message)(m) } 22*1c12ee1eSDan Willemsen 23*1c12ee1eSDan Willemsentype message IrregularMessage 24*1c12ee1eSDan Willemsen 25*1c12ee1eSDan Willemsentype messageType struct{} 26*1c12ee1eSDan Willemsen 27*1c12ee1eSDan Willemsenfunc (messageType) New() protoreflect.Message { return &message{} } 28*1c12ee1eSDan Willemsenfunc (messageType) Zero() protoreflect.Message { return (*message)(nil) } 29*1c12ee1eSDan Willemsenfunc (messageType) Descriptor() protoreflect.MessageDescriptor { return fileDesc.Messages().Get(0) } 30*1c12ee1eSDan Willemsen 31*1c12ee1eSDan Willemsenfunc (m *message) New() protoreflect.Message { return &message{} } 32*1c12ee1eSDan Willemsenfunc (m *message) Descriptor() protoreflect.MessageDescriptor { return fileDesc.Messages().Get(0) } 33*1c12ee1eSDan Willemsenfunc (m *message) Type() protoreflect.MessageType { return messageType{} } 34*1c12ee1eSDan Willemsenfunc (m *message) Interface() protoreflect.ProtoMessage { return (*IrregularMessage)(m) } 35*1c12ee1eSDan Willemsenfunc (m *message) ProtoMethods() *protoiface.Methods { return nil } 36*1c12ee1eSDan Willemsen 37*1c12ee1eSDan Willemsenvar fieldDescS = fileDesc.Messages().Get(0).Fields().Get(0) 38*1c12ee1eSDan Willemsen 39*1c12ee1eSDan Willemsenfunc (m *message) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { 40*1c12ee1eSDan Willemsen if m.set { 41*1c12ee1eSDan Willemsen f(fieldDescS, protoreflect.ValueOf(m.value)) 42*1c12ee1eSDan Willemsen } 43*1c12ee1eSDan Willemsen} 44*1c12ee1eSDan Willemsen 45*1c12ee1eSDan Willemsenfunc (m *message) Has(fd protoreflect.FieldDescriptor) bool { 46*1c12ee1eSDan Willemsen if fd == fieldDescS { 47*1c12ee1eSDan Willemsen return m.set 48*1c12ee1eSDan Willemsen } 49*1c12ee1eSDan Willemsen panic("invalid field descriptor") 50*1c12ee1eSDan Willemsen} 51*1c12ee1eSDan Willemsen 52*1c12ee1eSDan Willemsenfunc (m *message) Clear(fd protoreflect.FieldDescriptor) { 53*1c12ee1eSDan Willemsen if fd == fieldDescS { 54*1c12ee1eSDan Willemsen m.value = "" 55*1c12ee1eSDan Willemsen m.set = false 56*1c12ee1eSDan Willemsen return 57*1c12ee1eSDan Willemsen } 58*1c12ee1eSDan Willemsen panic("invalid field descriptor") 59*1c12ee1eSDan Willemsen} 60*1c12ee1eSDan Willemsen 61*1c12ee1eSDan Willemsenfunc (m *message) Get(fd protoreflect.FieldDescriptor) protoreflect.Value { 62*1c12ee1eSDan Willemsen if fd == fieldDescS { 63*1c12ee1eSDan Willemsen return protoreflect.ValueOf(m.value) 64*1c12ee1eSDan Willemsen } 65*1c12ee1eSDan Willemsen panic("invalid field descriptor") 66*1c12ee1eSDan Willemsen} 67*1c12ee1eSDan Willemsen 68*1c12ee1eSDan Willemsenfunc (m *message) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) { 69*1c12ee1eSDan Willemsen if fd == fieldDescS { 70*1c12ee1eSDan Willemsen m.value = v.String() 71*1c12ee1eSDan Willemsen m.set = true 72*1c12ee1eSDan Willemsen return 73*1c12ee1eSDan Willemsen } 74*1c12ee1eSDan Willemsen panic("invalid field descriptor") 75*1c12ee1eSDan Willemsen} 76*1c12ee1eSDan Willemsen 77*1c12ee1eSDan Willemsenfunc (m *message) Mutable(protoreflect.FieldDescriptor) protoreflect.Value { 78*1c12ee1eSDan Willemsen panic("invalid field descriptor") 79*1c12ee1eSDan Willemsen} 80*1c12ee1eSDan Willemsen 81*1c12ee1eSDan Willemsenfunc (m *message) NewField(protoreflect.FieldDescriptor) protoreflect.Value { 82*1c12ee1eSDan Willemsen panic("invalid field descriptor") 83*1c12ee1eSDan Willemsen} 84*1c12ee1eSDan Willemsen 85*1c12ee1eSDan Willemsenfunc (m *message) WhichOneof(protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { 86*1c12ee1eSDan Willemsen panic("invalid oneof descriptor") 87*1c12ee1eSDan Willemsen} 88*1c12ee1eSDan Willemsen 89*1c12ee1eSDan Willemsenfunc (m *message) GetUnknown() protoreflect.RawFields { return nil } 90*1c12ee1eSDan Willemsenfunc (m *message) SetUnknown(protoreflect.RawFields) { return } 91*1c12ee1eSDan Willemsen 92*1c12ee1eSDan Willemsenfunc (m *message) IsValid() bool { 93*1c12ee1eSDan Willemsen return m != nil 94*1c12ee1eSDan Willemsen} 95*1c12ee1eSDan Willemsen 96*1c12ee1eSDan Willemsenvar fileDesc = func() protoreflect.FileDescriptor { 97*1c12ee1eSDan Willemsen p := &descriptorpb.FileDescriptorProto{} 98*1c12ee1eSDan Willemsen if err := prototext.Unmarshal([]byte(descriptorText), p); err != nil { 99*1c12ee1eSDan Willemsen panic(err) 100*1c12ee1eSDan Willemsen } 101*1c12ee1eSDan Willemsen file, err := protodesc.NewFile(p, nil) 102*1c12ee1eSDan Willemsen if err != nil { 103*1c12ee1eSDan Willemsen panic(err) 104*1c12ee1eSDan Willemsen } 105*1c12ee1eSDan Willemsen return file 106*1c12ee1eSDan Willemsen}() 107*1c12ee1eSDan Willemsen 108*1c12ee1eSDan Willemsenfunc file_internal_testprotos_irregular_irregular_proto_init() { _ = fileDesc } 109*1c12ee1eSDan Willemsen 110*1c12ee1eSDan Willemsenconst descriptorText = ` 111*1c12ee1eSDan Willemsen name: "internal/testprotos/irregular/irregular.proto" 112*1c12ee1eSDan Willemsen package: "goproto.proto.thirdparty" 113*1c12ee1eSDan Willemsen message_type { 114*1c12ee1eSDan Willemsen name: "IrregularMessage" 115*1c12ee1eSDan Willemsen field { 116*1c12ee1eSDan Willemsen name: "s" 117*1c12ee1eSDan Willemsen number: 1 118*1c12ee1eSDan Willemsen label: LABEL_OPTIONAL 119*1c12ee1eSDan Willemsen type: TYPE_STRING 120*1c12ee1eSDan Willemsen json_name: "s" 121*1c12ee1eSDan Willemsen } 122*1c12ee1eSDan Willemsen } 123*1c12ee1eSDan Willemsen options { 124*1c12ee1eSDan Willemsen go_package: "google.golang.org/protobuf/internal/testprotos/irregular" 125*1c12ee1eSDan Willemsen } 126*1c12ee1eSDan Willemsen` 127*1c12ee1eSDan Willemsen 128*1c12ee1eSDan Willemsentype AberrantMessage int 129*1c12ee1eSDan Willemsen 130*1c12ee1eSDan Willemsenfunc (m AberrantMessage) ProtoMessage() {} 131*1c12ee1eSDan Willemsenfunc (m AberrantMessage) Reset() {} 132*1c12ee1eSDan Willemsenfunc (m AberrantMessage) String() string { return "" } 133*1c12ee1eSDan Willemsenfunc (m AberrantMessage) Marshal() ([]byte, error) { return nil, nil } 134*1c12ee1eSDan Willemsenfunc (m AberrantMessage) Unmarshal([]byte) error { return nil } 135