@gtkx/codegen 0.21.0

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 (340) hide show
  1. package/LICENSE +373 -0
  2. package/dist/dsl/context.d.ts +104 -0
  3. package/dist/dsl/context.d.ts.map +1 -0
  4. package/dist/dsl/context.js +140 -0
  5. package/dist/dsl/context.js.map +1 -0
  6. package/dist/dsl/emit.d.ts +28 -0
  7. package/dist/dsl/emit.d.ts.map +1 -0
  8. package/dist/dsl/emit.js +41 -0
  9. package/dist/dsl/emit.js.map +1 -0
  10. package/dist/dsl/identifier.d.ts +28 -0
  11. package/dist/dsl/identifier.d.ts.map +1 -0
  12. package/dist/dsl/identifier.js +45 -0
  13. package/dist/dsl/identifier.js.map +1 -0
  14. package/dist/dsl/imports.d.ts +58 -0
  15. package/dist/dsl/imports.d.ts.map +1 -0
  16. package/dist/dsl/imports.js +107 -0
  17. package/dist/dsl/imports.js.map +1 -0
  18. package/dist/dsl/module.d.ts +53 -0
  19. package/dist/dsl/module.d.ts.map +1 -0
  20. package/dist/dsl/module.js +76 -0
  21. package/dist/dsl/module.js.map +1 -0
  22. package/dist/ffi/pipeline.d.ts +19 -0
  23. package/dist/ffi/pipeline.d.ts.map +1 -0
  24. package/dist/ffi/pipeline.js +107 -0
  25. package/dist/ffi/pipeline.js.map +1 -0
  26. package/dist/fingerprint.d.ts +30 -0
  27. package/dist/fingerprint.d.ts.map +1 -0
  28. package/dist/fingerprint.js +33 -0
  29. package/dist/fingerprint.js.map +1 -0
  30. package/dist/gi-store.d.ts +34 -0
  31. package/dist/gi-store.d.ts.map +1 -0
  32. package/dist/gi-store.js +154 -0
  33. package/dist/gi-store.js.map +1 -0
  34. package/dist/gir/boxed.d.ts +66 -0
  35. package/dist/gir/boxed.d.ts.map +1 -0
  36. package/dist/gir/boxed.js +49 -0
  37. package/dist/gir/boxed.js.map +1 -0
  38. package/dist/gir/callback.d.ts +15 -0
  39. package/dist/gir/callback.d.ts.map +1 -0
  40. package/dist/gir/callback.js +17 -0
  41. package/dist/gir/callback.js.map +1 -0
  42. package/dist/gir/class.d.ts +49 -0
  43. package/dist/gir/class.d.ts.map +1 -0
  44. package/dist/gir/class.js +42 -0
  45. package/dist/gir/class.js.map +1 -0
  46. package/dist/gir/enum.d.ts +39 -0
  47. package/dist/gir/enum.d.ts.map +1 -0
  48. package/dist/gir/enum.js +24 -0
  49. package/dist/gir/enum.js.map +1 -0
  50. package/dist/gir/field.d.ts +27 -0
  51. package/dist/gir/field.d.ts.map +1 -0
  52. package/dist/gir/field.js +19 -0
  53. package/dist/gir/field.js.map +1 -0
  54. package/dist/gir/function.d.ts +47 -0
  55. package/dist/gir/function.d.ts.map +1 -0
  56. package/dist/gir/function.js +28 -0
  57. package/dist/gir/function.js.map +1 -0
  58. package/dist/gir/namespace.d.ts +65 -0
  59. package/dist/gir/namespace.d.ts.map +1 -0
  60. package/dist/gir/namespace.js +60 -0
  61. package/dist/gir/namespace.js.map +1 -0
  62. package/dist/gir/parameter.d.ts +82 -0
  63. package/dist/gir/parameter.d.ts.map +1 -0
  64. package/dist/gir/parameter.js +66 -0
  65. package/dist/gir/parameter.js.map +1 -0
  66. package/dist/gir/parse.d.ts +78 -0
  67. package/dist/gir/parse.d.ts.map +1 -0
  68. package/dist/gir/parse.js +155 -0
  69. package/dist/gir/parse.js.map +1 -0
  70. package/dist/gir/primitives.d.ts +36 -0
  71. package/dist/gir/primitives.d.ts.map +1 -0
  72. package/dist/gir/primitives.js +109 -0
  73. package/dist/gir/primitives.js.map +1 -0
  74. package/dist/gir/property.d.ts +29 -0
  75. package/dist/gir/property.d.ts.map +1 -0
  76. package/dist/gir/property.js +16 -0
  77. package/dist/gir/property.js.map +1 -0
  78. package/dist/gir/qualified-name.d.ts +37 -0
  79. package/dist/gir/qualified-name.d.ts.map +1 -0
  80. package/dist/gir/qualified-name.js +39 -0
  81. package/dist/gir/qualified-name.js.map +1 -0
  82. package/dist/gir/qualify.d.ts +32 -0
  83. package/dist/gir/qualify.d.ts.map +1 -0
  84. package/dist/gir/qualify.js +60 -0
  85. package/dist/gir/qualify.js.map +1 -0
  86. package/dist/gir/repository.d.ts +82 -0
  87. package/dist/gir/repository.d.ts.map +1 -0
  88. package/dist/gir/repository.js +122 -0
  89. package/dist/gir/repository.js.map +1 -0
  90. package/dist/gir/signal.d.ts +22 -0
  91. package/dist/gir/signal.d.ts.map +1 -0
  92. package/dist/gir/signal.js +20 -0
  93. package/dist/gir/signal.js.map +1 -0
  94. package/dist/gir/size.d.ts +67 -0
  95. package/dist/gir/size.d.ts.map +1 -0
  96. package/dist/gir/size.js +87 -0
  97. package/dist/gir/size.js.map +1 -0
  98. package/dist/gir/type-ref.d.ts +79 -0
  99. package/dist/gir/type-ref.d.ts.map +1 -0
  100. package/dist/gir/type-ref.js +101 -0
  101. package/dist/gir/type-ref.js.map +1 -0
  102. package/dist/index.d.ts +12 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +12 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/jsx-store.d.ts +22 -0
  107. package/dist/jsx-store.d.ts.map +1 -0
  108. package/dist/jsx-store.js +40 -0
  109. package/dist/jsx-store.js.map +1 -0
  110. package/dist/react/compounds-meta.d.ts +18 -0
  111. package/dist/react/compounds-meta.d.ts.map +1 -0
  112. package/dist/react/compounds-meta.js +93 -0
  113. package/dist/react/compounds-meta.js.map +1 -0
  114. package/dist/react/compounds.d.ts +27 -0
  115. package/dist/react/compounds.d.ts.map +1 -0
  116. package/dist/react/compounds.js +164 -0
  117. package/dist/react/compounds.js.map +1 -0
  118. package/dist/react/internal.d.ts +14 -0
  119. package/dist/react/internal.d.ts.map +1 -0
  120. package/dist/react/internal.js +79 -0
  121. package/dist/react/internal.js.map +1 -0
  122. package/dist/react/jsx.d.ts +22 -0
  123. package/dist/react/jsx.d.ts.map +1 -0
  124. package/dist/react/jsx.js +134 -0
  125. package/dist/react/jsx.js.map +1 -0
  126. package/dist/react/pipeline.d.ts +13 -0
  127. package/dist/react/pipeline.d.ts.map +1 -0
  128. package/dist/react/pipeline.js +25 -0
  129. package/dist/react/pipeline.js.map +1 -0
  130. package/dist/react/props.d.ts +38 -0
  131. package/dist/react/props.d.ts.map +1 -0
  132. package/dist/react/props.js +231 -0
  133. package/dist/react/props.js.map +1 -0
  134. package/dist/react/slot-props.d.ts +10 -0
  135. package/dist/react/slot-props.d.ts.map +1 -0
  136. package/dist/react/slot-props.js +56 -0
  137. package/dist/react/slot-props.js.map +1 -0
  138. package/dist/react/widgets.d.ts +83 -0
  139. package/dist/react/widgets.d.ts.map +1 -0
  140. package/dist/react/widgets.js +152 -0
  141. package/dist/react/widgets.js.map +1 -0
  142. package/dist/runner.d.ts +55 -0
  143. package/dist/runner.d.ts.map +1 -0
  144. package/dist/runner.js +60 -0
  145. package/dist/runner.js.map +1 -0
  146. package/dist/store-fs.d.ts +109 -0
  147. package/dist/store-fs.d.ts.map +1 -0
  148. package/dist/store-fs.js +98 -0
  149. package/dist/store-fs.js.map +1 -0
  150. package/dist/transpile.d.ts +32 -0
  151. package/dist/transpile.d.ts.map +1 -0
  152. package/dist/transpile.js +63 -0
  153. package/dist/transpile.js.map +1 -0
  154. package/dist/typecheck-store.d.ts +41 -0
  155. package/dist/typecheck-store.d.ts.map +1 -0
  156. package/dist/typecheck-store.js +102 -0
  157. package/dist/typecheck-store.js.map +1 -0
  158. package/dist/writers/alias.d.ts +13 -0
  159. package/dist/writers/alias.d.ts.map +1 -0
  160. package/dist/writers/alias.js +17 -0
  161. package/dist/writers/alias.js.map +1 -0
  162. package/dist/writers/async.d.ts +22 -0
  163. package/dist/writers/async.d.ts.map +1 -0
  164. package/dist/writers/async.js +48 -0
  165. package/dist/writers/async.js.map +1 -0
  166. package/dist/writers/boxed-constructor.d.ts +26 -0
  167. package/dist/writers/boxed-constructor.d.ts.map +1 -0
  168. package/dist/writers/boxed-constructor.js +85 -0
  169. package/dist/writers/boxed-constructor.js.map +1 -0
  170. package/dist/writers/boxed-field-accessor.d.ts +18 -0
  171. package/dist/writers/boxed-field-accessor.d.ts.map +1 -0
  172. package/dist/writers/boxed-field-accessor.js +260 -0
  173. package/dist/writers/boxed-field-accessor.js.map +1 -0
  174. package/dist/writers/boxed-layout.d.ts +27 -0
  175. package/dist/writers/boxed-layout.d.ts.map +1 -0
  176. package/dist/writers/boxed-layout.js +128 -0
  177. package/dist/writers/boxed-layout.js.map +1 -0
  178. package/dist/writers/boxed.d.ts +20 -0
  179. package/dist/writers/boxed.d.ts.map +1 -0
  180. package/dist/writers/boxed.js +71 -0
  181. package/dist/writers/boxed.js.map +1 -0
  182. package/dist/writers/callables.d.ts +124 -0
  183. package/dist/writers/callables.d.ts.map +1 -0
  184. package/dist/writers/callables.js +283 -0
  185. package/dist/writers/callables.js.map +1 -0
  186. package/dist/writers/callback.d.ts +16 -0
  187. package/dist/writers/callback.d.ts.map +1 -0
  188. package/dist/writers/callback.js +38 -0
  189. package/dist/writers/callback.js.map +1 -0
  190. package/dist/writers/class-struct-record.d.ts +31 -0
  191. package/dist/writers/class-struct-record.d.ts.map +1 -0
  192. package/dist/writers/class-struct-record.js +67 -0
  193. package/dist/writers/class-struct-record.js.map +1 -0
  194. package/dist/writers/class-struct.d.ts +22 -0
  195. package/dist/writers/class-struct.d.ts.map +1 -0
  196. package/dist/writers/class-struct.js +85 -0
  197. package/dist/writers/class-struct.js.map +1 -0
  198. package/dist/writers/class.d.ts +16 -0
  199. package/dist/writers/class.d.ts.map +1 -0
  200. package/dist/writers/class.js +307 -0
  201. package/dist/writers/class.js.map +1 -0
  202. package/dist/writers/constant.d.ts +15 -0
  203. package/dist/writers/constant.d.ts.map +1 -0
  204. package/dist/writers/constant.js +23 -0
  205. package/dist/writers/constant.js.map +1 -0
  206. package/dist/writers/constants.d.ts +15 -0
  207. package/dist/writers/constants.d.ts.map +1 -0
  208. package/dist/writers/constants.js +23 -0
  209. package/dist/writers/constants.js.map +1 -0
  210. package/dist/writers/constructor-props.d.ts +32 -0
  211. package/dist/writers/constructor-props.d.ts.map +1 -0
  212. package/dist/writers/constructor-props.js +110 -0
  213. package/dist/writers/constructor-props.js.map +1 -0
  214. package/dist/writers/enum.d.ts +21 -0
  215. package/dist/writers/enum.d.ts.map +1 -0
  216. package/dist/writers/enum.js +48 -0
  217. package/dist/writers/enum.js.map +1 -0
  218. package/dist/writers/function.d.ts +40 -0
  219. package/dist/writers/function.d.ts.map +1 -0
  220. package/dist/writers/function.js +127 -0
  221. package/dist/writers/function.js.map +1 -0
  222. package/dist/writers/gtype-binding.d.ts +19 -0
  223. package/dist/writers/gtype-binding.d.ts.map +1 -0
  224. package/dist/writers/gtype-binding.js +40 -0
  225. package/dist/writers/gtype-binding.js.map +1 -0
  226. package/dist/writers/inheritance.d.ts +48 -0
  227. package/dist/writers/inheritance.d.ts.map +1 -0
  228. package/dist/writers/inheritance.js +90 -0
  229. package/dist/writers/inheritance.js.map +1 -0
  230. package/dist/writers/interface.d.ts +16 -0
  231. package/dist/writers/interface.d.ts.map +1 -0
  232. package/dist/writers/interface.js +155 -0
  233. package/dist/writers/interface.js.map +1 -0
  234. package/dist/writers/method.d.ts +150 -0
  235. package/dist/writers/method.d.ts.map +1 -0
  236. package/dist/writers/method.js +510 -0
  237. package/dist/writers/method.js.map +1 -0
  238. package/dist/writers/param-classify.d.ts +93 -0
  239. package/dist/writers/param-classify.d.ts.map +1 -0
  240. package/dist/writers/param-classify.js +163 -0
  241. package/dist/writers/param-classify.js.map +1 -0
  242. package/dist/writers/property-accessor.d.ts +19 -0
  243. package/dist/writers/property-accessor.d.ts.map +1 -0
  244. package/dist/writers/property-accessor.js +117 -0
  245. package/dist/writers/property-accessor.js.map +1 -0
  246. package/dist/writers/registration.d.ts +27 -0
  247. package/dist/writers/registration.d.ts.map +1 -0
  248. package/dist/writers/registration.js +30 -0
  249. package/dist/writers/registration.js.map +1 -0
  250. package/dist/writers/return-wrap.d.ts +39 -0
  251. package/dist/writers/return-wrap.d.ts.map +1 -0
  252. package/dist/writers/return-wrap.js +152 -0
  253. package/dist/writers/return-wrap.js.map +1 -0
  254. package/dist/writers/runtime-override.d.ts +18 -0
  255. package/dist/writers/runtime-override.d.ts.map +1 -0
  256. package/dist/writers/runtime-override.js +44 -0
  257. package/dist/writers/runtime-override.js.map +1 -0
  258. package/dist/writers/signal.d.ts +21 -0
  259. package/dist/writers/signal.d.ts.map +1 -0
  260. package/dist/writers/signal.js +260 -0
  261. package/dist/writers/signal.js.map +1 -0
  262. package/dist/writers/ts-type.d.ts +50 -0
  263. package/dist/writers/ts-type.d.ts.map +1 -0
  264. package/dist/writers/ts-type.js +75 -0
  265. package/dist/writers/ts-type.js.map +1 -0
  266. package/dist/writers/types-ts.d.ts +27 -0
  267. package/dist/writers/types-ts.d.ts.map +1 -0
  268. package/dist/writers/types-ts.js +97 -0
  269. package/dist/writers/types-ts.js.map +1 -0
  270. package/dist/writers/value.d.ts +89 -0
  271. package/dist/writers/value.d.ts.map +1 -0
  272. package/dist/writers/value.js +402 -0
  273. package/dist/writers/value.js.map +1 -0
  274. package/package.json +55 -0
  275. package/src/dsl/context.ts +146 -0
  276. package/src/dsl/emit.ts +42 -0
  277. package/src/dsl/identifier.ts +52 -0
  278. package/src/dsl/imports.ts +109 -0
  279. package/src/dsl/module.ts +75 -0
  280. package/src/ffi/pipeline.ts +113 -0
  281. package/src/fingerprint.ts +50 -0
  282. package/src/gi-store.ts +199 -0
  283. package/src/gir/boxed.ts +94 -0
  284. package/src/gir/callback.ts +26 -0
  285. package/src/gir/class.ts +79 -0
  286. package/src/gir/enum.ts +55 -0
  287. package/src/gir/field.ts +40 -0
  288. package/src/gir/function.ts +67 -0
  289. package/src/gir/namespace.ts +118 -0
  290. package/src/gir/parameter.ts +120 -0
  291. package/src/gir/parse.ts +171 -0
  292. package/src/gir/primitives.ts +137 -0
  293. package/src/gir/property.ts +39 -0
  294. package/src/gir/qualified-name.ts +55 -0
  295. package/src/gir/qualify.ts +64 -0
  296. package/src/gir/repository.ts +149 -0
  297. package/src/gir/signal.ts +36 -0
  298. package/src/gir/size.ts +129 -0
  299. package/src/gir/type-ref.ts +180 -0
  300. package/src/index.ts +16 -0
  301. package/src/jsx-store.ts +53 -0
  302. package/src/react/compounds-meta.ts +99 -0
  303. package/src/react/compounds.ts +204 -0
  304. package/src/react/internal.ts +91 -0
  305. package/src/react/jsx.ts +155 -0
  306. package/src/react/pipeline.ts +29 -0
  307. package/src/react/props.ts +307 -0
  308. package/src/react/slot-props.ts +57 -0
  309. package/src/react/widgets.ts +185 -0
  310. package/src/runner.ts +89 -0
  311. package/src/store-fs.ts +157 -0
  312. package/src/transpile.ts +80 -0
  313. package/src/typecheck-store.ts +136 -0
  314. package/src/writers/alias.ts +19 -0
  315. package/src/writers/async.ts +44 -0
  316. package/src/writers/boxed-constructor.ts +105 -0
  317. package/src/writers/boxed-field-accessor.ts +306 -0
  318. package/src/writers/boxed-layout.ts +166 -0
  319. package/src/writers/boxed.ts +77 -0
  320. package/src/writers/callables.ts +339 -0
  321. package/src/writers/callback.ts +40 -0
  322. package/src/writers/class-struct-record.ts +75 -0
  323. package/src/writers/class-struct.ts +96 -0
  324. package/src/writers/class.ts +384 -0
  325. package/src/writers/constant.ts +29 -0
  326. package/src/writers/constructor-props.ts +130 -0
  327. package/src/writers/enum.ts +53 -0
  328. package/src/writers/function.ts +136 -0
  329. package/src/writers/gtype-binding.ts +48 -0
  330. package/src/writers/inheritance.ts +104 -0
  331. package/src/writers/interface.ts +168 -0
  332. package/src/writers/method.ts +678 -0
  333. package/src/writers/param-classify.ts +178 -0
  334. package/src/writers/property-accessor.ts +139 -0
  335. package/src/writers/registration.ts +42 -0
  336. package/src/writers/return-wrap.ts +180 -0
  337. package/src/writers/runtime-override.ts +59 -0
  338. package/src/writers/signal.ts +318 -0
  339. package/src/writers/ts-type.ts +115 -0
  340. package/src/writers/value.ts +485 -0
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Detects the start half of a `Gio.AsyncReady` callable pair.
3
+ *
4
+ * Pairs follow two GIR conventions: an explicit `*_async` / `*_finish`
5
+ * suffix (the older style), or a base name paired with a `<root>_finish`
6
+ * (the modern GTK 4 style, e.g. `gtk_file_dialog_open` /
7
+ * `gtk_file_dialog_open_finish`).
8
+ *
9
+ * The runtime convention is to wrap the pair with `promisify(asyncFn,
10
+ * finishFn, cancellable, { leading })`. This detector returns the
11
+ * matching finish counterpart's GIR name when one exists in the same
12
+ * set of callables, so the class writer can wire the wrapper.
13
+ *
14
+ * @param fn - The candidate async-start callable
15
+ * @param siblings - Other callables on the same type to scan for the
16
+ * matching `*_finish`
17
+ * @returns The matching `*_finish` GIR name, or `undefined` when there is
18
+ * no pair
19
+ */
20
+ export const matchAsyncFinishName = (fn, siblings) => {
21
+ if (fn.name.endsWith("_async")) {
22
+ const root = fn.name.slice(0, -"_async".length);
23
+ const finishName = `${root}_finish`;
24
+ const match = siblings.find((sibling) => sibling.name === finishName);
25
+ return match === undefined ? undefined : finishName;
26
+ }
27
+ if (fn.name.endsWith("_finish"))
28
+ return undefined;
29
+ const finishName = `${fn.name}_finish`;
30
+ const match = siblings.find((sibling) => sibling.name === finishName);
31
+ if (match === undefined)
32
+ return undefined;
33
+ if (!hasAsyncReadyCallbackParameter(fn))
34
+ return undefined;
35
+ return finishName;
36
+ };
37
+ const hasAsyncReadyCallbackParameter = (fn) => {
38
+ for (const parameter of fn.parameters) {
39
+ if (parameter.scope !== undefined)
40
+ return true;
41
+ if (parameter.type?.kind !== "named")
42
+ continue;
43
+ if (parameter.type.typeName === "AsyncReadyCallback")
44
+ return true;
45
+ }
46
+ return false;
47
+ };
48
+ //# sourceMappingURL=async.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/writers/async.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EAAe,EAAE,QAAgC,EAAsB,EAAE;IAC1G,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,GAAG,IAAI,SAAS,CAAC;QACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QACtE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IACxD,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,IAAI,SAAS,CAAC;IACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IACtE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,8BAA8B,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1D,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAAG,CAAC,EAAe,EAAW,EAAE;IAChE,KAAK,MAAM,SAAS,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO;YAAE,SAAS;QAC/C,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,KAAK,oBAAoB;YAAE,OAAO,IAAI,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ModuleContext } from "../dsl/context.js";
2
+ import type { GirBoxed } from "../gir/boxed.js";
3
+ /**
4
+ * Renders the `export interface <Boxed>ConstructorProps` declaration: the
5
+ * camelCase, optional, nullable form of every writable field. Opaque boxed
6
+ * records (disguised, no GType) have no known fields and get an empty bag.
7
+ *
8
+ * @param context - The module context
9
+ * @param boxed - The boxed record
10
+ * @param className - The local PascalCase class name
11
+ */
12
+ export declare const renderBoxedConstructorPropsInterface: (context: ModuleContext, boxed: GirBoxed, className: string) => string;
13
+ /**
14
+ * Renders a boxed record's constructor.
15
+ *
16
+ * The constructor allocates zero-filled native memory of the struct's size and
17
+ * writes each provided field at its byte offset, threading bitfield members
18
+ * through a read-modify-write into their shared storage word. Opaque records
19
+ * have no known layout, so their constructor throws.
20
+ *
21
+ * @param context - The module context
22
+ * @param boxed - The boxed record
23
+ * @param className - The local PascalCase class name
24
+ */
25
+ export declare const renderBoxedConstructor: (context: ModuleContext, boxed: GirBoxed, className: string) => string;
26
+ //# sourceMappingURL=boxed-constructor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boxed-constructor.d.ts","sourceRoot":"","sources":["../../src/writers/boxed-constructor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAqBhD;;;;;;;;GAQG;AACH,eAAO,MAAM,oCAAoC,GAC7C,SAAS,aAAa,EACtB,OAAO,QAAQ,EACf,WAAW,MAAM,KAClB,MAWF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,EAAE,WAAW,MAAM,KAAG,MAenG,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { quote, toCamelCase, toIdentifier } from "@gtkx/utils";
2
+ import { indent } from "../dsl/emit.js";
3
+ import { computeBoxedFieldSlots } from "./boxed-layout.js";
4
+ import { renderTsType } from "./ts-type.js";
5
+ import { renderFfiType } from "./value.js";
6
+ const isWritableFieldSlot = (entry) => !entry.field.private &&
7
+ entry.field.writable &&
8
+ entry.field.callback === undefined &&
9
+ entry.field.type !== undefined;
10
+ const isOpaque = (boxed) => boxed.glibGetType === undefined && boxed.disguised;
11
+ /**
12
+ * Renders the `export interface <Boxed>ConstructorProps` declaration: the
13
+ * camelCase, optional, nullable form of every writable field. Opaque boxed
14
+ * records (disguised, no GType) have no known fields and get an empty bag.
15
+ *
16
+ * @param context - The module context
17
+ * @param boxed - The boxed record
18
+ * @param className - The local PascalCase class name
19
+ */
20
+ export const renderBoxedConstructorPropsInterface = (context, boxed, className) => {
21
+ if (isOpaque(boxed))
22
+ return `export interface ${className}ConstructorProps {}`;
23
+ const { slots } = computeBoxedFieldSlots(context, boxed.fields, boxed.isUnion);
24
+ const lines = slots
25
+ .filter(isWritableFieldSlot)
26
+ .map((entry) => `${toIdentifier(toCamelCase(entry.field.name))}?: ${renderTsType(context, entry.field.type, true)};`);
27
+ const body = lines.length === 0 ? "" : `\n${indent(lines.join("\n"), 1)}\n`;
28
+ return `export interface ${className}ConstructorProps {${body}}`;
29
+ };
30
+ /**
31
+ * Renders a boxed record's constructor.
32
+ *
33
+ * The constructor allocates zero-filled native memory of the struct's size and
34
+ * writes each provided field at its byte offset, threading bitfield members
35
+ * through a read-modify-write into their shared storage word. Opaque records
36
+ * have no known layout, so their constructor throws.
37
+ *
38
+ * @param context - The module context
39
+ * @param boxed - The boxed record
40
+ * @param className - The local PascalCase class name
41
+ */
42
+ export const renderBoxedConstructor = (context, boxed, className) => {
43
+ if (isOpaque(boxed)) {
44
+ return `constructor() {\n${indent(`throw new Error(${quote(`Cannot construct ${className}: opaque boxed type with no known layout`)});`, 1)}\n}`;
45
+ }
46
+ context.addNativeImport("alloc");
47
+ context.addRuntimeImport("setHandle");
48
+ const { slots, size } = computeBoxedFieldSlots(context, boxed.fields, boxed.isUnion);
49
+ const statements = [`const handle = alloc(${allocArgs(context, boxed, size).join(", ")});`];
50
+ for (const entry of slots) {
51
+ if (!isWritableFieldSlot(entry))
52
+ continue;
53
+ statements.push(renderFieldWrite(context, entry));
54
+ }
55
+ statements.push("setHandle(this, handle);");
56
+ const body = statements.join("\n");
57
+ return `constructor(props: ${className}ConstructorProps = {}) {\n${indent(body, 1)}\n}`;
58
+ };
59
+ const allocArgs = (context, boxed, size) => {
60
+ const glibTypeName = boxed.glibTypeName ?? boxed.cType;
61
+ const lib = context.namespace.sharedLibrary;
62
+ const args = [String(size)];
63
+ if (glibTypeName !== undefined || lib !== undefined) {
64
+ args.push(glibTypeName !== undefined ? quote(glibTypeName) : "undefined");
65
+ }
66
+ if (lib !== undefined)
67
+ args.push(quote(lib));
68
+ return args;
69
+ };
70
+ const renderFieldWrite = (context, entry) => {
71
+ context.addRuntimeImport("t");
72
+ context.addNativeImport("write");
73
+ const ffiType = renderFfiType(context, entry.field.type, "none");
74
+ const name = toIdentifier(toCamelCase(entry.field.name));
75
+ const offset = entry.slot.byteOffset;
76
+ if (entry.slot.bitWidth === undefined) {
77
+ return `if (props.${name} !== undefined) write(handle, ${ffiType}, ${offset}, props.${name});`;
78
+ }
79
+ context.addNativeImport("read");
80
+ const mask = (1 << entry.slot.bitWidth) - 1;
81
+ const bitOffset = entry.slot.bitOffset ?? 0;
82
+ const merged = `(((read(handle, ${ffiType}, ${offset}) as number) & ~(${mask} << ${bitOffset})) | ((Number(props.${name}) & ${mask}) << ${bitOffset})) >>> 0`;
83
+ return `if (props.${name} !== undefined) write(handle, ${ffiType}, ${offset}, ${merged});`;
84
+ };
85
+ //# sourceMappingURL=boxed-constructor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boxed-constructor.js","sourceRoot":"","sources":["../../src/writers/boxed-constructor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ModuleContext } from "../dsl/context.js";
2
+ import type { GirField } from "../gir/field.js";
3
+ import { type BoxedFieldSlot } from "./boxed-layout.js";
4
+ /**
5
+ * Renders the `get` / `set` accessor pair for a single boxed field.
6
+ *
7
+ * The accessor reads through the runtime's `read(handle, ffiType, offset)`
8
+ * (or `write` for the setter), with bitfield members threading through a
9
+ * read-modify-write sequence into their shared storage word. Fields whose
10
+ * type cannot be marshaled at present (callbacks, varargs, inline arrays
11
+ * of complex types) are skipped silently.
12
+ *
13
+ * @param context - The module context
14
+ * @param slot - The field plus its layout slot
15
+ * @param claimedNames - Names already used by emitted methods
16
+ */
17
+ export declare const renderBoxedFieldAccessor: (context: ModuleContext, slot: BoxedFieldSlot, claimedNames: ReadonlySet<string>, siblingFields: readonly GirField[]) => string | undefined;
18
+ //# sourceMappingURL=boxed-field-accessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boxed-field-accessor.d.ts","sourceRoot":"","sources":["../../src/writers/boxed-field-accessor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,KAAK,cAAc,EAA0B,MAAM,mBAAmB,CAAC;AAMhF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,wBAAwB,GACjC,SAAS,aAAa,EACtB,MAAM,cAAc,EACpB,cAAc,WAAW,CAAC,MAAM,CAAC,EACjC,eAAe,SAAS,QAAQ,EAAE,KACnC,MAAM,GAAG,SAmCX,CAAC"}
@@ -0,0 +1,260 @@
1
+ import { toCamelCase, toIdentifier } from "@gtkx/utils";
2
+ import { indent } from "../dsl/emit.js";
3
+ import { computeBoxedFieldSlots } from "./boxed-layout.js";
4
+ import { typeRefIsClassStruct } from "./class-struct-record.js";
5
+ import { wrapReturnValue } from "./return-wrap.js";
6
+ import { renderTsType } from "./ts-type.js";
7
+ import { renderFfiType } from "./value.js";
8
+ /**
9
+ * Renders the `get` / `set` accessor pair for a single boxed field.
10
+ *
11
+ * The accessor reads through the runtime's `read(handle, ffiType, offset)`
12
+ * (or `write` for the setter), with bitfield members threading through a
13
+ * read-modify-write sequence into their shared storage word. Fields whose
14
+ * type cannot be marshaled at present (callbacks, varargs, inline arrays
15
+ * of complex types) are skipped silently.
16
+ *
17
+ * @param context - The module context
18
+ * @param slot - The field plus its layout slot
19
+ * @param claimedNames - Names already used by emitted methods
20
+ */
21
+ export const renderBoxedFieldAccessor = (context, slot, claimedNames, siblingFields) => {
22
+ const { field } = slot;
23
+ if (field.private)
24
+ return undefined;
25
+ if (!field.readable && !field.writable)
26
+ return undefined;
27
+ if (field.callback !== undefined)
28
+ return undefined;
29
+ if (field.type === undefined)
30
+ return undefined;
31
+ if (typeRefIsClassStruct(context, field.type))
32
+ return undefined;
33
+ const jsName = toIdentifier(toCamelCase(field.name));
34
+ if (claimedNames.has(jsName))
35
+ return undefined;
36
+ if (jsName === "constructor")
37
+ return undefined;
38
+ const structArray = renderStructArrayAccessor(context, { field, jsName, slot: slot.slot, siblingFields });
39
+ if (structArray !== undefined)
40
+ return structArray;
41
+ if (!isAccessorEligibleType(field.type)) {
42
+ const tsType = renderTsType(context, field.type, false);
43
+ const modifier = field.writable ? "declare" : "declare readonly";
44
+ return `${modifier} ${jsName}: ${tsType};`;
45
+ }
46
+ const ffiType = renderFfiType(context, field.type, "none");
47
+ const tsType = renderTsType(context, field.type, false);
48
+ const accessorOptions = {
49
+ context,
50
+ jsName,
51
+ tsType,
52
+ ffiType,
53
+ slot: slot.slot,
54
+ fieldType: field.type,
55
+ };
56
+ const blocks = [getterBlock(accessorOptions)];
57
+ if (field.writable) {
58
+ blocks.push(setterBlock(accessorOptions));
59
+ }
60
+ return blocks.join("\n\n");
61
+ };
62
+ const isAccessorEligibleType = (ref) => {
63
+ switch (ref.kind) {
64
+ case "primitive":
65
+ return ref.category !== "void" && ref.category !== "unichar";
66
+ case "named":
67
+ return true;
68
+ case "array":
69
+ return ref.fixedSize !== undefined;
70
+ case "list":
71
+ case "hashtable":
72
+ return false;
73
+ case "callback":
74
+ case "varargs":
75
+ return false;
76
+ }
77
+ };
78
+ const resolveInlineStructFields = (context, ref) => {
79
+ if (ref === undefined || ref.kind !== "named")
80
+ return undefined;
81
+ if (ref.cType?.endsWith("*") === true)
82
+ return undefined;
83
+ const resolved = context.repository.resolveNamed(ref.namespaceName ?? context.namespace.name, ref.typeName);
84
+ if (resolved === undefined || resolved.kind !== "boxed")
85
+ return undefined;
86
+ if (resolved.value.cType?.endsWith("*") === true)
87
+ return undefined;
88
+ if (resolved.value.fields.length === 0)
89
+ return undefined;
90
+ return resolved.value.fields;
91
+ };
92
+ const arrayLengthExpression = (arrayRef, siblingFields) => {
93
+ if (arrayRef.fixedSize !== undefined)
94
+ return String(arrayRef.fixedSize);
95
+ if (arrayRef.lengthParameterIndex === undefined)
96
+ return undefined;
97
+ const lengthField = siblingFields.filter((field) => !field.private)[arrayRef.lengthParameterIndex];
98
+ if (lengthField === undefined)
99
+ return undefined;
100
+ return `this.${toIdentifier(toCamelCase(lengthField.name))}`;
101
+ };
102
+ const renderElementReadObject = (context, fields, baseOffset) => {
103
+ const { slots } = computeBoxedFieldSlots(context, fields);
104
+ const entries = [];
105
+ for (const { field, slot } of slots) {
106
+ if (field.private || field.type === undefined || field.callback !== undefined)
107
+ continue;
108
+ const jsName = toIdentifier(toCamelCase(field.name));
109
+ const offset = baseOffset + slot.byteOffset;
110
+ const nested = resolveInlineStructFields(context, field.type);
111
+ if (nested !== undefined) {
112
+ entries.push(`${jsName}: ${renderElementReadObject(context, nested, offset)}`);
113
+ continue;
114
+ }
115
+ if (!isAccessorEligibleType(field.type))
116
+ continue;
117
+ const ffi = renderFfiType(context, field.type, "none");
118
+ if (slot.bitWidth === undefined) {
119
+ entries.push(`${jsName}: read(__array, ${ffi}, __base + ${offset}) as ${renderTsType(context, field.type, false)}`);
120
+ continue;
121
+ }
122
+ const shift = slot.bitOffset ?? 0;
123
+ entries.push(`${jsName}: (((read(__array, ${ffi}, __base + ${offset}) as number) >>> ${shift}) & ${bitMask(slot.bitWidth)})`);
124
+ }
125
+ return `{ ${entries.join(", ")} }`;
126
+ };
127
+ const appendElementWriteStatements = (context, options) => {
128
+ const { fields, baseOffset, valuePath, out } = options;
129
+ const { slots } = computeBoxedFieldSlots(context, fields);
130
+ for (const { field, slot } of slots) {
131
+ if (field.private || field.type === undefined || field.callback !== undefined)
132
+ continue;
133
+ const valueExpr = `${valuePath}.${toIdentifier(toCamelCase(field.name))}`;
134
+ const offset = baseOffset + slot.byteOffset;
135
+ const nested = resolveInlineStructFields(context, field.type);
136
+ if (nested !== undefined) {
137
+ appendElementWriteStatements(context, { fields: nested, baseOffset: offset, valuePath: valueExpr, out });
138
+ continue;
139
+ }
140
+ if (!isAccessorEligibleType(field.type))
141
+ continue;
142
+ const ffi = renderFfiType(context, field.type, "none");
143
+ if (slot.bitWidth === undefined) {
144
+ out.push(`write(__array, ${ffi}, __base + ${offset}, ${valueExpr});`);
145
+ continue;
146
+ }
147
+ const mask = bitMask(slot.bitWidth);
148
+ const shift = slot.bitOffset ?? 0;
149
+ out.push(`write(__array, ${ffi}, __base + ${offset}, ((read(__array, ${ffi}, __base + ${offset}) & ~(${mask} << ${shift})) | ((Number(${valueExpr}) & ${mask}) << ${shift})) >>> 0);`);
150
+ }
151
+ };
152
+ const structArrayGetterBlock = (options) => {
153
+ const { context, jsName, tsType, bufferType, offset, lengthExpr, elementSize, elementFields } = options;
154
+ const element = renderElementReadObject(context, elementFields, 0);
155
+ const loop = [`const __base = __index * ${elementSize};`, `__result.push(${element});`].join("\n");
156
+ const body = [
157
+ `const __array = read(getHandle(this), ${bufferType}, ${offset});`,
158
+ `const __result: ${tsType} = [];`,
159
+ `for (let __index = 0; __index < ${lengthExpr}; __index++) {`,
160
+ indent(loop, 1),
161
+ "}",
162
+ "return __result;",
163
+ ].join("\n");
164
+ return `get ${jsName}(): ${tsType} {\n${indent(body, 1)}\n}`;
165
+ };
166
+ const structArraySetterBlock = (options) => {
167
+ const { context, jsName, tsType, bufferType, offset, elementSize, elementFields } = options;
168
+ const writes = [];
169
+ appendElementWriteStatements(context, {
170
+ fields: elementFields,
171
+ baseOffset: 0,
172
+ valuePath: "__element",
173
+ out: writes,
174
+ });
175
+ const loop = [`const __element = __value[__index];`, `const __base = __index * ${elementSize};`, ...writes].join("\n");
176
+ const body = [
177
+ `const __array = read(getHandle(this), ${bufferType}, ${offset});`,
178
+ `for (let __index = 0; __index < __value.length; __index++) {`,
179
+ indent(loop, 1),
180
+ "}",
181
+ `write(getHandle(this), ${bufferType}, ${offset}, __array);`,
182
+ ].join("\n");
183
+ return `set ${jsName}(__value: ${tsType}) {\n${indent(body, 1)}\n}`;
184
+ };
185
+ const renderStructArrayAccessor = (context, target) => {
186
+ const { field, jsName, slot, siblingFields } = target;
187
+ const arrayRef = field.type;
188
+ if (arrayRef === undefined || arrayRef.kind !== "array" || slot.bitWidth !== undefined)
189
+ return undefined;
190
+ const elementFields = resolveInlineStructFields(context, arrayRef.element);
191
+ if (elementFields === undefined)
192
+ return undefined;
193
+ const lengthExpr = arrayLengthExpression(arrayRef, siblingFields);
194
+ if (lengthExpr === undefined)
195
+ return undefined;
196
+ const elementSize = computeBoxedFieldSlots(context, elementFields).size;
197
+ if (elementSize === 0)
198
+ return undefined;
199
+ context.addNativeImport("read");
200
+ context.addRuntimeImport("getHandle");
201
+ context.addRuntimeImport("t");
202
+ const options = {
203
+ context,
204
+ jsName,
205
+ tsType: renderTsType(context, arrayRef, false),
206
+ bufferType: `t.struct("borrowed", ${lengthExpr} * ${elementSize})`,
207
+ offset: slot.byteOffset,
208
+ lengthExpr,
209
+ elementSize,
210
+ elementFields,
211
+ };
212
+ const blocks = [];
213
+ if (field.readable)
214
+ blocks.push(structArrayGetterBlock(options));
215
+ if (field.writable) {
216
+ context.addNativeImport("write");
217
+ blocks.push(structArraySetterBlock(options));
218
+ }
219
+ return blocks.length === 0 ? undefined : blocks.join("\n\n");
220
+ };
221
+ const getterBlock = (options) => {
222
+ const { context, jsName, tsType, ffiType, slot, fieldType } = options;
223
+ context.addNativeImport("read");
224
+ context.addRuntimeImport("getHandle");
225
+ if (slot.bitWidth === undefined) {
226
+ const valueExpression = `read(getHandle(this), ${ffiType}, ${slot.byteOffset})`;
227
+ const wrapped = wrapReturnValue(context, {
228
+ ref: fieldType,
229
+ transfer: "none",
230
+ nullable: false,
231
+ valueExpression,
232
+ });
233
+ const body = `return ${wrapped};`;
234
+ return `get ${jsName}(): ${tsType} {\n${indent(body, 1)}\n}`;
235
+ }
236
+ const mask = bitMask(slot.bitWidth);
237
+ const shift = slot.bitOffset ?? 0;
238
+ const body = `const __unit = read(getHandle(this), ${ffiType}, ${slot.byteOffset}) as number;\nreturn (((__unit >>> ${shift}) & ${mask}) >>> 0) as ${tsType};`;
239
+ return `get ${jsName}(): ${tsType} {\n${indent(body, 1)}\n}`;
240
+ };
241
+ const setterBlock = (options) => {
242
+ const { context, jsName, tsType, ffiType, slot } = options;
243
+ context.addNativeImport("write");
244
+ context.addRuntimeImport("getHandle");
245
+ if (slot.bitWidth === undefined) {
246
+ const body = `write(getHandle(this), ${ffiType}, ${slot.byteOffset}, value);`;
247
+ return `set ${jsName}(value: ${tsType}) {\n${indent(body, 1)}\n}`;
248
+ }
249
+ context.addNativeImport("read");
250
+ const mask = bitMask(slot.bitWidth);
251
+ const shift = slot.bitOffset ?? 0;
252
+ 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);`;
253
+ return `set ${jsName}(value: ${tsType}) {\n${indent(body, 1)}\n}`;
254
+ };
255
+ const bitMask = (width) => {
256
+ if (width >= 32)
257
+ return 0xffffffff;
258
+ return (1 << width) - 1;
259
+ };
260
+ //# sourceMappingURL=boxed-field-accessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boxed-field-accessor.js","sourceRoot":"","sources":["../../src/writers/boxed-field-accessor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ModuleContext } from "../dsl/context.js";
2
+ import type { GirField } from "../gir/field.js";
3
+ import { type FieldSlot } from "../gir/size.js";
4
+ /**
5
+ * Computed slot for a single boxed field, ready for accessor emission.
6
+ */
7
+ export type BoxedFieldSlot = {
8
+ readonly field: GirField;
9
+ readonly slot: FieldSlot;
10
+ };
11
+ /**
12
+ * Computes per-field storage slots for a boxed record.
13
+ *
14
+ * Walks every field (private fields included so their storage occupies
15
+ * space) and resolves each to a primitive-size {@link FieldLayoutInput}.
16
+ * Private fields are returned with their slots so callers can filter on
17
+ * `field.private` while still seeing the layout-correct offsets of public
18
+ * fields after them.
19
+ *
20
+ * @param context - The module context
21
+ * @param fields - The boxed's field list in declaration order
22
+ */
23
+ export declare const computeBoxedFieldSlots: (context: ModuleContext, fields: readonly GirField[], isUnion?: boolean) => {
24
+ readonly slots: readonly BoxedFieldSlot[];
25
+ readonly size: number;
26
+ };
27
+ //# sourceMappingURL=boxed-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boxed-layout.d.ts","sourceRoot":"","sources":["../../src/writers/boxed-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAIH,KAAK,SAAS,EAEjB,MAAM,gBAAgB,CAAC;AAKxB;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAC5B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,GAC/B,SAAS,aAAa,EACtB,QAAQ,SAAS,QAAQ,EAAE,EAC3B,iBAAe,KAChB;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAcpE,CAAC"}
@@ -0,0 +1,128 @@
1
+ import { primitiveCategory } from "../gir/primitives.js";
2
+ import { computeFieldSlots, layoutOfPrimitive, } from "../gir/size.js";
3
+ const POINTER_LAYOUT = { size: 8, align: 8 };
4
+ /**
5
+ * Computes per-field storage slots for a boxed record.
6
+ *
7
+ * Walks every field (private fields included so their storage occupies
8
+ * space) and resolves each to a primitive-size {@link FieldLayoutInput}.
9
+ * Private fields are returned with their slots so callers can filter on
10
+ * `field.private` while still seeing the layout-correct offsets of public
11
+ * fields after them.
12
+ *
13
+ * @param context - The module context
14
+ * @param fields - The boxed's field list in declaration order
15
+ */
16
+ export const computeBoxedFieldSlots = (context, fields, isUnion = false) => {
17
+ const inputs = [];
18
+ for (const field of fields) {
19
+ inputs.push(fieldLayoutInput(context, field, new Set()));
20
+ }
21
+ const result = computeFieldSlots(inputs, isUnion);
22
+ const slots = result.slots.map((slot, index) => {
23
+ const field = fields[index];
24
+ if (field === undefined) {
25
+ throw new Error("computeBoxedFieldSlots: parallel arrays diverged");
26
+ }
27
+ return { field, slot };
28
+ });
29
+ return { slots, size: result.size };
30
+ };
31
+ const fieldLayoutInput = (context, field, visited) => {
32
+ if (field.callback !== undefined) {
33
+ return { layout: POINTER_LAYOUT, bits: undefined };
34
+ }
35
+ if (field.type === undefined) {
36
+ return { layout: POINTER_LAYOUT, bits: undefined };
37
+ }
38
+ return { layout: layoutOfType(context, field.type, visited), bits: field.bits };
39
+ };
40
+ const layoutOfType = (context, ref, visited) => {
41
+ switch (ref.kind) {
42
+ case "primitive":
43
+ return layoutOfPrimitive(ref.category);
44
+ case "named":
45
+ return layoutOfNamed(context, ref, visited);
46
+ case "array":
47
+ return arrayLayout(context, ref, visited);
48
+ case "list":
49
+ case "hashtable":
50
+ case "callback":
51
+ case "varargs":
52
+ return POINTER_LAYOUT;
53
+ }
54
+ };
55
+ const arrayLayout = (context, ref, visited) => {
56
+ if (ref.fixedSize === undefined)
57
+ return POINTER_LAYOUT;
58
+ const elementLayout = layoutOfType(context, ref.element, visited);
59
+ return { size: elementLayout.size * ref.fixedSize, align: elementLayout.align };
60
+ };
61
+ const layoutOfNamed = (context, ref, visited) => {
62
+ if (ref.cType?.endsWith("*") === true)
63
+ return POINTER_LAYOUT;
64
+ const namespaceName = ref.namespaceName ?? context.namespace.name;
65
+ const resolved = context.repository.resolveNamed(namespaceName, ref.typeName);
66
+ if (resolved === undefined)
67
+ return POINTER_LAYOUT;
68
+ return layoutOfResolved(context, resolved, visited);
69
+ };
70
+ const layoutOfResolved = (context, resolved, visited) => {
71
+ switch (resolved.kind) {
72
+ case "class":
73
+ case "interface":
74
+ return POINTER_LAYOUT;
75
+ case "boxed":
76
+ return layoutOfBoxedRecord(context, resolved, visited);
77
+ case "enum":
78
+ return layoutOfPrimitive("int32");
79
+ case "callback":
80
+ return POINTER_LAYOUT;
81
+ case "alias":
82
+ return resolveAliasLayout(context, resolved, visited);
83
+ }
84
+ };
85
+ const layoutOfBoxedRecord = (context, resolved, visited) => {
86
+ if (resolved.value.cType?.endsWith("*") === true)
87
+ return POINTER_LAYOUT;
88
+ const key = `${resolved.namespace.name}.${resolved.value.name}`;
89
+ if (visited.has(key))
90
+ return POINTER_LAYOUT;
91
+ const cached = recordLayoutCache.get(key);
92
+ if (cached !== undefined)
93
+ return cached;
94
+ const nextVisited = new Set(visited);
95
+ nextVisited.add(key);
96
+ const inputs = [];
97
+ for (const field of resolved.value.fields) {
98
+ if (field.callback !== undefined) {
99
+ inputs.push({ layout: POINTER_LAYOUT, bits: undefined });
100
+ continue;
101
+ }
102
+ if (field.type === undefined) {
103
+ inputs.push({ layout: POINTER_LAYOUT, bits: undefined });
104
+ continue;
105
+ }
106
+ inputs.push({ layout: layoutOfType(context, field.type, nextVisited), bits: field.bits });
107
+ }
108
+ if (inputs.length === 0)
109
+ return POINTER_LAYOUT;
110
+ const { size } = computeFieldSlots(inputs, resolved.value.isUnion);
111
+ const align = Math.max(1, ...inputs.map((input) => input.layout.align));
112
+ const layout = { size, align };
113
+ recordLayoutCache.set(key, layout);
114
+ return layout;
115
+ };
116
+ const recordLayoutCache = new Map();
117
+ const resolveAliasLayout = (context, resolved, visited) => {
118
+ const ref = resolved.targetRef;
119
+ if (ref === undefined)
120
+ return POINTER_LAYOUT;
121
+ if (ref.kind === "named") {
122
+ const primitive = primitiveCategory(ref.typeName);
123
+ if (primitive !== undefined)
124
+ return layoutOfPrimitive(primitive);
125
+ }
126
+ return layoutOfType(context, ref, visited);
127
+ };
128
+ //# sourceMappingURL=boxed-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boxed-layout.js","sourceRoot":"","sources":["../../src/writers/boxed-layout.ts"],"names":[],"mappings":"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"}