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

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