@gtkx/codegen 1.0.0-rc.1 → 1.0.0-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/dist/analysis/descriptor-render.d.ts +20 -11
  2. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  3. package/dist/analysis/descriptor-render.js +296 -152
  4. package/dist/analysis/descriptor-render.js.map +1 -1
  5. package/dist/analysis/descriptor.d.ts +37 -34
  6. package/dist/analysis/descriptor.d.ts.map +1 -1
  7. package/dist/analysis/descriptor.js +34 -30
  8. package/dist/analysis/descriptor.js.map +1 -1
  9. package/dist/analysis/inheritance.d.ts +16 -16
  10. package/dist/analysis/inheritance.d.ts.map +1 -1
  11. package/dist/analysis/inheritance.js +139 -84
  12. package/dist/analysis/inheritance.js.map +1 -1
  13. package/dist/analysis/param-structure.d.ts +14 -13
  14. package/dist/analysis/param-structure.d.ts.map +1 -1
  15. package/dist/analysis/param-structure.js +104 -53
  16. package/dist/analysis/param-structure.js.map +1 -1
  17. package/dist/analysis/ts-type.d.ts +6 -5
  18. package/dist/analysis/ts-type.d.ts.map +1 -1
  19. package/dist/analysis/ts-type.js +71 -29
  20. package/dist/analysis/ts-type.js.map +1 -1
  21. package/dist/compile.d.ts +5 -5
  22. package/dist/compile.d.ts.map +1 -1
  23. package/dist/compile.js +70 -63
  24. package/dist/compile.js.map +1 -1
  25. package/dist/docs/api-reference.d.ts +12 -11
  26. package/dist/docs/api-reference.d.ts.map +1 -1
  27. package/dist/docs/api-reference.js +192 -123
  28. package/dist/docs/api-reference.js.map +1 -1
  29. package/dist/docs/element-page.d.ts +6 -9
  30. package/dist/docs/element-page.d.ts.map +1 -1
  31. package/dist/docs/element-page.js +69 -133
  32. package/dist/docs/element-page.js.map +1 -1
  33. package/dist/docs/pipeline.d.ts +10 -7
  34. package/dist/docs/pipeline.d.ts.map +1 -1
  35. package/dist/docs/pipeline.js +81 -53
  36. package/dist/docs/pipeline.js.map +1 -1
  37. package/dist/docs/render.d.ts +21 -19
  38. package/dist/docs/render.d.ts.map +1 -1
  39. package/dist/docs/render.js +80 -71
  40. package/dist/docs/render.js.map +1 -1
  41. package/dist/docs/symbol-page.d.ts +6 -6
  42. package/dist/docs/symbol-page.d.ts.map +1 -1
  43. package/dist/docs/symbol-page.js +126 -84
  44. package/dist/docs/symbol-page.js.map +1 -1
  45. package/dist/fingerprint.d.ts +29 -5
  46. package/dist/fingerprint.d.ts.map +1 -1
  47. package/dist/fingerprint.js +69 -13
  48. package/dist/fingerprint.js.map +1 -1
  49. package/dist/gi.d.ts +18 -0
  50. package/dist/gi.d.ts.map +1 -0
  51. package/dist/gi.js +23 -0
  52. package/dist/gi.js.map +1 -0
  53. package/dist/gir/ancestry.d.ts +4 -3
  54. package/dist/gir/ancestry.d.ts.map +1 -1
  55. package/dist/gir/ancestry.js +12 -15
  56. package/dist/gir/ancestry.js.map +1 -1
  57. package/dist/gir/callback.d.ts +6 -11
  58. package/dist/gir/callback.d.ts.map +1 -1
  59. package/dist/gir/callback.js +6 -7
  60. package/dist/gir/callback.js.map +1 -1
  61. package/dist/gir/class.d.ts +7 -5
  62. package/dist/gir/class.d.ts.map +1 -1
  63. package/dist/gir/class.js +14 -12
  64. package/dist/gir/class.js.map +1 -1
  65. package/dist/gir/enum.d.ts +3 -3
  66. package/dist/gir/enum.d.ts.map +1 -1
  67. package/dist/gir/enum.js +7 -6
  68. package/dist/gir/enum.js.map +1 -1
  69. package/dist/gir/field.d.ts +8 -3
  70. package/dist/gir/field.d.ts.map +1 -1
  71. package/dist/gir/field.js +30 -7
  72. package/dist/gir/field.js.map +1 -1
  73. package/dist/gir/function.d.ts +6 -3
  74. package/dist/gir/function.d.ts.map +1 -1
  75. package/dist/gir/function.js +23 -7
  76. package/dist/gir/function.js.map +1 -1
  77. package/dist/gir/gir-path.d.ts +2 -1
  78. package/dist/gir/gir-path.d.ts.map +1 -1
  79. package/dist/gir/gir-path.js +26 -10
  80. package/dist/gir/gir-path.js.map +1 -1
  81. package/dist/gir/libraries.d.ts +5 -3
  82. package/dist/gir/libraries.d.ts.map +1 -1
  83. package/dist/gir/libraries.js +41 -28
  84. package/dist/gir/libraries.js.map +1 -1
  85. package/dist/gir/library.d.ts +17 -11
  86. package/dist/gir/library.d.ts.map +1 -1
  87. package/dist/gir/library.js +116 -92
  88. package/dist/gir/library.js.map +1 -1
  89. package/dist/gir/namespace.d.ts +10 -10
  90. package/dist/gir/namespace.d.ts.map +1 -1
  91. package/dist/gir/namespace.js +21 -20
  92. package/dist/gir/namespace.js.map +1 -1
  93. package/dist/gir/nullable-overrides.d.ts +3 -0
  94. package/dist/gir/nullable-overrides.d.ts.map +1 -0
  95. package/dist/gir/nullable-overrides.js +5 -0
  96. package/dist/gir/nullable-overrides.js.map +1 -0
  97. package/dist/gir/parameter.d.ts +14 -12
  98. package/dist/gir/parameter.d.ts.map +1 -1
  99. package/dist/gir/parameter.js +27 -18
  100. package/dist/gir/parameter.js.map +1 -1
  101. package/dist/gir/parse.d.ts +12 -13
  102. package/dist/gir/parse.d.ts.map +1 -1
  103. package/dist/gir/parse.js +50 -40
  104. package/dist/gir/parse.js.map +1 -1
  105. package/dist/gir/primitives.d.ts +5 -4
  106. package/dist/gir/primitives.d.ts.map +1 -1
  107. package/dist/gir/primitives.js +4 -3
  108. package/dist/gir/primitives.js.map +1 -1
  109. package/dist/gir/property.d.ts +5 -4
  110. package/dist/gir/property.d.ts.map +1 -1
  111. package/dist/gir/property.js +10 -9
  112. package/dist/gir/property.js.map +1 -1
  113. package/dist/gir/record.d.ts +5 -4
  114. package/dist/gir/record.d.ts.map +1 -1
  115. package/dist/gir/record.js +13 -12
  116. package/dist/gir/record.js.map +1 -1
  117. package/dist/gir/size.d.ts +6 -5
  118. package/dist/gir/size.d.ts.map +1 -1
  119. package/dist/gir/size.js +49 -47
  120. package/dist/gir/size.js.map +1 -1
  121. package/dist/gir/type-id.d.ts +17 -15
  122. package/dist/gir/type-id.d.ts.map +1 -1
  123. package/dist/gir/type-id.js +5 -1
  124. package/dist/gir/type-id.js.map +1 -1
  125. package/dist/gir/type-ref.d.ts +3 -2
  126. package/dist/gir/type-ref.d.ts.map +1 -1
  127. package/dist/gir/type-ref.js +36 -25
  128. package/dist/gir/type-ref.js.map +1 -1
  129. package/dist/gir/type.d.ts +3 -2
  130. package/dist/gir/type.d.ts.map +1 -1
  131. package/dist/gir/type.js.map +1 -1
  132. package/dist/index.d.ts +3 -0
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +2 -0
  135. package/dist/index.js.map +1 -1
  136. package/dist/jsx.d.ts +28 -0
  137. package/dist/jsx.d.ts.map +1 -0
  138. package/dist/jsx.js +44 -0
  139. package/dist/jsx.js.map +1 -0
  140. package/dist/khronos/args.d.ts +7 -7
  141. package/dist/khronos/args.d.ts.map +1 -1
  142. package/dist/khronos/args.js +88 -67
  143. package/dist/khronos/args.js.map +1 -1
  144. package/dist/khronos/jsdoc.d.ts +4 -4
  145. package/dist/khronos/jsdoc.d.ts.map +1 -1
  146. package/dist/khronos/jsdoc.js +29 -16
  147. package/dist/khronos/jsdoc.js.map +1 -1
  148. package/dist/khronos/model.d.ts +8 -7
  149. package/dist/khronos/model.d.ts.map +1 -1
  150. package/dist/khronos/model.js +94 -59
  151. package/dist/khronos/model.js.map +1 -1
  152. package/dist/khronos/modules.d.ts +4 -3
  153. package/dist/khronos/modules.d.ts.map +1 -1
  154. package/dist/khronos/modules.js +40 -25
  155. package/dist/khronos/modules.js.map +1 -1
  156. package/dist/khronos/param-pair.d.ts +11 -0
  157. package/dist/khronos/param-pair.d.ts.map +1 -0
  158. package/dist/khronos/param-pair.js +6 -0
  159. package/dist/khronos/param-pair.js.map +1 -0
  160. package/dist/khronos/parse.d.ts +7 -8
  161. package/dist/khronos/parse.d.ts.map +1 -1
  162. package/dist/khronos/parse.js +17 -16
  163. package/dist/khronos/parse.js.map +1 -1
  164. package/dist/khronos/pipeline.d.ts +4 -4
  165. package/dist/khronos/pipeline.d.ts.map +1 -1
  166. package/dist/khronos/pipeline.js +97 -56
  167. package/dist/khronos/pipeline.js.map +1 -1
  168. package/dist/khronos/plan.d.ts +11 -10
  169. package/dist/khronos/plan.d.ts.map +1 -1
  170. package/dist/khronos/plan.js +109 -45
  171. package/dist/khronos/plan.js.map +1 -1
  172. package/dist/khronos/render.d.ts +5 -4
  173. package/dist/khronos/render.d.ts.map +1 -1
  174. package/dist/khronos/render.js +106 -59
  175. package/dist/khronos/render.js.map +1 -1
  176. package/dist/khronos/select.d.ts +4 -4
  177. package/dist/khronos/select.d.ts.map +1 -1
  178. package/dist/khronos/select.js +30 -19
  179. package/dist/khronos/select.js.map +1 -1
  180. package/dist/react/element-config.d.ts +20 -0
  181. package/dist/react/element-config.d.ts.map +1 -0
  182. package/dist/react/element-config.js +64 -0
  183. package/dist/react/element-config.js.map +1 -0
  184. package/dist/runner.d.ts +19 -10
  185. package/dist/runner.d.ts.map +1 -1
  186. package/dist/runner.js +48 -43
  187. package/dist/runner.js.map +1 -1
  188. package/dist/store/compile-store.d.ts +5 -3
  189. package/dist/store/compile-store.d.ts.map +1 -1
  190. package/dist/store/compile-store.js +24 -22
  191. package/dist/store/compile-store.js.map +1 -1
  192. package/dist/store/gi/async.d.ts +2 -1
  193. package/dist/store/gi/async.d.ts.map +1 -1
  194. package/dist/store/gi/async.js +28 -24
  195. package/dist/store/gi/async.js.map +1 -1
  196. package/dist/store/gi/callables.d.ts +26 -20
  197. package/dist/store/gi/callables.d.ts.map +1 -1
  198. package/dist/store/gi/callables.js +157 -100
  199. package/dist/store/gi/callables.js.map +1 -1
  200. package/dist/store/gi/callback.d.ts +3 -2
  201. package/dist/store/gi/callback.d.ts.map +1 -1
  202. package/dist/store/gi/callback.js +6 -3
  203. package/dist/store/gi/callback.js.map +1 -1
  204. package/dist/store/gi/class.d.ts +2 -1
  205. package/dist/store/gi/class.d.ts.map +1 -1
  206. package/dist/store/gi/class.js +86 -47
  207. package/dist/store/gi/class.js.map +1 -1
  208. package/dist/store/gi/companion.d.ts +2 -1
  209. package/dist/store/gi/companion.d.ts.map +1 -1
  210. package/dist/store/gi/companion.js +8 -5
  211. package/dist/store/gi/companion.js.map +1 -1
  212. package/dist/store/gi/constant.d.ts +3 -2
  213. package/dist/store/gi/constant.d.ts.map +1 -1
  214. package/dist/store/gi/constant.js +25 -8
  215. package/dist/store/gi/constant.js.map +1 -1
  216. package/dist/store/gi/constructor-props.d.ts +3 -2
  217. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  218. package/dist/store/gi/constructor-props.js +17 -10
  219. package/dist/store/gi/constructor-props.js.map +1 -1
  220. package/dist/store/gi/enum.d.ts +3 -2
  221. package/dist/store/gi/enum.d.ts.map +1 -1
  222. package/dist/store/gi/enum.js +14 -11
  223. package/dist/store/gi/enum.js.map +1 -1
  224. package/dist/store/gi/function.d.ts +5 -4
  225. package/dist/store/gi/function.d.ts.map +1 -1
  226. package/dist/store/gi/function.js +48 -23
  227. package/dist/store/gi/function.js.map +1 -1
  228. package/dist/store/gi/gtype-binding.d.ts +4 -4
  229. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  230. package/dist/store/gi/gtype-binding.js +15 -11
  231. package/dist/store/gi/gtype-binding.js.map +1 -1
  232. package/dist/store/gi/interface.d.ts +2 -1
  233. package/dist/store/gi/interface.d.ts.map +1 -1
  234. package/dist/store/gi/interface.js +36 -18
  235. package/dist/store/gi/interface.js.map +1 -1
  236. package/dist/store/gi/item-comparators.d.ts +3 -2
  237. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  238. package/dist/store/gi/item-comparators.js +33 -21
  239. package/dist/store/gi/item-comparators.js.map +1 -1
  240. package/dist/store/gi/method.d.ts +13 -13
  241. package/dist/store/gi/method.d.ts.map +1 -1
  242. package/dist/store/gi/method.js +188 -130
  243. package/dist/store/gi/method.js.map +1 -1
  244. package/dist/store/gi/param-marshal.d.ts +7 -6
  245. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  246. package/dist/store/gi/param-marshal.js +26 -13
  247. package/dist/store/gi/param-marshal.js.map +1 -1
  248. package/dist/store/gi/pipeline.d.ts +2 -1
  249. package/dist/store/gi/pipeline.d.ts.map +1 -1
  250. package/dist/store/gi/pipeline.js +38 -23
  251. package/dist/store/gi/pipeline.js.map +1 -1
  252. package/dist/store/gi/properties.d.ts +2 -1
  253. package/dist/store/gi/properties.d.ts.map +1 -1
  254. package/dist/store/gi/properties.js +6 -4
  255. package/dist/store/gi/properties.js.map +1 -1
  256. package/dist/store/gi/property-accessor.d.ts +11 -10
  257. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  258. package/dist/store/gi/property-accessor.js +86 -60
  259. package/dist/store/gi/property-accessor.js.map +1 -1
  260. package/dist/store/gi/record-constructor.d.ts +3 -2
  261. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  262. package/dist/store/gi/record-constructor.js +40 -28
  263. package/dist/store/gi/record-constructor.js.map +1 -1
  264. package/dist/store/gi/record-field-accessor.d.ts +9 -8
  265. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  266. package/dist/store/gi/record-field-accessor.js +187 -99
  267. package/dist/store/gi/record-field-accessor.js.map +1 -1
  268. package/dist/store/gi/record-layout.d.ts +6 -5
  269. package/dist/store/gi/record-layout.d.ts.map +1 -1
  270. package/dist/store/gi/record-layout.js +75 -39
  271. package/dist/store/gi/record-layout.js.map +1 -1
  272. package/dist/store/gi/record.d.ts +2 -1
  273. package/dist/store/gi/record.d.ts.map +1 -1
  274. package/dist/store/gi/record.js +15 -16
  275. package/dist/store/gi/record.js.map +1 -1
  276. package/dist/store/gi/registration.d.ts +3 -3
  277. package/dist/store/gi/registration.d.ts.map +1 -1
  278. package/dist/store/gi/registration.js +3 -2
  279. package/dist/store/gi/registration.js.map +1 -1
  280. package/dist/store/gi/return-wrap.d.ts +2 -2
  281. package/dist/store/gi/return-wrap.d.ts.map +1 -1
  282. package/dist/store/gi/return-wrap.js +43 -22
  283. package/dist/store/gi/return-wrap.js.map +1 -1
  284. package/dist/store/gi/runtime-override.d.ts +2 -1
  285. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  286. package/dist/store/gi/runtime-override.js +6 -3
  287. package/dist/store/gi/runtime-override.js.map +1 -1
  288. package/dist/store/gi/signal.d.ts +3 -2
  289. package/dist/store/gi/signal.d.ts.map +1 -1
  290. package/dist/store/gi/signal.js +113 -66
  291. package/dist/store/gi/signal.js.map +1 -1
  292. package/dist/store/gi/value-marshalable.d.ts +15 -0
  293. package/dist/store/gi/value-marshalable.d.ts.map +1 -0
  294. package/dist/store/gi/value-marshalable.js +66 -0
  295. package/dist/store/gi/value-marshalable.js.map +1 -0
  296. package/dist/store/gi/vtable.d.ts +2 -1
  297. package/dist/store/gi/vtable.d.ts.map +1 -1
  298. package/dist/store/gi/vtable.js +60 -30
  299. package/dist/store/gi/vtable.js.map +1 -1
  300. package/dist/store/gi-store.d.ts +5 -4
  301. package/dist/store/gi-store.d.ts.map +1 -1
  302. package/dist/store/gi-store.js +4 -2
  303. package/dist/store/gi-store.js.map +1 -1
  304. package/dist/store/jsx/element-components.d.ts +23 -0
  305. package/dist/store/jsx/element-components.d.ts.map +1 -0
  306. package/dist/store/jsx/element-components.js +86 -0
  307. package/dist/store/jsx/element-components.js.map +1 -0
  308. package/dist/store/jsx/element-prop-imports.d.ts +17 -0
  309. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -0
  310. package/dist/store/jsx/element-prop-imports.js +15 -0
  311. package/dist/store/jsx/element-prop-imports.js.map +1 -0
  312. package/dist/store/jsx/element-prop-types.d.ts +10 -0
  313. package/dist/store/jsx/element-prop-types.d.ts.map +1 -0
  314. package/dist/store/jsx/element-prop-types.js +41 -0
  315. package/dist/store/jsx/element-prop-types.js.map +1 -0
  316. package/dist/store/jsx/gir-index.d.ts +16 -0
  317. package/dist/store/jsx/gir-index.d.ts.map +1 -0
  318. package/dist/store/jsx/gir-index.js +33 -0
  319. package/dist/store/jsx/gir-index.js.map +1 -0
  320. package/dist/store/jsx/intrinsic-elements.d.ts +26 -0
  321. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -0
  322. package/dist/store/jsx/intrinsic-elements.js +127 -0
  323. package/dist/store/jsx/intrinsic-elements.js.map +1 -0
  324. package/dist/store/{react → jsx}/jsx.d.ts +2 -4
  325. package/dist/store/jsx/jsx.d.ts.map +1 -0
  326. package/dist/store/{react → jsx}/jsx.js +110 -71
  327. package/dist/store/jsx/jsx.js.map +1 -0
  328. package/dist/store/jsx/metadata.d.ts +4 -0
  329. package/dist/store/jsx/metadata.d.ts.map +1 -0
  330. package/dist/store/{react → jsx}/metadata.js +148 -69
  331. package/dist/store/jsx/metadata.js.map +1 -0
  332. package/dist/store/jsx/omitted-props.d.ts +10 -0
  333. package/dist/store/jsx/omitted-props.d.ts.map +1 -0
  334. package/dist/store/jsx/omitted-props.js +22 -0
  335. package/dist/store/jsx/omitted-props.js.map +1 -0
  336. package/dist/store/jsx/pipeline.d.ts +23 -0
  337. package/dist/store/jsx/pipeline.d.ts.map +1 -0
  338. package/dist/store/{react → jsx}/pipeline.js +38 -15
  339. package/dist/store/jsx/pipeline.js.map +1 -0
  340. package/dist/store/{react → jsx}/props.d.ts +9 -12
  341. package/dist/store/jsx/props.d.ts.map +1 -0
  342. package/dist/store/jsx/props.js +153 -0
  343. package/dist/store/jsx/props.js.map +1 -0
  344. package/dist/store/jsx-store.d.ts +5 -3
  345. package/dist/store/jsx-store.d.ts.map +1 -1
  346. package/dist/store/jsx-store.js +4 -1
  347. package/dist/store/jsx-store.js.map +1 -1
  348. package/dist/store/store-fs.d.ts +14 -12
  349. package/dist/store/store-fs.d.ts.map +1 -1
  350. package/dist/store/store-fs.js +9 -7
  351. package/dist/store/store-fs.js.map +1 -1
  352. package/dist/writer/context.d.ts +2 -1
  353. package/dist/writer/context.d.ts.map +1 -1
  354. package/dist/writer/context.js +12 -6
  355. package/dist/writer/context.js.map +1 -1
  356. package/dist/writer/doc.d.ts +2 -1
  357. package/dist/writer/doc.d.ts.map +1 -1
  358. package/dist/writer/doc.js +13 -7
  359. package/dist/writer/doc.js.map +1 -1
  360. package/dist/writer/emit.d.ts +8 -7
  361. package/dist/writer/emit.d.ts.map +1 -1
  362. package/dist/writer/emit.js +13 -10
  363. package/dist/writer/emit.js.map +1 -1
  364. package/dist/writer/gtk-doc.d.ts +2 -1
  365. package/dist/writer/gtk-doc.d.ts.map +1 -1
  366. package/dist/writer/gtk-doc.js +29 -18
  367. package/dist/writer/gtk-doc.js.map +1 -1
  368. package/dist/writer/imports.d.ts +4 -2
  369. package/dist/writer/imports.d.ts.map +1 -1
  370. package/dist/writer/imports.js +35 -24
  371. package/dist/writer/imports.js.map +1 -1
  372. package/dist/writer/module.d.ts +3 -2
  373. package/dist/writer/module.d.ts.map +1 -1
  374. package/dist/writer/module.js +16 -9
  375. package/dist/writer/module.js.map +1 -1
  376. package/dist/xml.d.ts +4 -0
  377. package/dist/xml.d.ts.map +1 -0
  378. package/dist/xml.js +10 -0
  379. package/dist/xml.js.map +1 -0
  380. package/overrides/cairo/context.ts.ejs +7 -7
  381. package/overrides/cairo/matrix.ts.ejs +2 -2
  382. package/overrides/cairo/recording-surface.ts.ejs +2 -2
  383. package/overrides/cairo/region.ts.ejs +1 -1
  384. package/overrides/cairo/scaled-font.ts.ejs +3 -3
  385. package/package.json +14 -9
  386. package/src/analysis/descriptor-render.ts +516 -168
  387. package/src/analysis/descriptor.ts +162 -125
  388. package/src/analysis/inheritance.ts +286 -98
  389. package/src/analysis/param-structure.ts +188 -57
  390. package/src/analysis/ts-type.ts +113 -34
  391. package/src/compile.ts +103 -76
  392. package/src/docs/api-reference.ts +337 -146
  393. package/src/docs/element-page.ts +137 -150
  394. package/src/docs/pipeline.ts +135 -73
  395. package/src/docs/render.ts +151 -87
  396. package/src/docs/symbol-page.ts +268 -123
  397. package/src/fingerprint.ts +138 -26
  398. package/src/gi.ts +35 -0
  399. package/src/gir/ancestry.ts +26 -14
  400. package/src/gir/callback.ts +10 -15
  401. package/src/gir/class.ts +20 -16
  402. package/src/gir/enum.ts +9 -7
  403. package/src/gir/field.ts +37 -8
  404. package/src/gir/function.ts +33 -9
  405. package/src/gir/gir-path.ts +36 -12
  406. package/src/gir/libraries.ts +59 -33
  407. package/src/gir/library.ts +200 -97
  408. package/src/gir/namespace.ts +42 -26
  409. package/src/gir/nullable-overrides.ts +5 -0
  410. package/src/gir/parameter.ts +80 -42
  411. package/src/gir/parse.ts +102 -47
  412. package/src/gir/primitives.ts +25 -23
  413. package/src/gir/property.ts +13 -11
  414. package/src/gir/record.ts +16 -14
  415. package/src/gir/size.ts +91 -58
  416. package/src/gir/type-id.ts +33 -18
  417. package/src/gir/type-ref.ts +62 -26
  418. package/src/gir/type.ts +10 -8
  419. package/src/index.ts +8 -0
  420. package/src/jsx.ts +75 -0
  421. package/src/khronos/args.ts +158 -89
  422. package/src/khronos/jsdoc.ts +67 -29
  423. package/src/khronos/model.ts +154 -53
  424. package/src/khronos/modules.ts +67 -27
  425. package/src/khronos/param-pair.ts +14 -0
  426. package/src/khronos/parse.ts +37 -17
  427. package/src/khronos/pipeline.ts +193 -90
  428. package/src/khronos/plan.ts +235 -86
  429. package/src/khronos/render.ts +208 -71
  430. package/src/khronos/select.ts +48 -18
  431. package/src/react/element-config.ts +97 -0
  432. package/src/runner.ts +100 -57
  433. package/src/store/compile-store.ts +32 -26
  434. package/src/store/gi/async.ts +48 -21
  435. package/src/store/gi/callables.ts +339 -136
  436. package/src/store/gi/callback.ts +13 -4
  437. package/src/store/gi/class.ts +186 -64
  438. package/src/store/gi/companion.ts +15 -6
  439. package/src/store/gi/constant.ts +42 -8
  440. package/src/store/gi/constructor-props.ts +42 -16
  441. package/src/store/gi/enum.ts +28 -13
  442. package/src/store/gi/function.ts +88 -24
  443. package/src/store/gi/gtype-binding.ts +31 -18
  444. package/src/store/gi/interface.ts +101 -36
  445. package/src/store/gi/item-comparators.ts +74 -26
  446. package/src/store/gi/method.ts +377 -159
  447. package/src/store/gi/param-marshal.ts +38 -15
  448. package/src/store/gi/pipeline.ts +72 -22
  449. package/src/store/gi/properties.ts +16 -5
  450. package/src/store/gi/property-accessor.ts +192 -84
  451. package/src/store/gi/record-constructor.ts +70 -33
  452. package/src/store/gi/record-field-accessor.ts +415 -167
  453. package/src/store/gi/record-layout.ts +130 -43
  454. package/src/store/gi/record.ts +29 -15
  455. package/src/store/gi/registration.ts +15 -9
  456. package/src/store/gi/return-wrap.ts +71 -23
  457. package/src/store/gi/runtime-override.ts +13 -3
  458. package/src/store/gi/signal.ts +244 -104
  459. package/src/store/gi/value-marshalable.ts +96 -0
  460. package/src/store/gi/vtable.ts +117 -41
  461. package/src/store/gi-store.ts +26 -13
  462. package/src/store/jsx/element-components.ts +152 -0
  463. package/src/store/jsx/element-prop-imports.ts +24 -0
  464. package/src/store/jsx/element-prop-types.ts +59 -0
  465. package/src/store/jsx/gir-index.ts +62 -0
  466. package/src/store/jsx/intrinsic-elements.ts +253 -0
  467. package/src/store/{react → jsx}/jsx.ts +213 -99
  468. package/src/store/jsx/metadata.ts +385 -0
  469. package/src/store/jsx/omitted-props.ts +32 -0
  470. package/src/store/jsx/pipeline.ts +148 -0
  471. package/src/store/jsx/props.ts +262 -0
  472. package/src/store/jsx-store.ts +15 -3
  473. package/src/store/store-fs.ts +36 -20
  474. package/src/writer/context.ts +25 -6
  475. package/src/writer/doc.ts +19 -5
  476. package/src/writer/emit.ts +20 -11
  477. package/src/writer/gtk-doc.ts +48 -21
  478. package/src/writer/imports.ts +63 -28
  479. package/src/writer/module.ts +35 -11
  480. package/src/xml.ts +12 -0
  481. package/dist/store/gi/class-struct-record.d.ts +0 -9
  482. package/dist/store/gi/class-struct-record.d.ts.map +0 -1
  483. package/dist/store/gi/class-struct-record.js +0 -34
  484. package/dist/store/gi/class-struct-record.js.map +0 -1
  485. package/dist/store/react/built-ins.d.ts +0 -9
  486. package/dist/store/react/built-ins.d.ts.map +0 -1
  487. package/dist/store/react/built-ins.js +0 -226
  488. package/dist/store/react/built-ins.js.map +0 -1
  489. package/dist/store/react/element-components.d.ts +0 -15
  490. package/dist/store/react/element-components.d.ts.map +0 -1
  491. package/dist/store/react/element-components.js +0 -92
  492. package/dist/store/react/element-components.js.map +0 -1
  493. package/dist/store/react/element-prop-types.d.ts +0 -19
  494. package/dist/store/react/element-prop-types.d.ts.map +0 -1
  495. package/dist/store/react/element-prop-types.js +0 -244
  496. package/dist/store/react/element-prop-types.js.map +0 -1
  497. package/dist/store/react/element-props.d.ts +0 -4
  498. package/dist/store/react/element-props.d.ts.map +0 -1
  499. package/dist/store/react/element-props.js +0 -178
  500. package/dist/store/react/element-props.js.map +0 -1
  501. package/dist/store/react/gir-index.d.ts +0 -25
  502. package/dist/store/react/gir-index.d.ts.map +0 -1
  503. package/dist/store/react/gir-index.js +0 -55
  504. package/dist/store/react/gir-index.js.map +0 -1
  505. package/dist/store/react/intrinsic-elements.d.ts +0 -26
  506. package/dist/store/react/intrinsic-elements.d.ts.map +0 -1
  507. package/dist/store/react/intrinsic-elements.js +0 -107
  508. package/dist/store/react/intrinsic-elements.js.map +0 -1
  509. package/dist/store/react/jsx.d.ts.map +0 -1
  510. package/dist/store/react/jsx.js.map +0 -1
  511. package/dist/store/react/metadata.d.ts +0 -4
  512. package/dist/store/react/metadata.d.ts.map +0 -1
  513. package/dist/store/react/metadata.js.map +0 -1
  514. package/dist/store/react/pipeline.d.ts +0 -14
  515. package/dist/store/react/pipeline.d.ts.map +0 -1
  516. package/dist/store/react/pipeline.js.map +0 -1
  517. package/dist/store/react/props.d.ts.map +0 -1
  518. package/dist/store/react/props.js +0 -133
  519. package/dist/store/react/props.js.map +0 -1
  520. package/overrides/gtk/constants.ts.ejs +0 -3
  521. package/overrides/gtk/index.ts.ejs +0 -2
  522. package/src/store/gi/class-struct-record.ts +0 -40
  523. package/src/store/react/built-ins.ts +0 -260
  524. package/src/store/react/element-components.ts +0 -138
  525. package/src/store/react/element-prop-types.ts +0 -280
  526. package/src/store/react/element-props.ts +0 -204
  527. package/src/store/react/gir-index.ts +0 -85
  528. package/src/store/react/intrinsic-elements.ts +0 -161
  529. package/src/store/react/metadata.ts +0 -197
  530. package/src/store/react/pipeline.ts +0 -90
  531. package/src/store/react/props.ts +0 -197
@@ -1,23 +1,17 @@
1
1
  import { toCamelIdentifier } from "@gtkx/utils";
2
- import { tStruct } from "../../analysis/descriptor.js";
3
- import { isInlineCallbackRef, renderDescriptor } from "../../analysis/descriptor-render.js";
4
- import { renderTsType } from "../../analysis/ts-type.js";
5
2
  import type { GirField } from "../../gir/field.js";
6
3
  import type { FieldSlot } from "../../gir/size.js";
7
- import type { GirType } from "../../gir/type.js";
8
4
  import type { TypeId } from "../../gir/type-id.js";
5
+ import type { GirType } from "../../gir/type.js";
9
6
  import type { ModuleContext } from "../../writer/context.js";
7
+ import { isInlineCallbackRef, renderDescriptor } from "../../analysis/descriptor-render.js";
8
+ import { tStruct } from "../../analysis/descriptor.js";
9
+ import { renderTsType } from "../../analysis/ts-type.js";
10
10
  import { renderJsDoc } from "../../writer/doc.js";
11
11
  import { indent, renderBlock } from "../../writer/emit.js";
12
- import { refIsClassStruct } from "./class-struct-record.js";
13
12
  import { bitMask, computeRecordFieldSlots, mergeBitfield, type RecordFieldSlot } from "./record-layout.js";
14
13
  import { wrapReturnValue } from "./return-wrap.js";
15
-
16
- export const isEmittableField = (context: ModuleContext, field: GirField): field is GirField & { type: TypeId } =>
17
- !field.private &&
18
- field.type !== undefined &&
19
- !isInlineCallbackRef(context.library, field.type) &&
20
- !refIsClassStruct(context, field.type);
14
+ import { isValueMarshalable } from "./value-marshalable.js";
21
15
 
22
16
  type FieldWriteSpec = {
23
17
  descriptor: string;
@@ -26,25 +20,122 @@ type FieldWriteSpec = {
26
20
  valueExpr: string;
27
21
  };
28
22
 
29
- export const emitFieldWrite = (context: ModuleContext, spec: FieldWriteSpec): string => {
23
+ type AdmittedField = {
24
+ field: GirField & { type: TypeId };
25
+ jsName: string;
26
+ };
27
+
28
+ type RecordFieldEntry = {
29
+ jsName: string;
30
+ tsType: string;
31
+ writable: boolean;
32
+ doc: string | undefined;
33
+ };
34
+
35
+ type InlineFieldVisit = {
36
+ jsName: string;
37
+ descriptor: string;
38
+ offset: number;
39
+ slot: FieldSlot;
40
+ type: TypeId;
41
+ };
42
+
43
+ type InlineFieldVisitors = {
44
+ leaf: (visit: InlineFieldVisit) => void;
45
+ nested: (jsName: string, nested: GirField[], offset: number) => void;
46
+ };
47
+
48
+ type ElementWriteOptions = {
49
+ fields: GirField[];
50
+ baseOffset: number;
51
+ valuePath: string;
52
+ out: string[];
53
+ };
54
+
55
+ type StructArrayTarget = {
56
+ field: GirField;
57
+ jsName: string;
58
+ slot: FieldSlot;
59
+ siblingFields: GirField[];
60
+ };
61
+
62
+ type StructArrayAccessorOptions = {
63
+ context: ModuleContext;
64
+ jsName: string;
65
+ tsType: string;
66
+ elementDescriptor: string;
67
+ offset: number;
68
+ lengthExpr: string;
69
+ elementSize: number;
70
+ elementFields: GirField[];
71
+ };
72
+
73
+ type StructArrayResolution = {
74
+ fieldType: TypeId;
75
+ elementFields: GirField[];
76
+ lengthExpr: string;
77
+ elementSize: number;
78
+ };
79
+
80
+ type StructArrayElements = {
81
+ arrayType: Extract<GirType, { kind: "carray" }>;
82
+ elementFields: GirField[];
83
+ };
84
+
85
+ type AccessorOptions = {
86
+ context: ModuleContext;
87
+ jsName: string;
88
+ tsType: string;
89
+ descriptor: string;
90
+ slot: FieldSlot;
91
+ fieldType: TypeId;
92
+ };
93
+
94
+ // An inline record field is read and written through its own bytes, so it can only be exposed when
95
+ // those bytes are copyable; a pointer field is marshalled as a handle and is always fine.
96
+ const isMarshalableField = (context: ModuleContext, field: GirField): boolean => {
97
+ if (field.cType?.endsWith("*") === true) {
98
+ return true;
99
+ }
100
+
101
+ const type = field.type === undefined ? undefined : context.library.typeFor(field.type);
102
+
103
+ if (type?.kind !== "record") {
104
+ return true;
105
+ }
106
+
107
+ return isValueMarshalable(context, type.namespace.name, type.value);
108
+ };
109
+
110
+ const isEmittableField = (context: ModuleContext, field: GirField): field is GirField & { type: TypeId } =>
111
+ !field.private &&
112
+ field.type !== undefined &&
113
+ !isInlineCallbackRef(context.library, field.type) &&
114
+ isMarshalableField(context, field);
115
+
116
+ const emitFieldWrite = (context: ModuleContext, spec: FieldWriteSpec): string => {
30
117
  const { descriptor, slot, targetExpr, valueExpr } = spec;
31
118
  context.addRuntimeImport("write");
119
+
32
120
  if (slot.bitWidth === undefined) {
33
- return `write(${targetExpr}, ${descriptor}, ${slot.byteOffset}, ${valueExpr});`;
121
+ context.addRuntimeImport("toNative");
122
+
123
+ return (
124
+ `write(${targetExpr}, ${descriptor}, ${String(slot.byteOffset)}, ` +
125
+ `toNative(${descriptor}, ${valueExpr}));`
126
+ );
34
127
  }
128
+
35
129
  context.addRuntimeImport("read");
130
+
36
131
  const merged = mergeBitfield(
37
- `(read(${targetExpr}, ${descriptor}, ${slot.byteOffset}) as number)`,
132
+ `(read(${targetExpr}, ${descriptor}, ${String(slot.byteOffset)}) as number)`,
38
133
  valueExpr,
39
134
  bitMask(slot.bitWidth),
40
135
  slot.bitOffset ?? 0,
41
136
  );
42
- return `write(${targetExpr}, ${descriptor}, ${slot.byteOffset}, ${merged});`;
43
- };
44
137
 
45
- type AdmittedField = {
46
- field: GirField & { type: TypeId };
47
- jsName: string;
138
+ return `write(${targetExpr}, ${descriptor}, ${String(slot.byteOffset)}, ${merged});`;
48
139
  };
49
140
 
50
141
  const admitField = (
@@ -53,28 +144,39 @@ const admitField = (
53
144
  claimedNames: Set<string>,
54
145
  ): AdmittedField | undefined => {
55
146
  const { field } = slot;
56
- if (!field.readable && !field.writable) return undefined;
57
- if (!isEmittableField(context, field)) return undefined;
147
+
148
+ if (!field.readable && !field.writable) {
149
+ return undefined;
150
+ }
151
+
152
+ if (!isEmittableField(context, field)) {
153
+ return undefined;
154
+ }
155
+
58
156
  const jsName = toCamelIdentifier(field.name);
59
- if (claimedNames.has(jsName)) return undefined;
60
- if (jsName === "constructor") return undefined;
61
- return { field, jsName };
62
- };
63
157
 
64
- export type RecordFieldEntry = {
65
- jsName: string;
66
- tsType: string;
67
- writable: boolean;
68
- doc: string | undefined;
158
+ if (claimedNames.has(jsName)) {
159
+ return undefined;
160
+ }
161
+
162
+ if (jsName === "constructor") {
163
+ return undefined;
164
+ }
165
+
166
+ return { field, jsName };
69
167
  };
70
168
 
71
- export const resolveRecordFieldEntry = (
169
+ const resolveRecordFieldEntry = (
72
170
  context: ModuleContext,
73
171
  slot: RecordFieldSlot,
74
172
  claimedNames: Set<string>,
75
173
  ): RecordFieldEntry | undefined => {
76
174
  const admitted = admitField(context, slot, claimedNames);
77
- if (admitted === undefined) return undefined;
175
+
176
+ if (admitted === undefined) {
177
+ return undefined;
178
+ }
179
+
78
180
  return {
79
181
  jsName: admitted.jsName,
80
182
  tsType: renderTsType(context, admitted.field.type, false),
@@ -83,27 +185,40 @@ export const resolveRecordFieldEntry = (
83
185
  };
84
186
  };
85
187
 
86
- export const renderRecordFieldAccessor = (
188
+ const renderRecordFieldAccessor = (
87
189
  context: ModuleContext,
88
190
  slot: RecordFieldSlot,
89
191
  claimedNames: Set<string>,
90
192
  siblingFields: GirField[],
91
193
  ): string | undefined => {
92
194
  const admitted = admitField(context, slot, claimedNames);
93
- if (admitted === undefined) return undefined;
195
+
196
+ if (admitted === undefined) {
197
+ return undefined;
198
+ }
199
+
94
200
  const { field, jsName } = admitted;
95
201
  const doc = renderJsDoc(field.doc);
96
-
97
202
  const structArray = renderStructArrayAccessor(context, { field, jsName, slot: slot.slot, siblingFields });
98
- if (structArray !== undefined) return `${doc}${structArray}`;
203
+
204
+ if (structArray !== undefined) {
205
+ return `${doc}${structArray}`;
206
+ }
99
207
 
100
208
  if (!isAccessorEligibleType(context, field.type)) {
101
209
  const tsType = renderTsType(context, field.type, false);
210
+
102
211
  return `${doc}declare ${jsName}: ${tsType};`;
103
212
  }
104
213
 
105
- const descriptor = context.hoistDescriptor(renderDescriptor(context, field.type, "none"));
214
+ // A record field whose C type is the record itself rather than a pointer to it holds the value
215
+ // in place, so its own address is the value and no word may be loaded out of it.
216
+ const descriptor = context.hoistDescriptor(
217
+ renderDescriptor(context, field.type, "none", { isInline: isInlineField(context, field) }),
218
+ );
219
+
106
220
  const tsType = renderTsType(context, field.type, false);
221
+
107
222
  const accessorOptions: AccessorOptions = {
108
223
  context,
109
224
  jsName,
@@ -112,47 +227,80 @@ export const renderRecordFieldAccessor = (
112
227
  slot: slot.slot,
113
228
  fieldType: field.type,
114
229
  };
230
+
115
231
  const blocks: string[] = [getterBlock(accessorOptions)];
232
+
116
233
  if (field.writable) {
117
234
  blocks.push(setterBlock(accessorOptions));
118
235
  }
236
+
119
237
  return `${doc}${blocks.join("\n\n")}`;
120
238
  };
121
239
 
122
240
  const isAccessorEligibleType = (context: ModuleContext, ref: TypeId): boolean => {
123
- const type = context.library.typeOf(ref);
124
- if (type === undefined) return true;
241
+ const type = context.library.typeFor(ref);
242
+
243
+ if (type === undefined) {
244
+ return true;
245
+ }
246
+
125
247
  switch (type.kind) {
126
- case "primitive":
248
+ case "primitive": {
127
249
  return type.category !== "void" && type.category !== "unichar";
250
+ }
128
251
  case "class":
129
252
  case "interface":
130
253
  case "record":
131
254
  case "enum":
132
- case "alias":
255
+ case "alias": {
133
256
  return true;
134
- case "callback":
135
- return context.library.nameOf(ref) !== undefined;
136
- case "carray":
257
+ }
258
+ case "callback": {
259
+ return context.library.nameFor(ref) !== undefined;
260
+ }
261
+ case "carray": {
137
262
  return type.fixedSize !== undefined;
263
+ }
138
264
  case "list":
139
265
  case "hashtable":
140
- case "varargs":
266
+ case "varargs": {
141
267
  return false;
268
+ }
142
269
  }
143
270
  };
144
271
 
272
+ // A field whose record is embedded by value is read and written through its own bytes, so the
273
+ // constructor and the setter have to describe it the same way.
274
+ const isInlineField = (context: ModuleContext, field: GirField): boolean =>
275
+ field.type !== undefined && resolveInlineStructFields(context, field.type, field.cType) !== undefined;
276
+
145
277
  const resolveInlineStructFields = (
146
278
  context: ModuleContext,
147
279
  ref: TypeId | undefined,
148
280
  occurrenceCType: string | undefined,
149
281
  ): GirField[] | undefined => {
150
- if (ref === undefined) return undefined;
151
- if (occurrenceCType?.endsWith("*") === true) return undefined;
152
- const type = context.library.typeOf(ref);
153
- if (type?.kind !== "record") return undefined;
154
- if (type.value.cType?.endsWith("*") === true) return undefined;
155
- if (type.value.fields.length === 0) return undefined;
282
+ if (ref === undefined) {
283
+ return undefined;
284
+ }
285
+
286
+ if (occurrenceCType?.endsWith("*") === true) {
287
+ return undefined;
288
+ }
289
+
290
+ const type = context.library.typeFor(ref);
291
+
292
+ if (type?.kind !== "record") {
293
+ return undefined;
294
+ }
295
+
296
+ if (type.value.cType?.endsWith("*") === true) {
297
+ return undefined;
298
+ }
299
+
300
+ if (type.value.fields.length === 0) {
301
+ return undefined;
302
+ }
303
+
156
304
  return type.value.fields;
157
305
  };
158
306
 
@@ -160,24 +308,51 @@ const arrayLengthExpression = (
160
308
  arrayRef: Extract<GirType, { kind: "carray" }>,
161
309
  siblingFields: GirField[],
162
310
  ): string | undefined => {
163
- if (arrayRef.fixedSize !== undefined) return String(arrayRef.fixedSize);
164
- if (arrayRef.lengthParameterIndex === undefined) return undefined;
311
+ if (arrayRef.fixedSize !== undefined) {
312
+ return String(arrayRef.fixedSize);
313
+ }
314
+
315
+ if (arrayRef.lengthParameterIndex === undefined) {
316
+ return undefined;
317
+ }
318
+
165
319
  const lengthField = siblingFields.filter((field) => !field.private)[arrayRef.lengthParameterIndex];
166
- if (lengthField === undefined) return undefined;
320
+
321
+ if (lengthField === undefined) {
322
+ return undefined;
323
+ }
324
+
167
325
  return `this.${toCamelIdentifier(lengthField.name)}`;
168
326
  };
169
327
 
170
- type InlineFieldVisit = {
171
- jsName: string;
172
- descriptor: string;
173
- offset: number;
174
- slot: FieldSlot;
175
- type: TypeId;
176
- };
328
+ const visitInlineStructSlot = (
329
+ context: ModuleContext,
330
+ entry: RecordFieldSlot,
331
+ baseOffset: number,
332
+ visitors: InlineFieldVisitors,
333
+ ): void => {
334
+ const { field, slot } = entry;
177
335
 
178
- type InlineFieldVisitors = {
179
- leaf: (visit: InlineFieldVisit) => void;
180
- nested: (jsName: string, nested: GirField[], offset: number) => void;
336
+ if (field.private || field.type === undefined || isInlineCallbackRef(context.library, field.type)) {
337
+ return;
338
+ }
339
+
340
+ const jsName = toCamelIdentifier(field.name);
341
+ const offset = baseOffset + slot.byteOffset;
342
+ const nested = resolveInlineStructFields(context, field.type, field.cType);
343
+
344
+ if (nested !== undefined) {
345
+ visitors.nested(jsName, nested, offset);
346
+
347
+ return;
348
+ }
349
+
350
+ if (!isAccessorEligibleType(context, field.type)) {
351
+ return;
352
+ }
353
+
354
+ const descriptor = context.hoistDescriptor(renderDescriptor(context, field.type, "none"));
355
+ visitors.leaf({ jsName, descriptor, offset, slot, type: field.type });
181
356
  };
182
357
 
183
358
  const visitInlineStructFields = (
@@ -187,70 +362,67 @@ const visitInlineStructFields = (
187
362
  visitors: InlineFieldVisitors,
188
363
  ): void => {
189
364
  const { slots } = computeRecordFieldSlots(context, fields);
190
- for (const { field, slot } of slots) {
191
- if (field.private || field.type === undefined || isInlineCallbackRef(context.library, field.type)) {
192
- continue;
193
- }
194
- const jsName = toCamelIdentifier(field.name);
195
- const offset = baseOffset + slot.byteOffset;
196
- const nested = resolveInlineStructFields(context, field.type, field.cType);
197
- if (nested !== undefined) {
198
- visitors.nested(jsName, nested, offset);
199
- continue;
200
- }
201
- if (!isAccessorEligibleType(context, field.type)) continue;
202
- const descriptor = context.hoistDescriptor(renderDescriptor(context, field.type, "none"));
203
- visitors.leaf({ jsName, descriptor, offset, slot, type: field.type });
365
+
366
+ for (const entry of slots) {
367
+ visitInlineStructSlot(context, entry, baseOffset, visitors);
368
+ }
369
+ };
370
+
371
+ const elementAccessExpr = (descriptor: string, offset: number): string =>
372
+ `read(__array, ${descriptor}, __base + ${String(offset)})`;
373
+
374
+ const renderElementReadEntry = (context: ModuleContext, visit: InlineFieldVisit): string => {
375
+ const { jsName, descriptor, offset, slot, type } = visit;
376
+ const access = elementAccessExpr(descriptor, offset);
377
+
378
+ if (slot.bitWidth === undefined) {
379
+ return `${jsName}: ${access} as ${renderTsType(context, type, false)}`;
204
380
  }
381
+
382
+ const shift = slot.bitOffset ?? 0;
383
+
384
+ return `${jsName}: (((${access} as number) >>> ${String(shift)}) & ${String(bitMask(slot.bitWidth))})`;
205
385
  };
206
386
 
207
387
  const renderElementReadObject = (context: ModuleContext, fields: GirField[], baseOffset: number): string => {
208
388
  const entries: string[] = [];
389
+
209
390
  visitInlineStructFields(context, fields, baseOffset, {
210
- leaf: ({ jsName, descriptor, offset, slot, type }) => {
211
- if (slot.bitWidth === undefined) {
212
- entries.push(
213
- `${jsName}: read(__array, ${descriptor}, __base + ${offset}) as ${renderTsType(context, type, false)}`,
214
- );
215
- return;
216
- }
217
- const shift = slot.bitOffset ?? 0;
218
- entries.push(
219
- `${jsName}: (((read(__array, ${descriptor}, __base + ${offset}) as number) >>> ${shift}) & ${bitMask(slot.bitWidth)})`,
220
- );
391
+ leaf: (visit) => {
392
+ entries.push(renderElementReadEntry(context, visit));
221
393
  },
222
394
  nested: (jsName, nested, offset) => {
223
395
  entries.push(`${jsName}: ${renderElementReadObject(context, nested, offset)}`);
224
396
  },
225
397
  });
398
+
226
399
  return `{ ${entries.join(", ")} }`;
227
400
  };
228
401
 
229
- type ElementWriteOptions = {
230
- fields: GirField[];
231
- baseOffset: number;
232
- valuePath: string;
233
- out: string[];
402
+ const renderElementWriteStatement = (visit: InlineFieldVisit, valuePath: string): string => {
403
+ const { jsName, descriptor, offset, slot } = visit;
404
+ const valueExpr = `${valuePath}.${jsName}`;
405
+
406
+ if (slot.bitWidth === undefined) {
407
+ return `write(__array, ${descriptor}, __base + ${String(offset)}, ${valueExpr});`;
408
+ }
409
+
410
+ const merged = mergeBitfield(
411
+ `(${elementAccessExpr(descriptor, offset)} as number)`,
412
+ valueExpr,
413
+ bitMask(slot.bitWidth),
414
+ slot.bitOffset ?? 0,
415
+ );
416
+
417
+ return `write(__array, ${descriptor}, __base + ${String(offset)}, ${merged});`;
234
418
  };
235
419
 
236
420
  const appendElementWriteStatements = (context: ModuleContext, options: ElementWriteOptions): void => {
237
421
  const { fields, baseOffset, valuePath, out } = options;
422
+
238
423
  visitInlineStructFields(context, fields, baseOffset, {
239
- leaf: ({ jsName, descriptor, offset, slot }) => {
240
- const valueExpr = `${valuePath}.${jsName}`;
241
- if (slot.bitWidth === undefined) {
242
- out.push(`write(__array, ${descriptor}, __base + ${offset}, ${valueExpr});`);
243
- return;
244
- }
245
- const mask = bitMask(slot.bitWidth);
246
- const shift = slot.bitOffset ?? 0;
247
- const merged = mergeBitfield(
248
- `(read(__array, ${descriptor}, __base + ${offset}) as number)`,
249
- valueExpr,
250
- mask,
251
- shift,
252
- );
253
- out.push(`write(__array, ${descriptor}, __base + ${offset}, ${merged});`);
424
+ leaf: (visit) => {
425
+ out.push(renderElementWriteStatement(visit, valuePath));
254
426
  },
255
427
  nested: (jsName, nested, offset) => {
256
428
  appendElementWriteStatements(context, {
@@ -263,83 +435,141 @@ const appendElementWriteStatements = (context: ModuleContext, options: ElementWr
263
435
  });
264
436
  };
265
437
 
266
- type StructArrayTarget = {
267
- field: GirField;
268
- jsName: string;
269
- slot: FieldSlot;
270
- siblingFields: GirField[];
271
- };
272
-
273
- type StructArrayAccessorOptions = {
274
- context: ModuleContext;
275
- jsName: string;
276
- tsType: string;
277
- elementDescriptor: string;
278
- offset: number;
279
- lengthExpr: string;
280
- elementSize: number;
281
- elementFields: GirField[];
282
- };
283
-
284
438
  const structArrayGetterBlock = (options: StructArrayAccessorOptions): string => {
285
439
  const { context, jsName, tsType, elementDescriptor, offset, lengthExpr, elementSize, elementFields } = options;
286
440
  const element = renderElementReadObject(context, elementFields, 0);
287
- const loop = [`const __base = __index * ${elementSize};`, `__result.push(${element});`].join("\n");
441
+ const loop = [`const __base = __index * ${String(elementSize)};`, `__result.push(${element});`].join("\n");
442
+ const handleType = "ReturnType<typeof getHandle>";
443
+
288
444
  const body = [
289
- `const __array = read(getHandle(this), ${elementDescriptor}, ${offset}) as ReturnType<typeof getHandle>;`,
445
+ `const __array = read(getHandle(this), ${elementDescriptor}, ${String(offset)}) as ${handleType};`,
290
446
  `const __result: ${tsType} = [];`,
291
447
  `for (let __index = 0; __index < ${lengthExpr}; __index++) {`,
292
448
  indent(loop, 1),
293
449
  "}",
294
450
  "return __result;",
295
451
  ].join("\n");
452
+
296
453
  return renderBlock(`get ${jsName}(): ${tsType}`, body);
297
454
  };
298
455
 
299
- const structArraySetterBlock = (options: StructArrayAccessorOptions): string => {
300
- const { context, jsName, tsType, elementDescriptor, offset, elementSize, elementFields } = options;
456
+ const structArraySetterStatements = (context: ModuleContext, options: StructArrayAccessorOptions): string => {
457
+ const { elementDescriptor, offset, elementSize, elementFields } = options;
301
458
  const writes: string[] = [];
459
+
302
460
  appendElementWriteStatements(context, {
303
461
  fields: elementFields,
304
462
  baseOffset: 0,
305
463
  valuePath: "__element",
306
464
  out: writes,
307
465
  });
308
- const loop = [`const __base = __index * ${elementSize};`, ...writes].join("\n");
309
- const body = [
466
+
467
+ const loop = [`const __base = __index * ${String(elementSize)};`, ...writes].join("\n");
468
+
469
+ return [
310
470
  `const __descriptor = ${elementDescriptor};`,
311
- `const __array = read(getHandle(this), __descriptor, ${offset}) as ReturnType<typeof getHandle>;`,
312
- `for (const [__index, __element] of __value.entries()) {`,
471
+ `const __array = read(getHandle(this), __descriptor, ${String(offset)}) as ReturnType<typeof getHandle>;`,
472
+ "for (const [__index, __element] of __value.entries()) {",
313
473
  indent(loop, 1),
314
474
  "}",
315
- `write(getHandle(this), __descriptor, ${offset}, __array);`,
475
+ `write(getHandle(this), __descriptor, ${String(offset)}, __array);`,
316
476
  ].join("\n");
317
- return renderBlock(`set ${jsName}(__value: ${tsType})`, body);
318
477
  };
319
478
 
320
- const renderStructArrayAccessor = (context: ModuleContext, target: StructArrayTarget): string | undefined => {
321
- const { field, jsName, slot, siblingFields } = target;
322
- if (field.type === undefined || slot.bitWidth !== undefined) return undefined;
323
- const arrayType = context.library.typeOf(field.type);
324
- if (arrayType?.kind !== "carray") return undefined;
325
- const elementType = context.library.typeOf(arrayType.element);
326
- if (elementType?.kind === "record" && elementType.value.glibGetType !== undefined) return undefined;
479
+ const structArraySetterBlock = (options: StructArrayAccessorOptions): string =>
480
+ renderBlock(
481
+ `set ${options.jsName}(__value: ${options.tsType})`,
482
+ structArraySetterStatements(options.context, options),
483
+ );
484
+
485
+ const resolveStructArrayElements = (context: ModuleContext, fieldType: TypeId): StructArrayElements | undefined => {
486
+ const arrayType = context.library.typeFor(fieldType);
487
+
488
+ if (arrayType?.kind !== "carray") {
489
+ return undefined;
490
+ }
491
+
492
+ const elementType = context.library.typeFor(arrayType.element);
493
+
494
+ if (elementType?.kind === "record" && elementType.value.glibGetType !== undefined) {
495
+ return undefined;
496
+ }
497
+
327
498
  const elementFields = resolveInlineStructFields(context, arrayType.element, arrayType.elementCType);
328
- if (elementFields === undefined) return undefined;
329
- const lengthExpr = arrayLengthExpression(arrayType, siblingFields);
330
- if (lengthExpr === undefined) return undefined;
331
- const elementSize = computeRecordFieldSlots(context, elementFields).size;
332
- if (elementSize === 0) return undefined;
333
499
 
500
+ if (elementFields === undefined) {
501
+ return undefined;
502
+ }
503
+
504
+ return { arrayType, elementFields };
505
+ };
506
+
507
+ const resolveStructArrayShape = (
508
+ context: ModuleContext,
509
+ elements: StructArrayElements,
510
+ siblingFields: GirField[],
511
+ ): { lengthExpr: string; elementSize: number } | undefined => {
512
+ const lengthExpr = arrayLengthExpression(elements.arrayType, siblingFields);
513
+
514
+ if (lengthExpr === undefined) {
515
+ return undefined;
516
+ }
517
+
518
+ const elementSize = computeRecordFieldSlots(context, elements.elementFields).size;
519
+
520
+ if (elementSize === 0) {
521
+ return undefined;
522
+ }
523
+
524
+ return { lengthExpr, elementSize };
525
+ };
526
+
527
+ const resolveStructArray = (context: ModuleContext, target: StructArrayTarget): StructArrayResolution | undefined => {
528
+ const { field, slot, siblingFields } = target;
529
+
530
+ if (field.type === undefined || slot.bitWidth !== undefined) {
531
+ return undefined;
532
+ }
533
+
534
+ const elements = resolveStructArrayElements(context, field.type);
535
+
536
+ if (elements === undefined) {
537
+ return undefined;
538
+ }
539
+
540
+ const shape = resolveStructArrayShape(context, elements, siblingFields);
541
+
542
+ if (shape === undefined) {
543
+ return undefined;
544
+ }
545
+
546
+ return {
547
+ fieldType: field.type,
548
+ elementFields: elements.elementFields,
549
+ lengthExpr: shape.lengthExpr,
550
+ elementSize: shape.elementSize,
551
+ };
552
+ };
553
+
554
+ const renderStructArrayAccessor = (context: ModuleContext, target: StructArrayTarget): string | undefined => {
555
+ const resolution = resolveStructArray(context, target);
556
+
557
+ if (resolution === undefined) {
558
+ return undefined;
559
+ }
560
+
561
+ const { field, jsName, slot } = target;
562
+ const { fieldType, elementFields, lengthExpr, elementSize } = resolution;
334
563
  context.addRuntimeImport("read");
335
564
  context.addRuntimeImport("getHandle");
336
565
  context.addRuntimeImport("t");
566
+
337
567
  const options: StructArrayAccessorOptions = {
338
568
  context,
339
569
  jsName,
340
- tsType: renderTsType(context, field.type, false),
570
+ tsType: renderTsType(context, fieldType, false),
341
571
  elementDescriptor: tStruct("borrowed", {
342
- size: `${lengthExpr} * ${elementSize}`,
572
+ size: `${lengthExpr} * ${String(elementSize)}`,
343
573
  wrapperClass: undefined,
344
574
  callerAllocated: false,
345
575
  }),
@@ -348,47 +578,65 @@ const renderStructArrayAccessor = (context: ModuleContext, target: StructArrayTa
348
578
  elementSize,
349
579
  elementFields,
350
580
  };
581
+
351
582
  const blocks: string[] = [];
352
- if (field.readable) blocks.push(structArrayGetterBlock(options));
583
+
584
+ if (field.readable) {
585
+ blocks.push(structArrayGetterBlock(options));
586
+ }
587
+
353
588
  if (field.writable) {
354
589
  context.addRuntimeImport("write");
355
590
  blocks.push(structArraySetterBlock(options));
356
591
  }
357
- return blocks.length === 0 ? undefined : blocks.join("\n\n");
358
- };
359
592
 
360
- type AccessorOptions = {
361
- context: ModuleContext;
362
- jsName: string;
363
- tsType: string;
364
- descriptor: string;
365
- slot: FieldSlot;
366
- fieldType: TypeId;
593
+ return blocks.length === 0 ? undefined : blocks.join("\n\n");
367
594
  };
368
595
 
369
596
  const getterBlock = (options: AccessorOptions): string => {
370
597
  const { context, jsName, tsType, descriptor, slot, fieldType } = options;
371
598
  context.addRuntimeImport("read");
372
599
  context.addRuntimeImport("getHandle");
600
+
373
601
  if (slot.bitWidth === undefined) {
374
- const valueExpression = `read(getHandle(this), ${descriptor}, ${slot.byteOffset})`;
602
+ const valueExpression = `read(getHandle(this), ${descriptor}, ${String(slot.byteOffset)})`;
603
+
375
604
  const wrapped = wrapReturnValue(context, {
376
605
  ref: fieldType,
377
606
  nullable: false,
378
607
  valueExpression,
379
608
  });
609
+
380
610
  const body = `return ${wrapped};`;
611
+
381
612
  return renderBlock(`get ${jsName}(): ${tsType}`, body);
382
613
  }
614
+
383
615
  const mask = bitMask(slot.bitWidth);
384
616
  const shift = slot.bitOffset ?? 0;
385
- const body = `const __unit = read(getHandle(this), ${descriptor}, ${slot.byteOffset}) as number;\nreturn (((__unit >>> ${shift}) & ${mask}) >>> 0) as ${tsType};`;
617
+ const readUnit = `const __unit = read(getHandle(this), ${descriptor}, ${String(slot.byteOffset)}) as number;`;
618
+ const body = `${readUnit}\nreturn (((__unit >>> ${String(shift)}) & ${String(mask)}) >>> 0) as ${tsType};`;
619
+
386
620
  return renderBlock(`get ${jsName}(): ${tsType}`, body);
387
621
  };
388
622
 
389
- const setterBlock = (options: AccessorOptions): string => {
390
- const { context, jsName, tsType, descriptor, slot } = options;
623
+ const setterBody = (context: ModuleContext, descriptor: string, slot: FieldSlot): string => {
391
624
  context.addRuntimeImport("getHandle");
392
- const body = emitFieldWrite(context, { descriptor, slot, targetExpr: "getHandle(this)", valueExpr: "value" });
393
- return renderBlock(`set ${jsName}(value: ${tsType})`, body);
625
+
626
+ return emitFieldWrite(context, { descriptor, slot, targetExpr: "getHandle(this)", valueExpr: "value" });
627
+ };
628
+
629
+ const setterBlock = (options: AccessorOptions): string =>
630
+ renderBlock(
631
+ `set ${options.jsName}(value: ${options.tsType})`,
632
+ setterBody(options.context, options.descriptor, options.slot),
633
+ );
634
+
635
+ export {
636
+ isEmittableField,
637
+ isInlineField,
638
+ emitFieldWrite,
639
+ resolveRecordFieldEntry,
640
+ renderRecordFieldAccessor,
641
+ type RecordFieldEntry,
394
642
  };