@ts-for-gir/lib 4.0.0-beta.9 → 4.0.0-rc.2

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 (560) hide show
  1. package/README.md +13 -1
  2. package/package.json +18 -31
  3. package/src/constants.ts +118 -0
  4. package/src/dependency-manager.ts +445 -0
  5. package/src/formatters/default.ts +7 -0
  6. package/src/formatters/formatter.ts +3 -0
  7. package/src/formatters/index.ts +3 -0
  8. package/src/formatters/json.ts +7 -0
  9. package/src/generators/generator.ts +65 -0
  10. package/src/generators/index.ts +2 -0
  11. package/src/generics/clutter.ts +81 -0
  12. package/src/generics/generify.ts +101 -0
  13. package/src/generics/gio.ts +91 -0
  14. package/src/generics/glib.ts +31 -0
  15. package/src/generics/gtk.ts +99 -0
  16. package/src/generics/meta.ts +51 -0
  17. package/src/generics/st.ts +207 -0
  18. package/src/generics/visitor.ts +484 -0
  19. package/src/gir/alias.ts +73 -0
  20. package/src/gir/callback.ts +79 -0
  21. package/src/gir/const.ts +73 -0
  22. package/src/gir/constructor.ts +91 -0
  23. package/src/gir/data.ts +12 -0
  24. package/src/gir/dependency-resolver.ts +81 -0
  25. package/src/gir/direct-allocation-constructor.ts +65 -0
  26. package/src/gir/enum-member.ts +51 -0
  27. package/src/gir/enum.ts +129 -0
  28. package/src/gir/error.ts +89 -0
  29. package/src/gir/function.ts +296 -0
  30. package/src/gir/generics.ts +66 -0
  31. package/src/gir/gir-complex-record.ts +7 -0
  32. package/src/gir/index.ts +25 -0
  33. package/src/gir/introspected-base.ts +104 -0
  34. package/src/gir/introspected-class-member.ts +15 -0
  35. package/src/gir/introspected-classes.ts +1512 -0
  36. package/src/gir/introspected-namespace-member.ts +24 -0
  37. package/src/gir/namespace.ts +76 -0
  38. package/src/gir/parameter.ts +199 -0
  39. package/src/gir/promisify.ts +209 -0
  40. package/src/gir/property.ts +203 -0
  41. package/src/gir/record.ts +488 -0
  42. package/src/gir/registry.ts +183 -0
  43. package/src/gir/signal.ts +278 -0
  44. package/src/gir-module.ts +719 -0
  45. package/src/gir.ts +870 -0
  46. package/src/index.ts +16 -0
  47. package/src/injections/gee08.ts +89 -0
  48. package/src/injections/gee1.ts +35 -0
  49. package/src/injections/gio.ts +720 -0
  50. package/src/injections/glib.ts +280 -0
  51. package/src/injections/gobject.ts +906 -0
  52. package/src/injections/gtk4.ts +23 -0
  53. package/src/injections/inject.ts +49 -0
  54. package/src/injections/shell.ts +50 -0
  55. package/src/injections/tracker1.ts +42 -0
  56. package/src/library-version.ts +50 -0
  57. package/src/logger.ts +104 -0
  58. package/src/messages.ts +57 -0
  59. package/src/templates/index.ts +1 -0
  60. package/src/templates/template-engine.ts +178 -0
  61. package/src/types/answer-version.ts +4 -0
  62. package/src/types/any-introspected-type.ts +5 -0
  63. package/src/types/class-function-types.ts +57 -0
  64. package/src/types/class-member.ts +5 -0
  65. package/src/types/class-parent.ts +14 -0
  66. package/src/types/class.ts +43 -0
  67. package/src/types/config-flags.ts +5 -0
  68. package/src/types/construct-name.ts +13 -0
  69. package/src/types/dependency-map.ts +4 -0
  70. package/src/types/dependency.ts +49 -0
  71. package/src/types/file-info.ts +14 -0
  72. package/src/types/format.ts +1 -0
  73. package/src/types/generator-constructor.ts +7 -0
  74. package/src/types/generics-config.ts +90 -0
  75. package/src/types/gir-any-element.ts +35 -0
  76. package/src/types/gir-module-interface.ts +22 -0
  77. package/src/types/gir-module-resolved.ts +32 -0
  78. package/src/types/gir-type-name.ts +20 -0
  79. package/src/types/index.ts +92 -0
  80. package/{lib/types/inheritance-table.d.ts → src/types/inheritance-table.ts} +1 -1
  81. package/src/types/introspected.ts +18 -0
  82. package/src/types/local-name-check.ts +5 -0
  83. package/src/types/local-name-type.ts +1 -0
  84. package/src/types/local-name.ts +8 -0
  85. package/src/types/local-names.ts +5 -0
  86. package/src/types/metadata.ts +6 -0
  87. package/src/types/ns-loader.ts +6 -0
  88. package/src/types/options-base.ts +8 -0
  89. package/src/types/options-generation.ts +65 -0
  90. package/src/types/options-load.ts +6 -0
  91. package/src/types/options-transform.ts +5 -0
  92. package/src/types/output-format.ts +1 -0
  93. package/src/types/package-data-parsed.ts +28 -0
  94. package/src/types/package-data.ts +24 -0
  95. package/src/types/package-section-parsed.ts +9 -0
  96. package/src/types/parsed-gir.ts +5 -0
  97. package/src/types/parsed-package-data.ts +7 -0
  98. package/src/types/property-case.ts +1 -0
  99. package/src/types/resolve-type.ts +4 -0
  100. package/src/types/template-data.ts +8 -0
  101. package/src/types/template-options.ts +33 -0
  102. package/src/types/transformation-case.ts +9 -0
  103. package/src/types/transformations.ts +5 -0
  104. package/{lib/types/ts-doc-tag.d.ts → src/types/ts-doc-tag.ts} +14 -12
  105. package/src/types/ts-doc.ts +18 -0
  106. package/{lib/types/type-gir-alias.d.ts → src/types/type-gir-alias.ts} +1 -1
  107. package/src/types/type-gir-class.ts +2 -0
  108. package/src/types/type-gir-element.ts +25 -0
  109. package/src/types/type-gir-enumeration-member.ts +2 -0
  110. package/{lib/types/type-gir-enumeration.d.ts → src/types/type-gir-enumeration.ts} +1 -1
  111. package/src/types/type-gir-function.ts +8 -0
  112. package/{lib/types/type-gir-interface.d.ts → src/types/type-gir-interface.ts} +1 -1
  113. package/src/types/type-gir-method.ts +2 -0
  114. package/src/types/type-gir-parameter.ts +1 -0
  115. package/{lib/types/type-gir-property.d.ts → src/types/type-gir-property.ts} +1 -1
  116. package/src/types/type-gir-variable.ts +1 -0
  117. package/src/types/type-ts-element.ts +13 -0
  118. package/{lib/types/type-ts-enumeration-member.d.ts → src/types/type-ts-enumeration-member.ts} +1 -1
  119. package/src/types/type-ts-function.ts +1 -0
  120. package/src/types/type-ts-property.ts +1 -0
  121. package/src/types/user-config-load-result.ts +6 -0
  122. package/src/types/user-config.ts +70 -0
  123. package/src/util.ts +84 -0
  124. package/src/utils/conflicts/conflict-resolver.ts +122 -0
  125. package/src/utils/conflicts/function-conflict-detector.ts +139 -0
  126. package/src/utils/conflicts/index.ts +2 -0
  127. package/src/utils/conflicts.ts +593 -0
  128. package/src/utils/documentation.ts +471 -0
  129. package/src/utils/files.ts +71 -0
  130. package/src/utils/function-type-guards.ts +61 -0
  131. package/src/utils/generation.ts +69 -0
  132. package/src/utils/gir-parsing.ts +264 -0
  133. package/src/utils/girs.ts +112 -0
  134. package/src/utils/index.ts +14 -0
  135. package/src/utils/naming.ts +188 -0
  136. package/{lib/utils/numbers.d.ts → src/utils/numbers.ts} +3 -1
  137. package/{lib/utils/objects.js → src/utils/objects.ts} +15 -8
  138. package/src/utils/path.ts +7 -0
  139. package/src/utils/registry.ts +5 -0
  140. package/src/utils/strings.ts +134 -0
  141. package/src/utils/type-resolution.ts +116 -0
  142. package/src/utils/types.ts +276 -0
  143. package/src/validators/class.ts +335 -0
  144. package/src/validators/function-parameters.ts +52 -0
  145. package/src/validators/interface.ts +20 -0
  146. package/src/visitor.ts +58 -0
  147. package/lib/constants.d.ts +0 -25
  148. package/lib/constants.js +0 -93
  149. package/lib/constants.js.map +0 -1
  150. package/lib/dependency-manager.d.ts +0 -150
  151. package/lib/dependency-manager.js +0 -324
  152. package/lib/dependency-manager.js.map +0 -1
  153. package/lib/formatters/default.d.ts +0 -4
  154. package/lib/formatters/default.js +0 -7
  155. package/lib/formatters/default.js.map +0 -1
  156. package/lib/formatters/formatter.d.ts +0 -3
  157. package/lib/formatters/formatter.js +0 -3
  158. package/lib/formatters/formatter.js.map +0 -1
  159. package/lib/formatters/json.d.ts +0 -4
  160. package/lib/formatters/json.js +0 -7
  161. package/lib/formatters/json.js.map +0 -1
  162. package/lib/generators/dts/glib.d.ts +0 -2
  163. package/lib/generators/dts/glib.js +0 -514
  164. package/lib/generators/dts/glib.js.map +0 -1
  165. package/lib/generators/dts/gobject.d.ts +0 -2
  166. package/lib/generators/dts/gobject.js +0 -117
  167. package/lib/generators/dts/gobject.js.map +0 -1
  168. package/lib/generators/dts-inline.d.ts +0 -10
  169. package/lib/generators/dts-inline.js +0 -57
  170. package/lib/generators/dts-inline.js.map +0 -1
  171. package/lib/generators/dts-modules.d.ts +0 -10
  172. package/lib/generators/dts-modules.js +0 -98
  173. package/lib/generators/dts-modules.js.map +0 -1
  174. package/lib/generators/dts.d.ts +0 -45
  175. package/lib/generators/dts.js +0 -682
  176. package/lib/generators/dts.js.map +0 -1
  177. package/lib/generators/generator.d.ts +0 -45
  178. package/lib/generators/generator.js +0 -9
  179. package/lib/generators/generator.js.map +0 -1
  180. package/lib/generators/index.d.ts +0 -5
  181. package/lib/generators/index.js +0 -6
  182. package/lib/generators/index.js.map +0 -1
  183. package/lib/generators/json.d.ts +0 -258
  184. package/lib/generators/json.js +0 -867
  185. package/lib/generators/json.js.map +0 -1
  186. package/lib/generics/clutter.d.ts +0 -26
  187. package/lib/generics/clutter.js +0 -49
  188. package/lib/generics/clutter.js.map +0 -1
  189. package/lib/generics/generify.d.ts +0 -2
  190. package/lib/generics/generify.js +0 -39
  191. package/lib/generics/generify.js.map +0 -1
  192. package/lib/generics/gio.d.ts +0 -7
  193. package/lib/generics/gio.js +0 -51
  194. package/lib/generics/gio.js.map +0 -1
  195. package/lib/generics/glib.d.ts +0 -7
  196. package/lib/generics/glib.js +0 -18
  197. package/lib/generics/glib.js.map +0 -1
  198. package/lib/generics/meta.d.ts +0 -21
  199. package/lib/generics/meta.js +0 -26
  200. package/lib/generics/meta.js.map +0 -1
  201. package/lib/generics/st.d.ts +0 -16
  202. package/lib/generics/st.js +0 -92
  203. package/lib/generics/st.js.map +0 -1
  204. package/lib/generics/visitor.d.ts +0 -20
  205. package/lib/generics/visitor.js +0 -255
  206. package/lib/generics/visitor.js.map +0 -1
  207. package/lib/gir/alias.d.ts +0 -24
  208. package/lib/gir/alias.js +0 -43
  209. package/lib/gir/alias.js.map +0 -1
  210. package/lib/gir/base.d.ts +0 -62
  211. package/lib/gir/base.js +0 -95
  212. package/lib/gir/base.js.map +0 -1
  213. package/lib/gir/class.d.ts +0 -189
  214. package/lib/gir/class.js +0 -1131
  215. package/lib/gir/class.js.map +0 -1
  216. package/lib/gir/const.d.ts +0 -25
  217. package/lib/gir/const.js +0 -43
  218. package/lib/gir/const.js.map +0 -1
  219. package/lib/gir/enum.d.ts +0 -45
  220. package/lib/gir/enum.js +0 -164
  221. package/lib/gir/enum.js.map +0 -1
  222. package/lib/gir/function.d.ts +0 -199
  223. package/lib/gir/function.js +0 -683
  224. package/lib/gir/function.js.map +0 -1
  225. package/lib/gir/generics.d.ts +0 -5
  226. package/lib/gir/generics.js +0 -57
  227. package/lib/gir/generics.js.map +0 -1
  228. package/lib/gir/namespace.d.ts +0 -21
  229. package/lib/gir/namespace.js +0 -57
  230. package/lib/gir/namespace.js.map +0 -1
  231. package/lib/gir/nodes.d.ts +0 -11
  232. package/lib/gir/nodes.js +0 -12
  233. package/lib/gir/nodes.js.map +0 -1
  234. package/lib/gir/property.d.ts +0 -60
  235. package/lib/gir/property.js +0 -128
  236. package/lib/gir/property.js.map +0 -1
  237. package/lib/gir/registry.d.ts +0 -51
  238. package/lib/gir/registry.js +0 -144
  239. package/lib/gir/registry.js.map +0 -1
  240. package/lib/gir/signal.d.ts +0 -33
  241. package/lib/gir/signal.js +0 -165
  242. package/lib/gir/signal.js.map +0 -1
  243. package/lib/gir/util.d.ts +0 -49
  244. package/lib/gir/util.js +0 -559
  245. package/lib/gir/util.js.map +0 -1
  246. package/lib/gir-module.d.ts +0 -106
  247. package/lib/gir-module.js +0 -572
  248. package/lib/gir-module.js.map +0 -1
  249. package/lib/gir.d.ts +0 -253
  250. package/lib/gir.js +0 -642
  251. package/lib/gir.js.map +0 -1
  252. package/lib/index.d.ts +0 -14
  253. package/lib/index.js +0 -17
  254. package/lib/index.js.map +0 -1
  255. package/lib/injections/gee08.d.ts +0 -7
  256. package/lib/injections/gee08.js +0 -68
  257. package/lib/injections/gee08.js.map +0 -1
  258. package/lib/injections/gee1.d.ts +0 -7
  259. package/lib/injections/gee1.js +0 -28
  260. package/lib/injections/gee1.js.map +0 -1
  261. package/lib/injections/gio.d.ts +0 -7
  262. package/lib/injections/gio.js +0 -431
  263. package/lib/injections/gio.js.map +0 -1
  264. package/lib/injections/glib.d.ts +0 -7
  265. package/lib/injections/glib.js +0 -204
  266. package/lib/injections/glib.js.map +0 -1
  267. package/lib/injections/gobject.d.ts +0 -7
  268. package/lib/injections/gobject.js +0 -479
  269. package/lib/injections/gobject.js.map +0 -1
  270. package/lib/injections/inject.d.ts +0 -4
  271. package/lib/injections/inject.js +0 -28
  272. package/lib/injections/inject.js.map +0 -1
  273. package/lib/injections/tracker1.d.ts +0 -7
  274. package/lib/injections/tracker1.js +0 -30
  275. package/lib/injections/tracker1.js.map +0 -1
  276. package/lib/library-version.d.ts +0 -10
  277. package/lib/library-version.js +0 -45
  278. package/lib/library-version.js.map +0 -1
  279. package/lib/logger.d.ts +0 -36
  280. package/lib/logger.js +0 -134
  281. package/lib/logger.js.map +0 -1
  282. package/lib/messages.d.ts +0 -23
  283. package/lib/messages.js +0 -39
  284. package/lib/messages.js.map +0 -1
  285. package/lib/registry.d.ts +0 -8
  286. package/lib/registry.js +0 -12
  287. package/lib/registry.js.map +0 -1
  288. package/lib/transformation.d.ts +0 -169
  289. package/lib/transformation.js +0 -393
  290. package/lib/transformation.js.map +0 -1
  291. package/lib/types/answer-version.d.ts +0 -4
  292. package/lib/types/answer-version.js +0 -2
  293. package/lib/types/answer-version.js.map +0 -1
  294. package/lib/types/class-parent.d.ts +0 -13
  295. package/lib/types/class-parent.js +0 -2
  296. package/lib/types/class-parent.js.map +0 -1
  297. package/lib/types/config-flags.d.ts +0 -4
  298. package/lib/types/config-flags.js +0 -2
  299. package/lib/types/config-flags.js.map +0 -1
  300. package/lib/types/construct-name.d.ts +0 -1
  301. package/lib/types/construct-name.js +0 -2
  302. package/lib/types/construct-name.js.map +0 -1
  303. package/lib/types/dependency-map.d.ts +0 -4
  304. package/lib/types/dependency-map.js +0 -2
  305. package/lib/types/dependency-map.js.map +0 -1
  306. package/lib/types/dependency.d.ts +0 -42
  307. package/lib/types/dependency.js +0 -2
  308. package/lib/types/dependency.js.map +0 -1
  309. package/lib/types/file-info.d.ts +0 -14
  310. package/lib/types/file-info.js +0 -2
  311. package/lib/types/file-info.js.map +0 -1
  312. package/lib/types/format.d.ts +0 -1
  313. package/lib/types/format.js +0 -2
  314. package/lib/types/format.js.map +0 -1
  315. package/lib/types/gir-alias-element.d.ts +0 -4
  316. package/lib/types/gir-alias-element.js +0 -2
  317. package/lib/types/gir-alias-element.js.map +0 -1
  318. package/lib/types/gir-annotation.d.ts +0 -9
  319. package/lib/types/gir-annotation.js +0 -2
  320. package/lib/types/gir-annotation.js.map +0 -1
  321. package/lib/types/gir-any-element.d.ts +0 -2
  322. package/lib/types/gir-any-element.js +0 -2
  323. package/lib/types/gir-any-element.js.map +0 -1
  324. package/lib/types/gir-bitfield-element.d.ts +0 -6
  325. package/lib/types/gir-bitfield-element.js +0 -2
  326. package/lib/types/gir-bitfield-element.js.map +0 -1
  327. package/lib/types/gir-callable-param-element.d.ts +0 -4
  328. package/lib/types/gir-callable-param-element.js +0 -2
  329. package/lib/types/gir-callable-param-element.js.map +0 -1
  330. package/lib/types/gir-callable-params.d.ts +0 -7
  331. package/lib/types/gir-callable-params.js +0 -2
  332. package/lib/types/gir-callable-params.js.map +0 -1
  333. package/lib/types/gir-callable-return.d.ts +0 -5
  334. package/lib/types/gir-callable-return.js +0 -2
  335. package/lib/types/gir-callable-return.js.map +0 -1
  336. package/lib/types/gir-callback-element.d.ts +0 -6
  337. package/lib/types/gir-callback-element.js +0 -2
  338. package/lib/types/gir-callback-element.js.map +0 -1
  339. package/lib/types/gir-class-element.d.ts +0 -17
  340. package/lib/types/gir-class-element.js +0 -2
  341. package/lib/types/gir-class-element.js.map +0 -1
  342. package/lib/types/gir-constant-element.d.ts +0 -4
  343. package/lib/types/gir-constant-element.js +0 -2
  344. package/lib/types/gir-constant-element.js.map +0 -1
  345. package/lib/types/gir-constructor-element.d.ts +0 -6
  346. package/lib/types/gir-constructor-element.js +0 -2
  347. package/lib/types/gir-constructor-element.js.map +0 -1
  348. package/lib/types/gir-enum-element.d.ts +0 -6
  349. package/lib/types/gir-enum-element.js +0 -2
  350. package/lib/types/gir-enum-element.js.map +0 -1
  351. package/lib/types/gir-field-element.d.ts +0 -5
  352. package/lib/types/gir-field-element.js +0 -2
  353. package/lib/types/gir-field-element.js.map +0 -1
  354. package/lib/types/gir-function-element.d.ts +0 -6
  355. package/lib/types/gir-function-element.js +0 -2
  356. package/lib/types/gir-function-element.js.map +0 -1
  357. package/lib/types/gir-instance-parameter.d.ts +0 -8
  358. package/lib/types/gir-instance-parameter.js +0 -2
  359. package/lib/types/gir-instance-parameter.js.map +0 -1
  360. package/lib/types/gir-interface-element.d.ts +0 -16
  361. package/lib/types/gir-interface-element.js +0 -2
  362. package/lib/types/gir-interface-element.js.map +0 -1
  363. package/lib/types/gir-member-element.d.ts +0 -5
  364. package/lib/types/gir-member-element.js +0 -2
  365. package/lib/types/gir-member-element.js.map +0 -1
  366. package/lib/types/gir-method-element.d.ts +0 -7
  367. package/lib/types/gir-method-element.js +0 -2
  368. package/lib/types/gir-method-element.js.map +0 -1
  369. package/lib/types/gir-module-resolved-by.d.ts +0 -15
  370. package/lib/types/gir-module-resolved-by.js +0 -2
  371. package/lib/types/gir-module-resolved-by.js.map +0 -1
  372. package/lib/types/gir-modules-grouped-map.d.ts +0 -4
  373. package/lib/types/gir-modules-grouped-map.js +0 -2
  374. package/lib/types/gir-modules-grouped-map.js.map +0 -1
  375. package/lib/types/gir-modules-grouped.d.ts +0 -12
  376. package/lib/types/gir-modules-grouped.js +0 -2
  377. package/lib/types/gir-modules-grouped.js.map +0 -1
  378. package/lib/types/gir-namespace.d.ts +0 -27
  379. package/lib/types/gir-namespace.js +0 -2
  380. package/lib/types/gir-namespace.js.map +0 -1
  381. package/lib/types/gir-property-element.d.ts +0 -4
  382. package/lib/types/gir-property-element.js +0 -2
  383. package/lib/types/gir-property-element.js.map +0 -1
  384. package/lib/types/gir-record-element.d.ts +0 -10
  385. package/lib/types/gir-record-element.js +0 -2
  386. package/lib/types/gir-record-element.js.map +0 -1
  387. package/lib/types/gir-repository.d.ts +0 -5
  388. package/lib/types/gir-repository.js +0 -2
  389. package/lib/types/gir-repository.js.map +0 -1
  390. package/lib/types/gir-signal.d.ts +0 -10
  391. package/lib/types/gir-signal.js +0 -2
  392. package/lib/types/gir-signal.js.map +0 -1
  393. package/lib/types/gir-type-name.d.ts +0 -2
  394. package/lib/types/gir-type-name.js +0 -2
  395. package/lib/types/gir-type-name.js.map +0 -1
  396. package/lib/types/gir-union-element.d.ts +0 -9
  397. package/lib/types/gir-union-element.js +0 -2
  398. package/lib/types/gir-union-element.js.map +0 -1
  399. package/lib/types/gir-unparsed-number.d.ts +0 -2
  400. package/lib/types/gir-unparsed-number.js +0 -2
  401. package/lib/types/gir-unparsed-number.js.map +0 -1
  402. package/lib/types/gir-virtual-method.d.ts +0 -6
  403. package/lib/types/gir-virtual-method.js +0 -2
  404. package/lib/types/gir-virtual-method.js.map +0 -1
  405. package/lib/types/index.d.ts +0 -79
  406. package/lib/types/index.js +0 -80
  407. package/lib/types/index.js.map +0 -1
  408. package/lib/types/inheritance-table.js +0 -2
  409. package/lib/types/inheritance-table.js.map +0 -1
  410. package/lib/types/local-name-check.d.ts +0 -4
  411. package/lib/types/local-name-check.js +0 -2
  412. package/lib/types/local-name-check.js.map +0 -1
  413. package/lib/types/local-name-type.d.ts +0 -1
  414. package/lib/types/local-name-type.js +0 -2
  415. package/lib/types/local-name-type.js.map +0 -1
  416. package/lib/types/local-name.d.ts +0 -7
  417. package/lib/types/local-name.js +0 -2
  418. package/lib/types/local-name.js.map +0 -1
  419. package/lib/types/local-names.d.ts +0 -4
  420. package/lib/types/local-names.js +0 -2
  421. package/lib/types/local-names.js.map +0 -1
  422. package/lib/types/metadata.d.ts +0 -8
  423. package/lib/types/metadata.js +0 -2
  424. package/lib/types/metadata.js.map +0 -1
  425. package/lib/types/options-base.d.ts +0 -4
  426. package/lib/types/options-base.js +0 -2
  427. package/lib/types/options-base.js.map +0 -1
  428. package/lib/types/options-generation.d.ts +0 -44
  429. package/lib/types/options-generation.js +0 -2
  430. package/lib/types/options-generation.js.map +0 -1
  431. package/lib/types/options-load.d.ts +0 -5
  432. package/lib/types/options-load.js +0 -2
  433. package/lib/types/options-load.js.map +0 -1
  434. package/lib/types/options-transform.d.ts +0 -4
  435. package/lib/types/options-transform.js +0 -2
  436. package/lib/types/options-transform.js.map +0 -1
  437. package/lib/types/output-format.d.ts +0 -1
  438. package/lib/types/output-format.js +0 -2
  439. package/lib/types/output-format.js.map +0 -1
  440. package/lib/types/package-data-parsed.d.ts +0 -28
  441. package/lib/types/package-data-parsed.js +0 -2
  442. package/lib/types/package-data-parsed.js.map +0 -1
  443. package/lib/types/package-data.d.ts +0 -23
  444. package/lib/types/package-data.js +0 -2
  445. package/lib/types/package-data.js.map +0 -1
  446. package/lib/types/package-section-parsed.d.ts +0 -8
  447. package/lib/types/package-section-parsed.js +0 -2
  448. package/lib/types/package-section-parsed.js.map +0 -1
  449. package/lib/types/parsed-gir.d.ts +0 -5
  450. package/lib/types/parsed-gir.js +0 -2
  451. package/lib/types/parsed-gir.js.map +0 -1
  452. package/lib/types/parsed-package-data.d.ts +0 -6
  453. package/lib/types/parsed-package-data.js +0 -2
  454. package/lib/types/parsed-package-data.js.map +0 -1
  455. package/lib/types/part-of-class.d.ts +0 -7
  456. package/lib/types/part-of-class.js +0 -2
  457. package/lib/types/part-of-class.js.map +0 -1
  458. package/lib/types/part-of-module.d.ts +0 -6
  459. package/lib/types/part-of-module.js +0 -2
  460. package/lib/types/part-of-module.js.map +0 -1
  461. package/lib/types/property-case.d.ts +0 -1
  462. package/lib/types/property-case.js +0 -2
  463. package/lib/types/property-case.js.map +0 -1
  464. package/lib/types/resolve-type.d.ts +0 -4
  465. package/lib/types/resolve-type.js +0 -6
  466. package/lib/types/resolve-type.js.map +0 -1
  467. package/lib/types/template-data.d.ts +0 -7
  468. package/lib/types/template-data.js +0 -2
  469. package/lib/types/template-data.js.map +0 -1
  470. package/lib/types/transformation-case.d.ts +0 -1
  471. package/lib/types/transformation-case.js +0 -2
  472. package/lib/types/transformation-case.js.map +0 -1
  473. package/lib/types/transformations.d.ts +0 -4
  474. package/lib/types/transformations.js +0 -2
  475. package/lib/types/transformations.js.map +0 -1
  476. package/lib/types/ts-doc-tag.js +0 -2
  477. package/lib/types/ts-doc-tag.js.map +0 -1
  478. package/lib/types/ts-doc.d.ts +0 -16
  479. package/lib/types/ts-doc.js +0 -2
  480. package/lib/types/ts-doc.js.map +0 -1
  481. package/lib/types/type-gir-alias.js +0 -2
  482. package/lib/types/type-gir-alias.js.map +0 -1
  483. package/lib/types/type-gir-class.d.ts +0 -2
  484. package/lib/types/type-gir-class.js +0 -2
  485. package/lib/types/type-gir-class.js.map +0 -1
  486. package/lib/types/type-gir-element.d.ts +0 -3
  487. package/lib/types/type-gir-element.js +0 -2
  488. package/lib/types/type-gir-element.js.map +0 -1
  489. package/lib/types/type-gir-enumeration-member.d.ts +0 -2
  490. package/lib/types/type-gir-enumeration-member.js +0 -2
  491. package/lib/types/type-gir-enumeration-member.js.map +0 -1
  492. package/lib/types/type-gir-enumeration.js +0 -2
  493. package/lib/types/type-gir-enumeration.js.map +0 -1
  494. package/lib/types/type-gir-function.d.ts +0 -1
  495. package/lib/types/type-gir-function.js +0 -2
  496. package/lib/types/type-gir-function.js.map +0 -1
  497. package/lib/types/type-gir-interface.js +0 -2
  498. package/lib/types/type-gir-interface.js.map +0 -1
  499. package/lib/types/type-gir-method.d.ts +0 -2
  500. package/lib/types/type-gir-method.js +0 -2
  501. package/lib/types/type-gir-method.js.map +0 -1
  502. package/lib/types/type-gir-parameter.d.ts +0 -1
  503. package/lib/types/type-gir-parameter.js +0 -2
  504. package/lib/types/type-gir-parameter.js.map +0 -1
  505. package/lib/types/type-gir-property.js +0 -2
  506. package/lib/types/type-gir-property.js.map +0 -1
  507. package/lib/types/type-gir-variable.d.ts +0 -1
  508. package/lib/types/type-gir-variable.js +0 -2
  509. package/lib/types/type-gir-variable.js.map +0 -1
  510. package/lib/types/type-ts-element.d.ts +0 -3
  511. package/lib/types/type-ts-element.js +0 -2
  512. package/lib/types/type-ts-element.js.map +0 -1
  513. package/lib/types/type-ts-enumeration-member.js +0 -2
  514. package/lib/types/type-ts-enumeration-member.js.map +0 -1
  515. package/lib/types/type-ts-function.d.ts +0 -1
  516. package/lib/types/type-ts-function.js +0 -2
  517. package/lib/types/type-ts-function.js.map +0 -1
  518. package/lib/types/type-ts-property.d.ts +0 -1
  519. package/lib/types/type-ts-property.js +0 -2
  520. package/lib/types/type-ts-property.js.map +0 -1
  521. package/lib/types/user-config-load-result.d.ts +0 -6
  522. package/lib/types/user-config-load-result.js +0 -2
  523. package/lib/types/user-config-load-result.js.map +0 -1
  524. package/lib/types/user-config.d.ts +0 -50
  525. package/lib/types/user-config.js +0 -2
  526. package/lib/types/user-config.js.map +0 -1
  527. package/lib/util.d.ts +0 -20
  528. package/lib/util.js +0 -67
  529. package/lib/util.js.map +0 -1
  530. package/lib/utils/files.d.ts +0 -21
  531. package/lib/utils/files.js +0 -62
  532. package/lib/utils/files.js.map +0 -1
  533. package/lib/utils/girs.d.ts +0 -45
  534. package/lib/utils/girs.js +0 -101
  535. package/lib/utils/girs.js.map +0 -1
  536. package/lib/utils/index.d.ts +0 -6
  537. package/lib/utils/index.js +0 -7
  538. package/lib/utils/index.js.map +0 -1
  539. package/lib/utils/numbers.js +0 -10
  540. package/lib/utils/numbers.js.map +0 -1
  541. package/lib/utils/objects.d.ts +0 -135
  542. package/lib/utils/objects.js.map +0 -1
  543. package/lib/utils/path.d.ts +0 -1
  544. package/lib/utils/path.js +0 -7
  545. package/lib/utils/path.js.map +0 -1
  546. package/lib/utils/strings.d.ts +0 -74
  547. package/lib/utils/strings.js +0 -121
  548. package/lib/utils/strings.js.map +0 -1
  549. package/lib/utils.d.ts +0 -267
  550. package/lib/utils.js +0 -417
  551. package/lib/utils.js.map +0 -1
  552. package/lib/validators/class.d.ts +0 -7
  553. package/lib/validators/class.js +0 -217
  554. package/lib/validators/class.js.map +0 -1
  555. package/lib/validators/interface.d.ts +0 -5
  556. package/lib/validators/interface.js +0 -16
  557. package/lib/validators/interface.js.map +0 -1
  558. package/lib/visitor.d.ts +0 -35
  559. package/lib/visitor.js +0 -29
  560. package/lib/visitor.js.map +0 -1
@@ -0,0 +1,207 @@
1
+ import type { IntrospectedNamespace } from "../gir/namespace.ts";
2
+ import { GenericType, GenerifiedTypeIdentifier } from "../gir.ts";
3
+ import type { StTemplateConfig } from "../types/generics-config.ts";
4
+
5
+ function createStTemplate(version: string): StTemplateConfig {
6
+ return {
7
+ namespace: "St",
8
+ version,
9
+ modifier: (namespace: IntrospectedNamespace, inferGenerics: boolean) => {
10
+ if (!inferGenerics) {
11
+ return;
12
+ }
13
+
14
+ applyStGenerics(namespace, version);
15
+ },
16
+ };
17
+ }
18
+
19
+ function applyStGenerics(namespace: IntrospectedNamespace, version: string): void {
20
+ const clutterImport = namespace.assertInstalledImport("Clutter");
21
+ const classes = getStClasses(namespace);
22
+ const clutterClasses = getClutterClasses(clutterImport, version);
23
+
24
+ setupWidgetGenerics(classes, clutterClasses);
25
+ setupViewportGenerics(classes, clutterClasses);
26
+ setupContainerGenerics(classes, clutterClasses, version);
27
+ setupBoxLayout(classes, clutterClasses);
28
+ setupBinGenerics(classes, clutterClasses);
29
+ setupScrollViewMethods(classes);
30
+ }
31
+
32
+ function getStClasses(namespace: IntrospectedNamespace) {
33
+ return {
34
+ Bin: namespace.assertClass("Bin"),
35
+ Button: namespace.assertClass("Button"),
36
+ ScrollView: namespace.assertClass("ScrollView"),
37
+ ScrollBar: namespace.assertClass("ScrollBar"),
38
+ Widget: namespace.assertClass("Widget"),
39
+ Viewport: namespace.assertClass("Viewport"),
40
+ StBoxLayout: namespace.assertClass("BoxLayout"),
41
+ };
42
+ }
43
+
44
+ function getClutterClasses(clutterImport: ReturnType<IntrospectedNamespace["assertInstalledImport"]>, version: string) {
45
+ return {
46
+ Actor: clutterImport.assertClass("Actor"),
47
+ Content: clutterImport.assertClass("Content"),
48
+ Container: Number(version) < 14 ? clutterImport.assertClass("Container") : null,
49
+ LayoutManager: clutterImport.assertClass("LayoutManager"),
50
+ ClutterBoxLayout: clutterImport.assertClass("BoxLayout"),
51
+ };
52
+ }
53
+
54
+ function setupWidgetGenerics(
55
+ stClasses: ReturnType<typeof getStClasses>,
56
+ clutterClasses: ReturnType<typeof getClutterClasses>,
57
+ ): void {
58
+ const { Widget } = stClasses;
59
+ const { Actor, Content, LayoutManager } = clutterClasses;
60
+
61
+ Widget.addGeneric({
62
+ deriveFrom: Actor.getType(),
63
+ default: LayoutManager.getType(),
64
+ constraint: LayoutManager.getType(),
65
+ });
66
+
67
+ Widget.addGeneric({
68
+ deriveFrom: Actor.getType(),
69
+ default: Content.getType(),
70
+ constraint: Content.getType(),
71
+ });
72
+ }
73
+
74
+ function setupViewportGenerics(
75
+ stClasses: ReturnType<typeof getStClasses>,
76
+ clutterClasses: ReturnType<typeof getClutterClasses>,
77
+ ): void {
78
+ const { Viewport, Widget } = stClasses;
79
+ const { Content, LayoutManager } = clutterClasses;
80
+
81
+ Viewport.addGeneric({
82
+ deriveFrom: Widget.getType(),
83
+ default: LayoutManager.getType(),
84
+ constraint: LayoutManager.getType(),
85
+ });
86
+
87
+ Viewport.addGeneric({
88
+ deriveFrom: Widget.getType(),
89
+ default: Content.getType(),
90
+ constraint: Content.getType(),
91
+ });
92
+ }
93
+
94
+ function setupContainerGenerics(
95
+ stClasses: ReturnType<typeof getStClasses>,
96
+ clutterClasses: ReturnType<typeof getClutterClasses>,
97
+ _version: string,
98
+ ): void {
99
+ const { StBoxLayout } = stClasses;
100
+ const { Actor, Container } = clutterClasses;
101
+
102
+ if (!Container) {
103
+ return;
104
+ }
105
+
106
+ Container.addGeneric({
107
+ default: Actor.getType(),
108
+ constraint: Actor.getType(),
109
+ });
110
+
111
+ StBoxLayout.addGeneric({
112
+ deriveFrom: Container.getType(),
113
+ default: Actor.getType(),
114
+ constraint: Actor.getType(),
115
+ });
116
+ }
117
+
118
+ function setupBoxLayout(
119
+ stClasses: ReturnType<typeof getStClasses>,
120
+ clutterClasses: ReturnType<typeof getClutterClasses>,
121
+ ): void {
122
+ const { StBoxLayout } = stClasses;
123
+ const { ClutterBoxLayout } = clutterClasses;
124
+
125
+ if (StBoxLayout.superType) {
126
+ StBoxLayout.superType = new GenerifiedTypeIdentifier(StBoxLayout.superType.name, StBoxLayout.superType.namespace, [
127
+ ClutterBoxLayout.getType(),
128
+ ]);
129
+ }
130
+ }
131
+
132
+ function setupBinGenerics(
133
+ stClasses: ReturnType<typeof getStClasses>,
134
+ clutterClasses: ReturnType<typeof getClutterClasses>,
135
+ ): void {
136
+ const { Bin, Button, ScrollView } = stClasses;
137
+ const { Actor } = clutterClasses;
138
+
139
+ Bin.addGeneric({
140
+ default: Actor.getType(),
141
+ constraint: Actor.getType(),
142
+ });
143
+
144
+ Button.addGeneric({
145
+ deriveFrom: Bin.getType(),
146
+ default: Actor.getType(),
147
+ constraint: Actor.getType(),
148
+ });
149
+
150
+ ScrollView.addGeneric({
151
+ deriveFrom: Bin.getType(),
152
+ default: Actor.getType(),
153
+ constraint: Actor.getType(),
154
+ });
155
+
156
+ // Update Bin child property
157
+ updatePropertyType(Bin, ["child"], new GenericType("A", Actor.getType()));
158
+ }
159
+
160
+ function setupScrollViewMethods(stClasses: ReturnType<typeof getStClasses>): void {
161
+ const { ScrollView, ScrollBar } = stClasses;
162
+
163
+ const methodConfigs = [
164
+ { name: "get_hscroll_bar", returnType: ScrollBar.getType() },
165
+ { name: "get_vscroll_bar", returnType: ScrollBar.getType() },
166
+ ];
167
+
168
+ for (const config of methodConfigs) {
169
+ const method = ScrollView.members.find((member) => member.name === config.name);
170
+ if (method) {
171
+ const fixedMethod = method.copy({ returnType: config.returnType });
172
+ const index = ScrollView.members.indexOf(method);
173
+ ScrollView.members.splice(index, 1, fixedMethod);
174
+ }
175
+ }
176
+ }
177
+
178
+ function updatePropertyType(
179
+ cls: ReturnType<IntrospectedNamespace["assertClass"]>,
180
+ propertyNames: string[],
181
+ newType: GenericType,
182
+ ): void {
183
+ cls.props
184
+ .filter((p) => propertyNames.includes(p.name))
185
+ .forEach((prop) => {
186
+ // TODO: Automatically infer such changes.
187
+ prop.type = newType;
188
+ });
189
+ }
190
+
191
+ // Version exports
192
+ export const st1 = createStTemplate("1.0");
193
+ export const st12 = createStTemplate("12");
194
+ export const st13 = createStTemplate("13");
195
+ /** St-14 was introduced with GNOME 46 */
196
+ export const st14 = createStTemplate("14");
197
+ /** St-15 was introduced with GNOME 47 */
198
+ export const st15 = createStTemplate("15");
199
+ /** St-16 was introduced with GNOME 48 */
200
+ export const st16 = createStTemplate("16");
201
+ /** St-17 was introduced with GNOME 49 */
202
+ export const st17 = createStTemplate("17");
203
+ /** St-18 was introduced with GNOME 50 */
204
+ export const st18 = createStTemplate("18");
205
+ // Possibly future versions, adjust if necessary
206
+ export const st19 = createStTemplate("19");
207
+ export const st20 = createStTemplate("20");
@@ -0,0 +1,484 @@
1
+ import type { IntrospectedCallback } from "../gir/callback.ts";
2
+ import type { IntrospectedConstructor } from "../gir/constructor.ts";
3
+ import type { IntrospectedDirectAllocationConstructor } from "../gir/direct-allocation-constructor.ts";
4
+ import type { IntrospectedEnum } from "../gir/enum.ts";
5
+ import { IntrospectedFunction } from "../gir/function.ts";
6
+ import { createGenericNameGenerator } from "../gir/generics.ts";
7
+ import type { IntrospectedInterface, IntrospectedVirtualClassFunction } from "../gir/introspected-classes.ts";
8
+ import {
9
+ IntrospectedBaseClass,
10
+ IntrospectedClass,
11
+ IntrospectedClassFunction,
12
+ IntrospectedStaticClassFunction,
13
+ } from "../gir/introspected-classes.ts";
14
+ import type { IntrospectedFunctionParameter } from "../gir/parameter.ts";
15
+ import type { IntrospectedSignal } from "../gir/signal.ts";
16
+ import {
17
+ ClosureType,
18
+ Generic,
19
+ GenericType,
20
+ GenerifiedTypeIdentifier,
21
+ ThisType,
22
+ type TypeExpression,
23
+ TypeIdentifier,
24
+ } from "../gir.ts";
25
+ import { resolveTypeIdentifier } from "../utils/type-resolution.ts";
26
+ import { GirVisitor } from "../visitor.ts";
27
+
28
+ /**
29
+ * Visitor that handles generic type inference and transformations
30
+ */
31
+ export class GenericVisitor extends GirVisitor {
32
+ private readonly inferGenerics: boolean;
33
+
34
+ constructor(inferGenerics: boolean) {
35
+ super();
36
+ this.inferGenerics = inferGenerics;
37
+ }
38
+
39
+ visitCallback = (node: IntrospectedCallback): IntrospectedCallback => {
40
+ if (!this.inferGenerics) {
41
+ return node;
42
+ }
43
+
44
+ const shouldGenerify = this.shouldGenerifyCallback(node);
45
+ if (!shouldGenerify) {
46
+ return node;
47
+ }
48
+
49
+ return this.createGenerifiedCallback(node);
50
+ };
51
+
52
+ visitClass = (node: IntrospectedClass): IntrospectedClass => {
53
+ return this.visitBaseClass(node);
54
+ };
55
+
56
+ visitInterface = (node: IntrospectedInterface): IntrospectedInterface => {
57
+ return this.visitBaseClass(node);
58
+ };
59
+
60
+ visitParameter = (node: IntrospectedFunctionParameter): IntrospectedFunctionParameter => {
61
+ if (!this.inferGenerics) {
62
+ return node;
63
+ }
64
+
65
+ const unwrapped = node.type.unwrap();
66
+ if (!(unwrapped instanceof ClosureType)) {
67
+ return node;
68
+ }
69
+
70
+ return this.processAsyncReadyCallback(node) ?? node;
71
+ };
72
+
73
+ visitFunction = (node: IntrospectedFunction): IntrospectedFunction => {
74
+ if (!this.inferGenerics) {
75
+ return node;
76
+ }
77
+
78
+ const unwrapped = node.return_type.unwrap();
79
+ const shouldGenerify = unwrapped instanceof TypeIdentifier && unwrapped.is("GObject", "Object");
80
+
81
+ if (!shouldGenerify) {
82
+ return node;
83
+ }
84
+
85
+ return this.createGenerifiedFunction(node, unwrapped);
86
+ };
87
+
88
+ visitStaticClassFunction = (node: IntrospectedStaticClassFunction): IntrospectedStaticClassFunction => {
89
+ if (this.inferGenerics) {
90
+ return this.generifyStandaloneClassFunction(node);
91
+ }
92
+ return node;
93
+ };
94
+
95
+ visitClassFunction = <T extends IntrospectedBaseClass | IntrospectedEnum>(
96
+ node: IntrospectedClassFunction<T>,
97
+ ): IntrospectedClassFunction<T> => {
98
+ if (node.parent instanceof IntrospectedBaseClass) {
99
+ const processedNode = this.processClassFunctionWithGenerics(node);
100
+ if (processedNode) {
101
+ return processedNode;
102
+ }
103
+ }
104
+
105
+ if (this.inferGenerics) {
106
+ return this.generifyStandaloneClassFunction(node);
107
+ }
108
+
109
+ return node;
110
+ };
111
+
112
+ visitVirtualClassFunction = (node: IntrospectedVirtualClassFunction): IntrospectedVirtualClassFunction => {
113
+ return this.visitClassFunction(node);
114
+ };
115
+
116
+ // Private helper methods
117
+
118
+ private visitBaseClass<T extends IntrospectedBaseClass>(node: T): T {
119
+ const copiedNode = node.copy() as T;
120
+ const derivatives = copiedNode.generics.filter((generic) => generic.parent != null);
121
+
122
+ this.processInterfaces(copiedNode, derivatives);
123
+ this.processSuperType(copiedNode, derivatives);
124
+
125
+ return copiedNode;
126
+ }
127
+
128
+ private shouldGenerifyCallback(node: IntrospectedCallback): boolean {
129
+ return node.parameters.some((parameter) => this.isGObjectType(parameter.type.unwrap()));
130
+ }
131
+
132
+ private isGObjectType(type: TypeExpression): boolean {
133
+ return type instanceof TypeIdentifier && type.is("GObject", "Object");
134
+ }
135
+
136
+ private createGenerifiedCallback(node: IntrospectedCallback): IntrospectedCallback {
137
+ const generateName = createGenericNameGenerator();
138
+ const generics: Generic[] = [];
139
+
140
+ const generifiedParameters = node.parameters.map((parameter) => {
141
+ const type = parameter.type.unwrap();
142
+
143
+ if (this.isGObjectType(type)) {
144
+ const { identifier, generic } = this.createGeneric(generateName(), type as TypeIdentifier);
145
+ generics.push(generic);
146
+
147
+ return parameter.copy({
148
+ type: parameter.type.rewrap(identifier),
149
+ });
150
+ }
151
+
152
+ return parameter;
153
+ });
154
+
155
+ const generifiedCallback = node.copy({
156
+ parameters: generifiedParameters,
157
+ });
158
+
159
+ generifiedCallback.generics = generics;
160
+ return generifiedCallback;
161
+ }
162
+
163
+ private createGeneric(identifier: string, baseType: TypeIdentifier): { identifier: GenericType; generic: Generic } {
164
+ const genericType = new GenericType(identifier, baseType);
165
+ const generic = new Generic(genericType, baseType);
166
+ return { identifier: genericType, generic };
167
+ }
168
+
169
+ private processInterfaces<T extends IntrospectedBaseClass>(node: T, derivatives: Generic[]): void {
170
+ if (!(node instanceof IntrospectedClass)) {
171
+ return;
172
+ }
173
+
174
+ const resolvedInterfaces = this.resolveInterfaces(node);
175
+ node.interfaces = node.interfaces.map((iface) =>
176
+ this.processInterface(node, iface, derivatives, resolvedInterfaces),
177
+ );
178
+ }
179
+
180
+ private resolveInterfaces(node: IntrospectedClass): IntrospectedBaseClass[] {
181
+ return node.interfaces
182
+ .map((i) => resolveTypeIdentifier(node.namespace, i))
183
+ .filter((c): c is IntrospectedBaseClass => c != null);
184
+ }
185
+
186
+ private processInterface<T extends IntrospectedBaseClass>(
187
+ node: T,
188
+ iface: TypeIdentifier,
189
+ derivatives: Generic[],
190
+ resolvedInterfaces: IntrospectedBaseClass[],
191
+ ): TypeIdentifier {
192
+ const matchingGenerics = derivatives.filter((d) => d.parent?.is(iface.namespace, iface.name));
193
+
194
+ if (matchingGenerics.length > 0) {
195
+ return new GenerifiedTypeIdentifier(
196
+ iface.name,
197
+ iface.namespace,
198
+ matchingGenerics.map((g) => g.type),
199
+ );
200
+ }
201
+
202
+ const resolved = resolvedInterfaces.find((i) => i.getType().equals(iface));
203
+ if (resolved) {
204
+ return this.processResolvedInterface(node, iface, resolved);
205
+ }
206
+
207
+ return iface;
208
+ }
209
+
210
+ private processResolvedInterface<T extends IntrospectedBaseClass>(
211
+ node: T,
212
+ iface: TypeIdentifier,
213
+ resolved: IntrospectedBaseClass,
214
+ ): TypeIdentifier {
215
+ if (resolved.generics.length !== 1) {
216
+ return iface;
217
+ }
218
+
219
+ const [generic] = resolved.generics;
220
+
221
+ if (generic.propagate) {
222
+ return this.handlePropagatingInterfaceGeneric(node, iface, resolved, generic);
223
+ }
224
+
225
+ return new GenerifiedTypeIdentifier(iface.name, iface.namespace, [node.getType()]);
226
+ }
227
+
228
+ private handlePropagatingInterfaceGeneric<T extends IntrospectedBaseClass>(
229
+ node: T,
230
+ iface: TypeIdentifier,
231
+ resolved: IntrospectedBaseClass,
232
+ generic: Generic,
233
+ ): TypeIdentifier {
234
+ const constrainedGeneric = this.findConstrainedGeneric(node, generic);
235
+
236
+ if (constrainedGeneric) {
237
+ return new GenerifiedTypeIdentifier(iface.name, iface.namespace, [constrainedGeneric.type]);
238
+ }
239
+
240
+ if (this.shouldAddNewGeneric(node, generic)) {
241
+ this.addGenericToNode(node, resolved, generic);
242
+ const firstGeneric = node.generics[node.generics.length - 1];
243
+ return new GenerifiedTypeIdentifier(resolved.name, resolved.namespace.namespace, [firstGeneric.type]);
244
+ }
245
+
246
+ return new GenerifiedTypeIdentifier(iface.name, iface.namespace, [node.getType()]);
247
+ }
248
+
249
+ private findConstrainedGeneric<T extends IntrospectedBaseClass>(node: T, generic: Generic): Generic | undefined {
250
+ return node.generics.find((d) => generic.constraint && d.constraint?.equals(generic.constraint));
251
+ }
252
+
253
+ private shouldAddNewGeneric<T extends IntrospectedBaseClass>(node: T, generic: Generic): boolean {
254
+ return !generic.defaultType?.equals(node.getType()) && !generic.constraint?.equals(node.getType());
255
+ }
256
+
257
+ private addGenericToNode<T extends IntrospectedBaseClass>(
258
+ node: T,
259
+ resolved: IntrospectedBaseClass,
260
+ generic: Generic,
261
+ ): void {
262
+ node.addGeneric({
263
+ constraint: generic.constraint ?? undefined,
264
+ default: generic.defaultType ?? undefined,
265
+ deriveFrom: resolved.getType(),
266
+ });
267
+ }
268
+
269
+ private processSuperType<T extends IntrospectedBaseClass>(node: T, derivatives: Generic[]): void {
270
+ if (!node.superType) {
271
+ return;
272
+ }
273
+
274
+ const parentType = node.superType;
275
+ const matchingGenerics = derivatives.filter((d) => d.parent?.is(parentType.namespace, parentType.name));
276
+
277
+ if (node.superType instanceof GenerifiedTypeIdentifier) {
278
+ return;
279
+ }
280
+
281
+ if (matchingGenerics.length > 0) {
282
+ node.superType = new GenerifiedTypeIdentifier(
283
+ parentType.name,
284
+ parentType.namespace,
285
+ matchingGenerics.map((g) => g.type),
286
+ );
287
+ return;
288
+ }
289
+
290
+ const resolvedParent = resolveTypeIdentifier(node.namespace, node.superType);
291
+ this.processResolvedParent(node, resolvedParent);
292
+ }
293
+
294
+ private processResolvedParent<T extends IntrospectedBaseClass>(
295
+ node: T,
296
+ resolved: IntrospectedBaseClass | null,
297
+ ): void {
298
+ if (!resolved || resolved.generics.length !== 1) {
299
+ return;
300
+ }
301
+
302
+ const [generic] = resolved.generics;
303
+
304
+ if (generic.propagate) {
305
+ this.handlePropagatingGeneric(node, resolved, generic);
306
+ } else if (this.shouldUseNodeType(node, generic)) {
307
+ node.superType = new GenerifiedTypeIdentifier(resolved.name, resolved.namespace.namespace, [node.getType()]);
308
+ }
309
+ }
310
+
311
+ private handlePropagatingGeneric<T extends IntrospectedBaseClass>(
312
+ node: T,
313
+ resolved: IntrospectedBaseClass,
314
+ generic: Generic,
315
+ ): void {
316
+ const constrainedGeneric = this.findConstrainedGeneric(node, generic);
317
+
318
+ if (constrainedGeneric) {
319
+ node.superType = new GenerifiedTypeIdentifier(resolved.name, resolved.namespace.namespace, [
320
+ constrainedGeneric.type,
321
+ ]);
322
+ return;
323
+ }
324
+
325
+ if (this.shouldAddNewGeneric(node, generic)) {
326
+ this.addGenericToNode(node, resolved, generic);
327
+ const firstGeneric = node.generics[node.generics.length - 1];
328
+ node.superType = new GenerifiedTypeIdentifier(resolved.name, resolved.namespace.namespace, [firstGeneric.type]);
329
+ } else if (this.shouldUseNodeType(node, generic)) {
330
+ node.superType = new GenerifiedTypeIdentifier(resolved.name, resolved.namespace.namespace, [node.getType()]);
331
+ }
332
+ }
333
+
334
+ private shouldUseNodeType<T extends IntrospectedBaseClass>(node: T, generic: Generic): boolean {
335
+ return [...node.resolveParents()].some((c) => generic.defaultType && c.identifier.equals(generic.defaultType));
336
+ }
337
+
338
+ private processAsyncReadyCallback(node: IntrospectedFunctionParameter): IntrospectedFunctionParameter | null {
339
+ const unwrapped = node.type.unwrap();
340
+ if (!(unwrapped instanceof ClosureType)) {
341
+ return null;
342
+ }
343
+
344
+ const internal = unwrapped.type.unwrap();
345
+ if (!(internal instanceof TypeIdentifier) || !internal.is("Gio", "AsyncReadyCallback")) {
346
+ return null;
347
+ }
348
+
349
+ const member = node.parent;
350
+ if (!member) {
351
+ return null;
352
+ }
353
+
354
+ const generifiedType = this.createAsyncReadyCallbackType(member, internal);
355
+
356
+ if (generifiedType) {
357
+ return node.copy({
358
+ type: node.type.rewrap(generifiedType),
359
+ });
360
+ }
361
+
362
+ return null;
363
+ }
364
+
365
+ private createAsyncReadyCallbackType(
366
+ member:
367
+ | IntrospectedFunction
368
+ | IntrospectedClassFunction
369
+ | IntrospectedSignal
370
+ | IntrospectedConstructor
371
+ | IntrospectedDirectAllocationConstructor,
372
+ internal: TypeIdentifier,
373
+ ): GenerifiedTypeIdentifier | null {
374
+ if (member instanceof IntrospectedFunction && member.parameters.length >= 2) {
375
+ return new GenerifiedTypeIdentifier(internal.name, internal.namespace, [member.parameters[0].type]);
376
+ }
377
+
378
+ if (member instanceof IntrospectedStaticClassFunction) {
379
+ return new GenerifiedTypeIdentifier(internal.name, internal.namespace, [member.parent.getType()]);
380
+ }
381
+
382
+ if (member instanceof IntrospectedClassFunction) {
383
+ return new GenerifiedTypeIdentifier(internal.name, internal.namespace, [ThisType]);
384
+ }
385
+
386
+ return null;
387
+ }
388
+
389
+ private createGenerifiedFunction(node: IntrospectedFunction, unwrapped: TypeIdentifier): IntrospectedFunction {
390
+ const genericReturnType = new GenericType("T", unwrapped);
391
+ const copied = node.copy({
392
+ return_type: genericReturnType,
393
+ });
394
+ copied.generics.push(new Generic(genericReturnType, unwrapped));
395
+ return copied;
396
+ }
397
+
398
+ private generifyStandaloneClassFunction<T extends IntrospectedClassFunction>(node: T): T {
399
+ if (this.shouldSkipFunctionGenerification(node)) {
400
+ return node;
401
+ }
402
+
403
+ const unwrapped = node.return().unwrap();
404
+
405
+ if (this.isGObjectType(unwrapped)) {
406
+ const genericReturnType = new GenericType("T", unwrapped as TypeIdentifier);
407
+ const copied = node.copy({
408
+ returnType: genericReturnType,
409
+ });
410
+ copied.generics.push(new Generic(genericReturnType, unwrapped as TypeIdentifier, unwrapped as TypeIdentifier));
411
+ return copied as T;
412
+ }
413
+
414
+ return node;
415
+ }
416
+
417
+ private shouldSkipFunctionGenerification<T extends IntrospectedClassFunction>(node: T): boolean {
418
+ return node.parent.getType().is("GObject", "Object");
419
+ }
420
+
421
+ private processClassFunctionWithGenerics<T extends IntrospectedBaseClass | IntrospectedEnum>(
422
+ node: IntrospectedClassFunction<T>,
423
+ ): IntrospectedClassFunction<T> | null {
424
+ const clazz = node.parent as IntrospectedBaseClass;
425
+
426
+ if (clazz.generics.length === 0) {
427
+ return null;
428
+ }
429
+
430
+ const returnType = this.processReturnTypeWithGenerics(node.return(), clazz.generics);
431
+
432
+ return node.copy({
433
+ parameters: this.processParametersWithGenerics(node.parameters, clazz.generics),
434
+ outputParameters: this.processOutputParametersWithGenerics(node.output_parameters, clazz.generics),
435
+ returnType,
436
+ });
437
+ }
438
+
439
+ private processReturnTypeWithGenerics(returnType: TypeExpression, generics: Generic[]): TypeExpression {
440
+ for (const generic of generics) {
441
+ if (generic.defaultType?.equals(returnType.deepUnwrap())) {
442
+ return returnType.rewrap(generic.type);
443
+ }
444
+ }
445
+ return returnType;
446
+ }
447
+
448
+ private processParametersWithGenerics(
449
+ parameters: IntrospectedFunctionParameter[],
450
+ generics: Generic[],
451
+ ): IntrospectedFunctionParameter[] {
452
+ return parameters.map((parameter) => this.processParameterWithGenerics(parameter, generics));
453
+ }
454
+
455
+ private processParameterWithGenerics(
456
+ parameter: IntrospectedFunctionParameter,
457
+ generics: Generic[],
458
+ ): IntrospectedFunctionParameter {
459
+ for (const generic of generics) {
460
+ if (generic.defaultType?.equals(parameter.type.deepUnwrap())) {
461
+ return parameter.copy({
462
+ type: parameter.type.rewrap(generic.type),
463
+ });
464
+ }
465
+ }
466
+ return parameter;
467
+ }
468
+
469
+ private processOutputParametersWithGenerics(
470
+ outputParameters: IntrospectedFunctionParameter[],
471
+ generics: Generic[],
472
+ ): IntrospectedFunctionParameter[] {
473
+ return outputParameters.map((parameter) => {
474
+ for (const generic of generics) {
475
+ if (generic.defaultType?.equals(parameter.type.unwrap())) {
476
+ return parameter.copy({
477
+ type: parameter.type.rewrap(generic.type),
478
+ });
479
+ }
480
+ }
481
+ return parameter;
482
+ });
483
+ }
484
+ }