@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,488 @@
1
+ import { ConsoleReporter } from "@ts-for-gir/reporter";
2
+ import type { FormatGenerator } from "../generators/generator.ts";
3
+ import { ArrayType, ClassStructTypeIdentifier, NativeType, type TypeExpression, TypeIdentifier } from "../gir.ts";
4
+ import type { GirRecordElement, GirUnionElement, OptionsLoad, RecordResolution } from "../types/index.ts";
5
+ import { parseDoc, parseMetadata } from "../utils/gir-parsing.ts";
6
+ import { sanitizeIdentifierName } from "../utils/naming.ts";
7
+ import { resolveTypeIdentifier } from "../utils/type-resolution.ts";
8
+ import { parseTypeIdentifier } from "../utils/types.ts";
9
+ import type { GirVisitor } from "../visitor.ts";
10
+ import { IntrospectedConstructor } from "./constructor.ts";
11
+ import {
12
+ IntrospectedBaseClass,
13
+ type IntrospectedClassCallback,
14
+ IntrospectedClassFunction,
15
+ IntrospectedStaticClassFunction,
16
+ } from "./introspected-classes.ts";
17
+ import type { IntrospectedNamespace } from "./namespace.ts";
18
+ import { IntrospectedField, type IntrospectedProperty } from "./property.ts";
19
+ import type { IntrospectedSignal } from "./signal.ts";
20
+
21
+ const log = new ConsoleReporter(true, "gir/class", true);
22
+
23
+ export class IntrospectedRecord extends IntrospectedBaseClass {
24
+ private _isForeign: boolean = false;
25
+ private _structFor: ClassStructTypeIdentifier | null = null;
26
+ private _isSimple: boolean | null = null;
27
+ private _isSimpleWithoutPointers: string | null = null;
28
+ private _overriddenGType: string | null = null;
29
+
30
+ /**
31
+ * Returns all signals for this record (records typically don't have signals)
32
+ */
33
+ getAllSignals(): Array<{
34
+ name: string;
35
+ signal?: IntrospectedSignal;
36
+ isNotifySignal?: boolean;
37
+ isDetailSignal?: boolean;
38
+ parameterTypes?: string[];
39
+ returnType?: string;
40
+ }> {
41
+ // Records typically don't have signals, but we provide a consistent API
42
+ return [];
43
+ }
44
+
45
+ isForeign(): boolean {
46
+ return this._isForeign;
47
+ }
48
+
49
+ get structFor() {
50
+ return this._structFor;
51
+ }
52
+
53
+ get gtype() {
54
+ return this._overriddenGType ?? this.name;
55
+ }
56
+
57
+ overrideGType(gtype: string) {
58
+ this._overriddenGType = gtype;
59
+ }
60
+
61
+ getType(): TypeIdentifier {
62
+ if (this._structFor) {
63
+ return this._structFor;
64
+ }
65
+
66
+ return new TypeIdentifier(this.name, this.namespace.namespace);
67
+ }
68
+
69
+ someParent(predicate: (p: IntrospectedRecord) => boolean): boolean {
70
+ const resolution = this.resolveParents();
71
+ const parent = resolution.extends();
72
+
73
+ return !!parent && (predicate(parent.node) || parent.node.someParent(predicate));
74
+ }
75
+
76
+ findParent(predicate: (p: IntrospectedRecord) => boolean): IntrospectedRecord | undefined {
77
+ const resolution = this.resolveParents();
78
+
79
+ const parent = resolution.extends();
80
+
81
+ if (parent) {
82
+ if (predicate(parent.node)) return parent.node;
83
+
84
+ const found = parent.node.findParent(predicate);
85
+
86
+ if (found) return found;
87
+ }
88
+
89
+ return undefined;
90
+ }
91
+
92
+ findParentMap<K>(predicate: (p: IntrospectedRecord) => K | undefined): K | undefined {
93
+ const resolution = this.resolveParents();
94
+
95
+ const parent = resolution.extends();
96
+
97
+ if (parent) {
98
+ const result = predicate(parent.node);
99
+
100
+ if (result !== undefined) return result;
101
+
102
+ return parent.node.findParentMap(predicate);
103
+ }
104
+
105
+ return undefined;
106
+ }
107
+
108
+ accept(visitor: GirVisitor): IntrospectedRecord {
109
+ const node = this.copy({
110
+ constructors: this.constructors.map((c) => c.accept(visitor)),
111
+ members: this.members.map((m) => m.accept(visitor)),
112
+ props: this.props.map((p) => p.accept(visitor)),
113
+ fields: this.fields.map((f) => f.accept(visitor)),
114
+ callbacks: this.callbacks.map((c) => c.accept(visitor)),
115
+ });
116
+
117
+ return visitor.visitRecord?.(node) ?? node;
118
+ }
119
+
120
+ resolveParents(): RecordResolution {
121
+ const { namespace, superType } = this;
122
+
123
+ return {
124
+ *[Symbol.iterator]() {
125
+ let current = this.extends();
126
+
127
+ while (current !== undefined) {
128
+ yield current;
129
+ current = current.extends();
130
+ }
131
+ },
132
+ extends() {
133
+ const resolved_parent = superType ? resolveTypeIdentifier(namespace, superType) : undefined;
134
+ if (resolved_parent instanceof IntrospectedRecord) return resolved_parent.resolveParents();
135
+
136
+ return undefined;
137
+ },
138
+ node: this,
139
+ identifier: this.getType(),
140
+ };
141
+ }
142
+
143
+ copy(
144
+ options: {
145
+ parent?: undefined;
146
+ constructors?: IntrospectedConstructor[];
147
+ members?: IntrospectedClassFunction[];
148
+ props?: IntrospectedProperty[];
149
+ fields?: IntrospectedField[];
150
+ callbacks?: IntrospectedClassCallback[];
151
+ } = {},
152
+ ): IntrospectedRecord {
153
+ const {
154
+ name,
155
+ namespace,
156
+ superType,
157
+ members,
158
+ constructors,
159
+ _isForeign,
160
+ _structFor,
161
+ _overriddenGType,
162
+ props,
163
+ fields,
164
+ callbacks,
165
+ generics,
166
+ mainConstructor,
167
+ } = this;
168
+
169
+ const clazz = new IntrospectedRecord({ name, namespace });
170
+
171
+ clazz._copyBaseProperties(this);
172
+
173
+ if (superType) {
174
+ clazz.superType = superType;
175
+ }
176
+
177
+ clazz._structFor = _structFor;
178
+ clazz._isForeign = _isForeign;
179
+ clazz._overriddenGType = _overriddenGType;
180
+ clazz.props = (options.props ?? props).map((p) => p.copy({ parent: clazz }));
181
+ clazz.fields = (options.fields ?? fields).map((f) => f.copy({ parent: clazz }));
182
+ clazz.callbacks = (options.callbacks ?? callbacks).map((c) => c.copy({ parent: clazz }));
183
+ clazz.mainConstructor = mainConstructor?.copy({ parent: clazz }) ?? null;
184
+ clazz.constructors = (options.constructors ?? constructors).map((c) => c.copy({ parent: clazz }));
185
+ clazz.members = (options.members ?? members).map((m) => m.copy({ parent: clazz }));
186
+ clazz.generics = [...generics];
187
+
188
+ return clazz;
189
+ }
190
+
191
+ static foreign(name: string, namespace: IntrospectedNamespace): IntrospectedRecord {
192
+ const foreignRecord = new IntrospectedRecord({ name, namespace });
193
+ foreignRecord._isForeign = true;
194
+ return foreignRecord;
195
+ }
196
+
197
+ static fromXML(
198
+ element: GirRecordElement | GirUnionElement,
199
+ namespace: IntrospectedNamespace,
200
+ options: OptionsLoad,
201
+ ): IntrospectedRecord {
202
+ if (!element.$.name) {
203
+ throw new Error("Invalid GIR File: No name provided for union.");
204
+ }
205
+
206
+ const name = sanitizeIdentifierName(namespace.namespace, element.$.name);
207
+
208
+ if (options.verbose) {
209
+ log.debug(` >> GirRecord: Parsing definition ${element.$.name} (${name})...`);
210
+ }
211
+
212
+ const clazz = new IntrospectedRecord({ name, namespace });
213
+
214
+ IntrospectedRecord.configureRecordProperties(element, clazz);
215
+ IntrospectedRecord.setupTypeStructOrResolveNames(element, clazz, namespace, name);
216
+ IntrospectedRecord.parseRecordDocumentation(element, clazz, options);
217
+ IntrospectedRecord.parseRecordMembers(element, clazz, options);
218
+
219
+ return clazz;
220
+ }
221
+
222
+ private static configureRecordProperties(
223
+ element: GirRecordElement | GirUnionElement,
224
+ clazz: IntrospectedRecord,
225
+ ): void {
226
+ const isPrivate = IntrospectedRecord.isRecordPrivate(element);
227
+ clazz.setPrivate(isPrivate);
228
+
229
+ const isForeign = "foreign" in element.$ && element.$.foreign === "1";
230
+ clazz._isForeign = isForeign;
231
+ }
232
+
233
+ private static isRecordPrivate(element: GirRecordElement | GirUnionElement): boolean {
234
+ if (!element.$.name) {
235
+ return false;
236
+ }
237
+
238
+ return (
239
+ element.$.name.startsWith("_") ||
240
+ ("disguised" in element.$ && element.$.disguised === "1") ||
241
+ ("opaque" in element.$ && element.$.opaque === "1")
242
+ );
243
+ }
244
+
245
+ private static setupTypeStructOrResolveNames(
246
+ element: GirRecordElement | GirUnionElement,
247
+ clazz: IntrospectedRecord,
248
+ namespace: IntrospectedNamespace,
249
+ name: string,
250
+ ): void {
251
+ const gtypeStructFor = "glib:is-gtype-struct-for" in element.$ ? element.$["glib:is-gtype-struct-for"] : undefined;
252
+
253
+ if (typeof gtypeStructFor === "string" && gtypeStructFor) {
254
+ const structFor = parseTypeIdentifier(namespace.namespace, gtypeStructFor);
255
+ clazz._structFor = new ClassStructTypeIdentifier(structFor.name, structFor.namespace);
256
+ } else {
257
+ IntrospectedRecord.registerResolveNames(element, clazz, namespace, name);
258
+ }
259
+ }
260
+
261
+ private static registerResolveNames(
262
+ element: GirRecordElement | GirUnionElement,
263
+ clazz: IntrospectedRecord,
264
+ namespace: IntrospectedNamespace,
265
+ name: string,
266
+ ): void {
267
+ if (element.$["glib:type-name"]) {
268
+ clazz.resolve_names.push(element.$["glib:type-name"]);
269
+ namespace.registerResolveName(element.$["glib:type-name"], namespace.namespace, name);
270
+ }
271
+
272
+ if (element.$["c:type"]) {
273
+ clazz.resolve_names.push(element.$["c:type"]);
274
+ namespace.registerResolveName(element.$["c:type"], namespace.namespace, name);
275
+ }
276
+ }
277
+
278
+ private static parseRecordDocumentation(
279
+ element: GirRecordElement | GirUnionElement,
280
+ clazz: IntrospectedRecord,
281
+ options: OptionsLoad,
282
+ ): void {
283
+ if (options.loadDocs) {
284
+ clazz.doc = parseDoc(element);
285
+ clazz.metadata = parseMetadata(element);
286
+ }
287
+ }
288
+
289
+ private static parseRecordMembers(
290
+ element: GirRecordElement | GirUnionElement,
291
+ clazz: IntrospectedRecord,
292
+ options: OptionsLoad,
293
+ ): void {
294
+ try {
295
+ IntrospectedRecord.parseRecordMethods(element, clazz, options);
296
+ IntrospectedRecord.parseRecordConstructors(element, clazz, options);
297
+ IntrospectedRecord.parseRecordStaticMethods(element, clazz, options);
298
+ IntrospectedRecord.parseRecordFields(element, clazz);
299
+ } catch (e) {
300
+ log.reportParsingFailure(clazz.name, "record", clazz.namespace.namespace, e as Error);
301
+ }
302
+ }
303
+
304
+ private static parseRecordMethods(
305
+ element: GirRecordElement | GirUnionElement,
306
+ clazz: IntrospectedRecord,
307
+ options: OptionsLoad,
308
+ ): void {
309
+ if (element.method) {
310
+ clazz.members.push(...element.method.map((method) => IntrospectedClassFunction.fromXML(method, clazz, options)));
311
+ }
312
+ }
313
+
314
+ private static parseRecordConstructors(
315
+ element: GirRecordElement | GirUnionElement,
316
+ clazz: IntrospectedRecord,
317
+ options: OptionsLoad,
318
+ ): void {
319
+ if (Array.isArray(element.constructor)) {
320
+ element.constructor.forEach((ctor) => {
321
+ const c = IntrospectedConstructor.fromXML(ctor, clazz, options);
322
+ clazz.constructors.push(c);
323
+ });
324
+ }
325
+ }
326
+
327
+ private static parseRecordStaticMethods(
328
+ element: GirRecordElement | GirUnionElement,
329
+ clazz: IntrospectedRecord,
330
+ options: OptionsLoad,
331
+ ): void {
332
+ if (element.function) {
333
+ clazz.members.push(
334
+ ...element.function.map((func) => IntrospectedStaticClassFunction.fromXML(func, clazz, options)),
335
+ );
336
+ }
337
+ }
338
+
339
+ private static parseRecordFields(element: GirRecordElement | GirUnionElement, clazz: IntrospectedRecord): void {
340
+ if (element.field) {
341
+ clazz.fields.push(
342
+ ...element.field
343
+ .filter((field) => !("callback" in field))
344
+ .map((field) => IntrospectedField.fromXML(field, clazz)),
345
+ );
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Calculate if a type expression is "simple" without pointers
351
+ */
352
+ isSimpleTypeWithoutPointers(typeContainer: TypeExpression): boolean {
353
+ if (!this.isSimpleType(typeContainer)) {
354
+ return false;
355
+ }
356
+
357
+ if (typeContainer.isPointer) {
358
+ return false;
359
+ }
360
+
361
+ // Primitive types can be directly allocated.
362
+ if (typeContainer instanceof NativeType) {
363
+ return true;
364
+ }
365
+
366
+ if (typeContainer instanceof ArrayType) {
367
+ if (typeContainer.type.equals(this.getType())) {
368
+ return true;
369
+ }
370
+
371
+ return this.isSimpleTypeWithoutPointers(typeContainer.type);
372
+ }
373
+
374
+ if (typeContainer instanceof TypeIdentifier) {
375
+ const type = typeContainer;
376
+
377
+ const child_ns = this.namespace.assertInstalledImport(type.namespace);
378
+
379
+ const alias = child_ns.getAlias(type.name);
380
+ if (alias) {
381
+ return this.isSimpleTypeWithoutPointers(alias.type);
382
+ }
383
+
384
+ const child = child_ns.getClass(type.name);
385
+ if (child === this) {
386
+ return false;
387
+ }
388
+
389
+ if (child instanceof IntrospectedRecord) {
390
+ return child.isSimpleWithoutPointers() !== null;
391
+ }
392
+ }
393
+
394
+ return false;
395
+ }
396
+
397
+ /**
398
+ * Calculate if a type expression is "simple"
399
+ */
400
+ isSimpleType(typeContainer: TypeExpression): boolean {
401
+ // Primitive types can be directly allocated.
402
+ if (typeContainer instanceof NativeType) {
403
+ return true;
404
+ }
405
+
406
+ if (typeContainer instanceof ArrayType) {
407
+ if (typeContainer.type.equals(this.getType())) {
408
+ return true;
409
+ }
410
+
411
+ return this.isSimpleType(typeContainer.type);
412
+ }
413
+
414
+ if (typeContainer instanceof TypeIdentifier) {
415
+ const type = typeContainer;
416
+
417
+ const child_ns = this.namespace.assertInstalledImport(type.namespace);
418
+
419
+ const alias = child_ns.getAlias(type.name);
420
+ if (alias) {
421
+ return this.isSimpleType(alias.type);
422
+ }
423
+
424
+ const child = child_ns.getClass(type.name);
425
+ if (child === this) {
426
+ return false;
427
+ }
428
+
429
+ if (child instanceof IntrospectedRecord) {
430
+ return child.isSimple();
431
+ }
432
+ }
433
+
434
+ return false;
435
+ }
436
+
437
+ /**
438
+ * Check if a record is "simple" and can be constructed by GJS
439
+ */
440
+ isSimple() {
441
+ // Records with no fields are not
442
+ // constructable.
443
+ if (this.fields.length === 0) {
444
+ return false;
445
+ }
446
+
447
+ // Because we may have to recursively check
448
+ // if types are instantiable we cache whether
449
+ // or not a given Record is simple.
450
+ if (this._isSimple !== null) {
451
+ return this._isSimple;
452
+ }
453
+
454
+ const isSimple = this.fields.every((f) => this.isSimpleType(f.type));
455
+
456
+ this._isSimple = isSimple;
457
+
458
+ return isSimple;
459
+ }
460
+
461
+ isSimpleWithoutPointers() {
462
+ // Records which are "simple without pointers" is a subset of
463
+ // "simple" records.
464
+ if (!this.isSimple()) {
465
+ return null;
466
+ }
467
+
468
+ // Because we may have to recursively check
469
+ // if types are instantiable we cache whether
470
+ // or not a given Record is simple.
471
+ if (this._isSimpleWithoutPointers !== null) {
472
+ return this._isSimpleWithoutPointers;
473
+ }
474
+
475
+ const isSimpleWithoutPointers = this.fields.find((f) => {
476
+ return !this.isSimpleTypeWithoutPointers(f.type);
477
+ });
478
+
479
+ if (!isSimpleWithoutPointers) this._isSimpleWithoutPointers = "all fields good";
480
+ else this._isSimpleWithoutPointers = null;
481
+
482
+ return this._isSimpleWithoutPointers;
483
+ }
484
+
485
+ asString<T extends FormatGenerator<unknown>>(generator: T): ReturnType<T["generateRecord"]> {
486
+ return generator.generateRecord(this) as ReturnType<T["generateRecord"]>;
487
+ }
488
+ }
@@ -0,0 +1,183 @@
1
+ import { DefaultFormatter } from "../formatters/default.ts";
2
+ import type { Formatter } from "../formatters/formatter.ts";
3
+ import { JSONFormatter } from "../formatters/json.ts";
4
+ import type { FormatGenerator } from "../generators/generator.ts";
5
+ import { generify } from "../generics/generify.ts";
6
+ import type { GirModule } from "../index.ts";
7
+ import { inject } from "../injections/inject.ts";
8
+ import type { GeneratorConstructor, OptionsGeneration, OptionsTransform } from "../types/index.ts";
9
+ import { TwoKeyMap } from "../util.ts";
10
+ import { ClassVisitor } from "../validators/class.ts";
11
+ import { FunctionParametersVisitor } from "../validators/function-parameters.ts";
12
+ import { InterfaceVisitor } from "../validators/interface.ts";
13
+ import type { GirVisitor } from "../visitor.ts";
14
+ import type { IntrospectedNamespace } from "./namespace.ts";
15
+
16
+ export class NSRegistry {
17
+ mapping: TwoKeyMap<string, string, IntrospectedNamespace> = new TwoKeyMap();
18
+ private formatters: Map<string, Formatter> = new Map();
19
+ private generators: Map<string, GeneratorConstructor<unknown>> = new Map();
20
+ c_mapping: Map<string, { version: string; name: string }[]> = new Map();
21
+ transformations: GirVisitor[] = [];
22
+ subtypes = new TwoKeyMap<string, string, TwoKeyMap<string, string, boolean>>();
23
+
24
+ constructor() {
25
+ this.formatters.set("json", new JSONFormatter());
26
+ }
27
+
28
+ registerTransformation(visitor: GirVisitor) {
29
+ this.transformations.push(visitor);
30
+
31
+ // Apply transformations to already built namespaces.
32
+ this.mapping.forEach((n) => {
33
+ n.accept(visitor);
34
+ });
35
+ }
36
+
37
+ registerFormatter(output: string, formatter: Formatter) {
38
+ this.formatters.set(output, formatter);
39
+ }
40
+
41
+ getFormatter(output: string) {
42
+ return this.formatters.get(output) ?? new DefaultFormatter();
43
+ }
44
+
45
+ registerGenerator<T>(
46
+ output: string,
47
+ generator: { new (namespace: IntrospectedNamespace, options: OptionsGeneration): FormatGenerator<T> },
48
+ ) {
49
+ this.generators.set(output, generator);
50
+ }
51
+
52
+ async getGenerator<T>(output: string): Promise<GeneratorConstructor<T> | undefined> {
53
+ // Handle loading external generators...
54
+ if (!this.generators.has(output)) {
55
+ let Generator: { default: GeneratorConstructor<unknown> };
56
+ try {
57
+ Generator = (await import(`@gi.ts/generator-${output}`)) as { default: GeneratorConstructor<unknown> };
58
+
59
+ if (Generator) {
60
+ console.log(`Loading generator "@gi.ts/generator-${output}"...`);
61
+ this.generators.set(output, Generator.default);
62
+ return Generator.default as GeneratorConstructor<T>;
63
+ }
64
+ } catch {
65
+ try {
66
+ Generator = (await import(`gi-ts-generator-${output}`)) as {
67
+ default: GeneratorConstructor<unknown>;
68
+ };
69
+
70
+ console.log(`Loading generator "gi-ts-generator-${output}"...`);
71
+ this.generators.set(output, Generator.default);
72
+ return Generator.default as GeneratorConstructor<T>;
73
+ } catch {
74
+ try {
75
+ Generator = (await import(`${output}`)) as { default: GeneratorConstructor<unknown> };
76
+
77
+ console.log(`Loading generator "${output}"...`);
78
+ this.generators.set(output, Generator.default);
79
+ return Generator.default as GeneratorConstructor<T>;
80
+ } catch {}
81
+ }
82
+ }
83
+ }
84
+
85
+ return this.generators.get(output) as GeneratorConstructor<T> | undefined;
86
+ }
87
+
88
+ private _transformNamespace(namespace: IntrospectedNamespace) {
89
+ this.transformations.forEach((t) => {
90
+ namespace.accept(t);
91
+ });
92
+ }
93
+
94
+ namespace(name: string, version: string): IntrospectedNamespace | null {
95
+ const namespace = this.mapping.get(name, version);
96
+
97
+ return namespace ?? null;
98
+ }
99
+
100
+ namespacesForPrefix(c_prefix: string): IntrospectedNamespace[] {
101
+ return (this.c_mapping.get(c_prefix) ?? []).map((c_mapping) =>
102
+ this.assertNamespace(c_mapping.name, c_mapping.version),
103
+ );
104
+ }
105
+
106
+ transform(options: OptionsTransform) {
107
+ const GLib = this.assertNamespace("GLib", "2.0");
108
+ const Gio = this.assertNamespace("Gio", "2.0");
109
+ const GObject = this.assertNamespace("GObject", "2.0");
110
+
111
+ // These follow the GLib version.
112
+ Gio.package_version = [...GLib.package_version];
113
+ GObject.package_version = [...GLib.package_version];
114
+
115
+ const interfaceVisitor = new InterfaceVisitor();
116
+ this.registerTransformation(interfaceVisitor);
117
+
118
+ const classVisitor = new ClassVisitor();
119
+ this.registerTransformation(classVisitor);
120
+
121
+ const enumParamsVisitor = new FunctionParametersVisitor();
122
+ this.registerTransformation(enumParamsVisitor);
123
+
124
+ console.log("Adding generics...");
125
+ generify(this, options.inferGenerics);
126
+
127
+ console.log("Injecting types...");
128
+ inject(this);
129
+ }
130
+
131
+ defaultVersionOf(name: string): string | null {
132
+ // GJS has a hard dependency on these versions.
133
+ if (name === "GLib" || name === "Gio" || name === "GObject") {
134
+ return "2.0";
135
+ }
136
+
137
+ const meta = this.mapping.getIfOnly(name);
138
+
139
+ if (meta) {
140
+ return meta[0];
141
+ }
142
+
143
+ return null;
144
+ }
145
+
146
+ assertDefaultVersionOf(name: string): string {
147
+ const version = this.defaultVersionOf(name);
148
+
149
+ if (version) {
150
+ return version;
151
+ }
152
+
153
+ // This mirrors GJS' and GI's default behavior.
154
+ // If we can't find a single version of an unspecified dependency, we throw an error.
155
+ throw new Error(`No single version found for unspecified dependency: ${JSON.stringify(name)}.`);
156
+ }
157
+
158
+ assertNamespace(name: string, version: string): IntrospectedNamespace {
159
+ const namespace = this.mapping.get(name, version) ?? null;
160
+
161
+ if (!namespace) {
162
+ throw new Error(`Namespace '${name}' not found.`);
163
+ }
164
+
165
+ return namespace;
166
+ }
167
+
168
+ register(namespace: GirModule): IntrospectedNamespace {
169
+ this.mapping.set(namespace.namespace, namespace.version, namespace);
170
+
171
+ namespace.c_prefixes.forEach((c_prefix) => {
172
+ const c_map = this.c_mapping.get(c_prefix) || [];
173
+
174
+ c_map.push({ name: namespace.namespace, version: namespace.version });
175
+
176
+ this.c_mapping.set(c_prefix, c_map);
177
+ });
178
+
179
+ this._transformNamespace(namespace);
180
+
181
+ return namespace;
182
+ }
183
+ }