@ts-for-gir/lib 4.0.0-beta.4 → 4.0.0-beta.40

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 (541) hide show
  1. package/README.md +13 -1
  2. package/package.json +17 -31
  3. package/src/constants.ts +152 -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 +80 -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 +50 -0
  17. package/src/generics/st.ts +206 -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 +1521 -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 +184 -0
  43. package/src/gir/signal.ts +246 -0
  44. package/src/gir-module.ts +759 -0
  45. package/src/gir.ts +893 -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 +707 -0
  50. package/src/injections/glib.ts +275 -0
  51. package/src/injections/gobject.ts +901 -0
  52. package/src/injections/gtk4.ts +23 -0
  53. package/src/injections/inject.ts +49 -0
  54. package/src/injections/shell.ts +49 -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 +53 -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 +58 -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 +627 -0
  128. package/src/utils/documentation.ts +61 -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 +243 -0
  133. package/src/utils/girs.ts +113 -0
  134. package/src/utils/index.ts +14 -0
  135. package/src/utils/naming.ts +188 -0
  136. package/src/utils/numbers.ts +8 -0
  137. package/src/utils/objects.ts +129 -0
  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 +247 -0
  143. package/src/validators/class.ts +324 -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 -26
  148. package/lib/constants.js +0 -28
  149. package/lib/constants.js.map +0 -1
  150. package/lib/dependency-manager.d.ts +0 -183
  151. package/lib/dependency-manager.js +0 -401
  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 -8
  169. package/lib/generators/dts-inline.js +0 -59
  170. package/lib/generators/dts-inline.js.map +0 -1
  171. package/lib/generators/dts-modules.d.ts +0 -8
  172. package/lib/generators/dts-modules.js +0 -100
  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 -256
  184. package/lib/generators/json.js +0 -869
  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 -112
  247. package/lib/gir-module.js +0 -570
  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 -26
  283. package/lib/messages.js +0 -42
  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 -181
  289. package/lib/transformation.js +0 -480
  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 -33
  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 -35
  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.d.ts +0 -268
  531. package/lib/utils.js +0 -417
  532. package/lib/utils.js.map +0 -1
  533. package/lib/validators/class.d.ts +0 -7
  534. package/lib/validators/class.js +0 -217
  535. package/lib/validators/class.js.map +0 -1
  536. package/lib/validators/interface.d.ts +0 -5
  537. package/lib/validators/interface.js +0 -16
  538. package/lib/validators/interface.js.map +0 -1
  539. package/lib/visitor.d.ts +0 -35
  540. package/lib/visitor.js +0 -29
  541. package/lib/visitor.js.map +0 -1
@@ -0,0 +1,627 @@
1
+ import { GirDirection } from "@gi.ts/parser";
2
+ import { ConsoleReporter, ReporterService } from "@ts-for-gir/reporter";
3
+ import { IntrospectedConstructor } from "../gir/constructor.ts";
4
+ import { FilterBehavior } from "../gir/data.ts";
5
+ import type { IntrospectedFunction } from "../gir/function.ts";
6
+ import type { IntrospectedClassMember } from "../gir/introspected-class-member.ts";
7
+ import type { IntrospectedBaseClass } from "../gir/introspected-classes.ts";
8
+ import {
9
+ IntrospectedClass,
10
+ IntrospectedClassFunction,
11
+ IntrospectedInterface,
12
+ IntrospectedStaticClassFunction,
13
+ IntrospectedVirtualClassFunction,
14
+ } from "../gir/introspected-classes.ts";
15
+ import type { IntrospectedNamespace } from "../gir/namespace.ts";
16
+ import { IntrospectedFunctionParameter } from "../gir/parameter.ts";
17
+ import { IntrospectedField, IntrospectedProperty } from "../gir/property.ts";
18
+ import type { TypeIdentifier } from "../gir.ts";
19
+ import { AnyType, ArrayType, ConflictType, NeverType, TypeConflict } from "../gir.ts";
20
+ import { findMap } from "../util.ts";
21
+ import { isSubtypeOf } from "./type-resolution.ts";
22
+
23
+ // Global reporter configuration for conflicts
24
+ let conflictsReporterInstance: ConsoleReporter | null = null;
25
+ let conflictsReporterConfig: { enabled: boolean; output: string } = {
26
+ enabled: false,
27
+ output: "ts-for-gir-report.json",
28
+ };
29
+
30
+ function configureConflictsReporterInternal(enabled: boolean, output: string = "ts-for-gir-report.json") {
31
+ conflictsReporterConfig = { enabled, output };
32
+
33
+ // Reset instance to force recreation with new config
34
+ if (conflictsReporterInstance) {
35
+ conflictsReporterInstance = null;
36
+ }
37
+
38
+ // Create and register the global reporter if enabled
39
+ if (enabled) {
40
+ conflictsReporterInstance = new ConsoleReporter(true, "conflicts", enabled, output);
41
+ const reporterService = ReporterService.getInstance();
42
+ reporterService.registerReporter("conflicts", conflictsReporterInstance);
43
+ }
44
+ }
45
+
46
+ function getConflictsReporterInstance(): ConsoleReporter {
47
+ if (!conflictsReporterInstance) {
48
+ const config = conflictsReporterConfig;
49
+ conflictsReporterInstance = new ConsoleReporter(true, "conflicts", config.enabled, config.output);
50
+
51
+ // Register with reporter service if reporting is enabled
52
+ if (config.enabled) {
53
+ const reporterService = ReporterService.getInstance();
54
+ reporterService.registerReporter("conflicts", conflictsReporterInstance);
55
+ }
56
+ }
57
+ return conflictsReporterInstance;
58
+ }
59
+
60
+ const log = getConflictsReporterInstance();
61
+
62
+ // Export function to configure conflicts reporter
63
+ export function configureConflictsReporter(enabled: boolean, output: string = "ts-for-gir-report.json") {
64
+ configureConflictsReporterInternal(enabled, output);
65
+ }
66
+
67
+ // Constants for GObject methods that always conflict
68
+ const GOBJECT_RESERVED_METHODS = ["connect", "connect_after", "emit"] as const;
69
+
70
+ export function isConflictingFunction(
71
+ namespace: IntrospectedNamespace,
72
+ childThis: TypeIdentifier,
73
+ child: IntrospectedFunction | IntrospectedClassFunction | IntrospectedConstructor,
74
+ parentThis: TypeIdentifier,
75
+ parent: IntrospectedClassFunction | IntrospectedFunction | IntrospectedConstructor,
76
+ ): boolean {
77
+ if (!parent.isIntrospectable || !child.isIntrospectable) {
78
+ return false;
79
+ }
80
+
81
+ // Handle constructor conflicts
82
+ if (isConstructorConflict(namespace, childThis, child, parentThis, parent)) {
83
+ return true;
84
+ }
85
+
86
+ // Handle mixed constructor/function conflicts
87
+ if (isMixedConstructorFunctionConflict(child, parent)) {
88
+ return true;
89
+ }
90
+
91
+ // Handle different function types (no conflict if different prototypes)
92
+ if (hasDifferentPrototypes(child, parent)) {
93
+ return false;
94
+ }
95
+
96
+ // Check parameter and return type conflicts
97
+ return hasParameterOrReturnTypeConflicts(namespace, childThis, child, parentThis, parent);
98
+ }
99
+
100
+ export function filterFunctionConflict<
101
+ T extends
102
+ | IntrospectedStaticClassFunction
103
+ | IntrospectedVirtualClassFunction
104
+ | IntrospectedClassFunction
105
+ | IntrospectedConstructor,
106
+ >(
107
+ ns: IntrospectedNamespace,
108
+ base: IntrospectedBaseClass,
109
+ elements: T[],
110
+ conflict_ids: string[],
111
+ isInheritedMethods: boolean = false,
112
+ ): T[] {
113
+ const nextType = base.getType();
114
+
115
+ return elements
116
+ .filter((m) => m.name)
117
+ .reduce((prev, next) => {
118
+ const conflictResult = checkFunctionConflicts(ns, base, next, conflict_ids, nextType);
119
+
120
+ if (conflictResult.shouldOmit) {
121
+ // Always omit methods that conflict with properties/fields
122
+ log.reportTypeConflict(
123
+ "field_property",
124
+ next.name,
125
+ next.parent?.namespace.namespace || "unknown",
126
+ "Field/property name conflict",
127
+ );
128
+ } else if (conflictResult.hasConflict) {
129
+ if (isInheritedMethods) {
130
+ log.reportTypeConflict(
131
+ "method",
132
+ next.name,
133
+ next.parent?.namespace.namespace || "unknown",
134
+ "Parent method conflict",
135
+ );
136
+ } else {
137
+ const neverFunction = createNeverFunction(next, base, conflictResult.message);
138
+ prev.push(next, neverFunction as T);
139
+ }
140
+ } else {
141
+ prev.push(next);
142
+ }
143
+
144
+ return prev;
145
+ }, [] as T[]);
146
+ }
147
+
148
+ export function filterConflicts<T extends IntrospectedClassMember | IntrospectedClassFunction | IntrospectedProperty>(
149
+ ns: IntrospectedNamespace,
150
+ c: IntrospectedBaseClass,
151
+ elements: T[],
152
+ behavior = FilterBehavior.PRESERVE,
153
+ ): T[] {
154
+ const filtered = elements.filter((p) => p?.name);
155
+ const thisType = c.getType();
156
+ const result: T[] = [];
157
+
158
+ for (const element of filtered) {
159
+ const conflictType = detectConflictType(ns, c, element, thisType);
160
+
161
+ if (conflictType) {
162
+ if (behavior === FilterBehavior.PRESERVE) {
163
+ const conflictElement = createConflictElement(element, conflictType);
164
+ if (conflictElement) {
165
+ result.push(conflictElement);
166
+ } else {
167
+ result.push(element);
168
+ }
169
+ }
170
+ } else {
171
+ result.push(element);
172
+ }
173
+ }
174
+
175
+ return result;
176
+ }
177
+
178
+ // Helper Functions
179
+
180
+ function isConstructorConflict(
181
+ namespace: IntrospectedNamespace,
182
+ childThis: TypeIdentifier,
183
+ child: IntrospectedFunction | IntrospectedClassFunction | IntrospectedConstructor,
184
+ parentThis: TypeIdentifier,
185
+ parent: IntrospectedClassFunction | IntrospectedFunction | IntrospectedConstructor,
186
+ ): boolean {
187
+ if (!(child instanceof IntrospectedConstructor && parent instanceof IntrospectedConstructor)) {
188
+ return false;
189
+ }
190
+
191
+ return (
192
+ child.parameters.length > parent.parameters.length ||
193
+ !isSubtypeOf(namespace, childThis, parentThis, child.return(), parent.return()) ||
194
+ child.parameters.some((p, i) => !isSubtypeOf(namespace, childThis, parentThis, p.type, parent.parameters[i].type))
195
+ );
196
+ }
197
+
198
+ function isMixedConstructorFunctionConflict(
199
+ child: IntrospectedFunction | IntrospectedClassFunction | IntrospectedConstructor,
200
+ parent: IntrospectedClassFunction | IntrospectedFunction | IntrospectedConstructor,
201
+ ): boolean {
202
+ return child instanceof IntrospectedConstructor !== parent instanceof IntrospectedConstructor;
203
+ }
204
+
205
+ function hasDifferentPrototypes(
206
+ child: IntrospectedFunction | IntrospectedClassFunction | IntrospectedConstructor,
207
+ parent: IntrospectedClassFunction | IntrospectedFunction | IntrospectedConstructor,
208
+ ): boolean {
209
+ // This occurs if two functions of the same name are passed but they
210
+ // are different types (e.g. GirStaticClassFunction vs GirClassFunction)
211
+ return Object.getPrototypeOf(child) !== Object.getPrototypeOf(parent);
212
+ }
213
+
214
+ function hasParameterOrReturnTypeConflicts(
215
+ namespace: IntrospectedNamespace,
216
+ childThis: TypeIdentifier,
217
+ child: IntrospectedFunction | IntrospectedClassFunction | IntrospectedConstructor,
218
+ parentThis: TypeIdentifier,
219
+ parent: IntrospectedClassFunction | IntrospectedFunction | IntrospectedConstructor,
220
+ ): boolean {
221
+ // Check basic parameter conflicts
222
+ if (child.parameters.length > parent.parameters.length) {
223
+ return true;
224
+ }
225
+
226
+ // Check return type conflicts
227
+ if (!isSubtypeOf(namespace, childThis, parentThis, child.return(), parent.return())) {
228
+ return true;
229
+ }
230
+
231
+ // Check parameter type conflicts
232
+ if (
233
+ child.parameters.some((np, i) => !isSubtypeOf(namespace, childThis, parentThis, np.type, parent.parameters[i].type))
234
+ ) {
235
+ return true;
236
+ }
237
+
238
+ // Only check output parameters if both functions have them (constructors don't have output_parameters)
239
+ const childHasOutputParams = "output_parameters" in child;
240
+ const parentHasOutputParams = "output_parameters" in parent;
241
+
242
+ if (childHasOutputParams && parentHasOutputParams) {
243
+ // Length mismatch
244
+ if (child.output_parameters.length !== parent.output_parameters.length) {
245
+ return true;
246
+ }
247
+
248
+ // Type mismatch
249
+ if (
250
+ child.output_parameters.some(
251
+ (np, i) => !isSubtypeOf(namespace, childThis, parentThis, np.type, parent.output_parameters[i].type),
252
+ )
253
+ ) {
254
+ return true;
255
+ }
256
+ }
257
+
258
+ return false;
259
+ }
260
+
261
+ interface ConflictResult {
262
+ hasConflict: boolean;
263
+ shouldOmit: boolean;
264
+ message: string | null;
265
+ }
266
+
267
+ function checkFunctionConflicts<T extends IntrospectedClassFunction | IntrospectedConstructor>(
268
+ ns: IntrospectedNamespace,
269
+ base: IntrospectedBaseClass,
270
+ functionElement: T,
271
+ conflict_ids: string[],
272
+ nextType: TypeIdentifier,
273
+ ): ConflictResult {
274
+ let message: string | null = null;
275
+
276
+ // Check explicit conflict IDs
277
+ if (conflict_ids.includes(functionElement.name)) {
278
+ return { hasConflict: true, shouldOmit: false, message };
279
+ }
280
+
281
+ // Check parent function conflicts
282
+ const hasParentConflict = base.someParent((resolved_parent) => {
283
+ const parentType = resolved_parent.getType();
284
+ return [...resolved_parent.constructors, ...resolved_parent.members].some((p) => {
285
+ if (p.name && p.name === functionElement.name) {
286
+ const conflicting = isConflictingFunction(ns, nextType, functionElement, parentType, p);
287
+
288
+ if (conflicting) {
289
+ message = `// Conflicted with ${resolved_parent.namespace.namespace}.${resolved_parent.name}.${p.name}`;
290
+ return true;
291
+ }
292
+ return false;
293
+ }
294
+ return false;
295
+ });
296
+ });
297
+
298
+ // Check field/property conflicts
299
+ const hasFieldConflicts = checkFieldPropertyConflicts(base, functionElement.name);
300
+
301
+ // Check GObject reserved methods
302
+ const hasGObjectConflicts = checkGObjectConflicts(base, functionElement.name);
303
+
304
+ const hasConflict = hasParentConflict || hasGObjectConflicts;
305
+
306
+ return {
307
+ hasConflict,
308
+ shouldOmit: hasFieldConflicts && !hasConflict,
309
+ message,
310
+ };
311
+ }
312
+
313
+ function checkFieldPropertyConflicts(base: IntrospectedBaseClass, name: string): boolean {
314
+ // Check if the method name conflicts with any props or fields either on
315
+ // the class or in the parent...
316
+ return (
317
+ [...base.props, ...base.fields].some((p) => p.name && p.name === name) ||
318
+ base.someParent((resolved_parent) =>
319
+ [...resolved_parent.props, ...resolved_parent.fields].some((p) => p.name && p.name === name),
320
+ )
321
+ );
322
+ }
323
+
324
+ function checkGObjectConflicts(base: IntrospectedBaseClass, name: string): boolean {
325
+ const isGObject = base.someParent((p) => p.namespace.namespace === "GObject" && p.name === "Object");
326
+ return isGObject && (GOBJECT_RESERVED_METHODS as readonly string[]).includes(name);
327
+ }
328
+
329
+ function createNeverFunction<T extends IntrospectedClassFunction | IntrospectedConstructor>(
330
+ original: T,
331
+ base: IntrospectedBaseClass,
332
+ message: string | null,
333
+ ):
334
+ | IntrospectedClassFunction
335
+ | IntrospectedConstructor
336
+ | IntrospectedStaticClassFunction
337
+ | IntrospectedVirtualClassFunction {
338
+ const neverParam = new IntrospectedFunctionParameter({
339
+ name: "args",
340
+ direction: GirDirection.In,
341
+ isVarArgs: true,
342
+ type: new ArrayType(NeverType),
343
+ });
344
+
345
+ const neverOptions = {
346
+ name: original.name,
347
+ parent: base,
348
+ parameters: [neverParam],
349
+ return_type: AnyType,
350
+ };
351
+
352
+ let neverFunction:
353
+ | IntrospectedClassFunction
354
+ | IntrospectedConstructor
355
+ | IntrospectedStaticClassFunction
356
+ | IntrospectedVirtualClassFunction;
357
+
358
+ if (original instanceof IntrospectedConstructor) {
359
+ neverFunction = new IntrospectedConstructor(neverOptions);
360
+ } else if (original instanceof IntrospectedStaticClassFunction) {
361
+ neverFunction = new IntrospectedStaticClassFunction({ ...neverOptions, parent: original.parent });
362
+ } else if (original instanceof IntrospectedVirtualClassFunction && original.parent instanceof IntrospectedClass) {
363
+ neverFunction = new IntrospectedVirtualClassFunction({ ...neverOptions, parent: original.parent });
364
+ } else if (original instanceof IntrospectedClassFunction) {
365
+ neverFunction = new IntrospectedClassFunction({ ...neverOptions, parent: original.parent });
366
+ } else {
367
+ const parent = Object.getPrototypeOf(original as (...args: unknown[]) => unknown) as
368
+ | ((...args: unknown[]) => unknown)
369
+ | null
370
+ | undefined;
371
+ throw new Error(`Unknown function type ${parent?.name} encountered.`);
372
+ }
373
+
374
+ if (message) {
375
+ neverFunction.setWarning(message);
376
+ }
377
+
378
+ return neverFunction;
379
+ }
380
+
381
+ function detectConflictType<T extends IntrospectedClassMember | IntrospectedClassFunction | IntrospectedProperty>(
382
+ ns: IntrospectedNamespace,
383
+ c: IntrospectedBaseClass,
384
+ element: T,
385
+ thisType: TypeIdentifier,
386
+ ): ConflictType | undefined {
387
+ // Check field conflicts first
388
+ const fieldConflict = checkFieldConflicts(c, element);
389
+ if (fieldConflict) return fieldConflict;
390
+
391
+ // Check property conflicts
392
+ const propertyConflict = checkPropertyConflicts(ns, c, element, thisType);
393
+ if (propertyConflict) return propertyConflict;
394
+
395
+ // Check virtual function signature conflicts (for interfaces)
396
+ if (element instanceof IntrospectedVirtualClassFunction) {
397
+ const vfuncConflict = checkVfuncSignatureConflicts(ns, c, element, thisType);
398
+ if (vfuncConflict) return vfuncConflict;
399
+ }
400
+
401
+ // Check function conflicts
402
+ return checkFunctionNameConflicts(ns, c, element, thisType);
403
+ }
404
+
405
+ function checkFieldConflicts<T extends IntrospectedClassMember | IntrospectedClassFunction | IntrospectedProperty>(
406
+ c: IntrospectedBaseClass,
407
+ element: T,
408
+ ): ConflictType | undefined {
409
+ return c.findParentMap((resolved_parent) => {
410
+ return findMap([...resolved_parent.fields], (p) => {
411
+ if (p.name && p.name === element.name) {
412
+ if (element instanceof IntrospectedProperty) {
413
+ return ConflictType.ACCESSOR_PROPERTY_CONFLICT;
414
+ }
415
+
416
+ if (
417
+ element instanceof IntrospectedField &&
418
+ !isSubtypeOf(c.namespace, c.getType(), resolved_parent.getType(), element.type, p.type)
419
+ ) {
420
+ return ConflictType.FIELD_NAME_CONFLICT;
421
+ }
422
+ }
423
+
424
+ return undefined;
425
+ });
426
+ });
427
+ }
428
+
429
+ function checkPropertyConflicts<T extends IntrospectedClassMember | IntrospectedClassFunction | IntrospectedProperty>(
430
+ ns: IntrospectedNamespace,
431
+ c: IntrospectedBaseClass,
432
+ element: T,
433
+ thisType: TypeIdentifier,
434
+ ): ConflictType | undefined {
435
+ return c.findParentMap((resolved_parent) => {
436
+ return findMap([...resolved_parent.props], (p) => {
437
+ if (p.name && p.name === element.name) {
438
+ // Classes can override parent interface accessors with properties _but_
439
+ // classes cannot override parent class accessors with properties without an error occurring.
440
+ if (p.parent instanceof IntrospectedClass && element instanceof IntrospectedField) {
441
+ return ConflictType.PROPERTY_ACCESSOR_CONFLICT;
442
+ }
443
+
444
+ if (
445
+ element instanceof IntrospectedProperty &&
446
+ !isSubtypeOf(ns, thisType, resolved_parent.getType(), element.type, p.type)
447
+ ) {
448
+ log.reportTypeConflict(
449
+ "general",
450
+ element.name,
451
+ element.parent?.namespace.namespace || "unknown",
452
+ `Conflict with ${p.parent?.name}.${p.name}`,
453
+ );
454
+ return ConflictType.PROPERTY_NAME_CONFLICT;
455
+ }
456
+ }
457
+
458
+ return undefined;
459
+ });
460
+ });
461
+ }
462
+
463
+ function checkFunctionNameConflicts<
464
+ T extends IntrospectedClassMember | IntrospectedClassFunction | IntrospectedProperty,
465
+ >(ns: IntrospectedNamespace, c: IntrospectedBaseClass, element: T, thisType: TypeIdentifier): ConflictType | undefined {
466
+ return c.findParentMap((resolved_parent) =>
467
+ findMap([...resolved_parent.constructors, ...resolved_parent.members], (p) => {
468
+ if (p.name && p.name === element.name) {
469
+ if (element instanceof IntrospectedProperty) {
470
+ // Properties that conflict with parent functions should be treated as FUNCTION_NAME_CONFLICT
471
+ return ConflictType.FUNCTION_NAME_CONFLICT;
472
+ }
473
+ if (
474
+ !(element instanceof IntrospectedClassFunction) ||
475
+ isConflictingFunction(ns, thisType, element, resolved_parent.getType(), p)
476
+ ) {
477
+ return ConflictType.FUNCTION_NAME_CONFLICT;
478
+ }
479
+ }
480
+
481
+ return undefined;
482
+ }),
483
+ );
484
+ }
485
+
486
+ function checkVfuncSignatureConflicts(
487
+ ns: IntrospectedNamespace,
488
+ c: IntrospectedBaseClass,
489
+ element: IntrospectedVirtualClassFunction,
490
+ thisType: TypeIdentifier,
491
+ ): ConflictType | undefined {
492
+ // Only check for vfunc conflicts on interfaces
493
+ if (!(c instanceof IntrospectedInterface)) {
494
+ return undefined;
495
+ }
496
+
497
+ // Check if this virtual method conflicts with parent class or interface methods
498
+ return c.findParentMap((resolved_parent) => {
499
+ // Look for virtual methods with the same name in parent classes/interfaces
500
+ const parentVirtualMethods = resolved_parent.members.filter(
501
+ (m) => m instanceof IntrospectedVirtualClassFunction && m.name === element.name,
502
+ );
503
+
504
+ for (const parentMethod of parentVirtualMethods) {
505
+ // Check if signatures conflict
506
+ if (isConflictingFunction(ns, thisType, element, resolved_parent.getType(), parentMethod)) {
507
+ return ConflictType.VFUNC_SIGNATURE_CONFLICT;
508
+ }
509
+ }
510
+
511
+ // Also check if the parent is an interface that might have virtual methods from its Interface namespace
512
+ // This is important for cases like List extends Collection where both have vfunc_get_read_only_view
513
+ if (resolved_parent instanceof IntrospectedInterface) {
514
+ // Get the virtual methods from the parent interface
515
+ const parentInterfaceVirtualMethods = resolved_parent.members.filter(
516
+ (m) => m instanceof IntrospectedVirtualClassFunction && m.name === element.name,
517
+ );
518
+
519
+ for (const parentMethod of parentInterfaceVirtualMethods) {
520
+ // Check if signatures conflict between the interfaces
521
+ if (isConflictingFunction(ns, thisType, element, resolved_parent.getType(), parentMethod)) {
522
+ return ConflictType.VFUNC_SIGNATURE_CONFLICT;
523
+ }
524
+ }
525
+ }
526
+
527
+ return undefined;
528
+ });
529
+ }
530
+
531
+ function createConflictElement<T extends IntrospectedClassMember | IntrospectedClassFunction | IntrospectedProperty>(
532
+ element: T,
533
+ conflictType: ConflictType,
534
+ ): T | null {
535
+ if (element instanceof IntrospectedField || element instanceof IntrospectedProperty) {
536
+ return element.copy({
537
+ type: new TypeConflict(element.type, conflictType),
538
+ }) as T;
539
+ }
540
+
541
+ // For VFUNC_SIGNATURE_CONFLICT, we'll handle it differently in the generator
542
+ // Just mark the element so the generator knows to create overloads
543
+ if (conflictType === ConflictType.VFUNC_SIGNATURE_CONFLICT && element instanceof IntrospectedVirtualClassFunction) {
544
+ // Return the element with a marker that will be handled in the generator
545
+ // We don't use TypeConflict here as that causes resolution errors
546
+ return element;
547
+ }
548
+
549
+ return null;
550
+ }
551
+
552
+ /**
553
+ * Check if an interface has virtual methods that conflict with parent class or interface methods.
554
+ * This is used to determine whether to inherit from Interface namespace or generate method overloads.
555
+ */
556
+ export function hasVfuncSignatureConflicts(ns: IntrospectedNamespace, interfaceClass: IntrospectedInterface): boolean {
557
+ const thisType = interfaceClass.getType();
558
+ const virtualMethods = interfaceClass.members.filter(
559
+ (m) => m instanceof IntrospectedVirtualClassFunction,
560
+ ) as IntrospectedVirtualClassFunction[];
561
+
562
+ // If we don't have any virtual methods, no conflicts possible
563
+ if (virtualMethods.length === 0) {
564
+ return false;
565
+ }
566
+
567
+ // Check each virtual method for conflicts with parent classes/interfaces
568
+ for (const vmethod of virtualMethods) {
569
+ const conflictType = checkVfuncSignatureConflicts(ns, interfaceClass, vmethod, thisType);
570
+ if (conflictType === ConflictType.VFUNC_SIGNATURE_CONFLICT) {
571
+ return true;
572
+ }
573
+ }
574
+
575
+ // Check if any parent interface already inherits from its own .Interface namespace
576
+ // If it does, and we have virtual methods with the same name but different signatures,
577
+ // we have a conflict (e.g., List extends Collection, List.Interface and BidirList extends List, BidirList.Interface)
578
+ const hasParentWithVirtualMethods = interfaceClass.someParent((parent) => {
579
+ // Only check parent interfaces (not classes)
580
+ if (!(parent instanceof IntrospectedInterface)) {
581
+ return false;
582
+ }
583
+
584
+ // Check if the parent interface has virtual methods (which means it probably inherits from its .Interface namespace)
585
+ const parentHasVirtualMethods = parent.members.some((m) => m instanceof IntrospectedVirtualClassFunction);
586
+
587
+ if (!parentHasVirtualMethods) {
588
+ return false; // Parent has no virtual methods, no conflict
589
+ }
590
+
591
+ // Check if any of our virtual methods have the same name as parent's virtual methods
592
+ // but with different signatures (especially return types)
593
+ for (const vmethod of virtualMethods) {
594
+ // Find virtual methods with the same name in the parent
595
+ const parentVirtualMethods = parent.members.filter(
596
+ (m) => m instanceof IntrospectedVirtualClassFunction && m.name === vmethod.name,
597
+ ) as IntrospectedVirtualClassFunction[];
598
+
599
+ for (const parentMethod of parentVirtualMethods) {
600
+ // For interfaces, even if the return type is a subtype, TypeScript won't allow
601
+ // multiple inheritance from interfaces with the same method but different return types
602
+ // So we need to check if there's any difference in signatures
603
+ // Note: We can't just use isConflictingFunction because it allows subtype relationships
604
+ // but TypeScript doesn't allow that for interface multiple inheritance
605
+
606
+ // Check if return types are different (even if one is a subtype of the other)
607
+ const ourReturn = vmethod.return();
608
+ const parentReturn = parentMethod.return();
609
+
610
+ // Check if return types are not exactly the same
611
+ // For interface inheritance, even subtype relationships cause conflicts
612
+ if (!ourReturn.equals(parentReturn)) {
613
+ return true; // Different return types = conflict
614
+ }
615
+
616
+ // Also check parameters using the existing conflict detection
617
+ if (isConflictingFunction(ns, thisType, vmethod, parent.getType(), parentMethod)) {
618
+ return true;
619
+ }
620
+ }
621
+ }
622
+
623
+ return false;
624
+ });
625
+
626
+ return hasParentWithVirtualMethods;
627
+ }
@@ -0,0 +1,61 @@
1
+ import { NEW_LINE_REG_EXP } from "../constants.ts";
2
+
3
+ /**
4
+ * Transforms GIR documentation text to markdown format
5
+ * @param text The documentation text to transform
6
+ * @returns The transformed markdown text
7
+ */
8
+ export function transformGirDocText(text: string): string {
9
+ text = transformGirDocHighlights(text);
10
+ text = transformGirDocCodeBlocks(text);
11
+ return text;
12
+ }
13
+
14
+ /**
15
+ * Transforms TSDoc tag text by removing newlines
16
+ * Used for @param and @returns descriptions
17
+ * @param text The tag text to transform
18
+ * @returns The cleaned text
19
+ */
20
+ export function transformGirDocTagText(text: string): string {
21
+ return text.replace(NEW_LINE_REG_EXP, " ");
22
+ }
23
+
24
+ /**
25
+ * Replaces "@any_property" with "`any_property`"
26
+ * @param description E.g. "Creates a binding between @source_property on @source and @target_property on @target."
27
+ * @returns E.g. "Creates a binding between `source_property` on `source` and `target_property` on `target`."
28
+ */
29
+ function transformGirDocHighlights(description: string): string {
30
+ const highlights = description.match(/@[A-Za-z_-]*[^\s.]/gm);
31
+ if (highlights) {
32
+ for (const highlight of highlights) {
33
+ description = description.replace(highlight, `\`${highlight.slice(1)}\``);
34
+ }
35
+ }
36
+ return description;
37
+ }
38
+
39
+ /**
40
+ * Replaces GIR code blocks with markdown code fences
41
+ *
42
+ * Replaces:
43
+ * |[<!-- language="C" -->
44
+ * g_object_notify_by_pspec (self, properties[PROP_FOO]);
45
+ * ]|
46
+ *
47
+ * with:
48
+ * ```c
49
+ * g_object_notify_by_pspec (self, properties[PROP_FOO]);
50
+ * ```
51
+ *
52
+ * @param description The description containing code blocks
53
+ * @returns The description with markdown code fences
54
+ */
55
+ function transformGirDocCodeBlocks(description: string): string {
56
+ description = description
57
+ .replaceAll(/\|\[<!-- language="C" -->/gm, "\n```c") // C-Code
58
+ .replaceAll(/\|\[/gm, "\n```") // Other code
59
+ .replaceAll(/\]\|/gm, "```\n"); // End of code
60
+ return description;
61
+ }