@gtkx/codegen 1.0.0 → 1.2.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 (347) hide show
  1. package/README.md +1 -1
  2. package/dist/analysis/descriptor-render.d.ts +12 -15
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +59 -38
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +25 -10
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +37 -9
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +4 -2
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +80 -38
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/interface-conflicts.d.ts +25 -0
  15. package/dist/analysis/interface-conflicts.d.ts.map +1 -0
  16. package/dist/analysis/interface-conflicts.js +139 -0
  17. package/dist/analysis/interface-conflicts.js.map +1 -0
  18. package/dist/analysis/param-capability.d.ts.map +1 -1
  19. package/dist/analysis/param-capability.js +3 -4
  20. package/dist/analysis/param-capability.js.map +1 -1
  21. package/dist/analysis/param-structure.js +2 -2
  22. package/dist/analysis/param-structure.js.map +1 -1
  23. package/dist/analysis/ts-type.d.ts +3 -2
  24. package/dist/analysis/ts-type.d.ts.map +1 -1
  25. package/dist/analysis/ts-type.js +26 -26
  26. package/dist/analysis/ts-type.js.map +1 -1
  27. package/dist/analysis/type-key.d.ts +5 -0
  28. package/dist/analysis/type-key.d.ts.map +1 -0
  29. package/dist/analysis/type-key.js +9 -0
  30. package/dist/analysis/type-key.js.map +1 -0
  31. package/dist/analysis/type-shape.d.ts +3 -2
  32. package/dist/analysis/type-shape.d.ts.map +1 -1
  33. package/dist/analysis/type-shape.js +2 -1
  34. package/dist/analysis/type-shape.js.map +1 -1
  35. package/dist/compile.d.ts +14 -6
  36. package/dist/compile.d.ts.map +1 -1
  37. package/dist/compile.js +125 -24
  38. package/dist/compile.js.map +1 -1
  39. package/dist/docs/api-reference.d.ts +2 -0
  40. package/dist/docs/api-reference.d.ts.map +1 -1
  41. package/dist/docs/api-reference.js +11 -10
  42. package/dist/docs/api-reference.js.map +1 -1
  43. package/dist/docs/element-page.d.ts.map +1 -1
  44. package/dist/docs/element-page.js +5 -3
  45. package/dist/docs/element-page.js.map +1 -1
  46. package/dist/docs/pipeline.d.ts +1 -0
  47. package/dist/docs/pipeline.d.ts.map +1 -1
  48. package/dist/docs/pipeline.js +93 -19
  49. package/dist/docs/pipeline.js.map +1 -1
  50. package/dist/docs/render.d.ts +2 -1
  51. package/dist/docs/render.d.ts.map +1 -1
  52. package/dist/docs/render.js +5 -4
  53. package/dist/docs/render.js.map +1 -1
  54. package/dist/docs/symbol-page.d.ts.map +1 -1
  55. package/dist/docs/symbol-page.js +10 -9
  56. package/dist/docs/symbol-page.js.map +1 -1
  57. package/dist/fingerprint.d.ts +20 -3
  58. package/dist/fingerprint.d.ts.map +1 -1
  59. package/dist/fingerprint.js +56 -37
  60. package/dist/fingerprint.js.map +1 -1
  61. package/dist/gi.d.ts +1 -0
  62. package/dist/gi.d.ts.map +1 -1
  63. package/dist/gi.js +8 -2
  64. package/dist/gi.js.map +1 -1
  65. package/dist/gir/ancestry.d.ts +7 -1
  66. package/dist/gir/ancestry.d.ts.map +1 -1
  67. package/dist/gir/ancestry.js +9 -1
  68. package/dist/gir/ancestry.js.map +1 -1
  69. package/dist/gir/annotations.d.ts +1 -2
  70. package/dist/gir/annotations.d.ts.map +1 -1
  71. package/dist/gir/annotations.js +1 -1
  72. package/dist/gir/annotations.js.map +1 -1
  73. package/dist/gir/cursor-overrides.d.ts +8 -0
  74. package/dist/gir/cursor-overrides.d.ts.map +1 -0
  75. package/dist/gir/cursor-overrides.js +6 -0
  76. package/dist/gir/cursor-overrides.js.map +1 -0
  77. package/dist/gir/emittable.d.ts +7 -0
  78. package/dist/gir/emittable.d.ts.map +1 -0
  79. package/dist/gir/emittable.js +3 -0
  80. package/dist/gir/emittable.js.map +1 -0
  81. package/dist/gir/function.d.ts.map +1 -1
  82. package/dist/gir/function.js +28 -2
  83. package/dist/gir/function.js.map +1 -1
  84. package/dist/gir/gir-path.d.ts +1 -1
  85. package/dist/gir/gir-path.js +1 -1
  86. package/dist/gir/gir-path.js.map +1 -1
  87. package/dist/gir/library.d.ts +5 -1
  88. package/dist/gir/library.d.ts.map +1 -1
  89. package/dist/gir/library.js +9 -2
  90. package/dist/gir/library.js.map +1 -1
  91. package/dist/gir/namespace.d.ts +5 -1
  92. package/dist/gir/namespace.d.ts.map +1 -1
  93. package/dist/gir/namespace.js +4 -2
  94. package/dist/gir/namespace.js.map +1 -1
  95. package/dist/gir/parameter.d.ts +13 -1
  96. package/dist/gir/parameter.d.ts.map +1 -1
  97. package/dist/gir/parameter.js +1 -0
  98. package/dist/gir/parameter.js.map +1 -1
  99. package/dist/gir/parse.d.ts.map +1 -1
  100. package/dist/gir/parse.js +6 -6
  101. package/dist/gir/parse.js.map +1 -1
  102. package/dist/gir/primitives.js +1 -1
  103. package/dist/gir/primitives.js.map +1 -1
  104. package/dist/guards.d.ts +16 -0
  105. package/dist/guards.d.ts.map +1 -0
  106. package/dist/guards.js +11 -0
  107. package/dist/guards.js.map +1 -0
  108. package/dist/internal.d.ts +2 -0
  109. package/dist/internal.d.ts.map +1 -1
  110. package/dist/internal.js +2 -0
  111. package/dist/internal.js.map +1 -1
  112. package/dist/json.d.ts +3 -0
  113. package/dist/json.d.ts.map +1 -0
  114. package/dist/json.js +11 -0
  115. package/dist/json.js.map +1 -0
  116. package/dist/khronos/args.d.ts.map +1 -1
  117. package/dist/khronos/args.js +8 -6
  118. package/dist/khronos/args.js.map +1 -1
  119. package/dist/khronos/modules.d.ts.map +1 -1
  120. package/dist/khronos/modules.js +22 -7
  121. package/dist/khronos/modules.js.map +1 -1
  122. package/dist/khronos/parse.d.ts.map +1 -1
  123. package/dist/khronos/parse.js +3 -4
  124. package/dist/khronos/parse.js.map +1 -1
  125. package/dist/khronos/pipeline.d.ts +1 -1
  126. package/dist/khronos/pipeline.d.ts.map +1 -1
  127. package/dist/khronos/pipeline.js.map +1 -1
  128. package/dist/khronos/plan.d.ts +1 -7
  129. package/dist/khronos/plan.d.ts.map +1 -1
  130. package/dist/khronos/plan.js +1 -1
  131. package/dist/khronos/plan.js.map +1 -1
  132. package/dist/khronos/render.d.ts.map +1 -1
  133. package/dist/khronos/render.js +8 -4
  134. package/dist/khronos/render.js.map +1 -1
  135. package/dist/runner.d.ts +7 -1
  136. package/dist/runner.d.ts.map +1 -1
  137. package/dist/runner.js +21 -3
  138. package/dist/runner.js.map +1 -1
  139. package/dist/staging.d.ts +5 -0
  140. package/dist/staging.d.ts.map +1 -0
  141. package/dist/staging.js +57 -0
  142. package/dist/staging.js.map +1 -0
  143. package/dist/store/compile-store.d.ts +0 -1
  144. package/dist/store/compile-store.d.ts.map +1 -1
  145. package/dist/store/compile-store.js +7 -32
  146. package/dist/store/compile-store.js.map +1 -1
  147. package/dist/store/gi/callables.d.ts +6 -3
  148. package/dist/store/gi/callables.d.ts.map +1 -1
  149. package/dist/store/gi/callables.js +40 -30
  150. package/dist/store/gi/callables.js.map +1 -1
  151. package/dist/store/gi/callback.d.ts.map +1 -1
  152. package/dist/store/gi/callback.js +9 -5
  153. package/dist/store/gi/callback.js.map +1 -1
  154. package/dist/store/gi/class.d.ts.map +1 -1
  155. package/dist/store/gi/class.js +104 -44
  156. package/dist/store/gi/class.js.map +1 -1
  157. package/dist/store/gi/companion.d.ts.map +1 -1
  158. package/dist/store/gi/companion.js +6 -6
  159. package/dist/store/gi/companion.js.map +1 -1
  160. package/dist/store/gi/constant.d.ts.map +1 -1
  161. package/dist/store/gi/constant.js +11 -3
  162. package/dist/store/gi/constant.js.map +1 -1
  163. package/dist/store/gi/constructor-props.js +1 -1
  164. package/dist/store/gi/constructor-props.js.map +1 -1
  165. package/dist/store/gi/enum.d.ts.map +1 -1
  166. package/dist/store/gi/enum.js +29 -12
  167. package/dist/store/gi/enum.js.map +1 -1
  168. package/dist/store/gi/function.d.ts +1 -3
  169. package/dist/store/gi/function.d.ts.map +1 -1
  170. package/dist/store/gi/function.js +24 -18
  171. package/dist/store/gi/function.js.map +1 -1
  172. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  173. package/dist/store/gi/gtype-binding.js +4 -1
  174. package/dist/store/gi/gtype-binding.js.map +1 -1
  175. package/dist/store/gi/interface.d.ts.map +1 -1
  176. package/dist/store/gi/interface.js +34 -19
  177. package/dist/store/gi/interface.js.map +1 -1
  178. package/dist/store/gi/method.d.ts +7 -6
  179. package/dist/store/gi/method.d.ts.map +1 -1
  180. package/dist/store/gi/method.js +13 -24
  181. package/dist/store/gi/method.js.map +1 -1
  182. package/dist/store/gi/param-marshal.d.ts +3 -2
  183. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  184. package/dist/store/gi/param-marshal.js +50 -5
  185. package/dist/store/gi/param-marshal.js.map +1 -1
  186. package/dist/store/gi/pipeline.d.ts.map +1 -1
  187. package/dist/store/gi/pipeline.js +21 -10
  188. package/dist/store/gi/pipeline.js.map +1 -1
  189. package/dist/store/gi/properties.d.ts +2 -1
  190. package/dist/store/gi/properties.d.ts.map +1 -1
  191. package/dist/store/gi/properties.js +6 -3
  192. package/dist/store/gi/properties.js.map +1 -1
  193. package/dist/store/gi/property-accessor.d.ts +10 -8
  194. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  195. package/dist/store/gi/property-accessor.js +49 -91
  196. package/dist/store/gi/property-accessor.js.map +1 -1
  197. package/dist/store/gi/record-constructor.d.ts +8 -1
  198. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  199. package/dist/store/gi/record-constructor.js +34 -13
  200. package/dist/store/gi/record-constructor.js.map +1 -1
  201. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  202. package/dist/store/gi/record-field-accessor.js +20 -4
  203. package/dist/store/gi/record-field-accessor.js.map +1 -1
  204. package/dist/store/gi/record-layout.d.ts +6 -1
  205. package/dist/store/gi/record-layout.d.ts.map +1 -1
  206. package/dist/store/gi/record-layout.js +8 -1
  207. package/dist/store/gi/record-layout.js.map +1 -1
  208. package/dist/store/gi/record.d.ts.map +1 -1
  209. package/dist/store/gi/record.js +19 -8
  210. package/dist/store/gi/record.js.map +1 -1
  211. package/dist/store/gi/registration.js +2 -2
  212. package/dist/store/gi/registration.js.map +1 -1
  213. package/dist/store/gi/return-wrap.js +1 -1
  214. package/dist/store/gi/return-wrap.js.map +1 -1
  215. package/dist/store/gi/signal.d.ts +2 -1
  216. package/dist/store/gi/signal.d.ts.map +1 -1
  217. package/dist/store/gi/signal.js +55 -28
  218. package/dist/store/gi/signal.js.map +1 -1
  219. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  220. package/dist/store/gi/value-marshalable.js +2 -1
  221. package/dist/store/gi/value-marshalable.js.map +1 -1
  222. package/dist/store/gi/vtable.d.ts +4 -1
  223. package/dist/store/gi/vtable.d.ts.map +1 -1
  224. package/dist/store/gi/vtable.js +60 -17
  225. package/dist/store/gi/vtable.js.map +1 -1
  226. package/dist/store/gi-store.d.ts +1 -0
  227. package/dist/store/gi-store.d.ts.map +1 -1
  228. package/dist/store/gi-store.js +15 -20
  229. package/dist/store/gi-store.js.map +1 -1
  230. package/dist/store/jsx/generated-elements.d.ts +2 -1
  231. package/dist/store/jsx/generated-elements.d.ts.map +1 -1
  232. package/dist/store/jsx/generated-elements.js +13 -7
  233. package/dist/store/jsx/generated-elements.js.map +1 -1
  234. package/dist/store/jsx/jsx.js +3 -3
  235. package/dist/store/jsx/jsx.js.map +1 -1
  236. package/dist/store/jsx/metadata.d.ts.map +1 -1
  237. package/dist/store/jsx/metadata.js +3 -1
  238. package/dist/store/jsx/metadata.js.map +1 -1
  239. package/dist/store/jsx-store.d.ts.map +1 -1
  240. package/dist/store/jsx-store.js +3 -4
  241. package/dist/store/jsx-store.js.map +1 -1
  242. package/dist/store/resolve-store.d.ts +14 -3
  243. package/dist/store/resolve-store.d.ts.map +1 -1
  244. package/dist/store/resolve-store.js +98 -15
  245. package/dist/store/resolve-store.js.map +1 -1
  246. package/dist/store/store-fs.d.ts +9 -7
  247. package/dist/store/store-fs.d.ts.map +1 -1
  248. package/dist/store/store-fs.js +54 -25
  249. package/dist/store/store-fs.js.map +1 -1
  250. package/dist/store/store-links.d.ts +3 -0
  251. package/dist/store/store-links.d.ts.map +1 -0
  252. package/dist/store/store-links.js +39 -0
  253. package/dist/store/store-links.js.map +1 -0
  254. package/dist/writer/comparison-context.d.ts +4 -0
  255. package/dist/writer/comparison-context.d.ts.map +1 -0
  256. package/dist/writer/comparison-context.js +13 -0
  257. package/dist/writer/comparison-context.js.map +1 -0
  258. package/dist/writer/context.d.ts +3 -3
  259. package/dist/writer/context.d.ts.map +1 -1
  260. package/dist/writer/context.js +11 -6
  261. package/dist/writer/context.js.map +1 -1
  262. package/dist/writer/module.d.ts +13 -5
  263. package/dist/writer/module.d.ts.map +1 -1
  264. package/dist/writer/module.js +68 -11
  265. package/dist/writer/module.js.map +1 -1
  266. package/dist/xml.d.ts +8 -1
  267. package/dist/xml.d.ts.map +1 -1
  268. package/dist/xml.js +70 -1
  269. package/dist/xml.js.map +1 -1
  270. package/overrides/gobject/object.ts.ejs +2 -0
  271. package/package.json +14 -3
  272. package/src/analysis/descriptor-render.ts +106 -52
  273. package/src/analysis/descriptor.ts +76 -15
  274. package/src/analysis/inheritance.ts +134 -44
  275. package/src/analysis/interface-conflicts.ts +235 -0
  276. package/src/analysis/param-capability.ts +3 -6
  277. package/src/analysis/param-structure.ts +2 -2
  278. package/src/analysis/ts-type.ts +43 -28
  279. package/src/analysis/type-key.ts +14 -0
  280. package/src/analysis/type-shape.ts +5 -2
  281. package/src/compile.ts +192 -27
  282. package/src/docs/api-reference.ts +13 -10
  283. package/src/docs/element-page.ts +5 -2
  284. package/src/docs/pipeline.ts +140 -24
  285. package/src/docs/render.ts +7 -3
  286. package/src/docs/symbol-page.ts +12 -11
  287. package/src/fingerprint.ts +95 -47
  288. package/src/gi.ts +10 -2
  289. package/src/gir/ancestry.ts +17 -1
  290. package/src/gir/annotations.ts +1 -1
  291. package/src/gir/cursor-overrides.ts +12 -0
  292. package/src/gir/emittable.ts +8 -0
  293. package/src/gir/function.ts +45 -9
  294. package/src/gir/gir-path.ts +1 -1
  295. package/src/gir/library.ts +10 -2
  296. package/src/gir/namespace.ts +8 -2
  297. package/src/gir/parameter.ts +15 -0
  298. package/src/gir/parse.ts +10 -7
  299. package/src/gir/primitives.ts +1 -1
  300. package/src/guards.ts +23 -0
  301. package/src/internal.ts +2 -0
  302. package/src/json.ts +11 -0
  303. package/src/khronos/args.ts +9 -6
  304. package/src/khronos/modules.ts +25 -9
  305. package/src/khronos/parse.ts +3 -4
  306. package/src/khronos/pipeline.ts +1 -1
  307. package/src/khronos/plan.ts +0 -1
  308. package/src/khronos/render.ts +8 -6
  309. package/src/runner.ts +26 -4
  310. package/src/staging.ts +67 -0
  311. package/src/store/compile-store.ts +7 -38
  312. package/src/store/gi/callables.ts +60 -33
  313. package/src/store/gi/callback.ts +9 -9
  314. package/src/store/gi/class.ts +140 -53
  315. package/src/store/gi/companion.ts +7 -6
  316. package/src/store/gi/constant.ts +13 -3
  317. package/src/store/gi/constructor-props.ts +1 -1
  318. package/src/store/gi/enum.ts +36 -26
  319. package/src/store/gi/function.ts +30 -24
  320. package/src/store/gi/gtype-binding.ts +7 -2
  321. package/src/store/gi/interface.ts +39 -20
  322. package/src/store/gi/method.ts +26 -32
  323. package/src/store/gi/param-marshal.ts +77 -6
  324. package/src/store/gi/pipeline.ts +25 -15
  325. package/src/store/gi/properties.ts +8 -4
  326. package/src/store/gi/property-accessor.ts +73 -161
  327. package/src/store/gi/record-constructor.ts +53 -21
  328. package/src/store/gi/record-field-accessor.ts +26 -4
  329. package/src/store/gi/record-layout.ts +11 -1
  330. package/src/store/gi/record.ts +20 -12
  331. package/src/store/gi/registration.ts +2 -2
  332. package/src/store/gi/return-wrap.ts +1 -1
  333. package/src/store/gi/signal.ts +66 -42
  334. package/src/store/gi/value-marshalable.ts +3 -1
  335. package/src/store/gi/vtable.ts +97 -20
  336. package/src/store/gi-store.ts +26 -31
  337. package/src/store/jsx/generated-elements.ts +17 -8
  338. package/src/store/jsx/jsx.ts +3 -3
  339. package/src/store/jsx/metadata.ts +4 -1
  340. package/src/store/jsx-store.ts +3 -4
  341. package/src/store/resolve-store.ts +133 -18
  342. package/src/store/store-fs.ts +82 -35
  343. package/src/store/store-links.ts +49 -0
  344. package/src/writer/comparison-context.ts +18 -0
  345. package/src/writer/context.ts +12 -6
  346. package/src/writer/module.ts +101 -14
  347. package/src/xml.ts +103 -1
package/dist/xml.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"xml.js","sourceRoot":"","sources":["../src/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,eAAe,GAAG,CAAC,OAA4B,EAAa,EAAE,CAChE,IAAI,SAAS,CAAC;IACV,gBAAgB,EAAE,KAAK;IACvB,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,KAAK;IAC1B,aAAa,EAAE,KAAK;IACpB,GAAG,OAAO;CACb,CAAC,CAAC;AAEP,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import { type X2jOptions, XMLParser } from \"fast-xml-parser\";\n\nconst createXmlParser = (options: Partial<X2jOptions>): XMLParser =>\n new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@_\",\n parseAttributeValue: false,\n parseTagValue: false,\n ...options,\n });\n\nexport { createXmlParser };\n"]}
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../src/xml.ts"],"names":[],"mappings":"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","sourcesContent":["import { errorMessage, isRecord } from \"@gtkx/utils\";\nimport { type X2jOptions, XMLParser } from \"fast-xml-parser\";\nimport { SyntaxValidator } from \"fast-xml-validator\";\nimport { readFileSync } from \"node:fs\";\n\ntype XmlFileInput = {\n parser: XMLParser;\n label: string;\n path: string;\n malformedRemedy?: string;\n};\n\nconst HIGHEST_CONTROL_CODE = 0x1F;\nconst LEGAL_CONTROL_CODES: Set<number> = new Set([0x09, 0x0A, 0x0D]);\n\nconst createXmlParser = (options: Partial<X2jOptions>): XMLParser =>\n new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@_\",\n parseAttributeValue: false,\n parseTagValue: false,\n ...options,\n });\n\nconst xmlFileError = (input: XmlFileInput, action: string, error: unknown): Error =>\n new Error(`Cannot ${action} the ${input.label} at ${input.path}: ${errorMessage(error)}`, { cause: error });\n\nconst readXmlFile = (input: XmlFileInput): string => {\n try {\n return readFileSync(input.path, \"utf8\");\n } catch (error) {\n throw xmlFileError(input, \"read\", error);\n }\n};\n\nconst isLocated = (line: unknown, col: unknown): boolean =>\n typeof line === \"number\" && typeof col === \"number\" && (line > 1 || col > 1);\n\nconst positionSuffix = (error: unknown): string => {\n if (!isRecord(error)) {\n return \"\";\n }\n\n const { line, col } = error;\n\n if (!isLocated(line, col)) {\n return \"\";\n }\n\n return ` (line ${String(line)}, column ${String(col)})`;\n};\n\nconst isIllegalControlCode = (code: number): boolean =>\n code <= HIGHEST_CONTROL_CODE && !LEGAL_CONTROL_CODES.has(code);\n\nconst escapedCode = (code: number): string => `[U+${code.toString(16).toUpperCase().padStart(4, \"0\")}]`;\n\nconst escapeControlCodes = (text: string): string => {\n let escaped = \"\";\n\n for (const character of text) {\n const code = character.codePointAt(0) ?? 0;\n escaped += isIllegalControlCode(code) ? escapedCode(code) : character;\n }\n\n return escaped;\n};\n\nconst offendingLine = (xml: string, error: unknown): string => {\n const line = isRecord(error) ? error.line : undefined;\n\n if (typeof line !== \"number\") {\n return \"\";\n }\n\n const text = xml.split(\"\\n\")[line - 1];\n\n if (text === undefined) {\n return \"\";\n }\n\n return `\\n ${escapeControlCodes(text.replace(/^[ \\t]+/, \"\").replace(/\\r$/, \"\"))}`;\n};\n\nconst remedySuffix = (input: XmlFileInput, xml: string, error: unknown): string => {\n const remedy = input.malformedRemedy;\n\n return remedy === undefined ? \"\" : `${offendingLine(xml, error)}\\n${remedy}`;\n};\n\nconst assertWellFormed = (input: XmlFileInput, xml: string): void => {\n try {\n SyntaxValidator.validate(xml);\n } catch (error) {\n throw new Error(\n `The ${input.label} at ${input.path} is not well-formed XML: ` +\n `${errorMessage(error)}${positionSuffix(error)}${remedySuffix(input, xml, error)}`,\n { cause: error },\n );\n }\n};\n\nconst parseXmlFile = (input: XmlFileInput): unknown => {\n const xml = readXmlFile(input);\n assertWellFormed(input, xml);\n\n try {\n return input.parser.parse(xml);\n } catch (error) {\n throw xmlFileError(input, \"parse\", error);\n }\n};\n\nexport { createXmlParser, parseXmlFile };\n"]}
@@ -52,6 +52,7 @@ declare module "../gobject.js" {
52
52
  * @param callback Handler invoked on each emission.
53
53
  * @param isAfter Run the handler after the default handler rather than before it.
54
54
  * @returns The same object, so calls chain.
55
+ * @deprecated Since 1.2. Use `on` instead. Removed in v2.
55
56
  */
56
57
  addEventListener(sigName: string, callback: (...args: unknown[]) => unknown, isAfter?: boolean): Object;
57
58
 
@@ -61,6 +62,7 @@ declare module "../gobject.js" {
61
62
  * @param sigName Signal the handler was connected to.
62
63
  * @param callback The handler that was connected.
63
64
  * @returns The same object, so calls chain.
65
+ * @deprecated Since 1.2. Use `off` instead. Removed in v2.
64
66
  */
65
67
  removeEventListener(sigName: string, callback: (...args: unknown[]) => unknown): Object;
66
68
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gtkx/codegen",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Generates the typed GTKX bindings and API reference from GIR and OpenGL registry data",
5
5
  "keywords": [
6
6
  "gtkx",
@@ -40,15 +40,26 @@
40
40
  "overrides",
41
41
  "src"
42
42
  ],
43
+ "nx": {
44
+ "targets": {
45
+ "lint": {
46
+ "options": {
47
+ "cwd": ".",
48
+ "command": "eslint {projectRoot}"
49
+ }
50
+ }
51
+ }
52
+ },
43
53
  "engines": {
44
54
  "node": ">=24"
45
55
  },
46
56
  "dependencies": {
47
57
  "@types/node": "^26.2.0",
48
58
  "fast-xml-parser": "^5.10.1",
59
+ "fast-xml-validator": "^1.4.1",
49
60
  "typescript": "^6.0.3",
50
- "@gtkx/utils": "1.0.0",
51
- "@gtkx/react": "1.0.0"
61
+ "@gtkx/react": "1.2.0",
62
+ "@gtkx/utils": "1.2.0"
52
63
  },
53
64
  "scripts": {
54
65
  "release": "tsx ../../scripts/release-package.ts"
@@ -1,10 +1,11 @@
1
- import { sourceStringLiteral } from "@gtkx/utils";
1
+ import { sanitizeTypeIdentifier, sourceStringLiteral } from "@gtkx/utils";
2
2
  import type { GirCallback } from "../gir/callback.js";
3
3
  import type { Library } from "../gir/library.js";
4
4
  import type { PrimitiveCategory } from "../gir/primitives.js";
5
5
  import type { EntityType, GirType } from "../gir/type.js";
6
6
  import type { ModuleContext } from "../writer/context.js";
7
7
  import {
8
+ type GirCursorBounds,
8
9
  type GirParameter,
9
10
  type GirReturnValue,
10
11
  isCallerAllocatedOut,
@@ -20,16 +21,19 @@ import {
20
21
  type TypeId,
21
22
  } from "../gir/type-id.js";
22
23
  import { isRecordInout } from "../store/gi/param-marshal.js";
23
- import { computeRecordFieldSlots } from "../store/gi/record-layout.js";
24
+ import { computeRecordFieldSlots, recordInlineSize } from "../store/gi/record-layout.js";
24
25
  import { isValueMarshalable } from "../store/gi/value-marshalable.js";
25
26
  import {
27
+ type ArrayLayout,
26
28
  type ListDescriptorName,
27
29
  type Ownership,
28
30
  type ScalarDescriptorName,
29
31
  tArray,
32
+ tBiguint64,
30
33
  tBoxed,
31
34
  tByteArray,
32
35
  tCallback,
36
+ tCursorArray,
33
37
  tEnum,
34
38
  tFixedArray,
35
39
  tFlags,
@@ -38,6 +42,7 @@ import {
38
42
  tHashTable,
39
43
  tInt32,
40
44
  tList,
45
+ tNumericByteArray,
41
46
  tObject,
42
47
  tRef,
43
48
  tScalar,
@@ -48,23 +53,25 @@ import {
48
53
  tUint64,
49
54
  tVoid,
50
55
  } from "./descriptor.js";
51
- import { carrayFor, isUnboundedArray, primitiveCategoryFor } from "./type-shape.js";
56
+ import { carrayFor, isByteSequence, isUnboundedArray, primitiveCategoryFor } from "./type-shape.js";
52
57
 
53
- type RenderDescriptorOptions = {
54
- argIndexOffset?: number;
55
- argIndexMap?: Map<number, number> | undefined;
56
- hasOutIndirection?: boolean;
57
- isCallerAllocated?: boolean;
58
- isInline?: boolean;
59
- isNewlyCreated?: boolean;
60
- };
58
+ type PrimaryReturnKind = "surfaced" | "void" | "skipped";
61
59
 
62
60
  type ArgIndexOptions = {
63
61
  argIndexOffset: number;
64
62
  argIndexMap: Map<number, number> | undefined;
63
+ cursor: GirCursorBounds | undefined;
65
64
  hasOutIndirection: boolean;
66
65
  };
67
66
 
67
+ type CursorArgIndexOptions = ArgIndexOptions & { cursor: GirCursorBounds };
68
+
69
+ type RenderDescriptorOptions = Partial<ArgIndexOptions> & {
70
+ isCallerAllocated?: boolean;
71
+ isInline?: boolean;
72
+ isNewlyCreated?: boolean;
73
+ };
74
+
68
75
  type RecordPlacement = {
69
76
  isCallerAllocated?: boolean;
70
77
  isInline?: boolean;
@@ -91,6 +98,7 @@ type ResolvedRecord = Extract<EntityType, { kind: "record" }>["value"];
91
98
 
92
99
  type FundamentalRecordOptions = {
93
100
  resolved: Extract<EntityType, { kind: "record" }>;
101
+ lib: string;
94
102
  refFunc: string;
95
103
  unrefFunc: string;
96
104
  ownership: Ownership;
@@ -131,12 +139,27 @@ const isVoidRef = (library: Library, ref: TypeId | undefined): boolean =>
131
139
  const isInlineCallbackRef = (library: Library, ref: TypeId | undefined): boolean =>
132
140
  ref !== undefined && library.typeFor(ref)?.kind === "callback" && library.nameFor(ref) === undefined;
133
141
 
142
+ const primaryReturnKind = (library: Library, returnValue: GirReturnValue): PrimaryReturnKind => {
143
+ if (isVoidRef(library, returnValue.type)) {
144
+ return "void";
145
+ }
146
+
147
+ return returnValue.skip ? "skipped" : "surfaced";
148
+ };
149
+
134
150
  const shouldOmitPrimaryReturn = (library: Library, returnValue: GirReturnValue): boolean =>
135
- isVoidRef(library, returnValue.type) || returnValue.skip;
151
+ primaryReturnKind(library, returnValue) !== "surfaced";
152
+
153
+ const isSkippedPrimaryReturn = (library: Library, returnValue: GirReturnValue): boolean =>
154
+ primaryReturnKind(library, returnValue) === "skipped";
155
+
156
+ const isVoidPrimaryReturn = (library: Library, returnValue: GirReturnValue): boolean =>
157
+ primaryReturnKind(library, returnValue) === "void";
136
158
 
137
159
  const argIndexOptions = (options: RenderDescriptorOptions): ArgIndexOptions => ({
138
160
  argIndexOffset: options.argIndexOffset ?? 0,
139
161
  argIndexMap: options.argIndexMap,
162
+ cursor: options.cursor,
140
163
  hasOutIndirection: options.hasOutIndirection === true,
141
164
  });
142
165
 
@@ -200,7 +223,7 @@ const listExpression = (
200
223
  const ownership = transferOwnership(transfer);
201
224
 
202
225
  if (type.flavor === "gbytearray") {
203
- return tByteArray(ownership);
226
+ return context.library.isByteArrayTyped ? tByteArray(ownership) : tNumericByteArray(ownership);
204
227
  }
205
228
 
206
229
  const element = renderDescriptor(context, type.element, deriveElementTransfer(transfer), indexOptions);
@@ -276,7 +299,7 @@ const renderParamDescriptor = (
276
299
  ref: TypeId | undefined,
277
300
  argIndex: Partial<ArgIndexOptions> = {},
278
301
  ): string => {
279
- const behindRef: RenderDescriptorOptions = { ...argIndex, hasOutIndirection: true };
302
+ const behindRef: RenderDescriptorOptions = { ...argIndex, cursor: parameter.cursor, hasOutIndirection: true };
280
303
 
281
304
  if (isCellInout(context.library, parameter)) {
282
305
  return tRef(renderDescriptor(context, ref, parameter.transferOwnership, behindRef), true);
@@ -310,7 +333,7 @@ const findUserDataIndex = (parameters: GirParameter[]): number | undefined => {
310
333
  return declared?.closureIndex ?? userDataIndexByName(parameters);
311
334
  };
312
335
 
313
- const callbackOptionsArg = (owningParameter: GirParameter, userDataIndex: number | undefined): string | undefined => {
336
+ const callbackOptionsArg = (owningParameter: GirParameter, userDataIndex: number | undefined): string[] => {
314
337
  const options: string[] = [];
315
338
 
316
339
  if (owningParameter.destroyIndex !== undefined) {
@@ -329,7 +352,7 @@ const callbackOptionsArg = (owningParameter: GirParameter, userDataIndex: number
329
352
  options.push(`scope: ${sourceStringLiteral(owningParameter.scope)}`);
330
353
  }
331
354
 
332
- return options.length > 0 ? `{ ${options.join(", ")} }` : undefined;
355
+ return options;
333
356
  };
334
357
 
335
358
  const renderCallbackType = (
@@ -348,15 +371,13 @@ const renderCallbackType = (
348
371
  (parameter, index) => argOverrides?.get(index) ?? renderParamDescriptor(context, parameter, parameter.type),
349
372
  );
350
373
 
351
- const returnRef = callback.returnValue.type;
352
-
353
- const returnType = isVoidRef(context.library, returnRef)
354
- ? tVoid
355
- : renderDescriptor(context, returnRef, callback.returnValue.transferOwnership);
374
+ const { returnValue } = callback;
356
375
 
357
- const optionsArg = callbackOptionsArg(owningParameter, findUserDataIndex(callback.parameters));
358
-
359
- return tCallback(argTypes, returnType, optionsArg);
376
+ return tCallback({
377
+ argTypes,
378
+ returns: renderDescriptor(context, returnValue.type, returnValue.transferOwnership),
379
+ options: callbackOptionsArg(owningParameter, findUserDataIndex(callback.parameters)),
380
+ });
360
381
  };
361
382
 
362
383
  const primitiveExpression = (category: PrimitiveCategory, ownership: Ownership): string => {
@@ -369,7 +390,7 @@ const primitiveExpression = (category: PrimitiveCategory, ownership: Ownership):
369
390
  }
370
391
 
371
392
  if (category === "pointer") {
372
- return tUint64;
393
+ return tBiguint64;
373
394
  }
374
395
 
375
396
  if (category === "gtype") {
@@ -424,13 +445,14 @@ const getFundamental = (
424
445
  node: Extract<EntityType, { kind: "class" | "interface" }>,
425
446
  ): AncestorFundamental | undefined => {
426
447
  const cls = node.value;
448
+ const lib = node.namespace.sharedLibrary;
427
449
 
428
- if (!cls.fundamental || cls.glibRefFunc === undefined || cls.glibUnrefFunc === undefined) {
450
+ if (lib === undefined || !cls.fundamental || cls.glibRefFunc === undefined || cls.glibUnrefFunc === undefined) {
429
451
  return undefined;
430
452
  }
431
453
 
432
454
  return {
433
- lib: node.namespace.sharedLibrary ?? "",
455
+ lib,
434
456
  refFunc: cls.glibRefFunc,
435
457
  unrefFunc: cls.glibUnrefFunc,
436
458
  typeName: cls.glibTypeName,
@@ -529,7 +551,7 @@ const structExpression = (
529
551
  options: { isCallerAllocated: boolean; isInline: boolean },
530
552
  ): string => {
531
553
  const { size } = computeRecordFieldSlots(context, resolved.value.fields, resolved.value.isUnion);
532
- const wrapperClass = context.qualify(resolved.namespace.name, resolved.value.name);
554
+ const wrapperClass = context.qualify(resolved.namespace.name, sanitizeTypeIdentifier(resolved.value.name));
533
555
  const isCopyable = isValueMarshalable(context, resolved.namespace.name, resolved.value);
534
556
 
535
557
  return tStruct(ownership, {
@@ -541,10 +563,10 @@ const structExpression = (
541
563
  };
542
564
 
543
565
  const fundamentalRecordExpression = (options: FundamentalRecordOptions): string => {
544
- const { resolved, refFunc, unrefFunc, ownership, wrapperClass, isInline } = options;
566
+ const { resolved, lib, refFunc, unrefFunc, ownership, wrapperClass, isInline } = options;
545
567
 
546
568
  return renderFundamental({
547
- lib: resolved.namespace.sharedLibrary ?? "",
569
+ lib,
548
570
  refFunc,
549
571
  unrefFunc,
550
572
  typeName: resolved.value.glibTypeName,
@@ -605,14 +627,16 @@ const recordExpression = (
605
627
  ): string => {
606
628
  const record = resolved.value;
607
629
  const { refFunc, unrefFunc } = recordRefPair(record);
630
+ const lib = resolved.namespace.sharedLibrary;
608
631
 
609
- if (refFunc !== undefined && unrefFunc !== undefined) {
632
+ if (refFunc !== undefined && unrefFunc !== undefined && lib !== undefined) {
610
633
  const wrapperClass = requiresFallbackClass(record)
611
- ? context.qualify(resolved.namespace.name, record.name)
634
+ ? context.qualify(resolved.namespace.name, sanitizeTypeIdentifier(record.name))
612
635
  : undefined;
613
636
 
614
637
  return fundamentalRecordExpression({
615
638
  resolved,
639
+ lib,
616
640
  refFunc,
617
641
  unrefFunc,
618
642
  ownership,
@@ -629,13 +653,12 @@ const rawEnumDescriptor = (isSigned: boolean): string => (isSigned ? tInt32 : tU
629
653
  const enumExpression = (resolved: Extract<EntityType, { kind: "enum" }>): string => {
630
654
  const getter = resolved.value.glibGetType;
631
655
  const isSigned = resolved.value.members.some((member) => member.value.startsWith("-"));
656
+ const lib = resolved.namespace.sharedLibrary;
632
657
 
633
- if (getter === undefined || getter === "") {
658
+ if (getter === undefined || getter === "" || lib === undefined) {
634
659
  return rawEnumDescriptor(isSigned);
635
660
  }
636
661
 
637
- const lib = resolved.namespace.sharedLibrary ?? "";
638
-
639
662
  return resolved.value.kind === "bitfield" ? tFlags(lib, getter, isSigned) : tEnum(lib, getter, isSigned);
640
663
  };
641
664
 
@@ -667,40 +690,69 @@ const expressionForResolved = (
667
690
  }
668
691
  };
669
692
 
693
+ const elementExpression = (
694
+ context: ModuleContext,
695
+ ref: CArrayType,
696
+ transfer: ParameterTransfer,
697
+ options: ArgIndexOptions,
698
+ ): string =>
699
+ renderDescriptor(context, ref.element, deriveElementTransfer(transfer), {
700
+ ...options,
701
+ cursor: undefined,
702
+ hasOutIndirection: false,
703
+ });
704
+
705
+ const cursorArrayExpression = (
706
+ context: ModuleContext,
707
+ ref: CArrayType,
708
+ transfer: ParameterTransfer,
709
+ options: CursorArgIndexOptions & { layout: ArrayLayout },
710
+ ): string =>
711
+ tCursorArray(
712
+ elementExpression(context, ref, transfer, options),
713
+ {
714
+ baseIndex: mapArgIndex(options, options.cursor.baseIndex),
715
+ lengthIndex: mapArgIndex(options, options.cursor.lengthIndex),
716
+ },
717
+ transferOwnership(transfer),
718
+ options.layout,
719
+ );
720
+
721
+ const arrayLayout = (context: ModuleContext, ref: CArrayType, options: ArgIndexOptions): ArrayLayout => ({
722
+ elementSize: inlineElementSize(context, ref, options.hasOutIndirection),
723
+ isBytes:
724
+ context.library.isByteArrayTyped && !hasUnknownArrayLength(ref) && isByteSequence(context.library, ref),
725
+ });
726
+
670
727
  const arrayExpression = (
671
728
  context: ModuleContext,
672
729
  ref: CArrayType,
673
730
  transfer: ParameterTransfer,
674
731
  options: ArgIndexOptions,
675
732
  ): string => {
733
+ const { cursor } = options;
734
+ const layout = arrayLayout(context, ref, options);
735
+
736
+ if (cursor !== undefined) {
737
+ return cursorArrayExpression(context, ref, transfer, { ...options, cursor, layout });
738
+ }
739
+
676
740
  if (hasUnknownArrayLength(ref)) {
677
741
  return tUint64;
678
742
  }
679
743
 
680
744
  const ownership = transferOwnership(transfer);
681
- const elementOptions: ArgIndexOptions = { ...options, hasOutIndirection: false };
682
- const element = renderDescriptor(context, ref.element, deriveElementTransfer(transfer), elementOptions);
683
- const size = inlineElementSize(context, ref, options.hasOutIndirection);
745
+ const element = elementExpression(context, ref, transfer, options);
684
746
 
685
747
  if (ref.lengthParameterIndex !== undefined) {
686
- return tSizedArray(element, mapArgIndex(options, ref.lengthParameterIndex), ownership, size);
748
+ return tSizedArray(element, mapArgIndex(options, ref.lengthParameterIndex), ownership, layout);
687
749
  }
688
750
 
689
751
  if (ref.fixedSize !== undefined) {
690
- return tFixedArray(element, ref.fixedSize, ownership, size);
752
+ return tFixedArray(element, ref.fixedSize, ownership, layout);
691
753
  }
692
754
 
693
- return tArray(element, ownership, size);
694
- };
695
-
696
- const recordInlineSize = (context: ModuleContext, record: ResolvedRecord): number | undefined => {
697
- if (record.opaque || record.disguised || record.fields.length === 0) {
698
- return undefined;
699
- }
700
-
701
- const { size } = computeRecordFieldSlots(context, record.fields, record.isUnion);
702
-
703
- return size > 0 ? size : undefined;
755
+ return tArray(element, ownership, layout);
704
756
  };
705
757
 
706
758
  const elementPointerDepth = (elementCType: string | undefined, hasOutIndirection: boolean): number => {
@@ -738,11 +790,13 @@ const aliasExpression = (
738
790
 
739
791
  export {
740
792
  isInlineCallbackRef,
793
+ isSkippedPrimaryReturn,
794
+ isVoidPrimaryReturn,
795
+ primaryReturnKind,
741
796
  shouldOmitPrimaryReturn,
742
797
  renderDescriptor,
743
798
  isScalarRef,
744
799
  isCellInout,
745
- recordInlineSize,
746
800
  renderParamDescriptor,
747
801
  renderCallbackType,
748
802
  renderSelfDescriptor,
@@ -1,4 +1,5 @@
1
1
  import { sourceStringLiteral } from "@gtkx/utils";
2
+ import type { GirCursorBounds } from "../gir/parameter.js";
2
3
  import { joinArgs } from "../writer/emit.js";
3
4
 
4
5
  type Ownership = "borrowed" | "full";
@@ -39,6 +40,7 @@ type DescriptorName =
39
40
  "byteArray" |
40
41
  "sizedArray" |
41
42
  "fixedArray" |
43
+ "cursorArray" |
42
44
  "callback" |
43
45
  "fn";
44
46
 
@@ -85,6 +87,11 @@ type FundamentalOptions = {
85
87
 
86
88
  type ListDescriptorName = "list" | "slist" | "ptrArray" | "gArray";
87
89
 
90
+ type ArrayLayout = {
91
+ elementSize?: number | undefined;
92
+ isBytes: boolean;
93
+ };
94
+
88
95
  type BindArgs = {
89
96
  libExpr: string;
90
97
  symbolExpr: string;
@@ -92,6 +99,21 @@ type BindArgs = {
92
99
  returnType: string;
93
100
  };
94
101
 
102
+ type FnSpecParts = {
103
+ args: string;
104
+ returns: string;
105
+ isReturnSkipped: boolean;
106
+ canThrow: boolean;
107
+ };
108
+
109
+ type CallbackSpecParts = {
110
+ argTypes: string[];
111
+ returns: string;
112
+ options: string[];
113
+ };
114
+
115
+ const SKIPPED_RETURN_ENTRY = "isReturnSkipped: true";
116
+
95
117
  const T: DescriptorNames = {
96
118
  bind: "t.bind",
97
119
  int8: "t.int8",
@@ -128,6 +150,7 @@ const T: DescriptorNames = {
128
150
  byteArray: "t.byteArray",
129
151
  sizedArray: "t.sizedArray",
130
152
  fixedArray: "t.fixedArray",
153
+ cursorArray: "t.cursorArray",
131
154
  callback: "t.callback",
132
155
  fn: "t.fn",
133
156
  };
@@ -138,6 +161,7 @@ const tUint8: string = T.uint8;
138
161
  const tUint32: string = T.uint32;
139
162
  const tInt32: string = T.int32;
140
163
  const tUint64: string = T.uint64;
164
+ const tBiguint64: string = T.biguint64;
141
165
  const tGtype: string = T.gtype;
142
166
  const tBuffer: string = T.buffer;
143
167
 
@@ -211,55 +235,88 @@ const tFlags = (lib: string, typeFnName: string, isSigned: boolean): string =>
211
235
 
212
236
  const tByteArray = (ownership: Ownership): string => call("byteArray", [sourceStringLiteral(ownership)]);
213
237
 
238
+ const tNumericByteArray = (ownership: Ownership): string =>
239
+ call("array", [
240
+ tUint8,
241
+ sourceStringLiteral("gbytearray"),
242
+ sourceStringLiteral(ownership),
243
+ ]);
244
+
214
245
  const tList = (name: ListDescriptorName, element: string, ownership: Ownership): string =>
215
246
  call(name, [element, sourceStringLiteral(ownership)]);
216
247
 
217
- const tArray = (element: string, ownership?: Ownership, elementSize?: number): string =>
248
+ const arrayLayoutArg = (ownership: Ownership | undefined, layout: ArrayLayout): string | undefined => {
249
+ if (ownership === undefined) {
250
+ return undefined;
251
+ }
252
+
253
+ const entries = [
254
+ layout.elementSize === undefined ? undefined : `elementSize: ${String(layout.elementSize)}`,
255
+ layout.isBytes ? "isBytes: true" : undefined,
256
+ ].filter((entry): entry is string => entry !== undefined);
257
+
258
+ return entries.length === 0 ? undefined : `{ ${entries.join(", ")} }`;
259
+ };
260
+
261
+ const tArray = (element: string, ownership: Ownership | undefined, layout: ArrayLayout): string =>
218
262
  call("array", [
219
263
  element,
220
264
  ownership === undefined ? undefined : sourceStringLiteral("array"),
221
265
  ownership === undefined ? undefined : sourceStringLiteral(ownership),
222
- elementSize === undefined ? undefined : `{ elementSize: ${String(elementSize)} }`,
266
+ arrayLayoutArg(ownership, layout),
223
267
  ]);
224
268
 
225
269
  const tSizedArray = (
226
270
  element: string,
227
271
  lengthIndex: number,
228
- ownership?: Ownership,
229
- elementSize?: number,
272
+ ownership: Ownership | undefined,
273
+ layout: ArrayLayout,
230
274
  ): string =>
231
275
  call("sizedArray", [
232
276
  element,
233
277
  String(lengthIndex),
234
278
  ownership === undefined ? undefined : sourceStringLiteral(ownership),
235
- elementSize === undefined ? undefined : String(elementSize),
279
+ arrayLayoutArg(ownership, layout),
236
280
  ]);
237
281
 
238
- const tFixedArray = (element: string, length: number, ownership?: Ownership, elementSize?: number): string =>
282
+ const tCursorArray = (
283
+ element: string,
284
+ bounds: GirCursorBounds,
285
+ ownership: Ownership | undefined,
286
+ layout: ArrayLayout,
287
+ ): string =>
288
+ call("cursorArray", [
289
+ element,
290
+ `{ baseParamIndex: ${String(bounds.baseIndex)}, sizeParamIndex: ${String(bounds.lengthIndex)} }`,
291
+ ownership === undefined ? undefined : sourceStringLiteral(ownership),
292
+ arrayLayoutArg(ownership, layout),
293
+ ]);
294
+
295
+ const tFixedArray = (element: string, length: number, ownership: Ownership | undefined, layout: ArrayLayout): string =>
239
296
  call("fixedArray", [
240
297
  element,
241
298
  String(length),
242
299
  ownership === undefined ? undefined : sourceStringLiteral(ownership),
243
- elementSize === undefined ? undefined : String(elementSize),
300
+ arrayLayoutArg(ownership, layout),
244
301
  ]);
245
302
 
246
- const tCallback = (argTypes: string[], returnType: string, options?: string): string =>
247
- call("callback", [`[${argTypes.join(", ")}]`, returnType, options]);
303
+ const tCallback = (spec: CallbackSpecParts): string => {
304
+ const optionsArg = spec.options.length > 0 ? `{ ${spec.options.join(", ")} }` : undefined;
305
+
306
+ return call("callback", [`[${spec.argTypes.join(", ")}]`, spec.returns, optionsArg]);
307
+ };
248
308
 
249
309
  const tBind = (args: BindArgs): string =>
250
310
  call("bind", [args.libExpr, args.symbolExpr, args.argList, args.returnType]);
251
311
 
252
- const tFn = (
253
- lib: string,
254
- cIdentifier: string,
255
- spec: { args: string; returns: string; canThrow: boolean },
256
- ): string => {
312
+ const tFn = (lib: string, cIdentifier: string, spec: FnSpecParts): string => {
313
+ const skipEntry = spec.isReturnSkipped ? `, ${SKIPPED_RETURN_ENTRY}` : "";
257
314
  const throwsEntry = spec.canThrow ? ", canThrow: true" : "";
258
315
 
259
316
  return call("fn", [
260
317
  sourceStringLiteral(lib),
261
318
  sourceStringLiteral(cIdentifier),
262
- `{ args: ${spec.args}, returns: ${spec.returns}${throwsEntry} }`,
319
+ `{ args: ${spec.args}, returns: ${spec.returns}${skipEntry}${throwsEntry} }`,
263
320
  ]);
264
321
  };
265
322
 
@@ -270,6 +327,7 @@ export {
270
327
  tUint32,
271
328
  tInt32,
272
329
  tUint64,
330
+ tBiguint64,
273
331
  tGtype,
274
332
  tBuffer,
275
333
  tScalar,
@@ -284,13 +342,16 @@ export {
284
342
  tEnum,
285
343
  tFlags,
286
344
  tByteArray,
345
+ tNumericByteArray,
287
346
  tList,
288
347
  tArray,
289
348
  tSizedArray,
290
349
  tFixedArray,
350
+ tCursorArray,
291
351
  tCallback,
292
352
  tBind,
293
353
  tFn,
354
+ type ArrayLayout,
294
355
  type Ownership,
295
356
  type ScalarDescriptorName,
296
357
  type ListDescriptorName,