@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
@@ -1,46 +1,112 @@
1
- import { pascalCase, sourceStringLiteral, toCamelIdentifier } from "@gtkx/utils";
1
+ import { pascalCase, sourceStringLiteral } from "@gtkx/utils";
2
2
  import type { GirCallback } from "../../gir/callback.js";
3
- import type { GirClass } from "../../gir/class.js";
3
+ import type { GirClass, GirVirtualMethod } from "../../gir/class.js";
4
4
  import type { GirField } from "../../gir/field.js";
5
5
  import type { GirParameter } from "../../gir/parameter.js";
6
+ import type { GirRecord } from "../../gir/record.js";
7
+ import type { TypeId } from "../../gir/type-id.js";
6
8
  import type { ModuleContext } from "../../writer/context.js";
9
+ import type { JsDocSpec } from "../../writer/doc.js";
7
10
  import {
8
11
  isInlineCallbackRef,
9
12
  isScalarRef,
10
13
  renderDescriptor,
11
14
  renderParamDescriptor,
12
15
  } from "../../analysis/descriptor-render.js";
13
- import { renderBraced } from "../../writer/emit.js";
16
+ import {
17
+ foldedLengthParameters,
18
+ handlerParameters,
19
+ parameterIdentifier,
20
+ renamesWithInstance,
21
+ renderHandlerParameters,
22
+ renderHandlerResultType,
23
+ } from "../../analysis/param-structure.js";
24
+ import { renderTsType } from "../../analysis/ts-type.js";
25
+ import { ancestorChain, type ResolvedAncestor, resolveInterfaces } from "../../gir/ancestry.js";
26
+ import { renderJsDoc } from "../../writer/doc.js";
27
+ import { renderBlock, renderBraced } from "../../writer/emit.js";
28
+ import { handlerSpec, THROWS_TEXT } from "./doc-spec.js";
14
29
  import { computeRecordFieldSlots } from "./record-layout.js";
15
30
 
16
31
  type VtableKind = "class" | "interface";
32
+ type VfuncMemberMode = "implementation" | "requirement" | "signature";
17
33
 
18
- type RenderVtableSlotDescriptorOptions = {
34
+ type VtableSlot = {
19
35
  key: string;
20
- structName: string;
21
- kind: VtableKind;
22
36
  field: GirField;
23
37
  callback: GirCallback;
38
+ vfunc: GirVirtualMethod | undefined;
24
39
  byteOffset: number;
25
- vtableSize: number;
26
40
  };
27
41
 
28
- const renderVfuncMetadata = (context: ModuleContext, klass: GirClass): string | undefined => {
29
- if (klass.glibTypeStruct === undefined) {
30
- return undefined;
31
- }
42
+ type VfuncMemberOptions = {
43
+ context: ModuleContext;
44
+ ownerRef: string;
45
+ slot: VtableSlot;
46
+ mode: VfuncMemberMode;
47
+ isProtected: boolean;
48
+ };
49
+
50
+ type VfuncMembersOptions = {
51
+ context: ModuleContext;
52
+ klass: GirClass;
53
+ mode: VfuncMemberMode;
54
+ };
32
55
 
33
- const structName = pascalCase(klass.glibTypeStruct);
34
- const kind: VtableKind = klass.isInterface ? "interface" : "class";
35
- const entries = vtableEntries(context, structName, kind, klass.glibTypeStruct);
56
+ type VfuncSignature = {
57
+ header: string;
58
+ returnType: string;
59
+ };
36
60
 
37
- if (entries.length === 0) {
38
- return undefined;
39
- }
61
+ type VfuncEntry = {
62
+ name: string;
63
+ signature: string;
64
+ doc: string | undefined;
65
+ };
40
66
 
41
- return renderBraced(entries.join("\n"));
67
+ type Vtable = {
68
+ structName: string;
69
+ kind: VtableKind;
70
+ vtableSize: number;
71
+ slots: VtableSlot[];
42
72
  };
43
73
 
74
+ const PADDING_FIELD_NAME = /^(?:reserved|padding)\d*$/i;
75
+
76
+ const UNCALLABLE_SLOT_KEYS: Set<string> = new Set([
77
+ "vfuncDispose",
78
+ "vfuncFinalize",
79
+ "vfuncGetProperty",
80
+ "vfuncSetProperty",
81
+ ]);
82
+
83
+ const PROTECTED_SLOT_NOTE = "It is `protected`, so only a subclass chaining up reaches it.";
84
+ const PUBLIC_SLOT_NOTE = "Calling it from anywhere else re-enters the slot on a live instance.";
85
+
86
+ const vfuncMemberName = (fieldName: string): string => `vfunc${pascalCase(fieldName)}`;
87
+
88
+ const vfuncOverrideNote = (slot: VtableSlot, isProtected: boolean): string =>
89
+ [
90
+ `Invokes the \`${slot.field.name}\` vtable slot. Override it on a class passed to \`registerClass\``,
91
+ `and chain up with \`super.${slot.key}()\`.`,
92
+ isProtected ? PROTECTED_SLOT_NOTE : PUBLIC_SLOT_NOTE,
93
+ ].join("\n");
94
+
95
+ const vfuncRequirementNote = (slot: VtableSlot, ownerRef: string): string =>
96
+ [
97
+ `Fills the \`${slot.field.name}\` vtable slot. Declare it on a class passed to \`registerClass\``,
98
+ `with \`${ownerRef}\` in \`implements\`, which installs it in the interface vtable. Leaving it out`,
99
+ "keeps whatever the interface installs by default, the way it does for a C implementer.",
100
+ ].join("\n");
101
+
102
+ const vfuncMemberNote = (options: VfuncMemberOptions): string =>
103
+ options.mode === "requirement"
104
+ ? vfuncRequirementNote(options.slot, options.ownerRef)
105
+ : vfuncOverrideNote(options.slot, options.isProtected);
106
+
107
+ const isPaddingField = (field: GirField): boolean =>
108
+ field.name.startsWith("_") || PADDING_FIELD_NAME.test(field.name);
109
+
44
110
  const vtableCallbackType = (context: ModuleContext, field: GirField): GirCallback | undefined => {
45
111
  if (field.type === undefined) {
46
112
  return undefined;
@@ -60,15 +126,19 @@ const vtableSlotEntry = (
60
126
  field: GirField,
61
127
  claimedNames: Set<string>,
62
128
  ): { key: string; callback: GirCallback } | undefined => {
129
+ if (field.name === "constructor" || isPaddingField(field)) {
130
+ return undefined;
131
+ }
132
+
63
133
  const callback = vtableCallbackType(context, field);
64
134
 
65
135
  if (callback === undefined) {
66
136
  return undefined;
67
137
  }
68
138
 
69
- const key = toCamelIdentifier(field.name);
139
+ const key = vfuncMemberName(field.name);
70
140
 
71
- if (key === "constructor" || claimedNames.has(key)) {
141
+ if (claimedNames.has(key)) {
72
142
  return undefined;
73
143
  }
74
144
 
@@ -79,53 +149,271 @@ const vtableSlotEntry = (
79
149
  return { key, callback };
80
150
  };
81
151
 
82
- const vtableEntries = (context: ModuleContext, structName: string, kind: VtableKind, typeStruct: string): string[] => {
83
- const resolved = context.library.resolveType(context.namespace.name, typeStruct);
84
-
85
- if (resolved?.kind !== "record") {
86
- return [];
87
- }
88
-
89
- const { slots, size } = computeRecordFieldSlots(context, resolved.value.fields, resolved.value.isUnion);
90
- const entries: string[] = [];
152
+ const collectVtableSlots = (
153
+ context: ModuleContext,
154
+ fields: GirField[],
155
+ isUnion: boolean,
156
+ ): { slots: VtableSlot[]; vtableSize: number } => {
157
+ const { slots, size } = computeRecordFieldSlots(context, fields, isUnion);
158
+ const entries: VtableSlot[] = [];
91
159
  const claimedNames: Set<string> = new Set();
92
160
 
93
161
  for (const { field, slot } of slots) {
94
162
  const entry = vtableSlotEntry(context, field, claimedNames);
95
163
 
96
- if (entry === undefined) {
97
- continue;
164
+ if (entry !== undefined) {
165
+ claimedNames.add(entry.key);
166
+ entries.push({ ...entry, field, vfunc: undefined, byteOffset: slot.byteOffset });
98
167
  }
168
+ }
169
+
170
+ return { slots: entries, vtableSize: size };
171
+ };
99
172
 
100
- claimedNames.add(entry.key);
173
+ const resolveVtableRecord = (
174
+ context: ModuleContext,
175
+ namespaceName: string,
176
+ klass: GirClass,
177
+ ): { typeStruct: string; record: GirRecord } | undefined => {
178
+ const typeStruct = klass.glibTypeStruct;
179
+ const resolved = typeStruct === undefined ? undefined : context.library.resolveType(namespaceName, typeStruct);
101
180
 
102
- entries.push(
103
- renderVtableSlotDescriptor(context, {
104
- key: entry.key,
105
- structName,
106
- kind,
107
- field,
108
- callback: entry.callback,
109
- byteOffset: slot.byteOffset,
110
- vtableSize: size,
111
- }),
112
- );
181
+ if (typeStruct === undefined || resolved?.kind !== "record" || resolved.value.fields.length === 0) {
182
+ return undefined;
113
183
  }
114
184
 
115
- return entries;
185
+ return { typeStruct, record: resolved.value };
116
186
  };
117
187
 
118
- const isUnsupportedOutParam = (context: ModuleContext, param: GirParameter): boolean =>
119
- (param.direction === "out" || param.direction === "inout") &&
120
- !param.callerAllocates &&
121
- !isScalarRef(context.library, param.type);
188
+ const attachVirtualMethods = (slots: VtableSlot[], klass: GirClass): VtableSlot[] => {
189
+ const byKey: Map<string, GirVirtualMethod> = new Map(
190
+ klass.vfuncs.map((vfunc) => [vfuncMemberName(vfunc.name), vfunc]),
191
+ );
122
192
 
123
- const isEligibleVtableParam = (context: ModuleContext, param: GirParameter): boolean => {
124
- if (param.isVarargs) {
125
- return false;
193
+ return slots.map((slot) => ({ ...slot, vfunc: byKey.get(slot.key) }));
194
+ };
195
+
196
+ const collectVtable = (context: ModuleContext, namespaceName: string, klass: GirClass): Vtable | undefined => {
197
+ const resolved = resolveVtableRecord(context, namespaceName, klass);
198
+
199
+ if (resolved === undefined) {
200
+ return undefined;
201
+ }
202
+
203
+ const { slots, vtableSize } = collectVtableSlots(context, resolved.record.fields, resolved.record.isUnion);
204
+
205
+ if (slots.length === 0) {
206
+ return undefined;
207
+ }
208
+
209
+ return {
210
+ structName: pascalCase(resolved.typeStruct),
211
+ kind: klass.isInterface ? "interface" : "class",
212
+ vtableSize,
213
+ slots: attachVirtualMethods(slots, klass),
214
+ };
215
+ };
216
+
217
+ const vfuncMemberNames = (context: ModuleContext, namespaceName: string, klass: GirClass): string[] =>
218
+ collectVtable(context, namespaceName, klass)?.slots.map((slot) => slot.key) ?? [];
219
+
220
+ const renderVfuncMetadata = (context: ModuleContext, klass: GirClass): string | undefined => {
221
+ const vtable = collectVtable(context, context.namespace.name, klass);
222
+
223
+ if (vtable === undefined) {
224
+ return undefined;
225
+ }
226
+
227
+ const entries = vtable.slots.map((slot) => renderVtableSlotDescriptor(context, vtable, slot));
228
+
229
+ return renderBraced(entries.join("\n"));
230
+ };
231
+
232
+ const slotIdentity = (slot: VtableSlot): string => `${slot.key}:${String(slot.byteOffset)}`;
233
+
234
+ const inheritedSlotIdentities = (context: ModuleContext, namespaceName: string, klass: GirClass): Set<string> => {
235
+ const identities: Set<string> = new Set();
236
+ const [, ...ancestors] = [...ancestorChain(context.library, klass, namespaceName)];
237
+
238
+ for (const ancestor of ancestors) {
239
+ const vtable = collectVtable(context, ancestor.namespaceName, ancestor.klass);
240
+ const slots = vtable?.slots ?? [];
241
+
242
+ for (const slot of slots) {
243
+ identities.add(slotIdentity(slot));
244
+ }
245
+ }
246
+
247
+ return identities;
248
+ };
249
+
250
+ const addInterfaceSlotKeys = (
251
+ context: ModuleContext,
252
+ iface: ResolvedAncestor,
253
+ keys: Set<string>,
254
+ seen: Set<string>,
255
+ ): void => {
256
+ const identity = `${iface.namespaceName}.${iface.klass.name}`;
257
+
258
+ if (seen.has(identity)) {
259
+ return;
260
+ }
261
+
262
+ seen.add(identity);
263
+
264
+ for (const key of vfuncMemberNames(context, iface.namespaceName, iface.klass)) {
265
+ keys.add(key);
266
+ }
267
+
268
+ for (const ref of resolveInterfaces(context.library, iface.namespaceName, iface.klass.prerequisites)) {
269
+ addInterfaceSlotKeys(context, ref, keys, seen);
270
+ }
271
+ };
272
+
273
+ const implementedSlotKeys = (context: ModuleContext, namespaceName: string, klass: GirClass): Set<string> => {
274
+ const keys: Set<string> = new Set();
275
+ const seen: Set<string> = new Set();
276
+
277
+ for (const ancestor of ancestorChain(context.library, klass, namespaceName)) {
278
+ for (const ref of resolveInterfaces(context.library, ancestor.namespaceName, ancestor.klass.implements)) {
279
+ addInterfaceSlotKeys(context, ref, keys, seen);
280
+ }
281
+ }
282
+
283
+ return keys;
284
+ };
285
+
286
+ const protectedSlotKeys = (options: VfuncMembersOptions, slots: VtableSlot[]): Set<string> => {
287
+ const { context, klass } = options;
288
+
289
+ if (klass.isInterface) {
290
+ return new Set();
291
+ }
292
+
293
+ const shared = implementedSlotKeys(context, context.namespace.name, klass);
294
+
295
+ return new Set(slots.map((slot) => slot.key).filter((key) => !shared.has(key)));
296
+ };
297
+
298
+ const callableVfuncSlots = (context: ModuleContext, namespaceName: string, klass: GirClass): VtableSlot[] => {
299
+ const vtable = collectVtable(context, namespaceName, klass);
300
+
301
+ if (vtable === undefined) {
302
+ return [];
303
+ }
304
+
305
+ const inherited = inheritedSlotIdentities(context, namespaceName, klass);
306
+
307
+ return vtable.slots.filter((slot) => isCallableSlot(context, slot) && !inherited.has(slotIdentity(slot)));
308
+ };
309
+
310
+ const hasCallableVfuncSlots = (context: ModuleContext, namespaceName: string, klass: GirClass): boolean =>
311
+ callableVfuncSlots(context, namespaceName, klass).length > 0;
312
+
313
+ const slotDoc = (slot: VtableSlot): string | undefined => slot.vfunc?.doc ?? slot.field.doc ?? slot.callback.doc;
314
+
315
+ const slotDocParameters = (slot: VtableSlot): GirParameter[] => {
316
+ const [, ...parameters] = slot.callback.parameters;
317
+ const vfuncParameters = slot.vfunc?.parameters ?? [];
318
+
319
+ return parameters.map((parameter, index) => ({ ...parameter, doc: vfuncParameters[index]?.doc ?? parameter.doc }));
320
+ };
321
+
322
+ const slotDocSpec = (slot: VtableSlot): JsDocSpec => {
323
+ const parameters = slotDocParameters(slot);
324
+ const source = slot.vfunc ?? slot.callback;
325
+
326
+ return {
327
+ ...handlerSpec(source, parameters, renamesWithInstance(parameters, slot.callback.parameters[0])),
328
+ returns: slot.vfunc?.returnValue.doc ?? slot.callback.returnValue.doc,
329
+ throws: slot.callback.throws ? THROWS_TEXT : undefined,
330
+ };
331
+ };
332
+
333
+ const vfuncEntries = (context: ModuleContext, namespaceName: string, klass: GirClass): VfuncEntry[] =>
334
+ callableVfuncSlots(context, namespaceName, klass).map((slot) => ({
335
+ name: slot.key,
336
+ signature: vfuncSlotSignature(context, slot).header,
337
+ doc: slotDoc(slot),
338
+ }));
339
+
340
+ const renderVfuncMembers = (options: VfuncMembersOptions): string[] => {
341
+ const { context, klass, mode } = options;
342
+ const ownerRef = pascalCase(klass.name);
343
+ const slots = callableVfuncSlots(context, context.namespace.name, klass);
344
+
345
+ if (slots.length === 0) {
346
+ return [];
347
+ }
348
+
349
+ if (mode === "implementation") {
350
+ context.addRuntimeImport("callVfunc");
351
+ }
352
+
353
+ const protectedKeys = protectedSlotKeys(options, slots);
354
+
355
+ return slots.map((slot) =>
356
+ renderVfuncMember({ context, ownerRef, slot, mode, isProtected: protectedKeys.has(slot.key) }));
357
+ };
358
+
359
+ const hasUnannotatedPointerParam = (context: ModuleContext, slot: VtableSlot): boolean => {
360
+ const [, ...parameters] = slot.callback.parameters;
361
+
362
+ return parameters.some(
363
+ (parameter) =>
364
+ parameter.direction === "in" &&
365
+ parameter.cType?.endsWith("*") === true &&
366
+ isScalarRef(context.library, parameter.type),
367
+ );
368
+ };
369
+
370
+ const isCallableSlot = (context: ModuleContext, slot: VtableSlot): boolean =>
371
+ !UNCALLABLE_SLOT_KEYS.has(slot.key) && !hasUnannotatedPointerParam(context, slot);
372
+
373
+ const vfuncSlotSignature = (context: ModuleContext, slot: VtableSlot, isOptional = false): VfuncSignature => {
374
+ const [, ...parameters] = slot.callback.parameters;
375
+
376
+ const renderType = (ref: TypeId | undefined, isNullable: boolean): string =>
377
+ renderTsType(context, ref, isNullable);
378
+
379
+ const signature = renderHandlerParameters(parameters, renderType).join(", ");
380
+ const folded = foldedLengthParameters(context.library, slot.callback);
381
+
382
+ const returnType = renderHandlerResultType({
383
+ library: context.library,
384
+ signal: { ...slot.callback, parameters },
385
+ renderType,
386
+ shouldIncludeCallerAllocated: true,
387
+ isOptOut: false,
388
+ shouldExcludeOut: (parameter) => folded.has(parameter),
389
+ });
390
+
391
+ return { header: `${slot.key}${isOptional ? "?" : ""}(${signature}): ${returnType}`, returnType };
392
+ };
393
+
394
+ const renderVfuncMember = (options: VfuncMemberOptions): string => {
395
+ const { context, ownerRef, slot, mode, isProtected } = options;
396
+ const { header, returnType } = vfuncSlotSignature(context, slot, mode === "requirement");
397
+ const declaration = `${isProtected ? "protected " : ""}${header}`;
398
+ const doc = renderJsDoc(slotDoc(slot), vfuncMemberNote(options), slotDocSpec(slot));
399
+
400
+ if (mode !== "implementation") {
401
+ return `${doc}${declaration};`;
126
402
  }
127
403
 
128
- if (isUnsupportedOutParam(context, param)) {
404
+ const [, ...parameters] = slot.callback.parameters;
405
+
406
+ const inputs = handlerParameters(parameters).map((parameter, index) =>
407
+ parameterIdentifier(parameter, index));
408
+
409
+ const call = `callVfunc(${ownerRef}, ${sourceStringLiteral(slot.key)}, this, [${inputs.join(", ")}])`;
410
+ const body = returnType === "void" ? `${call};` : `return ${call} as ${returnType};`;
411
+
412
+ return `${doc}${renderBlock(declaration, body)}`;
413
+ };
414
+
415
+ const isEligibleVtableParam = (context: ModuleContext, param: GirParameter): boolean => {
416
+ if (param.isVarargs) {
129
417
  return false;
130
418
  }
131
419
 
@@ -146,8 +434,8 @@ const isVtableSlotEligible = (context: ModuleContext, callback: GirCallback): bo
146
434
  return !isInlineCallbackRef(context.library, callback.returnValue.type);
147
435
  };
148
436
 
149
- const renderVtableSlotDescriptor = (context: ModuleContext, options: RenderVtableSlotDescriptorOptions): string => {
150
- const { key, structName, kind, field, callback, byteOffset, vtableSize } = options;
437
+ const renderVtableSlotDescriptor = (context: ModuleContext, vtable: Vtable, slot: VtableSlot): string => {
438
+ const { key, field, callback, byteOffset } = slot;
151
439
 
152
440
  const argDescriptors = callback.parameters
153
441
  .map((param) => renderParamDescriptor(context, param, param.type))
@@ -160,16 +448,29 @@ const renderVtableSlotDescriptor = (context: ModuleContext, options: RenderVtabl
160
448
  );
161
449
 
162
450
  const lines = [
163
- `kind: ${sourceStringLiteral(kind)} as const,`,
164
- `className: ${sourceStringLiteral(structName)},`,
451
+ `className: ${sourceStringLiteral(vtable.structName)},`,
165
452
  `vfuncName: ${sourceStringLiteral(field.name)},`,
166
453
  `byteOffset: ${String(byteOffset)},`,
167
- `vtableSize: ${String(vtableSize)},`,
168
- `argDescriptors: [${argDescriptors}],`,
169
- `returnDescriptor: ${returnDescriptor},`,
170
454
  ];
171
455
 
456
+ if (vtable.kind === "interface") {
457
+ lines.push(`vtableSize: ${String(vtable.vtableSize)},`);
458
+ }
459
+
460
+ lines.push(`argDescriptors: [${argDescriptors}],`, `returnDescriptor: ${returnDescriptor},`);
461
+
462
+ if (callback.throws) {
463
+ lines.push("canThrow: true,");
464
+ }
465
+
172
466
  return `${key}: ${renderBraced(lines.join("\n"))},`;
173
467
  };
174
468
 
175
- export { renderVfuncMetadata };
469
+ export {
470
+ hasCallableVfuncSlots,
471
+ renderVfuncMembers,
472
+ renderVfuncMetadata,
473
+ vfuncEntries,
474
+ vfuncMemberNames,
475
+ type VfuncMemberMode,
476
+ };
@@ -4,8 +4,6 @@ import { fileURLToPath } from "node:url";
4
4
  import { FINGERPRINT_FILENAME, type GiFingerprint } from "../fingerprint.js";
5
5
  import { buildManifest, type StoreOptions, subpathExport, writeStore } from "./store-fs.js";
6
6
 
7
- type GiStoreOptions = StoreOptions;
8
-
9
7
  type GiNamespaceInput = {
10
8
  directory: string;
11
9
  rawSource: string;
@@ -69,7 +67,7 @@ const collectStoreSources = (
69
67
  };
70
68
 
71
69
  const writeGiStore = (
72
- options: GiStoreOptions,
70
+ options: StoreOptions,
73
71
  namespaces: GiNamespaceInput[],
74
72
  fingerprint: GiFingerprint,
75
73
  ): void => {
@@ -89,4 +87,4 @@ const writeGiStore = (
89
87
  });
90
88
  };
91
89
 
92
- export { writeGiStore, type GiStoreOptions, type GiNamespaceInput };
90
+ export { writeGiStore, type GiNamespaceInput };
@@ -3,12 +3,10 @@ import type { Library } from "../../gir/library.js";
3
3
  import type { GirNamespace } from "../../gir/namespace.js";
4
4
  import type { ImportsBuilder } from "../../writer/imports.js";
5
5
  import type { LazyElementSpec } from "./element-prop-types.js";
6
- import { renderJsDoc } from "../../writer/doc.js";
6
+ import { getDoc } from "../gi/doc-spec.js";
7
7
  import { ancestorGlibNames, type GlibNamedClass } from "./intrinsic-elements.js";
8
8
 
9
- /** A component that wraps a generated element, keyed by GLib type name (built-in or user-provided). */
10
9
  type ElementComponent = { module: string; export: string };
11
- /** Component wrappers keyed by GLib type name; the framework's built-ins merged with the project's own. */
12
10
  type ElementComponentOverrides = Record<string, ElementComponent>;
13
11
 
14
12
  type ExportCollector = {
@@ -73,9 +71,6 @@ const appendCandidateExport = (
73
71
  collector.exportedNames.add(candidate.glibName);
74
72
  };
75
73
 
76
- // An abstract GType cannot be instantiated: `g_object_new` on one is a fatal GObject error rather
77
- // than a NULL return. Its props interface and metadata still have to be emitted, since every
78
- // concrete subclass extends them, so only the constructible component export is withheld.
79
74
  const collectCandidateExports = (collector: ExportCollector, options: CandidateExportOptions): void => {
80
75
  for (const candidate of options.intrinsicElements) {
81
76
  if (candidate.klass.isAbstract) {
@@ -96,10 +91,11 @@ const collectLazyElementExports = (collector: ExportCollector, lazyElements: Laz
96
91
  };
97
92
 
98
93
  const renderLazyElementExport = (spec: LazyElementSpec): string => {
94
+ const doc = getDoc(spec);
99
95
  const factory = `createElementComponent(${sourceStringLiteral(spec.element)})`;
100
- const component = `export const ${spec.element}: (props: ${spec.typeName}) => ReactNode = ${factory};`;
96
+ const component = `${doc}export const ${spec.element}: (props: ${spec.typeName}) => ReactNode = ${factory};`;
101
97
 
102
- return `${spec.typeSource}\n\n${component}`;
98
+ return `${doc}${spec.typeSource}\n\n${component}`;
103
99
  };
104
100
 
105
101
  const renderCandidateExport = (
@@ -118,10 +114,11 @@ const renderCandidateExport = (
118
114
  imports.addNamed(component.module, component.export, false);
119
115
  }
120
116
 
121
- return `${renderJsDoc(klass.doc)}${renderElementComponentExport(glibName, component)}`;
117
+ const doc = getDoc(klass);
118
+
119
+ return `${doc}${renderElementComponentExport(glibName, component)}`;
122
120
  };
123
121
 
124
- /** The component for the nearest ancestry match, most-derived first; user overrides win on their exact type. */
125
122
  const resolveElementComponent = (
126
123
  ancestry: string[],
127
124
  components: Record<string, ElementComponent>,
@@ -149,4 +146,4 @@ const renderElementComponentExport = (glibName: string, component: ElementCompon
149
146
  return `export const ${glibName}: ${annotation} = ${component.export}(${factoryCall});`;
150
147
  };
151
148
 
152
- export { generateElementComponentsSection, type ElementComponent, type ElementComponentOverrides };
149
+ export { generateElementComponentsSection, type ElementComponentOverrides };
@@ -1,11 +1,13 @@
1
- /** Props interface a generated element's props extend, declared by hand in `@gtkx/react`. */
2
1
  type ElementPropTypeRef = { type: string; module: string; export: string };
2
+
3
3
  /** Base props interface each element extends, keyed by GLib type name (the module exports it). */
4
- type ElementProps = Record<string, { module: string; export: string }>;
4
+ type ElementProps = Record<string, {
5
+ module: string;
6
+ export: string;
7
+ }>;
5
8
 
6
9
  const elementProps: Map<string, { module: string; export: string }> = new Map();
7
10
 
8
- /** Installs the base props each element extends (GLib type name → `{ module, export }`); set once per run. */
9
11
  const setElementProps = (props: ElementProps): void => {
10
12
  elementProps.clear();
11
13
 
@@ -14,11 +16,10 @@ const setElementProps = (props: ElementProps): void => {
14
16
  }
15
17
  };
16
18
 
17
- /** The base props interface an element extends, when its element config declares one. */
18
19
  const elementPropTypeFor = (glibName: string): ElementPropTypeRef | undefined => {
19
20
  const ref = elementProps.get(glibName);
20
21
 
21
22
  return ref === undefined ? undefined : { type: glibName, module: ref.module, export: ref.export };
22
23
  };
23
24
 
24
- export { setElementProps, elementPropTypeFor, type ElementPropTypeRef, type ElementProps };
25
+ export { setElementProps, elementPropTypeFor, type ElementProps };
@@ -1,4 +1,5 @@
1
1
  import { toCamelIdentifier } from "@gtkx/utils";
2
+ import type { GirAnnotations } from "../../gir/annotations.js";
2
3
  import type { GirClass } from "../../gir/class.js";
3
4
  import { getChain, type GirIndex, type GirTypeEntry } from "./gir-index.js";
4
5
  import { getGlibName } from "./intrinsic-elements.js";
@@ -7,6 +8,8 @@ type LazyElementSpec = {
7
8
  element: string;
8
9
  typeName: string;
9
10
  typeSource: string;
11
+ doc: string | undefined;
12
+ annotations: GirAnnotations;
10
13
  };
11
14
 
12
15
  const appendConstructOnlyNames = (klass: GirClass, names: string[]): void => {
@@ -34,10 +37,15 @@ const createLazyElementSpec = (context: GirIndex, element: string, entry: GirTyp
34
37
  const omitUnion = omitted.map((name) => JSON.stringify(name)).join(" | ");
35
38
  const base = omitted.length === 0 ? `${baseName}Props` : `Omit<${baseName}Props, ${omitUnion}>`;
36
39
 
37
- return { element, typeName, typeSource: `export type ${typeName} = ${base} & { children?: ReactNode };` };
40
+ return {
41
+ element,
42
+ typeName,
43
+ typeSource: `export type ${typeName} = ${base} & { children?: ReactNode };`,
44
+ doc: entry.klass.doc,
45
+ annotations: entry.klass.annotations,
46
+ };
38
47
  };
39
48
 
40
- /** Lazy element prop types to emit, grouped by the namespace declaring each element. */
41
49
  const lazyElementSpecs = (context: GirIndex, lazyElements: string[]): Map<string, LazyElementSpec[]> => {
42
50
  const specs: Map<string, LazyElementSpec[]> = new Map();
43
51