@gtkx/codegen 1.0.0-rc.3 → 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 (486) hide show
  1. package/README.md +8 -9
  2. package/dist/analysis/descriptor-render.d.ts +9 -4
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +51 -61
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +7 -7
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +7 -7
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +1 -2
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +25 -22
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/nul-terminated-bytes.d.ts +5 -0
  15. package/dist/analysis/nul-terminated-bytes.d.ts.map +1 -0
  16. package/dist/analysis/nul-terminated-bytes.js +18 -0
  17. package/dist/analysis/nul-terminated-bytes.js.map +1 -0
  18. package/dist/analysis/param-capability.d.ts +5 -0
  19. package/dist/analysis/param-capability.d.ts.map +1 -0
  20. package/dist/analysis/param-capability.js +130 -0
  21. package/dist/analysis/param-capability.js.map +1 -0
  22. package/dist/analysis/param-structure.d.ts +13 -6
  23. package/dist/analysis/param-structure.d.ts.map +1 -1
  24. package/dist/analysis/param-structure.js +44 -20
  25. package/dist/analysis/param-structure.js.map +1 -1
  26. package/dist/analysis/ts-type.d.ts +1 -1
  27. package/dist/analysis/ts-type.d.ts.map +1 -1
  28. package/dist/analysis/ts-type.js +3 -5
  29. package/dist/analysis/ts-type.js.map +1 -1
  30. package/dist/analysis/type-shape.d.ts +8 -0
  31. package/dist/analysis/type-shape.d.ts.map +1 -0
  32. package/dist/analysis/type-shape.js +12 -0
  33. package/dist/analysis/type-shape.js.map +1 -0
  34. package/dist/compile.d.ts +1 -1
  35. package/dist/compile.d.ts.map +1 -1
  36. package/dist/compile.js +2 -1
  37. package/dist/compile.js.map +1 -1
  38. package/dist/docs/api-reference.d.ts +79 -3
  39. package/dist/docs/api-reference.d.ts.map +1 -1
  40. package/dist/docs/api-reference.js +68 -13
  41. package/dist/docs/api-reference.js.map +1 -1
  42. package/dist/docs/element-page.d.ts +4 -4
  43. package/dist/docs/element-page.d.ts.map +1 -1
  44. package/dist/docs/element-page.js +32 -20
  45. package/dist/docs/element-page.js.map +1 -1
  46. package/dist/docs/handwritten-props.d.ts +9 -0
  47. package/dist/docs/handwritten-props.d.ts.map +1 -0
  48. package/dist/docs/handwritten-props.js +149 -0
  49. package/dist/docs/handwritten-props.js.map +1 -0
  50. package/dist/docs/pipeline.d.ts +4 -4
  51. package/dist/docs/pipeline.d.ts.map +1 -1
  52. package/dist/docs/pipeline.js +6 -6
  53. package/dist/docs/pipeline.js.map +1 -1
  54. package/dist/docs/render.d.ts +25 -5
  55. package/dist/docs/render.d.ts.map +1 -1
  56. package/dist/docs/render.js +90 -28
  57. package/dist/docs/render.js.map +1 -1
  58. package/dist/docs/symbol-page.d.ts +22 -0
  59. package/dist/docs/symbol-page.d.ts.map +1 -1
  60. package/dist/docs/symbol-page.js +129 -44
  61. package/dist/docs/symbol-page.js.map +1 -1
  62. package/dist/fingerprint.d.ts +3 -6
  63. package/dist/fingerprint.d.ts.map +1 -1
  64. package/dist/fingerprint.js +6 -8
  65. package/dist/fingerprint.js.map +1 -1
  66. package/dist/gi.d.ts +3 -11
  67. package/dist/gi.d.ts.map +1 -1
  68. package/dist/gi.js +0 -7
  69. package/dist/gi.js.map +1 -1
  70. package/dist/gir/ancestry.d.ts +2 -2
  71. package/dist/gir/ancestry.d.ts.map +1 -1
  72. package/dist/gir/ancestry.js +11 -1
  73. package/dist/gir/ancestry.js.map +1 -1
  74. package/dist/gir/annotations.d.ts +22 -0
  75. package/dist/gir/annotations.d.ts.map +1 -0
  76. package/dist/gir/annotations.js +15 -0
  77. package/dist/gir/annotations.js.map +1 -0
  78. package/dist/gir/callback.d.ts +1 -0
  79. package/dist/gir/callback.d.ts.map +1 -1
  80. package/dist/gir/callback.js +1 -0
  81. package/dist/gir/callback.js.map +1 -1
  82. package/dist/gir/class.d.ts +32 -1
  83. package/dist/gir/class.d.ts.map +1 -1
  84. package/dist/gir/class.js +8 -3
  85. package/dist/gir/class.js.map +1 -1
  86. package/dist/gir/enum.d.ts +21 -1
  87. package/dist/gir/enum.d.ts.map +1 -1
  88. package/dist/gir/enum.js +9 -9
  89. package/dist/gir/enum.js.map +1 -1
  90. package/dist/gir/field.d.ts +19 -4
  91. package/dist/gir/field.d.ts.map +1 -1
  92. package/dist/gir/field.js +7 -11
  93. package/dist/gir/field.js.map +1 -1
  94. package/dist/gir/function.d.ts +15 -0
  95. package/dist/gir/function.d.ts.map +1 -1
  96. package/dist/gir/function.js.map +1 -1
  97. package/dist/gir/gir-path.d.ts +7 -0
  98. package/dist/gir/gir-path.d.ts.map +1 -1
  99. package/dist/gir/gir-path.js +7 -0
  100. package/dist/gir/gir-path.js.map +1 -1
  101. package/dist/gir/libraries.d.ts +13 -2
  102. package/dist/gir/libraries.d.ts.map +1 -1
  103. package/dist/gir/libraries.js +11 -0
  104. package/dist/gir/libraries.js.map +1 -1
  105. package/dist/gir/library.d.ts +36 -0
  106. package/dist/gir/library.d.ts.map +1 -1
  107. package/dist/gir/library.js +34 -0
  108. package/dist/gir/library.js.map +1 -1
  109. package/dist/gir/namespace.d.ts +38 -0
  110. package/dist/gir/namespace.d.ts.map +1 -1
  111. package/dist/gir/namespace.js +4 -5
  112. package/dist/gir/namespace.js.map +1 -1
  113. package/dist/gir/parameter.d.ts +39 -0
  114. package/dist/gir/parameter.d.ts.map +1 -1
  115. package/dist/gir/parameter.js +7 -7
  116. package/dist/gir/parameter.js.map +1 -1
  117. package/dist/gir/parse.d.ts +3 -1
  118. package/dist/gir/parse.d.ts.map +1 -1
  119. package/dist/gir/parse.js +6 -3
  120. package/dist/gir/parse.js.map +1 -1
  121. package/dist/gir/primitives.d.ts +1 -0
  122. package/dist/gir/primitives.d.ts.map +1 -1
  123. package/dist/gir/primitives.js.map +1 -1
  124. package/dist/gir/property.d.ts +16 -0
  125. package/dist/gir/property.d.ts.map +1 -1
  126. package/dist/gir/property.js +3 -3
  127. package/dist/gir/property.js.map +1 -1
  128. package/dist/gir/record.d.ts +22 -0
  129. package/dist/gir/record.d.ts.map +1 -1
  130. package/dist/gir/record.js +3 -2
  131. package/dist/gir/record.js.map +1 -1
  132. package/dist/gir/size.d.ts +5 -4
  133. package/dist/gir/size.d.ts.map +1 -1
  134. package/dist/gir/size.js +0 -3
  135. package/dist/gir/size.js.map +1 -1
  136. package/dist/gir/type-id.d.ts +36 -1
  137. package/dist/gir/type-id.d.ts.map +1 -1
  138. package/dist/gir/type-id.js +2 -3
  139. package/dist/gir/type-id.js.map +1 -1
  140. package/dist/gir/type-ref.d.ts.map +1 -1
  141. package/dist/gir/type-ref.js +2 -1
  142. package/dist/gir/type-ref.js.map +1 -1
  143. package/dist/gir/type.d.ts +20 -0
  144. package/dist/gir/type.d.ts.map +1 -1
  145. package/dist/gir/type.js.map +1 -1
  146. package/dist/index.d.ts +18 -6
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +12 -3
  149. package/dist/index.js.map +1 -1
  150. package/dist/internal.d.ts +3 -0
  151. package/dist/internal.d.ts.map +1 -0
  152. package/dist/internal.js +3 -0
  153. package/dist/internal.js.map +1 -0
  154. package/dist/jsx.d.ts +7 -12
  155. package/dist/jsx.d.ts.map +1 -1
  156. package/dist/jsx.js +18 -19
  157. package/dist/jsx.js.map +1 -1
  158. package/dist/khronos/args.d.ts +7 -6
  159. package/dist/khronos/args.d.ts.map +1 -1
  160. package/dist/khronos/args.js +29 -7
  161. package/dist/khronos/args.js.map +1 -1
  162. package/dist/khronos/doc-context.d.ts +29 -0
  163. package/dist/khronos/doc-context.d.ts.map +1 -0
  164. package/dist/khronos/doc-context.js +29 -0
  165. package/dist/khronos/doc-context.js.map +1 -0
  166. package/dist/khronos/extensions.d.ts +13 -0
  167. package/dist/khronos/extensions.d.ts.map +1 -0
  168. package/dist/khronos/extensions.js +49 -0
  169. package/dist/khronos/extensions.js.map +1 -0
  170. package/dist/khronos/jsdoc.d.ts +17 -11
  171. package/dist/khronos/jsdoc.d.ts.map +1 -1
  172. package/dist/khronos/jsdoc.js +104 -46
  173. package/dist/khronos/jsdoc.js.map +1 -1
  174. package/dist/khronos/model.d.ts +42 -3
  175. package/dist/khronos/model.d.ts.map +1 -1
  176. package/dist/khronos/model.js +218 -63
  177. package/dist/khronos/model.js.map +1 -1
  178. package/dist/khronos/modules.d.ts +9 -6
  179. package/dist/khronos/modules.d.ts.map +1 -1
  180. package/dist/khronos/modules.js +96 -26
  181. package/dist/khronos/modules.js.map +1 -1
  182. package/dist/khronos/notes.d.ts +19 -0
  183. package/dist/khronos/notes.d.ts.map +1 -0
  184. package/dist/khronos/notes.js +35 -0
  185. package/dist/khronos/notes.js.map +1 -0
  186. package/dist/khronos/param-pair.d.ts +1 -1
  187. package/dist/khronos/param-pair.d.ts.map +1 -1
  188. package/dist/khronos/param-pair.js.map +1 -1
  189. package/dist/khronos/pipeline.d.ts +3 -1
  190. package/dist/khronos/pipeline.d.ts.map +1 -1
  191. package/dist/khronos/pipeline.js +59 -28
  192. package/dist/khronos/pipeline.js.map +1 -1
  193. package/dist/khronos/plan.d.ts +5 -5
  194. package/dist/khronos/plan.d.ts.map +1 -1
  195. package/dist/khronos/plan.js +8 -8
  196. package/dist/khronos/plan.js.map +1 -1
  197. package/dist/khronos/render.d.ts +8 -6
  198. package/dist/khronos/render.d.ts.map +1 -1
  199. package/dist/khronos/render.js +35 -26
  200. package/dist/khronos/render.js.map +1 -1
  201. package/dist/khronos/select.d.ts +21 -4
  202. package/dist/khronos/select.d.ts.map +1 -1
  203. package/dist/khronos/select.js +47 -34
  204. package/dist/khronos/select.js.map +1 -1
  205. package/dist/react/element-config.d.ts +16 -10
  206. package/dist/react/element-config.d.ts.map +1 -1
  207. package/dist/react/element-config.js +22 -15
  208. package/dist/react/element-config.js.map +1 -1
  209. package/dist/runner.d.ts +33 -21
  210. package/dist/runner.d.ts.map +1 -1
  211. package/dist/runner.js +19 -20
  212. package/dist/runner.js.map +1 -1
  213. package/dist/store/compile-store.d.ts +2 -3
  214. package/dist/store/compile-store.d.ts.map +1 -1
  215. package/dist/store/compile-store.js +2 -2
  216. package/dist/store/compile-store.js.map +1 -1
  217. package/dist/store/gi/callable-doc.d.ts +11 -0
  218. package/dist/store/gi/callable-doc.d.ts.map +1 -0
  219. package/dist/store/gi/callable-doc.js +62 -0
  220. package/dist/store/gi/callable-doc.js.map +1 -0
  221. package/dist/store/gi/callables.d.ts +3 -1
  222. package/dist/store/gi/callables.d.ts.map +1 -1
  223. package/dist/store/gi/callables.js +16 -16
  224. package/dist/store/gi/callables.js.map +1 -1
  225. package/dist/store/gi/callback.d.ts.map +1 -1
  226. package/dist/store/gi/callback.js +2 -2
  227. package/dist/store/gi/callback.js.map +1 -1
  228. package/dist/store/gi/class.d.ts.map +1 -1
  229. package/dist/store/gi/class.js +5 -3
  230. package/dist/store/gi/class.js.map +1 -1
  231. package/dist/store/gi/closure-invocation.d.ts +4 -0
  232. package/dist/store/gi/closure-invocation.d.ts.map +1 -0
  233. package/dist/store/gi/closure-invocation.js +22 -0
  234. package/dist/store/gi/closure-invocation.js.map +1 -0
  235. package/dist/store/gi/constant.d.ts.map +1 -1
  236. package/dist/store/gi/constant.js +3 -4
  237. package/dist/store/gi/constant.js.map +1 -1
  238. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  239. package/dist/store/gi/constructor-props.js +18 -20
  240. package/dist/store/gi/constructor-props.js.map +1 -1
  241. package/dist/store/gi/doc-spec.d.ts +14 -0
  242. package/dist/store/gi/doc-spec.d.ts.map +1 -0
  243. package/dist/store/gi/doc-spec.js +23 -0
  244. package/dist/store/gi/doc-spec.js.map +1 -0
  245. package/dist/store/gi/enum.d.ts.map +1 -1
  246. package/dist/store/gi/enum.js +29 -16
  247. package/dist/store/gi/enum.js.map +1 -1
  248. package/dist/store/gi/function.d.ts.map +1 -1
  249. package/dist/store/gi/function.js +28 -17
  250. package/dist/store/gi/function.js.map +1 -1
  251. package/dist/store/gi/interface.d.ts.map +1 -1
  252. package/dist/store/gi/interface.js +130 -16
  253. package/dist/store/gi/interface.js.map +1 -1
  254. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  255. package/dist/store/gi/item-comparators.js +3 -5
  256. package/dist/store/gi/item-comparators.js.map +1 -1
  257. package/dist/store/gi/method.d.ts +9 -1
  258. package/dist/store/gi/method.d.ts.map +1 -1
  259. package/dist/store/gi/method.js +92 -47
  260. package/dist/store/gi/method.js.map +1 -1
  261. package/dist/store/gi/param-marshal.d.ts +4 -1
  262. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  263. package/dist/store/gi/param-marshal.js +5 -1
  264. package/dist/store/gi/param-marshal.js.map +1 -1
  265. package/dist/store/gi/pipeline.d.ts.map +1 -1
  266. package/dist/store/gi/pipeline.js +3 -2
  267. package/dist/store/gi/pipeline.js.map +1 -1
  268. package/dist/store/gi/properties.d.ts.map +1 -1
  269. package/dist/store/gi/properties.js +2 -2
  270. package/dist/store/gi/properties.js.map +1 -1
  271. package/dist/store/gi/property-accessor.d.ts +4 -2
  272. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  273. package/dist/store/gi/property-accessor.js +10 -11
  274. package/dist/store/gi/property-accessor.js.map +1 -1
  275. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  276. package/dist/store/gi/record-constructor.js +3 -1
  277. package/dist/store/gi/record-constructor.js.map +1 -1
  278. package/dist/store/gi/record-field-accessor.d.ts +4 -2
  279. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  280. package/dist/store/gi/record-field-accessor.js +6 -11
  281. package/dist/store/gi/record-field-accessor.js.map +1 -1
  282. package/dist/store/gi/record-layout.d.ts.map +1 -1
  283. package/dist/store/gi/record-layout.js +1 -5
  284. package/dist/store/gi/record-layout.js.map +1 -1
  285. package/dist/store/gi/record.d.ts.map +1 -1
  286. package/dist/store/gi/record.js +3 -2
  287. package/dist/store/gi/record.js.map +1 -1
  288. package/dist/store/gi/registration.d.ts +1 -1
  289. package/dist/store/gi/registration.js +2 -2
  290. package/dist/store/gi/registration.js.map +1 -1
  291. package/dist/store/gi/return-wrap.d.ts +1 -1
  292. package/dist/store/gi/return-wrap.d.ts.map +1 -1
  293. package/dist/store/gi/return-wrap.js +4 -4
  294. package/dist/store/gi/return-wrap.js.map +1 -1
  295. package/dist/store/gi/runtime-override.d.ts +2 -1
  296. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  297. package/dist/store/gi/runtime-override.js +8 -5
  298. package/dist/store/gi/runtime-override.js.map +1 -1
  299. package/dist/store/gi/signal.d.ts.map +1 -1
  300. package/dist/store/gi/signal.js +27 -31
  301. package/dist/store/gi/signal.js.map +1 -1
  302. package/dist/store/gi/value-marshalable.d.ts +1 -10
  303. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  304. package/dist/store/gi/value-marshalable.js +1 -10
  305. package/dist/store/gi/value-marshalable.js.map +1 -1
  306. package/dist/store/gi/vtable.d.ts +16 -1
  307. package/dist/store/gi/vtable.d.ts.map +1 -1
  308. package/dist/store/gi/vtable.js +214 -51
  309. package/dist/store/gi/vtable.js.map +1 -1
  310. package/dist/store/gi-store.d.ts +2 -3
  311. package/dist/store/gi-store.d.ts.map +1 -1
  312. package/dist/store/gi-store.js.map +1 -1
  313. package/dist/store/jsx/element-components.d.ts +1 -3
  314. package/dist/store/jsx/element-components.d.ts.map +1 -1
  315. package/dist/store/jsx/element-components.js +6 -8
  316. package/dist/store/jsx/element-components.js.map +1 -1
  317. package/dist/store/jsx/element-prop-imports.d.ts +1 -4
  318. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -1
  319. package/dist/store/jsx/element-prop-imports.js +0 -2
  320. package/dist/store/jsx/element-prop-imports.js.map +1 -1
  321. package/dist/store/jsx/element-prop-types.d.ts +3 -1
  322. package/dist/store/jsx/element-prop-types.d.ts.map +1 -1
  323. package/dist/store/jsx/element-prop-types.js +7 -2
  324. package/dist/store/jsx/element-prop-types.js.map +1 -1
  325. package/dist/store/jsx/generated-elements.d.ts +29 -0
  326. package/dist/store/jsx/generated-elements.d.ts.map +1 -0
  327. package/dist/store/jsx/generated-elements.js +30 -0
  328. package/dist/store/jsx/generated-elements.js.map +1 -0
  329. package/dist/store/jsx/intrinsic-elements.d.ts +4 -0
  330. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -1
  331. package/dist/store/jsx/intrinsic-elements.js.map +1 -1
  332. package/dist/store/jsx/jsx.d.ts.map +1 -1
  333. package/dist/store/jsx/jsx.js +13 -12
  334. package/dist/store/jsx/jsx.js.map +1 -1
  335. package/dist/store/jsx/metadata.js +9 -9
  336. package/dist/store/jsx/metadata.js.map +1 -1
  337. package/dist/store/jsx/omitted-props.d.ts +2 -4
  338. package/dist/store/jsx/omitted-props.d.ts.map +1 -1
  339. package/dist/store/jsx/omitted-props.js +2 -4
  340. package/dist/store/jsx/omitted-props.js.map +1 -1
  341. package/dist/store/jsx/pipeline.d.ts +4 -2
  342. package/dist/store/jsx/pipeline.d.ts.map +1 -1
  343. package/dist/store/jsx/pipeline.js +3 -2
  344. package/dist/store/jsx/pipeline.js.map +1 -1
  345. package/dist/store/jsx/props.d.ts +1 -7
  346. package/dist/store/jsx/props.d.ts.map +1 -1
  347. package/dist/store/jsx/props.js +16 -8
  348. package/dist/store/jsx/props.js.map +1 -1
  349. package/dist/store/jsx-store.d.ts +2 -3
  350. package/dist/store/jsx-store.d.ts.map +1 -1
  351. package/dist/store/jsx-store.js +3 -3
  352. package/dist/store/jsx-store.js.map +1 -1
  353. package/dist/store/resolve-store.d.ts +28 -0
  354. package/dist/store/resolve-store.d.ts.map +1 -0
  355. package/dist/store/resolve-store.js +65 -0
  356. package/dist/store/resolve-store.js.map +1 -0
  357. package/dist/store/store-fs.d.ts +5 -1
  358. package/dist/store/store-fs.d.ts.map +1 -1
  359. package/dist/store/store-fs.js +6 -4
  360. package/dist/store/store-fs.js.map +1 -1
  361. package/dist/writer/context.d.ts +2 -1
  362. package/dist/writer/context.d.ts.map +1 -1
  363. package/dist/writer/context.js +3 -0
  364. package/dist/writer/context.js.map +1 -1
  365. package/dist/writer/doc-tags.d.ts +21 -0
  366. package/dist/writer/doc-tags.d.ts.map +1 -0
  367. package/dist/writer/doc-tags.js +38 -0
  368. package/dist/writer/doc-tags.js.map +1 -0
  369. package/dist/writer/doc.d.ts +3 -1
  370. package/dist/writer/doc.d.ts.map +1 -1
  371. package/dist/writer/doc.js +19 -6
  372. package/dist/writer/doc.js.map +1 -1
  373. package/dist/writer/gtk-doc.d.ts +1 -1
  374. package/dist/writer/gtk-doc.d.ts.map +1 -1
  375. package/dist/writer/gtk-doc.js +64 -15
  376. package/dist/writer/gtk-doc.js.map +1 -1
  377. package/dist/writer/module.d.ts +8 -2
  378. package/dist/writer/module.d.ts.map +1 -1
  379. package/dist/writer/module.js +13 -1
  380. package/dist/writer/module.js.map +1 -1
  381. package/overrides/gdk/rgba.ts.ejs +26 -0
  382. package/overrides/gobject/object.ts.ejs +56 -11
  383. package/overrides/gobject/value.ts.ejs +7 -0
  384. package/overrides/graphene/structs.ts.ejs +55 -0
  385. package/package.json +7 -11
  386. package/src/analysis/descriptor-render.ts +67 -73
  387. package/src/analysis/descriptor.ts +13 -16
  388. package/src/analysis/inheritance.ts +35 -34
  389. package/src/analysis/nul-terminated-bytes.ts +31 -0
  390. package/src/analysis/param-capability.ts +172 -0
  391. package/src/analysis/param-structure.ts +90 -32
  392. package/src/analysis/ts-type.ts +4 -6
  393. package/src/analysis/type-shape.ts +24 -0
  394. package/src/compile.ts +3 -2
  395. package/src/docs/api-reference.ts +162 -28
  396. package/src/docs/element-page.ts +53 -47
  397. package/src/docs/handwritten-props.ts +230 -0
  398. package/src/docs/pipeline.ts +10 -10
  399. package/src/docs/render.ts +153 -39
  400. package/src/docs/symbol-page.ts +230 -80
  401. package/src/fingerprint.ts +8 -14
  402. package/src/gi.ts +4 -11
  403. package/src/gir/ancestry.ts +15 -1
  404. package/src/gir/annotations.ts +37 -0
  405. package/src/gir/callback.ts +2 -0
  406. package/src/gir/class.ts +42 -4
  407. package/src/gir/enum.ts +30 -10
  408. package/src/gir/field.ts +24 -13
  409. package/src/gir/function.ts +15 -0
  410. package/src/gir/gir-path.ts +7 -0
  411. package/src/gir/libraries.ts +23 -2
  412. package/src/gir/library.ts +51 -2
  413. package/src/gir/namespace.ts +41 -5
  414. package/src/gir/parameter.ts +47 -7
  415. package/src/gir/parse.ts +8 -2
  416. package/src/gir/primitives.ts +1 -0
  417. package/src/gir/property.ts +18 -3
  418. package/src/gir/record.ts +24 -2
  419. package/src/gir/size.ts +8 -6
  420. package/src/gir/type-id.ts +51 -7
  421. package/src/gir/type-ref.ts +2 -1
  422. package/src/gir/type.ts +50 -6
  423. package/src/index.ts +18 -16
  424. package/src/internal.ts +2 -0
  425. package/src/jsx.ts +26 -26
  426. package/src/khronos/args.ts +37 -14
  427. package/src/khronos/doc-context.ts +62 -0
  428. package/src/khronos/extensions.ts +85 -0
  429. package/src/khronos/jsdoc.ts +152 -56
  430. package/src/khronos/model.ts +314 -69
  431. package/src/khronos/modules.ts +134 -40
  432. package/src/khronos/notes.ts +74 -0
  433. package/src/khronos/param-pair.ts +1 -1
  434. package/src/khronos/pipeline.ts +95 -42
  435. package/src/khronos/plan.ts +12 -13
  436. package/src/khronos/render.ts +62 -50
  437. package/src/khronos/select.ts +91 -50
  438. package/src/react/element-config.ts +21 -18
  439. package/src/runner.ts +51 -40
  440. package/src/store/compile-store.ts +4 -5
  441. package/src/store/gi/callable-doc.ts +102 -0
  442. package/src/store/gi/callables.ts +23 -17
  443. package/src/store/gi/callback.ts +3 -2
  444. package/src/store/gi/class.ts +6 -3
  445. package/src/store/gi/closure-invocation.ts +26 -0
  446. package/src/store/gi/constant.ts +3 -6
  447. package/src/store/gi/constructor-props.ts +19 -23
  448. package/src/store/gi/doc-spec.ts +38 -0
  449. package/src/store/gi/enum.ts +55 -20
  450. package/src/store/gi/function.ts +44 -26
  451. package/src/store/gi/interface.ts +214 -26
  452. package/src/store/gi/item-comparators.ts +3 -5
  453. package/src/store/gi/method.ts +126 -68
  454. package/src/store/gi/param-marshal.ts +15 -1
  455. package/src/store/gi/pipeline.ts +7 -2
  456. package/src/store/gi/properties.ts +3 -2
  457. package/src/store/gi/property-accessor.ts +14 -11
  458. package/src/store/gi/record-constructor.ts +6 -1
  459. package/src/store/gi/record-field-accessor.ts +9 -13
  460. package/src/store/gi/record-layout.ts +1 -5
  461. package/src/store/gi/record.ts +8 -2
  462. package/src/store/gi/registration.ts +3 -3
  463. package/src/store/gi/return-wrap.ts +5 -5
  464. package/src/store/gi/runtime-override.ts +13 -6
  465. package/src/store/gi/signal.ts +36 -37
  466. package/src/store/gi/value-marshalable.ts +1 -10
  467. package/src/store/gi/vtable.ts +361 -60
  468. package/src/store/gi-store.ts +2 -4
  469. package/src/store/jsx/element-components.ts +8 -11
  470. package/src/store/jsx/element-prop-imports.ts +6 -5
  471. package/src/store/jsx/element-prop-types.ts +10 -2
  472. package/src/store/jsx/generated-elements.ts +60 -0
  473. package/src/store/jsx/intrinsic-elements.ts +4 -0
  474. package/src/store/jsx/jsx.ts +15 -13
  475. package/src/store/jsx/metadata.ts +10 -10
  476. package/src/store/jsx/omitted-props.ts +2 -4
  477. package/src/store/jsx/pipeline.ts +6 -4
  478. package/src/store/jsx/props.ts +22 -9
  479. package/src/store/jsx-store.ts +5 -7
  480. package/src/store/resolve-store.ts +100 -0
  481. package/src/store/store-fs.ts +12 -5
  482. package/src/writer/context.ts +5 -1
  483. package/src/writer/doc-tags.ts +70 -0
  484. package/src/writer/doc.ts +29 -6
  485. package/src/writer/gtk-doc.ts +82 -15
  486. package/src/writer/module.ts +25 -2
@@ -64,23 +64,23 @@ type BoxedOptions = {
64
64
  ownership: Ownership;
65
65
  sharedLibrary: string | undefined;
66
66
  getTypeFnName: string;
67
- callerAllocated: boolean;
68
- inline?: boolean;
67
+ isCallerAllocated: boolean;
68
+ isInline?: boolean;
69
69
  size: number | undefined;
70
70
  };
71
71
 
72
72
  type StructOptions = {
73
73
  size: number | string | undefined;
74
74
  wrapperClass: string | undefined;
75
- callerAllocated: boolean;
76
- inline?: boolean;
75
+ isCallerAllocated: boolean;
76
+ isInline?: boolean;
77
77
  };
78
78
 
79
79
  type FundamentalOptions = {
80
80
  ownership: Ownership;
81
81
  typeName: string | undefined;
82
82
  wrapperClass: string | undefined;
83
- inline?: boolean | undefined;
83
+ isInline?: boolean | undefined;
84
84
  };
85
85
 
86
86
  type ListDescriptorName = "list" | "slist" | "ptrArray" | "gArray";
@@ -165,8 +165,8 @@ const tBoxed = (glibName: string, options: BoxedOptions): string =>
165
165
  ? undefined
166
166
  : `sharedLibrary: ${sourceStringLiteral(options.sharedLibrary)}`,
167
167
  `getTypeFnName: ${sourceStringLiteral(options.getTypeFnName)}`,
168
- options.callerAllocated ? "callerAllocated: true" : undefined,
169
- options.inline === true ? "inline: true" : undefined,
168
+ options.isCallerAllocated ? "isCallerAllocated: true" : undefined,
169
+ options.isInline === true ? "isInline: true" : undefined,
170
170
  options.size === undefined ? undefined : `size: ${String(options.size)}`,
171
171
  ]),
172
172
  ]);
@@ -177,13 +177,13 @@ const tStruct = (ownership: Ownership, options: StructOptions): string =>
177
177
  optionsObject([
178
178
  options.size === undefined ? undefined : `size: ${String(options.size)}`,
179
179
  options.wrapperClass === undefined ? undefined : `wrapperClass: ${options.wrapperClass}`,
180
- options.callerAllocated ? "callerAllocated: true" : undefined,
181
- options.inline === true ? "inline: true" : undefined,
180
+ options.isCallerAllocated ? "isCallerAllocated: true" : undefined,
181
+ options.isInline === true ? "isInline: true" : undefined,
182
182
  ]),
183
183
  ]);
184
184
 
185
185
  const tInlineStruct = (): string =>
186
- tStruct("borrowed", { size: undefined, wrapperClass: undefined, callerAllocated: false });
186
+ tStruct("borrowed", { size: undefined, wrapperClass: undefined, isCallerAllocated: false });
187
187
 
188
188
  const tFundamental = (lib: string, refFunc: string, unrefFunc: string, options: FundamentalOptions): string =>
189
189
  call("fundamental", [
@@ -194,7 +194,7 @@ const tFundamental = (lib: string, refFunc: string, unrefFunc: string, options:
194
194
  `ownership: ${sourceStringLiteral(options.ownership)}`,
195
195
  options.typeName === undefined ? undefined : `typeName: ${sourceStringLiteral(options.typeName)}`,
196
196
  options.wrapperClass === undefined ? undefined : `wrapperClass: ${options.wrapperClass}`,
197
- options.inline === true ? "inline: true" : undefined,
197
+ options.isInline === true ? "isInline: true" : undefined,
198
198
  ]),
199
199
  ]);
200
200
 
@@ -252,9 +252,9 @@ const tBind = (args: BindArgs): string =>
252
252
  const tFn = (
253
253
  lib: string,
254
254
  cIdentifier: string,
255
- spec: { args: string; returns: string; throws: boolean },
255
+ spec: { args: string; returns: string; canThrow: boolean },
256
256
  ): string => {
257
- const throwsEntry = spec.throws ? ", throws: true" : "";
257
+ const throwsEntry = spec.canThrow ? ", canThrow: true" : "";
258
258
 
259
259
  return call("fn", [
260
260
  sourceStringLiteral(lib),
@@ -293,8 +293,5 @@ export {
293
293
  tFn,
294
294
  type Ownership,
295
295
  type ScalarDescriptorName,
296
- type BoxedOptions,
297
- type StructOptions,
298
- type FundamentalOptions,
299
296
  type ListDescriptorName,
300
297
  };
@@ -5,9 +5,10 @@ import type { Library } from "../gir/library.js";
5
5
  import type { GirProperty } from "../gir/property.js";
6
6
  import type { TypeId } from "../gir/type-id.js";
7
7
  import type { ModuleContext } from "../writer/context.js";
8
- import { ancestorChain, type ResolvedAncestor, resolveInterface } from "../gir/ancestry.js";
8
+ import { ancestorChain, type ResolvedAncestor, resolveInterfaces } from "../gir/ancestry.js";
9
9
  import { methodExportName } from "../store/gi/method.js";
10
10
  import { resolveAccessorType } from "../store/gi/property-accessor.js";
11
+ import { vfuncMemberNames } from "../store/gi/vtable.js";
11
12
  import { inputParameters } from "./param-structure.js";
12
13
  import { renderTsType } from "./ts-type.js";
13
14
 
@@ -45,29 +46,11 @@ const RESERVED_SIGNAL_MEMBERS = new Set([
45
46
  "removeEventListener",
46
47
  ]);
47
48
 
48
- const resolveImplementedInterface = (
49
- context: AncestryContext,
50
- name: string,
51
- defaultNamespace: string = context.namespace.name,
52
- ): ResolvedAncestor | undefined => resolveInterface(context.library, defaultNamespace, name);
53
-
54
49
  const resolveDirectInterfaces = (
55
50
  context: AncestryContext,
56
51
  klass: GirClass,
57
52
  defaultNamespace: string,
58
- ): ResolvedAncestor[] => {
59
- const interfaces: ResolvedAncestor[] = [];
60
-
61
- for (const implementName of klass.implements) {
62
- const iface = resolveImplementedInterface(context, implementName, defaultNamespace);
63
-
64
- if (iface !== undefined) {
65
- interfaces.push(iface);
66
- }
67
- }
68
-
69
- return interfaces;
70
- };
53
+ ): ResolvedAncestor[] => resolveInterfaces(context.library, defaultNamespace, klass.implements);
71
54
 
72
55
  const resolvePrerequisiteReference = (context: ModuleContext, name: string): string | undefined => {
73
56
  const resolved = context.library.resolveType(context.namespace.name, name);
@@ -221,25 +204,45 @@ const mergeOmissionName = (
221
204
  return ancestor.returnType !== returnType || ancestor.arity !== arity ? name : undefined;
222
205
  };
223
206
 
224
- const collectInterfaceMergeOmissions = (
207
+ const classChainVfuncNames = (context: ModuleContext, klass: GirClass): Set<string> => {
208
+ const names: Set<string> = new Set(vfuncMemberNames(context, context.namespace.name, klass));
209
+
210
+ forEachAncestor(context, klass, (ancestor) => {
211
+ for (const name of vfuncMemberNames(context, ancestor.namespaceName, ancestor.klass)) {
212
+ names.add(name);
213
+ }
214
+ });
215
+
216
+ return names;
217
+ };
218
+
219
+ const methodMergeOmissions = (context: ModuleContext, klass: GirClass, iface: GirClass): string[] => {
220
+ const ancestors = ancestorClassMethodSignatures(context, klass);
221
+
222
+ return iface.methods
223
+ .map((method) => mergeOmissionName(context, method, ancestors))
224
+ .filter((name): name is string => name !== undefined);
225
+ };
226
+
227
+ const vfuncMergeOmissions = (
225
228
  context: ModuleContext,
226
229
  klass: GirClass,
227
230
  iface: { klass: GirClass; namespaceName: string },
228
231
  ): string[] => {
229
- const ancestors = ancestorClassMethodSignatures(context, klass);
230
- const omissions: string[] = [];
232
+ const claimed = classChainVfuncNames(context, klass);
231
233
 
232
- for (const method of iface.klass.methods) {
233
- const name = mergeOmissionName(context, method, ancestors);
234
-
235
- if (name !== undefined) {
236
- omissions.push(name);
237
- }
238
- }
239
-
240
- return omissions;
234
+ return vfuncMemberNames(context, iface.namespaceName, iface.klass).filter((name) => claimed.has(name));
241
235
  };
242
236
 
237
+ const collectInterfaceMergeOmissions = (
238
+ context: ModuleContext,
239
+ klass: GirClass,
240
+ iface: { klass: GirClass; namespaceName: string },
241
+ ): string[] => [
242
+ ...methodMergeOmissions(context, klass, iface.klass),
243
+ ...vfuncMergeOmissions(context, klass, iface),
244
+ ];
245
+
243
246
  const collectInheritedPropertyTypes = (context: ModuleContext, klass: GirClass): Map<string, string> => {
244
247
  const types: Map<string, string> = new Map();
245
248
 
@@ -416,7 +419,6 @@ const enumIdentity = (context: ModuleContext, ref: TypeId | undefined): string |
416
419
  };
417
420
 
418
421
  export {
419
- resolveImplementedInterface,
420
422
  resolvePrerequisiteReference,
421
423
  forEachAncestor,
422
424
  collectInterfaceProperties,
@@ -425,6 +427,5 @@ export {
425
427
  collectInheritedMethods,
426
428
  conflictRename,
427
429
  reservedSignalMemberRename,
428
- type OwnedProperty,
429
430
  type InheritedMethods,
430
431
  };
@@ -0,0 +1,31 @@
1
+ import type { Library } from "../gir/library.js";
2
+ import type { GirCallable, GirParameter } from "../gir/parameter.js";
3
+ import type { TypeId } from "../gir/type-id.js";
4
+ import { isOutParameter } from "../gir/parameter.js";
5
+ import { carrayFor, isUnboundedArray, primitiveCategoryFor } from "./type-shape.js";
6
+
7
+ const BYTE_CATEGORIES: Set<string> = new Set(["int8", "uint8"]);
8
+ const CHAR_POINTER = /char\s*\*/;
9
+
10
+ const isByteElement = (library: Library, element: TypeId): boolean => {
11
+ const category = primitiveCategoryFor(library, element);
12
+
13
+ return category !== undefined && BYTE_CATEGORIES.has(category);
14
+ };
15
+
16
+ const isNulTerminatedBytes = (library: Library, ref: TypeId | undefined): boolean => {
17
+ const type = carrayFor(library, ref);
18
+
19
+ if (type?.arrayCType === undefined || !CHAR_POINTER.test(type.arrayCType)) {
20
+ return false;
21
+ }
22
+
23
+ return isUnboundedArray(type) && isByteElement(library, type.element);
24
+ };
25
+
26
+ const nulTerminatedByteParams = (library: Library, callable: GirCallable): GirParameter[] =>
27
+ callable.parameters.filter(
28
+ (parameter) => !isOutParameter(parameter) && isNulTerminatedBytes(library, parameter.type),
29
+ );
30
+
31
+ export { nulTerminatedByteParams };
@@ -0,0 +1,172 @@
1
+ import type { GirCallable, GirParameter } from "../gir/parameter.js";
2
+ import type { CArrayType, TypeId } from "../gir/type-id.js";
3
+ import type { GirType } from "../gir/type.js";
4
+ import type { ModuleContext } from "../writer/context.js";
5
+ import { isCallerAllocatedOut, isInoutParameter } from "../gir/parameter.js";
6
+ import { constructibleName } from "../store/gi/method.js";
7
+ import { isCollectibleCallerOut, isHandlePassedInPlace, underlyingType } from "../store/gi/param-marshal.js";
8
+ import { isScalarRef, recordInlineSize } from "./descriptor-render.js";
9
+
10
+ const POINTER_DEPTH = 1;
11
+
12
+ const isPointerType = (context: ModuleContext, type: GirType): boolean => {
13
+ switch (type.kind) {
14
+ case "primitive": {
15
+ return type.category === "string";
16
+ }
17
+ case "record": {
18
+ return recordInlineSize(context, type.value) === undefined;
19
+ }
20
+ case "class":
21
+ case "interface":
22
+ case "carray":
23
+ case "list":
24
+ case "hashtable": {
25
+ return true;
26
+ }
27
+ case "alias":
28
+ case "callback":
29
+ case "enum":
30
+ case "varargs": {
31
+ return false;
32
+ }
33
+ }
34
+ };
35
+
36
+ const isPointerElement = (context: ModuleContext, element: TypeId): boolean => {
37
+ if (isScalarRef(context.library, element)) {
38
+ return false;
39
+ }
40
+
41
+ const type = underlyingType(context, element);
42
+
43
+ return type !== undefined && isPointerType(context, type);
44
+ };
45
+
46
+ const carrayIndirection = (context: ModuleContext, type: CArrayType): number =>
47
+ POINTER_DEPTH + (isPointerElement(context, type.element) ? POINTER_DEPTH : 0);
48
+
49
+ const typeIndirection = (context: ModuleContext, type: GirType): number | undefined => {
50
+ switch (type.kind) {
51
+ case "primitive": {
52
+ return type.category === "string" ? POINTER_DEPTH : undefined;
53
+ }
54
+ case "callback":
55
+ case "class":
56
+ case "hashtable":
57
+ case "interface":
58
+ case "list":
59
+ case "record": {
60
+ return POINTER_DEPTH;
61
+ }
62
+ case "carray": {
63
+ return carrayIndirection(context, type);
64
+ }
65
+ case "alias":
66
+ case "enum":
67
+ case "varargs": {
68
+ return undefined;
69
+ }
70
+ }
71
+ };
72
+
73
+ const baseIndirection = (context: ModuleContext, ref: TypeId | undefined): number | undefined => {
74
+ if (isScalarRef(context.library, ref)) {
75
+ return 0;
76
+ }
77
+
78
+ const type = ref === undefined ? undefined : underlyingType(context, ref);
79
+
80
+ return type === undefined ? undefined : typeIndirection(context, type);
81
+ };
82
+
83
+ const declaredIndirection = (parameter: GirParameter): number | undefined => {
84
+ const cType = parameter.cType;
85
+
86
+ if (cType === undefined) {
87
+ return undefined;
88
+ }
89
+
90
+ return cType.split("*").length - 1;
91
+ };
92
+
93
+ const marshalledIndirection = (context: ModuleContext, parameter: GirParameter): number | undefined => {
94
+ const base = baseIndirection(context, parameter.type);
95
+
96
+ if (base === undefined) {
97
+ return undefined;
98
+ }
99
+
100
+ if (isCallerAllocatedOut(parameter) || isHandlePassedInPlace(context, parameter)) {
101
+ return base;
102
+ }
103
+
104
+ if (isInoutParameter(parameter) && !isScalarRef(context.library, parameter.type)) {
105
+ return base;
106
+ }
107
+
108
+ return base + POINTER_DEPTH;
109
+ };
110
+
111
+ const hasCallerSuppliedLength = (context: ModuleContext, parameter: GirParameter): boolean => {
112
+ const type = parameter.type === undefined ? undefined : underlyingType(context, parameter.type);
113
+
114
+ return type?.kind === "carray" && type.lengthParameterIndex !== undefined;
115
+ };
116
+
117
+ const isUnbuildableCallerOut = (context: ModuleContext, parameter: GirParameter): boolean =>
118
+ constructibleName(context, parameter.type) === undefined || !isCollectibleCallerOut(context, parameter);
119
+
120
+ const isUnmarshalableCallerOut = (context: ModuleContext, parameter: GirParameter): boolean => {
121
+ if (hasCallerSuppliedLength(context, parameter)) {
122
+ return true;
123
+ }
124
+
125
+ return isUnbuildableCallerOut(context, parameter) && !parameter.optional;
126
+ };
127
+
128
+ const hasIndirectionMismatch = (context: ModuleContext, parameter: GirParameter): boolean => {
129
+ const declared = declaredIndirection(parameter);
130
+ const marshalled = marshalledIndirection(context, parameter);
131
+
132
+ if (declared === undefined || marshalled === undefined) {
133
+ return false;
134
+ }
135
+
136
+ return declared !== marshalled;
137
+ };
138
+
139
+ const isTypeErasedCallback = (context: ModuleContext, parameter: GirParameter): boolean => {
140
+ if (parameter.closureIndex === undefined) {
141
+ return false;
142
+ }
143
+
144
+ const type = parameter.type === undefined ? undefined : underlyingType(context, parameter.type);
145
+
146
+ return type?.kind === "callback" && type.value.parameters.length === 0;
147
+ };
148
+
149
+ const isUnmarshalableCallParam = (context: ModuleContext, parameter: GirParameter): boolean => {
150
+ if (parameter.isVarargs) {
151
+ return false;
152
+ }
153
+
154
+ if (isTypeErasedCallback(context, parameter)) {
155
+ return true;
156
+ }
157
+
158
+ if (parameter.direction === "in") {
159
+ return false;
160
+ }
161
+
162
+ if (isCallerAllocatedOut(parameter)) {
163
+ return isUnmarshalableCallerOut(context, parameter);
164
+ }
165
+
166
+ return hasIndirectionMismatch(context, parameter);
167
+ };
168
+
169
+ const hasUnmarshalableParam = (context: ModuleContext, callable: GirCallable): boolean =>
170
+ callable.parameters.some((parameter) => isUnmarshalableCallParam(context, parameter));
171
+
172
+ export { hasUnmarshalableParam };
@@ -2,6 +2,7 @@ import { toCamelIdentifier } from "@gtkx/utils";
2
2
  import type { GirFunction } from "../gir/function.js";
3
3
  import type { Library } from "../gir/library.js";
4
4
  import type { TypeId } from "../gir/type-id.js";
5
+ import type { JsDocParam } from "../writer/doc-tags.js";
5
6
  import { type GirCallable, type GirParameter, isCallerAllocatedOut, isOutParameter } from "../gir/parameter.js";
6
7
  import { isCellInout, shouldOmitPrimaryReturn } from "./descriptor-render.js";
7
8
 
@@ -14,8 +15,9 @@ type HandlerResultOptions = {
14
15
  library: Library;
15
16
  signal: GirCallable;
16
17
  renderType: (ref: TypeId | undefined, isNullable: boolean) => string;
17
- includeCallerAllocated: boolean;
18
- optOut: boolean;
18
+ shouldIncludeCallerAllocated: boolean;
19
+ isOptOut: boolean;
20
+ shouldExcludeOut?: (parameter: GirParameter) => boolean;
19
21
  };
20
22
 
21
23
  const isInputParameter = (options: {
@@ -75,8 +77,6 @@ const closureAndDestroyIndices = (fn: GirFunction): Set<number> => {
75
77
  return indices;
76
78
  };
77
79
 
78
- // The emitted argument list is the instance parameter followed by every parameter `planParameter`
79
- // keeps, so a GIR index only lines up with an emitted index when nothing before it was dropped.
80
80
  const emittedArgIndices = (fn: GirFunction, instanceOffset: number): Map<number, number> => {
81
81
  const closureIndices = closureAndDestroyIndices(fn);
82
82
  const map: Map<number, number> = new Map();
@@ -110,7 +110,7 @@ const carrayLengthIndex = (library: Library, ref: TypeId | undefined): number |
110
110
  return type.lengthParameterIndex;
111
111
  };
112
112
 
113
- const arrayLengthSources = (library: Library, fn: GirFunction): Map<number, number> => {
113
+ const arrayLengthSources = (library: Library, fn: GirCallable): Map<number, number> => {
114
114
  const map: Map<number, number> = new Map();
115
115
 
116
116
  for (const [index, parameter] of fn.parameters.entries()) {
@@ -124,19 +124,7 @@ const arrayLengthSources = (library: Library, fn: GirFunction): Map<number, numb
124
124
  return map;
125
125
  };
126
126
 
127
- const hasCallerAllocatedArrayLength = (library: Library, fn: GirFunction): boolean => {
128
- for (const arrayIndex of arrayLengthSources(library, fn).values()) {
129
- const array = fn.parameters[arrayIndex];
130
-
131
- if (array !== undefined && isCallerAllocatedOut(array)) {
132
- return true;
133
- }
134
- }
135
-
136
- return false;
137
- };
138
-
139
- const returnArrayLengthIndices = (library: Library, fn: GirFunction): Set<number> => {
127
+ const returnArrayLengthIndices = (library: Library, fn: GirCallable): Set<number> => {
140
128
  const returnType = fn.returnValue.type === undefined ? undefined : library.typeFor(fn.returnValue.type);
141
129
 
142
130
  if (returnType?.kind !== "carray") {
@@ -152,7 +140,7 @@ const returnArrayLengthIndices = (library: Library, fn: GirFunction): Set<number
152
140
  return new Set([lengthIndex]);
153
141
  };
154
142
 
155
- const foldedLengthIndices = (library: Library, fn: GirFunction): Set<number> => {
143
+ const foldedLengthIndices = (library: Library, fn: GirCallable): Set<number> => {
156
144
  const indices: Set<number> = new Set(arrayLengthSources(library, fn).keys());
157
145
 
158
146
  for (const index of returnArrayLengthIndices(library, fn)) {
@@ -162,6 +150,20 @@ const foldedLengthIndices = (library: Library, fn: GirFunction): Set<number> =>
162
150
  return indices;
163
151
  };
164
152
 
153
+ const foldedLengthParameters = (library: Library, fn: GirCallable): Set<GirParameter> => {
154
+ const folded: Set<GirParameter> = new Set();
155
+
156
+ for (const index of foldedLengthIndices(library, fn)) {
157
+ const parameter = fn.parameters[index];
158
+
159
+ if (parameter !== undefined) {
160
+ folded.add(parameter);
161
+ }
162
+ }
163
+
164
+ return folded;
165
+ };
166
+
165
167
  const parameterIdentifier = (parameter: GirParameter, index: number): string => {
166
168
  if (parameter.name.length === 0) {
167
169
  return `arg${String(index)}`;
@@ -170,17 +172,62 @@ const parameterIdentifier = (parameter: GirParameter, index: number): string =>
170
172
  return toCamelIdentifier(parameter.name);
171
173
  };
172
174
 
175
+ const handlerParameters = (
176
+ parameters: GirParameter[],
177
+ shouldExclude: (parameter: GirParameter) => boolean = () => false,
178
+ ): GirParameter[] =>
179
+ parameters.filter(
180
+ (parameter) => !parameter.isVarargs && !isOutParameter(parameter) && !shouldExclude(parameter),
181
+ );
182
+
183
+ const documentedParameters = (
184
+ library: Library,
185
+ fn: GirFunction,
186
+ shouldSkip: (parameter: GirParameter) => boolean = () => false,
187
+ renames?: Map<string, string>,
188
+ ): JsDocParam[] =>
189
+ inputParameters(library, fn)
190
+ .filter(({ parameter }) => !shouldSkip(parameter))
191
+ .map(({ parameter, index }) => ({
192
+ name: renames?.get(parameter.name) ?? parameterIdentifier(parameter, index),
193
+ doc: parameter.doc ?? "",
194
+ }))
195
+ .filter((entry) => entry.doc.length > 0);
196
+
197
+ const documentedHandlerParameters = (parameters: GirParameter[]): JsDocParam[] =>
198
+ handlerParameters(parameters)
199
+ .map((parameter, index) => ({ name: parameterIdentifier(parameter, index), doc: parameter.doc ?? "" }))
200
+ .filter((entry) => entry.doc.length > 0);
201
+
202
+ const handlerRenames = (parameters: GirParameter[]): Map<string, string> => {
203
+ const renames: Map<string, string> = new Map();
204
+
205
+ for (const [index, parameter] of parameters.entries()) {
206
+ renames.set(parameter.name, parameterIdentifier(parameter, index));
207
+ }
208
+
209
+ return renames;
210
+ };
211
+
212
+ const renamesWithInstance = (parameters: GirParameter[], instance: GirParameter | undefined): Map<string, string> => {
213
+ const renames = handlerRenames(parameters);
214
+
215
+ if (instance !== undefined && instance.name.length > 0) {
216
+ renames.set(instance.name, "this");
217
+ }
218
+
219
+ return renames;
220
+ };
221
+
173
222
  const renderHandlerParameters = (
174
223
  parameters: GirParameter[],
175
224
  renderType: (ref: TypeId | undefined, isNullable: boolean) => string,
176
225
  shouldExclude: (parameter: GirParameter) => boolean = () => false,
177
226
  ): string[] =>
178
- parameters
179
- .filter((parameter) => !parameter.isVarargs && !isOutParameter(parameter) && !shouldExclude(parameter))
180
- .map(
181
- (parameter, index) =>
182
- `${parameterIdentifier(parameter, index)}: ${renderType(parameter.type, parameter.nullable)}`,
183
- );
227
+ handlerParameters(parameters, shouldExclude).map(
228
+ (parameter, index) =>
229
+ `${parameterIdentifier(parameter, index)}: ${renderType(parameter.type, parameter.nullable)}`,
230
+ );
184
231
 
185
232
  const foldOutParamShape = (primary: string | undefined, outTypes: string[]): string => {
186
233
  if (primary !== undefined) {
@@ -199,9 +246,9 @@ const foldOutParamShape = (primary: string | undefined, outTypes: string[]): str
199
246
  const isHandlerOutParameter = (options: {
200
247
  library: Library;
201
248
  parameter: GirParameter;
202
- includeCallerAllocated: boolean;
249
+ shouldIncludeCallerAllocated: boolean;
203
250
  }): boolean => {
204
- const { library, parameter, includeCallerAllocated } = options;
251
+ const { library, parameter, shouldIncludeCallerAllocated } = options;
205
252
 
206
253
  if (parameter.isVarargs) {
207
254
  return false;
@@ -215,7 +262,7 @@ const isHandlerOutParameter = (options: {
215
262
  return true;
216
263
  }
217
264
 
218
- return includeCallerAllocated && isCallerAllocatedOut(parameter);
265
+ return shouldIncludeCallerAllocated && isCallerAllocatedOut(parameter);
219
266
  };
220
267
 
221
268
  const scalarResultType = (primary: string | undefined, isOptOut: boolean): string => {
@@ -227,18 +274,23 @@ const scalarResultType = (primary: string | undefined, isOptOut: boolean): strin
227
274
  };
228
275
 
229
276
  const renderHandlerResultType = (options: HandlerResultOptions): string => {
230
- const { library, signal, renderType, includeCallerAllocated, optOut } = options;
277
+ const { library, signal, renderType, shouldIncludeCallerAllocated, isOptOut } = options;
278
+ const shouldExcludeOut = options.shouldExcludeOut ?? (() => false);
231
279
 
232
280
  const primary = shouldOmitPrimaryReturn(library, signal.returnValue)
233
281
  ? undefined
234
282
  : renderType(signal.returnValue.type, signal.returnValue.nullable);
235
283
 
236
284
  const outTypes = signal.parameters
237
- .filter((parameter) => isHandlerOutParameter({ library, parameter, includeCallerAllocated }))
285
+ .filter(
286
+ (parameter) =>
287
+ isHandlerOutParameter({ library, parameter, shouldIncludeCallerAllocated }) &&
288
+ !shouldExcludeOut(parameter),
289
+ )
238
290
  .map((parameter) => renderType(parameter.type, parameter.nullable));
239
291
 
240
292
  if (outTypes.length === 0) {
241
- return scalarResultType(primary, optOut);
293
+ return scalarResultType(primary, isOptOut);
242
294
  }
243
295
 
244
296
  return foldOutParamShape(primary, outTypes);
@@ -249,10 +301,16 @@ export {
249
301
  inputParameters,
250
302
  closureAndDestroyIndices,
251
303
  arrayLengthSources,
252
- hasCallerAllocatedArrayLength,
253
304
  foldedLengthIndices,
305
+ foldedLengthParameters,
254
306
  parameterIdentifier,
307
+ documentedParameters,
308
+ documentedHandlerParameters,
309
+ handlerRenames,
310
+ renamesWithInstance,
311
+ handlerParameters,
255
312
  renderHandlerParameters,
256
313
  foldOutParamShape,
257
314
  renderHandlerResultType,
315
+ type InputParameter,
258
316
  };
@@ -19,7 +19,7 @@ type ReferenceName = {
19
19
  type TsTypeTarget = {
20
20
  containerStyle: "map" | "record";
21
21
  callbackType: string;
22
- byteArrayAsNumber: boolean;
22
+ shouldRenderByteArrayAsNumber: boolean;
23
23
  renderNamed: (resolved: GirType | undefined, name: ReferenceName) => string;
24
24
  renderGtype: () => string;
25
25
  };
@@ -100,10 +100,8 @@ const renderContainerType = (
100
100
  return renderSequenceType(library, target, type);
101
101
  };
102
102
 
103
- // An array whose length nothing states decodes as the bare pointer it is, so its TypeScript type has
104
- // to say so too rather than promising elements nothing can count.
105
103
  const renderSequenceType = (library: Library, target: TsTypeTarget, type: CArrayType | ListType): string => {
106
- if (type.kind === "list" && type.flavor === "gbytearray" && target.byteArrayAsNumber) {
104
+ if (type.kind === "list" && type.flavor === "gbytearray" && target.shouldRenderByteArrayAsNumber) {
107
105
  return "number[]";
108
106
  }
109
107
 
@@ -129,7 +127,7 @@ const renderNamedType = (
129
127
  const moduleTarget = (context: ModuleContext): TsTypeTarget => ({
130
128
  containerStyle: "map",
131
129
  callbackType: "((...args: any[]) => any)",
132
- byteArrayAsNumber: true,
130
+ shouldRenderByteArrayAsNumber: true,
133
131
  renderNamed: (_resolved, name) => context.qualify(name.namespaceName, name.typeName),
134
132
  renderGtype: () => gtypeTsType(context),
135
133
  });
@@ -148,7 +146,7 @@ const recordTypeTarget = (
148
146
  const target: TsTypeTarget = {
149
147
  containerStyle: "record",
150
148
  callbackType: "((...args: unknown[]) => unknown)",
151
- byteArrayAsNumber: false,
149
+ shouldRenderByteArrayAsNumber: false,
152
150
  renderNamed: (resolved, name) => {
153
151
  if (resolved?.kind === "alias") {
154
152
  return resolved.value.target === undefined
@@ -0,0 +1,24 @@
1
+ import type { Library } from "../gir/library.js";
2
+ import type { PrimitiveCategory } from "../gir/primitives.js";
3
+ import type { CArrayType, TypeId } from "../gir/type-id.js";
4
+ import type { GirType } from "../gir/type.js";
5
+
6
+ const resolvedTypeFor = (library: Library, ref: TypeId | undefined): GirType | undefined =>
7
+ ref === undefined ? undefined : library.typeFor(ref);
8
+
9
+ const carrayFor = (library: Library, ref: TypeId | undefined): CArrayType | undefined => {
10
+ const type = resolvedTypeFor(library, ref);
11
+
12
+ return type?.kind === "carray" ? type : undefined;
13
+ };
14
+
15
+ const primitiveCategoryFor = (library: Library, ref: TypeId | undefined): PrimitiveCategory | undefined => {
16
+ const type = resolvedTypeFor(library, ref);
17
+
18
+ return type?.kind === "primitive" ? type.category : undefined;
19
+ };
20
+
21
+ const isUnboundedArray = (type: CArrayType): boolean =>
22
+ type.isZeroTerminated && type.lengthParameterIndex === undefined && type.fixedSize === undefined;
23
+
24
+ export { carrayFor, isUnboundedArray, primitiveCategoryFor };