@gtkx/codegen 1.0.0-rc.4 → 1.0.0

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 (410) hide show
  1. package/README.md +5 -5
  2. package/dist/analysis/descriptor-render.d.ts +8 -1
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +37 -24
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +1 -1
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js.map +1 -1
  9. package/dist/analysis/inheritance.d.ts +1 -2
  10. package/dist/analysis/inheritance.d.ts.map +1 -1
  11. package/dist/analysis/inheritance.js +25 -22
  12. package/dist/analysis/inheritance.js.map +1 -1
  13. package/dist/analysis/nul-terminated-bytes.d.ts +5 -0
  14. package/dist/analysis/nul-terminated-bytes.d.ts.map +1 -0
  15. package/dist/analysis/nul-terminated-bytes.js +18 -0
  16. package/dist/analysis/nul-terminated-bytes.js.map +1 -0
  17. package/dist/analysis/param-capability.d.ts +5 -0
  18. package/dist/analysis/param-capability.d.ts.map +1 -0
  19. package/dist/analysis/param-capability.js +130 -0
  20. package/dist/analysis/param-capability.js.map +1 -0
  21. package/dist/analysis/param-structure.d.ts +11 -4
  22. package/dist/analysis/param-structure.d.ts.map +1 -1
  23. package/dist/analysis/param-structure.js +40 -14
  24. package/dist/analysis/param-structure.js.map +1 -1
  25. package/dist/analysis/type-shape.d.ts +8 -0
  26. package/dist/analysis/type-shape.d.ts.map +1 -0
  27. package/dist/analysis/type-shape.js +12 -0
  28. package/dist/analysis/type-shape.js.map +1 -0
  29. package/dist/compile.d.ts +1 -1
  30. package/dist/compile.d.ts.map +1 -1
  31. package/dist/compile.js.map +1 -1
  32. package/dist/docs/api-reference.d.ts +2 -2
  33. package/dist/docs/api-reference.d.ts.map +1 -1
  34. package/dist/docs/api-reference.js +7 -14
  35. package/dist/docs/api-reference.js.map +1 -1
  36. package/dist/docs/element-page.d.ts +4 -4
  37. package/dist/docs/element-page.d.ts.map +1 -1
  38. package/dist/docs/element-page.js +32 -20
  39. package/dist/docs/element-page.js.map +1 -1
  40. package/dist/docs/handwritten-props.d.ts +9 -0
  41. package/dist/docs/handwritten-props.d.ts.map +1 -0
  42. package/dist/docs/handwritten-props.js +149 -0
  43. package/dist/docs/handwritten-props.js.map +1 -0
  44. package/dist/docs/pipeline.js +2 -2
  45. package/dist/docs/pipeline.js.map +1 -1
  46. package/dist/docs/render.d.ts +25 -5
  47. package/dist/docs/render.d.ts.map +1 -1
  48. package/dist/docs/render.js +84 -22
  49. package/dist/docs/render.js.map +1 -1
  50. package/dist/docs/symbol-page.d.ts +17 -0
  51. package/dist/docs/symbol-page.d.ts.map +1 -1
  52. package/dist/docs/symbol-page.js +128 -43
  53. package/dist/docs/symbol-page.js.map +1 -1
  54. package/dist/fingerprint.d.ts +1 -1
  55. package/dist/fingerprint.d.ts.map +1 -1
  56. package/dist/fingerprint.js.map +1 -1
  57. package/dist/gir/ancestry.d.ts +2 -2
  58. package/dist/gir/ancestry.d.ts.map +1 -1
  59. package/dist/gir/ancestry.js +11 -1
  60. package/dist/gir/ancestry.js.map +1 -1
  61. package/dist/gir/annotations.d.ts +22 -0
  62. package/dist/gir/annotations.d.ts.map +1 -0
  63. package/dist/gir/annotations.js +15 -0
  64. package/dist/gir/annotations.js.map +1 -0
  65. package/dist/gir/callback.d.ts +1 -0
  66. package/dist/gir/callback.d.ts.map +1 -1
  67. package/dist/gir/callback.js +1 -0
  68. package/dist/gir/callback.js.map +1 -1
  69. package/dist/gir/class.d.ts +32 -1
  70. package/dist/gir/class.d.ts.map +1 -1
  71. package/dist/gir/class.js +8 -3
  72. package/dist/gir/class.js.map +1 -1
  73. package/dist/gir/enum.d.ts +21 -1
  74. package/dist/gir/enum.d.ts.map +1 -1
  75. package/dist/gir/enum.js +9 -9
  76. package/dist/gir/enum.js.map +1 -1
  77. package/dist/gir/field.d.ts +19 -3
  78. package/dist/gir/field.d.ts.map +1 -1
  79. package/dist/gir/field.js +7 -8
  80. package/dist/gir/field.js.map +1 -1
  81. package/dist/gir/function.d.ts +15 -0
  82. package/dist/gir/function.d.ts.map +1 -1
  83. package/dist/gir/function.js.map +1 -1
  84. package/dist/gir/libraries.d.ts +1 -3
  85. package/dist/gir/libraries.d.ts.map +1 -1
  86. package/dist/gir/libraries.js +0 -1
  87. package/dist/gir/libraries.js.map +1 -1
  88. package/dist/gir/library.d.ts +36 -0
  89. package/dist/gir/library.d.ts.map +1 -1
  90. package/dist/gir/library.js +34 -0
  91. package/dist/gir/library.js.map +1 -1
  92. package/dist/gir/namespace.d.ts +38 -0
  93. package/dist/gir/namespace.d.ts.map +1 -1
  94. package/dist/gir/namespace.js +4 -5
  95. package/dist/gir/namespace.js.map +1 -1
  96. package/dist/gir/parameter.d.ts +39 -0
  97. package/dist/gir/parameter.d.ts.map +1 -1
  98. package/dist/gir/parameter.js +7 -3
  99. package/dist/gir/parameter.js.map +1 -1
  100. package/dist/gir/parse.d.ts +3 -1
  101. package/dist/gir/parse.d.ts.map +1 -1
  102. package/dist/gir/parse.js +6 -3
  103. package/dist/gir/parse.js.map +1 -1
  104. package/dist/gir/primitives.d.ts +1 -0
  105. package/dist/gir/primitives.d.ts.map +1 -1
  106. package/dist/gir/primitives.js.map +1 -1
  107. package/dist/gir/property.d.ts +16 -0
  108. package/dist/gir/property.d.ts.map +1 -1
  109. package/dist/gir/property.js +3 -3
  110. package/dist/gir/property.js.map +1 -1
  111. package/dist/gir/record.d.ts +22 -0
  112. package/dist/gir/record.d.ts.map +1 -1
  113. package/dist/gir/record.js +3 -2
  114. package/dist/gir/record.js.map +1 -1
  115. package/dist/gir/size.d.ts +5 -4
  116. package/dist/gir/size.d.ts.map +1 -1
  117. package/dist/gir/size.js.map +1 -1
  118. package/dist/gir/type-id.d.ts +35 -0
  119. package/dist/gir/type-id.d.ts.map +1 -1
  120. package/dist/gir/type-id.js +1 -0
  121. package/dist/gir/type-id.js.map +1 -1
  122. package/dist/gir/type-ref.d.ts.map +1 -1
  123. package/dist/gir/type-ref.js +1 -0
  124. package/dist/gir/type-ref.js.map +1 -1
  125. package/dist/gir/type.d.ts +20 -0
  126. package/dist/gir/type.d.ts.map +1 -1
  127. package/dist/gir/type.js.map +1 -1
  128. package/dist/khronos/args.d.ts +7 -6
  129. package/dist/khronos/args.d.ts.map +1 -1
  130. package/dist/khronos/args.js +28 -6
  131. package/dist/khronos/args.js.map +1 -1
  132. package/dist/khronos/doc-context.d.ts +29 -0
  133. package/dist/khronos/doc-context.d.ts.map +1 -0
  134. package/dist/khronos/doc-context.js +29 -0
  135. package/dist/khronos/doc-context.js.map +1 -0
  136. package/dist/khronos/extensions.d.ts +13 -0
  137. package/dist/khronos/extensions.d.ts.map +1 -0
  138. package/dist/khronos/extensions.js +49 -0
  139. package/dist/khronos/extensions.js.map +1 -0
  140. package/dist/khronos/jsdoc.d.ts +17 -11
  141. package/dist/khronos/jsdoc.d.ts.map +1 -1
  142. package/dist/khronos/jsdoc.js +104 -46
  143. package/dist/khronos/jsdoc.js.map +1 -1
  144. package/dist/khronos/model.d.ts +42 -3
  145. package/dist/khronos/model.d.ts.map +1 -1
  146. package/dist/khronos/model.js +218 -63
  147. package/dist/khronos/model.js.map +1 -1
  148. package/dist/khronos/modules.d.ts +9 -6
  149. package/dist/khronos/modules.d.ts.map +1 -1
  150. package/dist/khronos/modules.js +96 -26
  151. package/dist/khronos/modules.js.map +1 -1
  152. package/dist/khronos/notes.d.ts +19 -0
  153. package/dist/khronos/notes.d.ts.map +1 -0
  154. package/dist/khronos/notes.js +35 -0
  155. package/dist/khronos/notes.js.map +1 -0
  156. package/dist/khronos/param-pair.d.ts +1 -1
  157. package/dist/khronos/param-pair.d.ts.map +1 -1
  158. package/dist/khronos/param-pair.js.map +1 -1
  159. package/dist/khronos/pipeline.d.ts +3 -1
  160. package/dist/khronos/pipeline.d.ts.map +1 -1
  161. package/dist/khronos/pipeline.js +58 -27
  162. package/dist/khronos/pipeline.js.map +1 -1
  163. package/dist/khronos/plan.d.ts +3 -3
  164. package/dist/khronos/plan.d.ts.map +1 -1
  165. package/dist/khronos/plan.js +2 -2
  166. package/dist/khronos/plan.js.map +1 -1
  167. package/dist/khronos/render.d.ts +8 -6
  168. package/dist/khronos/render.d.ts.map +1 -1
  169. package/dist/khronos/render.js +35 -26
  170. package/dist/khronos/render.js.map +1 -1
  171. package/dist/khronos/select.d.ts +21 -4
  172. package/dist/khronos/select.d.ts.map +1 -1
  173. package/dist/khronos/select.js +47 -34
  174. package/dist/khronos/select.js.map +1 -1
  175. package/dist/react/element-config.d.ts +2 -2
  176. package/dist/react/element-config.d.ts.map +1 -1
  177. package/dist/react/element-config.js.map +1 -1
  178. package/dist/runner.d.ts +1 -7
  179. package/dist/runner.d.ts.map +1 -1
  180. package/dist/runner.js.map +1 -1
  181. package/dist/store/compile-store.d.ts +1 -1
  182. package/dist/store/compile-store.d.ts.map +1 -1
  183. package/dist/store/compile-store.js.map +1 -1
  184. package/dist/store/gi/callable-doc.d.ts +11 -0
  185. package/dist/store/gi/callable-doc.d.ts.map +1 -0
  186. package/dist/store/gi/callable-doc.js +62 -0
  187. package/dist/store/gi/callable-doc.js.map +1 -0
  188. package/dist/store/gi/callables.d.ts +3 -1
  189. package/dist/store/gi/callables.d.ts.map +1 -1
  190. package/dist/store/gi/callables.js +12 -12
  191. package/dist/store/gi/callables.js.map +1 -1
  192. package/dist/store/gi/callback.d.ts.map +1 -1
  193. package/dist/store/gi/callback.js +2 -2
  194. package/dist/store/gi/callback.js.map +1 -1
  195. package/dist/store/gi/class.d.ts.map +1 -1
  196. package/dist/store/gi/class.js +5 -3
  197. package/dist/store/gi/class.js.map +1 -1
  198. package/dist/store/gi/closure-invocation.d.ts +4 -0
  199. package/dist/store/gi/closure-invocation.d.ts.map +1 -0
  200. package/dist/store/gi/closure-invocation.js +22 -0
  201. package/dist/store/gi/closure-invocation.js.map +1 -0
  202. package/dist/store/gi/constant.d.ts.map +1 -1
  203. package/dist/store/gi/constant.js +3 -2
  204. package/dist/store/gi/constant.js.map +1 -1
  205. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  206. package/dist/store/gi/constructor-props.js +18 -20
  207. package/dist/store/gi/constructor-props.js.map +1 -1
  208. package/dist/store/gi/doc-spec.d.ts +14 -0
  209. package/dist/store/gi/doc-spec.d.ts.map +1 -0
  210. package/dist/store/gi/doc-spec.js +23 -0
  211. package/dist/store/gi/doc-spec.js.map +1 -0
  212. package/dist/store/gi/enum.d.ts.map +1 -1
  213. package/dist/store/gi/enum.js +29 -16
  214. package/dist/store/gi/enum.js.map +1 -1
  215. package/dist/store/gi/function.d.ts.map +1 -1
  216. package/dist/store/gi/function.js +27 -12
  217. package/dist/store/gi/function.js.map +1 -1
  218. package/dist/store/gi/interface.d.ts.map +1 -1
  219. package/dist/store/gi/interface.js +130 -16
  220. package/dist/store/gi/interface.js.map +1 -1
  221. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  222. package/dist/store/gi/item-comparators.js +3 -5
  223. package/dist/store/gi/item-comparators.js.map +1 -1
  224. package/dist/store/gi/method.d.ts +9 -1
  225. package/dist/store/gi/method.d.ts.map +1 -1
  226. package/dist/store/gi/method.js +69 -26
  227. package/dist/store/gi/method.js.map +1 -1
  228. package/dist/store/gi/param-marshal.d.ts +4 -1
  229. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  230. package/dist/store/gi/param-marshal.js +5 -1
  231. package/dist/store/gi/param-marshal.js.map +1 -1
  232. package/dist/store/gi/pipeline.d.ts.map +1 -1
  233. package/dist/store/gi/pipeline.js +3 -2
  234. package/dist/store/gi/pipeline.js.map +1 -1
  235. package/dist/store/gi/properties.d.ts.map +1 -1
  236. package/dist/store/gi/properties.js +2 -2
  237. package/dist/store/gi/properties.js.map +1 -1
  238. package/dist/store/gi/property-accessor.d.ts +3 -1
  239. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  240. package/dist/store/gi/property-accessor.js +6 -5
  241. package/dist/store/gi/property-accessor.js.map +1 -1
  242. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  243. package/dist/store/gi/record-constructor.js +3 -1
  244. package/dist/store/gi/record-constructor.js.map +1 -1
  245. package/dist/store/gi/record-field-accessor.d.ts +3 -1
  246. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  247. package/dist/store/gi/record-field-accessor.js +3 -2
  248. package/dist/store/gi/record-field-accessor.js.map +1 -1
  249. package/dist/store/gi/record-layout.js +1 -1
  250. package/dist/store/gi/record-layout.js.map +1 -1
  251. package/dist/store/gi/record.d.ts.map +1 -1
  252. package/dist/store/gi/record.js +3 -2
  253. package/dist/store/gi/record.js.map +1 -1
  254. package/dist/store/gi/registration.d.ts +1 -1
  255. package/dist/store/gi/registration.js +2 -2
  256. package/dist/store/gi/registration.js.map +1 -1
  257. package/dist/store/gi/runtime-override.d.ts +2 -1
  258. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  259. package/dist/store/gi/runtime-override.js +8 -5
  260. package/dist/store/gi/runtime-override.js.map +1 -1
  261. package/dist/store/gi/signal.d.ts.map +1 -1
  262. package/dist/store/gi/signal.js +14 -15
  263. package/dist/store/gi/signal.js.map +1 -1
  264. package/dist/store/gi/value-marshalable.d.ts +1 -2
  265. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  266. package/dist/store/gi/value-marshalable.js +1 -1
  267. package/dist/store/gi/value-marshalable.js.map +1 -1
  268. package/dist/store/gi/vtable.d.ts +16 -1
  269. package/dist/store/gi/vtable.d.ts.map +1 -1
  270. package/dist/store/gi/vtable.js +214 -51
  271. package/dist/store/gi/vtable.js.map +1 -1
  272. package/dist/store/jsx/element-components.d.ts +1 -1
  273. package/dist/store/jsx/element-components.d.ts.map +1 -1
  274. package/dist/store/jsx/element-components.js +6 -4
  275. package/dist/store/jsx/element-components.js.map +1 -1
  276. package/dist/store/jsx/element-prop-imports.d.ts +1 -3
  277. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -1
  278. package/dist/store/jsx/element-prop-imports.js.map +1 -1
  279. package/dist/store/jsx/element-prop-types.d.ts +3 -0
  280. package/dist/store/jsx/element-prop-types.d.ts.map +1 -1
  281. package/dist/store/jsx/element-prop-types.js +7 -1
  282. package/dist/store/jsx/element-prop-types.js.map +1 -1
  283. package/dist/store/jsx/intrinsic-elements.d.ts +4 -0
  284. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -1
  285. package/dist/store/jsx/intrinsic-elements.js.map +1 -1
  286. package/dist/store/jsx/jsx.d.ts.map +1 -1
  287. package/dist/store/jsx/jsx.js +7 -6
  288. package/dist/store/jsx/jsx.js.map +1 -1
  289. package/dist/store/jsx/metadata.js +2 -2
  290. package/dist/store/jsx/metadata.js.map +1 -1
  291. package/dist/store/jsx/pipeline.d.ts +1 -1
  292. package/dist/store/jsx/pipeline.d.ts.map +1 -1
  293. package/dist/store/jsx/pipeline.js.map +1 -1
  294. package/dist/store/jsx/props.d.ts +1 -7
  295. package/dist/store/jsx/props.d.ts.map +1 -1
  296. package/dist/store/jsx/props.js +14 -6
  297. package/dist/store/jsx/props.js.map +1 -1
  298. package/dist/writer/context.d.ts +2 -1
  299. package/dist/writer/context.d.ts.map +1 -1
  300. package/dist/writer/context.js +3 -0
  301. package/dist/writer/context.js.map +1 -1
  302. package/dist/writer/doc-tags.d.ts +21 -0
  303. package/dist/writer/doc-tags.d.ts.map +1 -0
  304. package/dist/writer/doc-tags.js +38 -0
  305. package/dist/writer/doc-tags.js.map +1 -0
  306. package/dist/writer/doc.d.ts +3 -1
  307. package/dist/writer/doc.d.ts.map +1 -1
  308. package/dist/writer/doc.js +19 -6
  309. package/dist/writer/doc.js.map +1 -1
  310. package/dist/writer/gtk-doc.d.ts +1 -1
  311. package/dist/writer/gtk-doc.d.ts.map +1 -1
  312. package/dist/writer/gtk-doc.js +64 -15
  313. package/dist/writer/gtk-doc.js.map +1 -1
  314. package/dist/writer/module.d.ts +8 -2
  315. package/dist/writer/module.d.ts.map +1 -1
  316. package/dist/writer/module.js +13 -1
  317. package/dist/writer/module.js.map +1 -1
  318. package/overrides/gdk/rgba.ts.ejs +26 -0
  319. package/overrides/gobject/object.ts.ejs +48 -3
  320. package/overrides/gobject/value.ts.ejs +7 -0
  321. package/overrides/graphene/structs.ts.ejs +55 -0
  322. package/package.json +4 -4
  323. package/src/analysis/descriptor-render.ts +47 -28
  324. package/src/analysis/descriptor.ts +0 -3
  325. package/src/analysis/inheritance.ts +35 -34
  326. package/src/analysis/nul-terminated-bytes.ts +31 -0
  327. package/src/analysis/param-capability.ts +172 -0
  328. package/src/analysis/param-structure.ts +83 -23
  329. package/src/analysis/type-shape.ts +24 -0
  330. package/src/compile.ts +1 -1
  331. package/src/docs/api-reference.ts +36 -25
  332. package/src/docs/element-page.ts +53 -47
  333. package/src/docs/handwritten-props.ts +230 -0
  334. package/src/docs/pipeline.ts +2 -2
  335. package/src/docs/render.ts +146 -32
  336. package/src/docs/symbol-page.ts +224 -79
  337. package/src/fingerprint.ts +0 -1
  338. package/src/gir/ancestry.ts +15 -1
  339. package/src/gir/annotations.ts +37 -0
  340. package/src/gir/callback.ts +2 -0
  341. package/src/gir/class.ts +42 -4
  342. package/src/gir/enum.ts +30 -10
  343. package/src/gir/field.ts +24 -9
  344. package/src/gir/function.ts +15 -0
  345. package/src/gir/libraries.ts +11 -3
  346. package/src/gir/library.ts +51 -2
  347. package/src/gir/namespace.ts +41 -5
  348. package/src/gir/parameter.ts +47 -3
  349. package/src/gir/parse.ts +8 -2
  350. package/src/gir/primitives.ts +1 -0
  351. package/src/gir/property.ts +18 -3
  352. package/src/gir/record.ts +24 -2
  353. package/src/gir/size.ts +8 -3
  354. package/src/gir/type-id.ts +49 -3
  355. package/src/gir/type-ref.ts +1 -0
  356. package/src/gir/type.ts +50 -6
  357. package/src/khronos/args.ts +36 -13
  358. package/src/khronos/doc-context.ts +62 -0
  359. package/src/khronos/extensions.ts +85 -0
  360. package/src/khronos/jsdoc.ts +152 -56
  361. package/src/khronos/model.ts +314 -69
  362. package/src/khronos/modules.ts +134 -40
  363. package/src/khronos/notes.ts +74 -0
  364. package/src/khronos/param-pair.ts +1 -1
  365. package/src/khronos/pipeline.ts +94 -41
  366. package/src/khronos/plan.ts +4 -5
  367. package/src/khronos/render.ts +62 -50
  368. package/src/khronos/select.ts +91 -50
  369. package/src/react/element-config.ts +2 -2
  370. package/src/runner.ts +1 -8
  371. package/src/store/compile-store.ts +1 -1
  372. package/src/store/gi/callable-doc.ts +102 -0
  373. package/src/store/gi/callables.ts +18 -12
  374. package/src/store/gi/callback.ts +3 -2
  375. package/src/store/gi/class.ts +6 -3
  376. package/src/store/gi/closure-invocation.ts +26 -0
  377. package/src/store/gi/constant.ts +3 -4
  378. package/src/store/gi/constructor-props.ts +19 -23
  379. package/src/store/gi/doc-spec.ts +38 -0
  380. package/src/store/gi/enum.ts +55 -20
  381. package/src/store/gi/function.ts +43 -21
  382. package/src/store/gi/interface.ts +214 -26
  383. package/src/store/gi/item-comparators.ts +3 -5
  384. package/src/store/gi/method.ts +98 -42
  385. package/src/store/gi/param-marshal.ts +15 -1
  386. package/src/store/gi/pipeline.ts +7 -2
  387. package/src/store/gi/properties.ts +3 -2
  388. package/src/store/gi/property-accessor.ts +9 -4
  389. package/src/store/gi/record-constructor.ts +6 -1
  390. package/src/store/gi/record-field-accessor.ts +5 -3
  391. package/src/store/gi/record-layout.ts +1 -1
  392. package/src/store/gi/record.ts +8 -2
  393. package/src/store/gi/registration.ts +3 -3
  394. package/src/store/gi/runtime-override.ts +13 -6
  395. package/src/store/gi/signal.ts +19 -20
  396. package/src/store/gi/value-marshalable.ts +1 -1
  397. package/src/store/gi/vtable.ts +361 -60
  398. package/src/store/jsx/element-components.ts +8 -5
  399. package/src/store/jsx/element-prop-imports.ts +1 -3
  400. package/src/store/jsx/element-prop-types.ts +10 -1
  401. package/src/store/jsx/intrinsic-elements.ts +4 -0
  402. package/src/store/jsx/jsx.ts +8 -6
  403. package/src/store/jsx/metadata.ts +2 -2
  404. package/src/store/jsx/pipeline.ts +1 -1
  405. package/src/store/jsx/props.ts +20 -7
  406. package/src/writer/context.ts +5 -1
  407. package/src/writer/doc-tags.ts +70 -0
  408. package/src/writer/doc.ts +29 -6
  409. package/src/writer/gtk-doc.ts +82 -15
  410. package/src/writer/module.ts +25 -2
@@ -1,20 +1,24 @@
1
- import { pascalCase } from "@gtkx/utils";
1
+ import { pascalCase, sourceStringLiteral } from "@gtkx/utils";
2
2
  import type { GirClass } from "../../gir/class.js";
3
- import type { GirFunction } from "../../gir/function.js";
3
+ import type { GirProperty } from "../../gir/property.js";
4
4
  import type { ModuleContext } from "../../writer/context.js";
5
5
  import { reservedSignalMemberRename, resolvePrerequisiteReference } from "../../analysis/inheritance.js";
6
+ import { resolveInterfaces } from "../../gir/ancestry.js";
6
7
  import { renderJsDoc } from "../../writer/doc.js";
7
- import { renderBlock, renderBracedOrEmpty } from "../../writer/emit.js";
8
+ import { renderBlock, renderBraced, renderBracedOrEmpty } from "../../writer/emit.js";
8
9
  import {
9
10
  type Callables,
10
11
  dedupeCallables,
11
12
  generateBindings,
13
+ type InstanceMemberRenderer,
12
14
  type InstanceScope,
13
15
  instanceScope,
16
+ isEmittableCallable,
14
17
  renderClassInstanceMember,
15
18
  renderInstanceMethodSignature,
16
19
  renderStaticHead,
17
20
  } from "./callables.js";
21
+ import { annotationSpec, getDoc } from "./doc-spec.js";
18
22
  import { renderSourceGtype } from "./gtype-binding.js";
19
23
  import { methodExportName } from "./method.js";
20
24
  import {
@@ -24,15 +28,15 @@ import {
24
28
  } from "./property-accessor.js";
25
29
  import { appendInterfaceRegistration } from "./registration.js";
26
30
  import { renderSignalDeclarations, renderSignalMembers } from "./signal.js";
27
- import { renderVfuncMetadata } from "./vtable.js";
31
+ import {
32
+ hasCallableVfuncSlots,
33
+ renderVfuncMembers,
34
+ renderVfuncMetadata,
35
+ type VfuncMemberMode,
36
+ } from "./vtable.js";
28
37
 
29
38
  type InterfaceMemberRenderers = {
30
- renderMethod: (
31
- context: ModuleContext,
32
- callable: GirFunction,
33
- scope: InstanceScope,
34
- nameOverride?: string,
35
- ) => string | undefined;
39
+ renderMethod: InstanceMemberRenderer;
36
40
  renderProperty: (args: PropertyAccessorArgs) => string | undefined;
37
41
  };
38
42
 
@@ -53,6 +57,20 @@ type PropertyMemberOptions = {
53
57
  claimedNames: Set<string>;
54
58
  };
55
59
 
60
+ type InterfaceClassOptions = {
61
+ iface: GirClass;
62
+ className: string;
63
+ callables: Callables;
64
+ gtypeExpr: string | undefined;
65
+ implRef: string;
66
+ };
67
+
68
+ const BRAND_NOTE = [
69
+ "Phantom link to the type a class fills to adopt the interface, which `registerClass` reads",
70
+ "through its `implements` option. It holds no value at runtime. `unknown` asks nothing of the",
71
+ "class, which is what an interface with no slot to fill carries.",
72
+ ].join("\n");
73
+
56
74
  const generateInterface = (context: ModuleContext, iface: GirClass): void => {
57
75
  if (!iface.introspectable) {
58
76
  return;
@@ -72,8 +90,9 @@ const generateInterface = (context: ModuleContext, iface: GirClass): void => {
72
90
 
73
91
  generateBindings(context, callables);
74
92
  const gtypeExpr = renderSourceGtype(context, iface);
75
- context.module.appendDeclaration(renderInterfaceType(context, iface, className, callables));
76
- context.module.appendDeclaration(renderInterfaceClass(context, className, callables, gtypeExpr));
93
+ const implRef = appendInterfaceTypes(context, iface, className, callables) ?? "unknown";
94
+ const classCode = renderInterfaceClass(context, { iface, className, callables, gtypeExpr, implRef });
95
+ context.module.appendDeclaration(classCode, context.declaredType(className));
77
96
 
78
97
  for (const declaration of renderSignalDeclarations(context, iface, className, true)) {
79
98
  context.module.appendDeclaration(declaration);
@@ -85,12 +104,116 @@ const generateInterface = (context: ModuleContext, iface: GirClass): void => {
85
104
  className,
86
105
  makerName: makerName(className),
87
106
  gtypeExpr,
88
- vfuncs: renderVfuncMetadata(context, iface),
107
+ layout: renderInterfaceLayout(context, iface, callables),
89
108
  });
90
109
  };
91
110
 
92
111
  const makerName = (className: string): string => `make${className}`;
93
112
 
113
+ const renderInterfaceLayout = (
114
+ context: ModuleContext,
115
+ iface: GirClass,
116
+ callables: Callables,
117
+ ): string | undefined => {
118
+ const vfuncs = renderVfuncMetadata(context, iface);
119
+ const properties = renderSlotBackedProperties(context, iface, callables);
120
+
121
+ if (vfuncs === undefined && properties === undefined) {
122
+ return undefined;
123
+ }
124
+
125
+ const entries: string[] = [];
126
+
127
+ if (vfuncs !== undefined) {
128
+ entries.push(`vfuncs: ${vfuncs},`);
129
+ }
130
+
131
+ if (properties !== undefined) {
132
+ entries.push(`properties: ${properties},`);
133
+ }
134
+
135
+ return renderBraced(entries.join("\n"));
136
+ };
137
+
138
+ const invokerMembers = (context: ModuleContext, iface: GirClass, callables: Callables): Map<string, string> => {
139
+ const className = pascalCase(iface.name);
140
+
141
+ const invokers: Set<string> = new Set(
142
+ iface.vfuncs.map((vfunc) => vfunc.invoker).filter((invoker) => invoker !== undefined),
143
+ );
144
+
145
+ const members: Map<string, string> = new Map();
146
+
147
+ for (const callable of callables.methods) {
148
+ if (invokers.has(callable.name) && isEmittableCallable(context, callable)) {
149
+ members.set(callable.name, reservedSignalMemberRename(className, callable) ?? methodExportName(callable));
150
+ }
151
+ }
152
+
153
+ return members;
154
+ };
155
+
156
+ const renderSlotAccessor = (
157
+ key: string,
158
+ method: string | undefined,
159
+ members: Map<string, string>,
160
+ ): string | undefined => {
161
+ const member = method === undefined ? undefined : members.get(method);
162
+
163
+ return member === undefined ? undefined : `${key}: ${sourceStringLiteral(member)},`;
164
+ };
165
+
166
+ const renderSlotBackedProperty = (property: GirProperty, members: Map<string, string>): string | undefined => {
167
+ if (!property.introspectable) {
168
+ return undefined;
169
+ }
170
+
171
+ const fields = [
172
+ renderSlotAccessor("getter", property.getter, members),
173
+ renderSlotAccessor("setter", property.setter, members),
174
+ ].filter((field) => field !== undefined);
175
+
176
+ if (fields.length === 0) {
177
+ return undefined;
178
+ }
179
+
180
+ return `${sourceStringLiteral(property.name)}: ${renderBraced(fields.join("\n"))},`;
181
+ };
182
+
183
+ const renderSlotBackedProperties = (
184
+ context: ModuleContext,
185
+ iface: GirClass,
186
+ callables: Callables,
187
+ ): string | undefined => {
188
+ const members = invokerMembers(context, iface, callables);
189
+
190
+ const entries = iface.properties
191
+ .map((property) => renderSlotBackedProperty(property, members))
192
+ .filter((entry) => entry !== undefined);
193
+
194
+ return entries.length === 0 ? undefined : renderBraced(entries.join("\n"));
195
+ };
196
+
197
+ const appendInterfaceTypes = (
198
+ context: ModuleContext,
199
+ iface: GirClass,
200
+ className: string,
201
+ callables: Callables,
202
+ ): string | undefined => {
203
+ const typeCode = renderInterfaceType(context, iface, className, callables);
204
+ context.module.appendDeclaration(typeCode, context.declaredType(className));
205
+ const implType = renderInterfaceImplType(context, iface, className);
206
+
207
+ if (implType === undefined) {
208
+ return undefined;
209
+ }
210
+
211
+ const implName = implTypeName(className);
212
+ context.module.appendDeclaration(implType, context.declaredType(className, implName));
213
+
214
+ return implName;
215
+ };
216
+
94
217
  const interfaceTypeExtends = (context: ModuleContext, iface: GirClass): string => {
95
218
  const refs = iface.prerequisites
96
219
  .map((name) => resolvePrerequisiteReference(context, name))
@@ -111,12 +234,69 @@ const renderInterfaceType = (
111
234
  ): string => {
112
235
  const members = renderInterfaceTypeMembers(context, iface, callables);
113
236
 
114
- return `${renderJsDoc(iface.doc)}${renderBracedOrEmpty(
237
+ return `${getDoc(iface)}${renderBracedOrEmpty(
115
238
  `export interface ${className} extends ${interfaceTypeExtends(context, iface)}`,
116
239
  members.join("\n"),
117
240
  )}`;
118
241
  };
119
242
 
243
+ const implTypeName = (className: string): string => `${className}Impl`;
244
+
245
+ const implTypeNote = (className: string): string =>
246
+ [
247
+ `Implementer side of \`${className}\`: the vtable slots a class fills to adopt the interface.`,
248
+ "",
249
+ `Declare it with \`implements ${implTypeName(className)}\` on a class passed to \`registerClass\``,
250
+ `with \`${className}\` in \`implements\`. The interface's methods, properties, and signals come from`,
251
+ "GLib dispatch, so they are not part of this type.",
252
+ "",
253
+ "Every slot is optional: an unfilled one keeps whatever the interface installs by default, and a",
254
+ "GIR update can add one. Declaring a slot pins its signature; declaring it as a class field rather",
255
+ "than a method satisfies this type but never reaches the vtable.",
256
+ ].join("\n");
257
+
258
+ const implPrerequisiteRefs = (context: ModuleContext, iface: GirClass): string[] => {
259
+ const prerequisites = resolveInterfaces(context.library, context.namespace.name, iface.prerequisites);
260
+ const refs: string[] = [];
261
+
262
+ for (const prerequisite of prerequisites) {
263
+ if (!hasCallableVfuncSlots(context, prerequisite.namespaceName, prerequisite.klass)) {
264
+ continue;
265
+ }
266
+
267
+ const name = implTypeName(pascalCase(prerequisite.klass.name));
268
+ refs.push(context.qualify(prerequisite.namespaceName, name));
269
+ }
270
+
271
+ return refs;
272
+ };
273
+
274
+ const implTypeExtends = (context: ModuleContext, iface: GirClass): string => {
275
+ const refs = implPrerequisiteRefs(context, iface);
276
+
277
+ return refs.length > 0 ? ` extends ${refs.join(", ")}` : "";
278
+ };
279
+
280
+ const interfaceVfuncMembers = (context: ModuleContext, iface: GirClass, mode: VfuncMemberMode): string[] =>
281
+ renderVfuncMembers({ context, klass: iface, mode });
282
+
283
+ const renderInterfaceImplType = (
284
+ context: ModuleContext,
285
+ iface: GirClass,
286
+ className: string,
287
+ ): string | undefined => {
288
+ const members = interfaceVfuncMembers(context, iface, "requirement");
289
+
290
+ if (members.length === 0) {
291
+ return undefined;
292
+ }
293
+
294
+ return `${renderJsDoc(iface.doc, implTypeNote(className), annotationSpec(iface.annotations))}${renderBracedOrEmpty(
295
+ `export interface ${implTypeName(className)}${implTypeExtends(context, iface)}`,
296
+ members.join("\n"),
297
+ )}`;
298
+ };
299
+
120
300
  const collectMethodMembers = (options: MethodMemberOptions): string[] => {
121
301
  const { context, className, scope, callables, renderers, claimedNames } = options;
122
302
  const members: string[] = [];
@@ -166,27 +346,34 @@ const renderInterfaceMembers = (
166
346
  return [...methodMembers, ...propertyMembers];
167
347
  };
168
348
 
169
- const renderInterfaceTypeMembers = (context: ModuleContext, iface: GirClass, callables: Callables): string[] =>
170
- renderInterfaceMembers(context, iface, callables, {
349
+ const renderInterfaceTypeMembers = (context: ModuleContext, iface: GirClass, callables: Callables): string[] => [
350
+ ...renderInterfaceMembers(context, iface, callables, {
171
351
  renderMethod: renderInstanceMethodSignature,
172
352
  renderProperty: renderPropertyAccessorSignature,
173
- });
353
+ }),
354
+ ...interfaceVfuncMembers(context, iface, "signature"),
355
+ ];
174
356
 
175
- const renderInterfaceClass = (
176
- context: ModuleContext,
177
- className: string,
178
- callables: Callables,
179
- gtypeExpr: string | undefined,
180
- ): string => {
357
+ const renderInterfaceClass = (context: ModuleContext, options: InterfaceClassOptions): string => {
358
+ const { iface, className, callables, gtypeExpr, implRef } = options;
181
359
  const members: string[] = [];
182
360
 
183
361
  if (gtypeExpr !== undefined) {
184
362
  members.push(renderInterfaceHasInstance(context, className, gtypeExpr));
185
363
  }
186
364
 
187
- members.push(...renderStaticHead(context, callables, className));
365
+ members.push(...renderStaticHead(context, callables, className), renderInterfaceBrand(context, implRef));
366
+
367
+ return `${getDoc(iface)}${renderBracedOrEmpty(
368
+ `export abstract class ${className}`,
369
+ members.join("\n\n"),
370
+ )}`;
371
+ };
372
+
373
+ const renderInterfaceBrand = (context: ModuleContext, implRef: string): string => {
374
+ context.addRuntimeTypeImport("Interface");
188
375
 
189
- return renderBracedOrEmpty(`export abstract class ${className}`, members.join("\n\n"));
376
+ return `${renderJsDoc(undefined, BRAND_NOTE)}declare static __impl__: Interface<${implRef}>["__impl__"];`;
190
377
  };
191
378
 
192
379
  const renderInterfaceHasInstance = (context: ModuleContext, className: string, gtypeExpr: string): string => {
@@ -208,7 +395,7 @@ const renderInterfaceMaker = (
208
395
  const members = renderInterfaceInstanceMembers(context, iface, callables);
209
396
  const classExpression = renderBracedOrEmpty("class extends Base", members.join("\n\n"));
210
397
 
211
- return `export const ${makerName(className)}: Mixin = (Base) =>\n${classExpression};`;
398
+ return `${getDoc(iface)}export const ${makerName(className)}: Mixin = (Base) =>\n${classExpression};`;
212
399
  };
213
400
 
214
401
  const renderInterfaceInstanceMembers = (context: ModuleContext, iface: GirClass, callables: Callables): string[] => [
@@ -216,6 +403,7 @@ const renderInterfaceInstanceMembers = (context: ModuleContext, iface: GirClass,
216
403
  renderMethod: renderClassInstanceMember,
217
404
  renderProperty: renderPropertyAccessor,
218
405
  }),
406
+ ...interfaceVfuncMembers(context, iface, "implementation"),
219
407
  ...renderSignalMembers(context, iface),
220
408
  ];
221
409
 
@@ -5,7 +5,7 @@ import type { ModuleContext } from "../../writer/context.js";
5
5
  import { tObject } from "../../analysis/descriptor.js";
6
6
  import { inputParameters, parameterIdentifier } from "../../analysis/param-structure.js";
7
7
  import { renderTsType } from "../../analysis/ts-type.js";
8
- import { resolveInterface } from "../../gir/ancestry.js";
8
+ import { resolveInterfaces } from "../../gir/ancestry.js";
9
9
  import { callbackAsFunction, type GirCallback } from "../../gir/callback.js";
10
10
 
11
11
  const COMPARATOR_CALLBACK_TYPES = new Set([
@@ -30,11 +30,9 @@ const isListModelImplementor = (context: ModuleContext, ref: TypeId): boolean =>
30
30
  return false;
31
31
  }
32
32
 
33
- return resolved.value.implements.some((interfaceName) => {
34
- const iface = resolveInterface(context.library, resolved.namespace.name, interfaceName);
33
+ const interfaces = resolveInterfaces(context.library, resolved.namespace.name, resolved.value.implements);
35
34
 
36
- return iface?.namespaceName === "Gio" && iface.klass.name === "ListModel";
37
- });
35
+ return interfaces.some((iface) => iface.namespaceName === "Gio" && iface.klass.name === "ListModel");
38
36
  };
39
37
 
40
38
  const isObjectItemComparator = (context: ModuleContext, fn: GirFunction): boolean => {
@@ -14,17 +14,29 @@ import {
14
14
  emittedArgIndices,
15
15
  foldedLengthIndices,
16
16
  foldOutParamShape,
17
+ type InputParameter,
17
18
  inputParameters,
18
19
  parameterIdentifier,
19
20
  } from "../../analysis/param-structure.js";
20
21
  import { renderTsType } from "../../analysis/ts-type.js";
21
22
  import { type GirParameter, isCallerAllocatedOut, isInoutParameter, isOutParameter } from "../../gir/parameter.js";
22
23
  import { hasUnknownArrayLength, type TypeId } from "../../gir/type-id.js";
24
+ import { areClosuresInvoked } from "./closure-invocation.js";
23
25
  import { itemComparatorArgDescriptors, itemComparatorTsType } from "./item-comparators.js";
24
- import { isCollectibleCallerOut, isHandlePassedInPlace, isHandlePassing } from "./param-marshal.js";
26
+ import { isClosureType, isCollectibleCallerOut, isHandlePassedInPlace, isHandlePassing } from "./param-marshal.js";
25
27
 
26
28
  type PromisifiedStep = { hasSeenOptional: boolean; expression: string | undefined };
27
29
 
30
+ type InputParameterOptions = {
31
+ shouldSkip: (parameter: GirParameter) => boolean;
32
+ isOptionalExtra: (parameter: GirParameter) => boolean;
33
+ };
34
+
35
+ type CallExpressionOptions = {
36
+ fn: GirFunction;
37
+ isForcedNullable?: boolean | undefined;
38
+ };
39
+
28
40
  type PromisifyContext = {
29
41
  context: ModuleContext;
30
42
  asyncFn: GirFunction;
@@ -71,15 +83,34 @@ const arrayLengthArgument = (source: GirParameter, sourceIndex: number): string
71
83
  };
72
84
 
73
85
  const renderMethodSignature = (context: ModuleContext, fn: GirFunction): string =>
74
- renderInputParameters(
75
- context,
76
- fn,
77
- () => false,
78
- () => false,
79
- );
86
+ renderInputParameters(context, fn, {
87
+ shouldSkip: () => false,
88
+ isOptionalExtra: () => false,
89
+ });
90
+
91
+ const closureAnnotation = (context: ModuleContext, base: string): string => {
92
+ context.addRuntimeTypeImport("ClosureCallback");
93
+
94
+ return `${base} | ClosureCallback`;
95
+ };
80
96
 
81
- const parameterAnnotation = (context: ModuleContext, fn: GirFunction, parameter: GirParameter): string =>
82
- itemComparatorTsType(context, fn, parameter) ?? renderTsType(context, parameter.type, parameter.nullable);
97
+ const requiresClosureMarshal = (context: ModuleContext, fn: GirFunction, ref: TypeId): boolean =>
98
+ isClosureType(context, ref) && areClosuresInvoked(fn);
99
+
100
+ const requiresClosureAnnotation = (context: ModuleContext, fn: GirFunction, parameter: GirParameter): boolean =>
101
+ parameter.type !== undefined && requiresClosureMarshal(context, fn, parameter.type);
102
+
103
+ const parameterAnnotation = (context: ModuleContext, fn: GirFunction, parameter: GirParameter): string => {
104
+ const comparator = itemComparatorTsType(context, fn, parameter);
105
+
106
+ if (comparator !== undefined) {
107
+ return comparator;
108
+ }
109
+
110
+ const base = renderTsType(context, parameter.type, parameter.nullable);
111
+
112
+ return requiresClosureAnnotation(context, fn, parameter) ? closureAnnotation(context, base) : base;
113
+ };
83
114
 
84
115
  const isParameterOptional = (parameter: GirParameter, isOptionalExtra: (parameter: GirParameter) => boolean): boolean =>
85
116
  parameter.optional || isOptionalExtra(parameter);
@@ -87,27 +118,23 @@ const isParameterOptional = (parameter: GirParameter, isOptionalExtra: (paramete
87
118
  const formatParameterPart = (name: string, annotation: string, isOptional: boolean): string =>
88
119
  isOptional ? `${name}?: ${annotation}` : `${name}: ${annotation}`;
89
120
 
90
- const renderInputParameters = (
91
- context: ModuleContext,
92
- fn: GirFunction,
93
- shouldSkip: (parameter: GirParameter) => boolean,
94
- isOptionalExtra: (parameter: GirParameter) => boolean,
95
- ): string => {
121
+ const renderInputParameters = (context: ModuleContext, fn: GirFunction, options: InputParameterOptions): string => {
96
122
  const parts: string[] = [];
97
123
  let hasSeenOptional = false;
98
124
 
99
125
  for (const { parameter, index } of inputParameters(context.library, fn)) {
100
- if (shouldSkip(parameter)) {
126
+ if (options.shouldSkip(parameter)) {
101
127
  continue;
102
128
  }
103
129
 
104
130
  const name = parameterIdentifier(parameter, index);
105
131
 
106
- if (isParameterOptional(parameter, isOptionalExtra)) {
132
+ if (isParameterOptional(parameter, options.isOptionalExtra)) {
107
133
  hasSeenOptional = true;
108
134
  }
109
135
 
110
- parts.push(formatParameterPart(name, parameterAnnotation(context, fn, parameter), hasSeenOptional));
136
+ const annotation = parameterAnnotation(context, fn, parameter);
137
+ parts.push(formatParameterPart(name, annotation, hasSeenOptional));
111
138
  }
112
139
 
113
140
  return parts.join(", ");
@@ -118,9 +145,21 @@ const isReturnedOutParameter = (context: ModuleContext, parameter: GirParameter)
118
145
  (isCallerAllocatedOut(parameter) && isCollectibleCallerOut(context, parameter)) ||
119
146
  isInoutParameter(parameter);
120
147
 
121
- const renderMethodReturnType = (context: ModuleContext, fn: GirFunction): string => {
148
+ const returnedOutParameters = (context: ModuleContext, fn: GirFunction): InputParameter[] => {
122
149
  const folded = foldedLengthIndices(context.library, fn);
123
- const outs = fn.parameters.filter((p, index) => isReturnedOutParameter(context, p) && !folded.has(index));
150
+ const result: InputParameter[] = [];
151
+
152
+ for (const [index, parameter] of fn.parameters.entries()) {
153
+ if (isReturnedOutParameter(context, parameter) && !folded.has(index)) {
154
+ result.push({ parameter, index });
155
+ }
156
+ }
157
+
158
+ return result;
159
+ };
160
+
161
+ const renderMethodReturnType = (context: ModuleContext, fn: GirFunction): string => {
162
+ const outs = returnedOutParameters(context, fn);
124
163
 
125
164
  const primary = shouldOmitPrimaryReturn(context.library, fn.returnValue)
126
165
  ? undefined
@@ -130,7 +169,7 @@ const renderMethodReturnType = (context: ModuleContext, fn: GirFunction): string
130
169
  return primary ?? "void";
131
170
  }
132
171
 
133
- const outTypes = outs.map((parameter) => renderTsType(context, parameter.type, parameter.nullable));
172
+ const outTypes = outs.map(({ parameter }) => renderTsType(context, parameter.type, parameter.nullable));
134
173
 
135
174
  return foldOutParamShape(primary, outTypes);
136
175
  };
@@ -242,7 +281,7 @@ const promisifiedArgument = (
242
281
  return arrayLengthArgument(source, sourceIndex);
243
282
  }
244
283
 
245
- return parameterCallExpression(context, parameter, index, hasSeenOptional);
284
+ return parameterCallExpression(context, parameter, index, { fn: asyncFn, isForcedNullable: hasSeenOptional });
246
285
  };
247
286
 
248
287
  const findCancellableIndex = (context: ModuleContext, parameters: GirParameter[]): number =>
@@ -253,12 +292,10 @@ const renderPromisifiedSignature = (
253
292
  asyncFn: GirFunction,
254
293
  finishFn: GirFunction,
255
294
  ): { signature: string; returnType: string } => {
256
- const signature = renderInputParameters(
257
- context,
258
- asyncFn,
259
- (parameter) => isCallbackParameter(context, parameter),
260
- (parameter) => isCancellable(context, parameter),
261
- );
295
+ const signature = renderInputParameters(context, asyncFn, {
296
+ shouldSkip: (parameter) => isCallbackParameter(context, parameter),
297
+ isOptionalExtra: (parameter) => isCancellable(context, parameter),
298
+ });
262
299
 
263
300
  const finishReturn = renderMethodReturnType(context, finishFn);
264
301
 
@@ -405,6 +442,7 @@ const planInoutArgument = (
405
442
  : undefined;
406
443
 
407
444
  return planInoutParam(context, parameter, {
445
+ fn,
408
446
  index,
409
447
  argIndex: planContext.argIndex,
410
448
  isConsumed: folded.has(index),
@@ -433,7 +471,10 @@ const planOutParam = (
433
471
  argIndex: ArgIndexOptions,
434
472
  isConsumed: boolean,
435
473
  ): CallArgPlan => {
436
- const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, argIndex);
474
+ const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, {
475
+ ...argIndex,
476
+ hasOutIndirection: true,
477
+ });
437
478
 
438
479
  return {
439
480
  paramLiteral: paramDescriptorLiteral(descriptor, { direction: "out", isConsumed }),
@@ -486,13 +527,14 @@ const planInoutParam = (
486
527
  context: ModuleContext,
487
528
  parameter: GirParameter,
488
529
  options: {
530
+ fn: GirFunction;
489
531
  index: number;
490
532
  argIndex: ArgIndexOptions;
491
533
  isConsumed: boolean;
492
534
  lengthSource?: { source: GirParameter; index: number } | undefined;
493
535
  },
494
536
  ): CallArgPlan => {
495
- const { index, argIndex, isConsumed, lengthSource } = options;
537
+ const { fn, index, argIndex, isConsumed, lengthSource } = options;
496
538
 
497
539
  if (isHandlePassedInPlace(context, parameter)) {
498
540
  const descriptor = renderDescriptor(context, parameter.type, "none", argIndex);
@@ -507,13 +549,16 @@ const planInoutParam = (
507
549
  };
508
550
  }
509
551
 
510
- const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, argIndex);
552
+ const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, {
553
+ ...argIndex,
554
+ hasOutIndirection: true,
555
+ });
511
556
 
512
557
  return {
513
558
  paramLiteral: paramDescriptorLiteral(descriptor, { direction: "inout", isConsumed }),
514
559
  inputExpr:
515
560
  lengthSource === undefined
516
- ? parameterCallExpression(context, parameter, index)
561
+ ? parameterCallExpression(context, parameter, index, { fn })
517
562
  : arrayLengthArgument(lengthSource.source, lengthSource.index),
518
563
  };
519
564
  };
@@ -544,27 +589,30 @@ const planInParam = (
544
589
 
545
590
  return {
546
591
  paramLiteral: paramDescriptorLiteral(descriptor, {}),
547
- inputExpr: parameterCallExpression(context, parameter, index),
592
+ inputExpr: parameterCallExpression(context, parameter, index, { fn }),
548
593
  };
549
594
  };
550
595
 
596
+ const nullableHandleExpression = (name: string): string => `${name} == null ? null : getHandle(${name})`;
597
+
551
598
  const handleArgument = (context: ModuleContext, name: string, isNullable: boolean): string => {
552
- if (isNullable) {
553
- context.addRuntimeImport("tryGetHandle");
599
+ context.addRuntimeImport("getHandle");
554
600
 
555
- return `tryGetHandle(${name})`;
556
- }
601
+ return isNullable ? nullableHandleExpression(name) : `getHandle(${name})`;
602
+ };
557
603
 
558
- context.addRuntimeImport("getHandle");
604
+ const closureArgument = (context: ModuleContext, name: string, isNullable: boolean): string => {
605
+ const helper = isNullable ? "tryToClosure" : "toClosure";
606
+ context.addRuntimeImport(helper);
559
607
 
560
- return `getHandle(${name})`;
608
+ return `${helper}(${name})`;
561
609
  };
562
610
 
563
611
  const hashtableArgument = (context: ModuleContext, valueRef: TypeId, name: string): string => {
564
612
  if (isHandlePassing(context, valueRef)) {
565
- context.addRuntimeImport("tryGetHandle");
613
+ context.addRuntimeImport("getHandle");
566
614
 
567
- return `${name} ? globalThis.Array.from(${name}).map(([k, v]) => [k, tryGetHandle(v)]) : null`;
615
+ return `${name} ? globalThis.Array.from(${name}).map(([k, v]) => [k, ${nullableHandleExpression("v")}]) : null`;
568
616
  }
569
617
 
570
618
  return `${name} ? globalThis.Array.from(${name}) : null`;
@@ -604,8 +652,9 @@ const parameterCallExpression = (
604
652
  context: ModuleContext,
605
653
  parameter: GirParameter,
606
654
  index: number,
607
- isForcedNullable = false,
655
+ options: CallExpressionOptions,
608
656
  ): string => {
657
+ const { fn, isForcedNullable = false } = options;
609
658
  const name = parameterIdentifier(parameter, index);
610
659
  const ref = parameter.type;
611
660
 
@@ -615,6 +664,10 @@ const parameterCallExpression = (
615
664
 
616
665
  const isNullable = parameter.nullable || parameter.optional || isForcedNullable;
617
666
 
667
+ if (requiresClosureMarshal(context, fn, ref)) {
668
+ return closureArgument(context, name, isNullable);
669
+ }
670
+
618
671
  if (isHandlePassing(context, ref)) {
619
672
  return handleArgument(context, name, isNullable);
620
673
  }
@@ -625,9 +678,12 @@ const parameterCallExpression = (
625
678
  };
626
679
 
627
680
  export {
681
+ constructibleName,
682
+ isCallbackParameter,
628
683
  methodExportName,
629
684
  renderMethodSignature,
630
685
  renderMethodReturnType,
686
+ returnedOutParameters,
631
687
  renderPromisifiedBody,
632
688
  finishCallExpression,
633
689
  renderPromisifiedSignature,
@@ -68,4 +68,18 @@ const isHandlePassing = (context: ModuleContext, ref: TypeId): boolean => {
68
68
  }
69
69
  };
70
70
 
71
- export { isHandlePassedInPlace, isCollectibleCallerOut, isRecordCallerOut, isRecordInout, isHandlePassing };
71
+ const isClosureType = (context: ModuleContext, ref: TypeId): boolean => {
72
+ const name = context.library.nameFor(ref);
73
+
74
+ return name?.namespaceName === "GObject" && name.typeName === "Closure";
75
+ };
76
+
77
+ export {
78
+ isClosureType,
79
+ isHandlePassedInPlace,
80
+ isCollectibleCallerOut,
81
+ isRecordCallerOut,
82
+ isRecordInout,
83
+ isHandlePassing,
84
+ underlyingType,
85
+ };