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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/dist/analysis/descriptor-render.d.ts +18 -11
  2. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  3. package/dist/analysis/descriptor-render.js +275 -152
  4. package/dist/analysis/descriptor-render.js.map +1 -1
  5. package/dist/analysis/descriptor.d.ts +37 -34
  6. package/dist/analysis/descriptor.d.ts.map +1 -1
  7. package/dist/analysis/descriptor.js +34 -30
  8. package/dist/analysis/descriptor.js.map +1 -1
  9. package/dist/analysis/inheritance.d.ts +16 -16
  10. package/dist/analysis/inheritance.d.ts.map +1 -1
  11. package/dist/analysis/inheritance.js +139 -84
  12. package/dist/analysis/inheritance.js.map +1 -1
  13. package/dist/analysis/param-structure.d.ts +14 -13
  14. package/dist/analysis/param-structure.d.ts.map +1 -1
  15. package/dist/analysis/param-structure.js +104 -53
  16. package/dist/analysis/param-structure.js.map +1 -1
  17. package/dist/analysis/ts-type.d.ts +6 -5
  18. package/dist/analysis/ts-type.d.ts.map +1 -1
  19. package/dist/analysis/ts-type.js +69 -23
  20. package/dist/analysis/ts-type.js.map +1 -1
  21. package/dist/compile.d.ts +5 -5
  22. package/dist/compile.d.ts.map +1 -1
  23. package/dist/compile.js +70 -63
  24. package/dist/compile.js.map +1 -1
  25. package/dist/docs/api-reference.d.ts +12 -11
  26. package/dist/docs/api-reference.d.ts.map +1 -1
  27. package/dist/docs/api-reference.js +194 -121
  28. package/dist/docs/api-reference.js.map +1 -1
  29. package/dist/docs/element-page.d.ts +6 -9
  30. package/dist/docs/element-page.d.ts.map +1 -1
  31. package/dist/docs/element-page.js +68 -133
  32. package/dist/docs/element-page.js.map +1 -1
  33. package/dist/docs/pipeline.d.ts +8 -7
  34. package/dist/docs/pipeline.d.ts.map +1 -1
  35. package/dist/docs/pipeline.js +79 -53
  36. package/dist/docs/pipeline.js.map +1 -1
  37. package/dist/docs/render.d.ts +21 -19
  38. package/dist/docs/render.d.ts.map +1 -1
  39. package/dist/docs/render.js +80 -71
  40. package/dist/docs/render.js.map +1 -1
  41. package/dist/docs/symbol-page.d.ts +6 -6
  42. package/dist/docs/symbol-page.d.ts.map +1 -1
  43. package/dist/docs/symbol-page.js +126 -84
  44. package/dist/docs/symbol-page.js.map +1 -1
  45. package/dist/fingerprint.d.ts +28 -5
  46. package/dist/fingerprint.d.ts.map +1 -1
  47. package/dist/fingerprint.js +66 -13
  48. package/dist/fingerprint.js.map +1 -1
  49. package/dist/gi.d.ts +13 -0
  50. package/dist/gi.d.ts.map +1 -0
  51. package/dist/gi.js +21 -0
  52. package/dist/gi.js.map +1 -0
  53. package/dist/gir/ancestry.d.ts +4 -3
  54. package/dist/gir/ancestry.d.ts.map +1 -1
  55. package/dist/gir/ancestry.js +12 -15
  56. package/dist/gir/ancestry.js.map +1 -1
  57. package/dist/gir/callback.d.ts +6 -11
  58. package/dist/gir/callback.d.ts.map +1 -1
  59. package/dist/gir/callback.js +6 -7
  60. package/dist/gir/callback.js.map +1 -1
  61. package/dist/gir/class.d.ts +7 -5
  62. package/dist/gir/class.d.ts.map +1 -1
  63. package/dist/gir/class.js +14 -12
  64. package/dist/gir/class.js.map +1 -1
  65. package/dist/gir/enum.d.ts +3 -3
  66. package/dist/gir/enum.d.ts.map +1 -1
  67. package/dist/gir/enum.js +7 -6
  68. package/dist/gir/enum.js.map +1 -1
  69. package/dist/gir/field.d.ts +8 -3
  70. package/dist/gir/field.d.ts.map +1 -1
  71. package/dist/gir/field.js +30 -7
  72. package/dist/gir/field.js.map +1 -1
  73. package/dist/gir/function.d.ts +6 -3
  74. package/dist/gir/function.d.ts.map +1 -1
  75. package/dist/gir/function.js +23 -7
  76. package/dist/gir/function.js.map +1 -1
  77. package/dist/gir/gir-path.d.ts +2 -1
  78. package/dist/gir/gir-path.d.ts.map +1 -1
  79. package/dist/gir/gir-path.js +26 -10
  80. package/dist/gir/gir-path.js.map +1 -1
  81. package/dist/gir/libraries.d.ts +3 -2
  82. package/dist/gir/libraries.d.ts.map +1 -1
  83. package/dist/gir/libraries.js +39 -27
  84. package/dist/gir/libraries.js.map +1 -1
  85. package/dist/gir/library.d.ts +17 -11
  86. package/dist/gir/library.d.ts.map +1 -1
  87. package/dist/gir/library.js +116 -92
  88. package/dist/gir/library.js.map +1 -1
  89. package/dist/gir/namespace.d.ts +10 -10
  90. package/dist/gir/namespace.d.ts.map +1 -1
  91. package/dist/gir/namespace.js +21 -20
  92. package/dist/gir/namespace.js.map +1 -1
  93. package/dist/gir/nullable-overrides.d.ts +3 -0
  94. package/dist/gir/nullable-overrides.d.ts.map +1 -0
  95. package/dist/gir/nullable-overrides.js +5 -0
  96. package/dist/gir/nullable-overrides.js.map +1 -0
  97. package/dist/gir/parameter.d.ts +14 -12
  98. package/dist/gir/parameter.d.ts.map +1 -1
  99. package/dist/gir/parameter.js +27 -18
  100. package/dist/gir/parameter.js.map +1 -1
  101. package/dist/gir/parse.d.ts +12 -13
  102. package/dist/gir/parse.d.ts.map +1 -1
  103. package/dist/gir/parse.js +50 -40
  104. package/dist/gir/parse.js.map +1 -1
  105. package/dist/gir/primitives.d.ts +5 -4
  106. package/dist/gir/primitives.d.ts.map +1 -1
  107. package/dist/gir/primitives.js +4 -3
  108. package/dist/gir/primitives.js.map +1 -1
  109. package/dist/gir/property.d.ts +5 -4
  110. package/dist/gir/property.d.ts.map +1 -1
  111. package/dist/gir/property.js +10 -9
  112. package/dist/gir/property.js.map +1 -1
  113. package/dist/gir/record.d.ts +5 -4
  114. package/dist/gir/record.d.ts.map +1 -1
  115. package/dist/gir/record.js +13 -12
  116. package/dist/gir/record.js.map +1 -1
  117. package/dist/gir/size.d.ts +6 -5
  118. package/dist/gir/size.d.ts.map +1 -1
  119. package/dist/gir/size.js +49 -47
  120. package/dist/gir/size.js.map +1 -1
  121. package/dist/gir/type-id.d.ts +17 -15
  122. package/dist/gir/type-id.d.ts.map +1 -1
  123. package/dist/gir/type-id.js +5 -1
  124. package/dist/gir/type-id.js.map +1 -1
  125. package/dist/gir/type-ref.d.ts +3 -2
  126. package/dist/gir/type-ref.d.ts.map +1 -1
  127. package/dist/gir/type-ref.js +36 -25
  128. package/dist/gir/type-ref.js.map +1 -1
  129. package/dist/gir/type.d.ts +3 -2
  130. package/dist/gir/type.d.ts.map +1 -1
  131. package/dist/gir/type.js.map +1 -1
  132. package/dist/index.d.ts +2 -0
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +1 -0
  135. package/dist/index.js.map +1 -1
  136. package/dist/jsx.d.ts +26 -0
  137. package/dist/jsx.d.ts.map +1 -0
  138. package/dist/jsx.js +40 -0
  139. package/dist/jsx.js.map +1 -0
  140. package/dist/khronos/args.d.ts +7 -7
  141. package/dist/khronos/args.d.ts.map +1 -1
  142. package/dist/khronos/args.js +88 -67
  143. package/dist/khronos/args.js.map +1 -1
  144. package/dist/khronos/jsdoc.d.ts +4 -4
  145. package/dist/khronos/jsdoc.d.ts.map +1 -1
  146. package/dist/khronos/jsdoc.js +29 -16
  147. package/dist/khronos/jsdoc.js.map +1 -1
  148. package/dist/khronos/model.d.ts +8 -7
  149. package/dist/khronos/model.d.ts.map +1 -1
  150. package/dist/khronos/model.js +94 -59
  151. package/dist/khronos/model.js.map +1 -1
  152. package/dist/khronos/modules.d.ts +4 -3
  153. package/dist/khronos/modules.d.ts.map +1 -1
  154. package/dist/khronos/modules.js +40 -25
  155. package/dist/khronos/modules.js.map +1 -1
  156. package/dist/khronos/param-pair.d.ts +11 -0
  157. package/dist/khronos/param-pair.d.ts.map +1 -0
  158. package/dist/khronos/param-pair.js +6 -0
  159. package/dist/khronos/param-pair.js.map +1 -0
  160. package/dist/khronos/parse.d.ts +7 -8
  161. package/dist/khronos/parse.d.ts.map +1 -1
  162. package/dist/khronos/parse.js +17 -16
  163. package/dist/khronos/parse.js.map +1 -1
  164. package/dist/khronos/pipeline.d.ts +4 -4
  165. package/dist/khronos/pipeline.d.ts.map +1 -1
  166. package/dist/khronos/pipeline.js +97 -56
  167. package/dist/khronos/pipeline.js.map +1 -1
  168. package/dist/khronos/plan.d.ts +11 -10
  169. package/dist/khronos/plan.d.ts.map +1 -1
  170. package/dist/khronos/plan.js +109 -45
  171. package/dist/khronos/plan.js.map +1 -1
  172. package/dist/khronos/render.d.ts +5 -4
  173. package/dist/khronos/render.d.ts.map +1 -1
  174. package/dist/khronos/render.js +106 -59
  175. package/dist/khronos/render.js.map +1 -1
  176. package/dist/khronos/select.d.ts +4 -4
  177. package/dist/khronos/select.d.ts.map +1 -1
  178. package/dist/khronos/select.js +30 -19
  179. package/dist/khronos/select.js.map +1 -1
  180. package/dist/react/element-config.d.ts +17 -0
  181. package/dist/react/element-config.d.ts.map +1 -0
  182. package/dist/react/element-config.js +61 -0
  183. package/dist/react/element-config.js.map +1 -0
  184. package/dist/runner.d.ts +17 -10
  185. package/dist/runner.d.ts.map +1 -1
  186. package/dist/runner.js +45 -43
  187. package/dist/runner.js.map +1 -1
  188. package/dist/store/compile-store.d.ts +5 -3
  189. package/dist/store/compile-store.d.ts.map +1 -1
  190. package/dist/store/compile-store.js +24 -22
  191. package/dist/store/compile-store.js.map +1 -1
  192. package/dist/store/gi/async.d.ts +2 -1
  193. package/dist/store/gi/async.d.ts.map +1 -1
  194. package/dist/store/gi/async.js +28 -24
  195. package/dist/store/gi/async.js.map +1 -1
  196. package/dist/store/gi/callables.d.ts +26 -20
  197. package/dist/store/gi/callables.d.ts.map +1 -1
  198. package/dist/store/gi/callables.js +162 -100
  199. package/dist/store/gi/callables.js.map +1 -1
  200. package/dist/store/gi/callback.d.ts +3 -2
  201. package/dist/store/gi/callback.d.ts.map +1 -1
  202. package/dist/store/gi/callback.js +6 -3
  203. package/dist/store/gi/callback.js.map +1 -1
  204. package/dist/store/gi/class-struct-record.d.ts +4 -3
  205. package/dist/store/gi/class-struct-record.d.ts.map +1 -1
  206. package/dist/store/gi/class-struct-record.js +33 -15
  207. package/dist/store/gi/class-struct-record.js.map +1 -1
  208. package/dist/store/gi/class.d.ts +2 -1
  209. package/dist/store/gi/class.d.ts.map +1 -1
  210. package/dist/store/gi/class.js +86 -47
  211. package/dist/store/gi/class.js.map +1 -1
  212. package/dist/store/gi/companion.d.ts +2 -1
  213. package/dist/store/gi/companion.d.ts.map +1 -1
  214. package/dist/store/gi/companion.js +8 -5
  215. package/dist/store/gi/companion.js.map +1 -1
  216. package/dist/store/gi/constant.d.ts +3 -2
  217. package/dist/store/gi/constant.d.ts.map +1 -1
  218. package/dist/store/gi/constant.js +25 -8
  219. package/dist/store/gi/constant.js.map +1 -1
  220. package/dist/store/gi/constructor-props.d.ts +3 -2
  221. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  222. package/dist/store/gi/constructor-props.js +17 -10
  223. package/dist/store/gi/constructor-props.js.map +1 -1
  224. package/dist/store/gi/enum.d.ts +3 -2
  225. package/dist/store/gi/enum.d.ts.map +1 -1
  226. package/dist/store/gi/enum.js +14 -11
  227. package/dist/store/gi/enum.js.map +1 -1
  228. package/dist/store/gi/function.d.ts +5 -4
  229. package/dist/store/gi/function.d.ts.map +1 -1
  230. package/dist/store/gi/function.js +50 -23
  231. package/dist/store/gi/function.js.map +1 -1
  232. package/dist/store/gi/gtype-binding.d.ts +4 -4
  233. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  234. package/dist/store/gi/gtype-binding.js +15 -11
  235. package/dist/store/gi/gtype-binding.js.map +1 -1
  236. package/dist/store/gi/interface.d.ts +2 -1
  237. package/dist/store/gi/interface.d.ts.map +1 -1
  238. package/dist/store/gi/interface.js +36 -18
  239. package/dist/store/gi/interface.js.map +1 -1
  240. package/dist/store/gi/item-comparators.d.ts +3 -2
  241. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  242. package/dist/store/gi/item-comparators.js +33 -21
  243. package/dist/store/gi/item-comparators.js.map +1 -1
  244. package/dist/store/gi/method.d.ts +13 -13
  245. package/dist/store/gi/method.d.ts.map +1 -1
  246. package/dist/store/gi/method.js +187 -130
  247. package/dist/store/gi/method.js.map +1 -1
  248. package/dist/store/gi/param-marshal.d.ts +7 -6
  249. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  250. package/dist/store/gi/param-marshal.js +26 -13
  251. package/dist/store/gi/param-marshal.js.map +1 -1
  252. package/dist/store/gi/pipeline.d.ts +2 -1
  253. package/dist/store/gi/pipeline.d.ts.map +1 -1
  254. package/dist/store/gi/pipeline.js +38 -23
  255. package/dist/store/gi/pipeline.js.map +1 -1
  256. package/dist/store/gi/properties.d.ts +2 -1
  257. package/dist/store/gi/properties.d.ts.map +1 -1
  258. package/dist/store/gi/properties.js +6 -4
  259. package/dist/store/gi/properties.js.map +1 -1
  260. package/dist/store/gi/property-accessor.d.ts +11 -10
  261. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  262. package/dist/store/gi/property-accessor.js +86 -60
  263. package/dist/store/gi/property-accessor.js.map +1 -1
  264. package/dist/store/gi/record-constructor.d.ts +3 -2
  265. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  266. package/dist/store/gi/record-constructor.js +36 -25
  267. package/dist/store/gi/record-constructor.js.map +1 -1
  268. package/dist/store/gi/record-field-accessor.d.ts +8 -8
  269. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  270. package/dist/store/gi/record-field-accessor.js +171 -99
  271. package/dist/store/gi/record-field-accessor.js.map +1 -1
  272. package/dist/store/gi/record-layout.d.ts +6 -5
  273. package/dist/store/gi/record-layout.d.ts.map +1 -1
  274. package/dist/store/gi/record-layout.js +75 -39
  275. package/dist/store/gi/record-layout.js.map +1 -1
  276. package/dist/store/gi/record.d.ts +2 -1
  277. package/dist/store/gi/record.d.ts.map +1 -1
  278. package/dist/store/gi/record.js +19 -13
  279. package/dist/store/gi/record.js.map +1 -1
  280. package/dist/store/gi/registration.d.ts +3 -3
  281. package/dist/store/gi/registration.d.ts.map +1 -1
  282. package/dist/store/gi/registration.js +3 -2
  283. package/dist/store/gi/registration.js.map +1 -1
  284. package/dist/store/gi/return-wrap.d.ts +2 -2
  285. package/dist/store/gi/return-wrap.d.ts.map +1 -1
  286. package/dist/store/gi/return-wrap.js +43 -22
  287. package/dist/store/gi/return-wrap.js.map +1 -1
  288. package/dist/store/gi/runtime-override.d.ts +2 -1
  289. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  290. package/dist/store/gi/runtime-override.js +6 -3
  291. package/dist/store/gi/runtime-override.js.map +1 -1
  292. package/dist/store/gi/signal.d.ts +3 -2
  293. package/dist/store/gi/signal.d.ts.map +1 -1
  294. package/dist/store/gi/signal.js +113 -66
  295. package/dist/store/gi/signal.js.map +1 -1
  296. package/dist/store/gi/vtable.d.ts +2 -1
  297. package/dist/store/gi/vtable.d.ts.map +1 -1
  298. package/dist/store/gi/vtable.js +60 -30
  299. package/dist/store/gi/vtable.js.map +1 -1
  300. package/dist/store/gi-store.d.ts +5 -4
  301. package/dist/store/gi-store.d.ts.map +1 -1
  302. package/dist/store/gi-store.js +4 -2
  303. package/dist/store/gi-store.js.map +1 -1
  304. package/dist/store/jsx/element-components.d.ts +23 -0
  305. package/dist/store/jsx/element-components.d.ts.map +1 -0
  306. package/dist/store/jsx/element-components.js +86 -0
  307. package/dist/store/jsx/element-components.js.map +1 -0
  308. package/dist/store/jsx/element-prop-imports.d.ts +17 -0
  309. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -0
  310. package/dist/store/jsx/element-prop-imports.js +15 -0
  311. package/dist/store/jsx/element-prop-imports.js.map +1 -0
  312. package/dist/store/jsx/element-prop-types.d.ts +10 -0
  313. package/dist/store/jsx/element-prop-types.d.ts.map +1 -0
  314. package/dist/store/jsx/element-prop-types.js +41 -0
  315. package/dist/store/jsx/element-prop-types.js.map +1 -0
  316. package/dist/store/jsx/gir-index.d.ts +16 -0
  317. package/dist/store/jsx/gir-index.d.ts.map +1 -0
  318. package/dist/store/jsx/gir-index.js +33 -0
  319. package/dist/store/jsx/gir-index.js.map +1 -0
  320. package/dist/store/jsx/intrinsic-elements.d.ts +27 -0
  321. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -0
  322. package/dist/store/jsx/intrinsic-elements.js +128 -0
  323. package/dist/store/jsx/intrinsic-elements.js.map +1 -0
  324. package/dist/store/{react → jsx}/jsx.d.ts +2 -4
  325. package/dist/store/jsx/jsx.d.ts.map +1 -0
  326. package/dist/store/{react → jsx}/jsx.js +110 -71
  327. package/dist/store/jsx/jsx.js.map +1 -0
  328. package/dist/store/jsx/metadata.d.ts +4 -0
  329. package/dist/store/jsx/metadata.d.ts.map +1 -0
  330. package/dist/store/{react → jsx}/metadata.js +148 -69
  331. package/dist/store/jsx/metadata.js.map +1 -0
  332. package/dist/store/jsx/pipeline.d.ts +21 -0
  333. package/dist/store/jsx/pipeline.d.ts.map +1 -0
  334. package/dist/store/{react → jsx}/pipeline.js +36 -15
  335. package/dist/store/jsx/pipeline.js.map +1 -0
  336. package/dist/store/{react → jsx}/props.d.ts +9 -12
  337. package/dist/store/jsx/props.d.ts.map +1 -0
  338. package/dist/store/jsx/props.js +158 -0
  339. package/dist/store/jsx/props.js.map +1 -0
  340. package/dist/store/jsx-store.d.ts +5 -3
  341. package/dist/store/jsx-store.d.ts.map +1 -1
  342. package/dist/store/jsx-store.js +4 -1
  343. package/dist/store/jsx-store.js.map +1 -1
  344. package/dist/store/store-fs.d.ts +14 -12
  345. package/dist/store/store-fs.d.ts.map +1 -1
  346. package/dist/store/store-fs.js +9 -7
  347. package/dist/store/store-fs.js.map +1 -1
  348. package/dist/writer/context.d.ts +2 -1
  349. package/dist/writer/context.d.ts.map +1 -1
  350. package/dist/writer/context.js +12 -6
  351. package/dist/writer/context.js.map +1 -1
  352. package/dist/writer/doc.d.ts +2 -1
  353. package/dist/writer/doc.d.ts.map +1 -1
  354. package/dist/writer/doc.js +13 -7
  355. package/dist/writer/doc.js.map +1 -1
  356. package/dist/writer/emit.d.ts +8 -7
  357. package/dist/writer/emit.d.ts.map +1 -1
  358. package/dist/writer/emit.js +13 -10
  359. package/dist/writer/emit.js.map +1 -1
  360. package/dist/writer/gtk-doc.d.ts +2 -1
  361. package/dist/writer/gtk-doc.d.ts.map +1 -1
  362. package/dist/writer/gtk-doc.js +29 -18
  363. package/dist/writer/gtk-doc.js.map +1 -1
  364. package/dist/writer/imports.d.ts +4 -2
  365. package/dist/writer/imports.d.ts.map +1 -1
  366. package/dist/writer/imports.js +35 -24
  367. package/dist/writer/imports.js.map +1 -1
  368. package/dist/writer/module.d.ts +3 -2
  369. package/dist/writer/module.d.ts.map +1 -1
  370. package/dist/writer/module.js +16 -9
  371. package/dist/writer/module.js.map +1 -1
  372. package/dist/xml.d.ts +4 -0
  373. package/dist/xml.d.ts.map +1 -0
  374. package/dist/xml.js +10 -0
  375. package/dist/xml.js.map +1 -0
  376. package/overrides/cairo/context.ts.ejs +7 -7
  377. package/overrides/cairo/matrix.ts.ejs +2 -2
  378. package/overrides/cairo/recording-surface.ts.ejs +2 -2
  379. package/overrides/cairo/region.ts.ejs +1 -1
  380. package/overrides/cairo/scaled-font.ts.ejs +3 -3
  381. package/package.json +15 -9
  382. package/src/analysis/descriptor-render.ts +484 -168
  383. package/src/analysis/descriptor.ts +162 -125
  384. package/src/analysis/inheritance.ts +286 -98
  385. package/src/analysis/param-structure.ts +188 -57
  386. package/src/analysis/ts-type.ts +112 -26
  387. package/src/compile.ts +103 -76
  388. package/src/docs/api-reference.ts +340 -144
  389. package/src/docs/element-page.ts +137 -146
  390. package/src/docs/pipeline.ts +132 -73
  391. package/src/docs/render.ts +151 -87
  392. package/src/docs/symbol-page.ts +268 -123
  393. package/src/fingerprint.ts +127 -29
  394. package/src/gi.ts +26 -0
  395. package/src/gir/ancestry.ts +26 -14
  396. package/src/gir/callback.ts +10 -15
  397. package/src/gir/class.ts +20 -16
  398. package/src/gir/enum.ts +9 -7
  399. package/src/gir/field.ts +37 -8
  400. package/src/gir/function.ts +33 -9
  401. package/src/gir/gir-path.ts +36 -12
  402. package/src/gir/libraries.ts +56 -31
  403. package/src/gir/library.ts +200 -97
  404. package/src/gir/namespace.ts +42 -26
  405. package/src/gir/nullable-overrides.ts +5 -0
  406. package/src/gir/parameter.ts +80 -42
  407. package/src/gir/parse.ts +102 -47
  408. package/src/gir/primitives.ts +25 -23
  409. package/src/gir/property.ts +13 -11
  410. package/src/gir/record.ts +16 -14
  411. package/src/gir/size.ts +91 -58
  412. package/src/gir/type-id.ts +33 -18
  413. package/src/gir/type-ref.ts +62 -26
  414. package/src/gir/type.ts +10 -8
  415. package/src/index.ts +7 -0
  416. package/src/jsx.ts +70 -0
  417. package/src/khronos/args.ts +158 -89
  418. package/src/khronos/jsdoc.ts +67 -29
  419. package/src/khronos/model.ts +154 -53
  420. package/src/khronos/modules.ts +67 -27
  421. package/src/khronos/param-pair.ts +14 -0
  422. package/src/khronos/parse.ts +37 -17
  423. package/src/khronos/pipeline.ts +193 -90
  424. package/src/khronos/plan.ts +235 -86
  425. package/src/khronos/render.ts +208 -71
  426. package/src/khronos/select.ts +48 -18
  427. package/src/react/element-config.ts +91 -0
  428. package/src/runner.ts +93 -57
  429. package/src/store/compile-store.ts +32 -26
  430. package/src/store/gi/async.ts +48 -21
  431. package/src/store/gi/callables.ts +345 -136
  432. package/src/store/gi/callback.ts +13 -4
  433. package/src/store/gi/class-struct-record.ts +49 -17
  434. package/src/store/gi/class.ts +186 -64
  435. package/src/store/gi/companion.ts +15 -6
  436. package/src/store/gi/constant.ts +42 -8
  437. package/src/store/gi/constructor-props.ts +42 -16
  438. package/src/store/gi/enum.ts +28 -13
  439. package/src/store/gi/function.ts +90 -24
  440. package/src/store/gi/gtype-binding.ts +31 -18
  441. package/src/store/gi/interface.ts +101 -36
  442. package/src/store/gi/item-comparators.ts +74 -26
  443. package/src/store/gi/method.ts +376 -159
  444. package/src/store/gi/param-marshal.ts +38 -15
  445. package/src/store/gi/pipeline.ts +72 -22
  446. package/src/store/gi/properties.ts +16 -5
  447. package/src/store/gi/property-accessor.ts +192 -84
  448. package/src/store/gi/record-constructor.ts +62 -30
  449. package/src/store/gi/record-field-accessor.ts +380 -167
  450. package/src/store/gi/record-layout.ts +130 -43
  451. package/src/store/gi/record.ts +37 -14
  452. package/src/store/gi/registration.ts +15 -9
  453. package/src/store/gi/return-wrap.ts +71 -23
  454. package/src/store/gi/runtime-override.ts +13 -3
  455. package/src/store/gi/signal.ts +244 -104
  456. package/src/store/gi/vtable.ts +117 -41
  457. package/src/store/gi-store.ts +26 -13
  458. package/src/store/jsx/element-components.ts +152 -0
  459. package/src/store/jsx/element-prop-imports.ts +24 -0
  460. package/src/store/jsx/element-prop-types.ts +59 -0
  461. package/src/store/jsx/gir-index.ts +62 -0
  462. package/src/store/jsx/intrinsic-elements.ts +262 -0
  463. package/src/store/{react → jsx}/jsx.ts +213 -99
  464. package/src/store/jsx/metadata.ts +385 -0
  465. package/src/store/jsx/pipeline.ts +145 -0
  466. package/src/store/jsx/props.ts +274 -0
  467. package/src/store/jsx-store.ts +15 -3
  468. package/src/store/store-fs.ts +36 -20
  469. package/src/writer/context.ts +25 -6
  470. package/src/writer/doc.ts +19 -5
  471. package/src/writer/emit.ts +20 -11
  472. package/src/writer/gtk-doc.ts +48 -21
  473. package/src/writer/imports.ts +63 -28
  474. package/src/writer/module.ts +35 -11
  475. package/src/xml.ts +12 -0
  476. package/dist/store/react/built-ins.d.ts +0 -9
  477. package/dist/store/react/built-ins.d.ts.map +0 -1
  478. package/dist/store/react/built-ins.js +0 -226
  479. package/dist/store/react/built-ins.js.map +0 -1
  480. package/dist/store/react/element-components.d.ts +0 -15
  481. package/dist/store/react/element-components.d.ts.map +0 -1
  482. package/dist/store/react/element-components.js +0 -92
  483. package/dist/store/react/element-components.js.map +0 -1
  484. package/dist/store/react/element-prop-types.d.ts +0 -19
  485. package/dist/store/react/element-prop-types.d.ts.map +0 -1
  486. package/dist/store/react/element-prop-types.js +0 -244
  487. package/dist/store/react/element-prop-types.js.map +0 -1
  488. package/dist/store/react/element-props.d.ts +0 -4
  489. package/dist/store/react/element-props.d.ts.map +0 -1
  490. package/dist/store/react/element-props.js +0 -178
  491. package/dist/store/react/element-props.js.map +0 -1
  492. package/dist/store/react/gir-index.d.ts +0 -25
  493. package/dist/store/react/gir-index.d.ts.map +0 -1
  494. package/dist/store/react/gir-index.js +0 -55
  495. package/dist/store/react/gir-index.js.map +0 -1
  496. package/dist/store/react/intrinsic-elements.d.ts +0 -26
  497. package/dist/store/react/intrinsic-elements.d.ts.map +0 -1
  498. package/dist/store/react/intrinsic-elements.js +0 -107
  499. package/dist/store/react/intrinsic-elements.js.map +0 -1
  500. package/dist/store/react/jsx.d.ts.map +0 -1
  501. package/dist/store/react/jsx.js.map +0 -1
  502. package/dist/store/react/metadata.d.ts +0 -4
  503. package/dist/store/react/metadata.d.ts.map +0 -1
  504. package/dist/store/react/metadata.js.map +0 -1
  505. package/dist/store/react/pipeline.d.ts +0 -14
  506. package/dist/store/react/pipeline.d.ts.map +0 -1
  507. package/dist/store/react/pipeline.js.map +0 -1
  508. package/dist/store/react/props.d.ts.map +0 -1
  509. package/dist/store/react/props.js +0 -133
  510. package/dist/store/react/props.js.map +0 -1
  511. package/overrides/gtk/constants.ts.ejs +0 -3
  512. package/overrides/gtk/index.ts.ejs +0 -2
  513. package/src/store/react/built-ins.ts +0 -260
  514. package/src/store/react/element-components.ts +0 -138
  515. package/src/store/react/element-prop-types.ts +0 -280
  516. package/src/store/react/element-props.ts +0 -204
  517. package/src/store/react/gir-index.ts +0 -85
  518. package/src/store/react/intrinsic-elements.ts +0 -161
  519. package/src/store/react/metadata.ts +0 -197
  520. package/src/store/react/pipeline.ts +0 -90
  521. package/src/store/react/props.ts +0 -197
@@ -1,6 +1,9 @@
1
1
  import { sourceStringLiteral } from "@gtkx/utils";
2
2
  import type { GirCallback } from "../gir/callback.js";
3
3
  import type { Library } from "../gir/library.js";
4
+ import type { PrimitiveCategory } from "../gir/primitives.js";
5
+ import type { EntityType, GirType } from "../gir/type.js";
6
+ import type { ModuleContext } from "../writer/context.js";
4
7
  import {
5
8
  type GirParameter,
6
9
  type GirReturnValue,
@@ -9,12 +12,15 @@ import {
9
12
  isOutParameter,
10
13
  type ParameterTransfer,
11
14
  } from "../gir/parameter.js";
12
- import type { PrimitiveCategory } from "../gir/primitives.js";
13
- import type { EntityType, GirType } from "../gir/type.js";
14
- import type { CArrayType, ListFlavor, TypeId } from "../gir/type-id.js";
15
+ import {
16
+ type CArrayType,
17
+ hasUnknownArrayLength,
18
+ type ListFlavor,
19
+ type ListType,
20
+ type TypeId,
21
+ } from "../gir/type-id.js";
15
22
  import { isRecordInout } from "../store/gi/param-marshal.js";
16
23
  import { computeRecordFieldSlots } from "../store/gi/record-layout.js";
17
- import type { ModuleContext } from "../writer/context.js";
18
24
  import {
19
25
  type ListDescriptorName,
20
26
  type Ownership,
@@ -42,246 +48,452 @@ import {
42
48
  tVoid,
43
49
  } from "./descriptor.js";
44
50
 
51
+ type RenderDescriptorOptions = {
52
+ argIndexOffset?: number;
53
+ /** GIR parameter index to emitted argument index, for callables that drop parameters. */
54
+ argIndexMap?: Map<number, number> | undefined;
55
+ callerAllocated?: boolean;
56
+ isInline?: boolean;
57
+ };
58
+
59
+ type ArgIndexOptions = {
60
+ argIndexOffset: number;
61
+ argIndexMap: Map<number, number> | undefined;
62
+ };
63
+
64
+ type RecordPlacement = {
65
+ isCallerAllocated?: boolean;
66
+ isInline?: boolean;
67
+ };
68
+
69
+ type FundamentalDescriptor = {
70
+ lib: string;
71
+ refFunc: string;
72
+ unrefFunc: string;
73
+ typeName: string | undefined;
74
+ ownership: Ownership;
75
+ wrapperClass?: string | undefined;
76
+ inline?: boolean | undefined;
77
+ };
78
+
79
+ type AncestorFundamental = {
80
+ lib: string;
81
+ refFunc: string;
82
+ unrefFunc: string;
83
+ typeName: string | undefined;
84
+ };
85
+
86
+ type ResolvedRecord = Extract<EntityType, { kind: "record" }>["value"];
87
+
88
+ type FundamentalRecordOptions = {
89
+ resolved: Extract<EntityType, { kind: "record" }>;
90
+ refFunc: string;
91
+ unrefFunc: string;
92
+ ownership: Ownership;
93
+ wrapperClass: string | undefined;
94
+ inline: boolean;
95
+ };
96
+
97
+ const LIST_HELPERS: Record<Exclude<ListFlavor, "gbytearray">, ListDescriptorName> = {
98
+ glist: "list",
99
+ gslist: "slist",
100
+ gptrarray: "ptrArray",
101
+ garray: "gArray",
102
+ };
103
+
104
+ // A callable that drops parameters (varargs, and the closure/destroy slots folded into a callback)
105
+ // shifts every later parameter left, so a GIR length index has to be looked up in the emitted list
106
+ // rather than shifted by the instance offset alone.
107
+ const mapArgIndex = (options: ArgIndexOptions, girIndex: number): number =>
108
+ options.argIndexMap?.get(girIndex) ?? girIndex + options.argIndexOffset;
109
+
45
110
  const transferOwnership = (transfer: ParameterTransfer): Ownership => {
46
- if (transfer === "full") return "full";
47
- if (transfer === "container") return "full";
111
+ if (transfer === "full") {
112
+ return "full";
113
+ }
114
+
115
+ if (transfer === "container") {
116
+ return "full";
117
+ }
118
+
48
119
  return "borrowed";
49
120
  };
50
121
 
51
122
  const deriveElementTransfer = (transfer: ParameterTransfer): ParameterTransfer =>
52
123
  transfer === "container" ? "none" : transfer;
53
124
 
54
- type RenderDescriptorOptions = {
55
- argIndexOffset?: number;
56
- callerAllocated?: boolean;
57
- };
58
-
59
125
  const isVoidRef = (library: Library, ref: TypeId | undefined): boolean => {
60
- if (ref === undefined) return true;
61
- const type = library.typeOf(ref);
126
+ if (ref === undefined) {
127
+ return true;
128
+ }
129
+
130
+ const type = library.typeFor(ref);
131
+
62
132
  return type?.kind === "primitive" && type.category === "void";
63
133
  };
64
134
 
65
- export const isInlineCallbackRef = (library: Library, ref: TypeId | undefined): boolean =>
66
- ref !== undefined && library.typeOf(ref)?.kind === "callback" && library.nameOf(ref) === undefined;
135
+ const isInlineCallbackRef = (library: Library, ref: TypeId | undefined): boolean =>
136
+ ref !== undefined && library.typeFor(ref)?.kind === "callback" && library.nameFor(ref) === undefined;
67
137
 
68
- export const omitsPrimaryReturn = (library: Library, returnValue: GirReturnValue): boolean =>
138
+ const shouldOmitPrimaryReturn = (library: Library, returnValue: GirReturnValue): boolean =>
69
139
  isVoidRef(library, returnValue.type) || returnValue.skip;
70
140
 
71
- export const renderDescriptor = (
141
+ const renderDescriptor = (
72
142
  context: ModuleContext,
73
143
  ref: TypeId | undefined,
74
144
  transfer: ParameterTransfer = "none",
75
145
  options: RenderDescriptorOptions = {},
76
146
  ): string => {
77
- if (ref === undefined) return tVoid;
147
+ if (ref === undefined) {
148
+ return tVoid;
149
+ }
150
+
78
151
  const { argIndexOffset = 0 } = options;
152
+ const indexOptions: ArgIndexOptions = { argIndexOffset, argIndexMap: options.argIndexMap };
79
153
  const ownership = transferOwnership(transfer);
80
- const type = context.library.typeOf(ref);
81
- if (type === undefined) return tObject(ownership);
154
+ const type = context.library.typeFor(ref);
155
+
156
+ if (type === undefined) {
157
+ return tObject(ownership);
158
+ }
159
+
82
160
  switch (type.kind) {
83
- case "primitive":
161
+ case "primitive": {
84
162
  return primitiveExpression(type.category, ownership);
85
- case "varargs":
86
- case "callback":
163
+ }
164
+ case "varargs": {
87
165
  return tVoid;
166
+ }
167
+ // A callback in a slot no `renderCallbackType` covers (a vtable entry, a signal argument, a
168
+ // record field) is still a function pointer occupying a pointer-sized slot. `t.void` would
169
+ // hand the implementation `undefined` where the pointer belongs.
170
+ case "callback": {
171
+ return tUint64;
172
+ }
88
173
  case "class":
89
174
  case "interface":
90
175
  case "record":
91
176
  case "enum":
92
- case "alias":
177
+ case "alias": {
93
178
  return expressionForResolved(context, type, transfer, options);
94
- case "carray":
95
- return arrayExpression(context, type, transfer, argIndexOffset);
179
+ }
180
+ case "carray": {
181
+ return arrayExpression(context, type, transfer, indexOptions);
182
+ }
96
183
  case "list": {
97
- if (type.flavor === "gbytearray") return tByteArray(ownership);
98
- const element = renderDescriptor(context, type.element, deriveElementTransfer(transfer), {
99
- argIndexOffset,
100
- });
101
- return tList(LIST_HELPERS[type.flavor], element, ownership);
184
+ return listExpression(context, type, transfer, indexOptions);
102
185
  }
103
186
  case "hashtable": {
104
187
  const elementTransfer = deriveElementTransfer(transfer);
105
- const key = renderDescriptor(context, type.key, elementTransfer, { argIndexOffset });
106
- const value = renderDescriptor(context, type.value, elementTransfer, { argIndexOffset });
188
+ const key = renderDescriptor(context, type.key, elementTransfer, indexOptions);
189
+ const value = renderDescriptor(context, type.value, elementTransfer, indexOptions);
190
+
107
191
  return tHashTable(key, value, ownership);
108
192
  }
109
193
  }
110
194
  };
111
195
 
196
+ const listExpression = (
197
+ context: ModuleContext,
198
+ type: ListType,
199
+ transfer: ParameterTransfer,
200
+ indexOptions: ArgIndexOptions,
201
+ ): string => {
202
+ const ownership = transferOwnership(transfer);
203
+
204
+ if (type.flavor === "gbytearray") {
205
+ return tByteArray(ownership);
206
+ }
207
+
208
+ const element = renderDescriptor(context, type.element, deriveElementTransfer(transfer), indexOptions);
209
+
210
+ return tList(LIST_HELPERS[type.flavor], element, ownership);
211
+ };
212
+
112
213
  const resolveCallbackType = (context: ModuleContext, ref: TypeId | undefined): GirCallback | undefined => {
113
- if (ref === undefined) return undefined;
114
- const type = context.library.typeOf(ref);
115
- if (type?.kind !== "callback") return undefined;
214
+ if (ref === undefined) {
215
+ return undefined;
216
+ }
217
+
218
+ const type = context.library.typeFor(ref);
219
+
220
+ if (type?.kind !== "callback") {
221
+ return undefined;
222
+ }
223
+
116
224
  return type.value;
117
225
  };
118
226
 
119
- export const isScalarRef = (library: Library, ref: TypeId | undefined): boolean => {
120
- if (ref === undefined) return false;
121
- const type = library.typeOf(ref);
122
- if (type === undefined) return false;
123
- if (type.kind === "primitive") return type.category !== "string" && type.category !== "void";
124
- if (type.kind === "enum") return true;
125
- if (type.kind === "alias") return type.value.target !== undefined && isScalarRef(library, type.value.target);
126
- return false;
227
+ const isScalarType = (library: Library, type: GirType): boolean => {
228
+ switch (type.kind) {
229
+ case "primitive": {
230
+ return type.category !== "string" && type.category !== "void";
231
+ }
232
+ case "enum": {
233
+ return true;
234
+ }
235
+ case "alias": {
236
+ return type.value.target !== undefined && isScalarRef(library, type.value.target);
237
+ }
238
+ case "callback":
239
+ case "carray":
240
+ case "class":
241
+ case "hashtable":
242
+ case "interface":
243
+ case "list":
244
+ case "record":
245
+ case "varargs": {
246
+ return false;
247
+ }
248
+ }
249
+ };
250
+
251
+ const isScalarRef = (library: Library, ref: TypeId | undefined): boolean => {
252
+ if (ref === undefined) {
253
+ return false;
254
+ }
255
+
256
+ const type = library.typeFor(ref);
257
+
258
+ return type !== undefined && isScalarType(library, type);
127
259
  };
128
260
 
129
- export const isCellInout = (library: Library, parameter: GirParameter): boolean =>
261
+ const isCellInout = (library: Library, parameter: GirParameter): boolean =>
130
262
  isInoutParameter(parameter) && isScalarRef(library, parameter.type);
131
263
 
132
- export const renderParamDescriptor = (
264
+ const renderParamDescriptor = (
133
265
  context: ModuleContext,
134
266
  parameter: GirParameter,
135
267
  ref: TypeId | undefined,
268
+ argIndex: Partial<ArgIndexOptions> = {},
136
269
  ): string => {
137
270
  if (isCellInout(context.library, parameter)) {
138
- return tRef(renderDescriptor(context, ref, parameter.transferOwnership), true);
271
+ return tRef(renderDescriptor(context, ref, parameter.transferOwnership, argIndex), true);
139
272
  }
273
+
140
274
  if (isOutParameter(parameter)) {
141
- return tRef(renderDescriptor(context, ref, parameter.transferOwnership));
275
+ return tRef(renderDescriptor(context, ref, parameter.transferOwnership, argIndex));
142
276
  }
277
+
143
278
  return renderDescriptor(context, ref, parameter.transferOwnership, {
279
+ ...argIndex,
144
280
  callerAllocated: isCallerAllocatedOut(parameter) || isRecordInout(context, parameter),
145
281
  });
146
282
  };
147
283
 
148
- export const renderCallbackType = (
284
+ // `closure=` on a callback's own parameter states which slot carries the user data, and it is what
285
+ // the TypeScript signature already goes by. The name scan stays as a fallback: 88 callbacks across
286
+ // the installed GIRs carry no `closure=` at all.
287
+ const userDataIndexByName = (parameters: GirParameter[]): number | undefined => {
288
+ let userDataIndex: number | undefined;
289
+
290
+ for (const [index, parameter] of parameters.entries()) {
291
+ if (parameter.name === "user_data" || parameter.name === "data") {
292
+ userDataIndex = index;
293
+ }
294
+ }
295
+
296
+ return userDataIndex;
297
+ };
298
+
299
+ const findUserDataIndex = (parameters: GirParameter[]): number | undefined => {
300
+ const declared = parameters.find((parameter) => parameter.closureIndex !== undefined);
301
+
302
+ return declared?.closureIndex ?? userDataIndexByName(parameters);
303
+ };
304
+
305
+ const callbackOptionsArg = (owningParameter: GirParameter, userDataIndex: number | undefined): string | undefined => {
306
+ const options: string[] = [];
307
+
308
+ if (owningParameter.destroyIndex !== undefined) {
309
+ options.push("hasDestroy: true");
310
+ }
311
+
312
+ if (userDataIndex !== undefined) {
313
+ options.push(`userDataIndex: ${String(userDataIndex)}`);
314
+ }
315
+
316
+ if (owningParameter.scope !== undefined) {
317
+ options.push(`scope: ${sourceStringLiteral(owningParameter.scope)}`);
318
+ }
319
+
320
+ return options.length > 0 ? `{ ${options.join(", ")} }` : undefined;
321
+ };
322
+
323
+ const renderCallbackType = (
149
324
  context: ModuleContext,
150
325
  ref: TypeId | undefined,
151
326
  owningParameter: GirParameter,
152
327
  argOverrides?: Map<number, string>,
153
328
  ): string | undefined => {
154
329
  const callback = resolveCallbackType(context, ref);
155
- if (callback === undefined) return undefined;
330
+
331
+ if (callback === undefined) {
332
+ return undefined;
333
+ }
334
+
156
335
  const argTypes = callback.parameters.map(
157
336
  (parameter, index) => argOverrides?.get(index) ?? renderParamDescriptor(context, parameter, parameter.type),
158
337
  );
159
- let userDataIndex: number | undefined;
160
- callback.parameters.forEach((parameter, index) => {
161
- if (parameter.name === "user_data" || parameter.name === "data") userDataIndex = index;
162
- });
338
+
163
339
  const returnRef = callback.returnValue.type;
340
+
164
341
  const returnType = isVoidRef(context.library, returnRef)
165
342
  ? tVoid
166
343
  : renderDescriptor(context, returnRef, callback.returnValue.transferOwnership);
167
- const options: string[] = [];
168
- if (owningParameter.destroyIndex !== undefined) options.push("hasDestroy: true");
169
- if (userDataIndex !== undefined) options.push(`userDataIndex: ${userDataIndex}`);
170
- if (owningParameter.scope !== undefined) options.push(`scope: ${sourceStringLiteral(owningParameter.scope)}`);
171
- const optionsArg = options.length > 0 ? `{ ${options.join(", ")} }` : undefined;
172
- return tCallback(argTypes, returnType, optionsArg);
173
- };
174
344
 
175
- const LIST_HELPERS: Record<Exclude<ListFlavor, "gbytearray">, ListDescriptorName> = {
176
- glist: "list",
177
- gslist: "slist",
178
- gptrarray: "ptrArray",
179
- garray: "gArray",
345
+ const optionsArg = callbackOptionsArg(owningParameter, findUserDataIndex(callback.parameters));
346
+
347
+ return tCallback(argTypes, returnType, optionsArg);
180
348
  };
181
349
 
182
350
  const primitiveExpression = (category: PrimitiveCategory, ownership: Ownership): string => {
183
- if (category === "void") return tVoid;
184
- if (category === "string") return tString(ownership);
185
- if (category === "pointer") return tUint64;
186
- if (category === "gtype") return tGtype;
187
- return tScalar(category satisfies ScalarDescriptorName);
188
- };
351
+ if (category === "void") {
352
+ return tVoid;
353
+ }
189
354
 
190
- type FundamentalDescriptor = {
191
- lib: string;
192
- refFunc: string;
193
- unrefFunc: string;
194
- typeName: string | undefined;
195
- ownership: Ownership;
196
- wrapperClass?: string | undefined;
197
- };
355
+ if (category === "string") {
356
+ return tString(ownership);
357
+ }
198
358
 
199
- const referenceAddingFunc = (refFunc: string): string =>
200
- refFunc.endsWith("_ref_sink") ? refFunc.slice(0, -"_sink".length) : refFunc;
359
+ if (category === "pointer") {
360
+ return tUint64;
361
+ }
362
+
363
+ if (category === "gtype") {
364
+ return tGtype;
365
+ }
366
+
367
+ return tScalar(category satisfies ScalarDescriptorName);
368
+ };
201
369
 
202
370
  const renderFundamental = (descriptor: FundamentalDescriptor): string => {
203
- const { lib, refFunc, unrefFunc, typeName, ownership, wrapperClass } = descriptor;
204
- return tFundamental(lib, referenceAddingFunc(refFunc), unrefFunc, {
371
+ const { lib, refFunc, unrefFunc, typeName, ownership, wrapperClass, inline } = descriptor;
372
+
373
+ return tFundamental(lib, refFunc, unrefFunc, {
205
374
  ownership,
206
375
  typeName,
207
376
  wrapperClass,
377
+ inline,
208
378
  });
209
379
  };
210
380
 
381
+ // GIR marks only the root of a fundamental hierarchy with `glib:fundamental` and its ref/unref pair,
382
+ // so a derived type such as GtkPropertyExpression carries neither and has to inherit both.
211
383
  const classOrInterfaceExpression = (
384
+ context: ModuleContext,
212
385
  resolved: Extract<EntityType, { kind: "class" | "interface" }>,
213
386
  ownership: Ownership,
214
387
  ): string => {
215
- const cls = resolved.value;
216
- if (cls.glibRefFunc === undefined || cls.glibUnrefFunc === undefined) {
217
- return tObject(ownership);
388
+ const ancestor = fundamentalAncestor(context, resolved);
389
+
390
+ return ancestor === undefined ? tObject(ownership) : renderFundamental({ ...ancestor, ownership });
391
+ };
392
+
393
+ const isClassOrInterface = (type: GirType | undefined): type is Extract<EntityType, { kind: "class" | "interface" }> =>
394
+ type !== undefined && (type.kind === "class" || type.kind === "interface");
395
+
396
+ const getFundamental = (
397
+ node: Extract<EntityType, { kind: "class" | "interface" }>,
398
+ ): AncestorFundamental | undefined => {
399
+ const cls = node.value;
400
+
401
+ if (!cls.fundamental || cls.glibRefFunc === undefined || cls.glibUnrefFunc === undefined) {
402
+ return undefined;
218
403
  }
219
- return renderFundamental({
220
- lib: resolved.namespace.sharedLibrary ?? "",
404
+
405
+ return {
406
+ lib: node.namespace.sharedLibrary ?? "",
221
407
  refFunc: cls.glibRefFunc,
222
408
  unrefFunc: cls.glibUnrefFunc,
223
409
  typeName: cls.glibTypeName,
224
- ownership,
225
- });
410
+ };
226
411
  };
227
412
 
228
- type AncestorFundamental = {
229
- lib: string;
230
- refFunc: string;
231
- unrefFunc: string;
232
- typeName: string | undefined;
413
+ const walkFundamental = (
414
+ context: ModuleContext,
415
+ current: GirType | undefined,
416
+ seen: Set<string>,
417
+ ): AncestorFundamental | undefined => {
418
+ if (!isClassOrInterface(current)) {
419
+ return undefined;
420
+ }
421
+
422
+ const key = `${current.namespace.name}.${current.value.name}`;
423
+
424
+ if (seen.has(key)) {
425
+ return undefined;
426
+ }
427
+
428
+ seen.add(key);
429
+ const fundamental = getFundamental(current);
430
+
431
+ if (fundamental !== undefined) {
432
+ return fundamental;
433
+ }
434
+
435
+ if (current.value.parent === undefined) {
436
+ return undefined;
437
+ }
438
+
439
+ const parent = context.library.resolveType(current.namespace.name, current.value.parent);
440
+
441
+ return walkFundamental(context, parent, seen);
233
442
  };
234
443
 
235
444
  const fundamentalAncestor = (
236
445
  context: ModuleContext,
237
446
  start: Extract<EntityType, { kind: "class" | "interface" }>,
238
- ): AncestorFundamental | undefined => {
239
- const seen = new Set<string>();
240
- let current: GirType | undefined = start;
241
- while (current !== undefined && (current.kind === "class" || current.kind === "interface")) {
242
- const key = `${current.namespace.name}.${current.value.name}`;
243
- if (seen.has(key)) return undefined;
244
- seen.add(key);
245
- const cls = current.value;
246
- if (cls.fundamental && cls.glibRefFunc !== undefined && cls.glibUnrefFunc !== undefined) {
247
- return {
248
- lib: current.namespace.sharedLibrary ?? "",
249
- refFunc: cls.glibRefFunc,
250
- unrefFunc: cls.glibUnrefFunc,
251
- typeName: cls.glibTypeName,
252
- };
253
- }
254
- if (cls.parent === undefined) return undefined;
255
- current = context.library.resolveType(current.namespace.name, cls.parent);
256
- }
257
- return undefined;
447
+ ): AncestorFundamental | undefined => walkFundamental(context, start, new Set<string>());
448
+
449
+ const classSelfDescriptor = (
450
+ context: ModuleContext,
451
+ type: Extract<EntityType, { kind: "class" | "interface" }>,
452
+ ): string => {
453
+ const ancestor = fundamentalAncestor(context, type);
454
+
455
+ return ancestor === undefined ? tObject("borrowed") : renderFundamental({ ...ancestor, ownership: "borrowed" });
258
456
  };
259
457
 
260
- export const renderSelfDescriptor = (context: ModuleContext, instance: GirParameter): string => {
458
+ const renderSelfDescriptor = (context: ModuleContext, instance: GirParameter): string => {
261
459
  const ref = instance.type;
262
- if (ref === undefined) return tObject("borrowed");
263
- const type = context.library.typeOf(ref);
264
- if (type === undefined) return tObject("borrowed");
265
- if (type.kind === "class" || type.kind === "interface") {
266
- const ancestor = fundamentalAncestor(context, type);
267
- return ancestor === undefined ? tObject("borrowed") : renderFundamental({ ...ancestor, ownership: "borrowed" });
460
+
461
+ if (ref === undefined) {
462
+ return tObject("borrowed");
463
+ }
464
+
465
+ const type = context.library.typeFor(ref);
466
+
467
+ if (type === undefined) {
468
+ return tObject("borrowed");
268
469
  }
470
+
471
+ if (isClassOrInterface(type)) {
472
+ return classSelfDescriptor(context, type);
473
+ }
474
+
269
475
  if (type.kind === "record") {
270
476
  return recordExpression(context, type, transferOwnership(instance.transferOwnership));
271
477
  }
478
+
272
479
  return tObject("borrowed");
273
480
  };
274
481
 
275
- type ResolvedRecord = Extract<EntityType, { kind: "record" }>["value"];
276
-
482
+ // A record expresses its acquire/release pair as `copy-function`/`free-function`: no `<record>` in
483
+ // any installed GIR carries `glib:ref-func`, and GVariant's copy function really is
484
+ // `g_variant_ref_sink`.
277
485
  const recordRefPair = (record: ResolvedRecord): { refFunc: string | undefined; unrefFunc: string | undefined } => ({
278
486
  refFunc: record.glibRefFunc ?? record.copyFunc,
279
487
  unrefFunc: record.glibUnrefFunc ?? record.freeFunc,
280
488
  });
281
489
 
282
- const recordNeedsFallbackClass = (record: ResolvedRecord): boolean => {
490
+ const requiresFallbackClass = (record: ResolvedRecord): boolean => {
283
491
  const { refFunc, unrefFunc } = recordRefPair(record);
284
- if (refFunc !== undefined && unrefFunc !== undefined) return record.glibTypeName === undefined;
492
+
493
+ if (refFunc !== undefined && unrefFunc !== undefined) {
494
+ return record.glibTypeName === undefined;
495
+ }
496
+
285
497
  return record.glibGetType === undefined;
286
498
  };
287
499
 
@@ -289,51 +501,116 @@ const structExpression = (
289
501
  context: ModuleContext,
290
502
  resolved: Extract<EntityType, { kind: "record" }>,
291
503
  ownership: Ownership,
292
- callerAllocated: boolean,
504
+ options: { callerAllocated: boolean; inline: boolean },
293
505
  ): string => {
294
506
  const { size } = computeRecordFieldSlots(context, resolved.value.fields, resolved.value.isUnion);
295
507
  const wrapperClass = context.qualify(resolved.namespace.name, resolved.value.name);
508
+
296
509
  return tStruct(ownership, {
297
510
  size: size > 0 ? size : undefined,
298
511
  wrapperClass,
512
+ callerAllocated: options.callerAllocated,
513
+ inline: options.inline,
514
+ });
515
+ };
516
+
517
+ const fundamentalRecordExpression = (options: FundamentalRecordOptions): string => {
518
+ const { resolved, refFunc, unrefFunc, ownership, wrapperClass, inline } = options;
519
+
520
+ return renderFundamental({
521
+ lib: resolved.namespace.sharedLibrary ?? "",
522
+ refFunc,
523
+ unrefFunc,
524
+ typeName: resolved.value.glibTypeName,
525
+ ownership,
526
+ wrapperClass,
527
+ inline,
528
+ });
529
+ };
530
+
531
+ const boxedRecordExpression = (options: {
532
+ context: ModuleContext;
533
+ resolved: Extract<EntityType, { kind: "record" }>;
534
+ ownership: Ownership;
535
+ callerAllocated: boolean;
536
+ inline: boolean;
537
+ typeFnName: string;
538
+ }): string => {
539
+ const { context, resolved, ownership, callerAllocated, inline, typeFnName } = options;
540
+ const record = resolved.value;
541
+ const glibName = record.glibTypeName ?? record.cType ?? record.name;
542
+ const { size } = computeRecordFieldSlots(context, record.fields, record.isUnion);
543
+
544
+ return tBoxed(glibName, {
545
+ ownership,
546
+ sharedLibrary: resolved.namespace.sharedLibrary,
547
+ getTypeFnName: typeFnName,
299
548
  callerAllocated,
549
+ inline,
550
+ size: size > 0 ? size : undefined,
300
551
  });
301
552
  };
302
553
 
554
+ const plainRecordExpression = (
555
+ context: ModuleContext,
556
+ resolved: Extract<EntityType, { kind: "record" }>,
557
+ ownership: Ownership,
558
+ placement: RecordPlacement,
559
+ ): string => {
560
+ const record = resolved.value;
561
+
562
+ const layout = {
563
+ callerAllocated: placement.isCallerAllocated ?? false,
564
+ inline: placement.isInline ?? false,
565
+ };
566
+
567
+ if (record.glibGetType === undefined) {
568
+ return structExpression(context, resolved, ownership, layout);
569
+ }
570
+
571
+ return boxedRecordExpression({ context, resolved, ownership, ...layout, typeFnName: record.glibGetType });
572
+ };
573
+
303
574
  const recordExpression = (
304
575
  context: ModuleContext,
305
576
  resolved: Extract<EntityType, { kind: "record" }>,
306
577
  ownership: Ownership,
307
- callerAllocated = false,
578
+ placement: RecordPlacement = {},
308
579
  ): string => {
309
580
  const record = resolved.value;
310
581
  const { refFunc, unrefFunc } = recordRefPair(record);
311
- const wrapperClass = recordNeedsFallbackClass(record)
312
- ? context.qualify(resolved.namespace.name, record.name)
313
- : undefined;
582
+
314
583
  if (refFunc !== undefined && unrefFunc !== undefined) {
315
- const lib = resolved.namespace.sharedLibrary ?? "";
316
- return renderFundamental({
317
- lib,
584
+ const wrapperClass = requiresFallbackClass(record)
585
+ ? context.qualify(resolved.namespace.name, record.name)
586
+ : undefined;
587
+
588
+ return fundamentalRecordExpression({
589
+ resolved,
318
590
  refFunc,
319
591
  unrefFunc,
320
- typeName: record.glibTypeName,
321
592
  ownership,
322
593
  wrapperClass,
594
+ inline: placement.isInline ?? false,
323
595
  });
324
596
  }
325
- if (record.glibGetType === undefined) {
326
- return structExpression(context, resolved, ownership, callerAllocated);
597
+
598
+ return plainRecordExpression(context, resolved, ownership, placement);
599
+ };
600
+
601
+ const rawEnumDescriptor = (isSigned: boolean): string => (isSigned ? tInt32 : tUint32);
602
+
603
+ const enumExpression = (resolved: Extract<EntityType, { kind: "enum" }>): string => {
604
+ const getter = resolved.value.glibGetType;
605
+ const isSigned = resolved.value.members.some((member) => member.value.startsWith("-"));
606
+
607
+ if (getter === undefined || getter === "") {
608
+ return rawEnumDescriptor(isSigned);
327
609
  }
328
- const glibName = record.glibTypeName ?? record.cType ?? record.name;
329
- const { size } = computeRecordFieldSlots(context, record.fields, record.isUnion);
330
- return tBoxed(glibName, {
331
- ownership,
332
- sharedLibrary: resolved.namespace.sharedLibrary,
333
- getTypeFnName: record.glibGetType,
334
- callerAllocated,
335
- size: size > 0 ? size : undefined,
336
- });
610
+
611
+ const lib = resolved.namespace.sharedLibrary ?? "";
612
+
613
+ return resolved.value.kind === "bitfield" ? tFlags(lib, getter, isSigned) : tEnum(lib, getter, isSigned);
337
614
  };
338
615
 
339
616
  const expressionForResolved = (
@@ -343,21 +620,24 @@ const expressionForResolved = (
343
620
  options: RenderDescriptorOptions,
344
621
  ): string => {
345
622
  const ownership = transferOwnership(transfer);
623
+
346
624
  switch (resolved.kind) {
347
625
  case "class":
348
- case "interface":
349
- return classOrInterfaceExpression(resolved, ownership);
350
- case "record":
351
- return recordExpression(context, resolved, ownership, options.callerAllocated ?? false);
626
+ case "interface": {
627
+ return classOrInterfaceExpression(context, resolved, ownership);
628
+ }
629
+ case "record": {
630
+ return recordExpression(context, resolved, ownership, {
631
+ isCallerAllocated: options.callerAllocated ?? false,
632
+ isInline: options.isInline ?? false,
633
+ });
634
+ }
352
635
  case "enum": {
353
- const getter = resolved.value.glibGetType;
354
- const signed = resolved.value.members.some((member) => member.value.startsWith("-"));
355
- if (getter === undefined || getter === "") return signed ? tInt32 : tUint32;
356
- const lib = resolved.namespace.sharedLibrary ?? "";
357
- return resolved.value.kind === "bitfield" ? tFlags(lib, getter, signed) : tEnum(lib, getter, signed);
636
+ return enumExpression(resolved);
358
637
  }
359
- case "alias":
638
+ case "alias": {
360
639
  return aliasExpression(context, resolved.value.target, transfer, options);
640
+ }
361
641
  }
362
642
  };
363
643
 
@@ -365,33 +645,57 @@ const arrayExpression = (
365
645
  context: ModuleContext,
366
646
  ref: CArrayType,
367
647
  transfer: ParameterTransfer,
368
- argIndexOffset: number,
648
+ options: ArgIndexOptions,
369
649
  ): string => {
650
+ if (hasUnknownArrayLength(ref)) {
651
+ return tUint64;
652
+ }
653
+
370
654
  const ownership = transferOwnership(transfer);
371
- const element = renderDescriptor(context, ref.element, deriveElementTransfer(transfer), { argIndexOffset });
655
+ const element = renderDescriptor(context, ref.element, deriveElementTransfer(transfer), options);
372
656
  const size = inlineElementSize(context, ref.element, ref.elementCType);
657
+
373
658
  if (ref.lengthParameterIndex !== undefined) {
374
- return tSizedArray(element, ref.lengthParameterIndex + argIndexOffset, ownership, size);
659
+ return tSizedArray(element, mapArgIndex(options, ref.lengthParameterIndex), ownership, size);
375
660
  }
661
+
376
662
  if (ref.fixedSize !== undefined) {
377
663
  return tFixedArray(element, ref.fixedSize, ownership, size);
378
664
  }
665
+
379
666
  return tArray(element, ownership, size);
380
667
  };
381
668
 
669
+ const recordInlineSize = (context: ModuleContext, record: ResolvedRecord): number | undefined => {
670
+ if (record.opaque || record.disguised || record.fields.length === 0) {
671
+ return undefined;
672
+ }
673
+
674
+ const { size } = computeRecordFieldSlots(context, record.fields, record.isUnion);
675
+
676
+ return size > 0 ? size : undefined;
677
+ };
678
+
382
679
  const inlineElementSize = (
383
680
  context: ModuleContext,
384
681
  element: TypeId | undefined,
385
682
  elementCType: string | undefined,
386
683
  ): number | undefined => {
387
- if (element === undefined) return undefined;
388
- if (elementCType?.includes("*")) return undefined;
389
- const type = context.library.typeOf(element);
390
- if (type?.kind !== "record") return undefined;
391
- const record = type.value;
392
- if (record.opaque || record.disguised || record.fields.length === 0) return undefined;
393
- const { size } = computeRecordFieldSlots(context, record.fields, record.isUnion);
394
- return size > 0 ? size : undefined;
684
+ if (element === undefined) {
685
+ return undefined;
686
+ }
687
+
688
+ if (elementCType?.includes("*")) {
689
+ return undefined;
690
+ }
691
+
692
+ const type = context.library.typeFor(element);
693
+
694
+ if (type?.kind !== "record") {
695
+ return undefined;
696
+ }
697
+
698
+ return recordInlineSize(context, type.value);
395
699
  };
396
700
 
397
701
  const aliasExpression = (
@@ -403,5 +707,17 @@ const aliasExpression = (
403
707
  if (target === undefined) {
404
708
  return tObject(transferOwnership(transfer));
405
709
  }
710
+
406
711
  return renderDescriptor(context, target, transfer, options);
407
712
  };
713
+
714
+ export {
715
+ isInlineCallbackRef,
716
+ shouldOmitPrimaryReturn,
717
+ renderDescriptor,
718
+ isScalarRef,
719
+ isCellInout,
720
+ renderParamDescriptor,
721
+ renderCallbackType,
722
+ renderSelfDescriptor,
723
+ };