@gtkx/codegen 1.0.0-rc.4 → 1.1.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 (523) hide show
  1. package/README.md +5 -5
  2. package/dist/analysis/descriptor-render.d.ts +13 -9
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +80 -50
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +16 -7
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +15 -3
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +4 -3
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +103 -58
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/interface-conflicts.d.ts +23 -0
  15. package/dist/analysis/interface-conflicts.d.ts.map +1 -0
  16. package/dist/analysis/interface-conflicts.js +144 -0
  17. package/dist/analysis/interface-conflicts.js.map +1 -0
  18. package/dist/analysis/nul-terminated-bytes.d.ts +5 -0
  19. package/dist/analysis/nul-terminated-bytes.d.ts.map +1 -0
  20. package/dist/analysis/nul-terminated-bytes.js +18 -0
  21. package/dist/analysis/nul-terminated-bytes.js.map +1 -0
  22. package/dist/analysis/param-capability.d.ts +5 -0
  23. package/dist/analysis/param-capability.d.ts.map +1 -0
  24. package/dist/analysis/param-capability.js +129 -0
  25. package/dist/analysis/param-capability.js.map +1 -0
  26. package/dist/analysis/param-structure.d.ts +11 -4
  27. package/dist/analysis/param-structure.d.ts.map +1 -1
  28. package/dist/analysis/param-structure.js +42 -16
  29. package/dist/analysis/param-structure.js.map +1 -1
  30. package/dist/analysis/ts-type.d.ts.map +1 -1
  31. package/dist/analysis/ts-type.js +10 -17
  32. package/dist/analysis/ts-type.js.map +1 -1
  33. package/dist/analysis/type-key.d.ts +5 -0
  34. package/dist/analysis/type-key.d.ts.map +1 -0
  35. package/dist/analysis/type-key.js +9 -0
  36. package/dist/analysis/type-key.js.map +1 -0
  37. package/dist/analysis/type-shape.d.ts +8 -0
  38. package/dist/analysis/type-shape.d.ts.map +1 -0
  39. package/dist/analysis/type-shape.js +12 -0
  40. package/dist/analysis/type-shape.js.map +1 -0
  41. package/dist/compile.d.ts +12 -3
  42. package/dist/compile.d.ts.map +1 -1
  43. package/dist/compile.js +73 -24
  44. package/dist/compile.js.map +1 -1
  45. package/dist/docs/api-reference.d.ts +2 -2
  46. package/dist/docs/api-reference.d.ts.map +1 -1
  47. package/dist/docs/api-reference.js +17 -23
  48. package/dist/docs/api-reference.js.map +1 -1
  49. package/dist/docs/element-page.d.ts +4 -4
  50. package/dist/docs/element-page.d.ts.map +1 -1
  51. package/dist/docs/element-page.js +36 -22
  52. package/dist/docs/element-page.js.map +1 -1
  53. package/dist/docs/handwritten-props.d.ts +9 -0
  54. package/dist/docs/handwritten-props.d.ts.map +1 -0
  55. package/dist/docs/handwritten-props.js +149 -0
  56. package/dist/docs/handwritten-props.js.map +1 -0
  57. package/dist/docs/pipeline.d.ts.map +1 -1
  58. package/dist/docs/pipeline.js +87 -20
  59. package/dist/docs/pipeline.js.map +1 -1
  60. package/dist/docs/render.d.ts +26 -5
  61. package/dist/docs/render.d.ts.map +1 -1
  62. package/dist/docs/render.js +88 -25
  63. package/dist/docs/render.js.map +1 -1
  64. package/dist/docs/symbol-page.d.ts +17 -0
  65. package/dist/docs/symbol-page.d.ts.map +1 -1
  66. package/dist/docs/symbol-page.js +132 -44
  67. package/dist/docs/symbol-page.js.map +1 -1
  68. package/dist/fingerprint.d.ts +12 -1
  69. package/dist/fingerprint.d.ts.map +1 -1
  70. package/dist/fingerprint.js +44 -28
  71. package/dist/fingerprint.js.map +1 -1
  72. package/dist/gi.d.ts.map +1 -1
  73. package/dist/gi.js +1 -0
  74. package/dist/gi.js.map +1 -1
  75. package/dist/gir/ancestry.d.ts +8 -2
  76. package/dist/gir/ancestry.d.ts.map +1 -1
  77. package/dist/gir/ancestry.js +19 -1
  78. package/dist/gir/ancestry.js.map +1 -1
  79. package/dist/gir/annotations.d.ts +21 -0
  80. package/dist/gir/annotations.d.ts.map +1 -0
  81. package/dist/gir/annotations.js +15 -0
  82. package/dist/gir/annotations.js.map +1 -0
  83. package/dist/gir/callback.d.ts +1 -0
  84. package/dist/gir/callback.d.ts.map +1 -1
  85. package/dist/gir/callback.js +1 -0
  86. package/dist/gir/callback.js.map +1 -1
  87. package/dist/gir/class.d.ts +32 -1
  88. package/dist/gir/class.d.ts.map +1 -1
  89. package/dist/gir/class.js +8 -3
  90. package/dist/gir/class.js.map +1 -1
  91. package/dist/gir/cursor-overrides.d.ts +8 -0
  92. package/dist/gir/cursor-overrides.d.ts.map +1 -0
  93. package/dist/gir/cursor-overrides.js +6 -0
  94. package/dist/gir/cursor-overrides.js.map +1 -0
  95. package/dist/gir/emittable.d.ts +7 -0
  96. package/dist/gir/emittable.d.ts.map +1 -0
  97. package/dist/gir/emittable.js +3 -0
  98. package/dist/gir/emittable.js.map +1 -0
  99. package/dist/gir/enum.d.ts +21 -1
  100. package/dist/gir/enum.d.ts.map +1 -1
  101. package/dist/gir/enum.js +9 -9
  102. package/dist/gir/enum.js.map +1 -1
  103. package/dist/gir/field.d.ts +19 -3
  104. package/dist/gir/field.d.ts.map +1 -1
  105. package/dist/gir/field.js +7 -8
  106. package/dist/gir/field.js.map +1 -1
  107. package/dist/gir/function.d.ts +15 -0
  108. package/dist/gir/function.d.ts.map +1 -1
  109. package/dist/gir/function.js +28 -2
  110. package/dist/gir/function.js.map +1 -1
  111. package/dist/gir/libraries.d.ts +1 -3
  112. package/dist/gir/libraries.d.ts.map +1 -1
  113. package/dist/gir/libraries.js +0 -1
  114. package/dist/gir/libraries.js.map +1 -1
  115. package/dist/gir/library.d.ts +36 -0
  116. package/dist/gir/library.d.ts.map +1 -1
  117. package/dist/gir/library.js +35 -1
  118. package/dist/gir/library.js.map +1 -1
  119. package/dist/gir/namespace.d.ts +43 -1
  120. package/dist/gir/namespace.d.ts.map +1 -1
  121. package/dist/gir/namespace.js +8 -7
  122. package/dist/gir/namespace.js.map +1 -1
  123. package/dist/gir/parameter.d.ts +52 -1
  124. package/dist/gir/parameter.d.ts.map +1 -1
  125. package/dist/gir/parameter.js +8 -3
  126. package/dist/gir/parameter.js.map +1 -1
  127. package/dist/gir/parse.d.ts +3 -1
  128. package/dist/gir/parse.d.ts.map +1 -1
  129. package/dist/gir/parse.js +9 -9
  130. package/dist/gir/parse.js.map +1 -1
  131. package/dist/gir/primitives.d.ts +1 -0
  132. package/dist/gir/primitives.d.ts.map +1 -1
  133. package/dist/gir/primitives.js.map +1 -1
  134. package/dist/gir/property.d.ts +16 -0
  135. package/dist/gir/property.d.ts.map +1 -1
  136. package/dist/gir/property.js +3 -3
  137. package/dist/gir/property.js.map +1 -1
  138. package/dist/gir/record.d.ts +22 -0
  139. package/dist/gir/record.d.ts.map +1 -1
  140. package/dist/gir/record.js +3 -2
  141. package/dist/gir/record.js.map +1 -1
  142. package/dist/gir/size.d.ts +5 -4
  143. package/dist/gir/size.d.ts.map +1 -1
  144. package/dist/gir/size.js.map +1 -1
  145. package/dist/gir/type-id.d.ts +35 -0
  146. package/dist/gir/type-id.d.ts.map +1 -1
  147. package/dist/gir/type-id.js +1 -0
  148. package/dist/gir/type-id.js.map +1 -1
  149. package/dist/gir/type-ref.d.ts.map +1 -1
  150. package/dist/gir/type-ref.js +1 -0
  151. package/dist/gir/type-ref.js.map +1 -1
  152. package/dist/gir/type.d.ts +20 -0
  153. package/dist/gir/type.d.ts.map +1 -1
  154. package/dist/gir/type.js.map +1 -1
  155. package/dist/guards.d.ts +16 -0
  156. package/dist/guards.d.ts.map +1 -0
  157. package/dist/guards.js +11 -0
  158. package/dist/guards.js.map +1 -0
  159. package/dist/internal.d.ts +2 -0
  160. package/dist/internal.d.ts.map +1 -1
  161. package/dist/internal.js +2 -0
  162. package/dist/internal.js.map +1 -1
  163. package/dist/json.d.ts +3 -0
  164. package/dist/json.d.ts.map +1 -0
  165. package/dist/json.js +11 -0
  166. package/dist/json.js.map +1 -0
  167. package/dist/khronos/args.d.ts +7 -6
  168. package/dist/khronos/args.d.ts.map +1 -1
  169. package/dist/khronos/args.js +28 -6
  170. package/dist/khronos/args.js.map +1 -1
  171. package/dist/khronos/doc-context.d.ts +29 -0
  172. package/dist/khronos/doc-context.d.ts.map +1 -0
  173. package/dist/khronos/doc-context.js +29 -0
  174. package/dist/khronos/doc-context.js.map +1 -0
  175. package/dist/khronos/extensions.d.ts +13 -0
  176. package/dist/khronos/extensions.d.ts.map +1 -0
  177. package/dist/khronos/extensions.js +49 -0
  178. package/dist/khronos/extensions.js.map +1 -0
  179. package/dist/khronos/jsdoc.d.ts +17 -11
  180. package/dist/khronos/jsdoc.d.ts.map +1 -1
  181. package/dist/khronos/jsdoc.js +104 -46
  182. package/dist/khronos/jsdoc.js.map +1 -1
  183. package/dist/khronos/model.d.ts +42 -3
  184. package/dist/khronos/model.d.ts.map +1 -1
  185. package/dist/khronos/model.js +218 -63
  186. package/dist/khronos/model.js.map +1 -1
  187. package/dist/khronos/modules.d.ts +9 -6
  188. package/dist/khronos/modules.d.ts.map +1 -1
  189. package/dist/khronos/modules.js +112 -27
  190. package/dist/khronos/modules.js.map +1 -1
  191. package/dist/khronos/notes.d.ts +19 -0
  192. package/dist/khronos/notes.d.ts.map +1 -0
  193. package/dist/khronos/notes.js +35 -0
  194. package/dist/khronos/notes.js.map +1 -0
  195. package/dist/khronos/param-pair.d.ts +1 -1
  196. package/dist/khronos/param-pair.d.ts.map +1 -1
  197. package/dist/khronos/param-pair.js.map +1 -1
  198. package/dist/khronos/parse.d.ts.map +1 -1
  199. package/dist/khronos/parse.js +3 -4
  200. package/dist/khronos/parse.js.map +1 -1
  201. package/dist/khronos/pipeline.d.ts +4 -2
  202. package/dist/khronos/pipeline.d.ts.map +1 -1
  203. package/dist/khronos/pipeline.js +58 -27
  204. package/dist/khronos/pipeline.js.map +1 -1
  205. package/dist/khronos/plan.d.ts +3 -9
  206. package/dist/khronos/plan.d.ts.map +1 -1
  207. package/dist/khronos/plan.js +3 -3
  208. package/dist/khronos/plan.js.map +1 -1
  209. package/dist/khronos/render.d.ts +8 -6
  210. package/dist/khronos/render.d.ts.map +1 -1
  211. package/dist/khronos/render.js +35 -26
  212. package/dist/khronos/render.js.map +1 -1
  213. package/dist/khronos/select.d.ts +21 -4
  214. package/dist/khronos/select.d.ts.map +1 -1
  215. package/dist/khronos/select.js +47 -34
  216. package/dist/khronos/select.js.map +1 -1
  217. package/dist/react/element-config.d.ts +2 -2
  218. package/dist/react/element-config.d.ts.map +1 -1
  219. package/dist/react/element-config.js.map +1 -1
  220. package/dist/runner.d.ts +6 -8
  221. package/dist/runner.d.ts.map +1 -1
  222. package/dist/runner.js +16 -0
  223. package/dist/runner.js.map +1 -1
  224. package/dist/staging.d.ts +5 -0
  225. package/dist/staging.d.ts.map +1 -0
  226. package/dist/staging.js +57 -0
  227. package/dist/staging.js.map +1 -0
  228. package/dist/store/compile-store.d.ts +1 -1
  229. package/dist/store/compile-store.d.ts.map +1 -1
  230. package/dist/store/compile-store.js +4 -2
  231. package/dist/store/compile-store.js.map +1 -1
  232. package/dist/store/gi/callable-doc.d.ts +11 -0
  233. package/dist/store/gi/callable-doc.d.ts.map +1 -0
  234. package/dist/store/gi/callable-doc.js +62 -0
  235. package/dist/store/gi/callable-doc.js.map +1 -0
  236. package/dist/store/gi/callables.d.ts +9 -2
  237. package/dist/store/gi/callables.d.ts.map +1 -1
  238. package/dist/store/gi/callables.js +35 -40
  239. package/dist/store/gi/callables.js.map +1 -1
  240. package/dist/store/gi/callback.d.ts.map +1 -1
  241. package/dist/store/gi/callback.js +10 -6
  242. package/dist/store/gi/callback.js.map +1 -1
  243. package/dist/store/gi/class.d.ts.map +1 -1
  244. package/dist/store/gi/class.js +63 -40
  245. package/dist/store/gi/class.js.map +1 -1
  246. package/dist/store/gi/closure-invocation.d.ts +4 -0
  247. package/dist/store/gi/closure-invocation.d.ts.map +1 -0
  248. package/dist/store/gi/closure-invocation.js +22 -0
  249. package/dist/store/gi/closure-invocation.js.map +1 -0
  250. package/dist/store/gi/companion.d.ts.map +1 -1
  251. package/dist/store/gi/companion.js +6 -6
  252. package/dist/store/gi/companion.js.map +1 -1
  253. package/dist/store/gi/constant.d.ts.map +1 -1
  254. package/dist/store/gi/constant.js +12 -3
  255. package/dist/store/gi/constant.js.map +1 -1
  256. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  257. package/dist/store/gi/constructor-props.js +18 -20
  258. package/dist/store/gi/constructor-props.js.map +1 -1
  259. package/dist/store/gi/doc-spec.d.ts +14 -0
  260. package/dist/store/gi/doc-spec.d.ts.map +1 -0
  261. package/dist/store/gi/doc-spec.js +23 -0
  262. package/dist/store/gi/doc-spec.js.map +1 -0
  263. package/dist/store/gi/enum.d.ts.map +1 -1
  264. package/dist/store/gi/enum.js +52 -19
  265. package/dist/store/gi/enum.js.map +1 -1
  266. package/dist/store/gi/function.d.ts +1 -3
  267. package/dist/store/gi/function.d.ts.map +1 -1
  268. package/dist/store/gi/function.js +50 -29
  269. package/dist/store/gi/function.js.map +1 -1
  270. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  271. package/dist/store/gi/gtype-binding.js +4 -1
  272. package/dist/store/gi/gtype-binding.js.map +1 -1
  273. package/dist/store/gi/interface.d.ts.map +1 -1
  274. package/dist/store/gi/interface.js +155 -26
  275. package/dist/store/gi/interface.js.map +1 -1
  276. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  277. package/dist/store/gi/item-comparators.js +3 -5
  278. package/dist/store/gi/item-comparators.js.map +1 -1
  279. package/dist/store/gi/method.d.ts +11 -2
  280. package/dist/store/gi/method.d.ts.map +1 -1
  281. package/dist/store/gi/method.js +80 -45
  282. package/dist/store/gi/method.js.map +1 -1
  283. package/dist/store/gi/param-marshal.d.ts +6 -2
  284. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  285. package/dist/store/gi/param-marshal.js +54 -5
  286. package/dist/store/gi/param-marshal.js.map +1 -1
  287. package/dist/store/gi/pipeline.d.ts.map +1 -1
  288. package/dist/store/gi/pipeline.js +23 -11
  289. package/dist/store/gi/pipeline.js.map +1 -1
  290. package/dist/store/gi/properties.d.ts +2 -1
  291. package/dist/store/gi/properties.d.ts.map +1 -1
  292. package/dist/store/gi/properties.js +7 -4
  293. package/dist/store/gi/properties.js.map +1 -1
  294. package/dist/store/gi/property-accessor.d.ts +12 -5
  295. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  296. package/dist/store/gi/property-accessor.js +98 -46
  297. package/dist/store/gi/property-accessor.js.map +1 -1
  298. package/dist/store/gi/record-constructor.d.ts +8 -1
  299. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  300. package/dist/store/gi/record-constructor.js +34 -11
  301. package/dist/store/gi/record-constructor.js.map +1 -1
  302. package/dist/store/gi/record-field-accessor.d.ts +3 -1
  303. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  304. package/dist/store/gi/record-field-accessor.js +8 -3
  305. package/dist/store/gi/record-field-accessor.js.map +1 -1
  306. package/dist/store/gi/record-layout.d.ts +6 -1
  307. package/dist/store/gi/record-layout.d.ts.map +1 -1
  308. package/dist/store/gi/record-layout.js +9 -2
  309. package/dist/store/gi/record-layout.js.map +1 -1
  310. package/dist/store/gi/record.d.ts.map +1 -1
  311. package/dist/store/gi/record.js +21 -9
  312. package/dist/store/gi/record.js.map +1 -1
  313. package/dist/store/gi/registration.d.ts +1 -1
  314. package/dist/store/gi/registration.js +4 -4
  315. package/dist/store/gi/registration.js.map +1 -1
  316. package/dist/store/gi/runtime-override.d.ts +2 -1
  317. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  318. package/dist/store/gi/runtime-override.js +8 -5
  319. package/dist/store/gi/runtime-override.js.map +1 -1
  320. package/dist/store/gi/signal.d.ts +2 -1
  321. package/dist/store/gi/signal.d.ts.map +1 -1
  322. package/dist/store/gi/signal.js +42 -37
  323. package/dist/store/gi/signal.js.map +1 -1
  324. package/dist/store/gi/value-marshalable.d.ts +1 -2
  325. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  326. package/dist/store/gi/value-marshalable.js +3 -2
  327. package/dist/store/gi/value-marshalable.js.map +1 -1
  328. package/dist/store/gi/vtable.d.ts +19 -1
  329. package/dist/store/gi/vtable.d.ts.map +1 -1
  330. package/dist/store/gi/vtable.js +257 -51
  331. package/dist/store/gi/vtable.js.map +1 -1
  332. package/dist/store/gi-store.d.ts +1 -0
  333. package/dist/store/gi-store.d.ts.map +1 -1
  334. package/dist/store/gi-store.js +15 -20
  335. package/dist/store/gi-store.js.map +1 -1
  336. package/dist/store/jsx/element-components.d.ts +1 -1
  337. package/dist/store/jsx/element-components.d.ts.map +1 -1
  338. package/dist/store/jsx/element-components.js +6 -4
  339. package/dist/store/jsx/element-components.js.map +1 -1
  340. package/dist/store/jsx/element-prop-imports.d.ts +1 -3
  341. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -1
  342. package/dist/store/jsx/element-prop-imports.js.map +1 -1
  343. package/dist/store/jsx/element-prop-types.d.ts +3 -0
  344. package/dist/store/jsx/element-prop-types.d.ts.map +1 -1
  345. package/dist/store/jsx/element-prop-types.js +7 -1
  346. package/dist/store/jsx/element-prop-types.js.map +1 -1
  347. package/dist/store/jsx/generated-elements.d.ts +2 -1
  348. package/dist/store/jsx/generated-elements.d.ts.map +1 -1
  349. package/dist/store/jsx/generated-elements.js +13 -7
  350. package/dist/store/jsx/generated-elements.js.map +1 -1
  351. package/dist/store/jsx/intrinsic-elements.d.ts +4 -0
  352. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -1
  353. package/dist/store/jsx/intrinsic-elements.js.map +1 -1
  354. package/dist/store/jsx/jsx.d.ts.map +1 -1
  355. package/dist/store/jsx/jsx.js +10 -9
  356. package/dist/store/jsx/jsx.js.map +1 -1
  357. package/dist/store/jsx/metadata.d.ts.map +1 -1
  358. package/dist/store/jsx/metadata.js +5 -3
  359. package/dist/store/jsx/metadata.js.map +1 -1
  360. package/dist/store/jsx/pipeline.d.ts +1 -1
  361. package/dist/store/jsx/pipeline.d.ts.map +1 -1
  362. package/dist/store/jsx/pipeline.js.map +1 -1
  363. package/dist/store/jsx/props.d.ts +1 -7
  364. package/dist/store/jsx/props.d.ts.map +1 -1
  365. package/dist/store/jsx/props.js +14 -6
  366. package/dist/store/jsx/props.js.map +1 -1
  367. package/dist/store/jsx-store.d.ts.map +1 -1
  368. package/dist/store/jsx-store.js +3 -3
  369. package/dist/store/jsx-store.js.map +1 -1
  370. package/dist/store/resolve-store.d.ts +14 -3
  371. package/dist/store/resolve-store.d.ts.map +1 -1
  372. package/dist/store/resolve-store.js +98 -15
  373. package/dist/store/resolve-store.js.map +1 -1
  374. package/dist/store/store-fs.d.ts +9 -6
  375. package/dist/store/store-fs.d.ts.map +1 -1
  376. package/dist/store/store-fs.js +59 -25
  377. package/dist/store/store-fs.js.map +1 -1
  378. package/dist/store/store-links.d.ts +3 -0
  379. package/dist/store/store-links.d.ts.map +1 -0
  380. package/dist/store/store-links.js +39 -0
  381. package/dist/store/store-links.js.map +1 -0
  382. package/dist/writer/comparison-context.d.ts +4 -0
  383. package/dist/writer/comparison-context.d.ts.map +1 -0
  384. package/dist/writer/comparison-context.js +13 -0
  385. package/dist/writer/comparison-context.js.map +1 -0
  386. package/dist/writer/context.d.ts +3 -2
  387. package/dist/writer/context.d.ts.map +1 -1
  388. package/dist/writer/context.js +11 -3
  389. package/dist/writer/context.js.map +1 -1
  390. package/dist/writer/doc-tags.d.ts +21 -0
  391. package/dist/writer/doc-tags.d.ts.map +1 -0
  392. package/dist/writer/doc-tags.js +38 -0
  393. package/dist/writer/doc-tags.js.map +1 -0
  394. package/dist/writer/doc.d.ts +3 -1
  395. package/dist/writer/doc.d.ts.map +1 -1
  396. package/dist/writer/doc.js +19 -6
  397. package/dist/writer/doc.js.map +1 -1
  398. package/dist/writer/gtk-doc.d.ts +1 -1
  399. package/dist/writer/gtk-doc.d.ts.map +1 -1
  400. package/dist/writer/gtk-doc.js +64 -15
  401. package/dist/writer/gtk-doc.js.map +1 -1
  402. package/dist/writer/module.d.ts +17 -3
  403. package/dist/writer/module.d.ts.map +1 -1
  404. package/dist/writer/module.js +72 -3
  405. package/dist/writer/module.js.map +1 -1
  406. package/dist/xml.d.ts +7 -1
  407. package/dist/xml.d.ts.map +1 -1
  408. package/dist/xml.js +43 -1
  409. package/dist/xml.js.map +1 -1
  410. package/overrides/gdk/rgba.ts.ejs +26 -0
  411. package/overrides/gobject/object.ts.ejs +48 -3
  412. package/overrides/gobject/value.ts.ejs +7 -0
  413. package/overrides/graphene/structs.ts.ejs +55 -0
  414. package/package.json +15 -4
  415. package/src/analysis/descriptor-render.ts +130 -66
  416. package/src/analysis/descriptor.ts +35 -11
  417. package/src/analysis/inheritance.ts +166 -75
  418. package/src/analysis/interface-conflicts.ts +237 -0
  419. package/src/analysis/nul-terminated-bytes.ts +31 -0
  420. package/src/analysis/param-capability.ts +169 -0
  421. package/src/analysis/param-structure.ts +85 -25
  422. package/src/analysis/ts-type.ts +13 -17
  423. package/src/analysis/type-key.ts +14 -0
  424. package/src/analysis/type-shape.ts +24 -0
  425. package/src/compile.ts +110 -26
  426. package/src/docs/api-reference.ts +46 -34
  427. package/src/docs/element-page.ts +58 -49
  428. package/src/docs/handwritten-props.ts +230 -0
  429. package/src/docs/pipeline.ts +131 -21
  430. package/src/docs/render.ts +153 -35
  431. package/src/docs/symbol-page.ts +230 -80
  432. package/src/fingerprint.ts +86 -32
  433. package/src/gi.ts +1 -0
  434. package/src/gir/ancestry.ts +31 -1
  435. package/src/gir/annotations.ts +37 -0
  436. package/src/gir/callback.ts +2 -0
  437. package/src/gir/class.ts +42 -4
  438. package/src/gir/cursor-overrides.ts +12 -0
  439. package/src/gir/emittable.ts +8 -0
  440. package/src/gir/enum.ts +30 -10
  441. package/src/gir/field.ts +24 -9
  442. package/src/gir/function.ts +60 -9
  443. package/src/gir/libraries.ts +11 -3
  444. package/src/gir/library.ts +52 -3
  445. package/src/gir/namespace.ts +49 -7
  446. package/src/gir/parameter.ts +62 -3
  447. package/src/gir/parse.ts +13 -9
  448. package/src/gir/primitives.ts +1 -0
  449. package/src/gir/property.ts +18 -3
  450. package/src/gir/record.ts +24 -2
  451. package/src/gir/size.ts +8 -3
  452. package/src/gir/type-id.ts +49 -3
  453. package/src/gir/type-ref.ts +1 -0
  454. package/src/gir/type.ts +50 -6
  455. package/src/guards.ts +23 -0
  456. package/src/internal.ts +2 -0
  457. package/src/json.ts +11 -0
  458. package/src/khronos/args.ts +36 -13
  459. package/src/khronos/doc-context.ts +62 -0
  460. package/src/khronos/extensions.ts +85 -0
  461. package/src/khronos/jsdoc.ts +152 -56
  462. package/src/khronos/model.ts +314 -69
  463. package/src/khronos/modules.ts +150 -40
  464. package/src/khronos/notes.ts +74 -0
  465. package/src/khronos/param-pair.ts +1 -1
  466. package/src/khronos/parse.ts +3 -4
  467. package/src/khronos/pipeline.ts +95 -42
  468. package/src/khronos/plan.ts +4 -6
  469. package/src/khronos/render.ts +62 -50
  470. package/src/khronos/select.ts +91 -50
  471. package/src/react/element-config.ts +2 -2
  472. package/src/runner.ts +20 -9
  473. package/src/staging.ts +69 -0
  474. package/src/store/compile-store.ts +7 -5
  475. package/src/store/gi/callable-doc.ts +102 -0
  476. package/src/store/gi/callables.ts +58 -44
  477. package/src/store/gi/callback.ts +10 -9
  478. package/src/store/gi/class.ts +83 -49
  479. package/src/store/gi/closure-invocation.ts +26 -0
  480. package/src/store/gi/companion.ts +7 -6
  481. package/src/store/gi/constant.ts +14 -5
  482. package/src/store/gi/constructor-props.ts +19 -23
  483. package/src/store/gi/doc-spec.ts +38 -0
  484. package/src/store/gi/enum.ts +75 -26
  485. package/src/store/gi/function.ts +72 -44
  486. package/src/store/gi/gtype-binding.ts +7 -2
  487. package/src/store/gi/interface.ts +244 -37
  488. package/src/store/gi/item-comparators.ts +3 -5
  489. package/src/store/gi/method.ts +124 -69
  490. package/src/store/gi/param-marshal.ts +91 -6
  491. package/src/store/gi/pipeline.ts +28 -13
  492. package/src/store/gi/properties.ts +10 -5
  493. package/src/store/gi/property-accessor.ts +163 -75
  494. package/src/store/gi/record-constructor.ts +56 -19
  495. package/src/store/gi/record-field-accessor.ts +13 -4
  496. package/src/store/gi/record-layout.ts +12 -2
  497. package/src/store/gi/record.ts +24 -10
  498. package/src/store/gi/registration.ts +5 -5
  499. package/src/store/gi/runtime-override.ts +13 -6
  500. package/src/store/gi/signal.ts +54 -57
  501. package/src/store/gi/value-marshalable.ts +4 -2
  502. package/src/store/gi/vtable.ts +439 -61
  503. package/src/store/gi-store.ts +26 -31
  504. package/src/store/jsx/element-components.ts +8 -5
  505. package/src/store/jsx/element-prop-imports.ts +1 -3
  506. package/src/store/jsx/element-prop-types.ts +10 -1
  507. package/src/store/jsx/generated-elements.ts +17 -8
  508. package/src/store/jsx/intrinsic-elements.ts +4 -0
  509. package/src/store/jsx/jsx.ts +11 -9
  510. package/src/store/jsx/metadata.ts +6 -3
  511. package/src/store/jsx/pipeline.ts +1 -1
  512. package/src/store/jsx/props.ts +20 -7
  513. package/src/store/jsx-store.ts +3 -3
  514. package/src/store/resolve-store.ts +133 -18
  515. package/src/store/store-fs.ts +87 -34
  516. package/src/store/store-links.ts +49 -0
  517. package/src/writer/comparison-context.ts +18 -0
  518. package/src/writer/context.ts +14 -4
  519. package/src/writer/doc-tags.ts +70 -0
  520. package/src/writer/doc.ts +29 -6
  521. package/src/writer/gtk-doc.ts +82 -15
  522. package/src/writer/module.ts +114 -4
  523. package/src/xml.ts +61 -1
@@ -6,18 +6,30 @@ import { renderDescriptor } from "../../analysis/descriptor-render.js";
6
6
  import { inputParameters } from "../../analysis/param-structure.js";
7
7
  import { renderTsType } from "../../analysis/ts-type.js";
8
8
  import { type GirProperty, isConstructableProperty } from "../../gir/property.js";
9
- import { renderJsDoc } from "../../writer/doc.js";
9
+ import { comparisonContextFor } from "../../writer/comparison-context.js";
10
10
  import { renderBlock } from "../../writer/emit.js";
11
11
  import { isEmittableCallable } from "./callables.js";
12
+ import { getDoc } from "./doc-spec.js";
12
13
  import { methodExportName, renderMethodReturnType } from "./method.js";
13
14
 
15
+ type AccessorTypes = {
16
+ readType: string;
17
+ writeType: string;
18
+ };
19
+
20
+ type InheritedAccessorTypes = {
21
+ readType: string | undefined;
22
+ writeType: string | undefined;
23
+ };
24
+
14
25
  type ResolvedAccessor = {
26
+ property: GirProperty;
15
27
  jsName: string;
16
- tsType: string;
28
+ readType: string;
29
+ writeType: string;
17
30
  hasGetter: boolean;
18
31
  isWritable: boolean;
19
32
  getterMember: string | undefined;
20
- getterMethod: GirFunction | undefined;
21
33
  setterMember: string | undefined;
22
34
  };
23
35
 
@@ -26,18 +38,15 @@ type PropertyAccessorArgs = {
26
38
  property: GirProperty;
27
39
  claimedNames: Set<string>;
28
40
  methodByName: Map<string, GirFunction>;
29
- inheritedType?: string | undefined;
41
+ inheritedTypes?: InheritedAccessorTypes | undefined;
42
+ inheritedNames?: Set<string> | undefined;
30
43
  };
31
44
 
32
- type AccessorDelegate = { member: string | undefined; method: GirFunction | undefined };
45
+ type AccessorDelegate = { member: string; method: GirFunction };
46
+ type AccessorDelegates = { getter: AccessorDelegate | undefined; setter: AccessorDelegate | undefined };
47
+ type TypedDelegates = { types: AccessorTypes; delegates: AccessorDelegates };
33
48
 
34
- type GetterBodyOptions = {
35
- context: ModuleContext;
36
- property: GirProperty;
37
- getterMember: string | undefined;
38
- getterMethod: GirFunction | undefined;
39
- tsType: string;
40
- };
49
+ const NULLABLE_SUFFIX = " | null";
41
50
 
42
51
  const isNullablePropertyType = (context: ModuleContext, type: TypeId | undefined): boolean => {
43
52
  if (type === undefined) {
@@ -70,14 +79,17 @@ const resolveDelegate = (
70
79
  attribute: string | undefined,
71
80
  member: string | undefined,
72
81
  isDelegatable: (method: GirFunction) => boolean,
73
- ): AccessorDelegate => {
82
+ ): AccessorDelegate | undefined => {
74
83
  const method = member !== undefined && attribute !== undefined ? args.methodByName.get(attribute) : undefined;
75
- const canDelegate = method === undefined || isDelegatable(method);
76
84
 
77
- return canDelegate ? { member, method } : { member: undefined, method: undefined };
85
+ if (member === undefined || method === undefined || !isDelegatable(method)) {
86
+ return undefined;
87
+ }
88
+
89
+ return { member, method };
78
90
  };
79
91
 
80
- const resolveGetterDelegate = (args: PropertyAccessorArgs, jsName: string): AccessorDelegate => {
92
+ const resolveGetterDelegate = (args: PropertyAccessorArgs, jsName: string): AccessorDelegate | undefined => {
81
93
  const { context, property, claimedNames } = args;
82
94
  const member = delegateMember(property.getter, jsName, claimedNames);
83
95
 
@@ -91,7 +103,11 @@ const resolveGetterDelegate = (args: PropertyAccessorArgs, jsName: string): Acce
91
103
  );
92
104
  };
93
105
 
94
- const resolveSetterDelegate = (args: PropertyAccessorArgs, jsName: string, isWritable: boolean): AccessorDelegate => {
106
+ const resolveSetterDelegate = (
107
+ args: PropertyAccessorArgs,
108
+ jsName: string,
109
+ isWritable: boolean,
110
+ ): AccessorDelegate | undefined => {
95
111
  const { context, property, claimedNames } = args;
96
112
  const member = isWritable ? delegateMember(property.setter, jsName, claimedNames) : undefined;
97
113
 
@@ -103,52 +119,114 @@ const resolveSetterDelegate = (args: PropertyAccessorArgs, jsName: string, isWri
103
119
  );
104
120
  };
105
121
 
106
- const resolveOwnType = (
122
+ const baseTypeName = (type: string): string =>
123
+ type.endsWith(NULLABLE_SUFFIX) ? type.slice(0, -NULLABLE_SUFFIX.length) : type;
124
+
125
+ const areDelegateBaseTypesAgreeing = (
107
126
  context: ModuleContext,
108
- property: GirProperty,
109
- getterMethod: GirFunction | undefined,
110
- setterMethod: GirFunction | undefined,
111
- ): string => {
112
- const setterParam = setterMethod?.parameters[0];
127
+ getter: AccessorDelegate | undefined,
128
+ setter: AccessorDelegate | undefined,
129
+ ): boolean => {
130
+ const setterParam = setter?.method.parameters[0];
113
131
 
114
- if (setterParam !== undefined) {
115
- return renderTsType(context, setterParam.type, setterParam.nullable || setterParam.optional);
132
+ if (setterParam === undefined || getter === undefined) {
133
+ return true;
116
134
  }
117
135
 
118
- if (getterMethod !== undefined) {
119
- return renderMethodReturnType(context, getterMethod);
136
+ const scratch = comparisonContextFor(context);
137
+ const read = baseTypeName(renderMethodReturnType(scratch, getter.method));
138
+ const written = baseTypeName(renderTsType(scratch, setterParam.type, false));
139
+
140
+ return read === written;
141
+ };
142
+
143
+ const resolveDelegates = (args: PropertyAccessorArgs, jsName: string, isWritable: boolean): AccessorDelegates => {
144
+ const getter = resolveGetterDelegate(args, jsName);
145
+ const setter = resolveSetterDelegate(args, jsName, isWritable);
146
+
147
+ if (areDelegateBaseTypesAgreeing(args.context, getter, setter)) {
148
+ return { getter, setter };
120
149
  }
121
150
 
122
- return renderTsType(context, property.type, isNullablePropertyType(context, property.type));
151
+ return { getter, setter: undefined };
152
+ };
153
+
154
+ const declaredPropertyType = (context: ModuleContext, property: GirProperty): string =>
155
+ renderTsType(context, property.type, isNullablePropertyType(context, property.type));
156
+
157
+ const resolveOwnTypes = (
158
+ context: ModuleContext,
159
+ property: GirProperty,
160
+ delegates: AccessorDelegates,
161
+ ): AccessorTypes => {
162
+ const getterMethod = delegates.getter?.method;
163
+ const setterParam = delegates.setter?.method.parameters[0];
164
+
165
+ return {
166
+ readType: getterMethod === undefined
167
+ ? declaredPropertyType(context, property)
168
+ : renderMethodReturnType(context, getterMethod),
169
+ writeType: setterParam === undefined
170
+ ? declaredPropertyType(context, property)
171
+ : renderTsType(context, setterParam.type, setterParam.nullable || setterParam.optional),
172
+ };
123
173
  };
124
174
 
125
- const isSkippedAccessor = (property: GirProperty, jsName: string, claimedNames: Set<string>): boolean =>
126
- !property.introspectable || claimedNames.has(jsName) || jsName === "constructor";
175
+ const isAssignableType = (source: string, target: string): boolean =>
176
+ source === target || baseTypeName(target) === source;
127
177
 
128
- const resolveTsType = (inheritedType: string | undefined, ownType: string): string =>
129
- inheritedType !== undefined && inheritedType !== ownType ? inheritedType : ownType;
178
+ const agreeingDelegates = (
179
+ delegates: AccessorDelegates,
180
+ ownTypes: AccessorTypes,
181
+ declaredTypes: AccessorTypes,
182
+ ): AccessorDelegates => ({
183
+ getter: isAssignableType(ownTypes.readType, declaredTypes.readType) ? delegates.getter : undefined,
184
+ setter: isAssignableType(declaredTypes.writeType, ownTypes.writeType) ? delegates.setter : undefined,
185
+ });
186
+
187
+ const resolveTypedDelegates = (args: PropertyAccessorArgs, resolved: AccessorDelegates): TypedDelegates => {
188
+ const ownTypes = resolveOwnTypes(args.context, args.property, resolved);
189
+
190
+ const types = {
191
+ readType: args.inheritedTypes?.readType ?? ownTypes.readType,
192
+ writeType: args.inheritedTypes?.writeType ?? ownTypes.writeType,
193
+ };
194
+
195
+ return { types, delegates: agreeingDelegates(resolved, ownTypes, types) };
196
+ };
197
+
198
+ const isSkippedAccessor = (args: PropertyAccessorArgs, jsName: string): boolean =>
199
+ !args.property.introspectable ||
200
+ args.claimedNames.has(jsName) ||
201
+ args.inheritedNames?.has(jsName) === true ||
202
+ jsName === "constructor";
130
203
 
131
204
  const resolveAccessor = (args: PropertyAccessorArgs): ResolvedAccessor | undefined => {
132
- const { context, property, claimedNames } = args;
205
+ const { property } = args;
133
206
  const jsName = toCamelIdentifier(property.name);
134
207
 
135
- if (isSkippedAccessor(property, jsName, claimedNames)) {
208
+ if (isSkippedAccessor(args, jsName)) {
136
209
  return undefined;
137
210
  }
138
211
 
139
212
  const isWritable = isConstructableProperty(property) && !property.constructOnly;
140
- const { member: getterMember, method: getterMethod } = resolveGetterDelegate(args, jsName);
141
- const { member: setterMember, method: setterMethod } = resolveSetterDelegate(args, jsName, isWritable);
142
- const hasGetter = property.readable || getterMember !== undefined;
213
+ const { types, delegates } = resolveTypedDelegates(args, resolveDelegates(args, jsName, isWritable));
214
+ const hasGetter = property.readable || delegates.getter !== undefined;
143
215
 
144
216
  if (!hasGetter && !isWritable) {
145
217
  return undefined;
146
218
  }
147
219
 
148
- const ownType = resolveOwnType(context, property, getterMethod, setterMethod);
149
- const tsType = resolveTsType(args.inheritedType, ownType);
150
-
151
- return { jsName, tsType, hasGetter, isWritable, getterMember, getterMethod, setterMember };
220
+ return {
221
+ property,
222
+ jsName,
223
+ readType: types.readType,
224
+ writeType: types.writeType,
225
+ hasGetter,
226
+ isWritable,
227
+ getterMember: delegates.getter?.member,
228
+ setterMember: delegates.setter?.member,
229
+ };
152
230
  };
153
231
 
154
232
  const resolveOwnerAccessor = (
@@ -171,11 +249,22 @@ const resolveOwnerAccessor = (
171
249
  return resolveAccessor({ context, property, claimedNames, methodByName });
172
250
  };
173
251
 
174
- const resolveAccessorType = (
252
+ const resolveAccessorTypes = (
175
253
  context: ModuleContext,
176
254
  property: GirProperty,
177
255
  methods: GirFunction[],
178
- ): string | undefined => resolveOwnerAccessor(context, property, methods)?.tsType;
256
+ ): InheritedAccessorTypes | undefined => {
257
+ const accessor = resolveOwnerAccessor(context, property, methods);
258
+
259
+ if (accessor === undefined) {
260
+ return undefined;
261
+ }
262
+
263
+ return {
264
+ readType: accessor.hasGetter ? accessor.readType : undefined,
265
+ writeType: accessor.isWritable ? accessor.writeType : undefined,
266
+ };
267
+ };
179
268
 
180
269
  const withAccessor = (
181
270
  args: PropertyAccessorArgs,
@@ -195,41 +284,49 @@ const renderResolvedPropertyAccessor = (
195
284
  property: GirProperty,
196
285
  accessor: ResolvedAccessor,
197
286
  ): string => {
198
- const { jsName, tsType, hasGetter, isWritable, getterMember, getterMethod, setterMember } = accessor;
287
+ const { jsName, readType, writeType, hasGetter, isWritable, setterMember } = accessor;
199
288
  const blocks: string[] = [];
200
289
 
201
290
  if (hasGetter) {
202
- const getterBody = renderGetterBody({ context, property, getterMember, getterMethod, tsType });
203
- blocks.push(renderBlock(`get ${jsName}(): ${tsType}`, getterBody));
291
+ blocks.push(renderBlock(`get ${jsName}(): ${readType}`, renderGetterBody(context, property, accessor)));
204
292
  }
205
293
 
206
294
  if (isWritable) {
207
295
  const setterBody =
208
296
  setterMember === undefined ? renderGenericSetBody(context, property) : `this.${setterMember}(value);`;
209
297
 
210
- blocks.push(renderBlock(`set ${jsName}(value: ${tsType})`, setterBody));
298
+ blocks.push(renderBlock(`set ${jsName}(value: ${writeType})`, setterBody));
211
299
  }
212
300
 
213
- return `${renderJsDoc(property.doc)}${blocks.join("\n\n")}`;
301
+ return `${propertyDoc(property)}${blocks.join("\n\n")}`;
214
302
  };
215
303
 
304
+ const propertyDoc = (property: GirProperty): string =>
305
+ getDoc(property);
306
+
216
307
  const renderPropertyAccessor = (args: PropertyAccessorArgs): string | undefined =>
217
308
  withAccessor(args, (accessor) => renderResolvedPropertyAccessor(args.context, args.property, accessor));
218
309
 
219
- const renderPropertyAccessorSignature = (args: PropertyAccessorArgs): string | undefined =>
220
- withAccessor(args, ({ jsName, tsType, hasGetter, isWritable }) => {
221
- const doc = renderJsDoc(args.property.doc);
310
+ const renderAccessorPairSignature = (accessor: ResolvedAccessor): string => {
311
+ const { jsName, readType, writeType, hasGetter, isWritable } = accessor;
222
312
 
223
- if (hasGetter && isWritable) {
224
- return `${doc}${jsName}: ${tsType};`;
225
- }
313
+ if (!hasGetter) {
314
+ return `set ${jsName}(value: ${writeType});`;
315
+ }
226
316
 
227
- if (hasGetter) {
228
- return `${doc}get ${jsName}(): ${tsType};`;
229
- }
317
+ if (!isWritable) {
318
+ return `get ${jsName}(): ${readType};`;
319
+ }
320
+
321
+ if (readType === writeType) {
322
+ return `${jsName}: ${readType};`;
323
+ }
230
324
 
231
- return `${doc}set ${jsName}(value: ${tsType});`;
232
- });
325
+ return `get ${jsName}(): ${readType};\nset ${jsName}(value: ${writeType});`;
326
+ };
327
+
328
+ const renderPropertyAccessorSignature = (args: PropertyAccessorArgs): string | undefined =>
329
+ withAccessor(args, (accessor) => `${propertyDoc(args.property)}${renderAccessorPairSignature(accessor)}`);
233
330
 
234
331
  const renderPropertyDescriptor = (context: ModuleContext, property: GirProperty): string =>
235
332
  renderDescriptor(context, property.type, property.transferOwnership);
@@ -250,21 +347,10 @@ const renderGenericSetBody = (context: ModuleContext, property: GirProperty): st
250
347
  return `setObjectProperty(this, ${sourceStringLiteral(property.name)}, ${descriptor}, value);`;
251
348
  };
252
349
 
253
- const renderGetterBody = (options: GetterBodyOptions): string => {
254
- const { context, property, getterMember, getterMethod, tsType } = options;
255
-
256
- if (getterMember === undefined) {
257
- return renderGenericGetBody(context, property, tsType);
258
- }
259
-
260
- if (getterMethod === undefined) {
261
- return `return this.${getterMember}() as ${tsType};`;
262
- }
263
-
264
- const getterType = renderMethodReturnType(context, getterMethod);
265
-
266
- return getterType === tsType ? `return this.${getterMember}();` : `return this.${getterMember}() as ${tsType};`;
267
- };
350
+ const renderGetterBody = (context: ModuleContext, property: GirProperty, accessor: ResolvedAccessor): string =>
351
+ accessor.getterMember === undefined
352
+ ? renderGenericGetBody(context, property, accessor.readType)
353
+ : `return this.${accessor.getterMember}();`;
268
354
 
269
355
  const delegateMember = (
270
356
  attribute: string | undefined,
@@ -289,12 +375,14 @@ const delegateMember = (
289
375
  };
290
376
 
291
377
  export {
378
+ propertyDoc,
292
379
  resolveAccessor,
293
380
  resolveOwnerAccessor,
294
- resolveAccessorType,
381
+ resolveAccessorTypes,
295
382
  renderResolvedPropertyAccessor,
296
383
  renderPropertyAccessor,
297
384
  renderPropertyAccessorSignature,
385
+ type InheritedAccessorTypes,
298
386
  type ResolvedAccessor,
299
387
  type PropertyAccessorArgs,
300
388
  };
@@ -1,11 +1,15 @@
1
1
  import { sourceStringLiteral, toCamelIdentifier } from "@gtkx/utils";
2
2
  import type { GirField } from "../../gir/field.js";
3
+ import type { GirFunction } from "../../gir/function.js";
3
4
  import type { GirRecord } from "../../gir/record.js";
4
5
  import type { TypeId } from "../../gir/type-id.js";
5
6
  import type { ModuleContext } from "../../writer/context.js";
6
7
  import { renderDescriptor } from "../../analysis/descriptor-render.js";
8
+ import { inputParameters, parameterIdentifier } from "../../analysis/param-structure.js";
7
9
  import { renderTsType } from "../../analysis/ts-type.js";
8
10
  import { renderBlock, renderBracedOrEmpty } from "../../writer/emit.js";
11
+ import { type Callables, staticMembers } from "./callables.js";
12
+ import { getDoc } from "./doc-spec.js";
9
13
  import { renderSourceGtype } from "./gtype-binding.js";
10
14
  import { emitFieldWrite, isEmittableField, isInlineField } from "./record-field-accessor.js";
11
15
  import { computeRecordFieldSlots, type RecordFieldSlot } from "./record-layout.js";
@@ -13,33 +17,70 @@ import { isConstructibleRecord } from "./value-marshalable.js";
13
17
 
14
18
  type WritableFieldSlot = RecordFieldSlot & { field: GirField & { type: TypeId } };
15
19
 
20
+ type RecordConstructorSpec = {
21
+ record: GirRecord;
22
+ className: string;
23
+ callables: Callables;
24
+ isErrorSubclass: boolean;
25
+ };
26
+
16
27
  const isWritableFieldSlot = (context: ModuleContext, entry: RecordFieldSlot): entry is WritableFieldSlot =>
17
28
  entry.field.writable && isEmittableField(context, entry.field);
18
29
 
19
- const isOpaque = (record: GirRecord): boolean => record.opaque || record.disguised;
20
-
21
30
  const renderRecordConstructorPropsInterface = (
22
31
  context: ModuleContext,
23
32
  record: GirRecord,
24
33
  className: string,
25
34
  ): string => {
26
35
  const head = `export interface ${className}ConstructorProps`;
27
-
28
- if (isOpaque(record) || !isConstructibleRecord(context, context.namespace.name, record)) {
29
- return renderBracedOrEmpty(head, "");
30
- }
31
-
32
36
  const { slots } = computeRecordFieldSlots(context, record.fields, record.isUnion);
33
37
 
34
38
  const lines = slots
35
39
  .filter((entry): entry is WritableFieldSlot => isWritableFieldSlot(context, entry))
36
- .map((entry) => `${toCamelIdentifier(entry.field.name)}?: ${renderTsType(context, entry.field.type, true)};`);
40
+ .map(
41
+ (entry) =>
42
+ `${getDoc(entry.field)}${toCamelIdentifier(entry.field.name)}?: ` +
43
+ `${renderTsType(context, entry.field.type, true)};`,
44
+ );
37
45
 
38
46
  return renderBracedOrEmpty(head, lines.join("\n"));
39
47
  };
40
48
 
41
- const renderOpaqueConstructor = (className: string, superCall: string[]): string => {
42
- const message = sourceStringLiteral(`Cannot construct ${className}: opaque boxed type with no known layout`);
49
+ const isSelfReturning = (context: ModuleContext, record: GirRecord, callable: GirFunction): boolean => {
50
+ const ref = callable.returnValue.type;
51
+ const name = ref === undefined ? undefined : context.library.nameFor(ref);
52
+
53
+ return name?.namespaceName === context.namespace.name && name.typeName === record.name;
54
+ };
55
+
56
+ const renderStaticCall = (context: ModuleContext, callable: GirFunction, name: string): string => {
57
+ const args = inputParameters(context.library, callable).map(({ parameter, index }) =>
58
+ parameterIdentifier(parameter, index));
59
+
60
+ return `${name}(${args.join(", ")})`;
61
+ };
62
+
63
+ const constructionHint = (context: ModuleContext, spec: RecordConstructorSpec): string | undefined => {
64
+ const candidates = staticMembers(context, spec.callables).filter(({ callable }) =>
65
+ isSelfReturning(context, spec.record, callable));
66
+
67
+ const candidate = candidates.find(({ name }) => name === "new") ?? candidates[0];
68
+
69
+ return candidate === undefined ? undefined : renderStaticCall(context, candidate.callable, candidate.name);
70
+ };
71
+
72
+ const unconstructibleMessage = (context: ModuleContext, spec: RecordConstructorSpec): string => {
73
+ const qualified = `${context.namespace.name}.${spec.className}`;
74
+ const hint = constructionHint(context, spec);
75
+
76
+ return hint === undefined
77
+ ? `Cannot construct ${qualified} with new: its instances come from the functions that return them.`
78
+ : `Cannot construct ${qualified} with new: use ${qualified}.${hint} instead.`;
79
+ };
80
+
81
+ const renderUnconstructibleGuard = (context: ModuleContext, spec: RecordConstructorSpec): string => {
82
+ const superCall = spec.isErrorSubclass ? ["super();"] : [];
83
+ const message = sourceStringLiteral(unconstructibleMessage(context, spec));
43
84
 
44
85
  return renderBlock("constructor()", [...superCall, `throw new globalThis.Error(${message});`].join("\n"));
45
86
  };
@@ -61,18 +102,14 @@ const renderFieldWrites = (context: ModuleContext, slots: RecordFieldSlot[]): st
61
102
  return statements;
62
103
  };
63
104
 
64
- const renderRecordConstructor = (
65
- context: ModuleContext,
66
- record: GirRecord,
67
- className: string,
68
- isErrorSubclass = false,
69
- ): string => {
70
- const superCall = isErrorSubclass ? ["super();"] : [];
105
+ const renderRecordConstructor = (context: ModuleContext, spec: RecordConstructorSpec): string => {
106
+ const { record, className, isErrorSubclass } = spec;
71
107
 
72
- if (isOpaque(record) || !isConstructibleRecord(context, context.namespace.name, record)) {
73
- return renderOpaqueConstructor(className, superCall);
108
+ if (!isConstructibleRecord(context, context.namespace.name, record)) {
109
+ return renderUnconstructibleGuard(context, spec);
74
110
  }
75
111
 
112
+ const superCall = isErrorSubclass ? ["super();"] : [];
76
113
  const { slots, size } = computeRecordFieldSlots(context, record.fields, record.isUnion);
77
114
 
78
115
  if (size === 0) {
@@ -1,5 +1,7 @@
1
1
  import { toCamelIdentifier } from "@gtkx/utils";
2
+ import type { GirAnnotations } from "../../gir/annotations.js";
2
3
  import type { GirField } from "../../gir/field.js";
4
+ import type { GirRecord } from "../../gir/record.js";
3
5
  import type { FieldSlot } from "../../gir/size.js";
4
6
  import type { TypeId } from "../../gir/type-id.js";
5
7
  import type { GirType } from "../../gir/type.js";
@@ -7,8 +9,8 @@ import type { ModuleContext } from "../../writer/context.js";
7
9
  import { isInlineCallbackRef, renderDescriptor } from "../../analysis/descriptor-render.js";
8
10
  import { tStruct } from "../../analysis/descriptor.js";
9
11
  import { renderTsType } from "../../analysis/ts-type.js";
10
- import { renderJsDoc } from "../../writer/doc.js";
11
12
  import { indent, renderBlock } from "../../writer/emit.js";
13
+ import { getDoc } from "./doc-spec.js";
12
14
  import { bitMask, computeRecordFieldSlots, mergeBitfield, type RecordFieldSlot } from "./record-layout.js";
13
15
  import { wrapReturnValue } from "./return-wrap.js";
14
16
  import { isValueMarshalable } from "./value-marshalable.js";
@@ -30,6 +32,7 @@ type RecordFieldEntry = {
30
32
  tsType: string;
31
33
  isWritable: boolean;
32
34
  doc: string | undefined;
35
+ annotations: GirAnnotations;
33
36
  };
34
37
 
35
38
  type InlineFieldVisit = {
@@ -180,6 +183,7 @@ const resolveRecordFieldEntry = (
180
183
  tsType: renderTsType(context, admitted.field.type, false),
181
184
  isWritable: admitted.field.writable,
182
185
  doc: admitted.field.doc,
186
+ annotations: admitted.field.annotations,
183
187
  };
184
188
  };
185
189
 
@@ -196,7 +200,7 @@ const renderRecordFieldAccessor = (
196
200
  }
197
201
 
198
202
  const { field, jsName } = admitted;
199
- const doc = renderJsDoc(field.doc);
203
+ const doc = getDoc(field);
200
204
  const structArray = renderStructArrayAccessor(context, { field, jsName, slot: slot.slot, siblingFields });
201
205
 
202
206
  if (structArray !== undefined) {
@@ -476,6 +480,12 @@ const structArraySetterBlock = (options: StructArrayAccessorOptions): string =>
476
480
  structArraySetterStatements(options.context, options),
477
481
  );
478
482
 
483
+ const isPlainDataRecord = (record: GirRecord): boolean =>
484
+ record.glibGetType === undefined &&
485
+ record.constructors.length === 0 &&
486
+ record.functions.length === 0 &&
487
+ record.methods.length === 0;
488
+
479
489
  const resolveStructArrayElements = (context: ModuleContext, fieldType: TypeId): StructArrayElements | undefined => {
480
490
  const arrayType = context.library.typeFor(fieldType);
481
491
 
@@ -485,7 +495,7 @@ const resolveStructArrayElements = (context: ModuleContext, fieldType: TypeId):
485
495
 
486
496
  const elementType = context.library.typeFor(arrayType.element);
487
497
 
488
- if (elementType?.kind === "record" && elementType.value.glibGetType !== undefined) {
498
+ if (elementType?.kind === "record" && !isPlainDataRecord(elementType.value)) {
489
499
  return undefined;
490
500
  }
491
501
 
@@ -632,5 +642,4 @@ export {
632
642
  emitFieldWrite,
633
643
  resolveRecordFieldEntry,
634
644
  renderRecordFieldAccessor,
635
- type RecordFieldEntry,
636
645
  };
@@ -46,6 +46,16 @@ const computeRecordFieldSlots = (
46
46
  return { slots, size: result.size };
47
47
  };
48
48
 
49
+ const recordInlineSize = (context: ModuleContext, record: ResolvedRecordValue): number | undefined => {
50
+ if (record.opaque || record.disguised || record.fields.length === 0) {
51
+ return undefined;
52
+ }
53
+
54
+ const { size } = computeRecordFieldSlots(context, record.fields, record.isUnion);
55
+
56
+ return size > 0 ? size : undefined;
57
+ };
58
+
49
59
  const bitMask = (width: number): number => {
50
60
  if (width >= 32) {
51
61
  return 0xFF_FF_FF_FF;
@@ -66,7 +76,7 @@ const mergeBitfield = (readExpr: string, valueExpr: string, mask: number, shift:
66
76
 
67
77
  const fieldLayoutInput = (context: ModuleContext, field: GirField, visited: Set<string>): FieldLayoutInput => {
68
78
  if (field.inlineMembers !== undefined) {
69
- const layout = inlineMemberLayout(context, field.inlineMembers, field.inlineIsUnion, visited);
79
+ const layout = inlineMemberLayout(context, field.inlineMembers, field.isInlineUnion, visited);
70
80
 
71
81
  return { layout, bits: undefined };
72
82
  }
@@ -214,4 +224,4 @@ const resolveAliasLayout = (
214
224
  return layoutOfType(context, ref, resolved.value.targetCType, visited);
215
225
  };
216
226
 
217
- export { computeRecordFieldSlots, bitMask, mergeBitfield, type RecordFieldSlot };
227
+ export { computeRecordFieldSlots, recordInlineSize, bitMask, mergeBitfield, type RecordFieldSlot };
@@ -1,27 +1,26 @@
1
+ import { sanitizeTypeIdentifier } from "@gtkx/utils";
1
2
  import type { GirRecord } from "../../gir/record.js";
2
3
  import type { ModuleContext } from "../../writer/context.js";
3
- import { renderJsDoc } from "../../writer/doc.js";
4
+ import { isEmittableEntity } from "../../gir/emittable.js";
4
5
  import { indentMembers } from "../../writer/emit.js";
5
6
  import { type Callables, dedupeCallables, generateBindings, renderPlainTypeMembers } from "./callables.js";
7
+ import { getDoc } from "./doc-spec.js";
6
8
  import { renderSourceGtype } from "./gtype-binding.js";
7
9
  import { renderRecordConstructor, renderRecordConstructorPropsInterface } from "./record-constructor.js";
8
10
  import { renderRecordFieldAccessor } from "./record-field-accessor.js";
9
11
  import { computeRecordFieldSlots } from "./record-layout.js";
10
12
  import { appendWrapperClassRegistration } from "./registration.js";
13
+ import { isConstructibleRecord } from "./value-marshalable.js";
11
14
 
12
15
  const isGErrorRecord = (context: ModuleContext, record: GirRecord): boolean =>
13
16
  context.namespace.name === "GLib" && record.glibGetType === "g_error_get_type";
14
17
 
15
18
  const generateRecord = (context: ModuleContext, record: GirRecord): void => {
16
- if (!record.introspectable) {
19
+ if (!isEmittableEntity(record)) {
17
20
  return;
18
21
  }
19
22
 
20
- if (record.name.length === 0) {
21
- return;
22
- }
23
-
24
- const className = record.name;
23
+ const className = sanitizeTypeIdentifier(record.name);
25
24
  const isErrorSubclass = isGErrorRecord(context, record);
26
25
 
27
26
  const callables: Callables = {
@@ -34,8 +33,23 @@ const generateRecord = (context: ModuleContext, record: GirRecord): void => {
34
33
  const members = renderRecordMembers(context, record, className, callables);
35
34
  const body = indentMembers(members);
36
35
  const heritage = isErrorSubclass ? " extends globalThis.Error" : "";
37
- context.module.appendDeclaration(`${renderJsDoc(record.doc)}export class ${className}${heritage} {\n${body}\n}`);
38
- context.module.appendDeclaration(renderRecordConstructorPropsInterface(context, record, className));
36
+ const doc = getDoc(record);
37
+ const isConstructible = isConstructibleRecord(context, context.namespace.name, record);
38
+ const modifier = isConstructible ? "" : "abstract ";
39
+
40
+ context.declare({
41
+ name: className,
42
+ code: `${doc}export ${modifier}class ${className}${heritage} {\n${body}\n}`,
43
+ owner: record.name,
44
+ });
45
+
46
+ if (isConstructible) {
47
+ context.declare({
48
+ name: `${className}ConstructorProps`,
49
+ code: renderRecordConstructorPropsInterface(context, record, className),
50
+ });
51
+ }
52
+
39
53
  const gtypeExpr = renderSourceGtype(context, record);
40
54
 
41
55
  appendWrapperClassRegistration(context, {
@@ -59,7 +73,7 @@ const renderRecordMembers = (
59
73
  hasGtype: record.glibGetType !== undefined,
60
74
  });
61
75
 
62
- members.unshift(renderRecordConstructor(context, record, className, isErrorSubclass));
76
+ members.unshift(renderRecordConstructor(context, { record, className, callables, isErrorSubclass }));
63
77
  const { slots } = computeRecordFieldSlots(context, record.fields, record.isUnion);
64
78
 
65
79
  for (const slot of slots) {