@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
@@ -1,13 +1,17 @@
1
- import { camelCase, lowerFirst, pascalCase, toCamelIdentifier } from "@gtkx/utils";
1
+ import { lowerFirst, pascalCase, sanitizeTypeIdentifier, toCamelIdentifier } from "@gtkx/utils";
2
2
  import type { GirClass } from "../gir/class.js";
3
3
  import type { GirFunction } from "../gir/function.js";
4
4
  import type { Library } from "../gir/library.js";
5
+ import type { GirParameter } from "../gir/parameter.js";
5
6
  import type { GirProperty } from "../gir/property.js";
6
7
  import type { TypeId } from "../gir/type-id.js";
7
8
  import type { ModuleContext } from "../writer/context.js";
8
- import { ancestorChain, type ResolvedAncestor, resolveInterface } from "../gir/ancestry.js";
9
- import { methodExportName } from "../store/gi/method.js";
10
- import { resolveAccessorType } from "../store/gi/property-accessor.js";
9
+ import { ancestorChain, type ResolvedAncestor, resolveInterfaces } from "../gir/ancestry.js";
10
+ import { isEmittableEntity } from "../gir/emittable.js";
11
+ import { memberName, methodExportName } from "../store/gi/method.js";
12
+ import { type InheritedAccessorTypes, resolveAccessorTypes } from "../store/gi/property-accessor.js";
13
+ import { vfuncMemberNames } from "../store/gi/vtable.js";
14
+ import { comparisonContextFor } from "../writer/comparison-context.js";
11
15
  import { inputParameters } from "./param-structure.js";
12
16
  import { renderTsType } from "./ts-type.js";
13
17
 
@@ -17,6 +21,8 @@ type AncestryContext = {
17
21
  };
18
22
 
19
23
  type OwnedProperty = { owner: GirClass; property: GirProperty };
24
+ type DeclaredAccessorType = { type: string; owner: string };
25
+ type DeclaredAccessorTypes = { read: DeclaredAccessorType | undefined; write: DeclaredAccessorType | undefined };
20
26
  type MethodSignature = { returnType: string; arity: number };
21
27
 
22
28
  type InheritedMethod = {
@@ -29,6 +35,11 @@ type InheritedMethods = {
29
35
  definitions: Map<string, InheritedMethod>;
30
36
  };
31
37
 
38
+ type ParameterPair = {
39
+ own: GirParameter;
40
+ inherited: GirParameter;
41
+ };
42
+
32
43
  type InheritedMatch = {
33
44
  inheritedReturn: string;
34
45
  inheritedMethod: InheritedMethod;
@@ -45,29 +56,11 @@ const RESERVED_SIGNAL_MEMBERS = new Set([
45
56
  "removeEventListener",
46
57
  ]);
47
58
 
48
- const resolveImplementedInterface = (
49
- context: AncestryContext,
50
- name: string,
51
- defaultNamespace: string = context.namespace.name,
52
- ): ResolvedAncestor | undefined => resolveInterface(context.library, defaultNamespace, name);
53
-
54
59
  const resolveDirectInterfaces = (
55
60
  context: AncestryContext,
56
61
  klass: GirClass,
57
62
  defaultNamespace: string,
58
- ): ResolvedAncestor[] => {
59
- const interfaces: ResolvedAncestor[] = [];
60
-
61
- for (const implementName of klass.implements) {
62
- const iface = resolveImplementedInterface(context, implementName, defaultNamespace);
63
-
64
- if (iface !== undefined) {
65
- interfaces.push(iface);
66
- }
67
- }
68
-
69
- return interfaces;
70
- };
63
+ ): ResolvedAncestor[] => resolveInterfaces(context.library, defaultNamespace, klass.implements);
71
64
 
72
65
  const resolvePrerequisiteReference = (context: ModuleContext, name: string): string | undefined => {
73
66
  const resolved = context.library.resolveType(context.namespace.name, name);
@@ -80,7 +73,11 @@ const resolvePrerequisiteReference = (context: ModuleContext, name: string): str
80
73
  return undefined;
81
74
  }
82
75
 
83
- return context.qualify(resolved.namespace.name, pascalCase(resolved.value.name));
76
+ if (!isEmittableEntity(resolved.value)) {
77
+ return undefined;
78
+ }
79
+
80
+ return context.qualify(resolved.namespace.name, sanitizeTypeIdentifier(resolved.value.name));
84
81
  };
85
82
 
86
83
  const forEachAncestor = (
@@ -116,7 +113,7 @@ const visitInterfaceProperties = (
116
113
  }
117
114
  };
118
115
 
119
- const forEachInheritedProperty = (
116
+ const forEachAncestorProperty = (
120
117
  context: ModuleContext,
121
118
  klass: GirClass,
122
119
  visit: (owner: GirClass, property: GirProperty) => void,
@@ -130,6 +127,15 @@ const forEachInheritedProperty = (
130
127
  });
131
128
  };
132
129
 
130
+ const forEachInheritedProperty = (
131
+ context: ModuleContext,
132
+ klass: GirClass,
133
+ visit: (owner: GirClass, property: GirProperty) => void,
134
+ ): void => {
135
+ visitInterfaceProperties(resolveDirectInterfaces(context, klass, context.namespace.name), visit);
136
+ forEachAncestorProperty(context, klass, visit);
137
+ };
138
+
133
139
  const collectSeenPropertyNames = (context: ModuleContext, klass: GirClass): Set<string> => {
134
140
  const seen: Set<string> = new Set();
135
141
 
@@ -137,7 +143,7 @@ const collectSeenPropertyNames = (context: ModuleContext, klass: GirClass): Set<
137
143
  seen.add(toCamelIdentifier(property.name));
138
144
  }
139
145
 
140
- forEachInheritedProperty(context, klass, (_owner, property) => seen.add(toCamelIdentifier(property.name)));
146
+ forEachAncestorProperty(context, klass, (_owner, property) => seen.add(toCamelIdentifier(property.name)));
141
147
 
142
148
  return seen;
143
149
  };
@@ -176,7 +182,7 @@ const recordAncestorSignatures = (
176
182
  signatures: Map<string, MethodSignature>,
177
183
  ): void => {
178
184
  for (const method of klass.methods) {
179
- const name = camelCase(method.name);
185
+ const name = memberName(method.name);
180
186
 
181
187
  if (!method.introspectable || signatures.has(name)) {
182
188
  continue;
@@ -199,6 +205,9 @@ const ancestorClassMethodSignatures = (context: ModuleContext, klass: GirClass):
199
205
  return signatures;
200
206
  };
201
207
 
208
+ const ancestorClassMethodNames = (context: ModuleContext, klass: GirClass): Set<string> =>
209
+ new Set(ancestorClassMethodSignatures(context, klass).keys());
210
+
202
211
  const mergeOmissionName = (
203
212
  context: ModuleContext,
204
213
  method: GirFunction,
@@ -208,7 +217,7 @@ const mergeOmissionName = (
208
217
  return undefined;
209
218
  }
210
219
 
211
- const name = camelCase(method.name);
220
+ const name = memberName(method.name);
212
221
  const ancestor = ancestors.get(name);
213
222
 
214
223
  if (ancestor === undefined) {
@@ -221,43 +230,105 @@ const mergeOmissionName = (
221
230
  return ancestor.returnType !== returnType || ancestor.arity !== arity ? name : undefined;
222
231
  };
223
232
 
224
- const collectInterfaceMergeOmissions = (
233
+ const classChainVfuncNames = (context: ModuleContext, klass: GirClass): Set<string> => {
234
+ const names: Set<string> = new Set(vfuncMemberNames(context, context.namespace.name, klass));
235
+
236
+ forEachAncestor(context, klass, (ancestor) => {
237
+ for (const name of vfuncMemberNames(context, ancestor.namespaceName, ancestor.klass)) {
238
+ names.add(name);
239
+ }
240
+ });
241
+
242
+ return names;
243
+ };
244
+
245
+ const methodMergeOmissions = (context: ModuleContext, klass: GirClass, iface: GirClass): string[] => {
246
+ const ancestors = ancestorClassMethodSignatures(context, klass);
247
+
248
+ return iface.methods
249
+ .map((method) => mergeOmissionName(context, method, ancestors))
250
+ .filter((name): name is string => name !== undefined);
251
+ };
252
+
253
+ const vfuncMergeOmissions = (
225
254
  context: ModuleContext,
226
255
  klass: GirClass,
227
256
  iface: { klass: GirClass; namespaceName: string },
228
257
  ): string[] => {
229
- const ancestors = ancestorClassMethodSignatures(context, klass);
230
- const omissions: string[] = [];
258
+ const claimed = classChainVfuncNames(context, klass);
231
259
 
232
- for (const method of iface.klass.methods) {
233
- const name = mergeOmissionName(context, method, ancestors);
260
+ return vfuncMemberNames(context, iface.namespaceName, iface.klass).filter((name) => claimed.has(name));
261
+ };
234
262
 
235
- if (name !== undefined) {
236
- omissions.push(name);
237
- }
263
+ const collectInterfaceMergeOmissions = (
264
+ context: ModuleContext,
265
+ klass: GirClass,
266
+ iface: { klass: GirClass; namespaceName: string },
267
+ ): string[] => [
268
+ ...methodMergeOmissions(context, klass, iface.klass),
269
+ ...vfuncMergeOmissions(context, klass, iface),
270
+ ];
271
+
272
+ const declaredBy = (type: string | undefined, owner: string): DeclaredAccessorType | undefined =>
273
+ type === undefined ? undefined : { type, owner };
274
+
275
+ const reconcileAccessorType = (
276
+ jsName: string,
277
+ direction: string,
278
+ declared: DeclaredAccessorType | undefined,
279
+ candidate: DeclaredAccessorType | undefined,
280
+ ): DeclaredAccessorType | undefined => {
281
+ if (candidate === undefined) {
282
+ return declared;
238
283
  }
239
284
 
240
- return omissions;
285
+ if (declared === undefined || declared.type === candidate.type) {
286
+ return declared ?? candidate;
287
+ }
288
+
289
+ throw new Error(
290
+ `Cannot type the ${direction} accessor of ${jsName}: ${declared.owner} declares it as ${declared.type} ` +
291
+ `and ${candidate.owner} declares it as ${candidate.type}. Both are bases of the same class, so no single ` +
292
+ "member satisfies them; correct the GIR the disagreeing base comes from.",
293
+ );
241
294
  };
242
295
 
243
- const collectInheritedPropertyTypes = (context: ModuleContext, klass: GirClass): Map<string, string> => {
244
- const types: Map<string, string> = new Map();
296
+ const recordInheritedPropertyType = (
297
+ context: ModuleContext,
298
+ types: Map<string, DeclaredAccessorTypes>,
299
+ owner: GirClass,
300
+ property: GirProperty,
301
+ ): void => {
302
+ const accessorTypes = resolveAccessorTypes(context, property, owner.methods);
245
303
 
246
- const record = (owner: GirClass, property: GirProperty): void => {
247
- const jsName = toCamelIdentifier(property.name);
304
+ if (accessorTypes === undefined) {
305
+ return;
306
+ }
248
307
 
249
- if (types.has(jsName)) {
250
- return;
251
- }
308
+ const jsName = toCamelIdentifier(property.name);
309
+ const declared = types.get(jsName);
252
310
 
253
- const tsType = resolveAccessorType(context, property, owner.methods);
311
+ types.set(jsName, {
312
+ read: reconcileAccessorType(jsName, "read", declared?.read, declaredBy(accessorTypes.readType, owner.name)),
313
+ write: reconcileAccessorType(jsName, "write", declared?.write, declaredBy(accessorTypes.writeType, owner.name)),
314
+ });
315
+ };
254
316
 
255
- if (tsType !== undefined) {
256
- types.set(jsName, tsType);
257
- }
258
- };
317
+ const collectInheritedPropertyTypes = (
318
+ context: ModuleContext,
319
+ klass: GirClass,
320
+ ): Map<string, InheritedAccessorTypes> => {
321
+ const declared: Map<string, DeclaredAccessorTypes> = new Map();
322
+
323
+ forEachInheritedProperty(context, klass, (owner, property) => {
324
+ recordInheritedPropertyType(context, declared, owner, property);
325
+ });
326
+
327
+ const types: Map<string, InheritedAccessorTypes> = new Map();
259
328
 
260
- forEachInheritedProperty(context, klass, record);
329
+ for (const [jsName, entry] of declared) {
330
+ types.set(jsName, { readType: entry.read?.type, writeType: entry.write?.type });
331
+ }
261
332
 
262
333
  return types;
263
334
  };
@@ -295,7 +366,7 @@ const absorbInheritedMethods = (
295
366
  continue;
296
367
  }
297
368
 
298
- const name = camelCase(method.name);
369
+ const name = memberName(method.name);
299
370
 
300
371
  if (returnTypes.has(name)) {
301
372
  continue;
@@ -329,11 +400,49 @@ const hasMethodConflict = (options: {
329
400
  return (
330
401
  inheritedReturn !== ownReturn ||
331
402
  hasParameterEnumConflict(context, callable, inheritedMethod) ||
332
- inputParameters(context.library, callable).length !==
333
- inputParameters(context.library, inheritedMethod.method).length
403
+ hasParameterTypeConflict(context, callable, inheritedMethod.method)
334
404
  );
335
405
  };
336
406
 
407
+ const isCallbackType = (context: ModuleContext, ref: TypeId | undefined): boolean =>
408
+ ref !== undefined && context.library.typeFor(ref)?.kind === "callback";
409
+
410
+ const areParametersComparable = (context: ModuleContext, pair: ParameterPair): boolean => {
411
+ if (isCallbackType(context, pair.own.type) && isCallbackType(context, pair.inherited.type)) {
412
+ return true;
413
+ }
414
+
415
+ const scratch = comparisonContextFor(context);
416
+
417
+ return renderTsType(scratch, pair.own.type, false) === renderTsType(scratch, pair.inherited.type, false);
418
+ };
419
+
420
+ const inputParameterPairs = (context: ModuleContext, own: GirFunction, inherited: GirFunction): ParameterPair[] => {
421
+ const ownParams = inputParameters(context.library, own);
422
+ const inheritedParams = inputParameters(context.library, inherited);
423
+ const pairs: ParameterPair[] = [];
424
+
425
+ for (const [index, entry] of ownParams.entries()) {
426
+ const other = inheritedParams[index];
427
+
428
+ if (other !== undefined) {
429
+ pairs.push({ own: entry.parameter, inherited: other.parameter });
430
+ }
431
+ }
432
+
433
+ return pairs;
434
+ };
435
+
436
+ const hasParameterTypeConflict = (context: ModuleContext, own: GirFunction, inherited: GirFunction): boolean => {
437
+ const ownCount = inputParameters(context.library, own).length;
438
+
439
+ if (ownCount !== inputParameters(context.library, inherited).length) {
440
+ return true;
441
+ }
442
+
443
+ return inputParameterPairs(context, own, inherited).some((pair) => !areParametersComparable(context, pair));
444
+ };
445
+
337
446
  const conflictRename = (
338
447
  context: ModuleContext,
339
448
  callable: GirFunction,
@@ -380,26 +489,9 @@ const hasEnumConflict = (
380
489
  return ownEnum !== undefined && inheritedEnum !== undefined && ownEnum !== inheritedEnum;
381
490
  };
382
491
 
383
- const hasParameterEnumConflict = (context: ModuleContext, own: GirFunction, inherited: InheritedMethod): boolean => {
384
- const ownParams = inputParameters(context.library, own);
385
- const inheritedParams = inputParameters(context.library, inherited.method);
386
- const count = Math.min(ownParams.length, inheritedParams.length);
387
-
388
- for (let index = 0; index < count; index += 1) {
389
- const ownParam = ownParams[index];
390
- const inheritedParam = inheritedParams[index];
391
-
392
- if (
393
- ownParam !== undefined &&
394
- inheritedParam !== undefined &&
395
- hasEnumConflict(context, ownParam.parameter.type, inheritedParam.parameter.type)
396
- ) {
397
- return true;
398
- }
399
- }
400
-
401
- return false;
402
- };
492
+ const hasParameterEnumConflict = (context: ModuleContext, own: GirFunction, inherited: InheritedMethod): boolean =>
493
+ inputParameterPairs(context, own, inherited.method).some(
494
+ (pair) => hasEnumConflict(context, pair.own.type, pair.inherited.type));
403
495
 
404
496
  const enumIdentity = (context: ModuleContext, ref: TypeId | undefined): string | undefined => {
405
497
  if (ref === undefined) {
@@ -416,7 +508,7 @@ const enumIdentity = (context: ModuleContext, ref: TypeId | undefined): string |
416
508
  };
417
509
 
418
510
  export {
419
- resolveImplementedInterface,
511
+ ancestorClassMethodNames,
420
512
  resolvePrerequisiteReference,
421
513
  forEachAncestor,
422
514
  collectInterfaceProperties,
@@ -425,6 +517,5 @@ export {
425
517
  collectInheritedMethods,
426
518
  conflictRename,
427
519
  reservedSignalMemberRename,
428
- type OwnedProperty,
429
520
  type InheritedMethods,
430
521
  };
@@ -0,0 +1,237 @@
1
+ import type { GirClass } from "../gir/class.js";
2
+ import type { GirFunction } from "../gir/function.js";
3
+ import type { Library } from "../gir/library.js";
4
+ import type { ModuleContext } from "../writer/context.js";
5
+ import { resolveClassOrInterface, type ResolvedAncestor, resolveInterfaces } from "../gir/ancestry.js";
6
+ import { isOutParameter } from "../gir/parameter.js";
7
+ import { memberName } from "../store/gi/method.js";
8
+ import { protectedChainSlotKeys, vfuncCallables, vfuncMemberNames } from "../store/gi/vtable.js";
9
+ import { forEachAncestor } from "./inheritance.js";
10
+ import { inputParameters } from "./param-structure.js";
11
+ import { typeKey } from "./type-key.js";
12
+
13
+ type MemberTable = Map<string, GirFunction>;
14
+
15
+ type ClaimedMembers = {
16
+ inherited: MemberTable;
17
+ interfaces: MemberTable;
18
+ };
19
+
20
+ type InterfaceConflictOptions = {
21
+ context: ModuleContext;
22
+ klass: GirClass;
23
+ iface: GirClass;
24
+ ifaceNamespace: string;
25
+ };
26
+
27
+ type CallableKeys = {
28
+ inputs: string[];
29
+ outputs: string[];
30
+ };
31
+
32
+ type CallableKeyPair = {
33
+ own: CallableKeys;
34
+ other: CallableKeys;
35
+ };
36
+
37
+ const CHAINABLE_SIGNAL_MEMBERS = ["addEventListener", "off", "on", "once", "removeEventListener"];
38
+
39
+ const callableKeys = (library: Library, fn: GirFunction): CallableKeys => ({
40
+ inputs: inputParameters(library, fn).map((entry) => typeKey(library, entry.parameter.type)),
41
+ outputs: [
42
+ typeKey(library, fn.returnValue.type),
43
+ ...fn.parameters
44
+ .filter((parameter) => isOutParameter(parameter))
45
+ .map((parameter) => typeKey(library, parameter.type)),
46
+ ],
47
+ });
48
+
49
+ const areKeysEqual = (left: string[], right: string[]): boolean =>
50
+ left.length === right.length && left.every((key, index) => key === right[index]);
51
+
52
+ const callableKeyPair = (library: Library, own: GirFunction, other: GirFunction): CallableKeyPair => ({
53
+ own: callableKeys(library, own),
54
+ other: callableKeys(library, other),
55
+ });
56
+
57
+ const areCallablesIdentical = (library: Library, own: GirFunction, other: GirFunction): boolean => {
58
+ const keys = callableKeyPair(library, own, other);
59
+
60
+ return areKeysEqual(keys.own.inputs, keys.other.inputs) && areKeysEqual(keys.own.outputs, keys.other.outputs);
61
+ };
62
+
63
+ const areCallablesAssignable = (library: Library, own: GirFunction, other: GirFunction): boolean => {
64
+ const keys = callableKeyPair(library, own, other);
65
+
66
+ if (keys.own.inputs.length > keys.other.inputs.length) {
67
+ return false;
68
+ }
69
+
70
+ if (keys.own.inputs.some((key, index) => key !== keys.other.inputs[index])) {
71
+ return false;
72
+ }
73
+
74
+ return areKeysEqual(keys.other.outputs, ["void"]) || areKeysEqual(keys.own.outputs, keys.other.outputs);
75
+ };
76
+
77
+ const collectMethods = (klass: GirClass, members: MemberTable): void => {
78
+ for (const method of klass.methods) {
79
+ const name = memberName(method.name);
80
+
81
+ if (method.introspectable && !members.has(name)) {
82
+ members.set(name, method);
83
+ }
84
+ }
85
+ };
86
+
87
+ const inheritedMembers = (context: ModuleContext, klass: GirClass): ClaimedMembers => {
88
+ const inherited: MemberTable = new Map();
89
+
90
+ forEachAncestor(context, klass, (ancestor) => {
91
+ collectMethods(ancestor.klass, inherited);
92
+ });
93
+
94
+ return { inherited, interfaces: new Map() };
95
+ };
96
+
97
+ const interfaceMembers = (options: InterfaceConflictOptions): MemberTable => {
98
+ const members: MemberTable = new Map();
99
+ collectMethods(options.iface, members);
100
+
101
+ for (const [key, callable] of vfuncCallables(options.context, options.ifaceNamespace, options.iface)) {
102
+ members.set(key, callable);
103
+ }
104
+
105
+ return members;
106
+ };
107
+
108
+ const claimInterfaceMembers = (options: InterfaceConflictOptions, claimed: ClaimedMembers): void => {
109
+ for (const [key, callable] of interfaceMembers(options)) {
110
+ if (!claimed.interfaces.has(key)) {
111
+ claimed.interfaces.set(key, callable);
112
+ }
113
+ }
114
+ };
115
+
116
+ const isConflictingMember = (library: Library, claimed: ClaimedMembers, entry: [string, GirFunction]): boolean => {
117
+ const [name, method] = entry;
118
+ const owned = claimed.inherited.get(name);
119
+
120
+ if (owned !== undefined) {
121
+ return !areCallablesAssignable(library, owned, method);
122
+ }
123
+
124
+ const sibling = claimed.interfaces.get(name);
125
+
126
+ return sibling !== undefined && !areCallablesIdentical(library, sibling, method);
127
+ };
128
+
129
+ const conflictingMemberNames = (options: InterfaceConflictOptions, claimed: ClaimedMembers): string[] =>
130
+ [...interfaceMembers(options)]
131
+ .filter((entry) => isConflictingMember(options.context.library, claimed, entry))
132
+ .map(([name]) => name);
133
+
134
+ const protectedVfuncNames = (options: InterfaceConflictOptions): string[] => {
135
+ const { context, klass, iface, ifaceNamespace } = options;
136
+ const protectedKeys = protectedChainSlotKeys(context, klass);
137
+
138
+ return vfuncMemberNames(context, ifaceNamespace, iface).filter((key) => protectedKeys.has(key));
139
+ };
140
+
141
+ const interfaceConflicts = (options: InterfaceConflictOptions, claimed: ClaimedMembers): string[] => {
142
+ const names = [...conflictingMemberNames(options, claimed), ...protectedVfuncNames(options)];
143
+
144
+ return names.length === 0 ? names : [...new Set([...names, ...CHAINABLE_SIGNAL_MEMBERS])];
145
+ };
146
+
147
+ const rootPrerequisite = (library: Library): ResolvedAncestor[] => {
148
+ const root = resolveClassOrInterface(library, "GObject", "Object");
149
+
150
+ return root === undefined ? [] : [root];
151
+ };
152
+
153
+ const interfaceSupertypes = (library: Library, entry: ResolvedAncestor): ResolvedAncestor[] => {
154
+ const prerequisites = entry.klass.prerequisites
155
+ .map((name) => resolveClassOrInterface(library, entry.namespaceName, name))
156
+ .filter((prerequisite) => prerequisite !== undefined);
157
+
158
+ return prerequisites.length === 0 ? rootPrerequisite(library) : prerequisites;
159
+ };
160
+
161
+ const classSupertypes = (library: Library, entry: ResolvedAncestor): ResolvedAncestor[] => {
162
+ const interfaces = resolveInterfaces(library, entry.namespaceName, entry.klass.implements);
163
+
164
+ if (entry.klass.parent === undefined) {
165
+ return interfaces;
166
+ }
167
+
168
+ const parent = resolveClassOrInterface(library, entry.namespaceName, entry.klass.parent);
169
+
170
+ return parent === undefined ? interfaces : [parent, ...interfaces];
171
+ };
172
+
173
+ const directSupertypes = (library: Library, entry: ResolvedAncestor): ResolvedAncestor[] =>
174
+ entry.klass.isInterface ? interfaceSupertypes(library, entry) : classSupertypes(library, entry);
175
+
176
+ const collectSupertypeMembers = (
177
+ library: Library,
178
+ entry: ResolvedAncestor,
179
+ visited: Set<string>,
180
+ members: MemberTable,
181
+ ): void => {
182
+ const key = `${entry.namespaceName}.${entry.klass.name}`;
183
+
184
+ if (visited.has(key)) {
185
+ return;
186
+ }
187
+
188
+ visited.add(key);
189
+ collectMethods(entry.klass, members);
190
+
191
+ for (const supertype of directSupertypes(library, entry)) {
192
+ collectSupertypeMembers(library, supertype, visited, members);
193
+ }
194
+ };
195
+
196
+ const supertypeMembers = (library: Library, base: ResolvedAncestor): MemberTable => {
197
+ const members: MemberTable = new Map();
198
+ collectSupertypeMembers(library, base, new Set(), members);
199
+
200
+ return members;
201
+ };
202
+
203
+ const prerequisiteConflicts = (library: Library, iface: GirClass, base: ResolvedAncestor): string[] => {
204
+ const members: MemberTable = new Map();
205
+ collectMethods(iface, members);
206
+ const inherited = supertypeMembers(library, base);
207
+ const names: string[] = [];
208
+
209
+ for (const [name, method] of members) {
210
+ const owned = inherited.get(name);
211
+
212
+ if (owned !== undefined && !areCallablesAssignable(library, method, owned)) {
213
+ names.push(name);
214
+ }
215
+ }
216
+
217
+ return names;
218
+ };
219
+
220
+ const omittedTypeRef = (typeRef: string, omissions: string[]): string => {
221
+ if (omissions.length === 0) {
222
+ return typeRef;
223
+ }
224
+
225
+ const keys = [...new Set(omissions)].map((name) => JSON.stringify(name)).join(" | ");
226
+
227
+ return `Omit<${typeRef}, ${keys}>`;
228
+ };
229
+
230
+ export {
231
+ type ClaimedMembers,
232
+ claimInterfaceMembers,
233
+ inheritedMembers,
234
+ interfaceConflicts,
235
+ omittedTypeRef,
236
+ prerequisiteConflicts,
237
+ };
@@ -0,0 +1,31 @@
1
+ import type { Library } from "../gir/library.js";
2
+ import type { GirCallable, GirParameter } from "../gir/parameter.js";
3
+ import type { TypeId } from "../gir/type-id.js";
4
+ import { isOutParameter } from "../gir/parameter.js";
5
+ import { carrayFor, isUnboundedArray, primitiveCategoryFor } from "./type-shape.js";
6
+
7
+ const BYTE_CATEGORIES: Set<string> = new Set(["int8", "uint8"]);
8
+ const CHAR_POINTER = /char\s*\*/;
9
+
10
+ const isByteElement = (library: Library, element: TypeId): boolean => {
11
+ const category = primitiveCategoryFor(library, element);
12
+
13
+ return category !== undefined && BYTE_CATEGORIES.has(category);
14
+ };
15
+
16
+ const isNulTerminatedBytes = (library: Library, ref: TypeId | undefined): boolean => {
17
+ const type = carrayFor(library, ref);
18
+
19
+ if (type?.arrayCType === undefined || !CHAR_POINTER.test(type.arrayCType)) {
20
+ return false;
21
+ }
22
+
23
+ return isUnboundedArray(type) && isByteElement(library, type.element);
24
+ };
25
+
26
+ const nulTerminatedByteParams = (library: Library, callable: GirCallable): GirParameter[] =>
27
+ callable.parameters.filter(
28
+ (parameter) => !isOutParameter(parameter) && isNulTerminatedBytes(library, parameter.type),
29
+ );
30
+
31
+ export { nulTerminatedByteParams };