@gtkx/codegen 1.0.0-rc.4 → 1.1.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 (523) hide show
  1. package/README.md +5 -5
  2. package/dist/analysis/descriptor-render.d.ts +13 -9
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +80 -50
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +16 -7
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +15 -3
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +4 -3
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +103 -58
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/interface-conflicts.d.ts +23 -0
  15. package/dist/analysis/interface-conflicts.d.ts.map +1 -0
  16. package/dist/analysis/interface-conflicts.js +144 -0
  17. package/dist/analysis/interface-conflicts.js.map +1 -0
  18. package/dist/analysis/nul-terminated-bytes.d.ts +5 -0
  19. package/dist/analysis/nul-terminated-bytes.d.ts.map +1 -0
  20. package/dist/analysis/nul-terminated-bytes.js +18 -0
  21. package/dist/analysis/nul-terminated-bytes.js.map +1 -0
  22. package/dist/analysis/param-capability.d.ts +5 -0
  23. package/dist/analysis/param-capability.d.ts.map +1 -0
  24. package/dist/analysis/param-capability.js +129 -0
  25. package/dist/analysis/param-capability.js.map +1 -0
  26. package/dist/analysis/param-structure.d.ts +11 -4
  27. package/dist/analysis/param-structure.d.ts.map +1 -1
  28. package/dist/analysis/param-structure.js +42 -16
  29. package/dist/analysis/param-structure.js.map +1 -1
  30. package/dist/analysis/ts-type.d.ts.map +1 -1
  31. package/dist/analysis/ts-type.js +10 -17
  32. package/dist/analysis/ts-type.js.map +1 -1
  33. package/dist/analysis/type-key.d.ts +5 -0
  34. package/dist/analysis/type-key.d.ts.map +1 -0
  35. package/dist/analysis/type-key.js +9 -0
  36. package/dist/analysis/type-key.js.map +1 -0
  37. package/dist/analysis/type-shape.d.ts +8 -0
  38. package/dist/analysis/type-shape.d.ts.map +1 -0
  39. package/dist/analysis/type-shape.js +12 -0
  40. package/dist/analysis/type-shape.js.map +1 -0
  41. package/dist/compile.d.ts +12 -3
  42. package/dist/compile.d.ts.map +1 -1
  43. package/dist/compile.js +73 -24
  44. package/dist/compile.js.map +1 -1
  45. package/dist/docs/api-reference.d.ts +2 -2
  46. package/dist/docs/api-reference.d.ts.map +1 -1
  47. package/dist/docs/api-reference.js +17 -23
  48. package/dist/docs/api-reference.js.map +1 -1
  49. package/dist/docs/element-page.d.ts +4 -4
  50. package/dist/docs/element-page.d.ts.map +1 -1
  51. package/dist/docs/element-page.js +36 -22
  52. package/dist/docs/element-page.js.map +1 -1
  53. package/dist/docs/handwritten-props.d.ts +9 -0
  54. package/dist/docs/handwritten-props.d.ts.map +1 -0
  55. package/dist/docs/handwritten-props.js +149 -0
  56. package/dist/docs/handwritten-props.js.map +1 -0
  57. package/dist/docs/pipeline.d.ts.map +1 -1
  58. package/dist/docs/pipeline.js +87 -20
  59. package/dist/docs/pipeline.js.map +1 -1
  60. package/dist/docs/render.d.ts +26 -5
  61. package/dist/docs/render.d.ts.map +1 -1
  62. package/dist/docs/render.js +88 -25
  63. package/dist/docs/render.js.map +1 -1
  64. package/dist/docs/symbol-page.d.ts +17 -0
  65. package/dist/docs/symbol-page.d.ts.map +1 -1
  66. package/dist/docs/symbol-page.js +132 -44
  67. package/dist/docs/symbol-page.js.map +1 -1
  68. package/dist/fingerprint.d.ts +12 -1
  69. package/dist/fingerprint.d.ts.map +1 -1
  70. package/dist/fingerprint.js +44 -28
  71. package/dist/fingerprint.js.map +1 -1
  72. package/dist/gi.d.ts.map +1 -1
  73. package/dist/gi.js +1 -0
  74. package/dist/gi.js.map +1 -1
  75. package/dist/gir/ancestry.d.ts +8 -2
  76. package/dist/gir/ancestry.d.ts.map +1 -1
  77. package/dist/gir/ancestry.js +19 -1
  78. package/dist/gir/ancestry.js.map +1 -1
  79. package/dist/gir/annotations.d.ts +21 -0
  80. package/dist/gir/annotations.d.ts.map +1 -0
  81. package/dist/gir/annotations.js +15 -0
  82. package/dist/gir/annotations.js.map +1 -0
  83. package/dist/gir/callback.d.ts +1 -0
  84. package/dist/gir/callback.d.ts.map +1 -1
  85. package/dist/gir/callback.js +1 -0
  86. package/dist/gir/callback.js.map +1 -1
  87. package/dist/gir/class.d.ts +32 -1
  88. package/dist/gir/class.d.ts.map +1 -1
  89. package/dist/gir/class.js +8 -3
  90. package/dist/gir/class.js.map +1 -1
  91. package/dist/gir/cursor-overrides.d.ts +8 -0
  92. package/dist/gir/cursor-overrides.d.ts.map +1 -0
  93. package/dist/gir/cursor-overrides.js +6 -0
  94. package/dist/gir/cursor-overrides.js.map +1 -0
  95. package/dist/gir/emittable.d.ts +7 -0
  96. package/dist/gir/emittable.d.ts.map +1 -0
  97. package/dist/gir/emittable.js +3 -0
  98. package/dist/gir/emittable.js.map +1 -0
  99. package/dist/gir/enum.d.ts +21 -1
  100. package/dist/gir/enum.d.ts.map +1 -1
  101. package/dist/gir/enum.js +9 -9
  102. package/dist/gir/enum.js.map +1 -1
  103. package/dist/gir/field.d.ts +19 -3
  104. package/dist/gir/field.d.ts.map +1 -1
  105. package/dist/gir/field.js +7 -8
  106. package/dist/gir/field.js.map +1 -1
  107. package/dist/gir/function.d.ts +15 -0
  108. package/dist/gir/function.d.ts.map +1 -1
  109. package/dist/gir/function.js +28 -2
  110. package/dist/gir/function.js.map +1 -1
  111. package/dist/gir/libraries.d.ts +1 -3
  112. package/dist/gir/libraries.d.ts.map +1 -1
  113. package/dist/gir/libraries.js +0 -1
  114. package/dist/gir/libraries.js.map +1 -1
  115. package/dist/gir/library.d.ts +36 -0
  116. package/dist/gir/library.d.ts.map +1 -1
  117. package/dist/gir/library.js +35 -1
  118. package/dist/gir/library.js.map +1 -1
  119. package/dist/gir/namespace.d.ts +43 -1
  120. package/dist/gir/namespace.d.ts.map +1 -1
  121. package/dist/gir/namespace.js +8 -7
  122. package/dist/gir/namespace.js.map +1 -1
  123. package/dist/gir/parameter.d.ts +52 -1
  124. package/dist/gir/parameter.d.ts.map +1 -1
  125. package/dist/gir/parameter.js +8 -3
  126. package/dist/gir/parameter.js.map +1 -1
  127. package/dist/gir/parse.d.ts +3 -1
  128. package/dist/gir/parse.d.ts.map +1 -1
  129. package/dist/gir/parse.js +9 -9
  130. package/dist/gir/parse.js.map +1 -1
  131. package/dist/gir/primitives.d.ts +1 -0
  132. package/dist/gir/primitives.d.ts.map +1 -1
  133. package/dist/gir/primitives.js.map +1 -1
  134. package/dist/gir/property.d.ts +16 -0
  135. package/dist/gir/property.d.ts.map +1 -1
  136. package/dist/gir/property.js +3 -3
  137. package/dist/gir/property.js.map +1 -1
  138. package/dist/gir/record.d.ts +22 -0
  139. package/dist/gir/record.d.ts.map +1 -1
  140. package/dist/gir/record.js +3 -2
  141. package/dist/gir/record.js.map +1 -1
  142. package/dist/gir/size.d.ts +5 -4
  143. package/dist/gir/size.d.ts.map +1 -1
  144. package/dist/gir/size.js.map +1 -1
  145. package/dist/gir/type-id.d.ts +35 -0
  146. package/dist/gir/type-id.d.ts.map +1 -1
  147. package/dist/gir/type-id.js +1 -0
  148. package/dist/gir/type-id.js.map +1 -1
  149. package/dist/gir/type-ref.d.ts.map +1 -1
  150. package/dist/gir/type-ref.js +1 -0
  151. package/dist/gir/type-ref.js.map +1 -1
  152. package/dist/gir/type.d.ts +20 -0
  153. package/dist/gir/type.d.ts.map +1 -1
  154. package/dist/gir/type.js.map +1 -1
  155. package/dist/guards.d.ts +16 -0
  156. package/dist/guards.d.ts.map +1 -0
  157. package/dist/guards.js +11 -0
  158. package/dist/guards.js.map +1 -0
  159. package/dist/internal.d.ts +2 -0
  160. package/dist/internal.d.ts.map +1 -1
  161. package/dist/internal.js +2 -0
  162. package/dist/internal.js.map +1 -1
  163. package/dist/json.d.ts +3 -0
  164. package/dist/json.d.ts.map +1 -0
  165. package/dist/json.js +11 -0
  166. package/dist/json.js.map +1 -0
  167. package/dist/khronos/args.d.ts +7 -6
  168. package/dist/khronos/args.d.ts.map +1 -1
  169. package/dist/khronos/args.js +28 -6
  170. package/dist/khronos/args.js.map +1 -1
  171. package/dist/khronos/doc-context.d.ts +29 -0
  172. package/dist/khronos/doc-context.d.ts.map +1 -0
  173. package/dist/khronos/doc-context.js +29 -0
  174. package/dist/khronos/doc-context.js.map +1 -0
  175. package/dist/khronos/extensions.d.ts +13 -0
  176. package/dist/khronos/extensions.d.ts.map +1 -0
  177. package/dist/khronos/extensions.js +49 -0
  178. package/dist/khronos/extensions.js.map +1 -0
  179. package/dist/khronos/jsdoc.d.ts +17 -11
  180. package/dist/khronos/jsdoc.d.ts.map +1 -1
  181. package/dist/khronos/jsdoc.js +104 -46
  182. package/dist/khronos/jsdoc.js.map +1 -1
  183. package/dist/khronos/model.d.ts +42 -3
  184. package/dist/khronos/model.d.ts.map +1 -1
  185. package/dist/khronos/model.js +218 -63
  186. package/dist/khronos/model.js.map +1 -1
  187. package/dist/khronos/modules.d.ts +9 -6
  188. package/dist/khronos/modules.d.ts.map +1 -1
  189. package/dist/khronos/modules.js +112 -27
  190. package/dist/khronos/modules.js.map +1 -1
  191. package/dist/khronos/notes.d.ts +19 -0
  192. package/dist/khronos/notes.d.ts.map +1 -0
  193. package/dist/khronos/notes.js +35 -0
  194. package/dist/khronos/notes.js.map +1 -0
  195. package/dist/khronos/param-pair.d.ts +1 -1
  196. package/dist/khronos/param-pair.d.ts.map +1 -1
  197. package/dist/khronos/param-pair.js.map +1 -1
  198. package/dist/khronos/parse.d.ts.map +1 -1
  199. package/dist/khronos/parse.js +3 -4
  200. package/dist/khronos/parse.js.map +1 -1
  201. package/dist/khronos/pipeline.d.ts +4 -2
  202. package/dist/khronos/pipeline.d.ts.map +1 -1
  203. package/dist/khronos/pipeline.js +58 -27
  204. package/dist/khronos/pipeline.js.map +1 -1
  205. package/dist/khronos/plan.d.ts +3 -9
  206. package/dist/khronos/plan.d.ts.map +1 -1
  207. package/dist/khronos/plan.js +3 -3
  208. package/dist/khronos/plan.js.map +1 -1
  209. package/dist/khronos/render.d.ts +8 -6
  210. package/dist/khronos/render.d.ts.map +1 -1
  211. package/dist/khronos/render.js +35 -26
  212. package/dist/khronos/render.js.map +1 -1
  213. package/dist/khronos/select.d.ts +21 -4
  214. package/dist/khronos/select.d.ts.map +1 -1
  215. package/dist/khronos/select.js +47 -34
  216. package/dist/khronos/select.js.map +1 -1
  217. package/dist/react/element-config.d.ts +2 -2
  218. package/dist/react/element-config.d.ts.map +1 -1
  219. package/dist/react/element-config.js.map +1 -1
  220. package/dist/runner.d.ts +6 -8
  221. package/dist/runner.d.ts.map +1 -1
  222. package/dist/runner.js +16 -0
  223. package/dist/runner.js.map +1 -1
  224. package/dist/staging.d.ts +5 -0
  225. package/dist/staging.d.ts.map +1 -0
  226. package/dist/staging.js +57 -0
  227. package/dist/staging.js.map +1 -0
  228. package/dist/store/compile-store.d.ts +1 -1
  229. package/dist/store/compile-store.d.ts.map +1 -1
  230. package/dist/store/compile-store.js +4 -2
  231. package/dist/store/compile-store.js.map +1 -1
  232. package/dist/store/gi/callable-doc.d.ts +11 -0
  233. package/dist/store/gi/callable-doc.d.ts.map +1 -0
  234. package/dist/store/gi/callable-doc.js +62 -0
  235. package/dist/store/gi/callable-doc.js.map +1 -0
  236. package/dist/store/gi/callables.d.ts +9 -2
  237. package/dist/store/gi/callables.d.ts.map +1 -1
  238. package/dist/store/gi/callables.js +35 -40
  239. package/dist/store/gi/callables.js.map +1 -1
  240. package/dist/store/gi/callback.d.ts.map +1 -1
  241. package/dist/store/gi/callback.js +10 -6
  242. package/dist/store/gi/callback.js.map +1 -1
  243. package/dist/store/gi/class.d.ts.map +1 -1
  244. package/dist/store/gi/class.js +63 -40
  245. package/dist/store/gi/class.js.map +1 -1
  246. package/dist/store/gi/closure-invocation.d.ts +4 -0
  247. package/dist/store/gi/closure-invocation.d.ts.map +1 -0
  248. package/dist/store/gi/closure-invocation.js +22 -0
  249. package/dist/store/gi/closure-invocation.js.map +1 -0
  250. package/dist/store/gi/companion.d.ts.map +1 -1
  251. package/dist/store/gi/companion.js +6 -6
  252. package/dist/store/gi/companion.js.map +1 -1
  253. package/dist/store/gi/constant.d.ts.map +1 -1
  254. package/dist/store/gi/constant.js +12 -3
  255. package/dist/store/gi/constant.js.map +1 -1
  256. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  257. package/dist/store/gi/constructor-props.js +18 -20
  258. package/dist/store/gi/constructor-props.js.map +1 -1
  259. package/dist/store/gi/doc-spec.d.ts +14 -0
  260. package/dist/store/gi/doc-spec.d.ts.map +1 -0
  261. package/dist/store/gi/doc-spec.js +23 -0
  262. package/dist/store/gi/doc-spec.js.map +1 -0
  263. package/dist/store/gi/enum.d.ts.map +1 -1
  264. package/dist/store/gi/enum.js +52 -19
  265. package/dist/store/gi/enum.js.map +1 -1
  266. package/dist/store/gi/function.d.ts +1 -3
  267. package/dist/store/gi/function.d.ts.map +1 -1
  268. package/dist/store/gi/function.js +50 -29
  269. package/dist/store/gi/function.js.map +1 -1
  270. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  271. package/dist/store/gi/gtype-binding.js +4 -1
  272. package/dist/store/gi/gtype-binding.js.map +1 -1
  273. package/dist/store/gi/interface.d.ts.map +1 -1
  274. package/dist/store/gi/interface.js +155 -26
  275. package/dist/store/gi/interface.js.map +1 -1
  276. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  277. package/dist/store/gi/item-comparators.js +3 -5
  278. package/dist/store/gi/item-comparators.js.map +1 -1
  279. package/dist/store/gi/method.d.ts +11 -2
  280. package/dist/store/gi/method.d.ts.map +1 -1
  281. package/dist/store/gi/method.js +80 -45
  282. package/dist/store/gi/method.js.map +1 -1
  283. package/dist/store/gi/param-marshal.d.ts +6 -2
  284. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  285. package/dist/store/gi/param-marshal.js +54 -5
  286. package/dist/store/gi/param-marshal.js.map +1 -1
  287. package/dist/store/gi/pipeline.d.ts.map +1 -1
  288. package/dist/store/gi/pipeline.js +23 -11
  289. package/dist/store/gi/pipeline.js.map +1 -1
  290. package/dist/store/gi/properties.d.ts +2 -1
  291. package/dist/store/gi/properties.d.ts.map +1 -1
  292. package/dist/store/gi/properties.js +7 -4
  293. package/dist/store/gi/properties.js.map +1 -1
  294. package/dist/store/gi/property-accessor.d.ts +12 -5
  295. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  296. package/dist/store/gi/property-accessor.js +98 -46
  297. package/dist/store/gi/property-accessor.js.map +1 -1
  298. package/dist/store/gi/record-constructor.d.ts +8 -1
  299. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  300. package/dist/store/gi/record-constructor.js +34 -11
  301. package/dist/store/gi/record-constructor.js.map +1 -1
  302. package/dist/store/gi/record-field-accessor.d.ts +3 -1
  303. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  304. package/dist/store/gi/record-field-accessor.js +8 -3
  305. package/dist/store/gi/record-field-accessor.js.map +1 -1
  306. package/dist/store/gi/record-layout.d.ts +6 -1
  307. package/dist/store/gi/record-layout.d.ts.map +1 -1
  308. package/dist/store/gi/record-layout.js +9 -2
  309. package/dist/store/gi/record-layout.js.map +1 -1
  310. package/dist/store/gi/record.d.ts.map +1 -1
  311. package/dist/store/gi/record.js +21 -9
  312. package/dist/store/gi/record.js.map +1 -1
  313. package/dist/store/gi/registration.d.ts +1 -1
  314. package/dist/store/gi/registration.js +4 -4
  315. package/dist/store/gi/registration.js.map +1 -1
  316. package/dist/store/gi/runtime-override.d.ts +2 -1
  317. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  318. package/dist/store/gi/runtime-override.js +8 -5
  319. package/dist/store/gi/runtime-override.js.map +1 -1
  320. package/dist/store/gi/signal.d.ts +2 -1
  321. package/dist/store/gi/signal.d.ts.map +1 -1
  322. package/dist/store/gi/signal.js +42 -37
  323. package/dist/store/gi/signal.js.map +1 -1
  324. package/dist/store/gi/value-marshalable.d.ts +1 -2
  325. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  326. package/dist/store/gi/value-marshalable.js +3 -2
  327. package/dist/store/gi/value-marshalable.js.map +1 -1
  328. package/dist/store/gi/vtable.d.ts +19 -1
  329. package/dist/store/gi/vtable.d.ts.map +1 -1
  330. package/dist/store/gi/vtable.js +257 -51
  331. package/dist/store/gi/vtable.js.map +1 -1
  332. package/dist/store/gi-store.d.ts +1 -0
  333. package/dist/store/gi-store.d.ts.map +1 -1
  334. package/dist/store/gi-store.js +15 -20
  335. package/dist/store/gi-store.js.map +1 -1
  336. package/dist/store/jsx/element-components.d.ts +1 -1
  337. package/dist/store/jsx/element-components.d.ts.map +1 -1
  338. package/dist/store/jsx/element-components.js +6 -4
  339. package/dist/store/jsx/element-components.js.map +1 -1
  340. package/dist/store/jsx/element-prop-imports.d.ts +1 -3
  341. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -1
  342. package/dist/store/jsx/element-prop-imports.js.map +1 -1
  343. package/dist/store/jsx/element-prop-types.d.ts +3 -0
  344. package/dist/store/jsx/element-prop-types.d.ts.map +1 -1
  345. package/dist/store/jsx/element-prop-types.js +7 -1
  346. package/dist/store/jsx/element-prop-types.js.map +1 -1
  347. package/dist/store/jsx/generated-elements.d.ts +2 -1
  348. package/dist/store/jsx/generated-elements.d.ts.map +1 -1
  349. package/dist/store/jsx/generated-elements.js +13 -7
  350. package/dist/store/jsx/generated-elements.js.map +1 -1
  351. package/dist/store/jsx/intrinsic-elements.d.ts +4 -0
  352. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -1
  353. package/dist/store/jsx/intrinsic-elements.js.map +1 -1
  354. package/dist/store/jsx/jsx.d.ts.map +1 -1
  355. package/dist/store/jsx/jsx.js +10 -9
  356. package/dist/store/jsx/jsx.js.map +1 -1
  357. package/dist/store/jsx/metadata.d.ts.map +1 -1
  358. package/dist/store/jsx/metadata.js +5 -3
  359. package/dist/store/jsx/metadata.js.map +1 -1
  360. package/dist/store/jsx/pipeline.d.ts +1 -1
  361. package/dist/store/jsx/pipeline.d.ts.map +1 -1
  362. package/dist/store/jsx/pipeline.js.map +1 -1
  363. package/dist/store/jsx/props.d.ts +1 -7
  364. package/dist/store/jsx/props.d.ts.map +1 -1
  365. package/dist/store/jsx/props.js +14 -6
  366. package/dist/store/jsx/props.js.map +1 -1
  367. package/dist/store/jsx-store.d.ts.map +1 -1
  368. package/dist/store/jsx-store.js +3 -3
  369. package/dist/store/jsx-store.js.map +1 -1
  370. package/dist/store/resolve-store.d.ts +14 -3
  371. package/dist/store/resolve-store.d.ts.map +1 -1
  372. package/dist/store/resolve-store.js +98 -15
  373. package/dist/store/resolve-store.js.map +1 -1
  374. package/dist/store/store-fs.d.ts +9 -6
  375. package/dist/store/store-fs.d.ts.map +1 -1
  376. package/dist/store/store-fs.js +59 -25
  377. package/dist/store/store-fs.js.map +1 -1
  378. package/dist/store/store-links.d.ts +3 -0
  379. package/dist/store/store-links.d.ts.map +1 -0
  380. package/dist/store/store-links.js +39 -0
  381. package/dist/store/store-links.js.map +1 -0
  382. package/dist/writer/comparison-context.d.ts +4 -0
  383. package/dist/writer/comparison-context.d.ts.map +1 -0
  384. package/dist/writer/comparison-context.js +13 -0
  385. package/dist/writer/comparison-context.js.map +1 -0
  386. package/dist/writer/context.d.ts +3 -2
  387. package/dist/writer/context.d.ts.map +1 -1
  388. package/dist/writer/context.js +11 -3
  389. package/dist/writer/context.js.map +1 -1
  390. package/dist/writer/doc-tags.d.ts +21 -0
  391. package/dist/writer/doc-tags.d.ts.map +1 -0
  392. package/dist/writer/doc-tags.js +38 -0
  393. package/dist/writer/doc-tags.js.map +1 -0
  394. package/dist/writer/doc.d.ts +3 -1
  395. package/dist/writer/doc.d.ts.map +1 -1
  396. package/dist/writer/doc.js +19 -6
  397. package/dist/writer/doc.js.map +1 -1
  398. package/dist/writer/gtk-doc.d.ts +1 -1
  399. package/dist/writer/gtk-doc.d.ts.map +1 -1
  400. package/dist/writer/gtk-doc.js +64 -15
  401. package/dist/writer/gtk-doc.js.map +1 -1
  402. package/dist/writer/module.d.ts +17 -3
  403. package/dist/writer/module.d.ts.map +1 -1
  404. package/dist/writer/module.js +72 -3
  405. package/dist/writer/module.js.map +1 -1
  406. package/dist/xml.d.ts +7 -1
  407. package/dist/xml.d.ts.map +1 -1
  408. package/dist/xml.js +43 -1
  409. package/dist/xml.js.map +1 -1
  410. package/overrides/gdk/rgba.ts.ejs +26 -0
  411. package/overrides/gobject/object.ts.ejs +48 -3
  412. package/overrides/gobject/value.ts.ejs +7 -0
  413. package/overrides/graphene/structs.ts.ejs +55 -0
  414. package/package.json +15 -4
  415. package/src/analysis/descriptor-render.ts +130 -66
  416. package/src/analysis/descriptor.ts +35 -11
  417. package/src/analysis/inheritance.ts +166 -75
  418. package/src/analysis/interface-conflicts.ts +237 -0
  419. package/src/analysis/nul-terminated-bytes.ts +31 -0
  420. package/src/analysis/param-capability.ts +169 -0
  421. package/src/analysis/param-structure.ts +85 -25
  422. package/src/analysis/ts-type.ts +13 -17
  423. package/src/analysis/type-key.ts +14 -0
  424. package/src/analysis/type-shape.ts +24 -0
  425. package/src/compile.ts +110 -26
  426. package/src/docs/api-reference.ts +46 -34
  427. package/src/docs/element-page.ts +58 -49
  428. package/src/docs/handwritten-props.ts +230 -0
  429. package/src/docs/pipeline.ts +131 -21
  430. package/src/docs/render.ts +153 -35
  431. package/src/docs/symbol-page.ts +230 -80
  432. package/src/fingerprint.ts +86 -32
  433. package/src/gi.ts +1 -0
  434. package/src/gir/ancestry.ts +31 -1
  435. package/src/gir/annotations.ts +37 -0
  436. package/src/gir/callback.ts +2 -0
  437. package/src/gir/class.ts +42 -4
  438. package/src/gir/cursor-overrides.ts +12 -0
  439. package/src/gir/emittable.ts +8 -0
  440. package/src/gir/enum.ts +30 -10
  441. package/src/gir/field.ts +24 -9
  442. package/src/gir/function.ts +60 -9
  443. package/src/gir/libraries.ts +11 -3
  444. package/src/gir/library.ts +52 -3
  445. package/src/gir/namespace.ts +49 -7
  446. package/src/gir/parameter.ts +62 -3
  447. package/src/gir/parse.ts +13 -9
  448. package/src/gir/primitives.ts +1 -0
  449. package/src/gir/property.ts +18 -3
  450. package/src/gir/record.ts +24 -2
  451. package/src/gir/size.ts +8 -3
  452. package/src/gir/type-id.ts +49 -3
  453. package/src/gir/type-ref.ts +1 -0
  454. package/src/gir/type.ts +50 -6
  455. package/src/guards.ts +23 -0
  456. package/src/internal.ts +2 -0
  457. package/src/json.ts +11 -0
  458. package/src/khronos/args.ts +36 -13
  459. package/src/khronos/doc-context.ts +62 -0
  460. package/src/khronos/extensions.ts +85 -0
  461. package/src/khronos/jsdoc.ts +152 -56
  462. package/src/khronos/model.ts +314 -69
  463. package/src/khronos/modules.ts +150 -40
  464. package/src/khronos/notes.ts +74 -0
  465. package/src/khronos/param-pair.ts +1 -1
  466. package/src/khronos/parse.ts +3 -4
  467. package/src/khronos/pipeline.ts +95 -42
  468. package/src/khronos/plan.ts +4 -6
  469. package/src/khronos/render.ts +62 -50
  470. package/src/khronos/select.ts +91 -50
  471. package/src/react/element-config.ts +2 -2
  472. package/src/runner.ts +20 -9
  473. package/src/staging.ts +69 -0
  474. package/src/store/compile-store.ts +7 -5
  475. package/src/store/gi/callable-doc.ts +102 -0
  476. package/src/store/gi/callables.ts +58 -44
  477. package/src/store/gi/callback.ts +10 -9
  478. package/src/store/gi/class.ts +83 -49
  479. package/src/store/gi/closure-invocation.ts +26 -0
  480. package/src/store/gi/companion.ts +7 -6
  481. package/src/store/gi/constant.ts +14 -5
  482. package/src/store/gi/constructor-props.ts +19 -23
  483. package/src/store/gi/doc-spec.ts +38 -0
  484. package/src/store/gi/enum.ts +75 -26
  485. package/src/store/gi/function.ts +72 -44
  486. package/src/store/gi/gtype-binding.ts +7 -2
  487. package/src/store/gi/interface.ts +244 -37
  488. package/src/store/gi/item-comparators.ts +3 -5
  489. package/src/store/gi/method.ts +124 -69
  490. package/src/store/gi/param-marshal.ts +91 -6
  491. package/src/store/gi/pipeline.ts +28 -13
  492. package/src/store/gi/properties.ts +10 -5
  493. package/src/store/gi/property-accessor.ts +163 -75
  494. package/src/store/gi/record-constructor.ts +56 -19
  495. package/src/store/gi/record-field-accessor.ts +13 -4
  496. package/src/store/gi/record-layout.ts +12 -2
  497. package/src/store/gi/record.ts +24 -10
  498. package/src/store/gi/registration.ts +5 -5
  499. package/src/store/gi/runtime-override.ts +13 -6
  500. package/src/store/gi/signal.ts +54 -57
  501. package/src/store/gi/value-marshalable.ts +4 -2
  502. package/src/store/gi/vtable.ts +439 -61
  503. package/src/store/gi-store.ts +26 -31
  504. package/src/store/jsx/element-components.ts +8 -5
  505. package/src/store/jsx/element-prop-imports.ts +1 -3
  506. package/src/store/jsx/element-prop-types.ts +10 -1
  507. package/src/store/jsx/generated-elements.ts +17 -8
  508. package/src/store/jsx/intrinsic-elements.ts +4 -0
  509. package/src/store/jsx/jsx.ts +11 -9
  510. package/src/store/jsx/metadata.ts +6 -3
  511. package/src/store/jsx/pipeline.ts +1 -1
  512. package/src/store/jsx/props.ts +20 -7
  513. package/src/store/jsx-store.ts +3 -3
  514. package/src/store/resolve-store.ts +133 -18
  515. package/src/store/store-fs.ts +87 -34
  516. package/src/store/store-links.ts +49 -0
  517. package/src/writer/comparison-context.ts +18 -0
  518. package/src/writer/context.ts +14 -4
  519. package/src/writer/doc-tags.ts +70 -0
  520. package/src/writer/doc.ts +29 -6
  521. package/src/writer/gtk-doc.ts +82 -15
  522. package/src/writer/module.ts +114 -4
  523. package/src/xml.ts +61 -1
@@ -3,6 +3,7 @@ import type { GirFunction } from "../../gir/function.js";
3
3
  import type { GirType } from "../../gir/type.js";
4
4
  import type { ModuleContext } from "../../writer/context.js";
5
5
  import {
6
+ isSkippedPrimaryReturn,
6
7
  renderCallbackType,
7
8
  renderDescriptor,
8
9
  renderSelfDescriptor,
@@ -14,17 +15,35 @@ import {
14
15
  emittedArgIndices,
15
16
  foldedLengthIndices,
16
17
  foldOutParamShape,
18
+ type InputParameter,
17
19
  inputParameters,
18
20
  parameterIdentifier,
19
21
  } from "../../analysis/param-structure.js";
20
22
  import { renderTsType } from "../../analysis/ts-type.js";
21
23
  import { type GirParameter, isCallerAllocatedOut, isInoutParameter, isOutParameter } from "../../gir/parameter.js";
22
24
  import { hasUnknownArrayLength, type TypeId } from "../../gir/type-id.js";
25
+ import { areClosuresInvoked } from "./closure-invocation.js";
23
26
  import { itemComparatorArgDescriptors, itemComparatorTsType } from "./item-comparators.js";
24
- import { isCollectibleCallerOut, isHandlePassedInPlace, isHandlePassing } from "./param-marshal.js";
27
+ import {
28
+ isClosureType,
29
+ isCollectibleCallerOut,
30
+ isHandlePassedInPlace,
31
+ isHandlePassing,
32
+ renderCallerOutInstance,
33
+ } from "./param-marshal.js";
25
34
 
26
35
  type PromisifiedStep = { hasSeenOptional: boolean; expression: string | undefined };
27
36
 
37
+ type InputParameterOptions = {
38
+ shouldSkip: (parameter: GirParameter) => boolean;
39
+ isOptionalExtra: (parameter: GirParameter) => boolean;
40
+ };
41
+
42
+ type CallExpressionOptions = {
43
+ fn: GirFunction;
44
+ isForcedNullable?: boolean | undefined;
45
+ };
46
+
28
47
  type PromisifyContext = {
29
48
  context: ModuleContext;
30
49
  asyncFn: GirFunction;
@@ -42,6 +61,11 @@ type CallArgPlan = {
42
61
  inputExpr: string | undefined;
43
62
  };
44
63
 
64
+ type ReturnDescriptorPlan = {
65
+ descriptor: string;
66
+ isSkipped: boolean;
67
+ };
68
+
45
69
  type ParamDescriptorOptions = {
46
70
  direction?: "out" | "inout";
47
71
  isCallerAllocated?: boolean;
@@ -62,7 +86,13 @@ type PlanArgsContext = {
62
86
  folded: Set<number>;
63
87
  };
64
88
 
65
- const methodExportName = (fn: GirFunction): string => camelCase(fn.name);
89
+ const memberName = (girName: string): string => {
90
+ const camel = camelCase(girName);
91
+
92
+ return /^\d/.test(camel) ? `_${camel}` : camel;
93
+ };
94
+
95
+ const methodExportName = (fn: GirFunction): string => memberName(fn.name);
66
96
 
67
97
  const arrayLengthArgument = (source: GirParameter, sourceIndex: number): string => {
68
98
  const identifier = parameterIdentifier(source, sourceIndex);
@@ -71,15 +101,34 @@ const arrayLengthArgument = (source: GirParameter, sourceIndex: number): string
71
101
  };
72
102
 
73
103
  const renderMethodSignature = (context: ModuleContext, fn: GirFunction): string =>
74
- renderInputParameters(
75
- context,
76
- fn,
77
- () => false,
78
- () => false,
79
- );
104
+ renderInputParameters(context, fn, {
105
+ shouldSkip: () => false,
106
+ isOptionalExtra: () => false,
107
+ });
80
108
 
81
- const parameterAnnotation = (context: ModuleContext, fn: GirFunction, parameter: GirParameter): string =>
82
- itemComparatorTsType(context, fn, parameter) ?? renderTsType(context, parameter.type, parameter.nullable);
109
+ const closureAnnotation = (context: ModuleContext, base: string): string => {
110
+ context.addRuntimeTypeImport("ClosureCallback");
111
+
112
+ return `${base} | ClosureCallback`;
113
+ };
114
+
115
+ const requiresClosureMarshal = (context: ModuleContext, fn: GirFunction, ref: TypeId): boolean =>
116
+ isClosureType(context, ref) && areClosuresInvoked(fn);
117
+
118
+ const requiresClosureAnnotation = (context: ModuleContext, fn: GirFunction, parameter: GirParameter): boolean =>
119
+ parameter.type !== undefined && requiresClosureMarshal(context, fn, parameter.type);
120
+
121
+ const parameterAnnotation = (context: ModuleContext, fn: GirFunction, parameter: GirParameter): string => {
122
+ const comparator = itemComparatorTsType(context, fn, parameter);
123
+
124
+ if (comparator !== undefined) {
125
+ return comparator;
126
+ }
127
+
128
+ const base = renderTsType(context, parameter.type, parameter.nullable);
129
+
130
+ return requiresClosureAnnotation(context, fn, parameter) ? closureAnnotation(context, base) : base;
131
+ };
83
132
 
84
133
  const isParameterOptional = (parameter: GirParameter, isOptionalExtra: (parameter: GirParameter) => boolean): boolean =>
85
134
  parameter.optional || isOptionalExtra(parameter);
@@ -87,27 +136,23 @@ const isParameterOptional = (parameter: GirParameter, isOptionalExtra: (paramete
87
136
  const formatParameterPart = (name: string, annotation: string, isOptional: boolean): string =>
88
137
  isOptional ? `${name}?: ${annotation}` : `${name}: ${annotation}`;
89
138
 
90
- const renderInputParameters = (
91
- context: ModuleContext,
92
- fn: GirFunction,
93
- shouldSkip: (parameter: GirParameter) => boolean,
94
- isOptionalExtra: (parameter: GirParameter) => boolean,
95
- ): string => {
139
+ const renderInputParameters = (context: ModuleContext, fn: GirFunction, options: InputParameterOptions): string => {
96
140
  const parts: string[] = [];
97
141
  let hasSeenOptional = false;
98
142
 
99
143
  for (const { parameter, index } of inputParameters(context.library, fn)) {
100
- if (shouldSkip(parameter)) {
144
+ if (options.shouldSkip(parameter)) {
101
145
  continue;
102
146
  }
103
147
 
104
148
  const name = parameterIdentifier(parameter, index);
105
149
 
106
- if (isParameterOptional(parameter, isOptionalExtra)) {
150
+ if (isParameterOptional(parameter, options.isOptionalExtra)) {
107
151
  hasSeenOptional = true;
108
152
  }
109
153
 
110
- parts.push(formatParameterPart(name, parameterAnnotation(context, fn, parameter), hasSeenOptional));
154
+ const annotation = parameterAnnotation(context, fn, parameter);
155
+ parts.push(formatParameterPart(name, annotation, hasSeenOptional));
111
156
  }
112
157
 
113
158
  return parts.join(", ");
@@ -118,9 +163,21 @@ const isReturnedOutParameter = (context: ModuleContext, parameter: GirParameter)
118
163
  (isCallerAllocatedOut(parameter) && isCollectibleCallerOut(context, parameter)) ||
119
164
  isInoutParameter(parameter);
120
165
 
121
- const renderMethodReturnType = (context: ModuleContext, fn: GirFunction): string => {
166
+ const returnedOutParameters = (context: ModuleContext, fn: GirFunction): InputParameter[] => {
122
167
  const folded = foldedLengthIndices(context.library, fn);
123
- const outs = fn.parameters.filter((p, index) => isReturnedOutParameter(context, p) && !folded.has(index));
168
+ const result: InputParameter[] = [];
169
+
170
+ for (const [index, parameter] of fn.parameters.entries()) {
171
+ if (isReturnedOutParameter(context, parameter) && !folded.has(index)) {
172
+ result.push({ parameter, index });
173
+ }
174
+ }
175
+
176
+ return result;
177
+ };
178
+
179
+ const renderMethodReturnType = (context: ModuleContext, fn: GirFunction): string => {
180
+ const outs = returnedOutParameters(context, fn);
124
181
 
125
182
  const primary = shouldOmitPrimaryReturn(context.library, fn.returnValue)
126
183
  ? undefined
@@ -130,7 +187,7 @@ const renderMethodReturnType = (context: ModuleContext, fn: GirFunction): string
130
187
  return primary ?? "void";
131
188
  }
132
189
 
133
- const outTypes = outs.map((parameter) => renderTsType(context, parameter.type, parameter.nullable));
190
+ const outTypes = outs.map(({ parameter }) => renderTsType(context, parameter.type, parameter.nullable));
134
191
 
135
192
  return foldOutParamShape(primary, outTypes);
136
193
  };
@@ -242,7 +299,7 @@ const promisifiedArgument = (
242
299
  return arrayLengthArgument(source, sourceIndex);
243
300
  }
244
301
 
245
- return parameterCallExpression(context, parameter, index, hasSeenOptional);
302
+ return parameterCallExpression(context, parameter, index, { fn: asyncFn, isForcedNullable: hasSeenOptional });
246
303
  };
247
304
 
248
305
  const findCancellableIndex = (context: ModuleContext, parameters: GirParameter[]): number =>
@@ -253,12 +310,10 @@ const renderPromisifiedSignature = (
253
310
  asyncFn: GirFunction,
254
311
  finishFn: GirFunction,
255
312
  ): { signature: string; returnType: string } => {
256
- const signature = renderInputParameters(
257
- context,
258
- asyncFn,
259
- (parameter) => isCallbackParameter(context, parameter),
260
- (parameter) => isCancellable(context, parameter),
261
- );
313
+ const signature = renderInputParameters(context, asyncFn, {
314
+ shouldSkip: (parameter) => isCallbackParameter(context, parameter),
315
+ isOptionalExtra: (parameter) => isCancellable(context, parameter),
316
+ });
262
317
 
263
318
  const finishReturn = renderMethodReturnType(context, finishFn);
264
319
 
@@ -309,14 +364,16 @@ const paramDescriptorLiteral = (descriptor: string, options: ParamDescriptorOpti
309
364
  return `{ ${parts.join(", ")} }`;
310
365
  };
311
366
 
312
- const renderReturnDescriptor = (context: ModuleContext, fn: GirFunction): string => {
367
+ const renderReturnDescriptor = (context: ModuleContext, fn: GirFunction): ReturnDescriptorPlan => {
313
368
  const instanceOffset = fn.instance === undefined ? 0 : 1;
314
369
 
315
- return renderDescriptor(context, fn.returnValue.type, fn.returnValue.transferOwnership, {
370
+ const descriptor = renderDescriptor(context, fn.returnValue.type, fn.returnValue.transferOwnership, {
316
371
  argIndexOffset: instanceOffset,
317
372
  argIndexMap: emittedArgIndices(fn, instanceOffset),
318
373
  isNewlyCreated: fn.instance === undefined,
319
374
  });
375
+
376
+ return { descriptor, isSkipped: isSkippedPrimaryReturn(context.library, fn.returnValue) };
320
377
  };
321
378
 
322
379
  const planCallArgs = (context: ModuleContext, fn: GirFunction): CallArgPlan[] => {
@@ -405,6 +462,7 @@ const planInoutArgument = (
405
462
  : undefined;
406
463
 
407
464
  return planInoutParam(context, parameter, {
465
+ fn,
408
466
  index,
409
467
  argIndex: planContext.argIndex,
410
468
  isConsumed: folded.has(index),
@@ -433,7 +491,11 @@ const planOutParam = (
433
491
  argIndex: ArgIndexOptions,
434
492
  isConsumed: boolean,
435
493
  ): CallArgPlan => {
436
- const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, argIndex);
494
+ const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, {
495
+ ...argIndex,
496
+ cursor: parameter.cursor,
497
+ hasOutIndirection: true,
498
+ });
437
499
 
438
500
  return {
439
501
  paramLiteral: paramDescriptorLiteral(descriptor, { direction: "out", isConsumed }),
@@ -441,41 +503,19 @@ const planOutParam = (
441
503
  };
442
504
  };
443
505
 
444
- const constructibleName = (
445
- context: ModuleContext,
446
- ref: GirParameter["type"],
447
- ): { namespaceName: string; typeName: string } | undefined => {
448
- let current = ref;
449
-
450
- while (current !== undefined) {
451
- const resolved = context.library.typeFor(current);
452
-
453
- if (resolved?.kind === "alias" && resolved.value.target !== undefined) {
454
- current = resolved.value.target;
455
- continue;
456
- }
457
-
458
- return context.library.nameFor(current);
459
- }
460
-
461
- return undefined;
462
- };
463
-
464
506
  const planCallerOut = (
465
507
  context: ModuleContext,
466
508
  parameter: GirParameter,
467
509
  argIndex: ArgIndexOptions,
468
510
  ): CallArgPlan => {
469
511
  const descriptor = renderDescriptor(context, parameter.type, "none", argIndex);
470
- const name = constructibleName(context, parameter.type);
471
512
 
472
- if (name !== undefined && isCollectibleCallerOut(context, parameter)) {
513
+ if (isCollectibleCallerOut(context, parameter)) {
473
514
  context.addRuntimeImport("getHandle");
474
- const classExpression = context.qualify(name.namespaceName, name.typeName);
475
515
 
476
516
  return {
477
517
  paramLiteral: paramDescriptorLiteral(descriptor, { direction: "out", isCallerAllocated: true }),
478
- inputExpr: `new ${classExpression}()`,
518
+ inputExpr: renderCallerOutInstance(context, parameter),
479
519
  };
480
520
  }
481
521
 
@@ -486,13 +526,14 @@ const planInoutParam = (
486
526
  context: ModuleContext,
487
527
  parameter: GirParameter,
488
528
  options: {
529
+ fn: GirFunction;
489
530
  index: number;
490
531
  argIndex: ArgIndexOptions;
491
532
  isConsumed: boolean;
492
533
  lengthSource?: { source: GirParameter; index: number } | undefined;
493
534
  },
494
535
  ): CallArgPlan => {
495
- const { index, argIndex, isConsumed, lengthSource } = options;
536
+ const { fn, index, argIndex, isConsumed, lengthSource } = options;
496
537
 
497
538
  if (isHandlePassedInPlace(context, parameter)) {
498
539
  const descriptor = renderDescriptor(context, parameter.type, "none", argIndex);
@@ -507,13 +548,16 @@ const planInoutParam = (
507
548
  };
508
549
  }
509
550
 
510
- const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, argIndex);
551
+ const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, {
552
+ ...argIndex,
553
+ hasOutIndirection: true,
554
+ });
511
555
 
512
556
  return {
513
557
  paramLiteral: paramDescriptorLiteral(descriptor, { direction: "inout", isConsumed }),
514
558
  inputExpr:
515
559
  lengthSource === undefined
516
- ? parameterCallExpression(context, parameter, index)
560
+ ? parameterCallExpression(context, parameter, index, { fn })
517
561
  : arrayLengthArgument(lengthSource.source, lengthSource.index),
518
562
  };
519
563
  };
@@ -544,27 +588,30 @@ const planInParam = (
544
588
 
545
589
  return {
546
590
  paramLiteral: paramDescriptorLiteral(descriptor, {}),
547
- inputExpr: parameterCallExpression(context, parameter, index),
591
+ inputExpr: parameterCallExpression(context, parameter, index, { fn }),
548
592
  };
549
593
  };
550
594
 
595
+ const nullableHandleExpression = (name: string): string => `${name} == null ? null : getHandle(${name})`;
596
+
551
597
  const handleArgument = (context: ModuleContext, name: string, isNullable: boolean): string => {
552
- if (isNullable) {
553
- context.addRuntimeImport("tryGetHandle");
598
+ context.addRuntimeImport("getHandle");
554
599
 
555
- return `tryGetHandle(${name})`;
556
- }
600
+ return isNullable ? nullableHandleExpression(name) : `getHandle(${name})`;
601
+ };
557
602
 
558
- context.addRuntimeImport("getHandle");
603
+ const closureArgument = (context: ModuleContext, name: string, isNullable: boolean): string => {
604
+ const helper = isNullable ? "tryToClosure" : "toClosure";
605
+ context.addRuntimeImport(helper);
559
606
 
560
- return `getHandle(${name})`;
607
+ return `${helper}(${name})`;
561
608
  };
562
609
 
563
610
  const hashtableArgument = (context: ModuleContext, valueRef: TypeId, name: string): string => {
564
611
  if (isHandlePassing(context, valueRef)) {
565
- context.addRuntimeImport("tryGetHandle");
612
+ context.addRuntimeImport("getHandle");
566
613
 
567
- return `${name} ? globalThis.Array.from(${name}).map(([k, v]) => [k, tryGetHandle(v)]) : null`;
614
+ return `${name} ? globalThis.Array.from(${name}).map(([k, v]) => [k, ${nullableHandleExpression("v")}]) : null`;
568
615
  }
569
616
 
570
617
  return `${name} ? globalThis.Array.from(${name}) : null`;
@@ -604,8 +651,9 @@ const parameterCallExpression = (
604
651
  context: ModuleContext,
605
652
  parameter: GirParameter,
606
653
  index: number,
607
- isForcedNullable = false,
654
+ options: CallExpressionOptions,
608
655
  ): string => {
656
+ const { fn, isForcedNullable = false } = options;
609
657
  const name = parameterIdentifier(parameter, index);
610
658
  const ref = parameter.type;
611
659
 
@@ -615,6 +663,10 @@ const parameterCallExpression = (
615
663
 
616
664
  const isNullable = parameter.nullable || parameter.optional || isForcedNullable;
617
665
 
666
+ if (requiresClosureMarshal(context, fn, ref)) {
667
+ return closureArgument(context, name, isNullable);
668
+ }
669
+
618
670
  if (isHandlePassing(context, ref)) {
619
671
  return handleArgument(context, name, isNullable);
620
672
  }
@@ -625,9 +677,12 @@ const parameterCallExpression = (
625
677
  };
626
678
 
627
679
  export {
680
+ isCallbackParameter,
681
+ memberName,
628
682
  methodExportName,
629
683
  renderMethodSignature,
630
684
  renderMethodReturnType,
685
+ returnedOutParameters,
631
686
  renderPromisifiedBody,
632
687
  finishCallExpression,
633
688
  renderPromisifiedSignature,
@@ -1,7 +1,13 @@
1
+ import { sanitizeTypeIdentifier } from "@gtkx/utils";
1
2
  import type { TypeId } from "../../gir/type-id.js";
2
3
  import type { GirType } from "../../gir/type.js";
3
4
  import type { ModuleContext } from "../../writer/context.js";
4
5
  import { type GirParameter, isInoutParameter } from "../../gir/parameter.js";
6
+ import { recordInlineSize } from "./record-layout.js";
7
+ import { isConstructibleRecord } from "./value-marshalable.js";
8
+
9
+ type TypeName = { namespaceName: string; typeName: string };
10
+ type CallerOutAllocation = TypeName & ({ strategy: "construct" } | { strategy: "allocate"; size: number });
5
11
 
6
12
  const isHandlePassedInPlace = (context: ModuleContext, parameter: GirParameter): boolean => {
7
13
  if (parameter.direction !== "out" && parameter.direction !== "inout") {
@@ -28,14 +34,78 @@ const underlyingType = (context: ModuleContext, ref: TypeId): GirType | undefine
28
34
  const underlyingParamKind = (context: ModuleContext, parameter: GirParameter): GirType["kind"] | undefined =>
29
35
  parameter.type === undefined ? undefined : underlyingType(context, parameter.type)?.kind;
30
36
 
31
- const isCollectibleCallerOut = (context: ModuleContext, parameter: GirParameter): boolean => {
32
- const kind = underlyingParamKind(context, parameter);
37
+ const resolvedTypeName = (context: ModuleContext, ref: TypeId | undefined): TypeName | undefined => {
38
+ let current = ref;
39
+
40
+ while (current !== undefined) {
41
+ const resolved = context.library.typeFor(current);
42
+
43
+ if (resolved?.kind === "alias" && resolved.value.target !== undefined) {
44
+ current = resolved.value.target;
45
+ continue;
46
+ }
47
+
48
+ return context.library.nameFor(current);
49
+ }
50
+
51
+ return undefined;
52
+ };
53
+
54
+ const recordCallerOutAllocation = (
55
+ context: ModuleContext,
56
+ name: TypeName,
57
+ type: Extract<GirType, { kind: "record" }>,
58
+ ): CallerOutAllocation | undefined => {
59
+ const size = recordInlineSize(context, type.value);
60
+
61
+ if (size === undefined) {
62
+ return undefined;
63
+ }
64
+
65
+ return isConstructibleRecord(context, type.namespace.name, type.value)
66
+ ? { ...name, strategy: "construct" }
67
+ : { ...name, strategy: "allocate", size };
68
+ };
69
+
70
+ const callerOutAllocation = (context: ModuleContext, parameter: GirParameter): CallerOutAllocation | undefined => {
71
+ const name = resolvedTypeName(context, parameter.type);
72
+ const type = parameter.type === undefined ? undefined : underlyingType(context, parameter.type);
73
+
74
+ if (name === undefined || type === undefined) {
75
+ return undefined;
76
+ }
77
+
78
+ if (type.kind === "class") {
79
+ return { ...name, strategy: "construct" };
80
+ }
81
+
82
+ return type.kind === "record" ? recordCallerOutAllocation(context, name, type) : undefined;
83
+ };
84
+
85
+ const renderCallerOutInstance = (context: ModuleContext, parameter: GirParameter): string => {
86
+ const allocation = callerOutAllocation(context, parameter);
87
+
88
+ if (allocation === undefined) {
89
+ throw new Error("renderCallerOutInstance: expected a caller-allocated out-parameter with a known layout");
90
+ }
91
+
92
+ const classExpression = context.qualify(allocation.namespaceName, sanitizeTypeIdentifier(allocation.typeName));
33
93
 
34
- return kind === "record" || kind === "class";
94
+ if (allocation.strategy === "construct") {
95
+ return `new ${classExpression}()`;
96
+ }
97
+
98
+ context.addRuntimeImport("alloc");
99
+ context.addRuntimeImport("wrapHandle");
100
+
101
+ return `wrapHandle(alloc(${String(allocation.size)}), ${classExpression})`;
35
102
  };
36
103
 
37
- const isRecordCallerOut = (context: ModuleContext, parameter: GirParameter): boolean =>
38
- underlyingParamKind(context, parameter) === "record";
104
+ const isCollectibleCallerOut = (context: ModuleContext, parameter: GirParameter): boolean =>
105
+ callerOutAllocation(context, parameter) !== undefined;
106
+
107
+ const isAllocatableCallerOut = (context: ModuleContext, parameter: GirParameter): boolean =>
108
+ underlyingParamKind(context, parameter) === "record" && isCollectibleCallerOut(context, parameter);
39
109
 
40
110
  const isRecordInout = (context: ModuleContext, parameter: GirParameter): boolean =>
41
111
  isInoutParameter(parameter) && underlyingParamKind(context, parameter) === "record";
@@ -68,4 +138,19 @@ const isHandlePassing = (context: ModuleContext, ref: TypeId): boolean => {
68
138
  }
69
139
  };
70
140
 
71
- export { isHandlePassedInPlace, isCollectibleCallerOut, isRecordCallerOut, isRecordInout, isHandlePassing };
141
+ const isClosureType = (context: ModuleContext, ref: TypeId): boolean => {
142
+ const name = context.library.nameFor(ref);
143
+
144
+ return name?.namespaceName === "GObject" && name.typeName === "Closure";
145
+ };
146
+
147
+ export {
148
+ isAllocatableCallerOut,
149
+ isClosureType,
150
+ isHandlePassedInPlace,
151
+ isCollectibleCallerOut,
152
+ isRecordInout,
153
+ isHandlePassing,
154
+ renderCallerOutInstance,
155
+ underlyingType,
156
+ };
@@ -1,16 +1,18 @@
1
+ import { sanitizeTypeIdentifier } from "@gtkx/utils";
1
2
  import type { GirClass } from "../../gir/class.js";
2
3
  import type { Library } from "../../gir/library.js";
3
4
  import type { GirAlias, GirNamespace } from "../../gir/namespace.js";
4
5
  import { renderTsType } from "../../analysis/ts-type.js";
6
+ import { getParentRef } from "../../gir/ancestry.js";
7
+ import { isEmittableEntity } from "../../gir/emittable.js";
5
8
  import { PRIMITIVE_TS_TYPE, primitiveCategory } from "../../gir/primitives.js";
6
- import { splitOptionalNamespace } from "../../gir/type-ref.js";
7
9
  import { ModuleContext } from "../../writer/context.js";
8
- import { renderJsDoc } from "../../writer/doc.js";
9
10
  import { generateCallback } from "./callback.js";
10
11
  import { generateClass } from "./class.js";
11
12
  import { generateConstant } from "./constant.js";
13
+ import { getDoc } from "./doc-spec.js";
12
14
  import { generateEnum } from "./enum.js";
13
- import { generateNamespaceBootstrap, generateNamespaceFunction } from "./function.js";
15
+ import { generateNamespaceFunction } from "./function.js";
14
16
  import { generateInterface } from "./interface.js";
15
17
  import { generateRecord } from "./record.js";
16
18
 
@@ -28,6 +30,14 @@ const generateNamespaceModule = (namespace: GirNamespace, library: Library): str
28
30
  generateNamespaceTypes(context, namespace);
29
31
  generateNamespaceMembers(context, namespace);
30
32
 
33
+ if (!context.module.hasExports()) {
34
+ throw new Error(
35
+ `GIR file at ${namespace.girFile} has nothing to generate: its ${namespace.name} namespace produces a ` +
36
+ "module with no exports, so the file is empty, truncated, or declares only entries GIR marks as not " +
37
+ "introspectable",
38
+ );
39
+ }
40
+
31
41
  return context.module.toSource();
32
42
  };
33
43
 
@@ -58,8 +68,6 @@ const generateNamespaceMembers = (context: ModuleContext, namespace: GirNamespac
58
68
  generateNamespaceFunction(context, fn);
59
69
  }
60
70
 
61
- generateNamespaceBootstrap(context, namespace);
62
-
63
71
  for (const constant of namespace.constants) {
64
72
  generateConstant(context, constant);
65
73
  }
@@ -70,9 +78,20 @@ const generateNamespaceMembers = (context: ModuleContext, namespace: GirNamespac
70
78
  };
71
79
 
72
80
  const generateAlias = (context: ModuleContext, alias: GirAlias): void => {
81
+ if (!isEmittableEntity(alias)) {
82
+ return;
83
+ }
84
+
73
85
  const category = alias.cType === undefined ? undefined : primitiveCategory(alias.cType);
74
86
  const targetType = category === "gtype" ? PRIMITIVE_TS_TYPE.gtype : renderTsType(context, alias.target);
75
- context.module.appendDeclaration(`${renderJsDoc(alias.doc)}export type ${alias.name} = ${targetType};`);
87
+ const doc = getDoc(alias);
88
+ const name = sanitizeTypeIdentifier(alias.name);
89
+
90
+ context.declare({
91
+ name,
92
+ code: `${doc}export type ${name} = ${targetType};`,
93
+ owner: alias.name,
94
+ });
76
95
  };
77
96
 
78
97
  const visitClass = (state: TopologicalState, klass: GirClass): void => {
@@ -119,17 +138,13 @@ const sameNamespaceParent = (
119
138
  namespaceName: string,
120
139
  byLocalName: Map<string, GirClass>,
121
140
  ): GirClass | undefined => {
122
- if (klass.parent === undefined) {
123
- return undefined;
124
- }
125
-
126
- const [parentNamespace, typeName] = splitOptionalNamespace(klass.parent);
141
+ const parent = getParentRef(klass);
127
142
 
128
- if (parentNamespace !== undefined && parentNamespace !== namespaceName) {
143
+ if (parent === undefined || (parent.namespaceName !== undefined && parent.namespaceName !== namespaceName)) {
129
144
  return undefined;
130
145
  }
131
146
 
132
- return byLocalName.get(typeName);
147
+ return byLocalName.get(parent.typeName);
133
148
  };
134
149
 
135
150
  export { generateNamespaceModule };
@@ -1,13 +1,15 @@
1
1
  import type { GirClass } from "../../gir/class.js";
2
2
  import type { ModuleContext } from "../../writer/context.js";
3
+ import type { Declaration } from "../../writer/module.js";
3
4
  import { collectInterfaceProperties } from "../../analysis/inheritance.js";
4
5
  import { renderBracedOrEmpty } from "../../writer/emit.js";
5
6
  import { parentCompanionRef } from "./companion.js";
6
- import { type ResolvedAccessor, resolveOwnerAccessor } from "./property-accessor.js";
7
+ import { propertyDoc, type ResolvedAccessor, resolveOwnerAccessor } from "./property-accessor.js";
7
8
 
8
9
  const PROPERTIES_SUFFIX = "Properties";
9
10
 
10
- const propertyEntry = (accessor: ResolvedAccessor): string => `${accessor.jsName}: ${accessor.tsType};`;
11
+ const propertyEntry = (accessor: ResolvedAccessor): string =>
12
+ `${propertyDoc(accessor.property)}${accessor.jsName}: ${accessor.readType};`;
11
13
 
12
14
  const interfaceEntries = (context: ModuleContext, klass: GirClass): string[] => {
13
15
  const entries: string[] = [];
@@ -30,7 +32,7 @@ const renderPropertyDeclarations = (
30
32
  klass: GirClass,
31
33
  className: string,
32
34
  accessors: ResolvedAccessor[],
33
- ): string[] => {
35
+ ): Declaration[] => {
34
36
  const parentRef = parentCompanionRef(context, klass, PROPERTIES_SUFFIX);
35
37
  const extendsClause = parentRef === undefined ? "" : ` extends ${parentRef}`;
36
38
 
@@ -42,8 +44,11 @@ const renderPropertyDeclarations = (
42
44
  const map = `${className}${PROPERTIES_SUFFIX}`;
43
45
 
44
46
  return [
45
- renderBracedOrEmpty(`export interface ${map}${extendsClause}`, entries.join("\n")),
46
- renderBracedOrEmpty(`export interface ${className}`, `__properties__: ${map};`),
47
+ { name: map, code: renderBracedOrEmpty(`export interface ${map}${extendsClause}`, entries.join("\n")) },
48
+ {
49
+ name: className,
50
+ code: renderBracedOrEmpty(`export interface ${className}`, `__properties__: ${map};`),
51
+ },
47
52
  ];
48
53
  };
49
54