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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/dist/analysis/descriptor-render.d.ts +20 -11
  2. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  3. package/dist/analysis/descriptor-render.js +296 -152
  4. package/dist/analysis/descriptor-render.js.map +1 -1
  5. package/dist/analysis/descriptor.d.ts +37 -34
  6. package/dist/analysis/descriptor.d.ts.map +1 -1
  7. package/dist/analysis/descriptor.js +34 -30
  8. package/dist/analysis/descriptor.js.map +1 -1
  9. package/dist/analysis/inheritance.d.ts +16 -16
  10. package/dist/analysis/inheritance.d.ts.map +1 -1
  11. package/dist/analysis/inheritance.js +139 -84
  12. package/dist/analysis/inheritance.js.map +1 -1
  13. package/dist/analysis/param-structure.d.ts +14 -13
  14. package/dist/analysis/param-structure.d.ts.map +1 -1
  15. package/dist/analysis/param-structure.js +104 -53
  16. package/dist/analysis/param-structure.js.map +1 -1
  17. package/dist/analysis/ts-type.d.ts +6 -5
  18. package/dist/analysis/ts-type.d.ts.map +1 -1
  19. package/dist/analysis/ts-type.js +71 -29
  20. package/dist/analysis/ts-type.js.map +1 -1
  21. package/dist/compile.d.ts +5 -5
  22. package/dist/compile.d.ts.map +1 -1
  23. package/dist/compile.js +70 -63
  24. package/dist/compile.js.map +1 -1
  25. package/dist/docs/api-reference.d.ts +12 -11
  26. package/dist/docs/api-reference.d.ts.map +1 -1
  27. package/dist/docs/api-reference.js +192 -123
  28. package/dist/docs/api-reference.js.map +1 -1
  29. package/dist/docs/element-page.d.ts +6 -9
  30. package/dist/docs/element-page.d.ts.map +1 -1
  31. package/dist/docs/element-page.js +69 -133
  32. package/dist/docs/element-page.js.map +1 -1
  33. package/dist/docs/pipeline.d.ts +10 -7
  34. package/dist/docs/pipeline.d.ts.map +1 -1
  35. package/dist/docs/pipeline.js +81 -53
  36. package/dist/docs/pipeline.js.map +1 -1
  37. package/dist/docs/render.d.ts +21 -19
  38. package/dist/docs/render.d.ts.map +1 -1
  39. package/dist/docs/render.js +80 -71
  40. package/dist/docs/render.js.map +1 -1
  41. package/dist/docs/symbol-page.d.ts +6 -6
  42. package/dist/docs/symbol-page.d.ts.map +1 -1
  43. package/dist/docs/symbol-page.js +126 -84
  44. package/dist/docs/symbol-page.js.map +1 -1
  45. package/dist/fingerprint.d.ts +29 -5
  46. package/dist/fingerprint.d.ts.map +1 -1
  47. package/dist/fingerprint.js +69 -13
  48. package/dist/fingerprint.js.map +1 -1
  49. package/dist/gi.d.ts +18 -0
  50. package/dist/gi.d.ts.map +1 -0
  51. package/dist/gi.js +23 -0
  52. package/dist/gi.js.map +1 -0
  53. package/dist/gir/ancestry.d.ts +4 -3
  54. package/dist/gir/ancestry.d.ts.map +1 -1
  55. package/dist/gir/ancestry.js +12 -15
  56. package/dist/gir/ancestry.js.map +1 -1
  57. package/dist/gir/callback.d.ts +6 -11
  58. package/dist/gir/callback.d.ts.map +1 -1
  59. package/dist/gir/callback.js +6 -7
  60. package/dist/gir/callback.js.map +1 -1
  61. package/dist/gir/class.d.ts +7 -5
  62. package/dist/gir/class.d.ts.map +1 -1
  63. package/dist/gir/class.js +14 -12
  64. package/dist/gir/class.js.map +1 -1
  65. package/dist/gir/enum.d.ts +3 -3
  66. package/dist/gir/enum.d.ts.map +1 -1
  67. package/dist/gir/enum.js +7 -6
  68. package/dist/gir/enum.js.map +1 -1
  69. package/dist/gir/field.d.ts +8 -3
  70. package/dist/gir/field.d.ts.map +1 -1
  71. package/dist/gir/field.js +30 -7
  72. package/dist/gir/field.js.map +1 -1
  73. package/dist/gir/function.d.ts +6 -3
  74. package/dist/gir/function.d.ts.map +1 -1
  75. package/dist/gir/function.js +23 -7
  76. package/dist/gir/function.js.map +1 -1
  77. package/dist/gir/gir-path.d.ts +2 -1
  78. package/dist/gir/gir-path.d.ts.map +1 -1
  79. package/dist/gir/gir-path.js +26 -10
  80. package/dist/gir/gir-path.js.map +1 -1
  81. package/dist/gir/libraries.d.ts +5 -3
  82. package/dist/gir/libraries.d.ts.map +1 -1
  83. package/dist/gir/libraries.js +41 -28
  84. package/dist/gir/libraries.js.map +1 -1
  85. package/dist/gir/library.d.ts +17 -11
  86. package/dist/gir/library.d.ts.map +1 -1
  87. package/dist/gir/library.js +116 -92
  88. package/dist/gir/library.js.map +1 -1
  89. package/dist/gir/namespace.d.ts +10 -10
  90. package/dist/gir/namespace.d.ts.map +1 -1
  91. package/dist/gir/namespace.js +21 -20
  92. package/dist/gir/namespace.js.map +1 -1
  93. package/dist/gir/nullable-overrides.d.ts +3 -0
  94. package/dist/gir/nullable-overrides.d.ts.map +1 -0
  95. package/dist/gir/nullable-overrides.js +5 -0
  96. package/dist/gir/nullable-overrides.js.map +1 -0
  97. package/dist/gir/parameter.d.ts +14 -12
  98. package/dist/gir/parameter.d.ts.map +1 -1
  99. package/dist/gir/parameter.js +27 -18
  100. package/dist/gir/parameter.js.map +1 -1
  101. package/dist/gir/parse.d.ts +12 -13
  102. package/dist/gir/parse.d.ts.map +1 -1
  103. package/dist/gir/parse.js +50 -40
  104. package/dist/gir/parse.js.map +1 -1
  105. package/dist/gir/primitives.d.ts +5 -4
  106. package/dist/gir/primitives.d.ts.map +1 -1
  107. package/dist/gir/primitives.js +4 -3
  108. package/dist/gir/primitives.js.map +1 -1
  109. package/dist/gir/property.d.ts +5 -4
  110. package/dist/gir/property.d.ts.map +1 -1
  111. package/dist/gir/property.js +10 -9
  112. package/dist/gir/property.js.map +1 -1
  113. package/dist/gir/record.d.ts +5 -4
  114. package/dist/gir/record.d.ts.map +1 -1
  115. package/dist/gir/record.js +13 -12
  116. package/dist/gir/record.js.map +1 -1
  117. package/dist/gir/size.d.ts +6 -5
  118. package/dist/gir/size.d.ts.map +1 -1
  119. package/dist/gir/size.js +49 -47
  120. package/dist/gir/size.js.map +1 -1
  121. package/dist/gir/type-id.d.ts +17 -15
  122. package/dist/gir/type-id.d.ts.map +1 -1
  123. package/dist/gir/type-id.js +5 -1
  124. package/dist/gir/type-id.js.map +1 -1
  125. package/dist/gir/type-ref.d.ts +3 -2
  126. package/dist/gir/type-ref.d.ts.map +1 -1
  127. package/dist/gir/type-ref.js +36 -25
  128. package/dist/gir/type-ref.js.map +1 -1
  129. package/dist/gir/type.d.ts +3 -2
  130. package/dist/gir/type.d.ts.map +1 -1
  131. package/dist/gir/type.js.map +1 -1
  132. package/dist/index.d.ts +3 -0
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +2 -0
  135. package/dist/index.js.map +1 -1
  136. package/dist/jsx.d.ts +28 -0
  137. package/dist/jsx.d.ts.map +1 -0
  138. package/dist/jsx.js +44 -0
  139. package/dist/jsx.js.map +1 -0
  140. package/dist/khronos/args.d.ts +7 -7
  141. package/dist/khronos/args.d.ts.map +1 -1
  142. package/dist/khronos/args.js +88 -67
  143. package/dist/khronos/args.js.map +1 -1
  144. package/dist/khronos/jsdoc.d.ts +4 -4
  145. package/dist/khronos/jsdoc.d.ts.map +1 -1
  146. package/dist/khronos/jsdoc.js +29 -16
  147. package/dist/khronos/jsdoc.js.map +1 -1
  148. package/dist/khronos/model.d.ts +8 -7
  149. package/dist/khronos/model.d.ts.map +1 -1
  150. package/dist/khronos/model.js +94 -59
  151. package/dist/khronos/model.js.map +1 -1
  152. package/dist/khronos/modules.d.ts +4 -3
  153. package/dist/khronos/modules.d.ts.map +1 -1
  154. package/dist/khronos/modules.js +40 -25
  155. package/dist/khronos/modules.js.map +1 -1
  156. package/dist/khronos/param-pair.d.ts +11 -0
  157. package/dist/khronos/param-pair.d.ts.map +1 -0
  158. package/dist/khronos/param-pair.js +6 -0
  159. package/dist/khronos/param-pair.js.map +1 -0
  160. package/dist/khronos/parse.d.ts +7 -8
  161. package/dist/khronos/parse.d.ts.map +1 -1
  162. package/dist/khronos/parse.js +17 -16
  163. package/dist/khronos/parse.js.map +1 -1
  164. package/dist/khronos/pipeline.d.ts +4 -4
  165. package/dist/khronos/pipeline.d.ts.map +1 -1
  166. package/dist/khronos/pipeline.js +97 -56
  167. package/dist/khronos/pipeline.js.map +1 -1
  168. package/dist/khronos/plan.d.ts +11 -10
  169. package/dist/khronos/plan.d.ts.map +1 -1
  170. package/dist/khronos/plan.js +109 -45
  171. package/dist/khronos/plan.js.map +1 -1
  172. package/dist/khronos/render.d.ts +5 -4
  173. package/dist/khronos/render.d.ts.map +1 -1
  174. package/dist/khronos/render.js +106 -59
  175. package/dist/khronos/render.js.map +1 -1
  176. package/dist/khronos/select.d.ts +4 -4
  177. package/dist/khronos/select.d.ts.map +1 -1
  178. package/dist/khronos/select.js +30 -19
  179. package/dist/khronos/select.js.map +1 -1
  180. package/dist/react/element-config.d.ts +20 -0
  181. package/dist/react/element-config.d.ts.map +1 -0
  182. package/dist/react/element-config.js +64 -0
  183. package/dist/react/element-config.js.map +1 -0
  184. package/dist/runner.d.ts +19 -10
  185. package/dist/runner.d.ts.map +1 -1
  186. package/dist/runner.js +48 -43
  187. package/dist/runner.js.map +1 -1
  188. package/dist/store/compile-store.d.ts +5 -3
  189. package/dist/store/compile-store.d.ts.map +1 -1
  190. package/dist/store/compile-store.js +24 -22
  191. package/dist/store/compile-store.js.map +1 -1
  192. package/dist/store/gi/async.d.ts +2 -1
  193. package/dist/store/gi/async.d.ts.map +1 -1
  194. package/dist/store/gi/async.js +28 -24
  195. package/dist/store/gi/async.js.map +1 -1
  196. package/dist/store/gi/callables.d.ts +26 -20
  197. package/dist/store/gi/callables.d.ts.map +1 -1
  198. package/dist/store/gi/callables.js +157 -100
  199. package/dist/store/gi/callables.js.map +1 -1
  200. package/dist/store/gi/callback.d.ts +3 -2
  201. package/dist/store/gi/callback.d.ts.map +1 -1
  202. package/dist/store/gi/callback.js +6 -3
  203. package/dist/store/gi/callback.js.map +1 -1
  204. package/dist/store/gi/class.d.ts +2 -1
  205. package/dist/store/gi/class.d.ts.map +1 -1
  206. package/dist/store/gi/class.js +86 -47
  207. package/dist/store/gi/class.js.map +1 -1
  208. package/dist/store/gi/companion.d.ts +2 -1
  209. package/dist/store/gi/companion.d.ts.map +1 -1
  210. package/dist/store/gi/companion.js +8 -5
  211. package/dist/store/gi/companion.js.map +1 -1
  212. package/dist/store/gi/constant.d.ts +3 -2
  213. package/dist/store/gi/constant.d.ts.map +1 -1
  214. package/dist/store/gi/constant.js +25 -8
  215. package/dist/store/gi/constant.js.map +1 -1
  216. package/dist/store/gi/constructor-props.d.ts +3 -2
  217. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  218. package/dist/store/gi/constructor-props.js +17 -10
  219. package/dist/store/gi/constructor-props.js.map +1 -1
  220. package/dist/store/gi/enum.d.ts +3 -2
  221. package/dist/store/gi/enum.d.ts.map +1 -1
  222. package/dist/store/gi/enum.js +14 -11
  223. package/dist/store/gi/enum.js.map +1 -1
  224. package/dist/store/gi/function.d.ts +5 -4
  225. package/dist/store/gi/function.d.ts.map +1 -1
  226. package/dist/store/gi/function.js +48 -23
  227. package/dist/store/gi/function.js.map +1 -1
  228. package/dist/store/gi/gtype-binding.d.ts +4 -4
  229. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  230. package/dist/store/gi/gtype-binding.js +15 -11
  231. package/dist/store/gi/gtype-binding.js.map +1 -1
  232. package/dist/store/gi/interface.d.ts +2 -1
  233. package/dist/store/gi/interface.d.ts.map +1 -1
  234. package/dist/store/gi/interface.js +36 -18
  235. package/dist/store/gi/interface.js.map +1 -1
  236. package/dist/store/gi/item-comparators.d.ts +3 -2
  237. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  238. package/dist/store/gi/item-comparators.js +33 -21
  239. package/dist/store/gi/item-comparators.js.map +1 -1
  240. package/dist/store/gi/method.d.ts +13 -13
  241. package/dist/store/gi/method.d.ts.map +1 -1
  242. package/dist/store/gi/method.js +188 -130
  243. package/dist/store/gi/method.js.map +1 -1
  244. package/dist/store/gi/param-marshal.d.ts +7 -6
  245. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  246. package/dist/store/gi/param-marshal.js +26 -13
  247. package/dist/store/gi/param-marshal.js.map +1 -1
  248. package/dist/store/gi/pipeline.d.ts +2 -1
  249. package/dist/store/gi/pipeline.d.ts.map +1 -1
  250. package/dist/store/gi/pipeline.js +38 -23
  251. package/dist/store/gi/pipeline.js.map +1 -1
  252. package/dist/store/gi/properties.d.ts +2 -1
  253. package/dist/store/gi/properties.d.ts.map +1 -1
  254. package/dist/store/gi/properties.js +6 -4
  255. package/dist/store/gi/properties.js.map +1 -1
  256. package/dist/store/gi/property-accessor.d.ts +11 -10
  257. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  258. package/dist/store/gi/property-accessor.js +86 -60
  259. package/dist/store/gi/property-accessor.js.map +1 -1
  260. package/dist/store/gi/record-constructor.d.ts +3 -2
  261. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  262. package/dist/store/gi/record-constructor.js +40 -28
  263. package/dist/store/gi/record-constructor.js.map +1 -1
  264. package/dist/store/gi/record-field-accessor.d.ts +9 -8
  265. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  266. package/dist/store/gi/record-field-accessor.js +187 -99
  267. package/dist/store/gi/record-field-accessor.js.map +1 -1
  268. package/dist/store/gi/record-layout.d.ts +6 -5
  269. package/dist/store/gi/record-layout.d.ts.map +1 -1
  270. package/dist/store/gi/record-layout.js +75 -39
  271. package/dist/store/gi/record-layout.js.map +1 -1
  272. package/dist/store/gi/record.d.ts +2 -1
  273. package/dist/store/gi/record.d.ts.map +1 -1
  274. package/dist/store/gi/record.js +15 -16
  275. package/dist/store/gi/record.js.map +1 -1
  276. package/dist/store/gi/registration.d.ts +3 -3
  277. package/dist/store/gi/registration.d.ts.map +1 -1
  278. package/dist/store/gi/registration.js +3 -2
  279. package/dist/store/gi/registration.js.map +1 -1
  280. package/dist/store/gi/return-wrap.d.ts +2 -2
  281. package/dist/store/gi/return-wrap.d.ts.map +1 -1
  282. package/dist/store/gi/return-wrap.js +43 -22
  283. package/dist/store/gi/return-wrap.js.map +1 -1
  284. package/dist/store/gi/runtime-override.d.ts +2 -1
  285. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  286. package/dist/store/gi/runtime-override.js +6 -3
  287. package/dist/store/gi/runtime-override.js.map +1 -1
  288. package/dist/store/gi/signal.d.ts +3 -2
  289. package/dist/store/gi/signal.d.ts.map +1 -1
  290. package/dist/store/gi/signal.js +113 -66
  291. package/dist/store/gi/signal.js.map +1 -1
  292. package/dist/store/gi/value-marshalable.d.ts +15 -0
  293. package/dist/store/gi/value-marshalable.d.ts.map +1 -0
  294. package/dist/store/gi/value-marshalable.js +66 -0
  295. package/dist/store/gi/value-marshalable.js.map +1 -0
  296. package/dist/store/gi/vtable.d.ts +2 -1
  297. package/dist/store/gi/vtable.d.ts.map +1 -1
  298. package/dist/store/gi/vtable.js +60 -30
  299. package/dist/store/gi/vtable.js.map +1 -1
  300. package/dist/store/gi-store.d.ts +5 -4
  301. package/dist/store/gi-store.d.ts.map +1 -1
  302. package/dist/store/gi-store.js +4 -2
  303. package/dist/store/gi-store.js.map +1 -1
  304. package/dist/store/jsx/element-components.d.ts +23 -0
  305. package/dist/store/jsx/element-components.d.ts.map +1 -0
  306. package/dist/store/jsx/element-components.js +86 -0
  307. package/dist/store/jsx/element-components.js.map +1 -0
  308. package/dist/store/jsx/element-prop-imports.d.ts +17 -0
  309. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -0
  310. package/dist/store/jsx/element-prop-imports.js +15 -0
  311. package/dist/store/jsx/element-prop-imports.js.map +1 -0
  312. package/dist/store/jsx/element-prop-types.d.ts +10 -0
  313. package/dist/store/jsx/element-prop-types.d.ts.map +1 -0
  314. package/dist/store/jsx/element-prop-types.js +41 -0
  315. package/dist/store/jsx/element-prop-types.js.map +1 -0
  316. package/dist/store/jsx/gir-index.d.ts +16 -0
  317. package/dist/store/jsx/gir-index.d.ts.map +1 -0
  318. package/dist/store/jsx/gir-index.js +33 -0
  319. package/dist/store/jsx/gir-index.js.map +1 -0
  320. package/dist/store/jsx/intrinsic-elements.d.ts +26 -0
  321. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -0
  322. package/dist/store/jsx/intrinsic-elements.js +127 -0
  323. package/dist/store/jsx/intrinsic-elements.js.map +1 -0
  324. package/dist/store/{react → jsx}/jsx.d.ts +2 -4
  325. package/dist/store/jsx/jsx.d.ts.map +1 -0
  326. package/dist/store/{react → jsx}/jsx.js +110 -71
  327. package/dist/store/jsx/jsx.js.map +1 -0
  328. package/dist/store/jsx/metadata.d.ts +4 -0
  329. package/dist/store/jsx/metadata.d.ts.map +1 -0
  330. package/dist/store/{react → jsx}/metadata.js +148 -69
  331. package/dist/store/jsx/metadata.js.map +1 -0
  332. package/dist/store/jsx/omitted-props.d.ts +10 -0
  333. package/dist/store/jsx/omitted-props.d.ts.map +1 -0
  334. package/dist/store/jsx/omitted-props.js +22 -0
  335. package/dist/store/jsx/omitted-props.js.map +1 -0
  336. package/dist/store/jsx/pipeline.d.ts +23 -0
  337. package/dist/store/jsx/pipeline.d.ts.map +1 -0
  338. package/dist/store/{react → jsx}/pipeline.js +38 -15
  339. package/dist/store/jsx/pipeline.js.map +1 -0
  340. package/dist/store/{react → jsx}/props.d.ts +9 -12
  341. package/dist/store/jsx/props.d.ts.map +1 -0
  342. package/dist/store/jsx/props.js +153 -0
  343. package/dist/store/jsx/props.js.map +1 -0
  344. package/dist/store/jsx-store.d.ts +5 -3
  345. package/dist/store/jsx-store.d.ts.map +1 -1
  346. package/dist/store/jsx-store.js +4 -1
  347. package/dist/store/jsx-store.js.map +1 -1
  348. package/dist/store/store-fs.d.ts +14 -12
  349. package/dist/store/store-fs.d.ts.map +1 -1
  350. package/dist/store/store-fs.js +9 -7
  351. package/dist/store/store-fs.js.map +1 -1
  352. package/dist/writer/context.d.ts +2 -1
  353. package/dist/writer/context.d.ts.map +1 -1
  354. package/dist/writer/context.js +12 -6
  355. package/dist/writer/context.js.map +1 -1
  356. package/dist/writer/doc.d.ts +2 -1
  357. package/dist/writer/doc.d.ts.map +1 -1
  358. package/dist/writer/doc.js +13 -7
  359. package/dist/writer/doc.js.map +1 -1
  360. package/dist/writer/emit.d.ts +8 -7
  361. package/dist/writer/emit.d.ts.map +1 -1
  362. package/dist/writer/emit.js +13 -10
  363. package/dist/writer/emit.js.map +1 -1
  364. package/dist/writer/gtk-doc.d.ts +2 -1
  365. package/dist/writer/gtk-doc.d.ts.map +1 -1
  366. package/dist/writer/gtk-doc.js +29 -18
  367. package/dist/writer/gtk-doc.js.map +1 -1
  368. package/dist/writer/imports.d.ts +4 -2
  369. package/dist/writer/imports.d.ts.map +1 -1
  370. package/dist/writer/imports.js +35 -24
  371. package/dist/writer/imports.js.map +1 -1
  372. package/dist/writer/module.d.ts +3 -2
  373. package/dist/writer/module.d.ts.map +1 -1
  374. package/dist/writer/module.js +16 -9
  375. package/dist/writer/module.js.map +1 -1
  376. package/dist/xml.d.ts +4 -0
  377. package/dist/xml.d.ts.map +1 -0
  378. package/dist/xml.js +10 -0
  379. package/dist/xml.js.map +1 -0
  380. package/overrides/cairo/context.ts.ejs +7 -7
  381. package/overrides/cairo/matrix.ts.ejs +2 -2
  382. package/overrides/cairo/recording-surface.ts.ejs +2 -2
  383. package/overrides/cairo/region.ts.ejs +1 -1
  384. package/overrides/cairo/scaled-font.ts.ejs +3 -3
  385. package/package.json +14 -9
  386. package/src/analysis/descriptor-render.ts +516 -168
  387. package/src/analysis/descriptor.ts +162 -125
  388. package/src/analysis/inheritance.ts +286 -98
  389. package/src/analysis/param-structure.ts +188 -57
  390. package/src/analysis/ts-type.ts +113 -34
  391. package/src/compile.ts +103 -76
  392. package/src/docs/api-reference.ts +337 -146
  393. package/src/docs/element-page.ts +137 -150
  394. package/src/docs/pipeline.ts +135 -73
  395. package/src/docs/render.ts +151 -87
  396. package/src/docs/symbol-page.ts +268 -123
  397. package/src/fingerprint.ts +138 -26
  398. package/src/gi.ts +35 -0
  399. package/src/gir/ancestry.ts +26 -14
  400. package/src/gir/callback.ts +10 -15
  401. package/src/gir/class.ts +20 -16
  402. package/src/gir/enum.ts +9 -7
  403. package/src/gir/field.ts +37 -8
  404. package/src/gir/function.ts +33 -9
  405. package/src/gir/gir-path.ts +36 -12
  406. package/src/gir/libraries.ts +59 -33
  407. package/src/gir/library.ts +200 -97
  408. package/src/gir/namespace.ts +42 -26
  409. package/src/gir/nullable-overrides.ts +5 -0
  410. package/src/gir/parameter.ts +80 -42
  411. package/src/gir/parse.ts +102 -47
  412. package/src/gir/primitives.ts +25 -23
  413. package/src/gir/property.ts +13 -11
  414. package/src/gir/record.ts +16 -14
  415. package/src/gir/size.ts +91 -58
  416. package/src/gir/type-id.ts +33 -18
  417. package/src/gir/type-ref.ts +62 -26
  418. package/src/gir/type.ts +10 -8
  419. package/src/index.ts +8 -0
  420. package/src/jsx.ts +75 -0
  421. package/src/khronos/args.ts +158 -89
  422. package/src/khronos/jsdoc.ts +67 -29
  423. package/src/khronos/model.ts +154 -53
  424. package/src/khronos/modules.ts +67 -27
  425. package/src/khronos/param-pair.ts +14 -0
  426. package/src/khronos/parse.ts +37 -17
  427. package/src/khronos/pipeline.ts +193 -90
  428. package/src/khronos/plan.ts +235 -86
  429. package/src/khronos/render.ts +208 -71
  430. package/src/khronos/select.ts +48 -18
  431. package/src/react/element-config.ts +97 -0
  432. package/src/runner.ts +100 -57
  433. package/src/store/compile-store.ts +32 -26
  434. package/src/store/gi/async.ts +48 -21
  435. package/src/store/gi/callables.ts +339 -136
  436. package/src/store/gi/callback.ts +13 -4
  437. package/src/store/gi/class.ts +186 -64
  438. package/src/store/gi/companion.ts +15 -6
  439. package/src/store/gi/constant.ts +42 -8
  440. package/src/store/gi/constructor-props.ts +42 -16
  441. package/src/store/gi/enum.ts +28 -13
  442. package/src/store/gi/function.ts +88 -24
  443. package/src/store/gi/gtype-binding.ts +31 -18
  444. package/src/store/gi/interface.ts +101 -36
  445. package/src/store/gi/item-comparators.ts +74 -26
  446. package/src/store/gi/method.ts +377 -159
  447. package/src/store/gi/param-marshal.ts +38 -15
  448. package/src/store/gi/pipeline.ts +72 -22
  449. package/src/store/gi/properties.ts +16 -5
  450. package/src/store/gi/property-accessor.ts +192 -84
  451. package/src/store/gi/record-constructor.ts +70 -33
  452. package/src/store/gi/record-field-accessor.ts +415 -167
  453. package/src/store/gi/record-layout.ts +130 -43
  454. package/src/store/gi/record.ts +29 -15
  455. package/src/store/gi/registration.ts +15 -9
  456. package/src/store/gi/return-wrap.ts +71 -23
  457. package/src/store/gi/runtime-override.ts +13 -3
  458. package/src/store/gi/signal.ts +244 -104
  459. package/src/store/gi/value-marshalable.ts +96 -0
  460. package/src/store/gi/vtable.ts +117 -41
  461. package/src/store/gi-store.ts +26 -13
  462. package/src/store/jsx/element-components.ts +152 -0
  463. package/src/store/jsx/element-prop-imports.ts +24 -0
  464. package/src/store/jsx/element-prop-types.ts +59 -0
  465. package/src/store/jsx/gir-index.ts +62 -0
  466. package/src/store/jsx/intrinsic-elements.ts +253 -0
  467. package/src/store/{react → jsx}/jsx.ts +213 -99
  468. package/src/store/jsx/metadata.ts +385 -0
  469. package/src/store/jsx/omitted-props.ts +32 -0
  470. package/src/store/jsx/pipeline.ts +148 -0
  471. package/src/store/jsx/props.ts +262 -0
  472. package/src/store/jsx-store.ts +15 -3
  473. package/src/store/store-fs.ts +36 -20
  474. package/src/writer/context.ts +25 -6
  475. package/src/writer/doc.ts +19 -5
  476. package/src/writer/emit.ts +20 -11
  477. package/src/writer/gtk-doc.ts +48 -21
  478. package/src/writer/imports.ts +63 -28
  479. package/src/writer/module.ts +35 -11
  480. package/src/xml.ts +12 -0
  481. package/dist/store/gi/class-struct-record.d.ts +0 -9
  482. package/dist/store/gi/class-struct-record.d.ts.map +0 -1
  483. package/dist/store/gi/class-struct-record.js +0 -34
  484. package/dist/store/gi/class-struct-record.js.map +0 -1
  485. package/dist/store/react/built-ins.d.ts +0 -9
  486. package/dist/store/react/built-ins.d.ts.map +0 -1
  487. package/dist/store/react/built-ins.js +0 -226
  488. package/dist/store/react/built-ins.js.map +0 -1
  489. package/dist/store/react/element-components.d.ts +0 -15
  490. package/dist/store/react/element-components.d.ts.map +0 -1
  491. package/dist/store/react/element-components.js +0 -92
  492. package/dist/store/react/element-components.js.map +0 -1
  493. package/dist/store/react/element-prop-types.d.ts +0 -19
  494. package/dist/store/react/element-prop-types.d.ts.map +0 -1
  495. package/dist/store/react/element-prop-types.js +0 -244
  496. package/dist/store/react/element-prop-types.js.map +0 -1
  497. package/dist/store/react/element-props.d.ts +0 -4
  498. package/dist/store/react/element-props.d.ts.map +0 -1
  499. package/dist/store/react/element-props.js +0 -178
  500. package/dist/store/react/element-props.js.map +0 -1
  501. package/dist/store/react/gir-index.d.ts +0 -25
  502. package/dist/store/react/gir-index.d.ts.map +0 -1
  503. package/dist/store/react/gir-index.js +0 -55
  504. package/dist/store/react/gir-index.js.map +0 -1
  505. package/dist/store/react/intrinsic-elements.d.ts +0 -26
  506. package/dist/store/react/intrinsic-elements.d.ts.map +0 -1
  507. package/dist/store/react/intrinsic-elements.js +0 -107
  508. package/dist/store/react/intrinsic-elements.js.map +0 -1
  509. package/dist/store/react/jsx.d.ts.map +0 -1
  510. package/dist/store/react/jsx.js.map +0 -1
  511. package/dist/store/react/metadata.d.ts +0 -4
  512. package/dist/store/react/metadata.d.ts.map +0 -1
  513. package/dist/store/react/metadata.js.map +0 -1
  514. package/dist/store/react/pipeline.d.ts +0 -14
  515. package/dist/store/react/pipeline.d.ts.map +0 -1
  516. package/dist/store/react/pipeline.js.map +0 -1
  517. package/dist/store/react/props.d.ts.map +0 -1
  518. package/dist/store/react/props.js +0 -133
  519. package/dist/store/react/props.js.map +0 -1
  520. package/overrides/gtk/constants.ts.ejs +0 -3
  521. package/overrides/gtk/index.ts.ejs +0 -2
  522. package/src/store/gi/class-struct-record.ts +0 -40
  523. package/src/store/react/built-ins.ts +0 -260
  524. package/src/store/react/element-components.ts +0 -138
  525. package/src/store/react/element-prop-types.ts +0 -280
  526. package/src/store/react/element-props.ts +0 -204
  527. package/src/store/react/gir-index.ts +0 -85
  528. package/src/store/react/intrinsic-elements.ts +0 -161
  529. package/src/store/react/metadata.ts +0 -197
  530. package/src/store/react/pipeline.ts +0 -90
  531. package/src/store/react/props.ts +0 -197
@@ -1,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,102 @@ 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),
318
+ isNewlyCreated: fn.instance === undefined,
210
319
  });
211
320
  };
212
321
 
213
- export const planCallArgs = (context: ModuleContext, fn: GirFunction): CallArgPlan[] => {
322
+ const planCallArgs = (context: ModuleContext, fn: GirFunction): CallArgPlan[] => {
214
323
  const plan: CallArgPlan[] = [];
324
+
215
325
  if (fn.instance !== undefined) {
216
326
  context.addRuntimeImport("getHandle");
327
+
217
328
  plan.push({
218
329
  paramLiteral: `{ type: ${renderSelfDescriptor(context, fn.instance)} }`,
219
330
  inputExpr: "getHandle(this)",
220
331
  });
221
332
  }
333
+
334
+ const instanceOffset = fn.instance === undefined ? 0 : 1;
335
+
222
336
  const planContext: PlanArgsContext = {
223
337
  fn,
224
- instanceOffset: fn.instance === undefined ? 0 : 1,
225
- lengthFor: arrayLengthSources(context.library, fn),
338
+ instanceOffset,
339
+ argIndex: { argIndexOffset: instanceOffset, argIndexMap: emittedArgIndices(fn, instanceOffset) },
340
+ lengthSources: arrayLengthSources(context.library, fn),
226
341
  closureIndices: closureAndDestroyIndices(fn),
227
342
  folded: foldedLengthIndices(context.library, fn),
228
343
  };
344
+
229
345
  for (const [index, parameter] of fn.parameters.entries()) {
230
346
  const entry = planParameter(context, parameter, index, planContext);
231
- if (entry !== undefined) plan.push(entry);
347
+
348
+ if (entry !== undefined) {
349
+ plan.push(entry);
350
+ }
232
351
  }
352
+
233
353
  return plan;
234
354
  };
235
355
 
236
- type PlanArgsContext = {
237
- fn: GirFunction;
238
- instanceOffset: number;
239
- lengthFor: Map<number, number>;
240
- closureIndices: Set<number>;
241
- folded: Set<number>;
242
- };
356
+ const isSkippedPlanParameter = (parameter: GirParameter, index: number, closureIndices: Set<number>): boolean =>
357
+ parameter.isVarargs || closureIndices.has(index);
243
358
 
244
359
  const planParameter = (
245
360
  context: ModuleContext,
@@ -247,13 +362,30 @@ const planParameter = (
247
362
  index: number,
248
363
  planContext: PlanArgsContext,
249
364
  ): 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);
365
+ const { folded, closureIndices, lengthSources } = planContext;
366
+
367
+ if (isSkippedPlanParameter(parameter, index, closureIndices)) {
368
+ return undefined;
369
+ }
370
+
371
+ if (isOutParameter(parameter)) {
372
+ return planOutParam(context, parameter, planContext.argIndex, folded.has(index));
373
+ }
374
+
375
+ if (isCallerAllocatedOut(parameter)) {
376
+ return planCallerOut(context, parameter, planContext.argIndex);
377
+ }
378
+
379
+ if (isInoutParameter(parameter)) {
380
+ return planInoutArgument(context, parameter, index, planContext);
381
+ }
382
+
383
+ const sourceIndex = lengthSources.get(index);
384
+
385
+ if (sourceIndex !== undefined) {
386
+ return planLengthArgument(context, parameter, sourceIndex, planContext);
387
+ }
388
+
257
389
  return planInParam(context, parameter, index, planContext);
258
390
  };
259
391
 
@@ -263,14 +395,21 @@ const planInoutArgument = (
263
395
  index: number,
264
396
  planContext: PlanArgsContext,
265
397
  ): CallArgPlan => {
266
- const { fn, instanceOffset, folded, lengthFor } = planContext;
267
- const lengthSourceIndex = lengthFor.get(index);
398
+ const { fn, folded, lengthSources } = planContext;
399
+ const lengthSourceIndex = lengthSources.get(index);
268
400
  const lengthSourceParam = lengthSourceIndex === undefined ? undefined : fn.parameters[lengthSourceIndex];
401
+
269
402
  const lengthSource =
270
403
  lengthSourceIndex !== undefined && lengthSourceParam !== undefined
271
404
  ? { source: lengthSourceParam, index: lengthSourceIndex }
272
405
  : undefined;
273
- return planInoutParam(context, parameter, { index, instanceOffset, consumed: folded.has(index), lengthSource });
406
+
407
+ return planInoutParam(context, parameter, {
408
+ index,
409
+ argIndex: planContext.argIndex,
410
+ consumed: folded.has(index),
411
+ lengthSource,
412
+ });
274
413
  };
275
414
 
276
415
  const planLengthArgument = (
@@ -280,9 +419,8 @@ const planLengthArgument = (
280
419
  planContext: PlanArgsContext,
281
420
  ): CallArgPlan => {
282
421
  const source = planContext.fn.parameters[sourceIndex];
283
- const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, {
284
- argIndexOffset: planContext.instanceOffset,
285
- });
422
+ const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, planContext.argIndex);
423
+
286
424
  return {
287
425
  paramLiteral: paramDescriptorLiteral(descriptor, {}),
288
426
  inputExpr: source === undefined ? "0" : arrayLengthArgument(source, sourceIndex),
@@ -292,13 +430,15 @@ const planLengthArgument = (
292
430
  const planOutParam = (
293
431
  context: ModuleContext,
294
432
  parameter: GirParameter,
295
- instanceOffset: number,
296
- consumed: boolean,
433
+ argIndex: ArgIndexOptions,
434
+ isConsumed: boolean,
297
435
  ): CallArgPlan => {
298
- const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, {
299
- argIndexOffset: instanceOffset,
300
- });
301
- return { paramLiteral: paramDescriptorLiteral(descriptor, { direction: "out", consumed }), inputExpr: undefined };
436
+ const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, argIndex);
437
+
438
+ return {
439
+ paramLiteral: paramDescriptorLiteral(descriptor, { direction: "out", consumed: isConsumed }),
440
+ inputExpr: undefined,
441
+ };
302
442
  };
303
443
 
304
444
  const constructibleName = (
@@ -306,28 +446,39 @@ const constructibleName = (
306
446
  ref: GirParameter["type"],
307
447
  ): { namespaceName: string; typeName: string } | undefined => {
308
448
  let current = ref;
449
+
309
450
  while (current !== undefined) {
310
- const resolved = context.library.typeOf(current);
451
+ const resolved = context.library.typeFor(current);
452
+
311
453
  if (resolved?.kind === "alias" && resolved.value.target !== undefined) {
312
454
  current = resolved.value.target;
313
455
  continue;
314
456
  }
315
- return context.library.nameOf(current);
457
+
458
+ return context.library.nameFor(current);
316
459
  }
460
+
317
461
  return undefined;
318
462
  };
319
463
 
320
- const planCallerOut = (context: ModuleContext, parameter: GirParameter, instanceOffset: number): CallArgPlan => {
321
- const descriptor = renderDescriptor(context, parameter.type, "none", { argIndexOffset: instanceOffset });
464
+ const planCallerOut = (
465
+ context: ModuleContext,
466
+ parameter: GirParameter,
467
+ argIndex: ArgIndexOptions,
468
+ ): CallArgPlan => {
469
+ const descriptor = renderDescriptor(context, parameter.type, "none", argIndex);
322
470
  const name = constructibleName(context, parameter.type);
471
+
323
472
  if (name !== undefined && isCollectibleCallerOut(context, parameter)) {
324
473
  context.addRuntimeImport("getHandle");
325
474
  const classExpression = context.qualify(name.namespaceName, name.typeName);
475
+
326
476
  return {
327
477
  paramLiteral: paramDescriptorLiteral(descriptor, { direction: "out", callerAllocated: true }),
328
478
  inputExpr: `new ${classExpression}()`,
329
479
  };
330
480
  }
481
+
331
482
  return { paramLiteral: paramDescriptorLiteral(descriptor, {}), inputExpr: "undefined" };
332
483
  };
333
484
 
@@ -336,28 +487,30 @@ const planInoutParam = (
336
487
  parameter: GirParameter,
337
488
  options: {
338
489
  index: number;
339
- instanceOffset: number;
490
+ argIndex: ArgIndexOptions;
340
491
  consumed: boolean;
341
492
  lengthSource?: { source: GirParameter; index: number } | undefined;
342
493
  },
343
494
  ): CallArgPlan => {
344
- const { index, instanceOffset, consumed, lengthSource } = options;
345
- if (passesHandleInPlace(context, parameter)) {
346
- const descriptor = renderDescriptor(context, parameter.type, "none", { argIndexOffset: instanceOffset });
495
+ const { index, argIndex, consumed, lengthSource } = options;
496
+
497
+ if (isHandlePassedInPlace(context, parameter)) {
498
+ const descriptor = renderDescriptor(context, parameter.type, "none", argIndex);
499
+
347
500
  return {
348
501
  paramLiteral: paramDescriptorLiteral(descriptor, { direction: "inout", callerAllocated: true, consumed }),
349
502
  inputExpr: parameterIdentifier(parameter, index),
350
503
  };
351
504
  }
352
- const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, {
353
- argIndexOffset: instanceOffset,
354
- });
505
+
506
+ const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, argIndex);
507
+
355
508
  return {
356
509
  paramLiteral: paramDescriptorLiteral(descriptor, { direction: "inout", consumed }),
357
510
  inputExpr:
358
- lengthSource !== undefined
359
- ? arrayLengthArgument(lengthSource.source, lengthSource.index)
360
- : parameterCallExpression(context, parameter, index),
511
+ lengthSource === undefined
512
+ ? parameterCallExpression(context, parameter, index)
513
+ : arrayLengthArgument(lengthSource.source, lengthSource.index),
361
514
  };
362
515
  };
363
516
 
@@ -367,51 +520,116 @@ const planInParam = (
367
520
  index: number,
368
521
  planContext: PlanArgsContext,
369
522
  ): CallArgPlan => {
370
- const { fn, instanceOffset } = planContext;
523
+ const { fn } = planContext;
524
+
371
525
  const callback = renderCallbackType(
372
526
  context,
373
527
  parameter.type,
374
528
  parameter,
375
529
  itemComparatorArgDescriptors(context, fn, parameter),
376
530
  );
531
+
377
532
  const descriptor =
378
533
  callback ??
379
- renderDescriptor(context, parameter.type, parameter.transferOwnership, { argIndexOffset: instanceOffset });
534
+ renderDescriptor(
535
+ context,
536
+ parameter.type,
537
+ parameter.transferOwnership,
538
+ planContext.argIndex,
539
+ );
540
+
380
541
  return {
381
542
  paramLiteral: paramDescriptorLiteral(descriptor, {}),
382
543
  inputExpr: parameterCallExpression(context, parameter, index),
383
544
  };
384
545
  };
385
546
 
547
+ const handleArgument = (context: ModuleContext, name: string, isNullable: boolean): string => {
548
+ if (isNullable) {
549
+ context.addRuntimeImport("tryGetHandle");
550
+
551
+ return `tryGetHandle(${name})`;
552
+ }
553
+
554
+ context.addRuntimeImport("getHandle");
555
+
556
+ return `getHandle(${name})`;
557
+ };
558
+
559
+ const hashtableArgument = (context: ModuleContext, valueRef: TypeId, name: string): string => {
560
+ if (isHandlePassing(context, valueRef)) {
561
+ context.addRuntimeImport("tryGetHandle");
562
+
563
+ return `${name} ? globalThis.Array.from(${name}).map(([k, v]) => [k, tryGetHandle(v)]) : null`;
564
+ }
565
+
566
+ return `${name} ? globalThis.Array.from(${name}) : null`;
567
+ };
568
+
569
+ const mapHandleExpression = (name: string, isNullable: boolean): string =>
570
+ isNullable ? `${name}?.map((item) => getHandle(item))` : `${name}.map((item) => getHandle(item))`;
571
+
572
+ const collectionArgument = (
573
+ context: ModuleContext,
574
+ type: GirType | undefined,
575
+ name: string,
576
+ isNullable: boolean,
577
+ ): string | undefined => {
578
+ if (type?.kind === "hashtable") {
579
+ return hashtableArgument(context, type.value, name);
580
+ }
581
+
582
+ if (!isMappableSequence(context, type)) {
583
+ return undefined;
584
+ }
585
+
586
+ context.addRuntimeImport("getHandle");
587
+
588
+ return mapHandleExpression(name, isNullable);
589
+ };
590
+
591
+ // An array whose length nothing states is marshalled as the bare pointer it is, so there is nothing
592
+ // to map over.
593
+ const isMappableSequence = (context: ModuleContext, type: GirType | undefined): boolean => {
594
+ if (type?.kind === "carray") {
595
+ return !hasUnknownArrayLength(type) && isHandlePassing(context, type.element);
596
+ }
597
+
598
+ return type?.kind === "list" && isHandlePassing(context, type.element);
599
+ };
600
+
386
601
  const parameterCallExpression = (
387
602
  context: ModuleContext,
388
603
  parameter: GirParameter,
389
604
  index: number,
390
- forceNullable = false,
605
+ isForcedNullable = false,
391
606
  ): string => {
392
607
  const name = parameterIdentifier(parameter, index);
393
608
  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))`;
609
+
610
+ if (ref === undefined) {
611
+ return name;
408
612
  }
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`;
613
+
614
+ const isNullable = parameter.nullable || parameter.optional || isForcedNullable;
615
+
616
+ if (isHandlePassing(context, ref)) {
617
+ return handleArgument(context, name, isNullable);
415
618
  }
416
- return name;
619
+
620
+ const type = context.library.typeFor(ref);
621
+
622
+ return collectionArgument(context, type, name, isNullable) ?? name;
623
+ };
624
+
625
+ export {
626
+ methodExportName,
627
+ renderMethodSignature,
628
+ renderMethodReturnType,
629
+ renderPromisifiedBody,
630
+ finishCallExpression,
631
+ renderPromisifiedSignature,
632
+ renderMethodBody,
633
+ renderReturnDescriptor,
634
+ planCallArgs,
417
635
  };