@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
@@ -0,0 +1,38 @@
1
+ import type { GirAnnotations } from "../../gir/annotations.js";
2
+ import type { GirCallable, GirParameter } from "../../gir/parameter.js";
3
+ import type { JsDocSpec } from "../../writer/doc.js";
4
+ import { documentedHandlerParameters, handlerRenames } from "../../analysis/param-structure.js";
5
+ import { renderJsDoc } from "../../writer/doc.js";
6
+
7
+ type DocumentedNode = { doc: string | undefined; annotations: GirAnnotations };
8
+
9
+ const SELF_PARAM_DOC = "The instance the signal was emitted on.";
10
+ const THROWS_TEXT = "A `GLib.Error` carrying the failing operation's domain, code, and message.";
11
+
12
+ const annotationSpec = (annotations: GirAnnotations): JsDocSpec => ({
13
+ deprecated: annotations.isDeprecated
14
+ ? { since: annotations.deprecatedSince, doc: annotations.deprecationDoc }
15
+ : undefined,
16
+ since: annotations.since,
17
+ });
18
+
19
+ const getDoc = (node: DocumentedNode): string => renderJsDoc(node.doc, undefined, annotationSpec(node.annotations));
20
+
21
+ const handlerSpec = (
22
+ callable: GirCallable,
23
+ parameters: GirParameter[],
24
+ identifiers?: Map<string, string>,
25
+ ): JsDocSpec => ({
26
+ ...annotationSpec(callable.annotations),
27
+ identifiers: identifiers ?? handlerRenames(parameters),
28
+ params: documentedHandlerParameters(parameters),
29
+ returns: callable.returnValue.doc,
30
+ });
31
+
32
+ const selfHandlerSpec = (signal: GirCallable): JsDocSpec => {
33
+ const spec = handlerSpec(signal, signal.parameters);
34
+
35
+ return { ...spec, params: [...(spec.params ?? []), { name: "self", doc: SELF_PARAM_DOC }] };
36
+ };
37
+
38
+ export { annotationSpec, getDoc, handlerSpec, selfHandlerSpec, THROWS_TEXT };
@@ -1,47 +1,82 @@
1
1
  import { sourceStringLiteral } from "@gtkx/utils";
2
- import type { GirEnum } from "../../gir/enum.js";
2
+ import type { EnumMember, GirEnum } from "../../gir/enum.js";
3
3
  import type { ModuleContext } from "../../writer/context.js";
4
- import { renderJsDoc } from "../../writer/doc.js";
4
+ import { hasAnnotations } from "../../gir/annotations.js";
5
5
  import { indent } from "../../writer/emit.js";
6
+ import { getDoc } from "./doc-spec.js";
7
+
8
+ type KeyedMember = EnumMember & { key: string };
9
+
10
+ const memberDoc = (member: KeyedMember): string =>
11
+ getDoc(member);
12
+
13
+ const enumDoc = (enumeration: GirEnum): string =>
14
+ getDoc(enumeration);
6
15
 
7
16
  const generateEnum = (context: ModuleContext, enumeration: GirEnum): void => {
8
17
  if (!enumeration.introspectable) {
9
18
  return;
10
19
  }
11
20
 
12
- const name = enumeration.name;
13
21
  const members = enumeration.members.map((member) => ({ ...member, key: enumMemberKey(member.name) }));
22
+ const errorDomain = enumeration.errorDomain;
14
23
 
15
- if (enumeration.errorDomain !== undefined) {
16
- const memberEntries = members.map((member) => `${member.key}: ${member.value}`);
17
- const typeFields = members.map((member) => `${member.key}: number`).join("; ");
18
- context.addRuntimeImport("createErrorDomain");
19
- context.addRuntimeImport("ErrorDomain");
20
- const quarkExpression = renderQuarkExpression(context, enumeration.errorDomain);
21
- context.module.appendDeclaration(`${renderJsDoc(enumeration.doc)}export type ${name} = number;`);
22
-
23
- context.module.appendDeclaration(
24
- `export const ${name}: ErrorDomain<{ ${typeFields} }> = ` +
25
- `createErrorDomain(${quarkExpression}, { ${memberEntries.join(", ")} });`,
26
- );
24
+ if (errorDomain !== undefined) {
25
+ appendErrorDomain(context, enumeration, members, errorDomain);
27
26
 
28
27
  return;
29
28
  }
30
29
 
31
- if (members.some((member) => member.doc !== undefined)) {
32
- const memberBlocks = members.map((member) => `${renderJsDoc(member.doc)}${member.key} = ${member.value},`);
30
+ appendEnumDeclaration(context, enumeration, members);
31
+ };
32
+
33
+ const appendErrorDomain = (
34
+ context: ModuleContext,
35
+ enumeration: GirEnum,
36
+ members: KeyedMember[],
37
+ errorDomain: string,
38
+ ): void => {
39
+ const memberEntries = members.map((member) => `${member.key}: ${member.value}`);
40
+ const typeFields = members.map((member) => `${memberDoc(member)}${member.key}: number;`);
41
+ context.addRuntimeImport("createErrorDomain");
42
+ context.addRuntimeImport("ErrorDomain");
43
+ const quarkExpression = renderQuarkExpression(context, errorDomain);
44
+ const doc = enumDoc(enumeration);
45
+ const shape = typeFields.length === 0 ? "{}" : `{\n${indent(typeFields.join("\n"), 1)}\n}`;
46
+
47
+ context.module.appendDeclaration(
48
+ `${doc}export type ${enumeration.name} = number;`,
49
+ context.declaredType(enumeration.name),
50
+ );
51
+
52
+ context.module.appendDeclaration(
53
+ `${doc}export const ${enumeration.name}: ErrorDomain<${shape}> = ` +
54
+ `createErrorDomain(${quarkExpression}, { ${memberEntries.join(", ")} });`,
55
+ );
56
+ };
57
+
58
+ const isMemberDocumented = (member: KeyedMember): boolean =>
59
+ member.doc !== undefined || hasAnnotations(member.annotations);
60
+
61
+ const appendEnumDeclaration = (context: ModuleContext, enumeration: GirEnum, members: KeyedMember[]): void => {
62
+ const doc = enumDoc(enumeration);
63
+
64
+ if (members.some((member) => isMemberDocumented(member))) {
65
+ const blocks = members.map((member) => `${memberDoc(member)}${member.key} = ${member.value},`);
33
66
 
34
67
  context.module.appendDeclaration(
35
- `${renderJsDoc(enumeration.doc)}export enum ${name} {\n${indent(memberBlocks.join("\n"), 1)}\n}`,
68
+ `${doc}export enum ${enumeration.name} {\n${indent(blocks.join("\n"), 1)}\n}`,
69
+ context.declaredType(enumeration.name),
36
70
  );
37
71
 
38
72
  return;
39
73
  }
40
74
 
41
- const memberDeclarations = members.map((member) => `${member.key} = ${member.value}`);
75
+ const declarations = members.map((member) => `${member.key} = ${member.value}`);
42
76
 
43
77
  context.module.appendDeclaration(
44
- `${renderJsDoc(enumeration.doc)}export enum ${name} { ${memberDeclarations.join(", ")} }`,
78
+ `${doc}export enum ${enumeration.name} { ${declarations.join(", ")} }`,
79
+ context.declaredType(enumeration.name),
45
80
  );
46
81
  };
47
82
 
@@ -3,10 +3,10 @@ import type { GirFunction } from "../../gir/function.js";
3
3
  import type { GirNamespace } from "../../gir/namespace.js";
4
4
  import type { ModuleContext } from "../../writer/context.js";
5
5
  import { tFn } from "../../analysis/descriptor.js";
6
- import { hasCallerAllocatedArrayLength } from "../../analysis/param-structure.js";
7
- import { renderJsDoc } from "../../writer/doc.js";
6
+ import { hasUnmarshalableParam } from "../../analysis/param-capability.js";
8
7
  import { arrayLiteral, renderBlock } from "../../writer/emit.js";
9
8
  import { matchAsyncFinish } from "./async.js";
9
+ import { callableDoc } from "./callable-doc.js";
10
10
  import {
11
11
  planCallArgs,
12
12
  renderMethodBody,
@@ -17,6 +17,19 @@ import {
17
17
  renderReturnDescriptor,
18
18
  } from "./method.js";
19
19
 
20
+ type NamespaceFinish = {
21
+ fn: GirFunction;
22
+ exportName: string;
23
+ };
24
+
25
+ type NamespaceFunctionOptions = {
26
+ context: ModuleContext;
27
+ fn: GirFunction;
28
+ finish: NamespaceFinish | undefined;
29
+ exportName: string;
30
+ bindingName: string;
31
+ };
32
+
20
33
  const renderFnExpression = (context: ModuleContext, fn: GirFunction): string | undefined => {
21
34
  if (fn.cIdentifier === undefined) {
22
35
  return undefined;
@@ -32,13 +45,9 @@ const renderFnExpression = (context: ModuleContext, fn: GirFunction): string | u
32
45
  const params = planCallArgs(context, fn).map((arg) => arg.paramLiteral);
33
46
  const ret = renderReturnDescriptor(context, fn);
34
47
 
35
- return tFn(library, fn.cIdentifier, { args: arrayLiteral(params), returns: ret, throws: fn.throws });
48
+ return tFn(library, fn.cIdentifier, { args: arrayLiteral(params), returns: ret, canThrow: fn.throws });
36
49
  };
37
50
 
38
- // `moved-to` names the type member this function is also reachable as, so the namespace-level copy
39
- // is a second export of one binding. Suppressing it is only right when that member is really
40
- // emitted: 15 of Gtk-4.0's 28 `moved-to` targets are enum or error-domain members codegen emits no
41
- // static for, and dropping those would delete API with nothing to replace it.
42
51
  const isMovedOntoEmittedMember = (context: ModuleContext, fn: GirFunction): boolean => {
43
52
  const [typeName, memberName] = fn.movedTo?.split(".") ?? [];
44
53
 
@@ -62,7 +71,7 @@ const canEmitNamespaceFunction = (context: ModuleContext, fn: GirFunction): bool
62
71
  !isMovedOntoEmittedMember(context, fn) &&
63
72
  fn.shadowedBy === undefined &&
64
73
  fn.cIdentifier !== undefined &&
65
- !hasCallerAllocatedArrayLength(context.library, fn);
74
+ !hasUnmarshalableParam(context, fn);
66
75
 
67
76
  const generateNamespaceFunction = (context: ModuleContext, fn: GirFunction): void => {
68
77
  if (!canEmitNamespaceFunction(context, fn)) {
@@ -84,30 +93,39 @@ const generateNamespaceFunction = (context: ModuleContext, fn: GirFunction): voi
84
93
  const bindingName = toCamelIdentifier(cIdentifier);
85
94
  context.module.appendBinding(`const ${bindingName} = ${expression};`, cIdentifier);
86
95
  const exportName = namespaceFunctionExportName(cIdentifier, fn.name, context.namespace.cSymbolPrefixes);
87
- const declaration = renderNamespaceFunctionDeclaration(context, fn, exportName, bindingName);
88
- context.module.appendDeclaration(`${renderJsDoc(fn.doc)}${declaration}`);
96
+ const finish = matchNamespaceFinish(context, fn);
97
+ const declaration = renderNamespaceFunctionDeclaration({ context, fn, finish, exportName, bindingName });
98
+ const doc = callableDoc(context, fn, { finishFn: finish?.fn });
99
+ context.module.appendDeclaration(`${doc}${declaration}`);
89
100
  };
90
101
 
91
- const renderNamespaceFunctionDeclaration = (
92
- context: ModuleContext,
93
- fn: GirFunction,
94
- exportName: string,
95
- bindingName: string,
96
- ): string => {
102
+ const matchNamespaceFinish = (context: ModuleContext, fn: GirFunction): NamespaceFinish | undefined => {
97
103
  const finishFn = matchAsyncFinish(context.library, fn, context.namespace.functions);
98
- const finishCIdentifier = finishFn?.cIdentifier;
104
+ const cIdentifier = finishFn?.cIdentifier;
105
+
106
+ if (finishFn === undefined || cIdentifier === undefined || !canEmitNamespaceFunction(context, finishFn)) {
107
+ return undefined;
108
+ }
109
+
110
+ return {
111
+ fn: finishFn,
112
+ exportName: namespaceFunctionExportName(cIdentifier, finishFn.name, context.namespace.cSymbolPrefixes),
113
+ };
114
+ };
99
115
 
100
- if (finishFn !== undefined && finishCIdentifier !== undefined && canEmitNamespaceFunction(context, finishFn)) {
101
- const finishExport = namespaceFunctionExportName(
102
- finishCIdentifier,
103
- finishFn.name,
104
- context.namespace.cSymbolPrefixes,
105
- );
116
+ const renderPromisifiedNamespaceFunction = (options: NamespaceFunctionOptions, finish: NamespaceFinish): string => {
117
+ const { context, fn, exportName, bindingName } = options;
118
+ const { signature, returnType } = renderPromisifiedSignature(context, fn, finish.fn);
119
+ const body = renderPromisifiedBody(context, fn, finish.exportName, bindingName);
120
+
121
+ return renderBlock(`export function ${exportName}(${signature}): ${returnType}`, body);
122
+ };
106
123
 
107
- const { signature, returnType } = renderPromisifiedSignature(context, fn, finishFn);
108
- const body = renderPromisifiedBody(context, fn, finishExport, bindingName);
124
+ const renderNamespaceFunctionDeclaration = (options: NamespaceFunctionOptions): string => {
125
+ const { context, fn, finish, exportName, bindingName } = options;
109
126
 
110
- return renderBlock(`export function ${exportName}(${signature}): ${returnType}`, body);
127
+ if (finish !== undefined) {
128
+ return renderPromisifiedNamespaceFunction(options, finish);
111
129
  }
112
130
 
113
131
  const signature = renderMethodSignature(context, fn);
@@ -1,20 +1,24 @@
1
- import { pascalCase } from "@gtkx/utils";
1
+ import { pascalCase, sourceStringLiteral } from "@gtkx/utils";
2
2
  import type { GirClass } from "../../gir/class.js";
3
- import type { GirFunction } from "../../gir/function.js";
3
+ import type { GirProperty } from "../../gir/property.js";
4
4
  import type { ModuleContext } from "../../writer/context.js";
5
5
  import { reservedSignalMemberRename, resolvePrerequisiteReference } from "../../analysis/inheritance.js";
6
+ import { resolveInterfaces } from "../../gir/ancestry.js";
6
7
  import { renderJsDoc } from "../../writer/doc.js";
7
- import { renderBlock, renderBracedOrEmpty } from "../../writer/emit.js";
8
+ import { renderBlock, renderBraced, renderBracedOrEmpty } from "../../writer/emit.js";
8
9
  import {
9
10
  type Callables,
10
11
  dedupeCallables,
11
12
  generateBindings,
13
+ type InstanceMemberRenderer,
12
14
  type InstanceScope,
13
15
  instanceScope,
16
+ isEmittableCallable,
14
17
  renderClassInstanceMember,
15
18
  renderInstanceMethodSignature,
16
19
  renderStaticHead,
17
20
  } from "./callables.js";
21
+ import { annotationSpec, getDoc } from "./doc-spec.js";
18
22
  import { renderSourceGtype } from "./gtype-binding.js";
19
23
  import { methodExportName } from "./method.js";
20
24
  import {
@@ -24,15 +28,15 @@ import {
24
28
  } from "./property-accessor.js";
25
29
  import { appendInterfaceRegistration } from "./registration.js";
26
30
  import { renderSignalDeclarations, renderSignalMembers } from "./signal.js";
27
- import { renderVfuncMetadata } from "./vtable.js";
31
+ import {
32
+ hasCallableVfuncSlots,
33
+ renderVfuncMembers,
34
+ renderVfuncMetadata,
35
+ type VfuncMemberMode,
36
+ } from "./vtable.js";
28
37
 
29
38
  type InterfaceMemberRenderers = {
30
- renderMethod: (
31
- context: ModuleContext,
32
- callable: GirFunction,
33
- scope: InstanceScope,
34
- nameOverride?: string,
35
- ) => string | undefined;
39
+ renderMethod: InstanceMemberRenderer;
36
40
  renderProperty: (args: PropertyAccessorArgs) => string | undefined;
37
41
  };
38
42
 
@@ -53,6 +57,20 @@ type PropertyMemberOptions = {
53
57
  claimedNames: Set<string>;
54
58
  };
55
59
 
60
+ type InterfaceClassOptions = {
61
+ iface: GirClass;
62
+ className: string;
63
+ callables: Callables;
64
+ gtypeExpr: string | undefined;
65
+ implRef: string;
66
+ };
67
+
68
+ const BRAND_NOTE = [
69
+ "Phantom link to the type a class fills to adopt the interface, which `registerClass` reads",
70
+ "through its `implements` option. It holds no value at runtime. `unknown` asks nothing of the",
71
+ "class, which is what an interface with no slot to fill carries.",
72
+ ].join("\n");
73
+
56
74
  const generateInterface = (context: ModuleContext, iface: GirClass): void => {
57
75
  if (!iface.introspectable) {
58
76
  return;
@@ -72,8 +90,9 @@ const generateInterface = (context: ModuleContext, iface: GirClass): void => {
72
90
 
73
91
  generateBindings(context, callables);
74
92
  const gtypeExpr = renderSourceGtype(context, iface);
75
- context.module.appendDeclaration(renderInterfaceType(context, iface, className, callables));
76
- context.module.appendDeclaration(renderInterfaceClass(context, className, callables, gtypeExpr));
93
+ const implRef = appendInterfaceTypes(context, iface, className, callables) ?? "unknown";
94
+ const classCode = renderInterfaceClass(context, { iface, className, callables, gtypeExpr, implRef });
95
+ context.module.appendDeclaration(classCode, context.declaredType(className));
77
96
 
78
97
  for (const declaration of renderSignalDeclarations(context, iface, className, true)) {
79
98
  context.module.appendDeclaration(declaration);
@@ -85,12 +104,116 @@ const generateInterface = (context: ModuleContext, iface: GirClass): void => {
85
104
  className,
86
105
  makerName: makerName(className),
87
106
  gtypeExpr,
88
- vfuncs: renderVfuncMetadata(context, iface),
107
+ layout: renderInterfaceLayout(context, iface, callables),
89
108
  });
90
109
  };
91
110
 
92
111
  const makerName = (className: string): string => `make${className}`;
93
112
 
113
+ const renderInterfaceLayout = (
114
+ context: ModuleContext,
115
+ iface: GirClass,
116
+ callables: Callables,
117
+ ): string | undefined => {
118
+ const vfuncs = renderVfuncMetadata(context, iface);
119
+ const properties = renderSlotBackedProperties(context, iface, callables);
120
+
121
+ if (vfuncs === undefined && properties === undefined) {
122
+ return undefined;
123
+ }
124
+
125
+ const entries: string[] = [];
126
+
127
+ if (vfuncs !== undefined) {
128
+ entries.push(`vfuncs: ${vfuncs},`);
129
+ }
130
+
131
+ if (properties !== undefined) {
132
+ entries.push(`properties: ${properties},`);
133
+ }
134
+
135
+ return renderBraced(entries.join("\n"));
136
+ };
137
+
138
+ const invokerMembers = (context: ModuleContext, iface: GirClass, callables: Callables): Map<string, string> => {
139
+ const className = pascalCase(iface.name);
140
+
141
+ const invokers: Set<string> = new Set(
142
+ iface.vfuncs.map((vfunc) => vfunc.invoker).filter((invoker) => invoker !== undefined),
143
+ );
144
+
145
+ const members: Map<string, string> = new Map();
146
+
147
+ for (const callable of callables.methods) {
148
+ if (invokers.has(callable.name) && isEmittableCallable(context, callable)) {
149
+ members.set(callable.name, reservedSignalMemberRename(className, callable) ?? methodExportName(callable));
150
+ }
151
+ }
152
+
153
+ return members;
154
+ };
155
+
156
+ const renderSlotAccessor = (
157
+ key: string,
158
+ method: string | undefined,
159
+ members: Map<string, string>,
160
+ ): string | undefined => {
161
+ const member = method === undefined ? undefined : members.get(method);
162
+
163
+ return member === undefined ? undefined : `${key}: ${sourceStringLiteral(member)},`;
164
+ };
165
+
166
+ const renderSlotBackedProperty = (property: GirProperty, members: Map<string, string>): string | undefined => {
167
+ if (!property.introspectable) {
168
+ return undefined;
169
+ }
170
+
171
+ const fields = [
172
+ renderSlotAccessor("getter", property.getter, members),
173
+ renderSlotAccessor("setter", property.setter, members),
174
+ ].filter((field) => field !== undefined);
175
+
176
+ if (fields.length === 0) {
177
+ return undefined;
178
+ }
179
+
180
+ return `${sourceStringLiteral(property.name)}: ${renderBraced(fields.join("\n"))},`;
181
+ };
182
+
183
+ const renderSlotBackedProperties = (
184
+ context: ModuleContext,
185
+ iface: GirClass,
186
+ callables: Callables,
187
+ ): string | undefined => {
188
+ const members = invokerMembers(context, iface, callables);
189
+
190
+ const entries = iface.properties
191
+ .map((property) => renderSlotBackedProperty(property, members))
192
+ .filter((entry) => entry !== undefined);
193
+
194
+ return entries.length === 0 ? undefined : renderBraced(entries.join("\n"));
195
+ };
196
+
197
+ const appendInterfaceTypes = (
198
+ context: ModuleContext,
199
+ iface: GirClass,
200
+ className: string,
201
+ callables: Callables,
202
+ ): string | undefined => {
203
+ const typeCode = renderInterfaceType(context, iface, className, callables);
204
+ context.module.appendDeclaration(typeCode, context.declaredType(className));
205
+ const implType = renderInterfaceImplType(context, iface, className);
206
+
207
+ if (implType === undefined) {
208
+ return undefined;
209
+ }
210
+
211
+ const implName = implTypeName(className);
212
+ context.module.appendDeclaration(implType, context.declaredType(className, implName));
213
+
214
+ return implName;
215
+ };
216
+
94
217
  const interfaceTypeExtends = (context: ModuleContext, iface: GirClass): string => {
95
218
  const refs = iface.prerequisites
96
219
  .map((name) => resolvePrerequisiteReference(context, name))
@@ -111,12 +234,69 @@ const renderInterfaceType = (
111
234
  ): string => {
112
235
  const members = renderInterfaceTypeMembers(context, iface, callables);
113
236
 
114
- return `${renderJsDoc(iface.doc)}${renderBracedOrEmpty(
237
+ return `${getDoc(iface)}${renderBracedOrEmpty(
115
238
  `export interface ${className} extends ${interfaceTypeExtends(context, iface)}`,
116
239
  members.join("\n"),
117
240
  )}`;
118
241
  };
119
242
 
243
+ const implTypeName = (className: string): string => `${className}Impl`;
244
+
245
+ const implTypeNote = (className: string): string =>
246
+ [
247
+ `Implementer side of \`${className}\`: the vtable slots a class fills to adopt the interface.`,
248
+ "",
249
+ `Declare it with \`implements ${implTypeName(className)}\` on a class passed to \`registerClass\``,
250
+ `with \`${className}\` in \`implements\`. The interface's methods, properties, and signals come from`,
251
+ "GLib dispatch, so they are not part of this type.",
252
+ "",
253
+ "Every slot is optional: an unfilled one keeps whatever the interface installs by default, and a",
254
+ "GIR update can add one. Declaring a slot pins its signature; declaring it as a class field rather",
255
+ "than a method satisfies this type but never reaches the vtable.",
256
+ ].join("\n");
257
+
258
+ const implPrerequisiteRefs = (context: ModuleContext, iface: GirClass): string[] => {
259
+ const prerequisites = resolveInterfaces(context.library, context.namespace.name, iface.prerequisites);
260
+ const refs: string[] = [];
261
+
262
+ for (const prerequisite of prerequisites) {
263
+ if (!hasCallableVfuncSlots(context, prerequisite.namespaceName, prerequisite.klass)) {
264
+ continue;
265
+ }
266
+
267
+ const name = implTypeName(pascalCase(prerequisite.klass.name));
268
+ refs.push(context.qualify(prerequisite.namespaceName, name));
269
+ }
270
+
271
+ return refs;
272
+ };
273
+
274
+ const implTypeExtends = (context: ModuleContext, iface: GirClass): string => {
275
+ const refs = implPrerequisiteRefs(context, iface);
276
+
277
+ return refs.length > 0 ? ` extends ${refs.join(", ")}` : "";
278
+ };
279
+
280
+ const interfaceVfuncMembers = (context: ModuleContext, iface: GirClass, mode: VfuncMemberMode): string[] =>
281
+ renderVfuncMembers({ context, klass: iface, mode });
282
+
283
+ const renderInterfaceImplType = (
284
+ context: ModuleContext,
285
+ iface: GirClass,
286
+ className: string,
287
+ ): string | undefined => {
288
+ const members = interfaceVfuncMembers(context, iface, "requirement");
289
+
290
+ if (members.length === 0) {
291
+ return undefined;
292
+ }
293
+
294
+ return `${renderJsDoc(iface.doc, implTypeNote(className), annotationSpec(iface.annotations))}${renderBracedOrEmpty(
295
+ `export interface ${implTypeName(className)}${implTypeExtends(context, iface)}`,
296
+ members.join("\n"),
297
+ )}`;
298
+ };
299
+
120
300
  const collectMethodMembers = (options: MethodMemberOptions): string[] => {
121
301
  const { context, className, scope, callables, renderers, claimedNames } = options;
122
302
  const members: string[] = [];
@@ -166,27 +346,34 @@ const renderInterfaceMembers = (
166
346
  return [...methodMembers, ...propertyMembers];
167
347
  };
168
348
 
169
- const renderInterfaceTypeMembers = (context: ModuleContext, iface: GirClass, callables: Callables): string[] =>
170
- renderInterfaceMembers(context, iface, callables, {
349
+ const renderInterfaceTypeMembers = (context: ModuleContext, iface: GirClass, callables: Callables): string[] => [
350
+ ...renderInterfaceMembers(context, iface, callables, {
171
351
  renderMethod: renderInstanceMethodSignature,
172
352
  renderProperty: renderPropertyAccessorSignature,
173
- });
353
+ }),
354
+ ...interfaceVfuncMembers(context, iface, "signature"),
355
+ ];
174
356
 
175
- const renderInterfaceClass = (
176
- context: ModuleContext,
177
- className: string,
178
- callables: Callables,
179
- gtypeExpr: string | undefined,
180
- ): string => {
357
+ const renderInterfaceClass = (context: ModuleContext, options: InterfaceClassOptions): string => {
358
+ const { iface, className, callables, gtypeExpr, implRef } = options;
181
359
  const members: string[] = [];
182
360
 
183
361
  if (gtypeExpr !== undefined) {
184
362
  members.push(renderInterfaceHasInstance(context, className, gtypeExpr));
185
363
  }
186
364
 
187
- members.push(...renderStaticHead(context, callables, className));
365
+ members.push(...renderStaticHead(context, callables, className), renderInterfaceBrand(context, implRef));
366
+
367
+ return `${getDoc(iface)}${renderBracedOrEmpty(
368
+ `export abstract class ${className}`,
369
+ members.join("\n\n"),
370
+ )}`;
371
+ };
372
+
373
+ const renderInterfaceBrand = (context: ModuleContext, implRef: string): string => {
374
+ context.addRuntimeTypeImport("Interface");
188
375
 
189
- return renderBracedOrEmpty(`export abstract class ${className}`, members.join("\n\n"));
376
+ return `${renderJsDoc(undefined, BRAND_NOTE)}declare static __impl__: Interface<${implRef}>["__impl__"];`;
190
377
  };
191
378
 
192
379
  const renderInterfaceHasInstance = (context: ModuleContext, className: string, gtypeExpr: string): string => {
@@ -208,7 +395,7 @@ const renderInterfaceMaker = (
208
395
  const members = renderInterfaceInstanceMembers(context, iface, callables);
209
396
  const classExpression = renderBracedOrEmpty("class extends Base", members.join("\n\n"));
210
397
 
211
- return `export const ${makerName(className)}: Mixin = (Base) =>\n${classExpression};`;
398
+ return `${getDoc(iface)}export const ${makerName(className)}: Mixin = (Base) =>\n${classExpression};`;
212
399
  };
213
400
 
214
401
  const renderInterfaceInstanceMembers = (context: ModuleContext, iface: GirClass, callables: Callables): string[] => [
@@ -216,6 +403,7 @@ const renderInterfaceInstanceMembers = (context: ModuleContext, iface: GirClass,
216
403
  renderMethod: renderClassInstanceMember,
217
404
  renderProperty: renderPropertyAccessor,
218
405
  }),
406
+ ...interfaceVfuncMembers(context, iface, "implementation"),
219
407
  ...renderSignalMembers(context, iface),
220
408
  ];
221
409
 
@@ -5,7 +5,7 @@ import type { ModuleContext } from "../../writer/context.js";
5
5
  import { tObject } from "../../analysis/descriptor.js";
6
6
  import { inputParameters, parameterIdentifier } from "../../analysis/param-structure.js";
7
7
  import { renderTsType } from "../../analysis/ts-type.js";
8
- import { resolveInterface } from "../../gir/ancestry.js";
8
+ import { resolveInterfaces } from "../../gir/ancestry.js";
9
9
  import { callbackAsFunction, type GirCallback } from "../../gir/callback.js";
10
10
 
11
11
  const COMPARATOR_CALLBACK_TYPES = new Set([
@@ -30,11 +30,9 @@ const isListModelImplementor = (context: ModuleContext, ref: TypeId): boolean =>
30
30
  return false;
31
31
  }
32
32
 
33
- return resolved.value.implements.some((interfaceName) => {
34
- const iface = resolveInterface(context.library, resolved.namespace.name, interfaceName);
33
+ const interfaces = resolveInterfaces(context.library, resolved.namespace.name, resolved.value.implements);
35
34
 
36
- return iface?.namespaceName === "Gio" && iface.klass.name === "ListModel";
37
- });
35
+ return interfaces.some((iface) => iface.namespaceName === "Gio" && iface.klass.name === "ListModel");
38
36
  };
39
37
 
40
38
  const isObjectItemComparator = (context: ModuleContext, fn: GirFunction): boolean => {