@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,163 @@
1
+ import { toCamelCase, toIdentifier } from "@gtkx/utils";
2
+ import { isCallerAllocatedOut, isOutParameter } from "../gir/parameter.js";
3
+ /**
4
+ * The input parameters a callable's TypeScript signature exposes.
5
+ *
6
+ * Drops `<varargs>` slots, out-only and caller-allocated-out parameters,
7
+ * array-length parameters computed from a sibling array, and the
8
+ * `user_data`/`GDestroyNotify` slots folded into a callback descriptor. Each
9
+ * surviving parameter keeps its original index so callers can recover argument
10
+ * names.
11
+ *
12
+ * @param fn - The callable
13
+ */
14
+ export const inputParameters = (fn) => {
15
+ const lengthIndices = arrayLengthIndices(fn);
16
+ const closureIndices = closureAndDestroyIndices(fn);
17
+ const result = [];
18
+ fn.parameters.forEach((parameter, index) => {
19
+ if (parameter.isVarargs)
20
+ return;
21
+ if (isOutParameter(parameter))
22
+ return;
23
+ if (isCallerAllocatedOut(parameter))
24
+ return;
25
+ if (lengthIndices.has(index))
26
+ return;
27
+ if (closureIndices.has(index))
28
+ return;
29
+ result.push({ parameter, index });
30
+ });
31
+ return result;
32
+ };
33
+ /**
34
+ * Indices of the `gpointer user_data` and `GDestroyNotify` parameters paired
35
+ * to a callback parameter. These slots are folded into the callback's
36
+ * trampoline descriptor and are not emitted as standalone FFI arguments.
37
+ *
38
+ * @param fn - The callable
39
+ */
40
+ export const closureAndDestroyIndices = (fn) => {
41
+ const indices = new Set();
42
+ for (const parameter of fn.parameters) {
43
+ if (parameter.closureIndex !== undefined)
44
+ indices.add(parameter.closureIndex);
45
+ if (parameter.destroyIndex !== undefined)
46
+ indices.add(parameter.destroyIndex);
47
+ }
48
+ return indices;
49
+ };
50
+ const arrayLengthIndices = (fn) => {
51
+ const map = arrayLengthSources(fn);
52
+ return new Set(map.keys());
53
+ };
54
+ /**
55
+ * Maps each array-length parameter's index to the array parameter whose
56
+ * `.length` supplies it.
57
+ *
58
+ * @param fn - The callable
59
+ */
60
+ export const arrayLengthSources = (fn) => {
61
+ const map = new Map();
62
+ fn.parameters.forEach((parameter, index) => {
63
+ if (parameter.type?.kind !== "array")
64
+ return;
65
+ const lengthIndex = parameter.type.lengthParameterIndex;
66
+ if (lengthIndex === undefined)
67
+ return;
68
+ map.set(lengthIndex, index);
69
+ });
70
+ return map;
71
+ };
72
+ /**
73
+ * Indices of parameters consumed as the length of the return array (and so
74
+ * dropped from the return tuple).
75
+ *
76
+ * @param fn - The callable
77
+ */
78
+ export const returnArrayLengthIndices = (fn) => {
79
+ if (fn.returnValue.type?.kind !== "array")
80
+ return new Set();
81
+ const lengthIndex = fn.returnValue.type.lengthParameterIndex;
82
+ if (lengthIndex === undefined)
83
+ return new Set();
84
+ return new Set([lengthIndex]);
85
+ };
86
+ /**
87
+ * Whether a parameter is passed to the FFI binding as a `t.ref(...)` cell.
88
+ *
89
+ * Pure out parameters marshal through a `{ value }` ref cell the native layer
90
+ * writes into. Inout parameters do too — except handle-passing ones
91
+ * (objects, interfaces, boxed), which are passed by their existing handle
92
+ * and mutated in place, not through a pointer-to-pointer cell.
93
+ * Caller-allocated outs pass a pre-built handle and are excluded.
94
+ *
95
+ * @param context - The module context
96
+ * @param parameter - The parameter to test
97
+ */
98
+ export const needsRefArg = (context, parameter) => {
99
+ if (parameter.direction !== "out" && parameter.direction !== "inout")
100
+ return false;
101
+ const passesHandleDirectly = (parameter.callerAllocates || parameter.direction === "inout") &&
102
+ parameter.type !== undefined &&
103
+ isHandlePassing(context, parameter.type);
104
+ return !passesHandleDirectly;
105
+ };
106
+ /**
107
+ * Whether a caller-allocated-out parameter is one the body can materialize and
108
+ * collect into the return — a boxed record or class the runtime can allocate
109
+ * via its wrapper constructor. Array and other caller-out buffers cannot be
110
+ * allocated here, so they are excluded from both the body and the return type.
111
+ *
112
+ * @param context - The module context
113
+ * @param parameter - The parameter to test
114
+ */
115
+ export const isCollectibleCallerOut = (context, parameter) => {
116
+ if (parameter.type === undefined || parameter.type.kind !== "named")
117
+ return false;
118
+ const resolved = context.repository.resolveNamed(parameter.type.namespaceName ?? context.namespace.name, parameter.type.typeName);
119
+ return resolved?.kind === "boxed" || resolved?.kind === "class";
120
+ };
121
+ /**
122
+ * Whether a value of `ref` is passed across the FFI boundary as a native
123
+ * handle (object, interface, boxed, or an alias to one) instead of by value.
124
+ *
125
+ * @param context - The module context
126
+ * @param ref - The type reference to test
127
+ */
128
+ export const isHandlePassing = (context, ref) => {
129
+ if (ref.kind !== "named")
130
+ return false;
131
+ const owner = ref.namespaceName ?? context.namespace.name;
132
+ const resolved = context.repository.resolveNamed(owner, ref.typeName);
133
+ if (resolved === undefined)
134
+ return true;
135
+ switch (resolved.kind) {
136
+ case "class":
137
+ case "interface":
138
+ case "boxed":
139
+ return true;
140
+ case "alias": {
141
+ const target = resolved.targetRef;
142
+ if (target === undefined || target.kind !== "named")
143
+ return false;
144
+ return isHandlePassing(context, target);
145
+ }
146
+ case "enum":
147
+ case "callback":
148
+ return false;
149
+ }
150
+ };
151
+ /**
152
+ * The JavaScript identifier for a parameter: the camelCased GIR name, or
153
+ * `arg<index>` for an unnamed position.
154
+ *
155
+ * @param parameter - The GIR parameter
156
+ * @param index - The parameter's position in the callable
157
+ */
158
+ export const parameterIdentifier = (parameter, index) => {
159
+ if (parameter.name.length === 0)
160
+ return `arg${index}`;
161
+ return toIdentifier(toCamelCase(parameter.name));
162
+ };
163
+ //# sourceMappingURL=param-classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param-classify.js","sourceRoot":"","sources":["../../src/writers/param-classify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ModuleContext } from "../dsl/context.js";
2
+ import type { GirFunction } from "../gir/function.js";
3
+ import type { GirProperty } from "../gir/property.js";
4
+ /**
5
+ * Renders the `get` / `set` accessor pair for a single GObject property
6
+ * on a class declaration.
7
+ *
8
+ * Read-only properties get only a getter; readonly + non-writable
9
+ * properties are skipped entirely. Properties whose name has already
10
+ * been claimed by an emitted method (its camelCase form clashes) are
11
+ * skipped, since the method takes precedence — the runtime accessor is
12
+ * always reachable via `this.getProperty(girName)` in that case.
13
+ *
14
+ * @param context - The module context
15
+ * @param property - The property to surface
16
+ * @param claimedNames - Names already used by emitted methods
17
+ */
18
+ export declare const renderPropertyAccessor: (context: ModuleContext, property: GirProperty, claimedNames: ReadonlySet<string>, methodByName: ReadonlyMap<string, GirFunction>) => string | undefined;
19
+ //# sourceMappingURL=property-accessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-accessor.d.ts","sourceRoot":"","sources":["../../src/writers/property-accessor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA2BtD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,GAC/B,SAAS,aAAa,EACtB,UAAU,WAAW,EACrB,cAAc,WAAW,CAAC,MAAM,CAAC,EACjC,cAAc,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,KAC/C,MAAM,GAAG,SAiCX,CAAC"}
@@ -0,0 +1,117 @@
1
+ import { quote, toCamelCase, toIdentifier } from "@gtkx/utils";
2
+ import { indent } from "../dsl/emit.js";
3
+ import { renderMethodReturnType } from "./method.js";
4
+ import { renderTsType } from "./ts-type.js";
5
+ /**
6
+ * Whether a GObject property of `type` can hold `null`.
7
+ *
8
+ * Reference values — objects, boxed records, interfaces, and containers —
9
+ * marshal to `null` when unset; scalar value types (numbers, booleans,
10
+ * strings, `unichar`, enums) are surfaced non-null to match their typed
11
+ * setters. Aliases resolve to their target.
12
+ *
13
+ * @param context - The module context
14
+ * @param type - The property's value type
15
+ */
16
+ const isNullablePropertyType = (context, type) => {
17
+ if (type === undefined)
18
+ return false;
19
+ if (type.kind === "primitive")
20
+ return false;
21
+ if (type.kind !== "named")
22
+ return true;
23
+ const resolved = context.repository.resolveNamed(type.namespaceName ?? context.namespace.name, type.typeName);
24
+ if (resolved === undefined)
25
+ return true;
26
+ if (resolved.kind === "enum")
27
+ return false;
28
+ if (resolved.kind === "alias")
29
+ return isNullablePropertyType(context, resolved.targetRef);
30
+ return true;
31
+ };
32
+ /**
33
+ * Renders the `get` / `set` accessor pair for a single GObject property
34
+ * on a class declaration.
35
+ *
36
+ * Read-only properties get only a getter; readonly + non-writable
37
+ * properties are skipped entirely. Properties whose name has already
38
+ * been claimed by an emitted method (its camelCase form clashes) are
39
+ * skipped, since the method takes precedence — the runtime accessor is
40
+ * always reachable via `this.getProperty(girName)` in that case.
41
+ *
42
+ * @param context - The module context
43
+ * @param property - The property to surface
44
+ * @param claimedNames - Names already used by emitted methods
45
+ */
46
+ export const renderPropertyAccessor = (context, property, claimedNames, methodByName) => {
47
+ const jsName = toIdentifier(toCamelCase(property.name));
48
+ if (claimedNames.has(jsName))
49
+ return undefined;
50
+ if (jsName === "constructor")
51
+ return undefined;
52
+ const writable = property.writable || property.construct || property.constructOnly;
53
+ const getterMember = delegateMember(property.getter, jsName, claimedNames);
54
+ const getMethod = getterMember !== undefined && property.getter !== undefined ? methodByName.get(property.getter) : undefined;
55
+ const setterMember = writable ? delegateMember(property.setter, jsName, claimedNames) : undefined;
56
+ const setMethod = setterMember !== undefined && property.setter !== undefined ? methodByName.get(property.setter) : undefined;
57
+ const setParam = setMethod?.parameters[0];
58
+ const tsType = setParam !== undefined
59
+ ? renderTsType(context, setParam.type, setParam.nullable || setParam.optional)
60
+ : getMethod !== undefined
61
+ ? renderMethodReturnType(context, getMethod)
62
+ : renderTsType(context, property.type, isNullablePropertyType(context, property.type));
63
+ const blocks = [];
64
+ const getBody = renderGetterBody({ context, property, getterMember, getMethod, tsType });
65
+ blocks.push(`get ${jsName}(): ${tsType} {\n${indent(getBody, 1)}\n}`);
66
+ if (writable) {
67
+ const setBody = setterMember !== undefined
68
+ ? `this.${setterMember}(value);`
69
+ : `this.setProperty(${quote(property.name)}, value);`;
70
+ blocks.push(`set ${jsName}(value: ${tsType}) {\n${indent(setBody, 1)}\n}`);
71
+ }
72
+ return blocks.join("\n\n");
73
+ };
74
+ /**
75
+ * Renders a property getter body.
76
+ *
77
+ * The property type follows the setter's parameter (what callers may assign),
78
+ * so a getter whose own GIR nullability differs is narrowed to it with a single
79
+ * assertion; matching nullability needs no cast. Properties with no typed
80
+ * getter read through the generic `getProperty` GValue path.
81
+ *
82
+ * @param options - {@link GetterBodyOptions}
83
+ */
84
+ const renderGetterBody = (options) => {
85
+ const { context, property, getterMember, getMethod, tsType } = options;
86
+ if (getterMember === undefined)
87
+ return `return this.getProperty(${quote(property.name)}) as ${tsType};`;
88
+ if (getMethod === undefined)
89
+ return `return this.${getterMember}() as ${tsType};`;
90
+ const getType = renderMethodReturnType(context, getMethod);
91
+ return getType === tsType ? `return this.${getterMember}();` : `return this.${getterMember}() as ${tsType};`;
92
+ };
93
+ /**
94
+ * Resolves a property's GIR `getter`/`setter` method name to the camelCase
95
+ * member to delegate the accessor to, or `undefined` to fall back to the
96
+ * generic `getProperty`/`setProperty` GValue path.
97
+ *
98
+ * Delegation is used only when the named method was actually emitted on the
99
+ * class (so object, interface, and boxed values marshal through their typed
100
+ * setter rather than the GValue `valueFromJS` path) and the member name does
101
+ * not collide with the accessor itself, which would recurse.
102
+ *
103
+ * @param accessorName - The accessor's own camelCase member name
104
+ * @param attribute - The GIR `getter`/`setter` attribute, if present
105
+ * @param claimedNames - Names already emitted as methods on the class
106
+ */
107
+ const delegateMember = (attribute, accessorName, claimedNames) => {
108
+ if (attribute === undefined)
109
+ return undefined;
110
+ const member = toCamelCase(attribute);
111
+ if (member === accessorName)
112
+ return undefined;
113
+ if (!claimedNames.has(member))
114
+ return undefined;
115
+ return member;
116
+ };
117
+ //# sourceMappingURL=property-accessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-accessor.js","sourceRoot":"","sources":["../../src/writers/property-accessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAIxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;;;;;;;GAUG;AACH,MAAM,sBAAsB,GAAG,CAAC,OAAsB,EAAE,IAA4B,EAAW,EAAE;IAC7F,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9G,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1F,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAClC,OAAsB,EACtB,QAAqB,EACrB,YAAiC,EACjC,YAA8C,EAC5B,EAAE;IACpB,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,MAAM,KAAK,aAAa;QAAE,OAAO,SAAS,CAAC;IAE/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,aAAa,CAAC;IACnF,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3E,MAAM,SAAS,GACX,YAAY,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChH,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClG,MAAM,SAAS,GACX,YAAY,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChH,MAAM,QAAQ,GAAG,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAE1C,MAAM,MAAM,GACR,QAAQ,KAAK,SAAS;QAClB,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;QAC9E,CAAC,CAAC,SAAS,KAAK,SAAS;YACvB,CAAC,CAAC,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC;YAC5C,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjG,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IACzF,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAEtE,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,OAAO,GACT,YAAY,KAAK,SAAS;YACtB,CAAC,CAAC,QAAQ,YAAY,UAAU;YAChC,CAAC,CAAC,oBAAoB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,WAAW,MAAM,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC,CAAC;AAaF;;;;;;;;;GASG;AACH,MAAM,gBAAgB,GAAG,CAAC,OAA0B,EAAU,EAAE;IAC5D,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACvE,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,2BAA2B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,MAAM,GAAG,CAAC;IACxG,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,eAAe,YAAY,SAAS,MAAM,GAAG,CAAC;IAClF,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3D,OAAO,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,YAAY,KAAK,CAAC,CAAC,CAAC,eAAe,YAAY,SAAS,MAAM,GAAG,CAAC;AACjH,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,cAAc,GAAG,CACnB,SAA6B,EAC7B,YAAoB,EACpB,YAAiC,EACf,EAAE;IACpB,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,MAAM,KAAK,YAAY;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { ModuleContext } from "../dsl/context.js";
2
+ /**
3
+ * The pre-rendered pieces of a single `registerNativeClass(...)` descriptor.
4
+ *
5
+ * Each metadata field is the already-rendered object-literal fragment for that
6
+ * descriptor key, or `undefined` when the type contributes nothing for it.
7
+ */
8
+ export type NativeClassRegistration = {
9
+ readonly className: string;
10
+ readonly role: "class" | "interface" | "boxed";
11
+ readonly getTypeRef?: string | undefined;
12
+ readonly construction?: string | undefined;
13
+ readonly vfuncs?: string | undefined;
14
+ };
15
+ /**
16
+ * Appends the single `registerNativeClass(Class, { … })` registration that
17
+ * collapses a type's GType, construction, and vfunc metadata into one
18
+ * module-load call.
19
+ *
20
+ * Emits nothing when the registration carries no metadata at all, so callers
21
+ * can pass the result of optional sub-renderers without pre-checking.
22
+ *
23
+ * @param context - The module context
24
+ * @param registration - The pre-rendered descriptor pieces
25
+ */
26
+ export declare const appendNativeClassRegistration: (context: ModuleContext, registration: NativeClassRegistration) => void;
27
+ //# sourceMappingURL=registration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../../src/writers/registration.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,OAAO,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,6BAA6B,GAAI,SAAS,aAAa,EAAE,cAAc,uBAAuB,KAAG,IAY7G,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { quote } from "@gtkx/utils";
2
+ import { indent } from "../dsl/emit.js";
3
+ /**
4
+ * Appends the single `registerNativeClass(Class, { … })` registration that
5
+ * collapses a type's GType, construction, and vfunc metadata into one
6
+ * module-load call.
7
+ *
8
+ * Emits nothing when the registration carries no metadata at all, so callers
9
+ * can pass the result of optional sub-renderers without pre-checking.
10
+ *
11
+ * @param context - The module context
12
+ * @param registration - The pre-rendered descriptor pieces
13
+ */
14
+ export const appendNativeClassRegistration = (context, registration) => {
15
+ const { className, role, getTypeRef, construction, vfuncs } = registration;
16
+ if (getTypeRef === undefined && construction === undefined && vfuncs === undefined) {
17
+ return;
18
+ }
19
+ context.addRuntimeImport("registerNativeClass");
20
+ const lines = [`role: ${quote(role)},`];
21
+ if (getTypeRef !== undefined)
22
+ lines.push(`gtype: ${getTypeRef},`);
23
+ if (construction !== undefined)
24
+ lines.push(`construction: ${construction},`);
25
+ if (vfuncs !== undefined)
26
+ lines.push(`vfuncs: ${vfuncs},`);
27
+ const body = lines.map((line) => indent(line, 1)).join("\n");
28
+ context.module.appendRegistration(`registerNativeClass(${className}, {\n${body}\n});`);
29
+ };
30
+ //# sourceMappingURL=registration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration.js","sourceRoot":"","sources":["../../src/writers/registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAgBxC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,OAAsB,EAAE,YAAqC,EAAQ,EAAE;IACjH,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;IAC3E,IAAI,UAAU,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACjF,OAAO;IACX,CAAC;IACD,OAAO,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IAChD,MAAM,KAAK,GAAa,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,UAAU,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,UAAU,GAAG,CAAC,CAAC;IAClE,IAAI,YAAY,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,YAAY,GAAG,CAAC,CAAC;IAC7E,IAAI,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,GAAG,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,uBAAuB,SAAS,QAAQ,IAAI,OAAO,CAAC,CAAC;AAC3F,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { ModuleContext } from "../dsl/context.js";
2
+ import type { ParameterTransfer } from "../gir/parameter.js";
3
+ import type { GirTypeRef } from "../gir/type-ref.js";
4
+ /**
5
+ * Lifting raw FFI call results into their typed JavaScript form: objects to
6
+ * their runtime-registered wrappers, boxed values to typed wrappers,
7
+ * collections per element, and primitives with the appropriate coercion.
8
+ * Shared by method-body return handling, signal/callback argument marshalling,
9
+ * and boxed field accessors.
10
+ */
11
+ /**
12
+ * Casts a raw FFI call result to a native handle so the registry wrappers
13
+ * (`getNativeObject` / `getNativeObjectAsInterface`) accept it. The cast widens
14
+ * to `NativeHandle | null` for a GIR-nullable value so the wrapper result type
15
+ * stays nullable, matching the declared return.
16
+ */
17
+ export declare const handleCast: (context: ModuleContext, valueExpression: string, nullable: boolean) => string;
18
+ /**
19
+ * Inputs for {@link wrapReturnValue}.
20
+ */
21
+ export type WrapReturnOptions = {
22
+ readonly ref: GirTypeRef | undefined;
23
+ readonly transfer: ParameterTransfer;
24
+ readonly nullable: boolean;
25
+ readonly valueExpression: string;
26
+ };
27
+ /**
28
+ * Wraps a raw FFI value into its typed JavaScript form.
29
+ *
30
+ * Objects resolve to their runtime-registered wrapper, interfaces to the
31
+ * interface wrapper, boxed values to a typed wrapper, collections recurse per
32
+ * element, and primitives pass through with the appropriate coercion. Shared
33
+ * by return-value handling and signal-handler argument marshalling.
34
+ *
35
+ * @param context - The module context
36
+ * @param options - {@link WrapReturnOptions}
37
+ */
38
+ export declare const wrapReturnValue: (context: ModuleContext, options: WrapReturnOptions) => string;
39
+ //# sourceMappingURL=return-wrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"return-wrap.d.ts","sourceRoot":"","sources":["../../src/writers/return-wrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAkC,MAAM,oBAAoB,CAAC;AAGrF;;;;;;GAMG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,SAAS,aAAa,EAAE,iBAAiB,MAAM,EAAE,UAAU,OAAO,KAAG,MAG/F,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC5B,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACpC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,aAAa,EAAE,SAAS,iBAAiB,KAAG,MAsBpF,CAAC"}
@@ -0,0 +1,152 @@
1
+ import { renderTsType } from "./ts-type.js";
2
+ /**
3
+ * Lifting raw FFI call results into their typed JavaScript form: objects to
4
+ * their runtime-registered wrappers, boxed values to typed wrappers,
5
+ * collections per element, and primitives with the appropriate coercion.
6
+ * Shared by method-body return handling, signal/callback argument marshalling,
7
+ * and boxed field accessors.
8
+ */
9
+ /**
10
+ * Casts a raw FFI call result to a native handle so the registry wrappers
11
+ * (`getNativeObject` / `getNativeObjectAsInterface`) accept it. The cast widens
12
+ * to `NativeHandle | null` for a GIR-nullable value so the wrapper result type
13
+ * stays nullable, matching the declared return.
14
+ */
15
+ export const handleCast = (context, valueExpression, nullable) => {
16
+ context.addNativeTypeImport("NativeHandle");
17
+ return `${valueExpression} as NativeHandle${nullable ? " | null" : ""}`;
18
+ };
19
+ /**
20
+ * Wraps a raw FFI value into its typed JavaScript form.
21
+ *
22
+ * Objects resolve to their runtime-registered wrapper, interfaces to the
23
+ * interface wrapper, boxed values to a typed wrapper, collections recurse per
24
+ * element, and primitives pass through with the appropriate coercion. Shared
25
+ * by return-value handling and signal-handler argument marshalling.
26
+ *
27
+ * @param context - The module context
28
+ * @param options - {@link WrapReturnOptions}
29
+ */
30
+ export const wrapReturnValue = (context, options) => {
31
+ const { ref, nullable, valueExpression } = options;
32
+ if (ref === undefined)
33
+ return valueExpression;
34
+ switch (ref.kind) {
35
+ case "primitive":
36
+ return wrapPrimitive(ref, nullable, valueExpression);
37
+ case "named":
38
+ return wrapNamed(context, ref, valueExpression, nullable);
39
+ case "array":
40
+ return wrapCollection(context, ref.element, valueExpression, nullable);
41
+ case "list":
42
+ return ref.flavor === "gbytearray"
43
+ ? `(${valueExpression} as number[]${nullable ? " | null" : ""})`
44
+ : wrapCollection(context, ref.element, valueExpression, nullable);
45
+ case "hashtable":
46
+ return nullable
47
+ ? `(${valueExpression} === null ? null : new globalThis.Map(${valueExpression} as Iterable<readonly [unknown, unknown]>))`
48
+ : `new globalThis.Map(${valueExpression} as Iterable<readonly [unknown, unknown]>)`;
49
+ case "callback":
50
+ case "varargs":
51
+ return `(${valueExpression} as unknown[])`;
52
+ }
53
+ };
54
+ /**
55
+ * Wraps a collection return value, mapping each element through the runtime
56
+ * wrapper its type requires.
57
+ *
58
+ * The native layer hands collection returns back as arrays of raw element
59
+ * values; object, interface, and boxed elements must be lifted into their
60
+ * typed JavaScript wrappers (matching the per-element wrapping a scalar
61
+ * return of the same type receives) while primitive and enum elements pass
62
+ * through untouched.
63
+ */
64
+ const wrapCollection = (context, element, valueExpression, nullable) => {
65
+ const itemExpression = collectionItemWrap(context, element);
66
+ if (itemExpression === undefined) {
67
+ const elementTs = element === undefined ? "unknown" : renderTsType(context, element, false);
68
+ return `(${valueExpression} as ${elementTs}[]${nullable ? " | null" : ""})`;
69
+ }
70
+ return nullable
71
+ ? `((${valueExpression} as unknown[] | null)?.map((item) => ${itemExpression}) ?? null)`
72
+ : `(${valueExpression} as unknown[]).map((item) => ${itemExpression})`;
73
+ };
74
+ const collectionItemWrap = (context, element) => {
75
+ if (element === undefined || element.kind !== "named")
76
+ return undefined;
77
+ const owner = element.namespaceName ?? context.namespace.name;
78
+ const resolved = context.repository.resolveNamed(owner, element.typeName);
79
+ if (resolved === undefined) {
80
+ context.addRuntimeImport("getNativeObject");
81
+ return `getNativeObject(${handleCast(context, "item", false)})`;
82
+ }
83
+ switch (resolved.kind) {
84
+ case "class":
85
+ case "boxed":
86
+ context.addRuntimeImport("getNativeObject");
87
+ return `getNativeObject(${handleCast(context, "item", false)})`;
88
+ case "interface": {
89
+ context.addRuntimeImport("getNativeObjectAsInterface");
90
+ return `getNativeObjectAsInterface(${handleCast(context, "item", false)}, ${context.qualify(owner, element.typeName)})`;
91
+ }
92
+ case "alias":
93
+ return resolved.target === undefined
94
+ ? undefined
95
+ : collectionItemWrap(context, {
96
+ kind: "named",
97
+ namespaceName: resolved.namespace.name,
98
+ typeName: resolved.target,
99
+ cType: undefined,
100
+ });
101
+ case "enum":
102
+ case "callback":
103
+ return undefined;
104
+ }
105
+ };
106
+ const wrapPrimitive = (ref, nullable, valueExpression) => {
107
+ const category = ref.category;
108
+ if (category === "void")
109
+ return valueExpression;
110
+ if (category === "string")
111
+ return `(${valueExpression} as ${nullable ? "string | null" : "string"})`;
112
+ if (category === "boolean")
113
+ return `Boolean(${valueExpression})`;
114
+ return `(${valueExpression} as number)`;
115
+ };
116
+ const wrapNamed = (context, ref, valueExpression, nullable) => {
117
+ const owner = ref.namespaceName ?? context.namespace.name;
118
+ const resolved = context.repository.resolveNamed(owner, ref.typeName);
119
+ if (resolved === undefined) {
120
+ context.addRuntimeImport("getNativeObject");
121
+ return `getNativeObject(${handleCast(context, valueExpression, nullable)})`;
122
+ }
123
+ return wrapResolved(context, resolved, { namespaceName: owner, typeName: ref.typeName, valueExpression, nullable });
124
+ };
125
+ const wrapResolved = (context, resolved, options) => {
126
+ const { namespaceName, typeName, valueExpression, nullable } = options;
127
+ switch (resolved.kind) {
128
+ case "class": {
129
+ context.addRuntimeImport("getNativeObject");
130
+ return `getNativeObject(${handleCast(context, valueExpression, nullable)})`;
131
+ }
132
+ case "interface": {
133
+ const classExpression = context.qualify(namespaceName, typeName);
134
+ context.addRuntimeImport("getNativeObjectAsInterface");
135
+ return `getNativeObjectAsInterface(${handleCast(context, valueExpression, nullable)}, ${classExpression})`;
136
+ }
137
+ case "boxed": {
138
+ const classExpression = context.qualify(namespaceName, typeName);
139
+ context.addRuntimeImport("getNativeObject");
140
+ return `getNativeObject(${handleCast(context, valueExpression, nullable)}, ${classExpression})`;
141
+ }
142
+ case "enum":
143
+ return `(${valueExpression} as number)`;
144
+ case "callback":
145
+ return valueExpression;
146
+ case "alias":
147
+ return resolved.targetRef === undefined
148
+ ? valueExpression
149
+ : wrapReturnValue(context, { ref: resolved.targetRef, transfer: "full", nullable, valueExpression });
150
+ }
151
+ };
152
+ //# sourceMappingURL=return-wrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"return-wrap.js","sourceRoot":"","sources":["../../src/writers/return-wrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { GirFunction } from "../gir/function.js";
2
+ /**
3
+ * Renders the method body for a callable whose marshaling is provided by a
4
+ * hand-written runtime override.
5
+ *
6
+ * `gpointer` exchanges (`GValue` boxed accessors and similar) cannot be
7
+ * marshaled from GIR alone; the FFI runtime replaces them on the prototype
8
+ * at module load. The codegen emits a stub with the override's signature
9
+ * so the consumer types resolve to the runtime shape and the runtime's
10
+ * `prototype` assignment type-checks.
11
+ *
12
+ * Returns `undefined` for callables without a registered override.
13
+ *
14
+ * @param callable - The callable to consider
15
+ * @param memberName - The camelCase JS method name
16
+ */
17
+ export declare const renderRuntimeOverride: (callable: GirFunction, memberName: string) => string | undefined;
18
+ //# sourceMappingURL=runtime-override.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-override.d.ts","sourceRoot":"","sources":["../../src/writers/runtime-override.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAqCtD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,WAAW,EAAE,YAAY,MAAM,KAAG,MAAM,GAAG,SAM1F,CAAC"}