@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,33 +1,76 @@
1
- import { sourceStringLiteral, toCamelCase } from "@gtkx/utils";
1
+ import { camelCase, sourceStringLiteral } from "@gtkx/utils";
2
+ import type { GirFunction } from "../../gir/function.js";
3
+ import type { GirType } from "../../gir/type.js";
4
+ import type { ModuleContext } from "../../writer/context.js";
2
5
  import {
3
- omitsPrimaryReturn,
4
6
  renderCallbackType,
5
7
  renderDescriptor,
6
8
  renderSelfDescriptor,
9
+ shouldOmitPrimaryReturn,
7
10
  } from "../../analysis/descriptor-render.js";
8
11
  import {
9
12
  arrayLengthSources,
10
13
  closureAndDestroyIndices,
14
+ emittedArgIndices,
11
15
  foldedLengthIndices,
12
16
  foldOutParamShape,
13
17
  inputParameters,
14
18
  parameterIdentifier,
15
19
  } from "../../analysis/param-structure.js";
16
20
  import { renderTsType } from "../../analysis/ts-type.js";
17
- import type { GirFunction } from "../../gir/function.js";
18
21
  import { type GirParameter, isCallerAllocatedOut, isInoutParameter, isOutParameter } from "../../gir/parameter.js";
19
- import type { ModuleContext } from "../../writer/context.js";
22
+ import { hasUnknownArrayLength, type TypeId } from "../../gir/type-id.js";
20
23
  import { itemComparatorArgDescriptors, itemComparatorTsType } from "./item-comparators.js";
21
- import { isCollectibleCallerOut, isHandlePassing, passesHandleInPlace } from "./param-marshal.js";
24
+ import { isCollectibleCallerOut, isHandlePassedInPlace, isHandlePassing } from "./param-marshal.js";
25
+
26
+ type PromisifiedStep = { sawOptional: boolean; expression: string | undefined };
27
+
28
+ type PromisifyContext = {
29
+ context: ModuleContext;
30
+ asyncFn: GirFunction;
31
+ closureIndices: Set<number>;
32
+ lengthSources: Map<number, number>;
33
+ };
34
+
35
+ type WriteMethodBodyOptions = {
36
+ bindingExpression: string;
37
+ returnTypeOverride?: string | undefined;
38
+ };
39
+
40
+ type CallArgPlan = {
41
+ paramLiteral: string;
42
+ inputExpr: string | undefined;
43
+ };
44
+
45
+ type ParamDescriptorOptions = {
46
+ direction?: "out" | "inout";
47
+ callerAllocated?: boolean;
48
+ consumed?: boolean;
49
+ };
50
+
51
+ type ArgIndexOptions = {
52
+ argIndexOffset: number;
53
+ argIndexMap: Map<number, number>;
54
+ };
55
+
56
+ type PlanArgsContext = {
57
+ fn: GirFunction;
58
+ instanceOffset: number;
59
+ argIndex: ArgIndexOptions;
60
+ lengthSources: Map<number, number>;
61
+ closureIndices: Set<number>;
62
+ folded: Set<number>;
63
+ };
22
64
 
23
- export const methodExportName = (fn: GirFunction): string => toCamelCase(fn.name);
65
+ const methodExportName = (fn: GirFunction): string => camelCase(fn.name);
24
66
 
25
67
  const arrayLengthArgument = (source: GirParameter, sourceIndex: number): string => {
26
68
  const identifier = parameterIdentifier(source, sourceIndex);
69
+
27
70
  return source.nullable || source.optional ? `(${identifier}?.length ?? 0)` : `${identifier}.length`;
28
71
  };
29
72
 
30
- export const renderMethodSignature = (context: ModuleContext, fn: GirFunction): string =>
73
+ const renderMethodSignature = (context: ModuleContext, fn: GirFunction): string =>
31
74
  renderInputParameters(
32
75
  context,
33
76
  fn,
@@ -35,48 +78,117 @@ export const renderMethodSignature = (context: ModuleContext, fn: GirFunction):
35
78
  () => false,
36
79
  );
37
80
 
81
+ const parameterAnnotation = (context: ModuleContext, fn: GirFunction, parameter: GirParameter): string =>
82
+ itemComparatorTsType(context, fn, parameter) ?? renderTsType(context, parameter.type, parameter.nullable);
83
+
84
+ const isParameterOptional = (parameter: GirParameter, isOptionalExtra: (parameter: GirParameter) => boolean): boolean =>
85
+ parameter.optional || isOptionalExtra(parameter);
86
+
87
+ const formatParameterPart = (name: string, annotation: string, isOptional: boolean): string =>
88
+ isOptional ? `${name}?: ${annotation}` : `${name}: ${annotation}`;
89
+
38
90
  const renderInputParameters = (
39
91
  context: ModuleContext,
40
92
  fn: GirFunction,
41
- skip: (parameter: GirParameter) => boolean,
93
+ shouldSkip: (parameter: GirParameter) => boolean,
42
94
  isOptionalExtra: (parameter: GirParameter) => boolean,
43
95
  ): string => {
44
96
  const parts: string[] = [];
45
- let sawOptional = false;
97
+ let isSawOptional = false;
98
+
46
99
  for (const { parameter, index } of inputParameters(context.library, fn)) {
47
- if (skip(parameter)) continue;
100
+ if (shouldSkip(parameter)) {
101
+ continue;
102
+ }
103
+
48
104
  const name = parameterIdentifier(parameter, index);
49
- if (parameter.optional || isOptionalExtra(parameter)) {
50
- sawOptional = true;
105
+
106
+ if (isParameterOptional(parameter, isOptionalExtra)) {
107
+ isSawOptional = true;
51
108
  }
52
- const annotation =
53
- itemComparatorTsType(context, fn, parameter) ?? renderTsType(context, parameter.type, parameter.nullable);
54
- parts.push(sawOptional ? `${name}?: ${annotation}` : `${name}: ${annotation}`);
109
+
110
+ parts.push(formatParameterPart(name, parameterAnnotation(context, fn, parameter), isSawOptional));
55
111
  }
112
+
56
113
  return parts.join(", ");
57
114
  };
58
115
 
59
- export const renderMethodReturnType = (context: ModuleContext, fn: GirFunction): string => {
116
+ const isReturnedOutParameter = (context: ModuleContext, parameter: GirParameter): boolean =>
117
+ isOutParameter(parameter) ||
118
+ (isCallerAllocatedOut(parameter) && isCollectibleCallerOut(context, parameter)) ||
119
+ isInoutParameter(parameter);
120
+
121
+ const renderMethodReturnType = (context: ModuleContext, fn: GirFunction): string => {
60
122
  const folded = foldedLengthIndices(context.library, fn);
61
- const outs = fn.parameters.filter(
62
- (p, index) =>
63
- (isOutParameter(p) ||
64
- (isCallerAllocatedOut(p) && isCollectibleCallerOut(context, p)) ||
65
- isInoutParameter(p)) &&
66
- !folded.has(index),
67
- );
68
- const primaryReturnsValue = !omitsPrimaryReturn(context.library, fn.returnValue);
123
+ const outs = fn.parameters.filter((p, index) => isReturnedOutParameter(context, p) && !folded.has(index));
124
+
125
+ const primary = shouldOmitPrimaryReturn(context.library, fn.returnValue)
126
+ ? undefined
127
+ : renderTsType(context, fn.returnValue.type, fn.returnValue.nullable);
128
+
69
129
  if (outs.length === 0) {
70
- return primaryReturnsValue ? renderTsType(context, fn.returnValue.type, fn.returnValue.nullable) : "void";
130
+ return primary ?? "void";
71
131
  }
72
- const outTypes = outs.map((parameter) => renderTsType(context, parameter.type, false));
73
- const primary = primaryReturnsValue
74
- ? renderTsType(context, fn.returnValue.type, fn.returnValue.nullable)
75
- : undefined;
132
+
133
+ const outTypes = outs.map((parameter) => renderTsType(context, parameter.type, parameter.nullable));
134
+
76
135
  return foldOutParamShape(primary, outTypes);
77
136
  };
78
137
 
79
- export const renderPromisifiedBody = (
138
+ const classifyPromisifiedParameter = (
139
+ promisify: PromisifyContext,
140
+ parameter: GirParameter,
141
+ index: number,
142
+ state: { cancellableIndex: number; sawOptional: boolean },
143
+ ): PromisifiedStep => {
144
+ if (parameter.isVarargs) {
145
+ return { sawOptional: state.sawOptional, expression: undefined };
146
+ }
147
+
148
+ if (index === state.cancellableIndex) {
149
+ return { sawOptional: true, expression: undefined };
150
+ }
151
+
152
+ if (shouldSkipPromisifiedParameter(promisify, parameter, index)) {
153
+ return { sawOptional: state.sawOptional, expression: undefined };
154
+ }
155
+
156
+ const isSawOptional = state.sawOptional || parameter.optional;
157
+
158
+ return { sawOptional: isSawOptional, expression: promisifiedArgument(promisify, parameter, index, isSawOptional) };
159
+ };
160
+
161
+ const collectPromisifiedArguments = (promisify: PromisifyContext, cancellableIndex: number): string[] => {
162
+ const expressions: string[] = [];
163
+ let isSawOptional = false;
164
+
165
+ for (const [index, parameter] of promisify.asyncFn.parameters.entries()) {
166
+ const step = classifyPromisifiedParameter(promisify, parameter, index, {
167
+ cancellableIndex,
168
+ sawOptional: isSawOptional,
169
+ });
170
+
171
+ isSawOptional = step.sawOptional;
172
+
173
+ if (step.expression !== undefined) {
174
+ expressions.push(step.expression);
175
+ }
176
+ }
177
+
178
+ return expressions;
179
+ };
180
+
181
+ const renderCancellableExpression = (parameters: GirParameter[], cancellableIndex: number): string => {
182
+ if (cancellableIndex < 0) {
183
+ return "null";
184
+ }
185
+
186
+ const parameter = parameters[cancellableIndex];
187
+
188
+ return parameter === undefined ? "null" : parameterIdentifier(parameter, cancellableIndex);
189
+ };
190
+
191
+ const renderPromisifiedBody = (
80
192
  context: ModuleContext,
81
193
  asyncFn: GirFunction,
82
194
  finishExpression: string,
@@ -84,41 +196,34 @@ export const renderPromisifiedBody = (
84
196
  ): string => {
85
197
  context.addRuntimeImport("promisify");
86
198
  const cancellableIndex = findCancellableIndex(context, asyncFn.parameters);
87
- const closureIndices = closureAndDestroyIndices(asyncFn);
88
- const lengthFor = arrayLengthSources(context.library, asyncFn);
199
+
200
+ const promisifyContext: PromisifyContext = {
201
+ context,
202
+ asyncFn,
203
+ closureIndices: closureAndDestroyIndices(asyncFn),
204
+ lengthSources: arrayLengthSources(context.library, asyncFn),
205
+ };
206
+
89
207
  const leadingExpressions: string[] = [];
208
+
90
209
  if (asyncFn.instance !== undefined) {
91
210
  context.addRuntimeImport("getHandle");
92
211
  leadingExpressions.push("getHandle(this)");
93
212
  }
94
- const promisifyContext: PromisifyContext = { context, asyncFn, closureIndices, lengthFor };
95
- let cancellableExpression = "null";
96
- let sawOptional = false;
97
- asyncFn.parameters.forEach((parameter, index) => {
98
- if (parameter.isVarargs) return;
99
- if (index === cancellableIndex) {
100
- cancellableExpression = parameterIdentifier(parameter, index);
101
- sawOptional = true;
102
- return;
103
- }
104
- if (skipPromisifiedParameter(promisifyContext, parameter, index)) return;
105
- if (parameter.optional) sawOptional = true;
106
- leadingExpressions.push(promisifiedArgument(promisifyContext, parameter, index, sawOptional));
107
- });
213
+
214
+ leadingExpressions.push(...collectPromisifiedArguments(promisifyContext, cancellableIndex));
215
+ const cancellableExpression = renderCancellableExpression(asyncFn.parameters, cancellableIndex);
108
216
  const leadingArguments = leadingExpressions.length > 0 ? `, ${leadingExpressions.join(", ")}` : "";
217
+
109
218
  return `return promisify(${bindingExpression}, ${finishExpression}, ${cancellableExpression}${leadingArguments});`;
110
219
  };
111
220
 
112
- export const boundFinishExpression = (finishFn: GirFunction): string => `this.${methodExportName(finishFn)}.bind(this)`;
113
-
114
- type PromisifyContext = {
115
- context: ModuleContext;
116
- asyncFn: GirFunction;
117
- closureIndices: Set<number>;
118
- lengthFor: Map<number, number>;
119
- };
221
+ const finishCallExpression = (asyncFn: GirFunction, finishFn: GirFunction, ownerName: string): string =>
222
+ asyncFn.instance !== undefined && finishFn.instance === undefined
223
+ ? `${ownerName}.${methodExportName(finishFn)}.bind(${ownerName})`
224
+ : `this.${methodExportName(finishFn)}.bind(this)`;
120
225
 
121
- const skipPromisifiedParameter = (promisify: PromisifyContext, parameter: GirParameter, index: number): boolean =>
226
+ const shouldSkipPromisifiedParameter = (promisify: PromisifyContext, parameter: GirParameter, index: number): boolean =>
122
227
  isCallbackParameter(promisify.context, parameter) ||
123
228
  promisify.closureIndices.has(index) ||
124
229
  (isOutParameter(parameter) && !isCallerAllocatedOut(parameter));
@@ -127,25 +232,23 @@ const promisifiedArgument = (
127
232
  promisify: PromisifyContext,
128
233
  parameter: GirParameter,
129
234
  index: number,
130
- sawOptional: boolean,
235
+ hasSeenOptional: boolean,
131
236
  ): string => {
132
- const { context, asyncFn, lengthFor } = promisify;
133
- const sourceIndex = lengthFor.get(index);
237
+ const { context, asyncFn, lengthSources } = promisify;
238
+ const sourceIndex = lengthSources.get(index);
134
239
  const source = sourceIndex === undefined ? undefined : asyncFn.parameters[sourceIndex];
135
- if (sourceIndex !== undefined && source !== undefined) return arrayLengthArgument(source, sourceIndex);
136
- return parameterCallExpression(context, parameter, index, sawOptional);
137
- };
138
240
 
139
- const findCancellableIndex = (context: ModuleContext, parameters: GirParameter[]): number => {
140
- for (let index = 0; index < parameters.length; index += 1) {
141
- const parameter = parameters[index];
142
- if (parameter === undefined) continue;
143
- if (isCancellable(context, parameter)) return index;
241
+ if (sourceIndex !== undefined && source !== undefined) {
242
+ return arrayLengthArgument(source, sourceIndex);
144
243
  }
145
- return -1;
244
+
245
+ return parameterCallExpression(context, parameter, index, hasSeenOptional);
146
246
  };
147
247
 
148
- export const renderPromisifiedSignature = (
248
+ const findCancellableIndex = (context: ModuleContext, parameters: GirParameter[]): number =>
249
+ parameters.findIndex((parameter) => isCancellable(context, parameter));
250
+
251
+ const renderPromisifiedSignature = (
149
252
  context: ModuleContext,
150
253
  asyncFn: GirFunction,
151
254
  finishFn: GirFunction,
@@ -156,90 +259,101 @@ export const renderPromisifiedSignature = (
156
259
  (parameter) => isCallbackParameter(context, parameter),
157
260
  (parameter) => isCancellable(context, parameter),
158
261
  );
262
+
159
263
  const finishReturn = renderMethodReturnType(context, finishFn);
264
+
160
265
  return { signature, returnType: `Promise<${finishReturn}>` };
161
266
  };
162
267
 
163
268
  const isCancellable = (context: ModuleContext, parameter: GirParameter): boolean =>
164
- parameter.type !== undefined && context.library.nameOf(parameter.type)?.typeName === "Cancellable";
269
+ parameter.type !== undefined && context.library.nameFor(parameter.type)?.typeName === "Cancellable";
165
270
 
166
271
  const isCallbackParameter = (context: ModuleContext, parameter: GirParameter): boolean => {
167
272
  const ref = parameter.type;
168
- if (ref === undefined) return false;
169
- return context.library.typeOf(ref)?.kind === "callback";
170
- };
171
273
 
172
- type WriteMethodBodyOptions = {
173
- bindingExpression: string;
174
- returnTypeOverride?: string | undefined;
274
+ if (ref === undefined) {
275
+ return false;
276
+ }
277
+
278
+ return context.library.typeFor(ref)?.kind === "callback";
175
279
  };
176
280
 
177
- export const renderMethodBody = (context: ModuleContext, fn: GirFunction, options: WriteMethodBodyOptions): string => {
281
+ const renderMethodBody = (context: ModuleContext, fn: GirFunction, options: WriteMethodBodyOptions): string => {
178
282
  const { bindingExpression, returnTypeOverride } = options;
283
+
179
284
  const inputs = planCallArgs(context, fn)
180
285
  .map((arg) => arg.inputExpr)
181
286
  .filter((expression): expression is string => expression !== undefined);
287
+
182
288
  const callExpression = `${bindingExpression}(${inputs.join(", ")})`;
183
289
  const annotation = returnTypeOverride ?? renderMethodReturnType(context, fn);
184
- return annotation === "void" ? `${callExpression};` : `return ${callExpression} as ${annotation};`;
185
- };
186
-
187
- type CallArgPlan = {
188
- paramLiteral: string;
189
- inputExpr: string | undefined;
190
- };
191
290
 
192
- type ParamDescriptorOptions = {
193
- direction?: "out" | "inout";
194
- callerAllocated?: boolean;
195
- consumed?: boolean;
291
+ return annotation === "void" ? `${callExpression};` : `return ${callExpression} as ${annotation};`;
196
292
  };
197
293
 
198
294
  const paramDescriptorLiteral = (descriptor: string, options: ParamDescriptorOptions): string => {
199
295
  const parts = [`type: ${descriptor}`];
200
- if (options.direction !== undefined) parts.push(`direction: ${sourceStringLiteral(options.direction)}`);
201
- if (options.callerAllocated === true) parts.push("callerAllocated: true");
202
- if (options.consumed === true) parts.push("consumed: true");
296
+
297
+ if (options.direction !== undefined) {
298
+ parts.push(`direction: ${sourceStringLiteral(options.direction)}`);
299
+ }
300
+
301
+ if (options.callerAllocated === true) {
302
+ parts.push("callerAllocated: true");
303
+ }
304
+
305
+ if (options.consumed === true) {
306
+ parts.push("consumed: true");
307
+ }
308
+
203
309
  return `{ ${parts.join(", ")} }`;
204
310
  };
205
311
 
206
- export const renderReturnDescriptor = (context: ModuleContext, fn: GirFunction): string => {
312
+ const renderReturnDescriptor = (context: ModuleContext, fn: GirFunction): string => {
207
313
  const instanceOffset = fn.instance === undefined ? 0 : 1;
314
+
208
315
  return renderDescriptor(context, fn.returnValue.type, fn.returnValue.transferOwnership, {
209
316
  argIndexOffset: instanceOffset,
317
+ argIndexMap: emittedArgIndices(fn, instanceOffset),
210
318
  });
211
319
  };
212
320
 
213
- export const planCallArgs = (context: ModuleContext, fn: GirFunction): CallArgPlan[] => {
321
+ const planCallArgs = (context: ModuleContext, fn: GirFunction): CallArgPlan[] => {
214
322
  const plan: CallArgPlan[] = [];
323
+
215
324
  if (fn.instance !== undefined) {
216
325
  context.addRuntimeImport("getHandle");
326
+
217
327
  plan.push({
218
328
  paramLiteral: `{ type: ${renderSelfDescriptor(context, fn.instance)} }`,
219
329
  inputExpr: "getHandle(this)",
220
330
  });
221
331
  }
332
+
333
+ const instanceOffset = fn.instance === undefined ? 0 : 1;
334
+
222
335
  const planContext: PlanArgsContext = {
223
336
  fn,
224
- instanceOffset: fn.instance === undefined ? 0 : 1,
225
- lengthFor: arrayLengthSources(context.library, fn),
337
+ instanceOffset,
338
+ argIndex: { argIndexOffset: instanceOffset, argIndexMap: emittedArgIndices(fn, instanceOffset) },
339
+ lengthSources: arrayLengthSources(context.library, fn),
226
340
  closureIndices: closureAndDestroyIndices(fn),
227
341
  folded: foldedLengthIndices(context.library, fn),
228
342
  };
343
+
229
344
  for (const [index, parameter] of fn.parameters.entries()) {
230
345
  const entry = planParameter(context, parameter, index, planContext);
231
- if (entry !== undefined) plan.push(entry);
346
+
347
+ if (entry !== undefined) {
348
+ plan.push(entry);
349
+ }
232
350
  }
351
+
233
352
  return plan;
234
353
  };
235
354
 
236
- type PlanArgsContext = {
237
- fn: GirFunction;
238
- instanceOffset: number;
239
- lengthFor: Map<number, number>;
240
- closureIndices: Set<number>;
241
- folded: Set<number>;
242
- };
355
+ const isSkippedPlanParameter = (parameter: GirParameter, index: number, closureIndices: Set<number>): boolean =>
356
+ parameter.isVarargs || closureIndices.has(index);
243
357
 
244
358
  const planParameter = (
245
359
  context: ModuleContext,
@@ -247,13 +361,30 @@ const planParameter = (
247
361
  index: number,
248
362
  planContext: PlanArgsContext,
249
363
  ): CallArgPlan | undefined => {
250
- const { instanceOffset, folded, closureIndices, lengthFor } = planContext;
251
- if (parameter.isVarargs || closureIndices.has(index)) return undefined;
252
- if (isOutParameter(parameter)) return planOutParam(context, parameter, instanceOffset, folded.has(index));
253
- if (isCallerAllocatedOut(parameter)) return planCallerOut(context, parameter, instanceOffset);
254
- if (isInoutParameter(parameter)) return planInoutArgument(context, parameter, index, planContext);
255
- const sourceIndex = lengthFor.get(index);
256
- if (sourceIndex !== undefined) return planLengthArgument(context, parameter, sourceIndex, planContext);
364
+ const { folded, closureIndices, lengthSources } = planContext;
365
+
366
+ if (isSkippedPlanParameter(parameter, index, closureIndices)) {
367
+ return undefined;
368
+ }
369
+
370
+ if (isOutParameter(parameter)) {
371
+ return planOutParam(context, parameter, planContext.argIndex, folded.has(index));
372
+ }
373
+
374
+ if (isCallerAllocatedOut(parameter)) {
375
+ return planCallerOut(context, parameter, planContext.argIndex);
376
+ }
377
+
378
+ if (isInoutParameter(parameter)) {
379
+ return planInoutArgument(context, parameter, index, planContext);
380
+ }
381
+
382
+ const sourceIndex = lengthSources.get(index);
383
+
384
+ if (sourceIndex !== undefined) {
385
+ return planLengthArgument(context, parameter, sourceIndex, planContext);
386
+ }
387
+
257
388
  return planInParam(context, parameter, index, planContext);
258
389
  };
259
390
 
@@ -263,14 +394,21 @@ const planInoutArgument = (
263
394
  index: number,
264
395
  planContext: PlanArgsContext,
265
396
  ): CallArgPlan => {
266
- const { fn, instanceOffset, folded, lengthFor } = planContext;
267
- const lengthSourceIndex = lengthFor.get(index);
397
+ const { fn, folded, lengthSources } = planContext;
398
+ const lengthSourceIndex = lengthSources.get(index);
268
399
  const lengthSourceParam = lengthSourceIndex === undefined ? undefined : fn.parameters[lengthSourceIndex];
400
+
269
401
  const lengthSource =
270
402
  lengthSourceIndex !== undefined && lengthSourceParam !== undefined
271
403
  ? { source: lengthSourceParam, index: lengthSourceIndex }
272
404
  : undefined;
273
- return planInoutParam(context, parameter, { index, instanceOffset, consumed: folded.has(index), lengthSource });
405
+
406
+ return planInoutParam(context, parameter, {
407
+ index,
408
+ argIndex: planContext.argIndex,
409
+ consumed: folded.has(index),
410
+ lengthSource,
411
+ });
274
412
  };
275
413
 
276
414
  const planLengthArgument = (
@@ -280,9 +418,8 @@ const planLengthArgument = (
280
418
  planContext: PlanArgsContext,
281
419
  ): CallArgPlan => {
282
420
  const source = planContext.fn.parameters[sourceIndex];
283
- const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, {
284
- argIndexOffset: planContext.instanceOffset,
285
- });
421
+ const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, planContext.argIndex);
422
+
286
423
  return {
287
424
  paramLiteral: paramDescriptorLiteral(descriptor, {}),
288
425
  inputExpr: source === undefined ? "0" : arrayLengthArgument(source, sourceIndex),
@@ -292,13 +429,15 @@ const planLengthArgument = (
292
429
  const planOutParam = (
293
430
  context: ModuleContext,
294
431
  parameter: GirParameter,
295
- instanceOffset: number,
296
- consumed: boolean,
432
+ argIndex: ArgIndexOptions,
433
+ isConsumed: boolean,
297
434
  ): CallArgPlan => {
298
- const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, {
299
- argIndexOffset: instanceOffset,
300
- });
301
- return { paramLiteral: paramDescriptorLiteral(descriptor, { direction: "out", consumed }), inputExpr: undefined };
435
+ const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, argIndex);
436
+
437
+ return {
438
+ paramLiteral: paramDescriptorLiteral(descriptor, { direction: "out", consumed: isConsumed }),
439
+ inputExpr: undefined,
440
+ };
302
441
  };
303
442
 
304
443
  const constructibleName = (
@@ -306,28 +445,39 @@ const constructibleName = (
306
445
  ref: GirParameter["type"],
307
446
  ): { namespaceName: string; typeName: string } | undefined => {
308
447
  let current = ref;
448
+
309
449
  while (current !== undefined) {
310
- const resolved = context.library.typeOf(current);
450
+ const resolved = context.library.typeFor(current);
451
+
311
452
  if (resolved?.kind === "alias" && resolved.value.target !== undefined) {
312
453
  current = resolved.value.target;
313
454
  continue;
314
455
  }
315
- return context.library.nameOf(current);
456
+
457
+ return context.library.nameFor(current);
316
458
  }
459
+
317
460
  return undefined;
318
461
  };
319
462
 
320
- const planCallerOut = (context: ModuleContext, parameter: GirParameter, instanceOffset: number): CallArgPlan => {
321
- const descriptor = renderDescriptor(context, parameter.type, "none", { argIndexOffset: instanceOffset });
463
+ const planCallerOut = (
464
+ context: ModuleContext,
465
+ parameter: GirParameter,
466
+ argIndex: ArgIndexOptions,
467
+ ): CallArgPlan => {
468
+ const descriptor = renderDescriptor(context, parameter.type, "none", argIndex);
322
469
  const name = constructibleName(context, parameter.type);
470
+
323
471
  if (name !== undefined && isCollectibleCallerOut(context, parameter)) {
324
472
  context.addRuntimeImport("getHandle");
325
473
  const classExpression = context.qualify(name.namespaceName, name.typeName);
474
+
326
475
  return {
327
476
  paramLiteral: paramDescriptorLiteral(descriptor, { direction: "out", callerAllocated: true }),
328
477
  inputExpr: `new ${classExpression}()`,
329
478
  };
330
479
  }
480
+
331
481
  return { paramLiteral: paramDescriptorLiteral(descriptor, {}), inputExpr: "undefined" };
332
482
  };
333
483
 
@@ -336,28 +486,30 @@ const planInoutParam = (
336
486
  parameter: GirParameter,
337
487
  options: {
338
488
  index: number;
339
- instanceOffset: number;
489
+ argIndex: ArgIndexOptions;
340
490
  consumed: boolean;
341
491
  lengthSource?: { source: GirParameter; index: number } | undefined;
342
492
  },
343
493
  ): CallArgPlan => {
344
- const { index, instanceOffset, consumed, lengthSource } = options;
345
- if (passesHandleInPlace(context, parameter)) {
346
- const descriptor = renderDescriptor(context, parameter.type, "none", { argIndexOffset: instanceOffset });
494
+ const { index, argIndex, consumed, lengthSource } = options;
495
+
496
+ if (isHandlePassedInPlace(context, parameter)) {
497
+ const descriptor = renderDescriptor(context, parameter.type, "none", argIndex);
498
+
347
499
  return {
348
500
  paramLiteral: paramDescriptorLiteral(descriptor, { direction: "inout", callerAllocated: true, consumed }),
349
501
  inputExpr: parameterIdentifier(parameter, index),
350
502
  };
351
503
  }
352
- const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, {
353
- argIndexOffset: instanceOffset,
354
- });
504
+
505
+ const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, argIndex);
506
+
355
507
  return {
356
508
  paramLiteral: paramDescriptorLiteral(descriptor, { direction: "inout", consumed }),
357
509
  inputExpr:
358
- lengthSource !== undefined
359
- ? arrayLengthArgument(lengthSource.source, lengthSource.index)
360
- : parameterCallExpression(context, parameter, index),
510
+ lengthSource === undefined
511
+ ? parameterCallExpression(context, parameter, index)
512
+ : arrayLengthArgument(lengthSource.source, lengthSource.index),
361
513
  };
362
514
  };
363
515
 
@@ -367,51 +519,116 @@ const planInParam = (
367
519
  index: number,
368
520
  planContext: PlanArgsContext,
369
521
  ): CallArgPlan => {
370
- const { fn, instanceOffset } = planContext;
522
+ const { fn } = planContext;
523
+
371
524
  const callback = renderCallbackType(
372
525
  context,
373
526
  parameter.type,
374
527
  parameter,
375
528
  itemComparatorArgDescriptors(context, fn, parameter),
376
529
  );
530
+
377
531
  const descriptor =
378
532
  callback ??
379
- renderDescriptor(context, parameter.type, parameter.transferOwnership, { argIndexOffset: instanceOffset });
533
+ renderDescriptor(
534
+ context,
535
+ parameter.type,
536
+ parameter.transferOwnership,
537
+ planContext.argIndex,
538
+ );
539
+
380
540
  return {
381
541
  paramLiteral: paramDescriptorLiteral(descriptor, {}),
382
542
  inputExpr: parameterCallExpression(context, parameter, index),
383
543
  };
384
544
  };
385
545
 
546
+ const handleArgument = (context: ModuleContext, name: string, isNullable: boolean): string => {
547
+ if (isNullable) {
548
+ context.addRuntimeImport("tryGetHandle");
549
+
550
+ return `tryGetHandle(${name})`;
551
+ }
552
+
553
+ context.addRuntimeImport("getHandle");
554
+
555
+ return `getHandle(${name})`;
556
+ };
557
+
558
+ const hashtableArgument = (context: ModuleContext, valueRef: TypeId, name: string): string => {
559
+ if (isHandlePassing(context, valueRef)) {
560
+ context.addRuntimeImport("tryGetHandle");
561
+
562
+ return `${name} ? globalThis.Array.from(${name}).map(([k, v]) => [k, tryGetHandle(v)]) : null`;
563
+ }
564
+
565
+ return `${name} ? globalThis.Array.from(${name}) : null`;
566
+ };
567
+
568
+ const mapHandleExpression = (name: string, isNullable: boolean): string =>
569
+ isNullable ? `${name}?.map((item) => getHandle(item))` : `${name}.map((item) => getHandle(item))`;
570
+
571
+ const collectionArgument = (
572
+ context: ModuleContext,
573
+ type: GirType | undefined,
574
+ name: string,
575
+ isNullable: boolean,
576
+ ): string | undefined => {
577
+ if (type?.kind === "hashtable") {
578
+ return hashtableArgument(context, type.value, name);
579
+ }
580
+
581
+ if (!isMappableSequence(context, type)) {
582
+ return undefined;
583
+ }
584
+
585
+ context.addRuntimeImport("getHandle");
586
+
587
+ return mapHandleExpression(name, isNullable);
588
+ };
589
+
590
+ // An array whose length nothing states is marshalled as the bare pointer it is, so there is nothing
591
+ // to map over.
592
+ const isMappableSequence = (context: ModuleContext, type: GirType | undefined): boolean => {
593
+ if (type?.kind === "carray") {
594
+ return !hasUnknownArrayLength(type) && isHandlePassing(context, type.element);
595
+ }
596
+
597
+ return type?.kind === "list" && isHandlePassing(context, type.element);
598
+ };
599
+
386
600
  const parameterCallExpression = (
387
601
  context: ModuleContext,
388
602
  parameter: GirParameter,
389
603
  index: number,
390
- forceNullable = false,
604
+ isForcedNullable = false,
391
605
  ): string => {
392
606
  const name = parameterIdentifier(parameter, index);
393
607
  const ref = parameter.type;
394
- if (ref === undefined) return name;
395
- const nullable = parameter.nullable || parameter.optional || forceNullable;
396
- if (isHandlePassing(context, ref)) {
397
- if (nullable) {
398
- context.addRuntimeImport("tryGetHandle");
399
- return `tryGetHandle(${name})`;
400
- }
401
- context.addRuntimeImport("getHandle");
402
- return `getHandle(${name})`;
403
- }
404
- const type = context.library.typeOf(ref);
405
- if ((type?.kind === "carray" || type?.kind === "list") && isHandlePassing(context, type.element)) {
406
- context.addRuntimeImport("getHandle");
407
- return nullable ? `${name}?.map((item) => getHandle(item))` : `${name}.map((item) => getHandle(item))`;
608
+
609
+ if (ref === undefined) {
610
+ return name;
408
611
  }
409
- if (type?.kind === "hashtable") {
410
- if (isHandlePassing(context, type.value)) {
411
- context.addRuntimeImport("tryGetHandle");
412
- return `${name} ? globalThis.Array.from(${name}).map(([k, v]) => [k, tryGetHandle(v)]) : null`;
413
- }
414
- return `${name} ? globalThis.Array.from(${name}) : null`;
612
+
613
+ const isNullable = parameter.nullable || parameter.optional || isForcedNullable;
614
+
615
+ if (isHandlePassing(context, ref)) {
616
+ return handleArgument(context, name, isNullable);
415
617
  }
416
- return name;
618
+
619
+ const type = context.library.typeFor(ref);
620
+
621
+ return collectionArgument(context, type, name, isNullable) ?? name;
622
+ };
623
+
624
+ export {
625
+ methodExportName,
626
+ renderMethodSignature,
627
+ renderMethodReturnType,
628
+ renderPromisifiedBody,
629
+ finishCallExpression,
630
+ renderPromisifiedSignature,
631
+ renderMethodBody,
632
+ renderReturnDescriptor,
633
+ planCallArgs,
417
634
  };