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

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