@gtkx/codegen 0.21.0 → 1.0.0-rc.1

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 (732) hide show
  1. package/README.md +173 -0
  2. package/dist/analysis/descriptor-render.d.ts +18 -0
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -0
  4. package/dist/analysis/descriptor-render.js +297 -0
  5. package/dist/analysis/descriptor-render.js.map +1 -0
  6. package/dist/analysis/descriptor.d.ts +59 -0
  7. package/dist/analysis/descriptor.d.ts.map +1 -0
  8. package/dist/analysis/descriptor.js +123 -0
  9. package/dist/analysis/descriptor.js.map +1 -0
  10. package/dist/analysis/inheritance.d.ts +38 -0
  11. package/dist/analysis/inheritance.d.ts.map +1 -0
  12. package/dist/analysis/inheritance.js +193 -0
  13. package/dist/analysis/inheritance.js.map +1 -0
  14. package/dist/analysis/param-structure.d.ts +26 -0
  15. package/dist/analysis/param-structure.d.ts.map +1 -0
  16. package/dist/analysis/param-structure.js +107 -0
  17. package/dist/analysis/param-structure.js.map +1 -0
  18. package/dist/analysis/ts-type.d.ts +19 -0
  19. package/dist/analysis/ts-type.d.ts.map +1 -0
  20. package/dist/analysis/ts-type.js +65 -0
  21. package/dist/analysis/ts-type.js.map +1 -0
  22. package/dist/compile.d.ts +18 -0
  23. package/dist/compile.d.ts.map +1 -0
  24. package/dist/compile.js +123 -0
  25. package/dist/compile.js.map +1 -0
  26. package/dist/docs/api-reference.d.ts +66 -0
  27. package/dist/docs/api-reference.d.ts.map +1 -0
  28. package/dist/docs/api-reference.js +299 -0
  29. package/dist/docs/api-reference.js.map +1 -0
  30. package/dist/docs/element-page.d.ts +15 -0
  31. package/dist/docs/element-page.d.ts.map +1 -0
  32. package/dist/docs/element-page.js +221 -0
  33. package/dist/docs/element-page.js.map +1 -0
  34. package/dist/docs/pipeline.d.ts +25 -0
  35. package/dist/docs/pipeline.d.ts.map +1 -0
  36. package/dist/docs/pipeline.js +130 -0
  37. package/dist/docs/pipeline.js.map +1 -0
  38. package/dist/docs/render.d.ts +32 -0
  39. package/dist/docs/render.d.ts.map +1 -0
  40. package/dist/docs/render.js +134 -0
  41. package/dist/docs/render.js.map +1 -0
  42. package/dist/docs/symbol-page.d.ts +41 -0
  43. package/dist/docs/symbol-page.d.ts.map +1 -0
  44. package/dist/docs/symbol-page.js +338 -0
  45. package/dist/docs/symbol-page.js.map +1 -0
  46. package/dist/fingerprint.d.ts +6 -26
  47. package/dist/fingerprint.d.ts.map +1 -1
  48. package/dist/fingerprint.js +30 -18
  49. package/dist/fingerprint.js.map +1 -1
  50. package/dist/gir/ancestry.d.ts +9 -0
  51. package/dist/gir/ancestry.d.ts.map +1 -0
  52. package/dist/gir/ancestry.js +29 -0
  53. package/dist/gir/ancestry.js.map +1 -0
  54. package/dist/gir/callback.d.ts +9 -10
  55. package/dist/gir/callback.d.ts.map +1 -1
  56. package/dist/gir/callback.js +17 -16
  57. package/dist/gir/callback.js.map +1 -1
  58. package/dist/gir/class.d.ts +22 -43
  59. package/dist/gir/class.d.ts.map +1 -1
  60. package/dist/gir/class.js +11 -23
  61. package/dist/gir/class.js.map +1 -1
  62. package/dist/gir/enum.d.ts +13 -31
  63. package/dist/gir/enum.d.ts.map +1 -1
  64. package/dist/gir/enum.js +7 -14
  65. package/dist/gir/enum.js.map +1 -1
  66. package/dist/gir/field.d.ts +10 -23
  67. package/dist/gir/field.d.ts.map +1 -1
  68. package/dist/gir/field.js +12 -18
  69. package/dist/gir/field.js.map +1 -1
  70. package/dist/gir/function.d.ts +11 -42
  71. package/dist/gir/function.d.ts.map +1 -1
  72. package/dist/gir/function.js +7 -20
  73. package/dist/gir/function.js.map +1 -1
  74. package/dist/gir/gir-path.d.ts +2 -0
  75. package/dist/gir/gir-path.d.ts.map +1 -0
  76. package/dist/gir/gir-path.js +41 -0
  77. package/dist/gir/gir-path.js.map +1 -0
  78. package/dist/gir/libraries.d.ts +4 -0
  79. package/dist/gir/libraries.d.ts.map +1 -0
  80. package/dist/gir/libraries.js +62 -0
  81. package/dist/gir/libraries.js.map +1 -0
  82. package/dist/gir/library.d.ts +37 -0
  83. package/dist/gir/library.d.ts.map +1 -0
  84. package/dist/gir/library.js +218 -0
  85. package/dist/gir/library.js.map +1 -0
  86. package/dist/gir/namespace.d.ts +36 -50
  87. package/dist/gir/namespace.d.ts.map +1 -1
  88. package/dist/gir/namespace.js +46 -36
  89. package/dist/gir/namespace.js.map +1 -1
  90. package/dist/gir/parameter.d.ts +25 -69
  91. package/dist/gir/parameter.d.ts.map +1 -1
  92. package/dist/gir/parameter.js +36 -57
  93. package/dist/gir/parameter.js.map +1 -1
  94. package/dist/gir/parse.d.ts +6 -70
  95. package/dist/gir/parse.d.ts.map +1 -1
  96. package/dist/gir/parse.js +32 -80
  97. package/dist/gir/parse.js.map +1 -1
  98. package/dist/gir/primitives.d.ts +3 -34
  99. package/dist/gir/primitives.d.ts.map +1 -1
  100. package/dist/gir/primitives.js +19 -35
  101. package/dist/gir/primitives.js.map +1 -1
  102. package/dist/gir/property.d.ts +16 -25
  103. package/dist/gir/property.d.ts.map +1 -1
  104. package/dist/gir/property.js +12 -9
  105. package/dist/gir/property.js.map +1 -1
  106. package/dist/gir/record.d.ts +27 -0
  107. package/dist/gir/record.d.ts.map +1 -0
  108. package/dist/gir/record.js +25 -0
  109. package/dist/gir/record.js.map +1 -0
  110. package/dist/gir/size.d.ts +10 -57
  111. package/dist/gir/size.d.ts.map +1 -1
  112. package/dist/gir/size.js +0 -25
  113. package/dist/gir/size.js.map +1 -1
  114. package/dist/gir/type-id.d.ts +49 -0
  115. package/dist/gir/type-id.d.ts.map +1 -0
  116. package/dist/gir/type-id.js +8 -0
  117. package/dist/gir/type-id.js.map +1 -0
  118. package/dist/gir/type-ref.d.ts +3 -77
  119. package/dist/gir/type-ref.d.ts.map +1 -1
  120. package/dist/gir/type-ref.js +35 -65
  121. package/dist/gir/type-ref.js.map +1 -1
  122. package/dist/gir/type.d.ts +33 -0
  123. package/dist/gir/type.d.ts.map +1 -0
  124. package/dist/gir/type.js +2 -0
  125. package/dist/gir/type.js.map +1 -0
  126. package/dist/index.d.ts +5 -11
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +5 -11
  129. package/dist/index.js.map +1 -1
  130. package/dist/khronos/args.d.ts +30 -0
  131. package/dist/khronos/args.d.ts.map +1 -0
  132. package/dist/khronos/args.js +150 -0
  133. package/dist/khronos/args.js.map +1 -0
  134. package/dist/khronos/jsdoc.d.ts +21 -0
  135. package/dist/khronos/jsdoc.d.ts.map +1 -0
  136. package/dist/khronos/jsdoc.js +59 -0
  137. package/dist/khronos/jsdoc.js.map +1 -0
  138. package/dist/khronos/model.d.ts +37 -0
  139. package/dist/khronos/model.d.ts.map +1 -0
  140. package/dist/khronos/model.js +132 -0
  141. package/dist/khronos/model.js.map +1 -0
  142. package/dist/khronos/modules.d.ts +11 -0
  143. package/dist/khronos/modules.d.ts.map +1 -0
  144. package/dist/khronos/modules.js +58 -0
  145. package/dist/khronos/modules.js.map +1 -0
  146. package/dist/khronos/parse.d.ts +9 -0
  147. package/dist/khronos/parse.d.ts.map +1 -0
  148. package/dist/khronos/parse.js +61 -0
  149. package/dist/khronos/parse.js.map +1 -0
  150. package/dist/khronos/pipeline.d.ts +24 -0
  151. package/dist/khronos/pipeline.d.ts.map +1 -0
  152. package/dist/khronos/pipeline.js +182 -0
  153. package/dist/khronos/pipeline.js.map +1 -0
  154. package/dist/khronos/plan.d.ts +80 -0
  155. package/dist/khronos/plan.d.ts.map +1 -0
  156. package/dist/khronos/plan.js +136 -0
  157. package/dist/khronos/plan.js.map +1 -0
  158. package/dist/khronos/render.d.ts +16 -0
  159. package/dist/khronos/render.d.ts.map +1 -0
  160. package/dist/khronos/render.js +158 -0
  161. package/dist/khronos/render.js.map +1 -0
  162. package/dist/khronos/select.d.ts +15 -0
  163. package/dist/khronos/select.d.ts.map +1 -0
  164. package/dist/khronos/select.js +45 -0
  165. package/dist/khronos/select.js.map +1 -0
  166. package/dist/runner.d.ts +29 -47
  167. package/dist/runner.d.ts.map +1 -1
  168. package/dist/runner.js +78 -53
  169. package/dist/runner.js.map +1 -1
  170. package/dist/store/compile-store.d.ts +9 -0
  171. package/dist/store/compile-store.d.ts.map +1 -0
  172. package/dist/store/compile-store.js +38 -0
  173. package/dist/store/compile-store.js.map +1 -0
  174. package/dist/store/gi/async.d.ts +4 -0
  175. package/dist/store/gi/async.d.ts.map +1 -0
  176. package/dist/store/gi/async.js +41 -0
  177. package/dist/store/gi/async.js.map +1 -0
  178. package/dist/store/gi/callables.d.ts +36 -0
  179. package/dist/store/gi/callables.d.ts.map +1 -0
  180. package/dist/store/gi/callables.js +202 -0
  181. package/dist/store/gi/callables.js.map +1 -0
  182. package/dist/store/gi/callback.d.ts +4 -0
  183. package/dist/store/gi/callback.d.ts.map +1 -0
  184. package/dist/store/gi/callback.js +14 -0
  185. package/dist/store/gi/callback.js.map +1 -0
  186. package/dist/store/gi/class-struct-record.d.ts +9 -0
  187. package/dist/store/gi/class-struct-record.d.ts.map +1 -0
  188. package/dist/store/gi/class-struct-record.js +34 -0
  189. package/dist/store/gi/class-struct-record.js.map +1 -0
  190. package/dist/store/gi/class.d.ts +4 -0
  191. package/dist/store/gi/class.d.ts.map +1 -0
  192. package/dist/store/gi/class.js +169 -0
  193. package/dist/store/gi/class.js.map +1 -0
  194. package/dist/store/gi/companion.d.ts +4 -0
  195. package/dist/store/gi/companion.d.ts.map +1 -0
  196. package/dist/store/gi/companion.js +13 -0
  197. package/dist/store/gi/companion.js.map +1 -0
  198. package/dist/store/gi/constant.d.ts +5 -0
  199. package/dist/store/gi/constant.d.ts.map +1 -0
  200. package/dist/store/gi/constant.js +18 -0
  201. package/dist/store/gi/constant.js.map +1 -0
  202. package/dist/store/gi/constructor-props.d.ts +5 -0
  203. package/dist/store/gi/constructor-props.d.ts.map +1 -0
  204. package/dist/store/gi/constructor-props.js +64 -0
  205. package/dist/store/gi/constructor-props.js.map +1 -0
  206. package/dist/store/gi/enum.d.ts +5 -0
  207. package/dist/store/gi/enum.d.ts.map +1 -0
  208. package/dist/store/gi/enum.js +38 -0
  209. package/dist/store/gi/enum.js.map +1 -0
  210. package/dist/store/gi/function.d.ts +8 -0
  211. package/dist/store/gi/function.d.ts.map +1 -0
  212. package/dist/store/gi/function.js +87 -0
  213. package/dist/store/gi/function.js.map +1 -0
  214. package/dist/store/gi/gtype-binding.d.ts +10 -0
  215. package/dist/store/gi/gtype-binding.d.ts.map +1 -0
  216. package/dist/store/gi/gtype-binding.js +20 -0
  217. package/dist/store/gi/gtype-binding.js.map +1 -0
  218. package/dist/store/gi/interface.d.ts +4 -0
  219. package/dist/store/gi/interface.d.ts.map +1 -0
  220. package/dist/store/gi/interface.js +99 -0
  221. package/dist/store/gi/interface.js.map +1 -0
  222. package/dist/store/gi/item-comparators.d.ts +6 -0
  223. package/dist/store/gi/item-comparators.d.ts.map +1 -0
  224. package/dist/store/gi/item-comparators.js +76 -0
  225. package/dist/store/gi/item-comparators.js.map +1 -0
  226. package/dist/store/gi/method.d.ts +24 -0
  227. package/dist/store/gi/method.d.ts.map +1 -0
  228. package/dist/store/gi/method.js +279 -0
  229. package/dist/store/gi/method.js.map +1 -0
  230. package/dist/store/gi/param-marshal.d.ts +9 -0
  231. package/dist/store/gi/param-marshal.d.ts.map +1 -0
  232. package/dist/store/gi/param-marshal.js +37 -0
  233. package/dist/store/gi/param-marshal.js.map +1 -0
  234. package/dist/store/gi/pipeline.d.ts +4 -0
  235. package/dist/store/gi/pipeline.d.ts.map +1 -0
  236. package/dist/store/gi/pipeline.js +80 -0
  237. package/dist/store/gi/pipeline.js.map +1 -0
  238. package/dist/store/gi/properties.d.ts +5 -0
  239. package/dist/store/gi/properties.d.ts.map +1 -0
  240. package/dist/store/gi/properties.js +30 -0
  241. package/dist/store/gi/properties.js.map +1 -0
  242. package/dist/store/gi/property-accessor.d.ts +26 -0
  243. package/dist/store/gi/property-accessor.d.ts.map +1 -0
  244. package/dist/store/gi/property-accessor.js +132 -0
  245. package/dist/store/gi/property-accessor.js.map +1 -0
  246. package/dist/store/gi/record-constructor.d.ts +5 -0
  247. package/dist/store/gi/record-constructor.d.ts.map +1 -0
  248. package/dist/store/gi/record-constructor.js +65 -0
  249. package/dist/store/gi/record-constructor.js.map +1 -0
  250. package/dist/store/gi/record-field-accessor.d.ts +25 -0
  251. package/dist/store/gi/record-field-accessor.d.ts.map +1 -0
  252. package/dist/store/gi/record-field-accessor.js +288 -0
  253. package/dist/store/gi/record-field-accessor.js.map +1 -0
  254. package/dist/store/gi/record-layout.d.ts +14 -0
  255. package/dist/store/gi/record-layout.d.ts.map +1 -0
  256. package/dist/store/gi/record-layout.js +96 -0
  257. package/dist/store/gi/record-layout.js.map +1 -0
  258. package/dist/store/gi/record.d.ts +4 -0
  259. package/dist/store/gi/record.d.ts.map +1 -0
  260. package/dist/store/gi/record.js +59 -0
  261. package/dist/store/gi/record.js.map +1 -0
  262. package/dist/store/gi/registration.d.ts +16 -0
  263. package/dist/store/gi/registration.d.ts.map +1 -0
  264. package/dist/store/gi/registration.js +20 -0
  265. package/dist/store/gi/registration.js.map +1 -0
  266. package/dist/store/gi/return-wrap.d.ts +10 -0
  267. package/dist/store/gi/return-wrap.d.ts.map +1 -0
  268. package/dist/store/gi/return-wrap.js +46 -0
  269. package/dist/store/gi/return-wrap.js.map +1 -0
  270. package/dist/store/gi/runtime-override.d.ts +3 -0
  271. package/dist/store/gi/runtime-override.d.ts.map +1 -0
  272. package/dist/{writers → store/gi}/runtime-override.js +0 -15
  273. package/dist/store/gi/runtime-override.js.map +1 -0
  274. package/dist/store/gi/signal.d.ts +5 -0
  275. package/dist/store/gi/signal.d.ts.map +1 -0
  276. package/dist/store/gi/signal.js +233 -0
  277. package/dist/store/gi/signal.js.map +1 -0
  278. package/dist/store/gi/vtable.d.ts +4 -0
  279. package/dist/store/gi/vtable.d.ts.map +1 -0
  280. package/dist/store/gi/vtable.js +78 -0
  281. package/dist/store/gi/vtable.js.map +1 -0
  282. package/dist/store/gi-store.d.ts +9 -0
  283. package/dist/store/gi-store.d.ts.map +1 -0
  284. package/dist/store/gi-store.js +57 -0
  285. package/dist/store/gi-store.js.map +1 -0
  286. package/dist/store/jsx-store.d.ts +5 -0
  287. package/dist/store/jsx-store.d.ts.map +1 -0
  288. package/dist/store/jsx-store.js +23 -0
  289. package/dist/store/jsx-store.js.map +1 -0
  290. package/dist/store/react/built-ins.d.ts +9 -0
  291. package/dist/store/react/built-ins.d.ts.map +1 -0
  292. package/dist/store/react/built-ins.js +226 -0
  293. package/dist/store/react/built-ins.js.map +1 -0
  294. package/dist/store/react/element-components.d.ts +15 -0
  295. package/dist/store/react/element-components.d.ts.map +1 -0
  296. package/dist/store/react/element-components.js +92 -0
  297. package/dist/store/react/element-components.js.map +1 -0
  298. package/dist/store/react/element-prop-types.d.ts +19 -0
  299. package/dist/store/react/element-prop-types.d.ts.map +1 -0
  300. package/dist/store/react/element-prop-types.js +244 -0
  301. package/dist/store/react/element-prop-types.js.map +1 -0
  302. package/dist/store/react/element-props.d.ts +4 -0
  303. package/dist/store/react/element-props.d.ts.map +1 -0
  304. package/dist/store/react/element-props.js +178 -0
  305. package/dist/store/react/element-props.js.map +1 -0
  306. package/dist/store/react/gir-index.d.ts +25 -0
  307. package/dist/store/react/gir-index.d.ts.map +1 -0
  308. package/dist/store/react/gir-index.js +55 -0
  309. package/dist/store/react/gir-index.js.map +1 -0
  310. package/dist/store/react/intrinsic-elements.d.ts +26 -0
  311. package/dist/store/react/intrinsic-elements.d.ts.map +1 -0
  312. package/dist/store/react/intrinsic-elements.js +107 -0
  313. package/dist/store/react/intrinsic-elements.js.map +1 -0
  314. package/dist/store/react/jsx.d.ts +18 -0
  315. package/dist/store/react/jsx.d.ts.map +1 -0
  316. package/dist/store/react/jsx.js +203 -0
  317. package/dist/store/react/jsx.js.map +1 -0
  318. package/dist/store/react/metadata.d.ts +4 -0
  319. package/dist/store/react/metadata.d.ts.map +1 -0
  320. package/dist/store/react/metadata.js +174 -0
  321. package/dist/store/react/metadata.js.map +1 -0
  322. package/dist/store/react/pipeline.d.ts +14 -0
  323. package/dist/store/react/pipeline.d.ts.map +1 -0
  324. package/dist/store/react/pipeline.js +60 -0
  325. package/dist/store/react/pipeline.js.map +1 -0
  326. package/dist/store/react/props.d.ts +36 -0
  327. package/dist/store/react/props.d.ts.map +1 -0
  328. package/dist/store/react/props.js +133 -0
  329. package/dist/store/react/props.js.map +1 -0
  330. package/dist/store/store-fs.d.ts +41 -0
  331. package/dist/store/store-fs.d.ts.map +1 -0
  332. package/dist/store/store-fs.js +71 -0
  333. package/dist/store/store-fs.js.map +1 -0
  334. package/dist/writer/context.d.ts +16 -0
  335. package/dist/writer/context.d.ts.map +1 -0
  336. package/dist/writer/context.js +44 -0
  337. package/dist/writer/context.js.map +1 -0
  338. package/dist/writer/doc.d.ts +2 -0
  339. package/dist/writer/doc.d.ts.map +1 -0
  340. package/dist/writer/doc.js +12 -0
  341. package/dist/writer/doc.js.map +1 -0
  342. package/dist/writer/emit.d.ts +8 -0
  343. package/dist/writer/emit.d.ts.map +1 -0
  344. package/dist/writer/emit.js +21 -0
  345. package/dist/writer/emit.js.map +1 -0
  346. package/dist/writer/gtk-doc.d.ts +2 -0
  347. package/dist/writer/gtk-doc.d.ts.map +1 -0
  348. package/dist/writer/gtk-doc.js +67 -0
  349. package/dist/writer/gtk-doc.js.map +1 -0
  350. package/dist/writer/imports.d.ts +10 -0
  351. package/dist/writer/imports.d.ts.map +1 -0
  352. package/dist/writer/imports.js +50 -0
  353. package/dist/writer/imports.js.map +1 -0
  354. package/dist/writer/module.d.ts +15 -0
  355. package/dist/writer/module.d.ts.map +1 -0
  356. package/dist/writer/module.js +46 -0
  357. package/dist/writer/module.js.map +1 -0
  358. package/overrides/cairo/context.ts.ejs +1269 -0
  359. package/overrides/cairo/font-face.ts.ejs +151 -0
  360. package/overrides/cairo/font-options.ts.ejs +199 -0
  361. package/overrides/cairo/image-surface.ts.ejs +132 -0
  362. package/overrides/cairo/index.ts.ejs +22 -0
  363. package/overrides/cairo/matrix.ts.ejs +171 -0
  364. package/overrides/cairo/pattern.ts.ejs +476 -0
  365. package/overrides/cairo/recording-surface.ts.ejs +102 -0
  366. package/overrides/cairo/region.ts.ejs +237 -0
  367. package/overrides/cairo/scaled-font.ts.ejs +330 -0
  368. package/overrides/cairo/surface.ts.ejs +296 -0
  369. package/overrides/gdk/index.ts.ejs +2 -0
  370. package/overrides/gdk/rgba.ts.ejs +11 -0
  371. package/overrides/gobject/index.ts.ejs +29 -0
  372. package/overrides/gobject/object.ts.ejs +51 -0
  373. package/overrides/gobject/value.ts.ejs +17 -0
  374. package/overrides/graphene/index.ts.ejs +2 -0
  375. package/overrides/graphene/structs.ts.ejs +37 -0
  376. package/overrides/gtk/constants.ts.ejs +3 -0
  377. package/overrides/gtk/index.ts.ejs +2 -0
  378. package/package.json +15 -15
  379. package/src/analysis/descriptor-render.ts +407 -0
  380. package/src/analysis/descriptor.ts +263 -0
  381. package/src/analysis/inheritance.ts +242 -0
  382. package/src/analysis/param-structure.ts +127 -0
  383. package/src/analysis/ts-type.ts +88 -0
  384. package/src/compile.ts +152 -0
  385. package/src/docs/api-reference.ts +361 -0
  386. package/src/docs/element-page.ts +290 -0
  387. package/src/docs/pipeline.ts +182 -0
  388. package/src/docs/render.ts +191 -0
  389. package/src/docs/symbol-page.ts +444 -0
  390. package/src/fingerprint.ts +40 -29
  391. package/src/gir/ancestry.ts +41 -0
  392. package/src/gir/callback.ts +25 -22
  393. package/src/gir/class.ts +31 -57
  394. package/src/gir/enum.ts +20 -38
  395. package/src/gir/field.ts +21 -36
  396. package/src/gir/function.ts +17 -56
  397. package/src/gir/gir-path.ts +49 -0
  398. package/src/gir/libraries.ts +77 -0
  399. package/src/gir/library.ts +248 -0
  400. package/src/gir/namespace.ts +85 -80
  401. package/src/gir/parameter.ts +64 -93
  402. package/src/gir/parse.ts +43 -95
  403. package/src/gir/primitives.ts +23 -45
  404. package/src/gir/property.ts +27 -29
  405. package/src/gir/record.ts +53 -0
  406. package/src/gir/size.ts +9 -56
  407. package/src/gir/type-id.ts +49 -0
  408. package/src/gir/type-ref.ts +35 -140
  409. package/src/gir/type.ts +16 -0
  410. package/src/index.ts +20 -15
  411. package/src/khronos/args.ts +202 -0
  412. package/src/khronos/jsdoc.ts +76 -0
  413. package/src/khronos/model.ts +166 -0
  414. package/src/khronos/modules.ts +75 -0
  415. package/src/khronos/parse.ts +66 -0
  416. package/src/khronos/pipeline.ts +234 -0
  417. package/src/khronos/plan.ts +191 -0
  418. package/src/khronos/registry/LICENSE +202 -0
  419. package/src/khronos/registry/gl.xml +47748 -0
  420. package/src/khronos/render.ts +193 -0
  421. package/src/khronos/select.ts +67 -0
  422. package/src/runner.ts +112 -75
  423. package/src/store/compile-store.ts +49 -0
  424. package/src/store/gi/async.ts +42 -0
  425. package/src/store/gi/callables.ts +309 -0
  426. package/src/store/gi/callback.ts +15 -0
  427. package/src/store/gi/class-struct-record.ts +40 -0
  428. package/src/store/gi/class.ts +212 -0
  429. package/src/store/gi/companion.ts +13 -0
  430. package/src/store/gi/constant.ts +24 -0
  431. package/src/store/gi/constructor-props.ts +82 -0
  432. package/src/store/gi/enum.ts +49 -0
  433. package/src/store/gi/function.ts +107 -0
  434. package/src/store/gi/gtype-binding.ts +33 -0
  435. package/src/store/gi/interface.ts +157 -0
  436. package/src/store/gi/item-comparators.ts +90 -0
  437. package/src/store/gi/method.ts +417 -0
  438. package/src/store/gi/param-marshal.ts +48 -0
  439. package/src/store/gi/pipeline.ts +85 -0
  440. package/src/store/gi/properties.ts +39 -0
  441. package/src/store/gi/property-accessor.ts +194 -0
  442. package/src/store/gi/record-constructor.ts +87 -0
  443. package/src/store/gi/record-field-accessor.ts +394 -0
  444. package/src/store/gi/record-layout.ts +134 -0
  445. package/src/store/gi/record.ts +66 -0
  446. package/src/store/gi/registration.ts +38 -0
  447. package/src/store/gi/return-wrap.ts +52 -0
  448. package/src/store/gi/runtime-override.ts +36 -0
  449. package/src/store/gi/signal.ts +310 -0
  450. package/src/store/gi/vtable.ts +99 -0
  451. package/src/store/gi-store.ts +79 -0
  452. package/src/store/jsx-store.ts +27 -0
  453. package/src/store/react/built-ins.ts +260 -0
  454. package/src/store/react/element-components.ts +138 -0
  455. package/src/store/react/element-prop-types.ts +280 -0
  456. package/src/store/react/element-props.ts +204 -0
  457. package/src/store/react/gir-index.ts +85 -0
  458. package/src/store/react/intrinsic-elements.ts +161 -0
  459. package/src/store/react/jsx.ts +294 -0
  460. package/src/store/react/metadata.ts +197 -0
  461. package/src/store/react/pipeline.ts +90 -0
  462. package/src/store/react/props.ts +197 -0
  463. package/src/store/store-fs.ts +112 -0
  464. package/src/writer/context.ts +48 -0
  465. package/src/writer/doc.ts +11 -0
  466. package/src/writer/emit.ts +26 -0
  467. package/src/writer/gtk-doc.ts +74 -0
  468. package/src/writer/imports.ts +59 -0
  469. package/src/writer/module.ts +45 -0
  470. package/LICENSE +0 -373
  471. package/dist/dsl/context.d.ts +0 -104
  472. package/dist/dsl/context.d.ts.map +0 -1
  473. package/dist/dsl/context.js +0 -140
  474. package/dist/dsl/context.js.map +0 -1
  475. package/dist/dsl/emit.d.ts +0 -28
  476. package/dist/dsl/emit.d.ts.map +0 -1
  477. package/dist/dsl/emit.js +0 -41
  478. package/dist/dsl/emit.js.map +0 -1
  479. package/dist/dsl/identifier.d.ts +0 -28
  480. package/dist/dsl/identifier.d.ts.map +0 -1
  481. package/dist/dsl/identifier.js +0 -45
  482. package/dist/dsl/identifier.js.map +0 -1
  483. package/dist/dsl/imports.d.ts +0 -58
  484. package/dist/dsl/imports.d.ts.map +0 -1
  485. package/dist/dsl/imports.js +0 -107
  486. package/dist/dsl/imports.js.map +0 -1
  487. package/dist/dsl/module.d.ts +0 -53
  488. package/dist/dsl/module.d.ts.map +0 -1
  489. package/dist/dsl/module.js +0 -76
  490. package/dist/dsl/module.js.map +0 -1
  491. package/dist/ffi/pipeline.d.ts +0 -19
  492. package/dist/ffi/pipeline.d.ts.map +0 -1
  493. package/dist/ffi/pipeline.js +0 -107
  494. package/dist/ffi/pipeline.js.map +0 -1
  495. package/dist/gi-store.d.ts +0 -34
  496. package/dist/gi-store.d.ts.map +0 -1
  497. package/dist/gi-store.js +0 -154
  498. package/dist/gi-store.js.map +0 -1
  499. package/dist/gir/boxed.d.ts +0 -66
  500. package/dist/gir/boxed.d.ts.map +0 -1
  501. package/dist/gir/boxed.js +0 -49
  502. package/dist/gir/boxed.js.map +0 -1
  503. package/dist/gir/qualified-name.d.ts +0 -37
  504. package/dist/gir/qualified-name.d.ts.map +0 -1
  505. package/dist/gir/qualified-name.js +0 -39
  506. package/dist/gir/qualified-name.js.map +0 -1
  507. package/dist/gir/qualify.d.ts +0 -32
  508. package/dist/gir/qualify.d.ts.map +0 -1
  509. package/dist/gir/qualify.js +0 -60
  510. package/dist/gir/qualify.js.map +0 -1
  511. package/dist/gir/repository.d.ts +0 -82
  512. package/dist/gir/repository.d.ts.map +0 -1
  513. package/dist/gir/repository.js +0 -122
  514. package/dist/gir/repository.js.map +0 -1
  515. package/dist/gir/signal.d.ts +0 -22
  516. package/dist/gir/signal.d.ts.map +0 -1
  517. package/dist/gir/signal.js +0 -20
  518. package/dist/gir/signal.js.map +0 -1
  519. package/dist/jsx-store.d.ts +0 -22
  520. package/dist/jsx-store.d.ts.map +0 -1
  521. package/dist/jsx-store.js +0 -40
  522. package/dist/jsx-store.js.map +0 -1
  523. package/dist/react/compounds-meta.d.ts +0 -18
  524. package/dist/react/compounds-meta.d.ts.map +0 -1
  525. package/dist/react/compounds-meta.js +0 -93
  526. package/dist/react/compounds-meta.js.map +0 -1
  527. package/dist/react/compounds.d.ts +0 -27
  528. package/dist/react/compounds.d.ts.map +0 -1
  529. package/dist/react/compounds.js +0 -164
  530. package/dist/react/compounds.js.map +0 -1
  531. package/dist/react/internal.d.ts +0 -14
  532. package/dist/react/internal.d.ts.map +0 -1
  533. package/dist/react/internal.js +0 -79
  534. package/dist/react/internal.js.map +0 -1
  535. package/dist/react/jsx.d.ts +0 -22
  536. package/dist/react/jsx.d.ts.map +0 -1
  537. package/dist/react/jsx.js +0 -134
  538. package/dist/react/jsx.js.map +0 -1
  539. package/dist/react/pipeline.d.ts +0 -13
  540. package/dist/react/pipeline.d.ts.map +0 -1
  541. package/dist/react/pipeline.js +0 -25
  542. package/dist/react/pipeline.js.map +0 -1
  543. package/dist/react/props.d.ts +0 -38
  544. package/dist/react/props.d.ts.map +0 -1
  545. package/dist/react/props.js +0 -231
  546. package/dist/react/props.js.map +0 -1
  547. package/dist/react/slot-props.d.ts +0 -10
  548. package/dist/react/slot-props.d.ts.map +0 -1
  549. package/dist/react/slot-props.js +0 -56
  550. package/dist/react/slot-props.js.map +0 -1
  551. package/dist/react/widgets.d.ts +0 -83
  552. package/dist/react/widgets.d.ts.map +0 -1
  553. package/dist/react/widgets.js +0 -152
  554. package/dist/react/widgets.js.map +0 -1
  555. package/dist/store-fs.d.ts +0 -109
  556. package/dist/store-fs.d.ts.map +0 -1
  557. package/dist/store-fs.js +0 -98
  558. package/dist/store-fs.js.map +0 -1
  559. package/dist/transpile.d.ts +0 -32
  560. package/dist/transpile.d.ts.map +0 -1
  561. package/dist/transpile.js +0 -63
  562. package/dist/transpile.js.map +0 -1
  563. package/dist/typecheck-store.d.ts +0 -41
  564. package/dist/typecheck-store.d.ts.map +0 -1
  565. package/dist/typecheck-store.js +0 -102
  566. package/dist/typecheck-store.js.map +0 -1
  567. package/dist/writers/alias.d.ts +0 -13
  568. package/dist/writers/alias.d.ts.map +0 -1
  569. package/dist/writers/alias.js +0 -17
  570. package/dist/writers/alias.js.map +0 -1
  571. package/dist/writers/async.d.ts +0 -22
  572. package/dist/writers/async.d.ts.map +0 -1
  573. package/dist/writers/async.js +0 -48
  574. package/dist/writers/async.js.map +0 -1
  575. package/dist/writers/boxed-constructor.d.ts +0 -26
  576. package/dist/writers/boxed-constructor.d.ts.map +0 -1
  577. package/dist/writers/boxed-constructor.js +0 -85
  578. package/dist/writers/boxed-constructor.js.map +0 -1
  579. package/dist/writers/boxed-field-accessor.d.ts +0 -18
  580. package/dist/writers/boxed-field-accessor.d.ts.map +0 -1
  581. package/dist/writers/boxed-field-accessor.js +0 -260
  582. package/dist/writers/boxed-field-accessor.js.map +0 -1
  583. package/dist/writers/boxed-layout.d.ts +0 -27
  584. package/dist/writers/boxed-layout.d.ts.map +0 -1
  585. package/dist/writers/boxed-layout.js +0 -128
  586. package/dist/writers/boxed-layout.js.map +0 -1
  587. package/dist/writers/boxed.d.ts +0 -20
  588. package/dist/writers/boxed.d.ts.map +0 -1
  589. package/dist/writers/boxed.js +0 -71
  590. package/dist/writers/boxed.js.map +0 -1
  591. package/dist/writers/callables.d.ts +0 -124
  592. package/dist/writers/callables.d.ts.map +0 -1
  593. package/dist/writers/callables.js +0 -283
  594. package/dist/writers/callables.js.map +0 -1
  595. package/dist/writers/callback.d.ts +0 -16
  596. package/dist/writers/callback.d.ts.map +0 -1
  597. package/dist/writers/callback.js +0 -38
  598. package/dist/writers/callback.js.map +0 -1
  599. package/dist/writers/class-struct-record.d.ts +0 -31
  600. package/dist/writers/class-struct-record.d.ts.map +0 -1
  601. package/dist/writers/class-struct-record.js +0 -67
  602. package/dist/writers/class-struct-record.js.map +0 -1
  603. package/dist/writers/class-struct.d.ts +0 -22
  604. package/dist/writers/class-struct.d.ts.map +0 -1
  605. package/dist/writers/class-struct.js +0 -85
  606. package/dist/writers/class-struct.js.map +0 -1
  607. package/dist/writers/class.d.ts +0 -16
  608. package/dist/writers/class.d.ts.map +0 -1
  609. package/dist/writers/class.js +0 -307
  610. package/dist/writers/class.js.map +0 -1
  611. package/dist/writers/constant.d.ts +0 -15
  612. package/dist/writers/constant.d.ts.map +0 -1
  613. package/dist/writers/constant.js +0 -23
  614. package/dist/writers/constant.js.map +0 -1
  615. package/dist/writers/constants.d.ts +0 -15
  616. package/dist/writers/constants.d.ts.map +0 -1
  617. package/dist/writers/constants.js +0 -23
  618. package/dist/writers/constants.js.map +0 -1
  619. package/dist/writers/constructor-props.d.ts +0 -32
  620. package/dist/writers/constructor-props.d.ts.map +0 -1
  621. package/dist/writers/constructor-props.js +0 -110
  622. package/dist/writers/constructor-props.js.map +0 -1
  623. package/dist/writers/enum.d.ts +0 -21
  624. package/dist/writers/enum.d.ts.map +0 -1
  625. package/dist/writers/enum.js +0 -48
  626. package/dist/writers/enum.js.map +0 -1
  627. package/dist/writers/function.d.ts +0 -40
  628. package/dist/writers/function.d.ts.map +0 -1
  629. package/dist/writers/function.js +0 -127
  630. package/dist/writers/function.js.map +0 -1
  631. package/dist/writers/gtype-binding.d.ts +0 -19
  632. package/dist/writers/gtype-binding.d.ts.map +0 -1
  633. package/dist/writers/gtype-binding.js +0 -40
  634. package/dist/writers/gtype-binding.js.map +0 -1
  635. package/dist/writers/inheritance.d.ts +0 -48
  636. package/dist/writers/inheritance.d.ts.map +0 -1
  637. package/dist/writers/inheritance.js +0 -90
  638. package/dist/writers/inheritance.js.map +0 -1
  639. package/dist/writers/interface.d.ts +0 -16
  640. package/dist/writers/interface.d.ts.map +0 -1
  641. package/dist/writers/interface.js +0 -155
  642. package/dist/writers/interface.js.map +0 -1
  643. package/dist/writers/method.d.ts +0 -150
  644. package/dist/writers/method.d.ts.map +0 -1
  645. package/dist/writers/method.js +0 -510
  646. package/dist/writers/method.js.map +0 -1
  647. package/dist/writers/param-classify.d.ts +0 -93
  648. package/dist/writers/param-classify.d.ts.map +0 -1
  649. package/dist/writers/param-classify.js +0 -163
  650. package/dist/writers/param-classify.js.map +0 -1
  651. package/dist/writers/property-accessor.d.ts +0 -19
  652. package/dist/writers/property-accessor.d.ts.map +0 -1
  653. package/dist/writers/property-accessor.js +0 -117
  654. package/dist/writers/property-accessor.js.map +0 -1
  655. package/dist/writers/registration.d.ts +0 -27
  656. package/dist/writers/registration.d.ts.map +0 -1
  657. package/dist/writers/registration.js +0 -30
  658. package/dist/writers/registration.js.map +0 -1
  659. package/dist/writers/return-wrap.d.ts +0 -39
  660. package/dist/writers/return-wrap.d.ts.map +0 -1
  661. package/dist/writers/return-wrap.js +0 -152
  662. package/dist/writers/return-wrap.js.map +0 -1
  663. package/dist/writers/runtime-override.d.ts +0 -18
  664. package/dist/writers/runtime-override.d.ts.map +0 -1
  665. package/dist/writers/runtime-override.js.map +0 -1
  666. package/dist/writers/signal.d.ts +0 -21
  667. package/dist/writers/signal.d.ts.map +0 -1
  668. package/dist/writers/signal.js +0 -260
  669. package/dist/writers/signal.js.map +0 -1
  670. package/dist/writers/ts-type.d.ts +0 -50
  671. package/dist/writers/ts-type.d.ts.map +0 -1
  672. package/dist/writers/ts-type.js +0 -75
  673. package/dist/writers/ts-type.js.map +0 -1
  674. package/dist/writers/types-ts.d.ts +0 -27
  675. package/dist/writers/types-ts.d.ts.map +0 -1
  676. package/dist/writers/types-ts.js +0 -97
  677. package/dist/writers/types-ts.js.map +0 -1
  678. package/dist/writers/value.d.ts +0 -89
  679. package/dist/writers/value.d.ts.map +0 -1
  680. package/dist/writers/value.js +0 -402
  681. package/dist/writers/value.js.map +0 -1
  682. package/src/dsl/context.ts +0 -146
  683. package/src/dsl/emit.ts +0 -42
  684. package/src/dsl/identifier.ts +0 -52
  685. package/src/dsl/imports.ts +0 -109
  686. package/src/dsl/module.ts +0 -75
  687. package/src/ffi/pipeline.ts +0 -113
  688. package/src/gi-store.ts +0 -199
  689. package/src/gir/boxed.ts +0 -94
  690. package/src/gir/qualified-name.ts +0 -55
  691. package/src/gir/qualify.ts +0 -64
  692. package/src/gir/repository.ts +0 -149
  693. package/src/gir/signal.ts +0 -36
  694. package/src/jsx-store.ts +0 -53
  695. package/src/react/compounds-meta.ts +0 -99
  696. package/src/react/compounds.ts +0 -204
  697. package/src/react/internal.ts +0 -91
  698. package/src/react/jsx.ts +0 -155
  699. package/src/react/pipeline.ts +0 -29
  700. package/src/react/props.ts +0 -307
  701. package/src/react/slot-props.ts +0 -57
  702. package/src/react/widgets.ts +0 -185
  703. package/src/store-fs.ts +0 -157
  704. package/src/transpile.ts +0 -80
  705. package/src/typecheck-store.ts +0 -136
  706. package/src/writers/alias.ts +0 -19
  707. package/src/writers/async.ts +0 -44
  708. package/src/writers/boxed-constructor.ts +0 -105
  709. package/src/writers/boxed-field-accessor.ts +0 -306
  710. package/src/writers/boxed-layout.ts +0 -166
  711. package/src/writers/boxed.ts +0 -77
  712. package/src/writers/callables.ts +0 -339
  713. package/src/writers/callback.ts +0 -40
  714. package/src/writers/class-struct-record.ts +0 -75
  715. package/src/writers/class-struct.ts +0 -96
  716. package/src/writers/class.ts +0 -384
  717. package/src/writers/constant.ts +0 -29
  718. package/src/writers/constructor-props.ts +0 -130
  719. package/src/writers/enum.ts +0 -53
  720. package/src/writers/function.ts +0 -136
  721. package/src/writers/gtype-binding.ts +0 -48
  722. package/src/writers/inheritance.ts +0 -104
  723. package/src/writers/interface.ts +0 -168
  724. package/src/writers/method.ts +0 -678
  725. package/src/writers/param-classify.ts +0 -178
  726. package/src/writers/property-accessor.ts +0 -139
  727. package/src/writers/registration.ts +0 -42
  728. package/src/writers/return-wrap.ts +0 -180
  729. package/src/writers/runtime-override.ts +0 -59
  730. package/src/writers/signal.ts +0 -318
  731. package/src/writers/ts-type.ts +0 -115
  732. package/src/writers/value.ts +0 -485
@@ -1,105 +0,0 @@
1
- import { quote, toCamelCase, toIdentifier } from "@gtkx/utils";
2
- import type { ModuleContext } from "../dsl/context.js";
3
- import { indent } from "../dsl/emit.js";
4
- import type { GirBoxed } from "../gir/boxed.js";
5
- import type { GirField } from "../gir/field.js";
6
- import type { GirTypeRef } from "../gir/type-ref.js";
7
- import { type BoxedFieldSlot, computeBoxedFieldSlots } from "./boxed-layout.js";
8
- import { renderTsType } from "./ts-type.js";
9
- import { renderFfiType } from "./value.js";
10
-
11
- /**
12
- * A boxed field that carries a writable value (private, read-only, callback,
13
- * and type-less fields are not settable at construction).
14
- */
15
- type WritableFieldSlot = BoxedFieldSlot & { readonly field: GirField & { readonly type: GirTypeRef } };
16
-
17
- const isWritableFieldSlot = (entry: BoxedFieldSlot): entry is WritableFieldSlot =>
18
- !entry.field.private &&
19
- entry.field.writable &&
20
- entry.field.callback === undefined &&
21
- entry.field.type !== undefined;
22
-
23
- const isOpaque = (boxed: GirBoxed): boolean => boxed.glibGetType === undefined && boxed.disguised;
24
-
25
- /**
26
- * Renders the `export interface <Boxed>ConstructorProps` declaration: the
27
- * camelCase, optional, nullable form of every writable field. Opaque boxed
28
- * records (disguised, no GType) have no known fields and get an empty bag.
29
- *
30
- * @param context - The module context
31
- * @param boxed - The boxed record
32
- * @param className - The local PascalCase class name
33
- */
34
- export const renderBoxedConstructorPropsInterface = (
35
- context: ModuleContext,
36
- boxed: GirBoxed,
37
- className: string,
38
- ): string => {
39
- if (isOpaque(boxed)) return `export interface ${className}ConstructorProps {}`;
40
- const { slots } = computeBoxedFieldSlots(context, boxed.fields, boxed.isUnion);
41
- const lines = slots
42
- .filter(isWritableFieldSlot)
43
- .map(
44
- (entry) =>
45
- `${toIdentifier(toCamelCase(entry.field.name))}?: ${renderTsType(context, entry.field.type, true)};`,
46
- );
47
- const body = lines.length === 0 ? "" : `\n${indent(lines.join("\n"), 1)}\n`;
48
- return `export interface ${className}ConstructorProps {${body}}`;
49
- };
50
-
51
- /**
52
- * Renders a boxed record's constructor.
53
- *
54
- * The constructor allocates zero-filled native memory of the struct's size and
55
- * writes each provided field at its byte offset, threading bitfield members
56
- * through a read-modify-write into their shared storage word. Opaque records
57
- * have no known layout, so their constructor throws.
58
- *
59
- * @param context - The module context
60
- * @param boxed - The boxed record
61
- * @param className - The local PascalCase class name
62
- */
63
- export const renderBoxedConstructor = (context: ModuleContext, boxed: GirBoxed, className: string): string => {
64
- if (isOpaque(boxed)) {
65
- return `constructor() {\n${indent(`throw new Error(${quote(`Cannot construct ${className}: opaque boxed type with no known layout`)});`, 1)}\n}`;
66
- }
67
- context.addNativeImport("alloc");
68
- context.addRuntimeImport("setHandle");
69
- const { slots, size } = computeBoxedFieldSlots(context, boxed.fields, boxed.isUnion);
70
- const statements = [`const handle = alloc(${allocArgs(context, boxed, size).join(", ")});`];
71
- for (const entry of slots) {
72
- if (!isWritableFieldSlot(entry)) continue;
73
- statements.push(renderFieldWrite(context, entry));
74
- }
75
- statements.push("setHandle(this, handle);");
76
- const body = statements.join("\n");
77
- return `constructor(props: ${className}ConstructorProps = {}) {\n${indent(body, 1)}\n}`;
78
- };
79
-
80
- const allocArgs = (context: ModuleContext, boxed: GirBoxed, size: number): readonly string[] => {
81
- const glibTypeName = boxed.glibTypeName ?? boxed.cType;
82
- const lib = context.namespace.sharedLibrary;
83
- const args = [String(size)];
84
- if (glibTypeName !== undefined || lib !== undefined) {
85
- args.push(glibTypeName !== undefined ? quote(glibTypeName) : "undefined");
86
- }
87
- if (lib !== undefined) args.push(quote(lib));
88
- return args;
89
- };
90
-
91
- const renderFieldWrite = (context: ModuleContext, entry: WritableFieldSlot): string => {
92
- context.addRuntimeImport("t");
93
- context.addNativeImport("write");
94
- const ffiType = renderFfiType(context, entry.field.type, "none");
95
- const name = toIdentifier(toCamelCase(entry.field.name));
96
- const offset = entry.slot.byteOffset;
97
- if (entry.slot.bitWidth === undefined) {
98
- return `if (props.${name} !== undefined) write(handle, ${ffiType}, ${offset}, props.${name});`;
99
- }
100
- context.addNativeImport("read");
101
- const mask = (1 << entry.slot.bitWidth) - 1;
102
- const bitOffset = entry.slot.bitOffset ?? 0;
103
- const merged = `(((read(handle, ${ffiType}, ${offset}) as number) & ~(${mask} << ${bitOffset})) | ((Number(props.${name}) & ${mask}) << ${bitOffset})) >>> 0`;
104
- return `if (props.${name} !== undefined) write(handle, ${ffiType}, ${offset}, ${merged});`;
105
- };
@@ -1,306 +0,0 @@
1
- import { toCamelCase, toIdentifier } from "@gtkx/utils";
2
- import type { ModuleContext } from "../dsl/context.js";
3
- import { indent } from "../dsl/emit.js";
4
- import type { GirField } from "../gir/field.js";
5
- import type { FieldSlot } from "../gir/size.js";
6
- import type { GirTypeRef } from "../gir/type-ref.js";
7
- import { type BoxedFieldSlot, computeBoxedFieldSlots } from "./boxed-layout.js";
8
- import { typeRefIsClassStruct } from "./class-struct-record.js";
9
- import { wrapReturnValue } from "./return-wrap.js";
10
- import { renderTsType } from "./ts-type.js";
11
- import { renderFfiType } from "./value.js";
12
-
13
- /**
14
- * Renders the `get` / `set` accessor pair for a single boxed field.
15
- *
16
- * The accessor reads through the runtime's `read(handle, ffiType, offset)`
17
- * (or `write` for the setter), with bitfield members threading through a
18
- * read-modify-write sequence into their shared storage word. Fields whose
19
- * type cannot be marshaled at present (callbacks, varargs, inline arrays
20
- * of complex types) are skipped silently.
21
- *
22
- * @param context - The module context
23
- * @param slot - The field plus its layout slot
24
- * @param claimedNames - Names already used by emitted methods
25
- */
26
- export const renderBoxedFieldAccessor = (
27
- context: ModuleContext,
28
- slot: BoxedFieldSlot,
29
- claimedNames: ReadonlySet<string>,
30
- siblingFields: readonly GirField[],
31
- ): string | undefined => {
32
- const { field } = slot;
33
- if (field.private) return undefined;
34
- if (!field.readable && !field.writable) return undefined;
35
- if (field.callback !== undefined) return undefined;
36
- if (field.type === undefined) return undefined;
37
- if (typeRefIsClassStruct(context, field.type)) return undefined;
38
- const jsName = toIdentifier(toCamelCase(field.name));
39
- if (claimedNames.has(jsName)) return undefined;
40
- if (jsName === "constructor") return undefined;
41
-
42
- const structArray = renderStructArrayAccessor(context, { field, jsName, slot: slot.slot, siblingFields });
43
- if (structArray !== undefined) return structArray;
44
-
45
- if (!isAccessorEligibleType(field.type)) {
46
- const tsType = renderTsType(context, field.type, false);
47
- const modifier = field.writable ? "declare" : "declare readonly";
48
- return `${modifier} ${jsName}: ${tsType};`;
49
- }
50
-
51
- const ffiType = renderFfiType(context, field.type, "none");
52
- const tsType = renderTsType(context, field.type, false);
53
- const accessorOptions: AccessorOptions = {
54
- context,
55
- jsName,
56
- tsType,
57
- ffiType,
58
- slot: slot.slot,
59
- fieldType: field.type,
60
- };
61
- const blocks: string[] = [getterBlock(accessorOptions)];
62
- if (field.writable) {
63
- blocks.push(setterBlock(accessorOptions));
64
- }
65
- return blocks.join("\n\n");
66
- };
67
-
68
- const isAccessorEligibleType = (ref: GirTypeRef): boolean => {
69
- switch (ref.kind) {
70
- case "primitive":
71
- return ref.category !== "void" && ref.category !== "unichar";
72
- case "named":
73
- return true;
74
- case "array":
75
- return ref.fixedSize !== undefined;
76
- case "list":
77
- case "hashtable":
78
- return false;
79
- case "callback":
80
- case "varargs":
81
- return false;
82
- }
83
- };
84
-
85
- const resolveInlineStructFields = (
86
- context: ModuleContext,
87
- ref: GirTypeRef | undefined,
88
- ): readonly GirField[] | undefined => {
89
- if (ref === undefined || ref.kind !== "named") return undefined;
90
- if (ref.cType?.endsWith("*") === true) return undefined;
91
- const resolved = context.repository.resolveNamed(ref.namespaceName ?? context.namespace.name, ref.typeName);
92
- if (resolved === undefined || resolved.kind !== "boxed") return undefined;
93
- if (resolved.value.cType?.endsWith("*") === true) return undefined;
94
- if (resolved.value.fields.length === 0) return undefined;
95
- return resolved.value.fields;
96
- };
97
-
98
- const arrayLengthExpression = (
99
- arrayRef: Extract<GirTypeRef, { kind: "array" }>,
100
- siblingFields: readonly GirField[],
101
- ): string | undefined => {
102
- if (arrayRef.fixedSize !== undefined) return String(arrayRef.fixedSize);
103
- if (arrayRef.lengthParameterIndex === undefined) return undefined;
104
- const lengthField = siblingFields.filter((field) => !field.private)[arrayRef.lengthParameterIndex];
105
- if (lengthField === undefined) return undefined;
106
- return `this.${toIdentifier(toCamelCase(lengthField.name))}`;
107
- };
108
-
109
- const renderElementReadObject = (context: ModuleContext, fields: readonly GirField[], baseOffset: number): string => {
110
- const { slots } = computeBoxedFieldSlots(context, fields);
111
- const entries: string[] = [];
112
- for (const { field, slot } of slots) {
113
- if (field.private || field.type === undefined || field.callback !== undefined) continue;
114
- const jsName = toIdentifier(toCamelCase(field.name));
115
- const offset = baseOffset + slot.byteOffset;
116
- const nested = resolveInlineStructFields(context, field.type);
117
- if (nested !== undefined) {
118
- entries.push(`${jsName}: ${renderElementReadObject(context, nested, offset)}`);
119
- continue;
120
- }
121
- if (!isAccessorEligibleType(field.type)) continue;
122
- const ffi = renderFfiType(context, field.type, "none");
123
- if (slot.bitWidth === undefined) {
124
- entries.push(
125
- `${jsName}: read(__array, ${ffi}, __base + ${offset}) as ${renderTsType(context, field.type, false)}`,
126
- );
127
- continue;
128
- }
129
- const shift = slot.bitOffset ?? 0;
130
- entries.push(
131
- `${jsName}: (((read(__array, ${ffi}, __base + ${offset}) as number) >>> ${shift}) & ${bitMask(slot.bitWidth)})`,
132
- );
133
- }
134
- return `{ ${entries.join(", ")} }`;
135
- };
136
-
137
- type ElementWriteOptions = {
138
- readonly fields: readonly GirField[];
139
- readonly baseOffset: number;
140
- readonly valuePath: string;
141
- readonly out: string[];
142
- };
143
-
144
- const appendElementWriteStatements = (context: ModuleContext, options: ElementWriteOptions): void => {
145
- const { fields, baseOffset, valuePath, out } = options;
146
- const { slots } = computeBoxedFieldSlots(context, fields);
147
- for (const { field, slot } of slots) {
148
- if (field.private || field.type === undefined || field.callback !== undefined) continue;
149
- const valueExpr = `${valuePath}.${toIdentifier(toCamelCase(field.name))}`;
150
- const offset = baseOffset + slot.byteOffset;
151
- const nested = resolveInlineStructFields(context, field.type);
152
- if (nested !== undefined) {
153
- appendElementWriteStatements(context, { fields: nested, baseOffset: offset, valuePath: valueExpr, out });
154
- continue;
155
- }
156
- if (!isAccessorEligibleType(field.type)) continue;
157
- const ffi = renderFfiType(context, field.type, "none");
158
- if (slot.bitWidth === undefined) {
159
- out.push(`write(__array, ${ffi}, __base + ${offset}, ${valueExpr});`);
160
- continue;
161
- }
162
- const mask = bitMask(slot.bitWidth);
163
- const shift = slot.bitOffset ?? 0;
164
- out.push(
165
- `write(__array, ${ffi}, __base + ${offset}, ((read(__array, ${ffi}, __base + ${offset}) & ~(${mask} << ${shift})) | ((Number(${valueExpr}) & ${mask}) << ${shift})) >>> 0);`,
166
- );
167
- }
168
- };
169
-
170
- type StructArrayTarget = {
171
- readonly field: GirField;
172
- readonly jsName: string;
173
- readonly slot: FieldSlot;
174
- readonly siblingFields: readonly GirField[];
175
- };
176
-
177
- type StructArrayAccessorOptions = {
178
- readonly context: ModuleContext;
179
- readonly jsName: string;
180
- readonly tsType: string;
181
- readonly bufferType: string;
182
- readonly offset: number;
183
- readonly lengthExpr: string;
184
- readonly elementSize: number;
185
- readonly elementFields: readonly GirField[];
186
- };
187
-
188
- const structArrayGetterBlock = (options: StructArrayAccessorOptions): string => {
189
- const { context, jsName, tsType, bufferType, offset, lengthExpr, elementSize, elementFields } = options;
190
- const element = renderElementReadObject(context, elementFields, 0);
191
- const loop = [`const __base = __index * ${elementSize};`, `__result.push(${element});`].join("\n");
192
- const body = [
193
- `const __array = read(getHandle(this), ${bufferType}, ${offset});`,
194
- `const __result: ${tsType} = [];`,
195
- `for (let __index = 0; __index < ${lengthExpr}; __index++) {`,
196
- indent(loop, 1),
197
- "}",
198
- "return __result;",
199
- ].join("\n");
200
- return `get ${jsName}(): ${tsType} {\n${indent(body, 1)}\n}`;
201
- };
202
-
203
- const structArraySetterBlock = (options: StructArrayAccessorOptions): string => {
204
- const { context, jsName, tsType, bufferType, offset, elementSize, elementFields } = options;
205
- const writes: string[] = [];
206
- appendElementWriteStatements(context, {
207
- fields: elementFields,
208
- baseOffset: 0,
209
- valuePath: "__element",
210
- out: writes,
211
- });
212
- const loop = [`const __element = __value[__index];`, `const __base = __index * ${elementSize};`, ...writes].join(
213
- "\n",
214
- );
215
- const body = [
216
- `const __array = read(getHandle(this), ${bufferType}, ${offset});`,
217
- `for (let __index = 0; __index < __value.length; __index++) {`,
218
- indent(loop, 1),
219
- "}",
220
- `write(getHandle(this), ${bufferType}, ${offset}, __array);`,
221
- ].join("\n");
222
- return `set ${jsName}(__value: ${tsType}) {\n${indent(body, 1)}\n}`;
223
- };
224
-
225
- const renderStructArrayAccessor = (context: ModuleContext, target: StructArrayTarget): string | undefined => {
226
- const { field, jsName, slot, siblingFields } = target;
227
- const arrayRef = field.type;
228
- if (arrayRef === undefined || arrayRef.kind !== "array" || slot.bitWidth !== undefined) return undefined;
229
- const elementFields = resolveInlineStructFields(context, arrayRef.element);
230
- if (elementFields === undefined) return undefined;
231
- const lengthExpr = arrayLengthExpression(arrayRef, siblingFields);
232
- if (lengthExpr === undefined) return undefined;
233
- const elementSize = computeBoxedFieldSlots(context, elementFields).size;
234
- if (elementSize === 0) return undefined;
235
-
236
- context.addNativeImport("read");
237
- context.addRuntimeImport("getHandle");
238
- context.addRuntimeImport("t");
239
- const options: StructArrayAccessorOptions = {
240
- context,
241
- jsName,
242
- tsType: renderTsType(context, arrayRef, false),
243
- bufferType: `t.struct("borrowed", ${lengthExpr} * ${elementSize})`,
244
- offset: slot.byteOffset,
245
- lengthExpr,
246
- elementSize,
247
- elementFields,
248
- };
249
- const blocks: string[] = [];
250
- if (field.readable) blocks.push(structArrayGetterBlock(options));
251
- if (field.writable) {
252
- context.addNativeImport("write");
253
- blocks.push(structArraySetterBlock(options));
254
- }
255
- return blocks.length === 0 ? undefined : blocks.join("\n\n");
256
- };
257
-
258
- type AccessorOptions = {
259
- readonly context: ModuleContext;
260
- readonly jsName: string;
261
- readonly tsType: string;
262
- readonly ffiType: string;
263
- readonly slot: FieldSlot;
264
- readonly fieldType: GirTypeRef;
265
- };
266
-
267
- const getterBlock = (options: AccessorOptions): string => {
268
- const { context, jsName, tsType, ffiType, slot, fieldType } = options;
269
- context.addNativeImport("read");
270
- context.addRuntimeImport("getHandle");
271
- if (slot.bitWidth === undefined) {
272
- const valueExpression = `read(getHandle(this), ${ffiType}, ${slot.byteOffset})`;
273
- const wrapped = wrapReturnValue(context, {
274
- ref: fieldType,
275
- transfer: "none",
276
- nullable: false,
277
- valueExpression,
278
- });
279
- const body = `return ${wrapped};`;
280
- return `get ${jsName}(): ${tsType} {\n${indent(body, 1)}\n}`;
281
- }
282
- const mask = bitMask(slot.bitWidth);
283
- const shift = slot.bitOffset ?? 0;
284
- const body = `const __unit = read(getHandle(this), ${ffiType}, ${slot.byteOffset}) as number;\nreturn (((__unit >>> ${shift}) & ${mask}) >>> 0) as ${tsType};`;
285
- return `get ${jsName}(): ${tsType} {\n${indent(body, 1)}\n}`;
286
- };
287
-
288
- const setterBlock = (options: AccessorOptions): string => {
289
- const { context, jsName, tsType, ffiType, slot } = options;
290
- context.addNativeImport("write");
291
- context.addRuntimeImport("getHandle");
292
- if (slot.bitWidth === undefined) {
293
- const body = `write(getHandle(this), ${ffiType}, ${slot.byteOffset}, value);`;
294
- return `set ${jsName}(value: ${tsType}) {\n${indent(body, 1)}\n}`;
295
- }
296
- context.addNativeImport("read");
297
- const mask = bitMask(slot.bitWidth);
298
- const shift = slot.bitOffset ?? 0;
299
- const body = `const __unit = read(getHandle(this), ${ffiType}, ${slot.byteOffset}) as number;\nconst __next = ((__unit & ~(${mask} << ${shift})) | ((Number(value) & ${mask}) << ${shift})) >>> 0;\nwrite(getHandle(this), ${ffiType}, ${slot.byteOffset}, __next);`;
300
- return `set ${jsName}(value: ${tsType}) {\n${indent(body, 1)}\n}`;
301
- };
302
-
303
- const bitMask = (width: number): number => {
304
- if (width >= 32) return 0xffffffff;
305
- return (1 << width) - 1;
306
- };
@@ -1,166 +0,0 @@
1
- import type { ModuleContext } from "../dsl/context.js";
2
- import type { GirField } from "../gir/field.js";
3
- import { primitiveCategory } from "../gir/primitives.js";
4
- import type { ResolvedNamed } from "../gir/repository.js";
5
- import {
6
- computeFieldSlots,
7
- type FieldLayout,
8
- type FieldLayoutInput,
9
- type FieldSlot,
10
- layoutOfPrimitive,
11
- } from "../gir/size.js";
12
- import type { GirTypeRef, NamedTypeRef } from "../gir/type-ref.js";
13
-
14
- const POINTER_LAYOUT: FieldLayout = { size: 8, align: 8 };
15
-
16
- /**
17
- * Computed slot for a single boxed field, ready for accessor emission.
18
- */
19
- export type BoxedFieldSlot = {
20
- readonly field: GirField;
21
- readonly slot: FieldSlot;
22
- };
23
-
24
- /**
25
- * Computes per-field storage slots for a boxed record.
26
- *
27
- * Walks every field (private fields included so their storage occupies
28
- * space) and resolves each to a primitive-size {@link FieldLayoutInput}.
29
- * Private fields are returned with their slots so callers can filter on
30
- * `field.private` while still seeing the layout-correct offsets of public
31
- * fields after them.
32
- *
33
- * @param context - The module context
34
- * @param fields - The boxed's field list in declaration order
35
- */
36
- export const computeBoxedFieldSlots = (
37
- context: ModuleContext,
38
- fields: readonly GirField[],
39
- isUnion = false,
40
- ): { readonly slots: readonly BoxedFieldSlot[]; readonly size: number } => {
41
- const inputs: FieldLayoutInput[] = [];
42
- for (const field of fields) {
43
- inputs.push(fieldLayoutInput(context, field, new Set()));
44
- }
45
- const result = computeFieldSlots(inputs, isUnion);
46
- const slots = result.slots.map((slot, index) => {
47
- const field = fields[index];
48
- if (field === undefined) {
49
- throw new Error("computeBoxedFieldSlots: parallel arrays diverged");
50
- }
51
- return { field, slot };
52
- });
53
- return { slots, size: result.size };
54
- };
55
-
56
- const fieldLayoutInput = (context: ModuleContext, field: GirField, visited: ReadonlySet<string>): FieldLayoutInput => {
57
- if (field.callback !== undefined) {
58
- return { layout: POINTER_LAYOUT, bits: undefined };
59
- }
60
- if (field.type === undefined) {
61
- return { layout: POINTER_LAYOUT, bits: undefined };
62
- }
63
- return { layout: layoutOfType(context, field.type, visited), bits: field.bits };
64
- };
65
-
66
- const layoutOfType = (context: ModuleContext, ref: GirTypeRef, visited: ReadonlySet<string>): FieldLayout => {
67
- switch (ref.kind) {
68
- case "primitive":
69
- return layoutOfPrimitive(ref.category);
70
- case "named":
71
- return layoutOfNamed(context, ref, visited);
72
- case "array":
73
- return arrayLayout(context, ref, visited);
74
- case "list":
75
- case "hashtable":
76
- case "callback":
77
- case "varargs":
78
- return POINTER_LAYOUT;
79
- }
80
- };
81
-
82
- const arrayLayout = (
83
- context: ModuleContext,
84
- ref: Extract<GirTypeRef, { kind: "array" }>,
85
- visited: ReadonlySet<string>,
86
- ): FieldLayout => {
87
- if (ref.fixedSize === undefined) return POINTER_LAYOUT;
88
- const elementLayout = layoutOfType(context, ref.element, visited);
89
- return { size: elementLayout.size * ref.fixedSize, align: elementLayout.align };
90
- };
91
-
92
- const layoutOfNamed = (context: ModuleContext, ref: NamedTypeRef, visited: ReadonlySet<string>): FieldLayout => {
93
- if (ref.cType?.endsWith("*") === true) return POINTER_LAYOUT;
94
- const namespaceName = ref.namespaceName ?? context.namespace.name;
95
- const resolved = context.repository.resolveNamed(namespaceName, ref.typeName);
96
- if (resolved === undefined) return POINTER_LAYOUT;
97
- return layoutOfResolved(context, resolved, visited);
98
- };
99
-
100
- const layoutOfResolved = (
101
- context: ModuleContext,
102
- resolved: ResolvedNamed,
103
- visited: ReadonlySet<string>,
104
- ): FieldLayout => {
105
- switch (resolved.kind) {
106
- case "class":
107
- case "interface":
108
- return POINTER_LAYOUT;
109
- case "boxed":
110
- return layoutOfBoxedRecord(context, resolved, visited);
111
- case "enum":
112
- return layoutOfPrimitive("int32");
113
- case "callback":
114
- return POINTER_LAYOUT;
115
- case "alias":
116
- return resolveAliasLayout(context, resolved, visited);
117
- }
118
- };
119
-
120
- const layoutOfBoxedRecord = (
121
- context: ModuleContext,
122
- resolved: Extract<ResolvedNamed, { kind: "boxed" }>,
123
- visited: ReadonlySet<string>,
124
- ): FieldLayout => {
125
- if (resolved.value.cType?.endsWith("*") === true) return POINTER_LAYOUT;
126
- const key = `${resolved.namespace.name}.${resolved.value.name}`;
127
- if (visited.has(key)) return POINTER_LAYOUT;
128
- const cached = recordLayoutCache.get(key);
129
- if (cached !== undefined) return cached;
130
- const nextVisited = new Set(visited);
131
- nextVisited.add(key);
132
- const inputs: FieldLayoutInput[] = [];
133
- for (const field of resolved.value.fields) {
134
- if (field.callback !== undefined) {
135
- inputs.push({ layout: POINTER_LAYOUT, bits: undefined });
136
- continue;
137
- }
138
- if (field.type === undefined) {
139
- inputs.push({ layout: POINTER_LAYOUT, bits: undefined });
140
- continue;
141
- }
142
- inputs.push({ layout: layoutOfType(context, field.type, nextVisited), bits: field.bits });
143
- }
144
- if (inputs.length === 0) return POINTER_LAYOUT;
145
- const { size } = computeFieldSlots(inputs, resolved.value.isUnion);
146
- const align = Math.max(1, ...inputs.map((input) => input.layout.align));
147
- const layout: FieldLayout = { size, align };
148
- recordLayoutCache.set(key, layout);
149
- return layout;
150
- };
151
-
152
- const recordLayoutCache = new Map<string, FieldLayout>();
153
-
154
- const resolveAliasLayout = (
155
- context: ModuleContext,
156
- resolved: Extract<ResolvedNamed, { kind: "alias" }>,
157
- visited: ReadonlySet<string>,
158
- ): FieldLayout => {
159
- const ref = resolved.targetRef;
160
- if (ref === undefined) return POINTER_LAYOUT;
161
- if (ref.kind === "named") {
162
- const primitive = primitiveCategory(ref.typeName);
163
- if (primitive !== undefined) return layoutOfPrimitive(primitive);
164
- }
165
- return layoutOfType(context, ref, visited);
166
- };
@@ -1,77 +0,0 @@
1
- import type { ModuleContext } from "../dsl/context.js";
2
- import { indent } from "../dsl/emit.js";
3
- import type { GirBoxed } from "../gir/boxed.js";
4
- import { renderBoxedConstructor, renderBoxedConstructorPropsInterface } from "./boxed-constructor.js";
5
- import { renderBoxedFieldAccessor } from "./boxed-field-accessor.js";
6
- import { computeBoxedFieldSlots } from "./boxed-layout.js";
7
- import { type Callables, dedupeCallables, emitBindings, renderPlainTypeMembers } from "./callables.js";
8
- import { isClassStructRecord } from "./class-struct-record.js";
9
- import { renderGetTypeReference } from "./gtype-binding.js";
10
- import { appendNativeClassRegistration } from "./registration.js";
11
-
12
- /**
13
- * Emits a class declaration plus optional boxed registration for a
14
- * `<record>`, `<union>`, or `<glib:boxed>`.
15
- *
16
- * Walks constructors, static functions, and methods just like
17
- * {@link emitClass}, attaching them to the boxed class. Field accessors
18
- * and construction metadata are emitted by their dedicated writers.
19
- *
20
- * Vtable records (`glib:is-gtype-struct-for`) are skipped here — they are
21
- * consumed by the owning class's vtable registration. Class- and
22
- * interface-struct records (`GTypeClass`, `GEnumClass`, …) are likewise skipped
23
- * as they are runtime vtables rather than marshallable values.
24
- *
25
- * @param context - The module context
26
- * @param boxed - The boxed to emit
27
- */
28
- export const emitBoxed = (context: ModuleContext, boxed: GirBoxed): void => {
29
- if (!boxed.introspectable) return;
30
- if (boxed.kind === "vtable") return;
31
- if (boxed.name.length === 0) return;
32
- if (isClassStructRecord(context.namespace.name, boxed)) return;
33
- const className = boxed.name;
34
- const callables: Callables = {
35
- constructors: dedupeCallables(boxed.constructors),
36
- functions: dedupeCallables(boxed.functions),
37
- methods: dedupeCallables(boxed.methods),
38
- };
39
- emitBindings(context, callables);
40
-
41
- const members = renderBoxedMembers(context, boxed, className, callables);
42
- const body = members.map((member) => indent(member, 1)).join("\n\n");
43
- context.module.appendDeclaration(`export class ${className} {\n${body}\n}`);
44
- context.module.appendDeclaration(renderBoxedConstructorPropsInterface(context, boxed, className));
45
-
46
- const getTypeRef =
47
- boxed.glibGetType === undefined
48
- ? undefined
49
- : renderGetTypeReference(context, boxed.glibGetType, boxed.glibTypeName);
50
- appendNativeClassRegistration(context, {
51
- className,
52
- role: "boxed",
53
- getTypeRef,
54
- });
55
- };
56
-
57
- const renderBoxedMembers = (
58
- context: ModuleContext,
59
- boxed: GirBoxed,
60
- className: string,
61
- callables: Callables,
62
- ): readonly string[] => {
63
- const { members, claimedNames } = renderPlainTypeMembers({
64
- context,
65
- className,
66
- callables,
67
- hasGType: boxed.glibGetType !== undefined,
68
- wrap: "boxed",
69
- });
70
- members.unshift(renderBoxedConstructor(context, boxed, className));
71
- const { slots } = computeBoxedFieldSlots(context, boxed.fields, boxed.isUnion);
72
- for (const slot of slots) {
73
- const block = renderBoxedFieldAccessor(context, slot, claimedNames, boxed.fields);
74
- if (block !== undefined) members.push(block);
75
- }
76
- return members;
77
- };