MCPcopy Create free account
hub / github.com/bufbuild/buf / reparseExtensions

Method reparseExtensions

private/pkg/protoencoding/reparse_extensions.go:71–127  ·  view source on GitHub ↗
(reflectMessage protoreflect.Message)

Source from the content-addressed store, hash-verified

69}
70
71func (r *reparser) reparseExtensions(reflectMessage protoreflect.Message) {
72 reparseBytes := reflectMessage.GetUnknown()
73
74 if reflectMessage.Descriptor().ExtensionRanges().Len() > 0 {
75 // Collect extensions into separate message so we can serialize
76 // *just* the extensions and then re-parse them below.
77
78 // reset state for range
79 r.msgExts = nil
80 r.reflectMessage = reflectMessage
81
82 reflectMessage.Range(r.visitExt)
83 if r.err != nil {
84 return
85 }
86 if r.msgExts != nil {
87 options := proto.MarshalOptions{AllowPartial: true}
88 var err error
89 reparseBytes, err = options.MarshalAppend(reparseBytes, r.msgExts.Interface())
90 if err != nil {
91 r.err = err
92 return
93 }
94 }
95 }
96
97 if len(reparseBytes) > 0 {
98 reflectMessage.SetUnknown(nil)
99 options := proto.UnmarshalOptions{
100 Resolver: r.resolver,
101 Merge: true,
102 }
103 if err := options.Unmarshal(reparseBytes, reflectMessage.Interface()); err != nil {
104 r.err = err
105 return
106 }
107 }
108 // Ideally, we'd use reflectMessage.Range here, but that allocates too much since it must
109 // allocate a wrapper for every repeated field that implements protoreflect.List. We don't
110 // care about visiting extensions (since we just resolved/reparsed those above), so we
111 // can iterate over the non-extension fields.
112 fields := reflectMessage.Descriptor().Fields()
113 for i := range fields.Len() {
114 field := fields.Get(i)
115 if field.Message() == nil {
116 // nothing to reparse if not a message
117 continue
118 }
119 if !reflectMessage.Has(field) {
120 continue
121 }
122 r.reparseInMessageField(reflectMessage, field)
123 if r.err != nil {
124 return
125 }
126 }
127}
128

Callers 3

newReparserFunction · 0.95
reparseInMessageFieldMethod · 0.95
ReparseExtensionsFunction · 0.80

Calls 9

reparseInMessageFieldMethod · 0.95
LenMethod · 0.80
ExtensionRangesMethod · 0.65
UnmarshalMethod · 0.65
FieldsMethod · 0.65
GetMethod · 0.65
MessageMethod · 0.65
DescriptorMethod · 0.45
RangeMethod · 0.45

Tested by

no test coverage detected