desc_lazy.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. // Copyright 2019 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package filedesc
  5. import (
  6. "reflect"
  7. "sync"
  8. "google.golang.org/protobuf/encoding/protowire"
  9. "google.golang.org/protobuf/internal/descopts"
  10. "google.golang.org/protobuf/internal/genid"
  11. "google.golang.org/protobuf/internal/strs"
  12. "google.golang.org/protobuf/proto"
  13. "google.golang.org/protobuf/reflect/protoreflect"
  14. )
  15. func (fd *File) lazyRawInit() {
  16. fd.unmarshalFull(fd.builder.RawDescriptor)
  17. fd.resolveMessages()
  18. fd.resolveExtensions()
  19. fd.resolveServices()
  20. }
  21. func (file *File) resolveMessages() {
  22. var depIdx int32
  23. for i := range file.allMessages {
  24. md := &file.allMessages[i]
  25. // Resolve message field dependencies.
  26. for j := range md.L2.Fields.List {
  27. fd := &md.L2.Fields.List[j]
  28. // Resolve message field dependency.
  29. switch fd.L1.Kind {
  30. case protoreflect.EnumKind:
  31. fd.L1.Enum = file.resolveEnumDependency(fd.L1.Enum, listFieldDeps, depIdx)
  32. depIdx++
  33. case protoreflect.MessageKind, protoreflect.GroupKind:
  34. fd.L1.Message = file.resolveMessageDependency(fd.L1.Message, listFieldDeps, depIdx)
  35. depIdx++
  36. if fd.L1.Kind == protoreflect.GroupKind && (fd.IsMap() || fd.IsMapEntry()) {
  37. // A map field might inherit delimited encoding from a file-wide default feature.
  38. // But maps never actually use delimited encoding. (At least for now...)
  39. fd.L1.Kind = protoreflect.MessageKind
  40. }
  41. }
  42. // Default is resolved here since it depends on Enum being resolved.
  43. if v := fd.L1.Default.val; v.IsValid() {
  44. fd.L1.Default = unmarshalDefault(v.Bytes(), fd.L1.Kind, file, fd.L1.Enum)
  45. }
  46. }
  47. }
  48. }
  49. func (file *File) resolveExtensions() {
  50. var depIdx int32
  51. for i := range file.allExtensions {
  52. xd := &file.allExtensions[i]
  53. // Resolve extension field dependency.
  54. switch xd.L1.Kind {
  55. case protoreflect.EnumKind:
  56. xd.L2.Enum = file.resolveEnumDependency(xd.L2.Enum, listExtDeps, depIdx)
  57. depIdx++
  58. case protoreflect.MessageKind, protoreflect.GroupKind:
  59. xd.L2.Message = file.resolveMessageDependency(xd.L2.Message, listExtDeps, depIdx)
  60. depIdx++
  61. }
  62. // Default is resolved here since it depends on Enum being resolved.
  63. if v := xd.L2.Default.val; v.IsValid() {
  64. xd.L2.Default = unmarshalDefault(v.Bytes(), xd.L1.Kind, file, xd.L2.Enum)
  65. }
  66. }
  67. }
  68. func (file *File) resolveServices() {
  69. var depIdx int32
  70. for i := range file.allServices {
  71. sd := &file.allServices[i]
  72. // Resolve method dependencies.
  73. for j := range sd.L2.Methods.List {
  74. md := &sd.L2.Methods.List[j]
  75. md.L1.Input = file.resolveMessageDependency(md.L1.Input, listMethInDeps, depIdx)
  76. md.L1.Output = file.resolveMessageDependency(md.L1.Output, listMethOutDeps, depIdx)
  77. depIdx++
  78. }
  79. }
  80. }
  81. func (file *File) resolveEnumDependency(ed protoreflect.EnumDescriptor, i, j int32) protoreflect.EnumDescriptor {
  82. r := file.builder.FileRegistry
  83. if r, ok := r.(resolverByIndex); ok {
  84. if ed2 := r.FindEnumByIndex(i, j, file.allEnums, file.allMessages); ed2 != nil {
  85. return ed2
  86. }
  87. }
  88. for i := range file.allEnums {
  89. if ed2 := &file.allEnums[i]; ed2.L0.FullName == ed.FullName() {
  90. return ed2
  91. }
  92. }
  93. if d, _ := r.FindDescriptorByName(ed.FullName()); d != nil {
  94. return d.(protoreflect.EnumDescriptor)
  95. }
  96. return ed
  97. }
  98. func (file *File) resolveMessageDependency(md protoreflect.MessageDescriptor, i, j int32) protoreflect.MessageDescriptor {
  99. r := file.builder.FileRegistry
  100. if r, ok := r.(resolverByIndex); ok {
  101. if md2 := r.FindMessageByIndex(i, j, file.allEnums, file.allMessages); md2 != nil {
  102. return md2
  103. }
  104. }
  105. for i := range file.allMessages {
  106. if md2 := &file.allMessages[i]; md2.L0.FullName == md.FullName() {
  107. return md2
  108. }
  109. }
  110. if d, _ := r.FindDescriptorByName(md.FullName()); d != nil {
  111. return d.(protoreflect.MessageDescriptor)
  112. }
  113. return md
  114. }
  115. func (fd *File) unmarshalFull(b []byte) {
  116. sb := getBuilder()
  117. defer putBuilder(sb)
  118. var enumIdx, messageIdx, extensionIdx, serviceIdx int
  119. var rawOptions []byte
  120. var optionImports []string
  121. fd.L2 = new(FileL2)
  122. for len(b) > 0 {
  123. num, typ, n := protowire.ConsumeTag(b)
  124. b = b[n:]
  125. switch typ {
  126. case protowire.VarintType:
  127. v, m := protowire.ConsumeVarint(b)
  128. b = b[m:]
  129. switch num {
  130. case genid.FileDescriptorProto_PublicDependency_field_number:
  131. fd.L2.Imports[v].IsPublic = true
  132. }
  133. case protowire.BytesType:
  134. v, m := protowire.ConsumeBytes(b)
  135. b = b[m:]
  136. switch num {
  137. case genid.FileDescriptorProto_Dependency_field_number:
  138. path := sb.MakeString(v)
  139. imp, _ := fd.builder.FileRegistry.FindFileByPath(path)
  140. if imp == nil {
  141. imp = PlaceholderFile(path)
  142. }
  143. fd.L2.Imports = append(fd.L2.Imports, protoreflect.FileImport{FileDescriptor: imp})
  144. case genid.FileDescriptorProto_OptionDependency_field_number:
  145. optionImports = append(optionImports, sb.MakeString(v))
  146. case genid.FileDescriptorProto_EnumType_field_number:
  147. fd.L1.Enums.List[enumIdx].unmarshalFull(v, sb)
  148. enumIdx++
  149. case genid.FileDescriptorProto_MessageType_field_number:
  150. fd.L1.Messages.List[messageIdx].unmarshalFull(v, sb)
  151. messageIdx++
  152. case genid.FileDescriptorProto_Extension_field_number:
  153. fd.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb)
  154. extensionIdx++
  155. case genid.FileDescriptorProto_Service_field_number:
  156. fd.L1.Services.List[serviceIdx].unmarshalFull(v, sb)
  157. serviceIdx++
  158. case genid.FileDescriptorProto_Options_field_number:
  159. rawOptions = appendOptions(rawOptions, v)
  160. }
  161. default:
  162. m := protowire.ConsumeFieldValue(num, typ, b)
  163. b = b[m:]
  164. }
  165. }
  166. fd.L2.Options = fd.builder.optionsUnmarshaler(&descopts.File, rawOptions)
  167. if len(optionImports) > 0 {
  168. var imps FileImports
  169. var once sync.Once
  170. fd.L2.OptionImports = func() protoreflect.FileImports {
  171. once.Do(func() {
  172. imps = make(FileImports, len(optionImports))
  173. for i, path := range optionImports {
  174. imp, _ := fd.builder.FileRegistry.FindFileByPath(path)
  175. if imp == nil {
  176. imp = PlaceholderFile(path)
  177. }
  178. imps[i] = protoreflect.FileImport{FileDescriptor: imp}
  179. }
  180. })
  181. return &imps
  182. }
  183. }
  184. }
  185. func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) {
  186. var rawValues [][]byte
  187. var rawOptions []byte
  188. if !ed.L1.eagerValues {
  189. ed.L2 = new(EnumL2)
  190. }
  191. for len(b) > 0 {
  192. num, typ, n := protowire.ConsumeTag(b)
  193. b = b[n:]
  194. switch typ {
  195. case protowire.BytesType:
  196. v, m := protowire.ConsumeBytes(b)
  197. b = b[m:]
  198. switch num {
  199. case genid.EnumDescriptorProto_Value_field_number:
  200. rawValues = append(rawValues, v)
  201. case genid.EnumDescriptorProto_ReservedName_field_number:
  202. ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v)))
  203. case genid.EnumDescriptorProto_ReservedRange_field_number:
  204. ed.L2.ReservedRanges.List = append(ed.L2.ReservedRanges.List, unmarshalEnumReservedRange(v))
  205. case genid.EnumDescriptorProto_Options_field_number:
  206. rawOptions = appendOptions(rawOptions, v)
  207. }
  208. default:
  209. m := protowire.ConsumeFieldValue(num, typ, b)
  210. b = b[m:]
  211. }
  212. }
  213. if !ed.L1.eagerValues && len(rawValues) > 0 {
  214. ed.L2.Values.List = make([]EnumValue, len(rawValues))
  215. for i, b := range rawValues {
  216. ed.L2.Values.List[i].unmarshalFull(b, sb, ed.L0.ParentFile, ed, i)
  217. }
  218. }
  219. ed.L2.Options = ed.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Enum, rawOptions)
  220. }
  221. func unmarshalEnumReservedRange(b []byte) (r [2]protoreflect.EnumNumber) {
  222. for len(b) > 0 {
  223. num, typ, n := protowire.ConsumeTag(b)
  224. b = b[n:]
  225. switch typ {
  226. case protowire.VarintType:
  227. v, m := protowire.ConsumeVarint(b)
  228. b = b[m:]
  229. switch num {
  230. case genid.EnumDescriptorProto_EnumReservedRange_Start_field_number:
  231. r[0] = protoreflect.EnumNumber(v)
  232. case genid.EnumDescriptorProto_EnumReservedRange_End_field_number:
  233. r[1] = protoreflect.EnumNumber(v)
  234. }
  235. default:
  236. m := protowire.ConsumeFieldValue(num, typ, b)
  237. b = b[m:]
  238. }
  239. }
  240. return r
  241. }
  242. func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
  243. vd.L0.ParentFile = pf
  244. vd.L0.Parent = pd
  245. vd.L0.Index = i
  246. var rawOptions []byte
  247. for len(b) > 0 {
  248. num, typ, n := protowire.ConsumeTag(b)
  249. b = b[n:]
  250. switch typ {
  251. case protowire.VarintType:
  252. v, m := protowire.ConsumeVarint(b)
  253. b = b[m:]
  254. switch num {
  255. case genid.EnumValueDescriptorProto_Number_field_number:
  256. vd.L1.Number = protoreflect.EnumNumber(v)
  257. }
  258. case protowire.BytesType:
  259. v, m := protowire.ConsumeBytes(b)
  260. b = b[m:]
  261. switch num {
  262. case genid.EnumValueDescriptorProto_Name_field_number:
  263. // NOTE: Enum values are in the same scope as the enum parent.
  264. vd.L0.FullName = appendFullName(sb, pd.Parent().FullName(), v)
  265. case genid.EnumValueDescriptorProto_Options_field_number:
  266. rawOptions = appendOptions(rawOptions, v)
  267. }
  268. default:
  269. m := protowire.ConsumeFieldValue(num, typ, b)
  270. b = b[m:]
  271. }
  272. }
  273. vd.L1.Options = pf.builder.optionsUnmarshaler(&descopts.EnumValue, rawOptions)
  274. }
  275. func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) {
  276. var rawFields, rawOneofs [][]byte
  277. var enumIdx, messageIdx, extensionIdx int
  278. var rawOptions []byte
  279. md.L2 = new(MessageL2)
  280. for len(b) > 0 {
  281. num, typ, n := protowire.ConsumeTag(b)
  282. b = b[n:]
  283. switch typ {
  284. case protowire.BytesType:
  285. v, m := protowire.ConsumeBytes(b)
  286. b = b[m:]
  287. switch num {
  288. case genid.DescriptorProto_Field_field_number:
  289. rawFields = append(rawFields, v)
  290. case genid.DescriptorProto_OneofDecl_field_number:
  291. rawOneofs = append(rawOneofs, v)
  292. case genid.DescriptorProto_ReservedName_field_number:
  293. md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v)))
  294. case genid.DescriptorProto_ReservedRange_field_number:
  295. md.L2.ReservedRanges.List = append(md.L2.ReservedRanges.List, unmarshalMessageReservedRange(v))
  296. case genid.DescriptorProto_ExtensionRange_field_number:
  297. r, rawOptions := unmarshalMessageExtensionRange(v)
  298. opts := md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.ExtensionRange, rawOptions)
  299. md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, r)
  300. md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, opts)
  301. case genid.DescriptorProto_EnumType_field_number:
  302. md.L1.Enums.List[enumIdx].unmarshalFull(v, sb)
  303. enumIdx++
  304. case genid.DescriptorProto_NestedType_field_number:
  305. md.L1.Messages.List[messageIdx].unmarshalFull(v, sb)
  306. messageIdx++
  307. case genid.DescriptorProto_Extension_field_number:
  308. md.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb)
  309. extensionIdx++
  310. case genid.DescriptorProto_Options_field_number:
  311. rawOptions = appendOptions(rawOptions, v)
  312. }
  313. default:
  314. m := protowire.ConsumeFieldValue(num, typ, b)
  315. b = b[m:]
  316. }
  317. }
  318. if len(rawFields) > 0 || len(rawOneofs) > 0 {
  319. md.L2.Fields.List = make([]Field, len(rawFields))
  320. md.L2.Oneofs.List = make([]Oneof, len(rawOneofs))
  321. for i, b := range rawFields {
  322. fd := &md.L2.Fields.List[i]
  323. fd.unmarshalFull(b, sb, md.L0.ParentFile, md, i)
  324. if fd.L1.Cardinality == protoreflect.Required {
  325. md.L2.RequiredNumbers.List = append(md.L2.RequiredNumbers.List, fd.L1.Number)
  326. }
  327. }
  328. for i, b := range rawOneofs {
  329. od := &md.L2.Oneofs.List[i]
  330. od.unmarshalFull(b, sb, md.L0.ParentFile, md, i)
  331. }
  332. }
  333. md.L2.Options = md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Message, rawOptions)
  334. }
  335. func unmarshalMessageReservedRange(b []byte) (r [2]protoreflect.FieldNumber) {
  336. for len(b) > 0 {
  337. num, typ, n := protowire.ConsumeTag(b)
  338. b = b[n:]
  339. switch typ {
  340. case protowire.VarintType:
  341. v, m := protowire.ConsumeVarint(b)
  342. b = b[m:]
  343. switch num {
  344. case genid.DescriptorProto_ReservedRange_Start_field_number:
  345. r[0] = protoreflect.FieldNumber(v)
  346. case genid.DescriptorProto_ReservedRange_End_field_number:
  347. r[1] = protoreflect.FieldNumber(v)
  348. }
  349. default:
  350. m := protowire.ConsumeFieldValue(num, typ, b)
  351. b = b[m:]
  352. }
  353. }
  354. return r
  355. }
  356. func unmarshalMessageExtensionRange(b []byte) (r [2]protoreflect.FieldNumber, rawOptions []byte) {
  357. for len(b) > 0 {
  358. num, typ, n := protowire.ConsumeTag(b)
  359. b = b[n:]
  360. switch typ {
  361. case protowire.VarintType:
  362. v, m := protowire.ConsumeVarint(b)
  363. b = b[m:]
  364. switch num {
  365. case genid.DescriptorProto_ExtensionRange_Start_field_number:
  366. r[0] = protoreflect.FieldNumber(v)
  367. case genid.DescriptorProto_ExtensionRange_End_field_number:
  368. r[1] = protoreflect.FieldNumber(v)
  369. }
  370. case protowire.BytesType:
  371. v, m := protowire.ConsumeBytes(b)
  372. b = b[m:]
  373. switch num {
  374. case genid.DescriptorProto_ExtensionRange_Options_field_number:
  375. rawOptions = appendOptions(rawOptions, v)
  376. }
  377. default:
  378. m := protowire.ConsumeFieldValue(num, typ, b)
  379. b = b[m:]
  380. }
  381. }
  382. return r, rawOptions
  383. }
  384. func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
  385. fd.L0.ParentFile = pf
  386. fd.L0.Parent = pd
  387. fd.L0.Index = i
  388. fd.L1.EditionFeatures = featuresFromParentDesc(fd.Parent())
  389. var rawTypeName []byte
  390. var rawOptions []byte
  391. for len(b) > 0 {
  392. num, typ, n := protowire.ConsumeTag(b)
  393. b = b[n:]
  394. switch typ {
  395. case protowire.VarintType:
  396. v, m := protowire.ConsumeVarint(b)
  397. b = b[m:]
  398. switch num {
  399. case genid.FieldDescriptorProto_Number_field_number:
  400. fd.L1.Number = protoreflect.FieldNumber(v)
  401. case genid.FieldDescriptorProto_Label_field_number:
  402. fd.L1.Cardinality = protoreflect.Cardinality(v)
  403. case genid.FieldDescriptorProto_Type_field_number:
  404. fd.L1.Kind = protoreflect.Kind(v)
  405. case genid.FieldDescriptorProto_OneofIndex_field_number:
  406. // In Message.unmarshalFull, we allocate slices for both
  407. // the field and oneof descriptors before unmarshaling either
  408. // of them. This ensures pointers to slice elements are stable.
  409. od := &pd.(*Message).L2.Oneofs.List[v]
  410. od.L1.Fields.List = append(od.L1.Fields.List, fd)
  411. if fd.L1.ContainingOneof != nil {
  412. panic("oneof type already set")
  413. }
  414. fd.L1.ContainingOneof = od
  415. case genid.FieldDescriptorProto_Proto3Optional_field_number:
  416. fd.L1.IsProto3Optional = protowire.DecodeBool(v)
  417. }
  418. case protowire.BytesType:
  419. v, m := protowire.ConsumeBytes(b)
  420. b = b[m:]
  421. switch num {
  422. case genid.FieldDescriptorProto_Name_field_number:
  423. fd.L0.FullName = appendFullName(sb, pd.FullName(), v)
  424. case genid.FieldDescriptorProto_JsonName_field_number:
  425. fd.L1.StringName.InitJSON(sb.MakeString(v))
  426. case genid.FieldDescriptorProto_DefaultValue_field_number:
  427. fd.L1.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages
  428. case genid.FieldDescriptorProto_TypeName_field_number:
  429. rawTypeName = v
  430. case genid.FieldDescriptorProto_Options_field_number:
  431. fd.unmarshalOptions(v)
  432. rawOptions = appendOptions(rawOptions, v)
  433. }
  434. default:
  435. m := protowire.ConsumeFieldValue(num, typ, b)
  436. b = b[m:]
  437. }
  438. }
  439. if fd.L1.Kind == protoreflect.MessageKind && fd.L1.EditionFeatures.IsDelimitedEncoded {
  440. fd.L1.Kind = protoreflect.GroupKind
  441. }
  442. if fd.L1.EditionFeatures.IsLegacyRequired {
  443. fd.L1.Cardinality = protoreflect.Required
  444. }
  445. if rawTypeName != nil {
  446. name := makeFullName(sb, rawTypeName)
  447. switch fd.L1.Kind {
  448. case protoreflect.EnumKind:
  449. fd.L1.Enum = PlaceholderEnum(name)
  450. case protoreflect.MessageKind, protoreflect.GroupKind:
  451. fd.L1.Message = PlaceholderMessage(name)
  452. }
  453. }
  454. fd.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Field, rawOptions)
  455. }
  456. func (fd *Field) unmarshalOptions(b []byte) {
  457. const FieldOptions_EnforceUTF8 = 13
  458. for len(b) > 0 {
  459. num, typ, n := protowire.ConsumeTag(b)
  460. b = b[n:]
  461. switch typ {
  462. case protowire.VarintType:
  463. v, m := protowire.ConsumeVarint(b)
  464. b = b[m:]
  465. switch num {
  466. case genid.FieldOptions_Packed_field_number:
  467. fd.L1.EditionFeatures.IsPacked = protowire.DecodeBool(v)
  468. case genid.FieldOptions_Lazy_field_number:
  469. fd.L1.IsLazy = protowire.DecodeBool(v)
  470. case FieldOptions_EnforceUTF8:
  471. fd.L1.EditionFeatures.IsUTF8Validated = protowire.DecodeBool(v)
  472. }
  473. case protowire.BytesType:
  474. v, m := protowire.ConsumeBytes(b)
  475. b = b[m:]
  476. switch num {
  477. case genid.FieldOptions_Features_field_number:
  478. fd.L1.EditionFeatures = unmarshalFeatureSet(v, fd.L1.EditionFeatures)
  479. }
  480. default:
  481. m := protowire.ConsumeFieldValue(num, typ, b)
  482. b = b[m:]
  483. }
  484. }
  485. }
  486. func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
  487. od.L0.ParentFile = pf
  488. od.L0.Parent = pd
  489. od.L0.Index = i
  490. var rawOptions []byte
  491. for len(b) > 0 {
  492. num, typ, n := protowire.ConsumeTag(b)
  493. b = b[n:]
  494. switch typ {
  495. case protowire.BytesType:
  496. v, m := protowire.ConsumeBytes(b)
  497. b = b[m:]
  498. switch num {
  499. case genid.OneofDescriptorProto_Name_field_number:
  500. od.L0.FullName = appendFullName(sb, pd.FullName(), v)
  501. case genid.OneofDescriptorProto_Options_field_number:
  502. rawOptions = appendOptions(rawOptions, v)
  503. }
  504. default:
  505. m := protowire.ConsumeFieldValue(num, typ, b)
  506. b = b[m:]
  507. }
  508. }
  509. od.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Oneof, rawOptions)
  510. }
  511. func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) {
  512. var rawTypeName []byte
  513. var rawOptions []byte
  514. xd.L2 = new(ExtensionL2)
  515. for len(b) > 0 {
  516. num, typ, n := protowire.ConsumeTag(b)
  517. b = b[n:]
  518. switch typ {
  519. case protowire.VarintType:
  520. v, m := protowire.ConsumeVarint(b)
  521. b = b[m:]
  522. switch num {
  523. case genid.FieldDescriptorProto_Proto3Optional_field_number:
  524. xd.L2.IsProto3Optional = protowire.DecodeBool(v)
  525. }
  526. case protowire.BytesType:
  527. v, m := protowire.ConsumeBytes(b)
  528. b = b[m:]
  529. switch num {
  530. case genid.FieldDescriptorProto_JsonName_field_number:
  531. xd.L2.StringName.InitJSON(sb.MakeString(v))
  532. case genid.FieldDescriptorProto_DefaultValue_field_number:
  533. xd.L2.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions
  534. case genid.FieldDescriptorProto_TypeName_field_number:
  535. rawTypeName = v
  536. case genid.FieldDescriptorProto_Options_field_number:
  537. rawOptions = appendOptions(rawOptions, v)
  538. }
  539. default:
  540. m := protowire.ConsumeFieldValue(num, typ, b)
  541. b = b[m:]
  542. }
  543. }
  544. if rawTypeName != nil {
  545. name := makeFullName(sb, rawTypeName)
  546. switch xd.L1.Kind {
  547. case protoreflect.EnumKind:
  548. xd.L2.Enum = PlaceholderEnum(name)
  549. case protoreflect.MessageKind, protoreflect.GroupKind:
  550. xd.L2.Message = PlaceholderMessage(name)
  551. }
  552. }
  553. xd.L2.Options = xd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Field, rawOptions)
  554. }
  555. func (sd *Service) unmarshalFull(b []byte, sb *strs.Builder) {
  556. var rawMethods [][]byte
  557. var rawOptions []byte
  558. sd.L2 = new(ServiceL2)
  559. for len(b) > 0 {
  560. num, typ, n := protowire.ConsumeTag(b)
  561. b = b[n:]
  562. switch typ {
  563. case protowire.BytesType:
  564. v, m := protowire.ConsumeBytes(b)
  565. b = b[m:]
  566. switch num {
  567. case genid.ServiceDescriptorProto_Method_field_number:
  568. rawMethods = append(rawMethods, v)
  569. case genid.ServiceDescriptorProto_Options_field_number:
  570. rawOptions = appendOptions(rawOptions, v)
  571. }
  572. default:
  573. m := protowire.ConsumeFieldValue(num, typ, b)
  574. b = b[m:]
  575. }
  576. }
  577. if len(rawMethods) > 0 {
  578. sd.L2.Methods.List = make([]Method, len(rawMethods))
  579. for i, b := range rawMethods {
  580. sd.L2.Methods.List[i].unmarshalFull(b, sb, sd.L0.ParentFile, sd, i)
  581. }
  582. }
  583. sd.L2.Options = sd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Service, rawOptions)
  584. }
  585. func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
  586. md.L0.ParentFile = pf
  587. md.L0.Parent = pd
  588. md.L0.Index = i
  589. var rawOptions []byte
  590. for len(b) > 0 {
  591. num, typ, n := protowire.ConsumeTag(b)
  592. b = b[n:]
  593. switch typ {
  594. case protowire.VarintType:
  595. v, m := protowire.ConsumeVarint(b)
  596. b = b[m:]
  597. switch num {
  598. case genid.MethodDescriptorProto_ClientStreaming_field_number:
  599. md.L1.IsStreamingClient = protowire.DecodeBool(v)
  600. case genid.MethodDescriptorProto_ServerStreaming_field_number:
  601. md.L1.IsStreamingServer = protowire.DecodeBool(v)
  602. }
  603. case protowire.BytesType:
  604. v, m := protowire.ConsumeBytes(b)
  605. b = b[m:]
  606. switch num {
  607. case genid.MethodDescriptorProto_Name_field_number:
  608. md.L0.FullName = appendFullName(sb, pd.FullName(), v)
  609. case genid.MethodDescriptorProto_InputType_field_number:
  610. md.L1.Input = PlaceholderMessage(makeFullName(sb, v))
  611. case genid.MethodDescriptorProto_OutputType_field_number:
  612. md.L1.Output = PlaceholderMessage(makeFullName(sb, v))
  613. case genid.MethodDescriptorProto_Options_field_number:
  614. rawOptions = appendOptions(rawOptions, v)
  615. }
  616. default:
  617. m := protowire.ConsumeFieldValue(num, typ, b)
  618. b = b[m:]
  619. }
  620. }
  621. md.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Method, rawOptions)
  622. }
  623. // appendOptions appends src to dst, where the returned slice is never nil.
  624. // This is necessary to distinguish between empty and unpopulated options.
  625. func appendOptions(dst, src []byte) []byte {
  626. if dst == nil {
  627. dst = []byte{}
  628. }
  629. return append(dst, src...)
  630. }
  631. // optionsUnmarshaler constructs a lazy unmarshal function for an options message.
  632. //
  633. // The type of message to unmarshal to is passed as a pointer since the
  634. // vars in descopts may not yet be populated at the time this function is called.
  635. func (db *Builder) optionsUnmarshaler(p *protoreflect.ProtoMessage, b []byte) func() protoreflect.ProtoMessage {
  636. if b == nil {
  637. return nil
  638. }
  639. var opts protoreflect.ProtoMessage
  640. var once sync.Once
  641. return func() protoreflect.ProtoMessage {
  642. once.Do(func() {
  643. if *p == nil {
  644. panic("Descriptor.Options called without importing the descriptor package")
  645. }
  646. opts = reflect.New(reflect.TypeOf(*p).Elem()).Interface().(protoreflect.ProtoMessage)
  647. if err := (proto.UnmarshalOptions{
  648. AllowPartial: true,
  649. Resolver: db.TypeResolver,
  650. }).Unmarshal(b, opts); err != nil {
  651. panic(err)
  652. }
  653. })
  654. return opts
  655. }
  656. }