@gtkx/codegen 1.0.0-rc.3 → 1.0.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 (486) hide show
  1. package/README.md +8 -9
  2. package/dist/analysis/descriptor-render.d.ts +9 -4
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +51 -61
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +7 -7
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +7 -7
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +1 -2
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +25 -22
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/nul-terminated-bytes.d.ts +5 -0
  15. package/dist/analysis/nul-terminated-bytes.d.ts.map +1 -0
  16. package/dist/analysis/nul-terminated-bytes.js +18 -0
  17. package/dist/analysis/nul-terminated-bytes.js.map +1 -0
  18. package/dist/analysis/param-capability.d.ts +5 -0
  19. package/dist/analysis/param-capability.d.ts.map +1 -0
  20. package/dist/analysis/param-capability.js +130 -0
  21. package/dist/analysis/param-capability.js.map +1 -0
  22. package/dist/analysis/param-structure.d.ts +13 -6
  23. package/dist/analysis/param-structure.d.ts.map +1 -1
  24. package/dist/analysis/param-structure.js +44 -20
  25. package/dist/analysis/param-structure.js.map +1 -1
  26. package/dist/analysis/ts-type.d.ts +1 -1
  27. package/dist/analysis/ts-type.d.ts.map +1 -1
  28. package/dist/analysis/ts-type.js +3 -5
  29. package/dist/analysis/ts-type.js.map +1 -1
  30. package/dist/analysis/type-shape.d.ts +8 -0
  31. package/dist/analysis/type-shape.d.ts.map +1 -0
  32. package/dist/analysis/type-shape.js +12 -0
  33. package/dist/analysis/type-shape.js.map +1 -0
  34. package/dist/compile.d.ts +1 -1
  35. package/dist/compile.d.ts.map +1 -1
  36. package/dist/compile.js +2 -1
  37. package/dist/compile.js.map +1 -1
  38. package/dist/docs/api-reference.d.ts +79 -3
  39. package/dist/docs/api-reference.d.ts.map +1 -1
  40. package/dist/docs/api-reference.js +68 -13
  41. package/dist/docs/api-reference.js.map +1 -1
  42. package/dist/docs/element-page.d.ts +4 -4
  43. package/dist/docs/element-page.d.ts.map +1 -1
  44. package/dist/docs/element-page.js +32 -20
  45. package/dist/docs/element-page.js.map +1 -1
  46. package/dist/docs/handwritten-props.d.ts +9 -0
  47. package/dist/docs/handwritten-props.d.ts.map +1 -0
  48. package/dist/docs/handwritten-props.js +149 -0
  49. package/dist/docs/handwritten-props.js.map +1 -0
  50. package/dist/docs/pipeline.d.ts +4 -4
  51. package/dist/docs/pipeline.d.ts.map +1 -1
  52. package/dist/docs/pipeline.js +6 -6
  53. package/dist/docs/pipeline.js.map +1 -1
  54. package/dist/docs/render.d.ts +25 -5
  55. package/dist/docs/render.d.ts.map +1 -1
  56. package/dist/docs/render.js +90 -28
  57. package/dist/docs/render.js.map +1 -1
  58. package/dist/docs/symbol-page.d.ts +22 -0
  59. package/dist/docs/symbol-page.d.ts.map +1 -1
  60. package/dist/docs/symbol-page.js +129 -44
  61. package/dist/docs/symbol-page.js.map +1 -1
  62. package/dist/fingerprint.d.ts +3 -6
  63. package/dist/fingerprint.d.ts.map +1 -1
  64. package/dist/fingerprint.js +6 -8
  65. package/dist/fingerprint.js.map +1 -1
  66. package/dist/gi.d.ts +3 -11
  67. package/dist/gi.d.ts.map +1 -1
  68. package/dist/gi.js +0 -7
  69. package/dist/gi.js.map +1 -1
  70. package/dist/gir/ancestry.d.ts +2 -2
  71. package/dist/gir/ancestry.d.ts.map +1 -1
  72. package/dist/gir/ancestry.js +11 -1
  73. package/dist/gir/ancestry.js.map +1 -1
  74. package/dist/gir/annotations.d.ts +22 -0
  75. package/dist/gir/annotations.d.ts.map +1 -0
  76. package/dist/gir/annotations.js +15 -0
  77. package/dist/gir/annotations.js.map +1 -0
  78. package/dist/gir/callback.d.ts +1 -0
  79. package/dist/gir/callback.d.ts.map +1 -1
  80. package/dist/gir/callback.js +1 -0
  81. package/dist/gir/callback.js.map +1 -1
  82. package/dist/gir/class.d.ts +32 -1
  83. package/dist/gir/class.d.ts.map +1 -1
  84. package/dist/gir/class.js +8 -3
  85. package/dist/gir/class.js.map +1 -1
  86. package/dist/gir/enum.d.ts +21 -1
  87. package/dist/gir/enum.d.ts.map +1 -1
  88. package/dist/gir/enum.js +9 -9
  89. package/dist/gir/enum.js.map +1 -1
  90. package/dist/gir/field.d.ts +19 -4
  91. package/dist/gir/field.d.ts.map +1 -1
  92. package/dist/gir/field.js +7 -11
  93. package/dist/gir/field.js.map +1 -1
  94. package/dist/gir/function.d.ts +15 -0
  95. package/dist/gir/function.d.ts.map +1 -1
  96. package/dist/gir/function.js.map +1 -1
  97. package/dist/gir/gir-path.d.ts +7 -0
  98. package/dist/gir/gir-path.d.ts.map +1 -1
  99. package/dist/gir/gir-path.js +7 -0
  100. package/dist/gir/gir-path.js.map +1 -1
  101. package/dist/gir/libraries.d.ts +13 -2
  102. package/dist/gir/libraries.d.ts.map +1 -1
  103. package/dist/gir/libraries.js +11 -0
  104. package/dist/gir/libraries.js.map +1 -1
  105. package/dist/gir/library.d.ts +36 -0
  106. package/dist/gir/library.d.ts.map +1 -1
  107. package/dist/gir/library.js +34 -0
  108. package/dist/gir/library.js.map +1 -1
  109. package/dist/gir/namespace.d.ts +38 -0
  110. package/dist/gir/namespace.d.ts.map +1 -1
  111. package/dist/gir/namespace.js +4 -5
  112. package/dist/gir/namespace.js.map +1 -1
  113. package/dist/gir/parameter.d.ts +39 -0
  114. package/dist/gir/parameter.d.ts.map +1 -1
  115. package/dist/gir/parameter.js +7 -7
  116. package/dist/gir/parameter.js.map +1 -1
  117. package/dist/gir/parse.d.ts +3 -1
  118. package/dist/gir/parse.d.ts.map +1 -1
  119. package/dist/gir/parse.js +6 -3
  120. package/dist/gir/parse.js.map +1 -1
  121. package/dist/gir/primitives.d.ts +1 -0
  122. package/dist/gir/primitives.d.ts.map +1 -1
  123. package/dist/gir/primitives.js.map +1 -1
  124. package/dist/gir/property.d.ts +16 -0
  125. package/dist/gir/property.d.ts.map +1 -1
  126. package/dist/gir/property.js +3 -3
  127. package/dist/gir/property.js.map +1 -1
  128. package/dist/gir/record.d.ts +22 -0
  129. package/dist/gir/record.d.ts.map +1 -1
  130. package/dist/gir/record.js +3 -2
  131. package/dist/gir/record.js.map +1 -1
  132. package/dist/gir/size.d.ts +5 -4
  133. package/dist/gir/size.d.ts.map +1 -1
  134. package/dist/gir/size.js +0 -3
  135. package/dist/gir/size.js.map +1 -1
  136. package/dist/gir/type-id.d.ts +36 -1
  137. package/dist/gir/type-id.d.ts.map +1 -1
  138. package/dist/gir/type-id.js +2 -3
  139. package/dist/gir/type-id.js.map +1 -1
  140. package/dist/gir/type-ref.d.ts.map +1 -1
  141. package/dist/gir/type-ref.js +2 -1
  142. package/dist/gir/type-ref.js.map +1 -1
  143. package/dist/gir/type.d.ts +20 -0
  144. package/dist/gir/type.d.ts.map +1 -1
  145. package/dist/gir/type.js.map +1 -1
  146. package/dist/index.d.ts +18 -6
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +12 -3
  149. package/dist/index.js.map +1 -1
  150. package/dist/internal.d.ts +3 -0
  151. package/dist/internal.d.ts.map +1 -0
  152. package/dist/internal.js +3 -0
  153. package/dist/internal.js.map +1 -0
  154. package/dist/jsx.d.ts +7 -12
  155. package/dist/jsx.d.ts.map +1 -1
  156. package/dist/jsx.js +18 -19
  157. package/dist/jsx.js.map +1 -1
  158. package/dist/khronos/args.d.ts +7 -6
  159. package/dist/khronos/args.d.ts.map +1 -1
  160. package/dist/khronos/args.js +29 -7
  161. package/dist/khronos/args.js.map +1 -1
  162. package/dist/khronos/doc-context.d.ts +29 -0
  163. package/dist/khronos/doc-context.d.ts.map +1 -0
  164. package/dist/khronos/doc-context.js +29 -0
  165. package/dist/khronos/doc-context.js.map +1 -0
  166. package/dist/khronos/extensions.d.ts +13 -0
  167. package/dist/khronos/extensions.d.ts.map +1 -0
  168. package/dist/khronos/extensions.js +49 -0
  169. package/dist/khronos/extensions.js.map +1 -0
  170. package/dist/khronos/jsdoc.d.ts +17 -11
  171. package/dist/khronos/jsdoc.d.ts.map +1 -1
  172. package/dist/khronos/jsdoc.js +104 -46
  173. package/dist/khronos/jsdoc.js.map +1 -1
  174. package/dist/khronos/model.d.ts +42 -3
  175. package/dist/khronos/model.d.ts.map +1 -1
  176. package/dist/khronos/model.js +218 -63
  177. package/dist/khronos/model.js.map +1 -1
  178. package/dist/khronos/modules.d.ts +9 -6
  179. package/dist/khronos/modules.d.ts.map +1 -1
  180. package/dist/khronos/modules.js +96 -26
  181. package/dist/khronos/modules.js.map +1 -1
  182. package/dist/khronos/notes.d.ts +19 -0
  183. package/dist/khronos/notes.d.ts.map +1 -0
  184. package/dist/khronos/notes.js +35 -0
  185. package/dist/khronos/notes.js.map +1 -0
  186. package/dist/khronos/param-pair.d.ts +1 -1
  187. package/dist/khronos/param-pair.d.ts.map +1 -1
  188. package/dist/khronos/param-pair.js.map +1 -1
  189. package/dist/khronos/pipeline.d.ts +3 -1
  190. package/dist/khronos/pipeline.d.ts.map +1 -1
  191. package/dist/khronos/pipeline.js +59 -28
  192. package/dist/khronos/pipeline.js.map +1 -1
  193. package/dist/khronos/plan.d.ts +5 -5
  194. package/dist/khronos/plan.d.ts.map +1 -1
  195. package/dist/khronos/plan.js +8 -8
  196. package/dist/khronos/plan.js.map +1 -1
  197. package/dist/khronos/render.d.ts +8 -6
  198. package/dist/khronos/render.d.ts.map +1 -1
  199. package/dist/khronos/render.js +35 -26
  200. package/dist/khronos/render.js.map +1 -1
  201. package/dist/khronos/select.d.ts +21 -4
  202. package/dist/khronos/select.d.ts.map +1 -1
  203. package/dist/khronos/select.js +47 -34
  204. package/dist/khronos/select.js.map +1 -1
  205. package/dist/react/element-config.d.ts +16 -10
  206. package/dist/react/element-config.d.ts.map +1 -1
  207. package/dist/react/element-config.js +22 -15
  208. package/dist/react/element-config.js.map +1 -1
  209. package/dist/runner.d.ts +33 -21
  210. package/dist/runner.d.ts.map +1 -1
  211. package/dist/runner.js +19 -20
  212. package/dist/runner.js.map +1 -1
  213. package/dist/store/compile-store.d.ts +2 -3
  214. package/dist/store/compile-store.d.ts.map +1 -1
  215. package/dist/store/compile-store.js +2 -2
  216. package/dist/store/compile-store.js.map +1 -1
  217. package/dist/store/gi/callable-doc.d.ts +11 -0
  218. package/dist/store/gi/callable-doc.d.ts.map +1 -0
  219. package/dist/store/gi/callable-doc.js +62 -0
  220. package/dist/store/gi/callable-doc.js.map +1 -0
  221. package/dist/store/gi/callables.d.ts +3 -1
  222. package/dist/store/gi/callables.d.ts.map +1 -1
  223. package/dist/store/gi/callables.js +16 -16
  224. package/dist/store/gi/callables.js.map +1 -1
  225. package/dist/store/gi/callback.d.ts.map +1 -1
  226. package/dist/store/gi/callback.js +2 -2
  227. package/dist/store/gi/callback.js.map +1 -1
  228. package/dist/store/gi/class.d.ts.map +1 -1
  229. package/dist/store/gi/class.js +5 -3
  230. package/dist/store/gi/class.js.map +1 -1
  231. package/dist/store/gi/closure-invocation.d.ts +4 -0
  232. package/dist/store/gi/closure-invocation.d.ts.map +1 -0
  233. package/dist/store/gi/closure-invocation.js +22 -0
  234. package/dist/store/gi/closure-invocation.js.map +1 -0
  235. package/dist/store/gi/constant.d.ts.map +1 -1
  236. package/dist/store/gi/constant.js +3 -4
  237. package/dist/store/gi/constant.js.map +1 -1
  238. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  239. package/dist/store/gi/constructor-props.js +18 -20
  240. package/dist/store/gi/constructor-props.js.map +1 -1
  241. package/dist/store/gi/doc-spec.d.ts +14 -0
  242. package/dist/store/gi/doc-spec.d.ts.map +1 -0
  243. package/dist/store/gi/doc-spec.js +23 -0
  244. package/dist/store/gi/doc-spec.js.map +1 -0
  245. package/dist/store/gi/enum.d.ts.map +1 -1
  246. package/dist/store/gi/enum.js +29 -16
  247. package/dist/store/gi/enum.js.map +1 -1
  248. package/dist/store/gi/function.d.ts.map +1 -1
  249. package/dist/store/gi/function.js +28 -17
  250. package/dist/store/gi/function.js.map +1 -1
  251. package/dist/store/gi/interface.d.ts.map +1 -1
  252. package/dist/store/gi/interface.js +130 -16
  253. package/dist/store/gi/interface.js.map +1 -1
  254. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  255. package/dist/store/gi/item-comparators.js +3 -5
  256. package/dist/store/gi/item-comparators.js.map +1 -1
  257. package/dist/store/gi/method.d.ts +9 -1
  258. package/dist/store/gi/method.d.ts.map +1 -1
  259. package/dist/store/gi/method.js +92 -47
  260. package/dist/store/gi/method.js.map +1 -1
  261. package/dist/store/gi/param-marshal.d.ts +4 -1
  262. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  263. package/dist/store/gi/param-marshal.js +5 -1
  264. package/dist/store/gi/param-marshal.js.map +1 -1
  265. package/dist/store/gi/pipeline.d.ts.map +1 -1
  266. package/dist/store/gi/pipeline.js +3 -2
  267. package/dist/store/gi/pipeline.js.map +1 -1
  268. package/dist/store/gi/properties.d.ts.map +1 -1
  269. package/dist/store/gi/properties.js +2 -2
  270. package/dist/store/gi/properties.js.map +1 -1
  271. package/dist/store/gi/property-accessor.d.ts +4 -2
  272. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  273. package/dist/store/gi/property-accessor.js +10 -11
  274. package/dist/store/gi/property-accessor.js.map +1 -1
  275. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  276. package/dist/store/gi/record-constructor.js +3 -1
  277. package/dist/store/gi/record-constructor.js.map +1 -1
  278. package/dist/store/gi/record-field-accessor.d.ts +4 -2
  279. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  280. package/dist/store/gi/record-field-accessor.js +6 -11
  281. package/dist/store/gi/record-field-accessor.js.map +1 -1
  282. package/dist/store/gi/record-layout.d.ts.map +1 -1
  283. package/dist/store/gi/record-layout.js +1 -5
  284. package/dist/store/gi/record-layout.js.map +1 -1
  285. package/dist/store/gi/record.d.ts.map +1 -1
  286. package/dist/store/gi/record.js +3 -2
  287. package/dist/store/gi/record.js.map +1 -1
  288. package/dist/store/gi/registration.d.ts +1 -1
  289. package/dist/store/gi/registration.js +2 -2
  290. package/dist/store/gi/registration.js.map +1 -1
  291. package/dist/store/gi/return-wrap.d.ts +1 -1
  292. package/dist/store/gi/return-wrap.d.ts.map +1 -1
  293. package/dist/store/gi/return-wrap.js +4 -4
  294. package/dist/store/gi/return-wrap.js.map +1 -1
  295. package/dist/store/gi/runtime-override.d.ts +2 -1
  296. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  297. package/dist/store/gi/runtime-override.js +8 -5
  298. package/dist/store/gi/runtime-override.js.map +1 -1
  299. package/dist/store/gi/signal.d.ts.map +1 -1
  300. package/dist/store/gi/signal.js +27 -31
  301. package/dist/store/gi/signal.js.map +1 -1
  302. package/dist/store/gi/value-marshalable.d.ts +1 -10
  303. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  304. package/dist/store/gi/value-marshalable.js +1 -10
  305. package/dist/store/gi/value-marshalable.js.map +1 -1
  306. package/dist/store/gi/vtable.d.ts +16 -1
  307. package/dist/store/gi/vtable.d.ts.map +1 -1
  308. package/dist/store/gi/vtable.js +214 -51
  309. package/dist/store/gi/vtable.js.map +1 -1
  310. package/dist/store/gi-store.d.ts +2 -3
  311. package/dist/store/gi-store.d.ts.map +1 -1
  312. package/dist/store/gi-store.js.map +1 -1
  313. package/dist/store/jsx/element-components.d.ts +1 -3
  314. package/dist/store/jsx/element-components.d.ts.map +1 -1
  315. package/dist/store/jsx/element-components.js +6 -8
  316. package/dist/store/jsx/element-components.js.map +1 -1
  317. package/dist/store/jsx/element-prop-imports.d.ts +1 -4
  318. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -1
  319. package/dist/store/jsx/element-prop-imports.js +0 -2
  320. package/dist/store/jsx/element-prop-imports.js.map +1 -1
  321. package/dist/store/jsx/element-prop-types.d.ts +3 -1
  322. package/dist/store/jsx/element-prop-types.d.ts.map +1 -1
  323. package/dist/store/jsx/element-prop-types.js +7 -2
  324. package/dist/store/jsx/element-prop-types.js.map +1 -1
  325. package/dist/store/jsx/generated-elements.d.ts +29 -0
  326. package/dist/store/jsx/generated-elements.d.ts.map +1 -0
  327. package/dist/store/jsx/generated-elements.js +30 -0
  328. package/dist/store/jsx/generated-elements.js.map +1 -0
  329. package/dist/store/jsx/intrinsic-elements.d.ts +4 -0
  330. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -1
  331. package/dist/store/jsx/intrinsic-elements.js.map +1 -1
  332. package/dist/store/jsx/jsx.d.ts.map +1 -1
  333. package/dist/store/jsx/jsx.js +13 -12
  334. package/dist/store/jsx/jsx.js.map +1 -1
  335. package/dist/store/jsx/metadata.js +9 -9
  336. package/dist/store/jsx/metadata.js.map +1 -1
  337. package/dist/store/jsx/omitted-props.d.ts +2 -4
  338. package/dist/store/jsx/omitted-props.d.ts.map +1 -1
  339. package/dist/store/jsx/omitted-props.js +2 -4
  340. package/dist/store/jsx/omitted-props.js.map +1 -1
  341. package/dist/store/jsx/pipeline.d.ts +4 -2
  342. package/dist/store/jsx/pipeline.d.ts.map +1 -1
  343. package/dist/store/jsx/pipeline.js +3 -2
  344. package/dist/store/jsx/pipeline.js.map +1 -1
  345. package/dist/store/jsx/props.d.ts +1 -7
  346. package/dist/store/jsx/props.d.ts.map +1 -1
  347. package/dist/store/jsx/props.js +16 -8
  348. package/dist/store/jsx/props.js.map +1 -1
  349. package/dist/store/jsx-store.d.ts +2 -3
  350. package/dist/store/jsx-store.d.ts.map +1 -1
  351. package/dist/store/jsx-store.js +3 -3
  352. package/dist/store/jsx-store.js.map +1 -1
  353. package/dist/store/resolve-store.d.ts +28 -0
  354. package/dist/store/resolve-store.d.ts.map +1 -0
  355. package/dist/store/resolve-store.js +65 -0
  356. package/dist/store/resolve-store.js.map +1 -0
  357. package/dist/store/store-fs.d.ts +5 -1
  358. package/dist/store/store-fs.d.ts.map +1 -1
  359. package/dist/store/store-fs.js +6 -4
  360. package/dist/store/store-fs.js.map +1 -1
  361. package/dist/writer/context.d.ts +2 -1
  362. package/dist/writer/context.d.ts.map +1 -1
  363. package/dist/writer/context.js +3 -0
  364. package/dist/writer/context.js.map +1 -1
  365. package/dist/writer/doc-tags.d.ts +21 -0
  366. package/dist/writer/doc-tags.d.ts.map +1 -0
  367. package/dist/writer/doc-tags.js +38 -0
  368. package/dist/writer/doc-tags.js.map +1 -0
  369. package/dist/writer/doc.d.ts +3 -1
  370. package/dist/writer/doc.d.ts.map +1 -1
  371. package/dist/writer/doc.js +19 -6
  372. package/dist/writer/doc.js.map +1 -1
  373. package/dist/writer/gtk-doc.d.ts +1 -1
  374. package/dist/writer/gtk-doc.d.ts.map +1 -1
  375. package/dist/writer/gtk-doc.js +64 -15
  376. package/dist/writer/gtk-doc.js.map +1 -1
  377. package/dist/writer/module.d.ts +8 -2
  378. package/dist/writer/module.d.ts.map +1 -1
  379. package/dist/writer/module.js +13 -1
  380. package/dist/writer/module.js.map +1 -1
  381. package/overrides/gdk/rgba.ts.ejs +26 -0
  382. package/overrides/gobject/object.ts.ejs +56 -11
  383. package/overrides/gobject/value.ts.ejs +7 -0
  384. package/overrides/graphene/structs.ts.ejs +55 -0
  385. package/package.json +7 -11
  386. package/src/analysis/descriptor-render.ts +67 -73
  387. package/src/analysis/descriptor.ts +13 -16
  388. package/src/analysis/inheritance.ts +35 -34
  389. package/src/analysis/nul-terminated-bytes.ts +31 -0
  390. package/src/analysis/param-capability.ts +172 -0
  391. package/src/analysis/param-structure.ts +90 -32
  392. package/src/analysis/ts-type.ts +4 -6
  393. package/src/analysis/type-shape.ts +24 -0
  394. package/src/compile.ts +3 -2
  395. package/src/docs/api-reference.ts +162 -28
  396. package/src/docs/element-page.ts +53 -47
  397. package/src/docs/handwritten-props.ts +230 -0
  398. package/src/docs/pipeline.ts +10 -10
  399. package/src/docs/render.ts +153 -39
  400. package/src/docs/symbol-page.ts +230 -80
  401. package/src/fingerprint.ts +8 -14
  402. package/src/gi.ts +4 -11
  403. package/src/gir/ancestry.ts +15 -1
  404. package/src/gir/annotations.ts +37 -0
  405. package/src/gir/callback.ts +2 -0
  406. package/src/gir/class.ts +42 -4
  407. package/src/gir/enum.ts +30 -10
  408. package/src/gir/field.ts +24 -13
  409. package/src/gir/function.ts +15 -0
  410. package/src/gir/gir-path.ts +7 -0
  411. package/src/gir/libraries.ts +23 -2
  412. package/src/gir/library.ts +51 -2
  413. package/src/gir/namespace.ts +41 -5
  414. package/src/gir/parameter.ts +47 -7
  415. package/src/gir/parse.ts +8 -2
  416. package/src/gir/primitives.ts +1 -0
  417. package/src/gir/property.ts +18 -3
  418. package/src/gir/record.ts +24 -2
  419. package/src/gir/size.ts +8 -6
  420. package/src/gir/type-id.ts +51 -7
  421. package/src/gir/type-ref.ts +2 -1
  422. package/src/gir/type.ts +50 -6
  423. package/src/index.ts +18 -16
  424. package/src/internal.ts +2 -0
  425. package/src/jsx.ts +26 -26
  426. package/src/khronos/args.ts +37 -14
  427. package/src/khronos/doc-context.ts +62 -0
  428. package/src/khronos/extensions.ts +85 -0
  429. package/src/khronos/jsdoc.ts +152 -56
  430. package/src/khronos/model.ts +314 -69
  431. package/src/khronos/modules.ts +134 -40
  432. package/src/khronos/notes.ts +74 -0
  433. package/src/khronos/param-pair.ts +1 -1
  434. package/src/khronos/pipeline.ts +95 -42
  435. package/src/khronos/plan.ts +12 -13
  436. package/src/khronos/render.ts +62 -50
  437. package/src/khronos/select.ts +91 -50
  438. package/src/react/element-config.ts +21 -18
  439. package/src/runner.ts +51 -40
  440. package/src/store/compile-store.ts +4 -5
  441. package/src/store/gi/callable-doc.ts +102 -0
  442. package/src/store/gi/callables.ts +23 -17
  443. package/src/store/gi/callback.ts +3 -2
  444. package/src/store/gi/class.ts +6 -3
  445. package/src/store/gi/closure-invocation.ts +26 -0
  446. package/src/store/gi/constant.ts +3 -6
  447. package/src/store/gi/constructor-props.ts +19 -23
  448. package/src/store/gi/doc-spec.ts +38 -0
  449. package/src/store/gi/enum.ts +55 -20
  450. package/src/store/gi/function.ts +44 -26
  451. package/src/store/gi/interface.ts +214 -26
  452. package/src/store/gi/item-comparators.ts +3 -5
  453. package/src/store/gi/method.ts +126 -68
  454. package/src/store/gi/param-marshal.ts +15 -1
  455. package/src/store/gi/pipeline.ts +7 -2
  456. package/src/store/gi/properties.ts +3 -2
  457. package/src/store/gi/property-accessor.ts +14 -11
  458. package/src/store/gi/record-constructor.ts +6 -1
  459. package/src/store/gi/record-field-accessor.ts +9 -13
  460. package/src/store/gi/record-layout.ts +1 -5
  461. package/src/store/gi/record.ts +8 -2
  462. package/src/store/gi/registration.ts +3 -3
  463. package/src/store/gi/return-wrap.ts +5 -5
  464. package/src/store/gi/runtime-override.ts +13 -6
  465. package/src/store/gi/signal.ts +36 -37
  466. package/src/store/gi/value-marshalable.ts +1 -10
  467. package/src/store/gi/vtable.ts +361 -60
  468. package/src/store/gi-store.ts +2 -4
  469. package/src/store/jsx/element-components.ts +8 -11
  470. package/src/store/jsx/element-prop-imports.ts +6 -5
  471. package/src/store/jsx/element-prop-types.ts +10 -2
  472. package/src/store/jsx/generated-elements.ts +60 -0
  473. package/src/store/jsx/intrinsic-elements.ts +4 -0
  474. package/src/store/jsx/jsx.ts +15 -13
  475. package/src/store/jsx/metadata.ts +10 -10
  476. package/src/store/jsx/omitted-props.ts +2 -4
  477. package/src/store/jsx/pipeline.ts +6 -4
  478. package/src/store/jsx/props.ts +22 -9
  479. package/src/store/jsx-store.ts +5 -7
  480. package/src/store/resolve-store.ts +100 -0
  481. package/src/store/store-fs.ts +12 -5
  482. package/src/writer/context.ts +5 -1
  483. package/src/writer/doc-tags.ts +70 -0
  484. package/src/writer/doc.ts +29 -6
  485. package/src/writer/gtk-doc.ts +82 -15
  486. package/src/writer/module.ts +25 -2
package/src/runner.ts CHANGED
@@ -1,16 +1,14 @@
1
1
  import { mkdirSync, writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import type { GiStoreOptions } from "./store/gi-store.js";
4
- import type { JsxStoreOptions } from "./store/jsx-store.js";
3
+ import type { ModuleExport } from "./react/element-config.js";
5
4
  import type { OmittedProps } from "./store/jsx/omitted-props.js";
5
+ import type { StoreOptions } from "./store/store-fs.js";
6
6
  import { checkModules } from "./compile.js";
7
7
  import { isGiStoreFresh } from "./fingerprint.js";
8
8
  import { runGiCodegen } from "./gi.js";
9
9
  import { Library } from "./gir/library.js";
10
10
  import { generateGlModules, type GlGenerationReport } from "./khronos/pipeline.js";
11
11
 
12
- type ModuleExport = { module: string; export: string };
13
-
14
12
  type GlCodegenOptions = {
15
13
  registryPath: string;
16
14
  overrideExports: Set<string>;
@@ -18,58 +16,71 @@ type GlCodegenOptions = {
18
16
  resolveFrom: string;
19
17
  };
20
18
 
19
+ /** What to generate and where to write it. */
21
20
  type CodegenRunnerOptions = {
22
- libraries?: string[];
23
- girPath?: string[];
24
- gi?: GiStoreOptions;
25
- jsx?: JsxStoreOptions | undefined;
21
+ /** GIR library identifiers such as `"Gtk-4.0"`; a `"*"` selection must be expanded before it gets here. */
22
+ libraries: string[];
23
+ /** Directories to search for `.gir` files. */
24
+ girPath: string[];
25
+ /** Where to write and link the `@gtkx/gi` store. */
26
+ gi: StoreOptions;
27
+ /** Where to write and link the `@gtkx/jsx` store; omit to generate the gi store alone. */
28
+ jsx?: StoreOptions | undefined;
29
+ /** Subexport names of the installed `@gtkx/react`, whose element config shapes the jsx store. */
26
30
  reactSubexports?: string[];
31
+ /** Component wrappers the project layers over the built-ins, keyed by GLib type name. */
27
32
  userComponents?: Record<string, ModuleExport>;
33
+ /** GLib type names whose GObject their parent container creates, added to the framework's own. */
28
34
  userLazyElements?: string[];
35
+ /** Base props interfaces the project's elements extend, keyed by GLib type name. */
29
36
  userProps?: Record<string, ModuleExport>;
30
- userOmitProps?: OmittedProps;
31
- gl?: GlCodegenOptions;
32
- force?: boolean;
37
+ /** Props the project drops from the generated element props, keyed by GLib type name. */
38
+ userOmittedProps?: OmittedProps;
39
+ /** Regenerates both stores even when their fingerprints are fresh. */
40
+ isForced?: boolean;
33
41
  };
34
42
 
43
+ /** What a `runCodegen` run produced. */
35
44
  type CodegenRunnerResult = {
36
- regenerated: boolean;
45
+ /** Whether either store was rewritten; false means both were already fresh. */
46
+ isRegenerated: boolean;
47
+ /** How many namespaces the gi store was written with, zero when it was already fresh. */
37
48
  namespaces: number;
49
+ /** How many JSX elements the jsx store binds, zero when no jsx store was requested. */
38
50
  intrinsicElements: number;
51
+ /** Wall-clock duration of the run, in milliseconds. */
39
52
  duration: number;
40
- gl?: GlGenerationReport | undefined;
41
53
  };
42
54
 
43
55
  type StoreResult = {
44
- regenerated: boolean;
56
+ isRegenerated: boolean;
45
57
  namespaces: number;
46
58
  intrinsicElements: number;
47
59
  };
48
60
 
49
61
  /**
50
- * Runs the `@gtkx` code generators, producing the `@gtkx/gi`, `@gtkx/jsx`, and `@gtkx/gl` bindings from the
51
- * configured GObject-introspection libraries and OpenGL registry. The gi store is regenerated only when its
52
- * fingerprint is stale unless `options.force` is set, then the jsx store is regenerated when the gi store or
53
- * the React element config changed; the OpenGL modules are regenerated whenever `options.gl` is provided.
62
+ * Writes and links a project's `@gtkx/gi` and `@gtkx/jsx` stores from the given GObject-Introspection
63
+ * libraries. The gi store is rewritten only when its GIR inputs changed, and the jsx store only when the gi
64
+ * store or the React element config changed, unless `options.isForced` is set. Pass the spread of
65
+ * `resolveStore(projectRoot)` for everything but `libraries` and `girPath`.
54
66
  *
55
- * @param options - What to generate and where to write it.
67
+ * @param options What to generate and where to write it.
56
68
  * @returns A summary of what was regenerated and how long the run took.
69
+ * @throws If `girPath` is empty, which would otherwise generate nothing and report success.
57
70
  */
58
71
  const runCodegen = async (options: CodegenRunnerOptions): Promise<CodegenRunnerResult> => {
59
72
  const start = Date.now();
60
- const gl = options.gl === undefined ? undefined : emitGlModules(options.gl);
61
73
  const store = await emitStores(options);
62
74
 
63
75
  return {
64
- regenerated: store.regenerated,
76
+ isRegenerated: store.isRegenerated,
65
77
  namespaces: store.namespaces,
66
78
  intrinsicElements: store.intrinsicElements,
67
79
  duration: Date.now() - start,
68
- gl,
69
80
  };
70
81
  };
71
82
 
72
- const emitGlModules = (options: GlCodegenOptions): GlGenerationReport => {
83
+ const runGlCodegen = (options: GlCodegenOptions): GlGenerationReport => {
73
84
  const { files, report } = generateGlModules({
74
85
  registryPath: options.registryPath,
75
86
  overrideExports: options.overrideExports,
@@ -97,24 +108,24 @@ const jsxUserOptions = (
97
108
  userComponents: Record<string, ModuleExport>;
98
109
  userLazyElements: string[];
99
110
  userProps: Record<string, ModuleExport>;
100
- userOmitProps: OmittedProps;
111
+ userOmittedProps: OmittedProps;
101
112
  } => ({
102
113
  reactSubexports: options.reactSubexports ?? [],
103
114
  userComponents: options.userComponents ?? {},
104
115
  userLazyElements: options.userLazyElements ?? [],
105
116
  userProps: options.userProps ?? {},
106
- userOmitProps: options.userOmitProps ?? {},
117
+ userOmittedProps: options.userOmittedProps ?? {},
107
118
  });
108
119
 
109
120
  const emitJsxStore = async (input: {
110
121
  options: CodegenRunnerOptions;
111
- jsx: JsxStoreOptions;
112
- gi: GiStoreOptions;
122
+ jsx: StoreOptions;
123
+ gi: StoreOptions;
113
124
  loadLibrary: () => Library;
114
- giRegenerated: boolean;
125
+ isGiRegenerated: boolean;
115
126
  namespaces: number;
116
127
  }): Promise<StoreResult> => {
117
- const { options, jsx, gi, loadLibrary, giRegenerated, namespaces } = input;
128
+ const { options, jsx, gi, loadLibrary, isGiRegenerated, namespaces } = input;
118
129
  const { runJsxCodegen } = await import("./jsx.js");
119
130
 
120
131
  const jsxResult = await runJsxCodegen({
@@ -122,12 +133,12 @@ const emitJsxStore = async (input: {
122
133
  jsx,
123
134
  giStoreDir: gi.storeDir,
124
135
  ...jsxUserOptions(options),
125
- giRegenerated,
126
- force: options.force === true,
136
+ isGiRegenerated,
137
+ isForced: options.isForced === true,
127
138
  });
128
139
 
129
140
  return {
130
- regenerated: giRegenerated || jsxResult.regenerated,
141
+ isRegenerated: isGiRegenerated || jsxResult.isRegenerated,
131
142
  namespaces,
132
143
  intrinsicElements: jsxResult.intrinsicElementCount,
133
144
  };
@@ -135,35 +146,35 @@ const emitJsxStore = async (input: {
135
146
 
136
147
  const emitStoresWithConfig = async (config: {
137
148
  options: CodegenRunnerOptions;
138
- gi: GiStoreOptions;
139
- jsx: JsxStoreOptions | undefined;
149
+ gi: StoreOptions;
150
+ jsx: StoreOptions | undefined;
140
151
  libraries: string[];
141
152
  girPath: string[];
142
153
  }): Promise<StoreResult> => {
143
154
  const { options, gi, jsx, libraries, girPath } = config;
144
155
  let library: Library | undefined;
145
156
  const loadLibrary = (): Library => (library ??= Library.load(libraries, girPath));
146
- const isGiRegenerated = options.force === true || !isGiStoreFresh(gi.storeDir, libraries, girPath);
157
+ const isGiRegenerated = options.isForced === true || !isGiStoreFresh(gi.storeDir, libraries, girPath);
147
158
 
148
159
  const namespaces = isGiRegenerated
149
160
  ? runGiCodegen(loadLibrary(), { gi, libraries, girPath })
150
161
  : 0;
151
162
 
152
163
  if (jsx === undefined) {
153
- return { regenerated: isGiRegenerated, namespaces, intrinsicElements: 0 };
164
+ return { isRegenerated: isGiRegenerated, namespaces, intrinsicElements: 0 };
154
165
  }
155
166
 
156
- return emitJsxStore({ options, jsx, gi, loadLibrary, giRegenerated: isGiRegenerated, namespaces });
167
+ return emitJsxStore({ options, jsx, gi, loadLibrary, isGiRegenerated, namespaces });
157
168
  };
158
169
 
159
170
  const emitStores = async (options: CodegenRunnerOptions): Promise<StoreResult> => {
160
171
  const { gi, jsx, libraries, girPath } = options;
161
172
 
162
- if (gi === undefined || libraries === undefined || girPath === undefined) {
163
- return { regenerated: false, namespaces: 0, intrinsicElements: 0 };
173
+ if (girPath.length === 0) {
174
+ throw new Error("codegen needs at least one GIR search path; pass the result of resolveGirPath");
164
175
  }
165
176
 
166
177
  return emitStoresWithConfig({ options, gi, jsx, libraries, girPath });
167
178
  };
168
179
 
169
- export { runCodegen, type GlCodegenOptions, type CodegenRunnerOptions, type CodegenRunnerResult };
180
+ export { runCodegen, runGlCodegen, type CodegenRunnerOptions, type CodegenRunnerResult };
@@ -6,8 +6,7 @@ type CompileStoreParams = {
6
6
  storeDir: string;
7
7
  files: SourceModule[];
8
8
  packageName: string;
9
- /** Declare `virtual:gtkx-config` for the typecheck, needed when it follows imports into `@gtkx/react` source. */
10
- configEnv?: boolean;
9
+ requiresEnvReference?: boolean;
11
10
  };
12
11
 
13
12
  const EMIT_OPTIONS = {
@@ -32,14 +31,14 @@ const writeEnvReference = (storeDir: string): (() => void) => {
32
31
  const compileStore = (params: CompileStoreParams): void => {
33
32
  const fileNames = params.files.map((file) => file.fileName);
34
33
 
35
- const removeEnvReference = params.configEnv === true
34
+ const removeEnvReference = params.requiresEnvReference === true
36
35
  ? writeEnvReference(params.storeDir)
37
36
  : (): void => undefined;
38
37
 
39
38
  try {
40
39
  compileProject({
41
40
  projectDir: params.storeDir,
42
- fileNames: params.configEnv === true ? [ENV_REFERENCE_FILE, ...fileNames] : fileNames,
41
+ fileNames: params.requiresEnvReference === true ? [ENV_REFERENCE_FILE, ...fileNames] : fileNames,
43
42
  compilerOptions: EMIT_OPTIONS,
44
43
  label: `the generated ${params.packageName} store`,
45
44
  });
@@ -52,4 +51,4 @@ const compileStore = (params: CompileStoreParams): void => {
52
51
  }
53
52
  };
54
53
 
55
- export { compileStore, type CompileStoreParams };
54
+ export { compileStore };
@@ -0,0 +1,102 @@
1
+ import type { GirFunction } from "../../gir/function.js";
2
+ import type { GirCallable } from "../../gir/parameter.js";
3
+ import type { ModuleContext } from "../../writer/context.js";
4
+ import type { JsDocSpec } from "../../writer/doc.js";
5
+ import { shouldOmitPrimaryReturn } from "../../analysis/descriptor-render.js";
6
+ import { nulTerminatedByteParams } from "../../analysis/nul-terminated-bytes.js";
7
+ import {
8
+ documentedParameters,
9
+ type InputParameter,
10
+ parameterIdentifier,
11
+ renamesWithInstance,
12
+ } from "../../analysis/param-structure.js";
13
+ import { renderJsDoc } from "../../writer/doc.js";
14
+ import { annotationSpec, THROWS_TEXT } from "./doc-spec.js";
15
+ import { isCallbackParameter, returnedOutParameters } from "./method.js";
16
+
17
+ type CallableDocOptions = {
18
+ finishFn?: GirFunction | undefined;
19
+ renames?: Map<string, string> | undefined;
20
+ };
21
+
22
+ const WHITESPACE_RUN_PATTERN = /\s+/g;
23
+
24
+ const nulTerminatedNote = (context: ModuleContext, callable: GirCallable): string | undefined => {
25
+ const parameters = nulTerminatedByteParams(context.library, callable);
26
+
27
+ if (parameters.length === 0) {
28
+ return undefined;
29
+ }
30
+
31
+ const names = parameters.map((parameter) => `\`${parameter.name}\``).join(", ");
32
+
33
+ return [
34
+ `The C function reads ${names} as a NUL-terminated string, so it stops at the`,
35
+ "first zero byte and drops every byte after it without reporting an error.",
36
+ "Pass binary data through a `GLib.Bytes` route such as `GLib.Variant.newFromBytes`",
37
+ "instead.",
38
+ ].join("\n");
39
+ };
40
+
41
+ const tupleBullet = (name: string, doc: string | undefined): string | undefined => {
42
+ const text = (doc ?? "").replaceAll(WHITESPACE_RUN_PATTERN, " ").trim();
43
+
44
+ return text.length === 0 ? undefined : `- \`${name}\`: ${text}`;
45
+ };
46
+
47
+ const tupleReturnsText = (primary: string | undefined, outs: InputParameter[]): string | undefined => {
48
+ const bullets = [
49
+ tupleBullet("result", primary),
50
+ ...outs.map(({ parameter, index }) => tupleBullet(parameterIdentifier(parameter, index), parameter.doc)),
51
+ ].filter((bullet) => bullet !== undefined);
52
+
53
+ return bullets.length === 0 ? undefined : `Tuple of:\n\n${bullets.join("\n")}`;
54
+ };
55
+
56
+ const returnsText = (context: ModuleContext, fn: GirFunction): string | undefined => {
57
+ const outs = returnedOutParameters(context, fn);
58
+ const isPrimaryOmitted = shouldOmitPrimaryReturn(context.library, fn.returnValue);
59
+ const primary = isPrimaryOmitted ? undefined : fn.returnValue.doc;
60
+
61
+ if (outs.length === 0) {
62
+ return primary;
63
+ }
64
+
65
+ if (isPrimaryOmitted && outs.length === 1) {
66
+ return outs[0]?.parameter.doc;
67
+ }
68
+
69
+ return tupleReturnsText(primary, outs);
70
+ };
71
+
72
+ const docIdentifiers = (callable: GirFunction, renames: Map<string, string> | undefined): Map<string, string> => {
73
+ const identifiers = renamesWithInstance(callable.parameters, callable.instance);
74
+ const overrides = renames ?? new Map<string, string>();
75
+
76
+ for (const [girName, declaredName] of overrides) {
77
+ identifiers.set(girName, declaredName);
78
+ }
79
+
80
+ return identifiers;
81
+ };
82
+
83
+ const canCallableThrow = (callable: GirFunction, finishFn: GirFunction | undefined): boolean =>
84
+ callable.throws || finishFn?.throws === true;
85
+
86
+ const callableSpec = (context: ModuleContext, callable: GirFunction, options: CallableDocOptions): JsDocSpec => ({
87
+ ...annotationSpec(callable.annotations),
88
+ identifiers: docIdentifiers(callable, options.renames),
89
+ params: documentedParameters(
90
+ context.library,
91
+ callable,
92
+ (parameter) => options.finishFn !== undefined && isCallbackParameter(context, parameter),
93
+ options.renames,
94
+ ),
95
+ returns: returnsText(context, options.finishFn ?? callable),
96
+ throws: canCallableThrow(callable, options.finishFn) ? THROWS_TEXT : undefined,
97
+ });
98
+
99
+ const callableDoc = (context: ModuleContext, callable: GirFunction, options: CallableDocOptions = {}): string =>
100
+ renderJsDoc(callable.doc, nulTerminatedNote(context, callable), callableSpec(context, callable, options));
101
+
102
+ export { callableDoc, callableSpec };
@@ -1,10 +1,11 @@
1
1
  import { camelCase, toCamelIdentifier, uniqBy } from "@gtkx/utils";
2
2
  import type { GirFunction } from "../../gir/function.js";
3
3
  import type { ModuleContext } from "../../writer/context.js";
4
- import { hasCallerAllocatedArrayLength } from "../../analysis/param-structure.js";
5
- import { renderJsDoc } from "../../writer/doc.js";
4
+ import type { JsDocSpec } from "../../writer/doc.js";
5
+ import { hasUnmarshalableParam } from "../../analysis/param-capability.js";
6
6
  import { renderBlock } from "../../writer/emit.js";
7
7
  import { matchAsyncFinish } from "./async.js";
8
+ import { callableDoc, callableSpec } from "./callable-doc.js";
8
9
  import { renderFnExpression } from "./function.js";
9
10
  import { gtypeMemberDeclaration } from "./gtype-binding.js";
10
11
  import {
@@ -16,7 +17,7 @@ import {
16
17
  renderPromisifiedBody,
17
18
  renderPromisifiedSignature,
18
19
  } from "./method.js";
19
- import { renderRuntimeOverride } from "./runtime-override.js";
20
+ import { renderRuntimeOverride, runtimeOverrideRenames } from "./runtime-override.js";
20
21
 
21
22
  type Callables = {
22
23
  constructors: GirFunction[];
@@ -34,7 +35,7 @@ type CallableMemberOptions = {
34
35
  resolveName: (callable: GirFunction) => string | undefined;
35
36
  isStatic: boolean;
36
37
  returnTypeOverride?: string | undefined;
37
- allowRuntimeOverride?: boolean;
38
+ canUseRuntimeOverride?: boolean;
38
39
  };
39
40
 
40
41
  type StaticEntryOptions = {
@@ -64,7 +65,7 @@ type PlainTypeMembersOptions = {
64
65
 
65
66
  const renderInstanceMethodSignature: InstanceMemberRenderer = instanceMemberRenderer(
66
67
  (context, callable, { name, finishFn }) =>
67
- `${renderJsDoc(callable.doc)}${memberSignatureText(context, callable, name, { finishFn })};`,
68
+ `${memberDoc(context, callable, finishFn)}${memberSignatureText(context, callable, name, { finishFn })};`,
68
69
  );
69
70
 
70
71
  const renderClassInstanceMember: InstanceMemberRenderer = instanceMemberRenderer(
@@ -78,6 +79,12 @@ const renderClassInstanceMember: InstanceMemberRenderer = instanceMemberRenderer
78
79
  }),
79
80
  );
80
81
 
82
+ const memberDoc = (context: ModuleContext, callable: GirFunction, finishFn: GirFunction | undefined): string =>
83
+ callableDoc(context, callable, { finishFn });
84
+
85
+ const instanceMemberSpec = (context: ModuleContext, callable: GirFunction, scope: InstanceScope): JsDocSpec =>
86
+ callableSpec(context, callable, { finishFn: matchFinishFunction(context, callable, scope) });
87
+
81
88
  const instanceScope = (ownerName: string, callables: Callables): InstanceScope => ({
82
89
  ownerName,
83
90
  methodByName: indexMethodsByName(callables.methods),
@@ -96,11 +103,7 @@ const renderBinding = (
96
103
  context: ModuleContext,
97
104
  callable: GirFunction,
98
105
  ): { text: string; cIdentifier: string } | undefined => {
99
- if (!callable.introspectable) {
100
- return undefined;
101
- }
102
-
103
- if (callable.shadowedBy !== undefined) {
106
+ if (!isEmittableCallable(context, callable)) {
104
107
  return undefined;
105
108
  }
106
109
 
@@ -159,9 +162,9 @@ const runtimeOverrideMember = (
159
162
  callable: GirFunction,
160
163
  name: string,
161
164
  doc: string,
162
- allow: boolean | undefined,
165
+ canUseRuntimeOverride: boolean | undefined,
163
166
  ): string | undefined => {
164
- if (allow !== true) {
167
+ if (canUseRuntimeOverride !== true) {
165
168
  return undefined;
166
169
  }
167
170
 
@@ -182,8 +185,9 @@ const renderCallableMember = (
182
185
  }
183
186
 
184
187
  const { cIdentifier, name } = resolved;
185
- const doc = renderJsDoc(callable.doc);
186
- const override = runtimeOverrideMember(callable, name, doc, options.allowRuntimeOverride);
188
+ const renames = options.canUseRuntimeOverride === true ? runtimeOverrideRenames(callable) : undefined;
189
+ const doc = callableDoc(context, callable, { renames });
190
+ const override = runtimeOverrideMember(callable, name, doc, options.canUseRuntimeOverride);
187
191
 
188
192
  if (override !== undefined) {
189
193
  return override;
@@ -240,7 +244,7 @@ const renderInstanceMethod = (
240
244
  renderCallableMember(context, callable, {
241
245
  resolveName: (member) => nameOverride ?? methodExportName(member),
242
246
  isStatic: false,
243
- allowRuntimeOverride: true,
247
+ canUseRuntimeOverride: true,
244
248
  });
245
249
 
246
250
  const resolveInstanceMember = (
@@ -349,7 +353,7 @@ const renderPromisifiedCallable = (
349
353
  const prefix = member.isStatic ? "static " : "";
350
354
  const header = `${prefix}${member.name}(${signature}): ${returnType}`;
351
355
 
352
- return `${renderJsDoc(callable.doc)}${renderBlock(header, body)}`;
356
+ return `${memberDoc(context, callable, finishFn)}${renderBlock(header, body)}`;
353
357
  };
354
358
 
355
359
  const indexMethodsByName = (methods: GirFunction[]): Map<string, GirFunction> => {
@@ -366,7 +370,7 @@ const isEmittableCallable = (context: ModuleContext, callable: GirFunction): boo
366
370
  callable.introspectable &&
367
371
  callable.shadowedBy === undefined &&
368
372
  callable.cIdentifier !== undefined &&
369
- !hasCallerAllocatedArrayLength(context.library, callable);
373
+ !hasUnmarshalableParam(context, callable);
370
374
 
371
375
  const constructorMemberName = (girName: string): string | undefined => {
372
376
  const camel = camelCase(girName);
@@ -497,6 +501,7 @@ const renderPlainTypeMembers = (
497
501
  export {
498
502
  renderInstanceMethodSignature,
499
503
  renderClassInstanceMember,
504
+ instanceMemberSpec,
500
505
  instanceScope,
501
506
  dedupeCallables,
502
507
  generateBindings,
@@ -508,5 +513,6 @@ export {
508
513
  renderStaticHead,
509
514
  renderPlainTypeMembers,
510
515
  type Callables,
516
+ type InstanceMemberRenderer,
511
517
  type InstanceScope,
512
518
  };
@@ -1,6 +1,6 @@
1
1
  import type { ModuleContext } from "../../writer/context.js";
2
2
  import { callbackAsFunction, type GirCallback } from "../../gir/callback.js";
3
- import { renderJsDoc } from "../../writer/doc.js";
3
+ import { callableDoc } from "./callable-doc.js";
4
4
  import { renderMethodReturnType, renderMethodSignature } from "./method.js";
5
5
 
6
6
  const generateCallback = (context: ModuleContext, callback: GirCallback): void => {
@@ -17,7 +17,8 @@ const generateCallback = (context: ModuleContext, callback: GirCallback): void =
17
17
  const returnType = renderMethodReturnType(context, fn);
18
18
 
19
19
  context.module.appendDeclaration(
20
- `${renderJsDoc(callback.doc)}export type ${callback.name} = (${signature}) => ${returnType};`,
20
+ `${callableDoc(context, fn)}export type ${callback.name} = (${signature}) => ${returnType};`,
21
+ context.declaredType(callback.name),
21
22
  );
22
23
  };
23
24
 
@@ -11,7 +11,6 @@ import {
11
11
  } from "../../analysis/inheritance.js";
12
12
  import { ancestorChain, type ResolvedAncestor } from "../../gir/ancestry.js";
13
13
  import { splitOptionalNamespace } from "../../gir/type-ref.js";
14
- import { renderJsDoc } from "../../writer/doc.js";
15
14
  import { indentMembers } from "../../writer/emit.js";
16
15
  import {
17
16
  type Callables,
@@ -24,13 +23,14 @@ import {
24
23
  renderStaticHead,
25
24
  } from "./callables.js";
26
25
  import { renderClassConstructor, renderConstructorPropsInterface } from "./constructor-props.js";
26
+ import { getDoc } from "./doc-spec.js";
27
27
  import { gtypeMemberDeclaration, renderSourceGtype } from "./gtype-binding.js";
28
28
  import { methodExportName } from "./method.js";
29
29
  import { renderPropertyDeclarations } from "./properties.js";
30
30
  import { renderResolvedPropertyAccessor, resolveAccessor, type ResolvedAccessor } from "./property-accessor.js";
31
31
  import { appendWrapperClassRegistration } from "./registration.js";
32
32
  import { renderSignalDeclarations, renderSignalMembers } from "./signal.js";
33
- import { renderVfuncMetadata } from "./vtable.js";
33
+ import { renderVfuncMembers, renderVfuncMetadata } from "./vtable.js";
34
34
 
35
35
  type ImplementedRef = {
36
36
  typeRef: string;
@@ -84,9 +84,11 @@ const generateClass = (context: ModuleContext, klass: GirClass): void => {
84
84
  const implementsClause = typeRefs.length === 0 ? "" : ` implements ${typeRefs.join(", ")}`;
85
85
  const { members, accessors } = renderClassMembers(context, klass, callables, parentExpression !== undefined);
86
86
  const body = indentMembers(members);
87
+ const doc = getDoc(klass);
87
88
 
88
89
  context.module.appendDeclaration(
89
- `${renderJsDoc(klass.doc)}export class ${className}${extendsClause}${implementsClause} {\n${body}\n}`,
90
+ `${doc}export class ${className}${extendsClause}${implementsClause} {\n${body}\n}`,
91
+ context.declaredType(className),
90
92
  );
91
93
 
92
94
  context.module.appendDeclaration(renderConstructorPropsInterface(context, klass, className));
@@ -152,6 +154,7 @@ const renderClassMembers = (
152
154
  className,
153
155
  });
154
156
 
157
+ members.push(...renderVfuncMembers({ context, klass, mode: "implementation" }));
155
158
  const inheritedPropertyTypes = collectInheritedPropertyTypes(context, klass);
156
159
  const accessors: ResolvedAccessor[] = [];
157
160
 
@@ -0,0 +1,26 @@
1
+ import type { GirFunction } from "../../gir/function.js";
2
+
3
+ const FUNCTIONS_INVOKING_CLOSURE_PARAMETERS: Set<string> = new Set([
4
+ "g_binding_group_bind_with_closures",
5
+ "g_bus_own_name_on_connection_with_closures",
6
+ "g_bus_own_name_with_closures",
7
+ "g_bus_watch_name_on_connection_with_closures",
8
+ "g_bus_watch_name_with_closures",
9
+ "g_dbus_connection_register_object_with_closures",
10
+ "g_dbus_connection_register_object_with_closures2",
11
+ "g_file_copy_async_with_closures",
12
+ "g_file_move_async_with_closures",
13
+ "g_object_bind_property_with_closures",
14
+ "g_settings_bind_with_mapping_closures",
15
+ "g_signal_connect_closure",
16
+ "g_signal_connect_closure_by_id",
17
+ "g_signal_group_connect_closure",
18
+ "g_signal_override_class_closure",
19
+ "g_source_set_closure",
20
+ "gtk_closure_expression_new",
21
+ ]);
22
+
23
+ const areClosuresInvoked = (fn: GirFunction): boolean =>
24
+ fn.cIdentifier !== undefined && FUNCTIONS_INVOKING_CLOSURE_PARAMETERS.has(fn.cIdentifier);
25
+
26
+ export { areClosuresInvoked };
@@ -3,17 +3,14 @@ import type { GirConstant } from "../../gir/namespace.js";
3
3
  import type { PrimitiveCategory } from "../../gir/primitives.js";
4
4
  import type { TypeId } from "../../gir/type-id.js";
5
5
  import type { ModuleContext } from "../../writer/context.js";
6
- import { renderJsDoc } from "../../writer/doc.js";
6
+ import { getDoc } from "./doc-spec.js";
7
7
 
8
8
  const TRUE_VALUES: Set<string> = new Set(["true", "1"]);
9
- // A `gint64`/`guint64` constant is typed `bigint`, and its decimal text does not survive a double:
10
- // G_MAXINT64 rounds to 2^63. The literal has to carry the BigInt suffix the type promises.
11
9
  const BIGINT_CATEGORIES: Set<PrimitiveCategory> = new Set(["bigint64", "biguint64", "gtype"]);
12
10
 
13
11
  const generateConstant = (context: ModuleContext, constant: GirConstant): void => {
14
- context.module.appendDeclaration(
15
- `${renderJsDoc(constant.doc)}export const ${constant.name} = ${constantLiteral(context, constant)};`,
16
- );
12
+ const doc = getDoc(constant);
13
+ context.module.appendDeclaration(`${doc}export const ${constant.name} = ${constantLiteral(context, constant)};`);
17
14
  };
18
15
 
19
16
  const constantLiteral = (context: ModuleContext, constant: GirConstant): string => {
@@ -8,8 +8,7 @@ import { ancestorChain } from "../../gir/ancestry.js";
8
8
  import { type GirProperty, isConstructableProperty } from "../../gir/property.js";
9
9
  import { renderBlock, renderBraced, renderBracedOrEmpty } from "../../writer/emit.js";
10
10
  import { parentCompanionRef } from "./companion.js";
11
-
12
- const PROPS_RECORD = "Record<string, unknown>";
11
+ import { propertyDoc } from "./property-accessor.js";
13
12
 
14
13
  const constructablePropNames = (klass: GirClass): string[] =>
15
14
  klass.properties.filter(isConstructableProperty).map((property) => toCamelIdentifier(property.name));
@@ -47,7 +46,8 @@ const renderConstructorPropsInterface = (context: ModuleContext, klass: GirClass
47
46
 
48
47
  const lines = collectConstructableProps(context, klass).map(
49
48
  (property) =>
50
- `${toCamelIdentifier(property.name)}?: ${renderTsType(context, property.type, true)} | undefined;`,
49
+ `${propertyDoc(property)}${toCamelIdentifier(property.name)}?: ` +
50
+ `${renderTsType(context, property.type, true)} | undefined;`,
51
51
  );
52
52
 
53
53
  return renderBracedOrEmpty(`export interface ${className}ConstructorProps${extendsClause}`, lines.join("\n"));
@@ -73,36 +73,32 @@ const renderClassConstructor = (
73
73
  };
74
74
 
75
75
  const renderRootConstructor = (context: ModuleContext): string => {
76
- context.addRuntimeImport("getInstanceType");
76
+ context.addRuntimeTypeImport("AnyClass");
77
+ context.addRuntimeImport("getClassType");
77
78
  context.addRuntimeImport("newObjectWithProperties");
78
- context.addRuntimeImport("setHandle");
79
- context.addRuntimeImport("setWrapper");
80
-
81
- const body = [
82
- "const handle = newObjectWithProperties(getInstanceType(this), props);",
83
- "setHandle(this, handle);",
84
- "setWrapper(handle, this);",
85
- ].join("\n");
79
+ const body = "newObjectWithProperties(getClassType(this.constructor as AnyClass), props, this);";
86
80
 
87
- return renderBlock(`constructor(props: ${PROPS_RECORD} = {})`, body);
81
+ return renderBlock("constructor(props: object = {})", body);
88
82
  };
89
83
 
90
- const renderTranslatingConstructor = (context: ModuleContext, props: GirProperty[], className: string): string => {
91
- context.addRuntimeImport("t");
92
- const destructured = props.map((property) => toCamelIdentifier(property.name));
93
- const pattern = `{ ${[...destructured, "...rest"].join(", ")} }`;
94
-
84
+ const renderConstructBindings = (context: ModuleContext, props: GirProperty[]): string => {
95
85
  const entries = props.map((property) => {
96
86
  const descriptor = renderDescriptor(context, property.type, property.transferOwnership);
87
+ const key = sourceStringLiteral(toCamelIdentifier(property.name));
97
88
 
98
- return `${sourceStringLiteral(property.name)}: [${descriptor}, ${toCamelIdentifier(property.name)}],`;
89
+ return `${key}: [${sourceStringLiteral(property.name)}, ${descriptor}],`;
99
90
  });
100
91
 
101
- const recordLiteral = renderBraced(entries.join("\n"));
102
- const lines = [`const props: ${PROPS_RECORD} = ${recordLiteral};`, "super({ ...props, ...rest });"];
103
- const body = lines.join("\n");
92
+ return renderBraced(entries.join("\n"));
93
+ };
94
+
95
+ const renderTranslatingConstructor = (context: ModuleContext, props: GirProperty[], className: string): string => {
96
+ context.addRuntimeImport("t");
97
+ context.addRuntimeImport("registerConstructProperties");
98
+ const bindings = renderConstructBindings(context, props);
99
+ context.module.appendRegistration(`registerConstructProperties(${className}, ${bindings});`);
104
100
 
105
- return renderBlock(`constructor(${pattern}: ${className}ConstructorProps = {})`, body);
101
+ return renderBlock(`constructor(props: ${className}ConstructorProps = {})`, "super(props);");
106
102
  };
107
103
 
108
104
  export { renderConstructorPropsInterface, renderClassConstructor };