@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,27 +1,38 @@
1
1
  import { sourceStringLiteral, toCamelIdentifier, uniqBy } from "@gtkx/utils";
2
+ import type { GirClass } from "../../gir/class.js";
3
+ import type { ModuleContext } from "../../writer/context.js";
2
4
  import { renderDescriptor } from "../../analysis/descriptor-render.js";
3
5
  import { collectInterfaceProperties } from "../../analysis/inheritance.js";
4
6
  import { renderTsType } from "../../analysis/ts-type.js";
5
7
  import { ancestorChain } from "../../gir/ancestry.js";
6
- import type { GirClass } from "../../gir/class.js";
7
8
  import { type GirProperty, isConstructableProperty } from "../../gir/property.js";
8
- import type { ModuleContext } from "../../writer/context.js";
9
9
  import { renderBlock, renderBraced, renderBracedOrEmpty } from "../../writer/emit.js";
10
10
  import { parentCompanionRef } from "./companion.js";
11
11
 
12
+ const PROPS_RECORD = "Record<string, unknown>";
13
+
14
+ const constructablePropNames = (klass: GirClass): string[] =>
15
+ klass.properties.filter(isConstructableProperty).map((property) => toCamelIdentifier(property.name));
16
+
12
17
  const ancestorConstructablePropNames = (context: ModuleContext, klass: GirClass): Set<string> => {
13
- const names = new Set<string>();
18
+ const names: Set<string> = new Set();
19
+
14
20
  for (const { klass: ancestor } of ancestorChain(context.library, klass, context.namespace.name)) {
15
- if (ancestor === klass) continue;
16
- for (const property of ancestor.properties) {
17
- if (isConstructableProperty(property)) names.add(toCamelIdentifier(property.name));
21
+ if (ancestor === klass) {
22
+ continue;
23
+ }
24
+
25
+ for (const name of constructablePropNames(ancestor)) {
26
+ names.add(name);
18
27
  }
19
28
  }
29
+
20
30
  return names;
21
31
  };
22
32
 
23
33
  const collectConstructableProps = (context: ModuleContext, klass: GirClass): GirProperty[] => {
24
34
  const inherited = ancestorConstructablePropNames(context, klass);
35
+
25
36
  return uniqBy(
26
37
  [...klass.properties, ...collectInterfaceProperties(context, klass).map((entry) => entry.property)]
27
38
  .filter(isConstructableProperty)
@@ -30,40 +41,49 @@ const collectConstructableProps = (context: ModuleContext, klass: GirClass): Gir
30
41
  );
31
42
  };
32
43
 
33
- export const renderConstructorPropsInterface = (context: ModuleContext, klass: GirClass, className: string): string => {
44
+ const renderConstructorPropsInterface = (context: ModuleContext, klass: GirClass, className: string): string => {
34
45
  const parentRef = parentCompanionRef(context, klass, "ConstructorProps");
35
46
  const extendsClause = parentRef === undefined ? "" : ` extends ${parentRef}`;
47
+
36
48
  const lines = collectConstructableProps(context, klass).map(
37
49
  (property) =>
38
50
  `${toCamelIdentifier(property.name)}?: ${renderTsType(context, property.type, true)} | undefined;`,
39
51
  );
52
+
40
53
  return renderBracedOrEmpty(`export interface ${className}ConstructorProps${extendsClause}`, lines.join("\n"));
41
54
  };
42
55
 
43
- export const renderClassConstructor = (
56
+ const renderClassConstructor = (
44
57
  context: ModuleContext,
45
58
  klass: GirClass,
46
59
  className: string,
47
60
  hasParent: boolean,
48
61
  ): string | undefined => {
49
- if (!hasParent) return renderRootConstructor(context);
62
+ if (!hasParent) {
63
+ return renderRootConstructor(context);
64
+ }
65
+
50
66
  const props = collectConstructableProps(context, klass);
51
- if (props.length === 0) return undefined;
67
+
68
+ if (props.length === 0) {
69
+ return undefined;
70
+ }
71
+
52
72
  return renderTranslatingConstructor(context, props, className);
53
73
  };
54
74
 
55
- const PROPS_RECORD = "Record<string, unknown>";
56
-
57
75
  const renderRootConstructor = (context: ModuleContext): string => {
58
76
  context.addRuntimeImport("getInstanceType");
59
77
  context.addRuntimeImport("newObjectWithProperties");
60
78
  context.addRuntimeImport("setHandle");
61
79
  context.addRuntimeImport("setWrapper");
80
+
62
81
  const body = [
63
82
  "const handle = newObjectWithProperties(getInstanceType(this), props);",
64
83
  "setHandle(this, handle);",
65
84
  "setWrapper(handle, this);",
66
85
  ].join("\n");
86
+
67
87
  return renderBlock(`constructor(props: ${PROPS_RECORD} = {})`, body);
68
88
  };
69
89
 
@@ -71,12 +91,18 @@ const renderTranslatingConstructor = (context: ModuleContext, props: GirProperty
71
91
  context.addRuntimeImport("t");
72
92
  const destructured = props.map((property) => toCamelIdentifier(property.name));
73
93
  const pattern = `{ ${[...destructured, "...rest"].join(", ")} }`;
74
- const entries = props.map(
75
- (property) =>
76
- `${sourceStringLiteral(property.name)}: [${renderDescriptor(context, property.type, property.transferOwnership)}, ${toCamelIdentifier(property.name)}],`,
77
- );
94
+
95
+ const entries = props.map((property) => {
96
+ const descriptor = renderDescriptor(context, property.type, property.transferOwnership);
97
+
98
+ return `${sourceStringLiteral(property.name)}: [${descriptor}, ${toCamelIdentifier(property.name)}],`;
99
+ });
100
+
78
101
  const recordLiteral = renderBraced(entries.join("\n"));
79
102
  const lines = [`const props: ${PROPS_RECORD} = ${recordLiteral};`, "super({ ...props, ...rest });"];
80
103
  const body = lines.join("\n");
104
+
81
105
  return renderBlock(`constructor(${pattern}: ${className}ConstructorProps = {})`, body);
82
106
  };
107
+
108
+ export { renderConstructorPropsInterface, renderClassConstructor };
@@ -4,46 +4,61 @@ import type { ModuleContext } from "../../writer/context.js";
4
4
  import { renderJsDoc } from "../../writer/doc.js";
5
5
  import { indent } from "../../writer/emit.js";
6
6
 
7
- export const generateEnum = (context: ModuleContext, enumeration: GirEnum): void => {
8
- if (!enumeration.introspectable) return;
7
+ const generateEnum = (context: ModuleContext, enumeration: GirEnum): void => {
8
+ if (!enumeration.introspectable) {
9
+ return;
10
+ }
11
+
9
12
  const name = enumeration.name;
10
- const memberKeys = enumeration.members.map((member) => enumMemberKey(member.name));
13
+ const members = enumeration.members.map((member) => ({ ...member, key: enumMemberKey(member.name) }));
14
+
11
15
  if (enumeration.errorDomain !== undefined) {
12
- const memberEntries = enumeration.members.map((member, index) => `${memberKeys[index]}: ${member.value}`);
13
- const typeFields = memberKeys.map((key) => `${key}: number`).join("; ");
16
+ const memberEntries = members.map((member) => `${member.key}: ${member.value}`);
17
+ const typeFields = members.map((member) => `${member.key}: number`).join("; ");
14
18
  context.addRuntimeImport("createErrorDomain");
15
19
  context.addRuntimeImport("ErrorDomain");
16
20
  const quarkExpression = renderQuarkExpression(context, enumeration.errorDomain);
17
21
  context.module.appendDeclaration(`${renderJsDoc(enumeration.doc)}export type ${name} = number;`);
22
+
18
23
  context.module.appendDeclaration(
19
- `export const ${name}: ErrorDomain<{ ${typeFields} }> = createErrorDomain(${quarkExpression}, { ${memberEntries.join(", ")} });`,
24
+ `export const ${name}: ErrorDomain<{ ${typeFields} }> = ` +
25
+ `createErrorDomain(${quarkExpression}, { ${memberEntries.join(", ")} });`,
20
26
  );
27
+
21
28
  return;
22
29
  }
23
- if (enumeration.members.some((member) => member.doc !== undefined)) {
24
- const memberBlocks = enumeration.members.map(
25
- (member, index) => `${renderJsDoc(member.doc)}${memberKeys[index]} = ${member.value},`,
26
- );
30
+
31
+ if (members.some((member) => member.doc !== undefined)) {
32
+ const memberBlocks = members.map((member) => `${renderJsDoc(member.doc)}${member.key} = ${member.value},`);
33
+
27
34
  context.module.appendDeclaration(
28
35
  `${renderJsDoc(enumeration.doc)}export enum ${name} {\n${indent(memberBlocks.join("\n"), 1)}\n}`,
29
36
  );
37
+
30
38
  return;
31
39
  }
32
- const memberDeclarations = enumeration.members.map((member, index) => `${memberKeys[index]} = ${member.value}`);
40
+
41
+ const memberDeclarations = members.map((member) => `${member.key} = ${member.value}`);
42
+
33
43
  context.module.appendDeclaration(
34
44
  `${renderJsDoc(enumeration.doc)}export enum ${name} { ${memberDeclarations.join(", ")} }`,
35
45
  );
36
46
  };
37
47
 
38
- export const enumMemberKey = (name: string): string => {
48
+ const enumMemberKey = (name: string): string => {
39
49
  const upper = name.toUpperCase().replaceAll("-", "_");
40
- return /^[0-9]/.test(upper) ? `_${upper}` : upper;
50
+
51
+ return /^\d/.test(upper) ? `_${upper}` : upper;
41
52
  };
42
53
 
43
54
  const renderQuarkExpression = (context: ModuleContext, errorDomain: string): string => {
44
55
  if (context.namespace.name === "GLib") {
45
56
  return `() => quarkFromString(${sourceStringLiteral(errorDomain)})`;
46
57
  }
58
+
47
59
  const alias = context.addCrossNamespaceImport("GLib");
60
+
48
61
  return `() => ${alias}.quarkFromString(${sourceStringLiteral(errorDomain)})`;
49
62
  };
63
+
64
+ export { generateEnum, enumMemberKey };
@@ -1,13 +1,13 @@
1
1
  import { toCamelIdentifier } from "@gtkx/utils";
2
- import { tFn } from "../../analysis/descriptor.js";
3
- import { hasCallerAllocatedArrayLength } from "../../analysis/param-structure.js";
4
2
  import type { GirFunction } from "../../gir/function.js";
5
3
  import type { GirNamespace } from "../../gir/namespace.js";
6
4
  import type { ModuleContext } from "../../writer/context.js";
5
+ import { tFn } from "../../analysis/descriptor.js";
6
+ import { hasCallerAllocatedArrayLength } from "../../analysis/param-structure.js";
7
7
  import { renderJsDoc } from "../../writer/doc.js";
8
8
  import { arrayLiteral, renderBlock } from "../../writer/emit.js";
9
9
  import { matchAsyncFinish } from "./async.js";
10
- import { callableReferencesClassStruct } from "./class-struct-record.js";
10
+ import { hasClassStructReference } from "./class-struct-record.js";
11
11
  import {
12
12
  planCallArgs,
13
13
  renderMethodBody,
@@ -18,32 +18,73 @@ import {
18
18
  renderReturnDescriptor,
19
19
  } from "./method.js";
20
20
 
21
- export const renderFnExpression = (context: ModuleContext, fn: GirFunction): string | undefined => {
22
- if (fn.cIdentifier === undefined) return undefined;
21
+ const renderFnExpression = (context: ModuleContext, fn: GirFunction): string | undefined => {
22
+ if (fn.cIdentifier === undefined) {
23
+ return undefined;
24
+ }
25
+
23
26
  const library = context.namespace.sharedLibrary;
24
- if (library === undefined) return undefined;
27
+
28
+ if (library === undefined) {
29
+ return undefined;
30
+ }
31
+
25
32
  context.addRuntimeImport("t");
26
33
  const params = planCallArgs(context, fn).map((arg) => arg.paramLiteral);
27
34
  const ret = renderReturnDescriptor(context, fn);
35
+
28
36
  return tFn(library, fn.cIdentifier, { args: arrayLiteral(params), returns: ret, throws: fn.throws });
29
37
  };
30
38
 
31
- const namespaceFunctionEmittable = (context: ModuleContext, fn: GirFunction): boolean =>
39
+ // `moved-to` names the type member this function is also reachable as, so the namespace-level copy
40
+ // is a second export of one binding. Suppressing it is only right when that member is really
41
+ // emitted: 15 of Gtk-4.0's 28 `moved-to` targets are enum or error-domain members codegen emits no
42
+ // static for, and dropping those would delete API with nothing to replace it.
43
+ const isMovedOntoEmittedMember = (context: ModuleContext, fn: GirFunction): boolean => {
44
+ const [typeName, memberName] = fn.movedTo?.split(".") ?? [];
45
+
46
+ if (typeName === undefined || memberName === undefined) {
47
+ return false;
48
+ }
49
+
50
+ const resolved = context.library.resolveType(context.namespace.name, typeName);
51
+
52
+ if (resolved?.kind !== "class" && resolved?.kind !== "interface" && resolved?.kind !== "record") {
53
+ return false;
54
+ }
55
+
56
+ const members = [...resolved.value.methods, ...resolved.value.functions, ...resolved.value.constructors];
57
+
58
+ return members.some((member) => member.name === memberName);
59
+ };
60
+
61
+ const canEmitNamespaceFunction = (context: ModuleContext, fn: GirFunction): boolean =>
32
62
  fn.introspectable &&
63
+ !isMovedOntoEmittedMember(context, fn) &&
33
64
  fn.shadowedBy === undefined &&
34
65
  fn.cIdentifier !== undefined &&
35
- !callableReferencesClassStruct(context, fn) &&
66
+ !hasClassStructReference(context, fn) &&
36
67
  !hasCallerAllocatedArrayLength(context.library, fn);
37
68
 
38
- export const generateNamespaceFunction = (context: ModuleContext, fn: GirFunction): void => {
39
- if (!namespaceFunctionEmittable(context, fn)) return;
69
+ const generateNamespaceFunction = (context: ModuleContext, fn: GirFunction): void => {
70
+ if (!canEmitNamespaceFunction(context, fn)) {
71
+ return;
72
+ }
73
+
40
74
  const expression = renderFnExpression(context, fn);
41
- if (expression === undefined) return;
75
+
76
+ if (expression === undefined) {
77
+ return;
78
+ }
79
+
42
80
  const cIdentifier = fn.cIdentifier;
43
- if (cIdentifier === undefined) return;
81
+
82
+ if (cIdentifier === undefined) {
83
+ return;
84
+ }
85
+
44
86
  const bindingName = toCamelIdentifier(cIdentifier);
45
87
  context.module.appendBinding(`const ${bindingName} = ${expression};`, cIdentifier);
46
-
47
88
  const exportName = namespaceFunctionExportName(cIdentifier, fn.name, context.namespace.cSymbolPrefixes);
48
89
  const declaration = renderNamespaceFunctionDeclaration(context, fn, exportName, bindingName);
49
90
  context.module.appendDeclaration(`${renderJsDoc(fn.doc)}${declaration}`);
@@ -57,51 +98,76 @@ const renderNamespaceFunctionDeclaration = (
57
98
  ): string => {
58
99
  const finishFn = matchAsyncFinish(context.library, fn, context.namespace.functions);
59
100
  const finishCIdentifier = finishFn?.cIdentifier;
60
- if (finishFn !== undefined && finishCIdentifier !== undefined && namespaceFunctionEmittable(context, finishFn)) {
101
+
102
+ if (finishFn !== undefined && finishCIdentifier !== undefined && canEmitNamespaceFunction(context, finishFn)) {
61
103
  const finishExport = namespaceFunctionExportName(
62
104
  finishCIdentifier,
63
105
  finishFn.name,
64
106
  context.namespace.cSymbolPrefixes,
65
107
  );
108
+
66
109
  const { signature, returnType } = renderPromisifiedSignature(context, fn, finishFn);
67
110
  const body = renderPromisifiedBody(context, fn, finishExport, bindingName);
111
+
68
112
  return renderBlock(`export function ${exportName}(${signature}): ${returnType}`, body);
69
113
  }
114
+
70
115
  const signature = renderMethodSignature(context, fn);
71
116
  const returnType = renderMethodReturnType(context, fn);
72
117
  const body = renderMethodBody(context, fn, { bindingExpression: bindingName });
118
+
73
119
  return renderBlock(`export function ${exportName}(${signature}): ${returnType}`, body);
74
120
  };
75
121
 
76
- export const namespaceFunctionExportName = (cIdentifier: string, girName: string, symbolPrefixes: string[]): string => {
122
+ const namespaceFunctionExportName = (cIdentifier: string, girName: string, symbolPrefixes: string[]): string => {
77
123
  if (girName.length > 0) {
78
124
  return toCamelIdentifier(girName);
79
125
  }
126
+
80
127
  const stripped = stripLongestPrefix(cIdentifier, symbolPrefixes);
128
+
81
129
  return toCamelIdentifier(stripped);
82
130
  };
83
131
 
84
132
  const stripLongestPrefix = (input: string, prefixes: string[]): string => {
85
133
  let best = "";
134
+
86
135
  for (const prefix of prefixes) {
87
136
  const candidate = `${prefix}_`;
137
+
88
138
  if (input.startsWith(candidate) && candidate.length > best.length) {
89
139
  best = candidate;
90
140
  }
91
141
  }
142
+
92
143
  return best.length === 0 ? input : input.slice(best.length);
93
144
  };
94
145
 
95
- export const generateNamespaceBootstrap = (context: ModuleContext, namespace: GirNamespace): void => {
146
+ const isBootstrapFunction = (fn: GirFunction): boolean =>
147
+ fn.parameters.length === 0 && fn.introspectable && fn.shadowedBy === undefined && fn.cIdentifier !== undefined;
148
+
149
+ const appendBootstrapRegistration = (context: ModuleContext, fn: GirFunction, exportName: string): void => {
150
+ if (fn.name === "init") {
151
+ context.module.appendRegistration(`${exportName}();`);
152
+
153
+ return;
154
+ }
155
+
156
+ if (fn.name === "finalize") {
157
+ context.addRuntimeImport("onExit");
158
+ context.module.appendRegistration(`onExit(${exportName});`);
159
+ }
160
+ };
161
+
162
+ const generateNamespaceBootstrap = (context: ModuleContext, namespace: GirNamespace): void => {
96
163
  for (const fn of namespace.functions) {
97
- if (fn.parameters.length > 0) continue;
98
- if (!fn.introspectable || fn.shadowedBy !== undefined || fn.cIdentifier === undefined) continue;
99
- const exportName = namespaceFunctionExportName(fn.cIdentifier, fn.name, context.namespace.cSymbolPrefixes);
100
- if (fn.name === "init") {
101
- context.module.appendRegistration(`${exportName}();`);
102
- } else if (fn.name === "finalize") {
103
- context.addRuntimeImport("onExit");
104
- context.module.appendRegistration(`onExit(${exportName});`);
164
+ if (!isBootstrapFunction(fn) || fn.cIdentifier === undefined) {
165
+ continue;
105
166
  }
167
+
168
+ const exportName = namespaceFunctionExportName(fn.cIdentifier, fn.name, context.namespace.cSymbolPrefixes);
169
+ appendBootstrapRegistration(context, fn, exportName);
106
170
  }
107
171
  };
172
+
173
+ export { renderFnExpression, generateNamespaceFunction, namespaceFunctionExportName, generateNamespaceBootstrap };
@@ -1,33 +1,46 @@
1
1
  import { sourceStringLiteral } from "@gtkx/utils";
2
- import { PRIMITIVE_TS_TYPE } from "../../gir/primitives.js";
3
2
  import type { ModuleContext } from "../../writer/context.js";
3
+ import { PRIMITIVE_TS_TYPE } from "../../gir/primitives.js";
4
+
5
+ type TypeSource = {
6
+ glibGetType: string | undefined;
7
+ glibTypeName: string | undefined;
8
+ };
4
9
 
5
- export const gtypeTsType = (context: ModuleContext): string =>
10
+ const gtypeTsType = (context: ModuleContext): string =>
6
11
  context.namespace.name === "GObject" ? "Type" : PRIMITIVE_TS_TYPE.gtype;
7
12
 
8
- export const gtypeMemberDeclaration = (context: ModuleContext): string => `declare __type__: ${gtypeTsType(context)};`;
13
+ const gtypeMemberDeclaration = (context: ModuleContext): string => `declare __type__: ${gtypeTsType(context)};`;
9
14
 
10
- const renderGtypeExpression = (
11
- context: ModuleContext,
12
- getType: string,
13
- typeName: string | undefined,
14
- ): string | undefined => {
15
- if (getType === "intern") {
16
- if (typeName === undefined) return undefined;
17
- if (context.namespace.name !== "GObject") context.addRuntimeImport("typeFromName");
18
- return `typeFromName(${sourceStringLiteral(typeName)})`;
15
+ const renderInternGtype = (context: ModuleContext, typeName: string | undefined): string | undefined => {
16
+ if (typeName === undefined) {
17
+ return undefined;
18
+ }
19
+
20
+ if (context.namespace.name !== "GObject") {
21
+ context.addRuntimeImport("typeFromName");
19
22
  }
23
+
24
+ return `typeFromName(${sourceStringLiteral(typeName)})`;
25
+ };
26
+
27
+ const renderResolveGtype = (context: ModuleContext, typeFnName: string): string => {
20
28
  context.addRuntimeImport("resolveType");
21
29
  const lib = context.namespace.sharedLibrary ?? "";
22
- return `resolveType(${sourceStringLiteral(lib)}, ${sourceStringLiteral(getType)})`;
23
- };
24
30
 
25
- type TypeSource = {
26
- glibGetType: string | undefined;
27
- glibTypeName: string | undefined;
31
+ return `resolveType(${sourceStringLiteral(lib)}, ${sourceStringLiteral(typeFnName)})`;
28
32
  };
29
33
 
30
- export const gtypeExprFor = (context: ModuleContext, source: TypeSource): string | undefined =>
34
+ const renderGtypeExpression = (
35
+ context: ModuleContext,
36
+ typeFnName: string,
37
+ typeName: string | undefined,
38
+ ): string | undefined =>
39
+ typeFnName === "intern" ? renderInternGtype(context, typeName) : renderResolveGtype(context, typeFnName);
40
+
41
+ const renderSourceGtype = (context: ModuleContext, source: TypeSource): string | undefined =>
31
42
  source.glibGetType === undefined
32
43
  ? undefined
33
44
  : renderGtypeExpression(context, source.glibGetType, source.glibTypeName);
45
+
46
+ export { gtypeTsType, gtypeMemberDeclaration, renderSourceGtype };
@@ -1,20 +1,21 @@
1
- import { toPascalCase } from "@gtkx/utils";
2
- import { reservedSignalMemberRename, resolvePrerequisiteReference } from "../../analysis/inheritance.js";
1
+ import { pascalCase } from "@gtkx/utils";
3
2
  import type { GirClass } from "../../gir/class.js";
4
3
  import type { GirFunction } from "../../gir/function.js";
5
4
  import type { ModuleContext } from "../../writer/context.js";
5
+ import { reservedSignalMemberRename, resolvePrerequisiteReference } from "../../analysis/inheritance.js";
6
6
  import { renderJsDoc } from "../../writer/doc.js";
7
7
  import { renderBlock, renderBracedOrEmpty } from "../../writer/emit.js";
8
8
  import {
9
9
  type Callables,
10
10
  dedupeCallables,
11
11
  generateBindings,
12
- indexMethodsByName,
12
+ type InstanceScope,
13
+ instanceScope,
13
14
  renderClassInstanceMember,
14
15
  renderInstanceMethodSignature,
15
16
  renderStaticHead,
16
17
  } from "./callables.js";
17
- import { gtypeExprFor } from "./gtype-binding.js";
18
+ import { renderSourceGtype } from "./gtype-binding.js";
18
19
  import { methodExportName } from "./method.js";
19
20
  import {
20
21
  type PropertyAccessorArgs,
@@ -25,24 +26,59 @@ import { appendInterfaceRegistration } from "./registration.js";
25
26
  import { renderSignalDeclarations, renderSignalMembers } from "./signal.js";
26
27
  import { renderVfuncMetadata } from "./vtable.js";
27
28
 
28
- export const generateInterface = (context: ModuleContext, iface: GirClass): void => {
29
- if (!iface.introspectable) return;
30
- if (iface.name.length === 0) return;
31
- const className = toPascalCase(iface.name);
29
+ type InterfaceMemberRenderers = {
30
+ renderMethod: (
31
+ context: ModuleContext,
32
+ callable: GirFunction,
33
+ scope: InstanceScope,
34
+ nameOverride?: string,
35
+ ) => string | undefined;
36
+ renderProperty: (args: PropertyAccessorArgs) => string | undefined;
37
+ };
38
+
39
+ type MethodMemberOptions = {
40
+ context: ModuleContext;
41
+ className: string;
42
+ scope: InstanceScope;
43
+ callables: Callables;
44
+ renderers: InterfaceMemberRenderers;
45
+ claimedNames: Set<string>;
46
+ };
47
+
48
+ type PropertyMemberOptions = {
49
+ context: ModuleContext;
50
+ iface: GirClass;
51
+ scope: InstanceScope;
52
+ renderers: InterfaceMemberRenderers;
53
+ claimedNames: Set<string>;
54
+ };
55
+
56
+ const generateInterface = (context: ModuleContext, iface: GirClass): void => {
57
+ if (!iface.introspectable) {
58
+ return;
59
+ }
60
+
61
+ if (iface.name.length === 0) {
62
+ return;
63
+ }
64
+
65
+ const className = pascalCase(iface.name);
66
+
32
67
  const callables: Callables = {
33
68
  constructors: dedupeCallables(iface.constructors),
34
69
  functions: dedupeCallables(iface.functions),
35
70
  methods: dedupeCallables(iface.methods),
36
71
  };
37
- generateBindings(context, callables);
38
-
39
- const gtypeExpr = gtypeExprFor(context, iface);
40
72
 
73
+ generateBindings(context, callables);
74
+ const gtypeExpr = renderSourceGtype(context, iface);
41
75
  context.module.appendDeclaration(renderInterfaceType(context, iface, className, callables));
42
76
  context.module.appendDeclaration(renderInterfaceClass(context, className, callables, gtypeExpr));
77
+
43
78
  for (const declaration of renderSignalDeclarations(context, iface, className, true)) {
44
79
  context.module.appendDeclaration(declaration);
45
80
  }
81
+
46
82
  context.module.appendDeclaration(renderInterfaceMaker(context, iface, className, callables));
47
83
 
48
84
  appendInterfaceRegistration(context, {
@@ -59,7 +95,11 @@ const interfaceTypeExtends = (context: ModuleContext, iface: GirClass): string =
59
95
  const refs = iface.prerequisites
60
96
  .map((name) => resolvePrerequisiteReference(context, name))
61
97
  .filter((entry): entry is string => entry !== undefined);
62
- if (refs.length > 0) return refs.join(", ");
98
+
99
+ if (refs.length > 0) {
100
+ return refs.join(", ");
101
+ }
102
+
63
103
  return context.qualify("GObject", "Object");
64
104
  };
65
105
 
@@ -70,46 +110,62 @@ const renderInterfaceType = (
70
110
  callables: Callables,
71
111
  ): string => {
72
112
  const members = renderInterfaceTypeMembers(context, iface, callables);
113
+
73
114
  return `${renderJsDoc(iface.doc)}${renderBracedOrEmpty(
74
115
  `export interface ${className} extends ${interfaceTypeExtends(context, iface)}`,
75
116
  members.join("\n"),
76
117
  )}`;
77
118
  };
78
119
 
79
- type InterfaceMemberRenderers = {
80
- renderMethod: (
81
- context: ModuleContext,
82
- callable: GirFunction,
83
- methodByName: Map<string, GirFunction>,
84
- nameOverride?: string,
85
- ) => string | undefined;
86
- renderProperty: (args: PropertyAccessorArgs) => string | undefined;
87
- };
88
-
89
- const renderInterfaceMembers = (
90
- context: ModuleContext,
91
- iface: GirClass,
92
- callables: Callables,
93
- renderers: InterfaceMemberRenderers,
94
- ): string[] => {
95
- const className = toPascalCase(iface.name);
120
+ const collectMethodMembers = (options: MethodMemberOptions): string[] => {
121
+ const { context, className, scope, callables, renderers, claimedNames } = options;
96
122
  const members: string[] = [];
97
- const claimedNames = new Set<string>();
98
- const methodByName = indexMethodsByName(callables.methods);
123
+
99
124
  for (const callable of callables.methods) {
100
125
  const rename = reservedSignalMemberRename(className, callable);
101
- const block = renderers.renderMethod(context, callable, methodByName, rename);
102
- if (block === undefined) continue;
126
+ const block = renderers.renderMethod(context, callable, scope, rename);
127
+
128
+ if (block === undefined) {
129
+ continue;
130
+ }
131
+
103
132
  members.push(block);
104
133
  claimedNames.add(rename ?? methodExportName(callable));
105
134
  }
135
+
136
+ return members;
137
+ };
138
+
139
+ const collectPropertyMembers = (options: PropertyMemberOptions): string[] => {
140
+ const { context, iface, scope, renderers, claimedNames } = options;
141
+ const members: string[] = [];
142
+
106
143
  for (const property of iface.properties) {
107
- const block = renderers.renderProperty({ context, property, claimedNames, methodByName });
108
- if (block !== undefined) members.push(block);
144
+ const block = renderers.renderProperty({ context, property, claimedNames, methodByName: scope.methodByName });
145
+
146
+ if (block !== undefined) {
147
+ members.push(block);
148
+ }
109
149
  }
150
+
110
151
  return members;
111
152
  };
112
153
 
154
+ const renderInterfaceMembers = (
155
+ context: ModuleContext,
156
+ iface: GirClass,
157
+ callables: Callables,
158
+ renderers: InterfaceMemberRenderers,
159
+ ): string[] => {
160
+ const className = pascalCase(iface.name);
161
+ const scope = instanceScope(className, callables);
162
+ const claimedNames: Set<string> = new Set();
163
+ const methodMembers = collectMethodMembers({ context, className, scope, callables, renderers, claimedNames });
164
+ const propertyMembers = collectPropertyMembers({ context, iface, scope, renderers, claimedNames });
165
+
166
+ return [...methodMembers, ...propertyMembers];
167
+ };
168
+
113
169
  const renderInterfaceTypeMembers = (context: ModuleContext, iface: GirClass, callables: Callables): string[] =>
114
170
  renderInterfaceMembers(context, iface, callables, {
115
171
  renderMethod: renderInstanceMethodSignature,
@@ -123,13 +179,19 @@ const renderInterfaceClass = (
123
179
  gtypeExpr: string | undefined,
124
180
  ): string => {
125
181
  const members: string[] = [];
126
- if (gtypeExpr !== undefined) members.push(renderInterfaceHasInstance(context, className, gtypeExpr));
182
+
183
+ if (gtypeExpr !== undefined) {
184
+ members.push(renderInterfaceHasInstance(context, className, gtypeExpr));
185
+ }
186
+
127
187
  members.push(...renderStaticHead(context, callables, className));
188
+
128
189
  return renderBracedOrEmpty(`export abstract class ${className}`, members.join("\n\n"));
129
190
  };
130
191
 
131
192
  const renderInterfaceHasInstance = (context: ModuleContext, className: string, gtypeExpr: string): string => {
132
193
  context.addRuntimeImport("valueIsA");
194
+
133
195
  return renderBlock(
134
196
  `static [Symbol.hasInstance](value: unknown): value is ${className}`,
135
197
  `return valueIsA(value, ${gtypeExpr});`,
@@ -145,6 +207,7 @@ const renderInterfaceMaker = (
145
207
  context.addRuntimeTypeImport("Mixin");
146
208
  const members = renderInterfaceInstanceMembers(context, iface, callables);
147
209
  const classExpression = renderBracedOrEmpty("class extends Base", members.join("\n\n"));
210
+
148
211
  return `export const ${makerName(className)}: Mixin = (Base) =>\n${classExpression};`;
149
212
  };
150
213
 
@@ -155,3 +218,5 @@ const renderInterfaceInstanceMembers = (context: ModuleContext, iface: GirClass,
155
218
  }),
156
219
  ...renderSignalMembers(context, iface),
157
220
  ];
221
+
222
+ export { generateInterface };