(reflectMessage protoreflect.Message)
| 69 | } |
| 70 | |
| 71 | func (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 |
no test coverage detected