@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,4 +1,7 @@
1
- import { toCamelIdentifier, toPascalCase } from "@gtkx/utils";
1
+ import { pascalCase, toCamelIdentifier } from "@gtkx/utils";
2
+ import type { GirClass } from "../../gir/class.js";
3
+ import type { GirFunction } from "../../gir/function.js";
4
+ import type { ModuleContext } from "../../writer/context.js";
2
5
  import {
3
6
  collectInheritedMethods,
4
7
  collectInheritedPropertyTypes,
@@ -6,11 +9,8 @@ import {
6
9
  conflictRename,
7
10
  type InheritedMethods,
8
11
  } from "../../analysis/inheritance.js";
9
- import { ancestorChain } from "../../gir/ancestry.js";
10
- import type { GirClass } from "../../gir/class.js";
11
- import type { GirFunction } from "../../gir/function.js";
12
+ import { ancestorChain, type ResolvedAncestor } from "../../gir/ancestry.js";
12
13
  import { splitOptionalNamespace } from "../../gir/type-ref.js";
13
- import type { ModuleContext } from "../../writer/context.js";
14
14
  import { renderJsDoc } from "../../writer/doc.js";
15
15
  import { indentMembers } from "../../writer/emit.js";
16
16
  import {
@@ -18,15 +18,16 @@ import {
18
18
  classConstructorMemberNames,
19
19
  dedupeCallables,
20
20
  generateBindings,
21
- indexMethodsByName,
21
+ type InstanceScope,
22
+ instanceScope,
22
23
  renderClassInstanceMember,
23
24
  renderStaticHead,
24
25
  } from "./callables.js";
25
26
  import { renderClassConstructor, renderConstructorPropsInterface } from "./constructor-props.js";
26
- import { gtypeExprFor, gtypeMemberDeclaration } from "./gtype-binding.js";
27
+ import { gtypeMemberDeclaration, renderSourceGtype } from "./gtype-binding.js";
27
28
  import { methodExportName } from "./method.js";
28
29
  import { renderPropertyDeclarations } from "./properties.js";
29
- import { type ResolvedAccessor, renderResolvedPropertyAccessor, resolveAccessor } from "./property-accessor.js";
30
+ import { renderResolvedPropertyAccessor, resolveAccessor, type ResolvedAccessor } from "./property-accessor.js";
30
31
  import { appendWrapperClassRegistration } from "./registration.js";
31
32
  import { renderSignalDeclarations, renderSignalMembers } from "./signal.js";
32
33
  import { renderVfuncMetadata } from "./vtable.js";
@@ -38,17 +39,44 @@ type ImplementedRef = {
38
39
  interfaceNamespace: string;
39
40
  };
40
41
 
41
- export const generateClass = (context: ModuleContext, klass: GirClass): void => {
42
- if (!klass.introspectable) return;
43
- if (klass.name.length === 0) return;
44
- const className = toPascalCase(klass.name);
42
+ type MemberDeclarationsOptions = {
43
+ context: ModuleContext;
44
+ klass: GirClass;
45
+ className: string;
46
+ accessors: ResolvedAccessor[];
47
+ implemented: ImplementedRef[];
48
+ };
49
+
50
+ type ClassMembers = { members: string[]; accessors: ResolvedAccessor[] };
51
+
52
+ type AppendInstanceMethodsOptions = {
53
+ context: ModuleContext;
54
+ methods: GirFunction[];
55
+ scope: InstanceScope;
56
+ inherited: InheritedMethods;
57
+ members: string[];
58
+ claimedNames: Set<string>;
59
+ className: string;
60
+ };
61
+
62
+ const generateClass = (context: ModuleContext, klass: GirClass): void => {
63
+ if (!klass.introspectable) {
64
+ return;
65
+ }
66
+
67
+ if (klass.name.length === 0) {
68
+ return;
69
+ }
70
+
71
+ const className = pascalCase(klass.name);
72
+
45
73
  const callables: Callables = {
46
74
  constructors: dedupeCallables(klass.constructors),
47
75
  functions: dedupeCallables(klass.functions),
48
76
  methods: dedupeCallables(klass.methods),
49
77
  };
50
- generateBindings(context, callables);
51
78
 
79
+ generateBindings(context, callables);
52
80
  const parentExpression = resolveParent(context, klass);
53
81
  const extendsClause = renderExtendsClause(context, parentExpression, callables);
54
82
  const implemented = resolveImplementedRefs(context, klass);
@@ -56,26 +84,44 @@ export const generateClass = (context: ModuleContext, klass: GirClass): void =>
56
84
  const implementsClause = typeRefs.length === 0 ? "" : ` implements ${typeRefs.join(", ")}`;
57
85
  const { members, accessors } = renderClassMembers(context, klass, callables, parentExpression !== undefined);
58
86
  const body = indentMembers(members);
87
+
59
88
  context.module.appendDeclaration(
60
89
  `${renderJsDoc(klass.doc)}export class ${className}${extendsClause}${implementsClause} {\n${body}\n}`,
61
90
  );
91
+
62
92
  context.module.appendDeclaration(renderConstructorPropsInterface(context, klass, className));
93
+ appendMemberDeclarations({ context, klass, className, accessors, implemented });
94
+ appendInstallMixins(context, className, implemented);
95
+ appendClassRegistrations(context, klass, className);
96
+ };
97
+
98
+ const appendMemberDeclarations = (options: MemberDeclarationsOptions): void => {
99
+ const { context, klass, className, accessors, implemented } = options;
100
+
63
101
  for (const declaration of renderPropertyDeclarations(context, klass, className, accessors)) {
64
102
  context.module.appendDeclaration(declaration);
65
103
  }
104
+
66
105
  for (const declaration of renderSignalDeclarations(context, klass, className, false)) {
67
106
  context.module.appendDeclaration(declaration);
68
107
  }
69
- if (typeRefs.length > 0) {
70
- const mergeRefs = implemented.map((ref) => interfaceMergeRef(context, klass, ref));
71
- context.module.appendDeclaration(`export interface ${className} extends ${mergeRefs.join(", ")} {}`);
72
- }
73
108
 
74
- appendInstallMixins(context, className, implemented);
75
- appendClassRegistrations(context, klass, className);
109
+ appendInterfaceMerge(context, klass, className, implemented);
76
110
  };
77
111
 
78
- type ClassMembers = { members: string[]; accessors: ResolvedAccessor[] };
112
+ const appendInterfaceMerge = (
113
+ context: ModuleContext,
114
+ klass: GirClass,
115
+ className: string,
116
+ implemented: ImplementedRef[],
117
+ ): void => {
118
+ if (implemented.length === 0) {
119
+ return;
120
+ }
121
+
122
+ const mergeRefs = implemented.map((ref) => interfaceMergeRef(context, klass, ref));
123
+ context.module.appendDeclaration(`export interface ${className} extends ${mergeRefs.join(", ")} {}`);
124
+ };
79
125
 
80
126
  const renderClassMembers = (
81
127
  context: ModuleContext,
@@ -83,66 +129,85 @@ const renderClassMembers = (
83
129
  callables: Callables,
84
130
  hasParent: boolean,
85
131
  ): ClassMembers => {
86
- const className = toPascalCase(klass.name);
132
+ const className = pascalCase(klass.name);
87
133
  const members: string[] = [gtypeMemberDeclaration(context)];
88
134
  const constructorBlock = renderClassConstructor(context, klass, className, hasParent);
89
- if (constructorBlock !== undefined) members.push(constructorBlock);
90
- const claimedNames = new Set<string>();
135
+
136
+ if (constructorBlock !== undefined) {
137
+ members.push(constructorBlock);
138
+ }
139
+
140
+ const claimedNames: Set<string> = new Set();
91
141
  members.push(...renderStaticHead(context, callables, className));
92
142
  const inherited = collectInheritedMethods(context, klass);
93
- const methodByName = indexMethodsByName(callables.methods);
143
+ const scope = instanceScope(className, callables);
144
+
94
145
  appendInstanceMethods({
95
146
  context,
96
147
  methods: callables.methods,
97
- methodByName,
148
+ scope,
98
149
  inherited,
99
150
  members,
100
151
  claimedNames,
101
152
  className,
102
153
  });
154
+
103
155
  const inheritedPropertyTypes = collectInheritedPropertyTypes(context, klass);
104
156
  const accessors: ResolvedAccessor[] = [];
157
+
105
158
  for (const property of klass.properties) {
106
159
  const inheritedType = inheritedPropertyTypes.get(toCamelIdentifier(property.name));
107
- const accessor = resolveAccessor({ context, property, claimedNames, methodByName, inheritedType });
108
- if (accessor === undefined) continue;
160
+
161
+ const accessor = resolveAccessor({
162
+ context,
163
+ property,
164
+ claimedNames,
165
+ methodByName: scope.methodByName,
166
+ inheritedType,
167
+ });
168
+
169
+ if (accessor === undefined) {
170
+ continue;
171
+ }
172
+
109
173
  accessors.push(accessor);
110
174
  members.push(renderResolvedPropertyAccessor(context, property, accessor));
111
175
  }
176
+
112
177
  members.push(...renderSignalMembers(context, klass));
113
- return { members, accessors };
114
- };
115
178
 
116
- type AppendInstanceMethodsOptions = {
117
- context: ModuleContext;
118
- methods: GirFunction[];
119
- methodByName: Map<string, GirFunction>;
120
- inherited: InheritedMethods;
121
- members: string[];
122
- claimedNames: Set<string>;
123
- className: string;
179
+ return { members, accessors };
124
180
  };
125
181
 
126
182
  const appendInstanceMethods = (options: AppendInstanceMethodsOptions): void => {
127
- const { context, methods, methodByName, inherited, members, claimedNames, className } = options;
183
+ const { context, methods, scope, inherited, members, claimedNames, className } = options;
184
+
128
185
  for (const callable of methods) {
129
186
  const rename = conflictRename(context, callable, inherited, className);
130
- const block = renderClassInstanceMember(context, callable, methodByName, rename);
131
- if (block === undefined) continue;
187
+ const block = renderClassInstanceMember(context, callable, scope, rename);
188
+
189
+ if (block === undefined) {
190
+ continue;
191
+ }
192
+
132
193
  members.push(block);
133
194
  claimedNames.add(rename ?? methodExportName(callable));
134
195
  }
135
196
  };
136
197
 
137
198
  const appendInstallMixins = (context: ModuleContext, className: string, implemented: ImplementedRef[]): void => {
138
- if (implemented.length === 0) return;
199
+ if (implemented.length === 0) {
200
+ return;
201
+ }
202
+
139
203
  context.addRuntimeImport("installMixins");
140
204
  const makers = implemented.map((ref) => ref.makerRef).join(", ");
141
205
  context.module.appendRegistration(`installMixins(${className}, [${makers}]);`);
142
206
  };
143
207
 
144
208
  const appendClassRegistrations = (context: ModuleContext, klass: GirClass, className: string): void => {
145
- const gtypeExpr = gtypeExprFor(context, klass);
209
+ const gtypeExpr = renderSourceGtype(context, klass);
210
+
146
211
  appendWrapperClassRegistration(context, {
147
212
  className,
148
213
  gtypeExpr,
@@ -150,17 +215,33 @@ const appendClassRegistrations = (context: ModuleContext, klass: GirClass, class
150
215
  });
151
216
  };
152
217
 
218
+ const addAncestorInterfaceKeys = (context: ModuleContext, ancestor: ResolvedAncestor, keys: Set<string>): void => {
219
+ for (const name of ancestor.klass.implements) {
220
+ const resolved = context.library.resolveType(ancestor.namespaceName, name);
221
+
222
+ if (resolved?.kind === "interface") {
223
+ keys.add(`${resolved.namespace.name}.${resolved.value.name}`);
224
+ }
225
+ }
226
+ };
227
+
153
228
  const inheritedInterfaceKeys = (context: ModuleContext, klass: GirClass): Set<string> => {
154
- const keys = new Set<string>();
155
- if (klass.parent === undefined) return keys;
229
+ const keys: Set<string> = new Set();
230
+
231
+ if (klass.parent === undefined) {
232
+ return keys;
233
+ }
234
+
156
235
  const parent = context.library.resolveType(context.namespace.name, klass.parent);
157
- if (parent === undefined || parent.kind !== "class") return keys;
236
+
237
+ if (parent?.kind !== "class") {
238
+ return keys;
239
+ }
240
+
158
241
  for (const ancestor of ancestorChain(context.library, parent.value, parent.namespace.name)) {
159
- for (const name of ancestor.klass.implements) {
160
- const resolved = context.library.resolveType(ancestor.namespaceName, name);
161
- if (resolved?.kind === "interface") keys.add(`${resolved.namespace.name}.${resolved.value.name}`);
162
- }
242
+ addAncestorInterfaceKeys(context, ancestor, keys);
163
243
  }
244
+
164
245
  return keys;
165
246
  };
166
247
 
@@ -169,26 +250,53 @@ const interfaceMergeRef = (context: ModuleContext, klass: GirClass, ref: Impleme
169
250
  klass: ref.interfaceKlass,
170
251
  namespaceName: ref.interfaceNamespace,
171
252
  });
172
- if (omissions.length === 0) return ref.typeRef;
253
+
254
+ if (omissions.length === 0) {
255
+ return ref.typeRef;
256
+ }
257
+
173
258
  const keys = omissions.map((name) => JSON.stringify(name)).join(" | ");
259
+
174
260
  return `Omit<${ref.typeRef}, ${keys}>`;
175
261
  };
176
262
 
263
+ const implementedRefFor = (
264
+ context: ModuleContext,
265
+ name: string,
266
+ inherited: Set<string>,
267
+ ): ImplementedRef | undefined => {
268
+ const resolved = context.library.resolveType(context.namespace.name, name);
269
+
270
+ if (resolved?.kind !== "interface") {
271
+ return undefined;
272
+ }
273
+
274
+ if (inherited.has(`${resolved.namespace.name}.${resolved.value.name}`)) {
275
+ return undefined;
276
+ }
277
+
278
+ const pascal = pascalCase(resolved.value.name);
279
+
280
+ return {
281
+ typeRef: context.qualify(resolved.namespace.name, pascal),
282
+ makerRef: context.qualify(resolved.namespace.name, `make${pascal}`),
283
+ interfaceKlass: resolved.value,
284
+ interfaceNamespace: resolved.namespace.name,
285
+ };
286
+ };
287
+
177
288
  const resolveImplementedRefs = (context: ModuleContext, klass: GirClass): ImplementedRef[] => {
178
289
  const inherited = inheritedInterfaceKeys(context, klass);
179
290
  const refs: ImplementedRef[] = [];
291
+
180
292
  for (const name of klass.implements) {
181
- const resolved = context.library.resolveType(context.namespace.name, name);
182
- if (resolved === undefined || resolved.kind !== "interface") continue;
183
- if (inherited.has(`${resolved.namespace.name}.${resolved.value.name}`)) continue;
184
- const pascal = toPascalCase(resolved.value.name);
185
- refs.push({
186
- typeRef: context.qualify(resolved.namespace.name, pascal),
187
- makerRef: context.qualify(resolved.namespace.name, `make${pascal}`),
188
- interfaceKlass: resolved.value,
189
- interfaceNamespace: resolved.namespace.name,
190
- });
293
+ const ref = implementedRefFor(context, name, inherited);
294
+
295
+ if (ref !== undefined) {
296
+ refs.push(ref);
297
+ }
191
298
  }
299
+
192
300
  return refs;
193
301
  };
194
302
 
@@ -197,16 +305,30 @@ const renderExtendsClause = (
197
305
  parentExpression: string | undefined,
198
306
  callables: Callables,
199
307
  ): string => {
200
- if (parentExpression === undefined) return "";
308
+ if (parentExpression === undefined) {
309
+ return "";
310
+ }
311
+
201
312
  const constructorNames = classConstructorMemberNames(context, callables);
202
- if (constructorNames.length === 0) return ` extends ${parentExpression}`;
313
+
314
+ if (constructorNames.length === 0) {
315
+ return ` extends ${parentExpression}`;
316
+ }
317
+
203
318
  context.addRuntimeTypeImport("StaticBase");
204
319
  const omitted = constructorNames.map((name) => JSON.stringify(name)).join(" | ");
320
+
205
321
  return ` extends (${parentExpression} as StaticBase<typeof ${parentExpression}, ${omitted}>)`;
206
322
  };
207
323
 
208
324
  const resolveParent = (context: ModuleContext, klass: GirClass): string | undefined => {
209
- if (klass.parent === undefined) return undefined;
325
+ if (klass.parent === undefined) {
326
+ return undefined;
327
+ }
328
+
210
329
  const [namespace, typeName] = splitOptionalNamespace(klass.parent);
211
- return context.qualify(namespace ?? context.namespace.name, toPascalCase(typeName));
330
+
331
+ return context.qualify(namespace ?? context.namespace.name, pascalCase(typeName));
212
332
  };
333
+
334
+ export { generateClass };
@@ -1,13 +1,22 @@
1
- import { toPascalCase } from "@gtkx/utils";
1
+ import { pascalCase } from "@gtkx/utils";
2
2
  import type { GirClass } from "../../gir/class.js";
3
- import { splitOptionalNamespace } from "../../gir/type-ref.js";
4
3
  import type { ModuleContext } from "../../writer/context.js";
4
+ import { splitOptionalNamespace } from "../../gir/type-ref.js";
5
+
6
+ const parentCompanionRef = (context: ModuleContext, klass: GirClass, suffix: string): string | undefined => {
7
+ if (klass.parent === undefined) {
8
+ return undefined;
9
+ }
5
10
 
6
- export const parentCompanionRef = (context: ModuleContext, klass: GirClass, suffix: string): string | undefined => {
7
- if (klass.parent === undefined) return undefined;
8
11
  const [parentNamespace, typeName] = splitOptionalNamespace(klass.parent);
9
12
  const namespaceName = parentNamespace ?? context.namespace.name;
10
- const name = `${toPascalCase(typeName)}${suffix}`;
11
- if (namespaceName === context.namespace.name) return name;
13
+ const name = `${pascalCase(typeName)}${suffix}`;
14
+
15
+ if (namespaceName === context.namespace.name) {
16
+ return name;
17
+ }
18
+
12
19
  return `${context.addCrossNamespaceImport(namespaceName)}.${name}`;
13
20
  };
21
+
22
+ export { parentCompanionRef };
@@ -1,24 +1,58 @@
1
1
  import { sourceStringLiteral } from "@gtkx/utils";
2
2
  import type { GirConstant } from "../../gir/namespace.js";
3
+ import type { PrimitiveCategory } from "../../gir/primitives.js";
3
4
  import type { TypeId } from "../../gir/type-id.js";
4
5
  import type { ModuleContext } from "../../writer/context.js";
5
6
  import { renderJsDoc } from "../../writer/doc.js";
6
7
 
7
- export const generateConstant = (context: ModuleContext, constant: GirConstant): void => {
8
+ const TRUE_VALUES: Set<string> = new Set(["true", "1"]);
9
+ // A `gint64`/`guint64` constant is typed `bigint`, and its decimal text does not survive a double:
10
+ // G_MAXINT64 rounds to 2^63. The literal has to carry the BigInt suffix the type promises.
11
+ const BIGINT_CATEGORIES: Set<PrimitiveCategory> = new Set(["bigint64", "biguint64", "gtype"]);
12
+
13
+ const generateConstant = (context: ModuleContext, constant: GirConstant): void => {
8
14
  context.module.appendDeclaration(
9
15
  `${renderJsDoc(constant.doc)}export const ${constant.name} = ${constantLiteral(context, constant)};`,
10
16
  );
11
17
  };
12
18
 
13
- export const constantLiteral = (context: ModuleContext, constant: GirConstant): string => {
14
- if (isStringTyped(context, constant.type)) return sourceStringLiteral(constant.value);
15
- return isNumericLiteral(constant.value) ? constant.value : sourceStringLiteral(constant.value);
19
+ const constantLiteral = (context: ModuleContext, constant: GirConstant): string => {
20
+ if (hasPrimitiveCategory(context, constant.type, "string")) {
21
+ return sourceStringLiteral(constant.value);
22
+ }
23
+
24
+ if (hasPrimitiveCategory(context, constant.type, "boolean")) {
25
+ return TRUE_VALUES.has(constant.value) ? "true" : "false";
26
+ }
27
+
28
+ return numericConstantLiteral(context, constant);
29
+ };
30
+
31
+ const numericConstantLiteral = (context: ModuleContext, constant: GirConstant): string => {
32
+ if (!isNumericLiteral(constant.value)) {
33
+ return sourceStringLiteral(constant.value);
34
+ }
35
+
36
+ return isBigIntConstant(context, constant.type) ? `${constant.value}n` : constant.value;
16
37
  };
17
38
 
18
- const isStringTyped = (context: ModuleContext, type: TypeId | undefined): boolean => {
19
- if (type === undefined) return false;
20
- const resolved = context.library.typeOf(type);
21
- return resolved?.kind === "primitive" && resolved.category === "string";
39
+ const isBigIntConstant = (context: ModuleContext, type: TypeId | undefined): boolean =>
40
+ [...BIGINT_CATEGORIES].some((category) => hasPrimitiveCategory(context, type, category));
41
+
42
+ const hasPrimitiveCategory = (
43
+ context: ModuleContext,
44
+ type: TypeId | undefined,
45
+ category: PrimitiveCategory,
46
+ ): boolean => {
47
+ if (type === undefined) {
48
+ return false;
49
+ }
50
+
51
+ const resolved = context.library.typeFor(type);
52
+
53
+ return resolved?.kind === "primitive" && resolved.category === category;
22
54
  };
23
55
 
24
56
  const isNumericLiteral = (value: string): boolean => /^-?(?:\d+|\d*\.\d+)$/.test(value);
57
+
58
+ export { generateConstant, constantLiteral };
@@ -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 };