desc_lazy.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  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. md.unmarshalOptions(v)
  312. rawOptions = appendOptions(rawOptions, v)
  313. }
  314. default:
  315. m := protowire.ConsumeFieldValue(num, typ, b)
  316. b = b[m:]
  317. }
  318. }
  319. if len(rawFields) > 0 || len(rawOneofs) > 0 {
  320. md.L2.Fields.List = make([]Field, len(rawFields))
  321. md.L2.Oneofs.List = make([]Oneof, len(rawOneofs))
  322. for i, b := range rawFields {
  323. fd := &md.L2.Fields.List[i]
  324. fd.unmarshalFull(b, sb, md.L0.ParentFile, md, i)
  325. if fd.L1.Cardinality == protoreflect.Required {
  326. md.L2.RequiredNumbers.List = append(md.L2.RequiredNumbers.List, fd.L1.Number)
  327. }
  328. }
  329. for i, b := range rawOneofs {
  330. od := &md.L2.Oneofs.List[i]
  331. od.unmarshalFull(b, sb, md.L0.ParentFile, md, i)
  332. }
  333. }
  334. md.L2.Options = md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Message, rawOptions)
  335. }
  336. func (md *Message) unmarshalOptions(b []byte) {
  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.MessageOptions_MapEntry_field_number:
  346. md.L1.IsMapEntry = protowire.DecodeBool(v)
  347. case genid.MessageOptions_MessageSetWireFormat_field_number:
  348. md.L1.IsMessageSet = protowire.DecodeBool(v)
  349. }
  350. default:
  351. m := protowire.ConsumeFieldValue(num, typ, b)
  352. b = b[m:]
  353. }
  354. }
  355. }
  356. func unmarshalMessageReservedRange(b []byte) (r [2]protoreflect.FieldNumber) {
  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_ReservedRange_Start_field_number:
  366. r[0] = protoreflect.FieldNumber(v)
  367. case genid.DescriptorProto_ReservedRange_End_field_number:
  368. r[1] = protoreflect.FieldNumber(v)
  369. }
  370. default:
  371. m := protowire.ConsumeFieldValue(num, typ, b)
  372. b = b[m:]
  373. }
  374. }
  375. return r
  376. }
  377. func unmarshalMessageExtensionRange(b []byte) (r [2]protoreflect.FieldNumber, rawOptions []byte) {
  378. for len(b) > 0 {
  379. num, typ, n := protowire.ConsumeTag(b)
  380. b = b[n:]
  381. switch typ {
  382. case protowire.VarintType:
  383. v, m := protowire.ConsumeVarint(b)
  384. b = b[m:]
  385. switch num {
  386. case genid.DescriptorProto_ExtensionRange_Start_field_number:
  387. r[0] = protoreflect.FieldNumber(v)
  388. case genid.DescriptorProto_ExtensionRange_End_field_number:
  389. r[1] = protoreflect.FieldNumber(v)
  390. }
  391. case protowire.BytesType:
  392. v, m := protowire.ConsumeBytes(b)
  393. b = b[m:]
  394. switch num {
  395. case genid.DescriptorProto_ExtensionRange_Options_field_number:
  396. rawOptions = appendOptions(rawOptions, v)
  397. }
  398. default:
  399. m := protowire.ConsumeFieldValue(num, typ, b)
  400. b = b[m:]
  401. }
  402. }
  403. return r, rawOptions
  404. }
  405. func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
  406. fd.L0.ParentFile = pf
  407. fd.L0.Parent = pd
  408. fd.L0.Index = i
  409. fd.L1.EditionFeatures = featuresFromParentDesc(fd.Parent())
  410. var rawTypeName []byte
  411. var rawOptions []byte
  412. for len(b) > 0 {
  413. num, typ, n := protowire.ConsumeTag(b)
  414. b = b[n:]
  415. switch typ {
  416. case protowire.VarintType:
  417. v, m := protowire.ConsumeVarint(b)
  418. b = b[m:]
  419. switch num {
  420. case genid.FieldDescriptorProto_Number_field_number:
  421. fd.L1.Number = protoreflect.FieldNumber(v)
  422. case genid.FieldDescriptorProto_Label_field_number:
  423. fd.L1.Cardinality = protoreflect.Cardinality(v)
  424. case genid.FieldDescriptorProto_Type_field_number:
  425. fd.L1.Kind = protoreflect.Kind(v)
  426. case genid.FieldDescriptorProto_OneofIndex_field_number:
  427. // In Message.unmarshalFull, we allocate slices for both
  428. // the field and oneof descriptors before unmarshaling either
  429. // of them. This ensures pointers to slice elements are stable.
  430. od := &pd.(*Message).L2.Oneofs.List[v]
  431. od.L1.Fields.List = append(od.L1.Fields.List, fd)
  432. if fd.L1.ContainingOneof != nil {
  433. panic("oneof type already set")
  434. }
  435. fd.L1.ContainingOneof = od
  436. case genid.FieldDescriptorProto_Proto3Optional_field_number:
  437. fd.L1.IsProto3Optional = protowire.DecodeBool(v)
  438. }
  439. case protowire.BytesType:
  440. v, m := protowire.ConsumeBytes(b)
  441. b = b[m:]
  442. switch num {
  443. case genid.FieldDescriptorProto_Name_field_number:
  444. fd.L0.FullName = appendFullName(sb, pd.FullName(), v)
  445. case genid.FieldDescriptorProto_JsonName_field_number:
  446. fd.L1.StringName.InitJSON(sb.MakeString(v))
  447. case genid.FieldDescriptorProto_DefaultValue_field_number:
  448. fd.L1.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages
  449. case genid.FieldDescriptorProto_TypeName_field_number:
  450. rawTypeName = v
  451. case genid.FieldDescriptorProto_Options_field_number:
  452. fd.unmarshalOptions(v)
  453. rawOptions = appendOptions(rawOptions, v)
  454. }
  455. default:
  456. m := protowire.ConsumeFieldValue(num, typ, b)
  457. b = b[m:]
  458. }
  459. }
  460. if fd.L1.Kind == protoreflect.MessageKind && fd.L1.EditionFeatures.IsDelimitedEncoded {
  461. fd.L1.Kind = protoreflect.GroupKind
  462. }
  463. if fd.L1.EditionFeatures.IsLegacyRequired {
  464. fd.L1.Cardinality = protoreflect.Required
  465. }
  466. if rawTypeName != nil {
  467. name := makeFullName(sb, rawTypeName)
  468. switch fd.L1.Kind {
  469. case protoreflect.EnumKind:
  470. fd.L1.Enum = PlaceholderEnum(name)
  471. case protoreflect.MessageKind, protoreflect.GroupKind:
  472. fd.L1.Message = PlaceholderMessage(name)
  473. }
  474. }
  475. fd.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Field, rawOptions)
  476. }
  477. func (fd *Field) unmarshalOptions(b []byte) {
  478. const FieldOptions_EnforceUTF8 = 13
  479. for len(b) > 0 {
  480. num, typ, n := protowire.ConsumeTag(b)
  481. b = b[n:]
  482. switch typ {
  483. case protowire.VarintType:
  484. v, m := protowire.ConsumeVarint(b)
  485. b = b[m:]
  486. switch num {
  487. case genid.FieldOptions_Packed_field_number:
  488. fd.L1.EditionFeatures.IsPacked = protowire.DecodeBool(v)
  489. case genid.FieldOptions_Lazy_field_number:
  490. fd.L1.IsLazy = protowire.DecodeBool(v)
  491. case FieldOptions_EnforceUTF8:
  492. fd.L1.EditionFeatures.IsUTF8Validated = protowire.DecodeBool(v)
  493. }
  494. case protowire.BytesType:
  495. v, m := protowire.ConsumeBytes(b)
  496. b = b[m:]
  497. switch num {
  498. case genid.FieldOptions_Features_field_number:
  499. fd.L1.EditionFeatures = unmarshalFeatureSet(v, fd.L1.EditionFeatures)
  500. }
  501. default:
  502. m := protowire.ConsumeFieldValue(num, typ, b)
  503. b = b[m:]
  504. }
  505. }
  506. }
  507. func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
  508. od.L0.ParentFile = pf
  509. od.L0.Parent = pd
  510. od.L0.Index = i
  511. var rawOptions []byte
  512. for len(b) > 0 {
  513. num, typ, n := protowire.ConsumeTag(b)
  514. b = b[n:]
  515. switch typ {
  516. case protowire.BytesType:
  517. v, m := protowire.ConsumeBytes(b)
  518. b = b[m:]
  519. switch num {
  520. case genid.OneofDescriptorProto_Name_field_number:
  521. od.L0.FullName = appendFullName(sb, pd.FullName(), v)
  522. case genid.OneofDescriptorProto_Options_field_number:
  523. rawOptions = appendOptions(rawOptions, v)
  524. }
  525. default:
  526. m := protowire.ConsumeFieldValue(num, typ, b)
  527. b = b[m:]
  528. }
  529. }
  530. od.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Oneof, rawOptions)
  531. }
  532. func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) {
  533. var rawTypeName []byte
  534. var rawOptions []byte
  535. xd.L2 = new(ExtensionL2)
  536. for len(b) > 0 {
  537. num, typ, n := protowire.ConsumeTag(b)
  538. b = b[n:]
  539. switch typ {
  540. case protowire.VarintType:
  541. v, m := protowire.ConsumeVarint(b)
  542. b = b[m:]
  543. switch num {
  544. case genid.FieldDescriptorProto_Proto3Optional_field_number:
  545. xd.L2.IsProto3Optional = protowire.DecodeBool(v)
  546. }
  547. case protowire.BytesType:
  548. v, m := protowire.ConsumeBytes(b)
  549. b = b[m:]
  550. switch num {
  551. case genid.FieldDescriptorProto_JsonName_field_number:
  552. xd.L2.StringName.InitJSON(sb.MakeString(v))
  553. case genid.FieldDescriptorProto_DefaultValue_field_number:
  554. xd.L2.Default.val = protoreflect.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions
  555. case genid.FieldDescriptorProto_TypeName_field_number:
  556. rawTypeName = v
  557. case genid.FieldDescriptorProto_Options_field_number:
  558. rawOptions = appendOptions(rawOptions, v)
  559. }
  560. default:
  561. m := protowire.ConsumeFieldValue(num, typ, b)
  562. b = b[m:]
  563. }
  564. }
  565. if rawTypeName != nil {
  566. name := makeFullName(sb, rawTypeName)
  567. switch xd.L1.Kind {
  568. case protoreflect.EnumKind:
  569. xd.L2.Enum = PlaceholderEnum(name)
  570. case protoreflect.MessageKind, protoreflect.GroupKind:
  571. xd.L2.Message = PlaceholderMessage(name)
  572. }
  573. }
  574. xd.L2.Options = xd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Field, rawOptions)
  575. }
  576. func (sd *Service) unmarshalFull(b []byte, sb *strs.Builder) {
  577. var rawMethods [][]byte
  578. var rawOptions []byte
  579. sd.L2 = new(ServiceL2)
  580. for len(b) > 0 {
  581. num, typ, n := protowire.ConsumeTag(b)
  582. b = b[n:]
  583. switch typ {
  584. case protowire.BytesType:
  585. v, m := protowire.ConsumeBytes(b)
  586. b = b[m:]
  587. switch num {
  588. case genid.ServiceDescriptorProto_Method_field_number:
  589. rawMethods = append(rawMethods, v)
  590. case genid.ServiceDescriptorProto_Options_field_number:
  591. rawOptions = appendOptions(rawOptions, v)
  592. }
  593. default:
  594. m := protowire.ConsumeFieldValue(num, typ, b)
  595. b = b[m:]
  596. }
  597. }
  598. if len(rawMethods) > 0 {
  599. sd.L2.Methods.List = make([]Method, len(rawMethods))
  600. for i, b := range rawMethods {
  601. sd.L2.Methods.List[i].unmarshalFull(b, sb, sd.L0.ParentFile, sd, i)
  602. }
  603. }
  604. sd.L2.Options = sd.L0.ParentFile.builder.optionsUnmarshaler(&descopts.Service, rawOptions)
  605. }
  606. func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd protoreflect.Descriptor, i int) {
  607. md.L0.ParentFile = pf
  608. md.L0.Parent = pd
  609. md.L0.Index = i
  610. var rawOptions []byte
  611. for len(b) > 0 {
  612. num, typ, n := protowire.ConsumeTag(b)
  613. b = b[n:]
  614. switch typ {
  615. case protowire.VarintType:
  616. v, m := protowire.ConsumeVarint(b)
  617. b = b[m:]
  618. switch num {
  619. case genid.MethodDescriptorProto_ClientStreaming_field_number:
  620. md.L1.IsStreamingClient = protowire.DecodeBool(v)
  621. case genid.MethodDescriptorProto_ServerStreaming_field_number:
  622. md.L1.IsStreamingServer = protowire.DecodeBool(v)
  623. }
  624. case protowire.BytesType:
  625. v, m := protowire.ConsumeBytes(b)
  626. b = b[m:]
  627. switch num {
  628. case genid.MethodDescriptorProto_Name_field_number:
  629. md.L0.FullName = appendFullName(sb, pd.FullName(), v)
  630. case genid.MethodDescriptorProto_InputType_field_number:
  631. md.L1.Input = PlaceholderMessage(makeFullName(sb, v))
  632. case genid.MethodDescriptorProto_OutputType_field_number:
  633. md.L1.Output = PlaceholderMessage(makeFullName(sb, v))
  634. case genid.MethodDescriptorProto_Options_field_number:
  635. rawOptions = appendOptions(rawOptions, v)
  636. }
  637. default:
  638. m := protowire.ConsumeFieldValue(num, typ, b)
  639. b = b[m:]
  640. }
  641. }
  642. md.L1.Options = pf.builder.optionsUnmarshaler(&descopts.Method, rawOptions)
  643. }
  644. // appendOptions appends src to dst, where the returned slice is never nil.
  645. // This is necessary to distinguish between empty and unpopulated options.
  646. func appendOptions(dst, src []byte) []byte {
  647. if dst == nil {
  648. dst = []byte{}
  649. }
  650. return append(dst, src...)
  651. }
  652. // optionsUnmarshaler constructs a lazy unmarshal function for an options message.
  653. //
  654. // The type of message to unmarshal to is passed as a pointer since the
  655. // vars in descopts may not yet be populated at the time this function is called.
  656. func (db *Builder) optionsUnmarshaler(p *protoreflect.ProtoMessage, b []byte) func() protoreflect.ProtoMessage {
  657. if b == nil {
  658. return nil
  659. }
  660. var opts protoreflect.ProtoMessage
  661. var once sync.Once
  662. return func() protoreflect.ProtoMessage {
  663. once.Do(func() {
  664. if *p == nil {
  665. panic("Descriptor.Options called without importing the descriptor package")
  666. }
  667. opts = reflect.New(reflect.TypeOf(*p).Elem()).Interface().(protoreflect.ProtoMessage)
  668. if err := (proto.UnmarshalOptions{
  669. AllowPartial: true,
  670. Resolver: db.TypeResolver,
  671. }).Unmarshal(b, opts); err != nil {
  672. panic(err)
  673. }
  674. })
  675. return opts
  676. }
  677. }