desc_lazy.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694
  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. fd.L2 = new(FileL2)
  121. for len(b) > 0 {
  122. num, typ, n := protowire.ConsumeTag(b)
  123. b = b[n:]
  124. switch typ {
  125. case protowire.VarintType:
  126. v, m := protowire.ConsumeVarint(b)
  127. b = b[m:]
  128. switch num {
  129. case genid.FileDescriptorProto_PublicDependency_field_number:
  130. fd.L2.Imports[v].IsPublic = true
  131. }
  132. case protowire.BytesType:
  133. v, m := protowire.ConsumeBytes(b)
  134. b = b[m:]
  135. switch num {
  136. case genid.FileDescriptorProto_Dependency_field_number:
  137. path := sb.MakeString(v)
  138. imp, _ := fd.builder.FileRegistry.FindFileByPath(path)
  139. if imp == nil {
  140. imp = PlaceholderFile(path)
  141. }
  142. fd.L2.Imports = append(fd.L2.Imports, protoreflect.FileImport{FileDescriptor: imp})
  143. case genid.FileDescriptorProto_EnumType_field_number:
  144. fd.L1.Enums.List[enumIdx].unmarshalFull(v, sb)
  145. enumIdx++
  146. case genid.FileDescriptorProto_MessageType_field_number:
  147. fd.L1.Messages.List[messageIdx].unmarshalFull(v, sb)
  148. messageIdx++
  149. case genid.FileDescriptorProto_Extension_field_number:
  150. fd.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb)
  151. extensionIdx++
  152. case genid.FileDescriptorProto_Service_field_number:
  153. fd.L1.Services.List[serviceIdx].unmarshalFull(v, sb)
  154. serviceIdx++
  155. case genid.FileDescriptorProto_Options_field_number:
  156. rawOptions = appendOptions(rawOptions, v)
  157. }
  158. default:
  159. m := protowire.ConsumeFieldValue(num, typ, b)
  160. b = b[m:]
  161. }
  162. }
  163. fd.L2.Options = fd.builder.optionsUnmarshaler(&descopts.File, rawOptions)
  164. }
  165. func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) {
  166. var rawValues [][]byte
  167. var rawOptions []byte
  168. if !ed.L1.eagerValues {
  169. ed.L2 = new(EnumL2)
  170. }
  171. for len(b) > 0 {
  172. num, typ, n := protowire.ConsumeTag(b)
  173. b = b[n:]
  174. switch typ {
  175. case protowire.BytesType:
  176. v, m := protowire.ConsumeBytes(b)
  177. b = b[m:]
  178. switch num {
  179. case genid.EnumDescriptorProto_Value_field_number:
  180. rawValues = append(rawValues, v)
  181. case genid.EnumDescriptorProto_ReservedName_field_number:
  182. ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v)))
  183. case genid.EnumDescriptorProto_ReservedRange_field_number:
  184. ed.L2.ReservedRanges.List = append(ed.L2.ReservedRanges.List, unmarshalEnumReservedRange(v))
  185. case genid.EnumDescriptorProto_Options_field_number:
  186. rawOptions = appendOptions(rawOptions, v)
  187. }
  188. default:
  189. m := protowire.ConsumeFieldValue(num, typ, b)
  190. b = b[m:]
  191. }
  192. }
  193. if !ed.L1.eagerValues && len(rawValues) > 0 {
  194. ed.L2.Values.List = make([]EnumValue, len(rawValues))
  195. for i, b := range rawValues {
  196. ed.L2.Values.List[i].unmarshalFull(b, sb, ed.L0.ParentFile, ed, i)
  197. }
  198. }
  199. ed.L2.Options = ed.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Enum, rawOptions)
  200. }
  201. func unmarshalEnumReservedRange(b []byte) (r [2]protoreflect.EnumNumber) {
  202. for len(b) > 0 {
  203. num, typ, n := protowire.ConsumeTag(b)
  204. b = b[n:]
  205. switch typ {
  206. case protowire.VarintType:
  207. v, m := protowire.ConsumeVarint(b)
  208. b = b[m:]
  209. switch num {
  210. case genid.EnumDescriptorProto_EnumReservedRange_Start_field_number:
  211. r[0] = protoreflect.EnumNumber(v)
  212. case genid.EnumDescriptorProto_EnumReservedRange_End_field_number:
  213. r[1] = protoreflect.EnumNumber(v)
  214. }
  215. default:
  216. m := protowire.ConsumeFieldValue(num, typ, b)
  217. b = b[m:]
  218. }
  219. }
  220. return r
  221. }
  222. func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
  223. vd.L0.ParentFile = pf
  224. vd.L0.Parent = pd
  225. vd.L0.Index = i
  226. var rawOptions []byte
  227. for len(b) > 0 {
  228. num, typ, n := protowire.ConsumeTag(b)
  229. b = b[n:]
  230. switch typ {
  231. case protowire.VarintType:
  232. v, m := protowire.ConsumeVarint(b)
  233. b = b[m:]
  234. switch num {
  235. case genid.EnumValueDescriptorProto_Number_field_number:
  236. vd.L1.Number = protoreflect.EnumNumber(v)
  237. }
  238. case protowire.BytesType:
  239. v, m := protowire.ConsumeBytes(b)
  240. b = b[m:]
  241. switch num {
  242. case genid.EnumValueDescriptorProto_Name_field_number:
  243. // NOTE: Enum values are in the same scope as the enum parent.
  244. vd.L0.FullName = appendFullName(sb, pd.Parent().FullName(), v)
  245. case genid.EnumValueDescriptorProto_Options_field_number:
  246. rawOptions = appendOptions(rawOptions, v)
  247. }
  248. default:
  249. m := protowire.ConsumeFieldValue(num, typ, b)
  250. b = b[m:]
  251. }
  252. }
  253. vd.L1.Options = pf.builder.optionsUnmarshaler(&descopts.EnumValue, rawOptions)
  254. }
  255. func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) {
  256. var rawFields, rawOneofs [][]byte
  257. var enumIdx, messageIdx, extensionIdx int
  258. var rawOptions []byte
  259. md.L2 = new(MessageL2)
  260. for len(b) > 0 {
  261. num, typ, n := protowire.ConsumeTag(b)
  262. b = b[n:]
  263. switch typ {
  264. case protowire.BytesType:
  265. v, m := protowire.ConsumeBytes(b)
  266. b = b[m:]
  267. switch num {
  268. case genid.DescriptorProto_Field_field_number:
  269. rawFields = append(rawFields, v)
  270. case genid.DescriptorProto_OneofDecl_field_number:
  271. rawOneofs = append(rawOneofs, v)
  272. case genid.DescriptorProto_ReservedName_field_number:
  273. md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, protoreflect.Name(sb.MakeString(v)))
  274. case genid.DescriptorProto_ReservedRange_field_number:
  275. md.L2.ReservedRanges.List = append(md.L2.ReservedRanges.List, unmarshalMessageReservedRange(v))
  276. case genid.DescriptorProto_ExtensionRange_field_number:
  277. r, rawOptions := unmarshalMessageExtensionRange(v)
  278. opts := md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.ExtensionRange, rawOptions)
  279. md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, r)
  280. md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, opts)
  281. case genid.DescriptorProto_EnumType_field_number:
  282. md.L1.Enums.List[enumIdx].unmarshalFull(v, sb)
  283. enumIdx++
  284. case genid.DescriptorProto_NestedType_field_number:
  285. md.L1.Messages.List[messageIdx].unmarshalFull(v, sb)
  286. messageIdx++
  287. case genid.DescriptorProto_Extension_field_number:
  288. md.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb)
  289. extensionIdx++
  290. case genid.DescriptorProto_Options_field_number:
  291. md.unmarshalOptions(v)
  292. rawOptions = appendOptions(rawOptions, v)
  293. }
  294. default:
  295. m := protowire.ConsumeFieldValue(num, typ, b)
  296. b = b[m:]
  297. }
  298. }
  299. if len(rawFields) > 0 || len(rawOneofs) > 0 {
  300. md.L2.Fields.List = make([]Field, len(rawFields))
  301. md.L2.Oneofs.List = make([]Oneof, len(rawOneofs))
  302. for i, b := range rawFields {
  303. fd := &md.L2.Fields.List[i]
  304. fd.unmarshalFull(b, sb, md.L0.ParentFile, md, i)
  305. if fd.L1.Cardinality == protoreflect.Required {
  306. md.L2.RequiredNumbers.List = append(md.L2.RequiredNumbers.List, fd.L1.Number)
  307. }
  308. }
  309. for i, b := range rawOneofs {
  310. od := &md.L2.Oneofs.List[i]
  311. od.unmarshalFull(b, sb, md.L0.ParentFile, md, i)
  312. }
  313. }
  314. md.L2.Options = md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Message, rawOptions)
  315. }
  316. func (md *Message) unmarshalOptions(b []byte) {
  317. for len(b) > 0 {
  318. num, typ, n := protowire.ConsumeTag(b)
  319. b = b[n:]
  320. switch typ {
  321. case protowire.VarintType:
  322. v, m := protowire.ConsumeVarint(b)
  323. b = b[m:]
  324. switch num {
  325. case genid.MessageOptions_MapEntry_field_number:
  326. md.L1.IsMapEntry = protowire.DecodeBool(v)
  327. case genid.MessageOptions_MessageSetWireFormat_field_number:
  328. md.L1.IsMessageSet = protowire.DecodeBool(v)
  329. }
  330. default:
  331. m := protowire.ConsumeFieldValue(num, typ, b)
  332. b = b[m:]
  333. }
  334. }
  335. }
  336. func unmarshalMessageReservedRange(b []byte) (r [2]protoreflect.FieldNumber) {
  337. for len(b) > 0 {
  338. num, typ, n := protowire.ConsumeTag(b)
  339. b = b[n:]
  340. switch typ {
  341. case protowire.VarintType:
  342. v, m := protowire.ConsumeVarint(b)
  343. b = b[m:]
  344. switch num {
  345. case genid.DescriptorProto_ReservedRange_Start_field_number:
  346. r[0] = protoreflect.FieldNumber(v)
  347. case genid.DescriptorProto_ReservedRange_End_field_number:
  348. r[1] = protoreflect.FieldNumber(v)
  349. }
  350. default:
  351. m := protowire.ConsumeFieldValue(num, typ, b)
  352. b = b[m:]
  353. }
  354. }
  355. return r
  356. }
  357. func unmarshalMessageExtensionRange(b []byte) (r [2]protoreflect.FieldNumber, rawOptions []byte) {
  358. for len(b) > 0 {
  359. num, typ, n := protowire.ConsumeTag(b)
  360. b = b[n:]
  361. switch typ {
  362. case protowire.VarintType:
  363. v, m := protowire.ConsumeVarint(b)
  364. b = b[m:]
  365. switch num {
  366. case genid.DescriptorProto_ExtensionRange_Start_field_number:
  367. r[0] = protoreflect.FieldNumber(v)
  368. case genid.DescriptorProto_ExtensionRange_End_field_number:
  369. r[1] = protoreflect.FieldNumber(v)
  370. }
  371. case protowire.BytesType:
  372. v, m := protowire.ConsumeBytes(b)
  373. b = b[m:]
  374. switch num {
  375. case genid.DescriptorProto_ExtensionRange_Options_field_number:
  376. rawOptions = appendOptions(rawOptions, v)
  377. }
  378. default:
  379. m := protowire.ConsumeFieldValue(num, typ, b)
  380. b = b[m:]
  381. }
  382. }
  383. return r, rawOptions
  384. }
  385. func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
  386. fd.L0.ParentFile = pf
  387. fd.L0.Parent = pd
  388. fd.L0.Index = i
  389. fd.L1.EditionFeatures = featuresFromParentDesc(fd.Parent())
  390. var rawTypeName []byte
  391. var rawOptions []byte
  392. for len(b) > 0 {
  393. num, typ, n := protowire.ConsumeTag(b)
  394. b = b[n:]
  395. switch typ {
  396. case protowire.VarintType:
  397. v, m := protowire.ConsumeVarint(b)
  398. b = b[m:]
  399. switch num {
  400. case genid.FieldDescriptorProto_Number_field_number:
  401. fd.L1.Number = protoreflect.FieldNumber(v)
  402. case genid.FieldDescriptorProto_Label_field_number:
  403. fd.L1.Cardinality = protoreflect.Cardinality(v)
  404. case genid.FieldDescriptorProto_Type_field_number:
  405. fd.L1.Kind = protoreflect.Kind(v)
  406. case genid.FieldDescriptorProto_OneofIndex_field_number:
  407. // In Message.unmarshalFull, we allocate slices for both
  408. // the field and oneof descriptors before unmarshaling either
  409. // of them. This ensures pointers to slice elements are stable.
  410. od := &pd.(*Message).L2.Oneofs.List[v]
  411. od.L1.Fields.List = append(od.L1.Fields.List, fd)
  412. if fd.L1.ContainingOneof != nil {
  413. panic("oneof type already set")
  414. }
  415. fd.L1.ContainingOneof = od
  416. case genid.FieldDescriptorProto_Proto3Optional_field_number:
  417. fd.L1.IsProto3Optional = protowire.DecodeBool(v)
  418. }
  419. case protowire.BytesType:
  420. v, m := protowire.ConsumeBytes(b)
  421. b = b[m:]
  422. switch num {
  423. case genid.FieldDescriptorProto_Name_field_number:
  424. fd.L0.FullName = appendFullName(sb, pd.FullName(), v)
  425. case genid.FieldDescriptorProto_JsonName_field_number:
  426. fd.L1.StringName.InitJSON(sb.MakeString(v))
  427. case genid.FieldDescriptorProto_DefaultValue_field_number:
  428. fd.L1.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages
  429. case genid.FieldDescriptorProto_TypeName_field_number:
  430. rawTypeName = v
  431. case genid.FieldDescriptorProto_Options_field_number:
  432. fd.unmarshalOptions(v)
  433. rawOptions = appendOptions(rawOptions, v)
  434. }
  435. default:
  436. m := protowire.ConsumeFieldValue(num, typ, b)
  437. b = b[m:]
  438. }
  439. }
  440. if fd.L1.Kind == protoreflect.MessageKind && fd.L1.EditionFeatures.IsDelimitedEncoded {
  441. fd.L1.Kind = protoreflect.GroupKind
  442. }
  443. if fd.L1.EditionFeatures.IsLegacyRequired {
  444. fd.L1.Cardinality = protoreflect.Required
  445. }
  446. if rawTypeName != nil {
  447. name := makeFullName(sb, rawTypeName)
  448. switch fd.L1.Kind {
  449. case protoreflect.EnumKind:
  450. fd.L1.Enum = PlaceholderEnum(name)
  451. case protoreflect.MessageKind, protoreflect.GroupKind:
  452. fd.L1.Message = PlaceholderMessage(name)
  453. }
  454. }
  455. fd.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Field, rawOptions)
  456. }
  457. func (fd *Field) unmarshalOptions(b []byte) {
  458. const FieldOptions_EnforceUTF8 = 13
  459. for len(b) > 0 {
  460. num, typ, n := protowire.ConsumeTag(b)
  461. b = b[n:]
  462. switch typ {
  463. case protowire.VarintType:
  464. v, m := protowire.ConsumeVarint(b)
  465. b = b[m:]
  466. switch num {
  467. case genid.FieldOptions_Packed_field_number:
  468. fd.L1.EditionFeatures.IsPacked = protowire.DecodeBool(v)
  469. case genid.FieldOptions_Lazy_field_number:
  470. fd.L1.IsLazy = protowire.DecodeBool(v)
  471. case FieldOptions_EnforceUTF8:
  472. fd.L1.EditionFeatures.IsUTF8Validated = protowire.DecodeBool(v)
  473. }
  474. case protowire.BytesType:
  475. v, m := protowire.ConsumeBytes(b)
  476. b = b[m:]
  477. switch num {
  478. case genid.FieldOptions_Features_field_number:
  479. fd.L1.EditionFeatures = unmarshalFeatureSet(v, fd.L1.EditionFeatures)
  480. }
  481. default:
  482. m := protowire.ConsumeFieldValue(num, typ, b)
  483. b = b[m:]
  484. }
  485. }
  486. }
  487. func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
  488. od.L0.ParentFile = pf
  489. od.L0.Parent = pd
  490. od.L0.Index = i
  491. var rawOptions []byte
  492. for len(b) > 0 {
  493. num, typ, n := protowire.ConsumeTag(b)
  494. b = b[n:]
  495. switch typ {
  496. case protowire.BytesType:
  497. v, m := protowire.ConsumeBytes(b)
  498. b = b[m:]
  499. switch num {
  500. case genid.OneofDescriptorProto_Name_field_number:
  501. od.L0.FullName = appendFullName(sb, pd.FullName(), v)
  502. case genid.OneofDescriptorProto_Options_field_number:
  503. rawOptions = appendOptions(rawOptions, v)
  504. }
  505. default:
  506. m := protowire.ConsumeFieldValue(num, typ, b)
  507. b = b[m:]
  508. }
  509. }
  510. od.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Oneof, rawOptions)
  511. }
  512. func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) {
  513. var rawTypeName []byte
  514. var rawOptions []byte
  515. xd.L2 = new(ExtensionL2)
  516. for len(b) > 0 {
  517. num, typ, n := protowire.ConsumeTag(b)
  518. b = b[n:]
  519. switch typ {
  520. case protowire.VarintType:
  521. v, m := protowire.ConsumeVarint(b)
  522. b = b[m:]
  523. switch num {
  524. case genid.FieldDescriptorProto_Proto3Optional_field_number:
  525. xd.L2.IsProto3Optional = protowire.DecodeBool(v)
  526. }
  527. case protowire.BytesType:
  528. v, m := protowire.ConsumeBytes(b)
  529. b = b[m:]
  530. switch num {
  531. case genid.FieldDescriptorProto_JsonName_field_number:
  532. xd.L2.StringName.InitJSON(sb.MakeString(v))
  533. case genid.FieldDescriptorProto_DefaultValue_field_number:
  534. xd.L2.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions
  535. case genid.FieldDescriptorProto_TypeName_field_number:
  536. rawTypeName = v
  537. case genid.FieldDescriptorProto_Options_field_number:
  538. rawOptions = appendOptions(rawOptions, v)
  539. }
  540. default:
  541. m := protowire.ConsumeFieldValue(num, typ, b)
  542. b = b[m:]
  543. }
  544. }
  545. if rawTypeName != nil {
  546. name := makeFullName(sb, rawTypeName)
  547. switch xd.L1.Kind {
  548. case protoreflect.EnumKind:
  549. xd.L2.Enum = PlaceholderEnum(name)
  550. case protoreflect.MessageKind, protoreflect.GroupKind:
  551. xd.L2.Message = PlaceholderMessage(name)
  552. }
  553. }
  554. xd.L2.Options = xd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Field, rawOptions)
  555. }
  556. func (sd *Service) unmarshalFull(b []byte, sb *strs.Builder) {
  557. var rawMethods [][]byte
  558. var rawOptions []byte
  559. sd.L2 = new(ServiceL2)
  560. for len(b) > 0 {
  561. num, typ, n := protowire.ConsumeTag(b)
  562. b = b[n:]
  563. switch typ {
  564. case protowire.BytesType:
  565. v, m := protowire.ConsumeBytes(b)
  566. b = b[m:]
  567. switch num {
  568. case genid.ServiceDescriptorProto_Method_field_number:
  569. rawMethods = append(rawMethods, v)
  570. case genid.ServiceDescriptorProto_Options_field_number:
  571. rawOptions = appendOptions(rawOptions, v)
  572. }
  573. default:
  574. m := protowire.ConsumeFieldValue(num, typ, b)
  575. b = b[m:]
  576. }
  577. }
  578. if len(rawMethods) > 0 {
  579. sd.L2.Methods.List = make([]Method, len(rawMethods))
  580. for i, b := range rawMethods {
  581. sd.L2.Methods.List[i].unmarshalFull(b, sb, sd.L0.ParentFile, sd, i)
  582. }
  583. }
  584. sd.L2.Options = sd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Service, rawOptions)
  585. }
  586. func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
  587. md.L0.ParentFile = pf
  588. md.L0.Parent = pd
  589. md.L0.Index = i
  590. var rawOptions []byte
  591. for len(b) > 0 {
  592. num, typ, n := protowire.ConsumeTag(b)
  593. b = b[n:]
  594. switch typ {
  595. case protowire.VarintType:
  596. v, m := protowire.ConsumeVarint(b)
  597. b = b[m:]
  598. switch num {
  599. case genid.MethodDescriptorProto_ClientStreaming_field_number:
  600. md.L1.IsStreamingClient = protowire.DecodeBool(v)
  601. case genid.MethodDescriptorProto_ServerStreaming_field_number:
  602. md.L1.IsStreamingServer = protowire.DecodeBool(v)
  603. }
  604. case protowire.BytesType:
  605. v, m := protowire.ConsumeBytes(b)
  606. b = b[m:]
  607. switch num {
  608. case genid.MethodDescriptorProto_Name_field_number:
  609. md.L0.FullName = appendFullName(sb, pd.FullName(), v)
  610. case genid.MethodDescriptorProto_InputType_field_number:
  611. md.L1.Input = PlaceholderMessage(makeFullName(sb, v))
  612. case genid.MethodDescriptorProto_OutputType_field_number:
  613. md.L1.Output = PlaceholderMessage(makeFullName(sb, v))
  614. case genid.MethodDescriptorProto_Options_field_number:
  615. rawOptions = appendOptions(rawOptions, v)
  616. }
  617. default:
  618. m := protowire.ConsumeFieldValue(num, typ, b)
  619. b = b[m:]
  620. }
  621. }
  622. md.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Method, rawOptions)
  623. }
  624. // appendOptions appends src to dst, where the returned slice is never nil.
  625. // This is necessary to distinguish between empty and unpopulated options.
  626. func appendOptions(dst, src []byte) []byte {
  627. if dst == nil {
  628. dst = []byte{}
  629. }
  630. return append(dst, src...)
  631. }
  632. // optionsUnmarshaler constructs a lazy unmarshal function for an options message.
  633. //
  634. // The type of message to unmarshal to is passed as a pointer since the
  635. // vars in descopts may not yet be populated at the time this function is called.
  636. func (db *Builder) optionsUnmarshaler(p *protoreflect.ProtoMessage, b []byte) func() protoreflect.ProtoMessage {
  637. if b == nil {
  638. return nil
  639. }
  640. var opts protoreflect.ProtoMessage
  641. var once sync.Once
  642. return func() protoreflect.ProtoMessage {
  643. once.Do(func() {
  644. if *p == nil {
  645. panic("Descriptor.Options called without importing the descriptor package")
  646. }
  647. opts = reflect.New(reflect.TypeOf(*p).Elem()).Interface().(protoreflect.ProtoMessage)
  648. if err := (proto.UnmarshalOptions{
  649. AllowPartial: true,
  650. Resolver: db.TypeResolver,
  651. }).Unmarshal(b, opts); err != nil {
  652. panic(err)
  653. }
  654. })
  655. return opts
  656. }
  657. }