@gtkx/codegen 1.0.0-rc.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/README.md +5 -5
  2. package/dist/analysis/descriptor-render.d.ts +13 -9
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +80 -50
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +16 -7
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +15 -3
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +4 -3
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +103 -58
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/interface-conflicts.d.ts +23 -0
  15. package/dist/analysis/interface-conflicts.d.ts.map +1 -0
  16. package/dist/analysis/interface-conflicts.js +144 -0
  17. package/dist/analysis/interface-conflicts.js.map +1 -0
  18. package/dist/analysis/nul-terminated-bytes.d.ts +5 -0
  19. package/dist/analysis/nul-terminated-bytes.d.ts.map +1 -0
  20. package/dist/analysis/nul-terminated-bytes.js +18 -0
  21. package/dist/analysis/nul-terminated-bytes.js.map +1 -0
  22. package/dist/analysis/param-capability.d.ts +5 -0
  23. package/dist/analysis/param-capability.d.ts.map +1 -0
  24. package/dist/analysis/param-capability.js +129 -0
  25. package/dist/analysis/param-capability.js.map +1 -0
  26. package/dist/analysis/param-structure.d.ts +11 -4
  27. package/dist/analysis/param-structure.d.ts.map +1 -1
  28. package/dist/analysis/param-structure.js +42 -16
  29. package/dist/analysis/param-structure.js.map +1 -1
  30. package/dist/analysis/ts-type.d.ts.map +1 -1
  31. package/dist/analysis/ts-type.js +10 -17
  32. package/dist/analysis/ts-type.js.map +1 -1
  33. package/dist/analysis/type-key.d.ts +5 -0
  34. package/dist/analysis/type-key.d.ts.map +1 -0
  35. package/dist/analysis/type-key.js +9 -0
  36. package/dist/analysis/type-key.js.map +1 -0
  37. package/dist/analysis/type-shape.d.ts +8 -0
  38. package/dist/analysis/type-shape.d.ts.map +1 -0
  39. package/dist/analysis/type-shape.js +12 -0
  40. package/dist/analysis/type-shape.js.map +1 -0
  41. package/dist/compile.d.ts +12 -3
  42. package/dist/compile.d.ts.map +1 -1
  43. package/dist/compile.js +73 -24
  44. package/dist/compile.js.map +1 -1
  45. package/dist/docs/api-reference.d.ts +2 -2
  46. package/dist/docs/api-reference.d.ts.map +1 -1
  47. package/dist/docs/api-reference.js +17 -23
  48. package/dist/docs/api-reference.js.map +1 -1
  49. package/dist/docs/element-page.d.ts +4 -4
  50. package/dist/docs/element-page.d.ts.map +1 -1
  51. package/dist/docs/element-page.js +36 -22
  52. package/dist/docs/element-page.js.map +1 -1
  53. package/dist/docs/handwritten-props.d.ts +9 -0
  54. package/dist/docs/handwritten-props.d.ts.map +1 -0
  55. package/dist/docs/handwritten-props.js +149 -0
  56. package/dist/docs/handwritten-props.js.map +1 -0
  57. package/dist/docs/pipeline.d.ts.map +1 -1
  58. package/dist/docs/pipeline.js +87 -20
  59. package/dist/docs/pipeline.js.map +1 -1
  60. package/dist/docs/render.d.ts +26 -5
  61. package/dist/docs/render.d.ts.map +1 -1
  62. package/dist/docs/render.js +88 -25
  63. package/dist/docs/render.js.map +1 -1
  64. package/dist/docs/symbol-page.d.ts +17 -0
  65. package/dist/docs/symbol-page.d.ts.map +1 -1
  66. package/dist/docs/symbol-page.js +132 -44
  67. package/dist/docs/symbol-page.js.map +1 -1
  68. package/dist/fingerprint.d.ts +12 -1
  69. package/dist/fingerprint.d.ts.map +1 -1
  70. package/dist/fingerprint.js +44 -28
  71. package/dist/fingerprint.js.map +1 -1
  72. package/dist/gi.d.ts.map +1 -1
  73. package/dist/gi.js +1 -0
  74. package/dist/gi.js.map +1 -1
  75. package/dist/gir/ancestry.d.ts +8 -2
  76. package/dist/gir/ancestry.d.ts.map +1 -1
  77. package/dist/gir/ancestry.js +19 -1
  78. package/dist/gir/ancestry.js.map +1 -1
  79. package/dist/gir/annotations.d.ts +21 -0
  80. package/dist/gir/annotations.d.ts.map +1 -0
  81. package/dist/gir/annotations.js +15 -0
  82. package/dist/gir/annotations.js.map +1 -0
  83. package/dist/gir/callback.d.ts +1 -0
  84. package/dist/gir/callback.d.ts.map +1 -1
  85. package/dist/gir/callback.js +1 -0
  86. package/dist/gir/callback.js.map +1 -1
  87. package/dist/gir/class.d.ts +32 -1
  88. package/dist/gir/class.d.ts.map +1 -1
  89. package/dist/gir/class.js +8 -3
  90. package/dist/gir/class.js.map +1 -1
  91. package/dist/gir/cursor-overrides.d.ts +8 -0
  92. package/dist/gir/cursor-overrides.d.ts.map +1 -0
  93. package/dist/gir/cursor-overrides.js +6 -0
  94. package/dist/gir/cursor-overrides.js.map +1 -0
  95. package/dist/gir/emittable.d.ts +7 -0
  96. package/dist/gir/emittable.d.ts.map +1 -0
  97. package/dist/gir/emittable.js +3 -0
  98. package/dist/gir/emittable.js.map +1 -0
  99. package/dist/gir/enum.d.ts +21 -1
  100. package/dist/gir/enum.d.ts.map +1 -1
  101. package/dist/gir/enum.js +9 -9
  102. package/dist/gir/enum.js.map +1 -1
  103. package/dist/gir/field.d.ts +19 -3
  104. package/dist/gir/field.d.ts.map +1 -1
  105. package/dist/gir/field.js +7 -8
  106. package/dist/gir/field.js.map +1 -1
  107. package/dist/gir/function.d.ts +15 -0
  108. package/dist/gir/function.d.ts.map +1 -1
  109. package/dist/gir/function.js +28 -2
  110. package/dist/gir/function.js.map +1 -1
  111. package/dist/gir/libraries.d.ts +1 -3
  112. package/dist/gir/libraries.d.ts.map +1 -1
  113. package/dist/gir/libraries.js +0 -1
  114. package/dist/gir/libraries.js.map +1 -1
  115. package/dist/gir/library.d.ts +36 -0
  116. package/dist/gir/library.d.ts.map +1 -1
  117. package/dist/gir/library.js +35 -1
  118. package/dist/gir/library.js.map +1 -1
  119. package/dist/gir/namespace.d.ts +43 -1
  120. package/dist/gir/namespace.d.ts.map +1 -1
  121. package/dist/gir/namespace.js +8 -7
  122. package/dist/gir/namespace.js.map +1 -1
  123. package/dist/gir/parameter.d.ts +52 -1
  124. package/dist/gir/parameter.d.ts.map +1 -1
  125. package/dist/gir/parameter.js +8 -3
  126. package/dist/gir/parameter.js.map +1 -1
  127. package/dist/gir/parse.d.ts +3 -1
  128. package/dist/gir/parse.d.ts.map +1 -1
  129. package/dist/gir/parse.js +9 -9
  130. package/dist/gir/parse.js.map +1 -1
  131. package/dist/gir/primitives.d.ts +1 -0
  132. package/dist/gir/primitives.d.ts.map +1 -1
  133. package/dist/gir/primitives.js.map +1 -1
  134. package/dist/gir/property.d.ts +16 -0
  135. package/dist/gir/property.d.ts.map +1 -1
  136. package/dist/gir/property.js +3 -3
  137. package/dist/gir/property.js.map +1 -1
  138. package/dist/gir/record.d.ts +22 -0
  139. package/dist/gir/record.d.ts.map +1 -1
  140. package/dist/gir/record.js +3 -2
  141. package/dist/gir/record.js.map +1 -1
  142. package/dist/gir/size.d.ts +5 -4
  143. package/dist/gir/size.d.ts.map +1 -1
  144. package/dist/gir/size.js.map +1 -1
  145. package/dist/gir/type-id.d.ts +35 -0
  146. package/dist/gir/type-id.d.ts.map +1 -1
  147. package/dist/gir/type-id.js +1 -0
  148. package/dist/gir/type-id.js.map +1 -1
  149. package/dist/gir/type-ref.d.ts.map +1 -1
  150. package/dist/gir/type-ref.js +1 -0
  151. package/dist/gir/type-ref.js.map +1 -1
  152. package/dist/gir/type.d.ts +20 -0
  153. package/dist/gir/type.d.ts.map +1 -1
  154. package/dist/gir/type.js.map +1 -1
  155. package/dist/guards.d.ts +16 -0
  156. package/dist/guards.d.ts.map +1 -0
  157. package/dist/guards.js +11 -0
  158. package/dist/guards.js.map +1 -0
  159. package/dist/internal.d.ts +2 -0
  160. package/dist/internal.d.ts.map +1 -1
  161. package/dist/internal.js +2 -0
  162. package/dist/internal.js.map +1 -1
  163. package/dist/json.d.ts +3 -0
  164. package/dist/json.d.ts.map +1 -0
  165. package/dist/json.js +11 -0
  166. package/dist/json.js.map +1 -0
  167. package/dist/khronos/args.d.ts +7 -6
  168. package/dist/khronos/args.d.ts.map +1 -1
  169. package/dist/khronos/args.js +28 -6
  170. package/dist/khronos/args.js.map +1 -1
  171. package/dist/khronos/doc-context.d.ts +29 -0
  172. package/dist/khronos/doc-context.d.ts.map +1 -0
  173. package/dist/khronos/doc-context.js +29 -0
  174. package/dist/khronos/doc-context.js.map +1 -0
  175. package/dist/khronos/extensions.d.ts +13 -0
  176. package/dist/khronos/extensions.d.ts.map +1 -0
  177. package/dist/khronos/extensions.js +49 -0
  178. package/dist/khronos/extensions.js.map +1 -0
  179. package/dist/khronos/jsdoc.d.ts +17 -11
  180. package/dist/khronos/jsdoc.d.ts.map +1 -1
  181. package/dist/khronos/jsdoc.js +104 -46
  182. package/dist/khronos/jsdoc.js.map +1 -1
  183. package/dist/khronos/model.d.ts +42 -3
  184. package/dist/khronos/model.d.ts.map +1 -1
  185. package/dist/khronos/model.js +218 -63
  186. package/dist/khronos/model.js.map +1 -1
  187. package/dist/khronos/modules.d.ts +9 -6
  188. package/dist/khronos/modules.d.ts.map +1 -1
  189. package/dist/khronos/modules.js +112 -27
  190. package/dist/khronos/modules.js.map +1 -1
  191. package/dist/khronos/notes.d.ts +19 -0
  192. package/dist/khronos/notes.d.ts.map +1 -0
  193. package/dist/khronos/notes.js +35 -0
  194. package/dist/khronos/notes.js.map +1 -0
  195. package/dist/khronos/param-pair.d.ts +1 -1
  196. package/dist/khronos/param-pair.d.ts.map +1 -1
  197. package/dist/khronos/param-pair.js.map +1 -1
  198. package/dist/khronos/parse.d.ts.map +1 -1
  199. package/dist/khronos/parse.js +3 -4
  200. package/dist/khronos/parse.js.map +1 -1
  201. package/dist/khronos/pipeline.d.ts +4 -2
  202. package/dist/khronos/pipeline.d.ts.map +1 -1
  203. package/dist/khronos/pipeline.js +58 -27
  204. package/dist/khronos/pipeline.js.map +1 -1
  205. package/dist/khronos/plan.d.ts +3 -9
  206. package/dist/khronos/plan.d.ts.map +1 -1
  207. package/dist/khronos/plan.js +3 -3
  208. package/dist/khronos/plan.js.map +1 -1
  209. package/dist/khronos/render.d.ts +8 -6
  210. package/dist/khronos/render.d.ts.map +1 -1
  211. package/dist/khronos/render.js +35 -26
  212. package/dist/khronos/render.js.map +1 -1
  213. package/dist/khronos/select.d.ts +21 -4
  214. package/dist/khronos/select.d.ts.map +1 -1
  215. package/dist/khronos/select.js +47 -34
  216. package/dist/khronos/select.js.map +1 -1
  217. package/dist/react/element-config.d.ts +2 -2
  218. package/dist/react/element-config.d.ts.map +1 -1
  219. package/dist/react/element-config.js.map +1 -1
  220. package/dist/runner.d.ts +6 -8
  221. package/dist/runner.d.ts.map +1 -1
  222. package/dist/runner.js +16 -0
  223. package/dist/runner.js.map +1 -1
  224. package/dist/staging.d.ts +5 -0
  225. package/dist/staging.d.ts.map +1 -0
  226. package/dist/staging.js +57 -0
  227. package/dist/staging.js.map +1 -0
  228. package/dist/store/compile-store.d.ts +1 -1
  229. package/dist/store/compile-store.d.ts.map +1 -1
  230. package/dist/store/compile-store.js +4 -2
  231. package/dist/store/compile-store.js.map +1 -1
  232. package/dist/store/gi/callable-doc.d.ts +11 -0
  233. package/dist/store/gi/callable-doc.d.ts.map +1 -0
  234. package/dist/store/gi/callable-doc.js +62 -0
  235. package/dist/store/gi/callable-doc.js.map +1 -0
  236. package/dist/store/gi/callables.d.ts +9 -2
  237. package/dist/store/gi/callables.d.ts.map +1 -1
  238. package/dist/store/gi/callables.js +35 -40
  239. package/dist/store/gi/callables.js.map +1 -1
  240. package/dist/store/gi/callback.d.ts.map +1 -1
  241. package/dist/store/gi/callback.js +10 -6
  242. package/dist/store/gi/callback.js.map +1 -1
  243. package/dist/store/gi/class.d.ts.map +1 -1
  244. package/dist/store/gi/class.js +63 -40
  245. package/dist/store/gi/class.js.map +1 -1
  246. package/dist/store/gi/closure-invocation.d.ts +4 -0
  247. package/dist/store/gi/closure-invocation.d.ts.map +1 -0
  248. package/dist/store/gi/closure-invocation.js +22 -0
  249. package/dist/store/gi/closure-invocation.js.map +1 -0
  250. package/dist/store/gi/companion.d.ts.map +1 -1
  251. package/dist/store/gi/companion.js +6 -6
  252. package/dist/store/gi/companion.js.map +1 -1
  253. package/dist/store/gi/constant.d.ts.map +1 -1
  254. package/dist/store/gi/constant.js +12 -3
  255. package/dist/store/gi/constant.js.map +1 -1
  256. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  257. package/dist/store/gi/constructor-props.js +18 -20
  258. package/dist/store/gi/constructor-props.js.map +1 -1
  259. package/dist/store/gi/doc-spec.d.ts +14 -0
  260. package/dist/store/gi/doc-spec.d.ts.map +1 -0
  261. package/dist/store/gi/doc-spec.js +23 -0
  262. package/dist/store/gi/doc-spec.js.map +1 -0
  263. package/dist/store/gi/enum.d.ts.map +1 -1
  264. package/dist/store/gi/enum.js +52 -19
  265. package/dist/store/gi/enum.js.map +1 -1
  266. package/dist/store/gi/function.d.ts +1 -3
  267. package/dist/store/gi/function.d.ts.map +1 -1
  268. package/dist/store/gi/function.js +50 -29
  269. package/dist/store/gi/function.js.map +1 -1
  270. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  271. package/dist/store/gi/gtype-binding.js +4 -1
  272. package/dist/store/gi/gtype-binding.js.map +1 -1
  273. package/dist/store/gi/interface.d.ts.map +1 -1
  274. package/dist/store/gi/interface.js +155 -26
  275. package/dist/store/gi/interface.js.map +1 -1
  276. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  277. package/dist/store/gi/item-comparators.js +3 -5
  278. package/dist/store/gi/item-comparators.js.map +1 -1
  279. package/dist/store/gi/method.d.ts +11 -2
  280. package/dist/store/gi/method.d.ts.map +1 -1
  281. package/dist/store/gi/method.js +80 -45
  282. package/dist/store/gi/method.js.map +1 -1
  283. package/dist/store/gi/param-marshal.d.ts +6 -2
  284. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  285. package/dist/store/gi/param-marshal.js +54 -5
  286. package/dist/store/gi/param-marshal.js.map +1 -1
  287. package/dist/store/gi/pipeline.d.ts.map +1 -1
  288. package/dist/store/gi/pipeline.js +23 -11
  289. package/dist/store/gi/pipeline.js.map +1 -1
  290. package/dist/store/gi/properties.d.ts +2 -1
  291. package/dist/store/gi/properties.d.ts.map +1 -1
  292. package/dist/store/gi/properties.js +7 -4
  293. package/dist/store/gi/properties.js.map +1 -1
  294. package/dist/store/gi/property-accessor.d.ts +12 -5
  295. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  296. package/dist/store/gi/property-accessor.js +98 -46
  297. package/dist/store/gi/property-accessor.js.map +1 -1
  298. package/dist/store/gi/record-constructor.d.ts +8 -1
  299. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  300. package/dist/store/gi/record-constructor.js +34 -11
  301. package/dist/store/gi/record-constructor.js.map +1 -1
  302. package/dist/store/gi/record-field-accessor.d.ts +3 -1
  303. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  304. package/dist/store/gi/record-field-accessor.js +8 -3
  305. package/dist/store/gi/record-field-accessor.js.map +1 -1
  306. package/dist/store/gi/record-layout.d.ts +6 -1
  307. package/dist/store/gi/record-layout.d.ts.map +1 -1
  308. package/dist/store/gi/record-layout.js +9 -2
  309. package/dist/store/gi/record-layout.js.map +1 -1
  310. package/dist/store/gi/record.d.ts.map +1 -1
  311. package/dist/store/gi/record.js +21 -9
  312. package/dist/store/gi/record.js.map +1 -1
  313. package/dist/store/gi/registration.d.ts +1 -1
  314. package/dist/store/gi/registration.js +4 -4
  315. package/dist/store/gi/registration.js.map +1 -1
  316. package/dist/store/gi/runtime-override.d.ts +2 -1
  317. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  318. package/dist/store/gi/runtime-override.js +8 -5
  319. package/dist/store/gi/runtime-override.js.map +1 -1
  320. package/dist/store/gi/signal.d.ts +2 -1
  321. package/dist/store/gi/signal.d.ts.map +1 -1
  322. package/dist/store/gi/signal.js +42 -37
  323. package/dist/store/gi/signal.js.map +1 -1
  324. package/dist/store/gi/value-marshalable.d.ts +1 -2
  325. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  326. package/dist/store/gi/value-marshalable.js +3 -2
  327. package/dist/store/gi/value-marshalable.js.map +1 -1
  328. package/dist/store/gi/vtable.d.ts +19 -1
  329. package/dist/store/gi/vtable.d.ts.map +1 -1
  330. package/dist/store/gi/vtable.js +257 -51
  331. package/dist/store/gi/vtable.js.map +1 -1
  332. package/dist/store/gi-store.d.ts +1 -0
  333. package/dist/store/gi-store.d.ts.map +1 -1
  334. package/dist/store/gi-store.js +15 -20
  335. package/dist/store/gi-store.js.map +1 -1
  336. package/dist/store/jsx/element-components.d.ts +1 -1
  337. package/dist/store/jsx/element-components.d.ts.map +1 -1
  338. package/dist/store/jsx/element-components.js +6 -4
  339. package/dist/store/jsx/element-components.js.map +1 -1
  340. package/dist/store/jsx/element-prop-imports.d.ts +1 -3
  341. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -1
  342. package/dist/store/jsx/element-prop-imports.js.map +1 -1
  343. package/dist/store/jsx/element-prop-types.d.ts +3 -0
  344. package/dist/store/jsx/element-prop-types.d.ts.map +1 -1
  345. package/dist/store/jsx/element-prop-types.js +7 -1
  346. package/dist/store/jsx/element-prop-types.js.map +1 -1
  347. package/dist/store/jsx/generated-elements.d.ts +2 -1
  348. package/dist/store/jsx/generated-elements.d.ts.map +1 -1
  349. package/dist/store/jsx/generated-elements.js +13 -7
  350. package/dist/store/jsx/generated-elements.js.map +1 -1
  351. package/dist/store/jsx/intrinsic-elements.d.ts +4 -0
  352. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -1
  353. package/dist/store/jsx/intrinsic-elements.js.map +1 -1
  354. package/dist/store/jsx/jsx.d.ts.map +1 -1
  355. package/dist/store/jsx/jsx.js +10 -9
  356. package/dist/store/jsx/jsx.js.map +1 -1
  357. package/dist/store/jsx/metadata.d.ts.map +1 -1
  358. package/dist/store/jsx/metadata.js +5 -3
  359. package/dist/store/jsx/metadata.js.map +1 -1
  360. package/dist/store/jsx/pipeline.d.ts +1 -1
  361. package/dist/store/jsx/pipeline.d.ts.map +1 -1
  362. package/dist/store/jsx/pipeline.js.map +1 -1
  363. package/dist/store/jsx/props.d.ts +1 -7
  364. package/dist/store/jsx/props.d.ts.map +1 -1
  365. package/dist/store/jsx/props.js +14 -6
  366. package/dist/store/jsx/props.js.map +1 -1
  367. package/dist/store/jsx-store.d.ts.map +1 -1
  368. package/dist/store/jsx-store.js +3 -3
  369. package/dist/store/jsx-store.js.map +1 -1
  370. package/dist/store/resolve-store.d.ts +14 -3
  371. package/dist/store/resolve-store.d.ts.map +1 -1
  372. package/dist/store/resolve-store.js +98 -15
  373. package/dist/store/resolve-store.js.map +1 -1
  374. package/dist/store/store-fs.d.ts +9 -6
  375. package/dist/store/store-fs.d.ts.map +1 -1
  376. package/dist/store/store-fs.js +59 -25
  377. package/dist/store/store-fs.js.map +1 -1
  378. package/dist/store/store-links.d.ts +3 -0
  379. package/dist/store/store-links.d.ts.map +1 -0
  380. package/dist/store/store-links.js +39 -0
  381. package/dist/store/store-links.js.map +1 -0
  382. package/dist/writer/comparison-context.d.ts +4 -0
  383. package/dist/writer/comparison-context.d.ts.map +1 -0
  384. package/dist/writer/comparison-context.js +13 -0
  385. package/dist/writer/comparison-context.js.map +1 -0
  386. package/dist/writer/context.d.ts +3 -2
  387. package/dist/writer/context.d.ts.map +1 -1
  388. package/dist/writer/context.js +11 -3
  389. package/dist/writer/context.js.map +1 -1
  390. package/dist/writer/doc-tags.d.ts +21 -0
  391. package/dist/writer/doc-tags.d.ts.map +1 -0
  392. package/dist/writer/doc-tags.js +38 -0
  393. package/dist/writer/doc-tags.js.map +1 -0
  394. package/dist/writer/doc.d.ts +3 -1
  395. package/dist/writer/doc.d.ts.map +1 -1
  396. package/dist/writer/doc.js +19 -6
  397. package/dist/writer/doc.js.map +1 -1
  398. package/dist/writer/gtk-doc.d.ts +1 -1
  399. package/dist/writer/gtk-doc.d.ts.map +1 -1
  400. package/dist/writer/gtk-doc.js +64 -15
  401. package/dist/writer/gtk-doc.js.map +1 -1
  402. package/dist/writer/module.d.ts +17 -3
  403. package/dist/writer/module.d.ts.map +1 -1
  404. package/dist/writer/module.js +72 -3
  405. package/dist/writer/module.js.map +1 -1
  406. package/dist/xml.d.ts +7 -1
  407. package/dist/xml.d.ts.map +1 -1
  408. package/dist/xml.js +43 -1
  409. package/dist/xml.js.map +1 -1
  410. package/overrides/gdk/rgba.ts.ejs +26 -0
  411. package/overrides/gobject/object.ts.ejs +48 -3
  412. package/overrides/gobject/value.ts.ejs +7 -0
  413. package/overrides/graphene/structs.ts.ejs +55 -0
  414. package/package.json +15 -4
  415. package/src/analysis/descriptor-render.ts +130 -66
  416. package/src/analysis/descriptor.ts +35 -11
  417. package/src/analysis/inheritance.ts +166 -75
  418. package/src/analysis/interface-conflicts.ts +237 -0
  419. package/src/analysis/nul-terminated-bytes.ts +31 -0
  420. package/src/analysis/param-capability.ts +169 -0
  421. package/src/analysis/param-structure.ts +85 -25
  422. package/src/analysis/ts-type.ts +13 -17
  423. package/src/analysis/type-key.ts +14 -0
  424. package/src/analysis/type-shape.ts +24 -0
  425. package/src/compile.ts +110 -26
  426. package/src/docs/api-reference.ts +46 -34
  427. package/src/docs/element-page.ts +58 -49
  428. package/src/docs/handwritten-props.ts +230 -0
  429. package/src/docs/pipeline.ts +131 -21
  430. package/src/docs/render.ts +153 -35
  431. package/src/docs/symbol-page.ts +230 -80
  432. package/src/fingerprint.ts +86 -32
  433. package/src/gi.ts +1 -0
  434. package/src/gir/ancestry.ts +31 -1
  435. package/src/gir/annotations.ts +37 -0
  436. package/src/gir/callback.ts +2 -0
  437. package/src/gir/class.ts +42 -4
  438. package/src/gir/cursor-overrides.ts +12 -0
  439. package/src/gir/emittable.ts +8 -0
  440. package/src/gir/enum.ts +30 -10
  441. package/src/gir/field.ts +24 -9
  442. package/src/gir/function.ts +60 -9
  443. package/src/gir/libraries.ts +11 -3
  444. package/src/gir/library.ts +52 -3
  445. package/src/gir/namespace.ts +49 -7
  446. package/src/gir/parameter.ts +62 -3
  447. package/src/gir/parse.ts +13 -9
  448. package/src/gir/primitives.ts +1 -0
  449. package/src/gir/property.ts +18 -3
  450. package/src/gir/record.ts +24 -2
  451. package/src/gir/size.ts +8 -3
  452. package/src/gir/type-id.ts +49 -3
  453. package/src/gir/type-ref.ts +1 -0
  454. package/src/gir/type.ts +50 -6
  455. package/src/guards.ts +23 -0
  456. package/src/internal.ts +2 -0
  457. package/src/json.ts +11 -0
  458. package/src/khronos/args.ts +36 -13
  459. package/src/khronos/doc-context.ts +62 -0
  460. package/src/khronos/extensions.ts +85 -0
  461. package/src/khronos/jsdoc.ts +152 -56
  462. package/src/khronos/model.ts +314 -69
  463. package/src/khronos/modules.ts +150 -40
  464. package/src/khronos/notes.ts +74 -0
  465. package/src/khronos/param-pair.ts +1 -1
  466. package/src/khronos/parse.ts +3 -4
  467. package/src/khronos/pipeline.ts +95 -42
  468. package/src/khronos/plan.ts +4 -6
  469. package/src/khronos/render.ts +62 -50
  470. package/src/khronos/select.ts +91 -50
  471. package/src/react/element-config.ts +2 -2
  472. package/src/runner.ts +20 -9
  473. package/src/staging.ts +69 -0
  474. package/src/store/compile-store.ts +7 -5
  475. package/src/store/gi/callable-doc.ts +102 -0
  476. package/src/store/gi/callables.ts +58 -44
  477. package/src/store/gi/callback.ts +10 -9
  478. package/src/store/gi/class.ts +83 -49
  479. package/src/store/gi/closure-invocation.ts +26 -0
  480. package/src/store/gi/companion.ts +7 -6
  481. package/src/store/gi/constant.ts +14 -5
  482. package/src/store/gi/constructor-props.ts +19 -23
  483. package/src/store/gi/doc-spec.ts +38 -0
  484. package/src/store/gi/enum.ts +75 -26
  485. package/src/store/gi/function.ts +72 -44
  486. package/src/store/gi/gtype-binding.ts +7 -2
  487. package/src/store/gi/interface.ts +244 -37
  488. package/src/store/gi/item-comparators.ts +3 -5
  489. package/src/store/gi/method.ts +124 -69
  490. package/src/store/gi/param-marshal.ts +91 -6
  491. package/src/store/gi/pipeline.ts +28 -13
  492. package/src/store/gi/properties.ts +10 -5
  493. package/src/store/gi/property-accessor.ts +163 -75
  494. package/src/store/gi/record-constructor.ts +56 -19
  495. package/src/store/gi/record-field-accessor.ts +13 -4
  496. package/src/store/gi/record-layout.ts +12 -2
  497. package/src/store/gi/record.ts +24 -10
  498. package/src/store/gi/registration.ts +5 -5
  499. package/src/store/gi/runtime-override.ts +13 -6
  500. package/src/store/gi/signal.ts +54 -57
  501. package/src/store/gi/value-marshalable.ts +4 -2
  502. package/src/store/gi/vtable.ts +439 -61
  503. package/src/store/gi-store.ts +26 -31
  504. package/src/store/jsx/element-components.ts +8 -5
  505. package/src/store/jsx/element-prop-imports.ts +1 -3
  506. package/src/store/jsx/element-prop-types.ts +10 -1
  507. package/src/store/jsx/generated-elements.ts +17 -8
  508. package/src/store/jsx/intrinsic-elements.ts +4 -0
  509. package/src/store/jsx/jsx.ts +11 -9
  510. package/src/store/jsx/metadata.ts +6 -3
  511. package/src/store/jsx/pipeline.ts +1 -1
  512. package/src/store/jsx/props.ts +20 -7
  513. package/src/store/jsx-store.ts +3 -3
  514. package/src/store/resolve-store.ts +133 -18
  515. package/src/store/store-fs.ts +87 -34
  516. package/src/store/store-links.ts +49 -0
  517. package/src/writer/comparison-context.ts +18 -0
  518. package/src/writer/context.ts +14 -4
  519. package/src/writer/doc-tags.ts +70 -0
  520. package/src/writer/doc.ts +29 -6
  521. package/src/writer/gtk-doc.ts +82 -15
  522. package/src/writer/module.ts +114 -4
  523. package/src/xml.ts +61 -1
@@ -1 +1 @@
1
- {"version":3,"file":"value-marshalable.d.ts","sourceRoot":"","sources":["../../../src/store/gi/value-marshalable.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAQ7D,QAAA,MAAM,mBAAmB,GAAI,QAAQ,SAAS,KAAG,OAEqE,CAAC;AAiEvH,QAAA,MAAM,kBAAkB,GAAI,SAAS,aAAa,EAAE,eAAe,MAAM,EAAE,QAAQ,SAAS,KAAG,OACb,CAAC;AAEnF,QAAA,MAAM,qBAAqB,GAAI,SAAS,aAAa,EAAE,eAAe,MAAM,EAAE,QAAQ,SAAS,KAAG,OACb,CAAC;AAEtF,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"value-marshalable.d.ts","sourceRoot":"","sources":["../../../src/store/gi/value-marshalable.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AA6E7D,QAAA,MAAM,kBAAkB,GAAI,SAAS,aAAa,EAAE,eAAe,MAAM,EAAE,QAAQ,SAAS,KAAG,OACb,CAAC;AAEnF,QAAA,MAAM,qBAAqB,GAAI,SAAS,aAAa,EAAE,eAAe,MAAM,EAAE,QAAQ,SAAS,KAAG,OACgB,CAAC;AAEnH,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAC"}
@@ -2,6 +2,7 @@ const POINTER_CATEGORIES = new Set(["string", "pointer"]);
2
2
  const recordKey = (namespaceName, record) => `${namespaceName}.${record.name}`;
3
3
  const hasOwnCopySemantics = (record) => record.glibGetType !== undefined ||
4
4
  ((record.glibRefFunc ?? record.copyFunc) !== undefined && (record.glibUnrefFunc ?? record.freeFunc) !== undefined);
5
+ const isOpaqueRecord = (record) => record.opaque || record.disguised;
5
6
  const isValueSafeArray = (scope, type) => type.fixedSize !== undefined && isValueSafeRef(scope, type.element, type.elementCType);
6
7
  const isValueSafeAlias = (scope, type) => isValueSafeRef(scope, type.value.target, type.value.targetCType);
7
8
  function isValueSafeType(scope, type) {
@@ -52,6 +53,6 @@ function isValueSafeRecord(scope, namespaceName, record) {
52
53
  return isSafe;
53
54
  }
54
55
  const isValueMarshalable = (context, namespaceName, record) => isValueSafeRecord({ context, seen: new Set() }, namespaceName, record);
55
- const isConstructibleRecord = (context, namespaceName, record) => hasOwnCopySemantics(record) || isValueMarshalable(context, namespaceName, record);
56
- export { hasOwnCopySemantics, isConstructibleRecord, isValueMarshalable };
56
+ const isConstructibleRecord = (context, namespaceName, record) => !isOpaqueRecord(record) && (hasOwnCopySemantics(record) || isValueMarshalable(context, namespaceName, record));
57
+ export { isConstructibleRecord, isValueMarshalable };
57
58
  //# sourceMappingURL=value-marshalable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"value-marshalable.js","sourceRoot":"","sources":["../../../src/store/gi/value-marshalable.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GirField } from \"../../gir/field.js\";\nimport type { PrimitiveCategory } from \"../../gir/primitives.js\";\nimport type { GirRecord } from \"../../gir/record.js\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { GirType } from \"../../gir/type.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\n\ntype Scope = { context: ModuleContext; seen: Set<string> };\n\nconst POINTER_CATEGORIES: Set<PrimitiveCategory> = new Set<PrimitiveCategory>([\"string\", \"pointer\"]);\n\nconst recordKey = (namespaceName: string, record: GirRecord): string => `${namespaceName}.${record.name}`;\n\nconst hasOwnCopySemantics = (record: GirRecord): boolean =>\n record.glibGetType !== undefined ||\n ((record.glibRefFunc ?? record.copyFunc) !== undefined && (record.glibUnrefFunc ?? record.freeFunc) !== undefined);\n\nconst isValueSafeArray = (scope: Scope, type: Extract<GirType, { kind: \"carray\" }>): boolean =>\n type.fixedSize !== undefined && isValueSafeRef(scope, type.element, type.elementCType);\n\nconst isValueSafeAlias = (scope: Scope, type: Extract<GirType, { kind: \"alias\" }>): boolean =>\n isValueSafeRef(scope, type.value.target, type.value.targetCType);\n\nfunction isValueSafeType(scope: Scope, type: GirType): boolean {\n switch (type.kind) {\n case \"primitive\": {\n return !POINTER_CATEGORIES.has(type.category);\n }\n case \"enum\": {\n return true;\n }\n case \"record\": {\n return isValueSafeRecord(scope, type.namespace.name, type.value);\n }\n case \"carray\": {\n return isValueSafeArray(scope, type);\n }\n case \"alias\": {\n return isValueSafeAlias(scope, type);\n }\n case \"callback\":\n case \"class\":\n case \"hashtable\":\n case \"interface\":\n case \"list\":\n case \"varargs\": {\n return false;\n }\n }\n}\n\nfunction isValueSafeRef(scope: Scope, ref: TypeId | undefined, cType: string | undefined): boolean {\n if (ref === undefined || cType?.endsWith(\"*\") === true) {\n return false;\n }\n\n const type = scope.context.library.typeFor(ref);\n\n return type === undefined ? false : isValueSafeType(scope, type);\n}\n\nconst isValueSafeField = (scope: Scope, field: GirField): boolean =>\n field.inlineMembers === undefined\n ? isValueSafeRef(scope, field.type, field.cType)\n : field.inlineMembers.every((member) => isValueSafeField(scope, member));\n\nfunction isValueSafeRecord(scope: Scope, namespaceName: string, record: GirRecord): boolean {\n const key = recordKey(namespaceName, record);\n\n if (scope.seen.has(key) || record.fields.length === 0) {\n return false;\n }\n\n scope.seen.add(key);\n const isSafe = record.fields.every((field) => isValueSafeField(scope, field));\n scope.seen.delete(key);\n\n return isSafe;\n}\n\nconst isValueMarshalable = (context: ModuleContext, namespaceName: string, record: GirRecord): boolean =>\n isValueSafeRecord({ context, seen: new Set<string>() }, namespaceName, record);\n\nconst isConstructibleRecord = (context: ModuleContext, namespaceName: string, record: GirRecord): boolean =>\n hasOwnCopySemantics(record) || isValueMarshalable(context, namespaceName, record);\n\nexport { hasOwnCopySemantics, isConstructibleRecord, isValueMarshalable };\n"]}
1
+ {"version":3,"file":"value-marshalable.js","sourceRoot":"","sources":["../../../src/store/gi/value-marshalable.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GirField } from \"../../gir/field.js\";\nimport type { PrimitiveCategory } from \"../../gir/primitives.js\";\nimport type { GirRecord } from \"../../gir/record.js\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { GirType } from \"../../gir/type.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\n\ntype Scope = { context: ModuleContext; seen: Set<string> };\n\nconst POINTER_CATEGORIES: Set<PrimitiveCategory> = new Set<PrimitiveCategory>([\"string\", \"pointer\"]);\n\nconst recordKey = (namespaceName: string, record: GirRecord): string => `${namespaceName}.${record.name}`;\n\nconst hasOwnCopySemantics = (record: GirRecord): boolean =>\n record.glibGetType !== undefined ||\n ((record.glibRefFunc ?? record.copyFunc) !== undefined && (record.glibUnrefFunc ?? record.freeFunc) !== undefined);\n\nconst isOpaqueRecord = (record: GirRecord): boolean => record.opaque || record.disguised;\n\nconst isValueSafeArray = (scope: Scope, type: Extract<GirType, { kind: \"carray\" }>): boolean =>\n type.fixedSize !== undefined && isValueSafeRef(scope, type.element, type.elementCType);\n\nconst isValueSafeAlias = (scope: Scope, type: Extract<GirType, { kind: \"alias\" }>): boolean =>\n isValueSafeRef(scope, type.value.target, type.value.targetCType);\n\nfunction isValueSafeType(scope: Scope, type: GirType): boolean {\n switch (type.kind) {\n case \"primitive\": {\n return !POINTER_CATEGORIES.has(type.category);\n }\n case \"enum\": {\n return true;\n }\n case \"record\": {\n return isValueSafeRecord(scope, type.namespace.name, type.value);\n }\n case \"carray\": {\n return isValueSafeArray(scope, type);\n }\n case \"alias\": {\n return isValueSafeAlias(scope, type);\n }\n case \"callback\":\n case \"class\":\n case \"hashtable\":\n case \"interface\":\n case \"list\":\n case \"varargs\": {\n return false;\n }\n }\n}\n\nfunction isValueSafeRef(scope: Scope, ref: TypeId | undefined, cType: string | undefined): boolean {\n if (ref === undefined || cType?.endsWith(\"*\") === true) {\n return false;\n }\n\n const type = scope.context.library.typeFor(ref);\n\n return type === undefined ? false : isValueSafeType(scope, type);\n}\n\nconst isValueSafeField = (scope: Scope, field: GirField): boolean =>\n field.inlineMembers === undefined\n ? isValueSafeRef(scope, field.type, field.cType)\n : field.inlineMembers.every((member) => isValueSafeField(scope, member));\n\nfunction isValueSafeRecord(scope: Scope, namespaceName: string, record: GirRecord): boolean {\n const key = recordKey(namespaceName, record);\n\n if (scope.seen.has(key) || record.fields.length === 0) {\n return false;\n }\n\n scope.seen.add(key);\n const isSafe = record.fields.every((field) => isValueSafeField(scope, field));\n scope.seen.delete(key);\n\n return isSafe;\n}\n\nconst isValueMarshalable = (context: ModuleContext, namespaceName: string, record: GirRecord): boolean =>\n isValueSafeRecord({ context, seen: new Set<string>() }, namespaceName, record);\n\nconst isConstructibleRecord = (context: ModuleContext, namespaceName: string, record: GirRecord): boolean =>\n !isOpaqueRecord(record) && (hasOwnCopySemantics(record) || isValueMarshalable(context, namespaceName, record));\n\nexport { isConstructibleRecord, isValueMarshalable };\n"]}
@@ -1,5 +1,23 @@
1
1
  import type { GirClass } from "../../gir/class.js";
2
+ import type { GirFunction } from "../../gir/function.js";
2
3
  import type { ModuleContext } from "../../writer/context.js";
4
+ type VfuncMemberMode = "implementation" | "requirement" | "signature";
5
+ type VfuncMembersOptions = {
6
+ context: ModuleContext;
7
+ klass: GirClass;
8
+ mode: VfuncMemberMode;
9
+ };
10
+ type VfuncEntry = {
11
+ name: string;
12
+ signature: string;
13
+ doc: string | undefined;
14
+ };
15
+ declare const vfuncMemberNames: (context: ModuleContext, namespaceName: string, klass: GirClass) => string[];
3
16
  declare const renderVfuncMetadata: (context: ModuleContext, klass: GirClass) => string | undefined;
4
- export { renderVfuncMetadata };
17
+ declare const vfuncCallables: (context: ModuleContext, namespaceName: string, klass: GirClass) => Map<string, GirFunction>;
18
+ declare const protectedChainSlotKeys: (context: ModuleContext, klass: GirClass) => Set<string>;
19
+ declare const hasCallableVfuncSlots: (context: ModuleContext, namespaceName: string, klass: GirClass) => boolean;
20
+ declare const vfuncEntries: (context: ModuleContext, namespaceName: string, klass: GirClass) => VfuncEntry[];
21
+ declare const renderVfuncMembers: (options: VfuncMembersOptions) => string[];
22
+ export { hasCallableVfuncSlots, protectedChainSlotKeys, renderVfuncMembers, vfuncCallables, renderVfuncMetadata, vfuncEntries, vfuncMemberNames, type VfuncMemberMode, };
5
23
  //# sourceMappingURL=vtable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vtable.d.ts","sourceRoot":"","sources":["../../../src/store/gi/vtable.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAsB7D,QAAA,MAAM,mBAAmB,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,KAAG,MAAM,GAAG,SAc/E,CAAC;AAqIF,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"vtable.d.ts","sourceRoot":"","sources":["../../../src/store/gi/vtable.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAoB,MAAM,oBAAoB,CAAC;AAErE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AA0B7D,KAAK,eAAe,GAAG,gBAAgB,GAAG,aAAa,GAAG,WAAW,CAAC;AAkBtE,KAAK,mBAAmB,GAAG;IACvB,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,eAAe,CAAC;CACzB,CAAC;AAOF,KAAK,UAAU,GAAG;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC;AA8MF,QAAA,MAAM,gBAAgB,GAAI,SAAS,aAAa,EAAE,eAAe,MAAM,EAAE,OAAO,QAAQ,KAAG,MAAM,EACZ,CAAC;AAEtF,QAAA,MAAM,mBAAmB,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,KAAG,MAAM,GAAG,SAU/E,CAAC;AAuDF,QAAA,MAAM,cAAc,GAAI,SAAS,aAAa,EAAE,eAAe,MAAM,EAAE,OAAO,QAAQ,KAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAS/G,CAAC;AAYF,QAAA,MAAM,sBAAsB,GAAI,SAAS,aAAa,EAAE,OAAO,QAAQ,KAAG,GAAG,CAAC,MAAM,CAQnF,CAAC;AAcF,QAAA,MAAM,qBAAqB,GAAI,SAAS,aAAa,EAAE,eAAe,MAAM,EAAE,OAAO,QAAQ,KAAG,OAChC,CAAC;AAsBjE,QAAA,MAAM,YAAY,GAAI,SAAS,aAAa,EAAE,eAAe,MAAM,EAAE,OAAO,QAAQ,KAAG,UAAU,EAK1F,CAAC;AAER,QAAA,MAAM,kBAAkB,GAAI,SAAS,mBAAmB,KAAG,MAAM,EAiBhE,CAAC;AAgHF,OAAO,EACH,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,KAAK,eAAe,GACvB,CAAC"}
@@ -1,19 +1,39 @@
1
- import { pascalCase, sourceStringLiteral, toCamelIdentifier } from "@gtkx/utils";
1
+ import { pascalCase, sanitizeTypeIdentifier, sourceStringLiteral } from "@gtkx/utils";
2
2
  import { isInlineCallbackRef, isScalarRef, renderDescriptor, renderParamDescriptor, } from "../../analysis/descriptor-render.js";
3
- import { renderBraced } from "../../writer/emit.js";
3
+ import { foldedLengthParameters, handlerParameters, parameterIdentifier, renamesWithInstance, renderHandlerParameters, renderHandlerResultType, } from "../../analysis/param-structure.js";
4
+ import { renderTsType } from "../../analysis/ts-type.js";
5
+ import { typeKey } from "../../analysis/type-key.js";
6
+ import { ancestorChain, resolveInterfaces } from "../../gir/ancestry.js";
7
+ import { callbackAsFunction } from "../../gir/callback.js";
8
+ import { renderJsDoc } from "../../writer/doc.js";
9
+ import { renderBlock, renderBraced } from "../../writer/emit.js";
10
+ import { handlerSpec, THROWS_TEXT } from "./doc-spec.js";
4
11
  import { computeRecordFieldSlots } from "./record-layout.js";
5
- const renderVfuncMetadata = (context, klass) => {
6
- if (klass.glibTypeStruct === undefined) {
7
- return undefined;
8
- }
9
- const structName = pascalCase(klass.glibTypeStruct);
10
- const kind = klass.isInterface ? "interface" : "class";
11
- const entries = vtableEntries(context, structName, kind, klass.glibTypeStruct);
12
- if (entries.length === 0) {
13
- return undefined;
14
- }
15
- return renderBraced(entries.join("\n"));
16
- };
12
+ const PADDING_FIELD_NAME = /^(?:reserved|padding)\d*$/i;
13
+ const UNCALLABLE_SLOT_KEYS = new Set([
14
+ "vfuncDispose",
15
+ "vfuncFinalize",
16
+ "vfuncGetProperty",
17
+ "vfuncSetProperty",
18
+ ]);
19
+ const VTABLE_CACHE = new WeakMap();
20
+ const PROTECTED_SLOT_NOTE = "It is `protected`, so only a subclass chaining up reaches it.";
21
+ const PUBLIC_SLOT_NOTE = "Calling it from anywhere else re-enters the slot on a live instance.";
22
+ const vfuncMemberName = (fieldName) => `vfunc${pascalCase(fieldName)}`;
23
+ const vfuncOverrideNote = (slot, isProtected) => [
24
+ `Invokes the \`${slot.field.name}\` vtable slot. Override it on a class passed to \`registerClass\``,
25
+ `and chain up with \`super.${slot.key}()\`.`,
26
+ isProtected ? PROTECTED_SLOT_NOTE : PUBLIC_SLOT_NOTE,
27
+ ].join("\n");
28
+ const vfuncRequirementNote = (slot, ownerRef) => [
29
+ `Fills the \`${slot.field.name}\` vtable slot. Declare it on a class passed to \`registerClass\``,
30
+ `with \`${ownerRef}\` in \`implements\`, which installs it in the interface vtable. Leaving it out`,
31
+ "keeps whatever the interface installs by default, the way it does for a C implementer.",
32
+ ].join("\n");
33
+ const vfuncMemberNote = (options) => options.mode === "requirement"
34
+ ? vfuncRequirementNote(options.slot, options.ownerRef)
35
+ : vfuncOverrideNote(options.slot, options.isProtected);
36
+ const isPaddingField = (field) => field.name.startsWith("_") || PADDING_FIELD_NAME.test(field.name);
17
37
  const vtableCallbackType = (context, field) => {
18
38
  if (field.type === undefined) {
19
39
  return undefined;
@@ -25,12 +45,15 @@ const vtableCallbackType = (context, field) => {
25
45
  return type.value;
26
46
  };
27
47
  const vtableSlotEntry = (context, field, claimedNames) => {
48
+ if (field.name === "constructor" || isPaddingField(field)) {
49
+ return undefined;
50
+ }
28
51
  const callback = vtableCallbackType(context, field);
29
52
  if (callback === undefined) {
30
53
  return undefined;
31
54
  }
32
- const key = toCamelIdentifier(field.name);
33
- if (key === "constructor" || claimedNames.has(key)) {
55
+ const key = vfuncMemberName(field.name);
56
+ if (claimedNames.has(key)) {
34
57
  return undefined;
35
58
  }
36
59
  if (!isVtableSlotEligible(context, callback)) {
@@ -38,42 +61,222 @@ const vtableSlotEntry = (context, field, claimedNames) => {
38
61
  }
39
62
  return { key, callback };
40
63
  };
41
- const vtableEntries = (context, structName, kind, typeStruct) => {
42
- const resolved = context.library.resolveType(context.namespace.name, typeStruct);
43
- if (resolved?.kind !== "record") {
44
- return [];
45
- }
46
- const { slots, size } = computeRecordFieldSlots(context, resolved.value.fields, resolved.value.isUnion);
64
+ const collectVtableSlots = (context, fields, isUnion) => {
65
+ const { slots, size } = computeRecordFieldSlots(context, fields, isUnion);
47
66
  const entries = [];
48
67
  const claimedNames = new Set();
49
68
  for (const { field, slot } of slots) {
50
69
  const entry = vtableSlotEntry(context, field, claimedNames);
51
- if (entry === undefined) {
52
- continue;
70
+ if (entry !== undefined) {
71
+ claimedNames.add(entry.key);
72
+ entries.push({ ...entry, field, vfunc: undefined, byteOffset: slot.byteOffset });
73
+ }
74
+ }
75
+ return { slots: entries, vtableSize: size };
76
+ };
77
+ const resolveVtableRecord = (context, namespaceName, klass) => {
78
+ const typeStruct = klass.glibTypeStruct;
79
+ const resolved = typeStruct === undefined ? undefined : context.library.resolveType(namespaceName, typeStruct);
80
+ if (typeStruct === undefined || resolved?.kind !== "record" || resolved.value.fields.length === 0) {
81
+ return undefined;
82
+ }
83
+ return { typeStruct, record: resolved.value };
84
+ };
85
+ const attachVirtualMethods = (slots, klass) => {
86
+ const byKey = new Map(klass.vfuncs.map((vfunc) => [vfuncMemberName(vfunc.name), vfunc]));
87
+ return slots.map((slot) => ({ ...slot, vfunc: byKey.get(slot.key) }));
88
+ };
89
+ const buildVtable = (context, namespaceName, klass) => {
90
+ const resolved = resolveVtableRecord(context, namespaceName, klass);
91
+ if (resolved === undefined) {
92
+ return undefined;
93
+ }
94
+ const { slots, vtableSize } = collectVtableSlots(context, resolved.record.fields, resolved.record.isUnion);
95
+ if (slots.length === 0) {
96
+ return undefined;
97
+ }
98
+ return {
99
+ structName: pascalCase(resolved.typeStruct),
100
+ kind: klass.isInterface ? "interface" : "class",
101
+ vtableSize,
102
+ slots: disambiguateSlots(context, namespaceName, klass, attachVirtualMethods(slots, klass)),
103
+ };
104
+ };
105
+ const collectVtable = (context, namespaceName, klass) => {
106
+ const cached = VTABLE_CACHE.get(klass);
107
+ if (cached !== undefined) {
108
+ return cached;
109
+ }
110
+ const vtable = buildVtable(context, namespaceName, klass);
111
+ if (vtable !== undefined) {
112
+ VTABLE_CACHE.set(klass, vtable);
113
+ }
114
+ return vtable;
115
+ };
116
+ const shadowedSlotKey = (klass, slot) => `vfunc${sanitizeTypeIdentifier(klass.name)}${pascalCase(slot.field.name)}`;
117
+ const slotSignatureKey = (library, slot) => {
118
+ const [, ...parameters] = slot.callback.parameters;
119
+ const parts = parameters.map((parameter) => `${typeKey(library, parameter.type)}/${parameter.direction}/${String(parameter.nullable)}`);
120
+ return `${parts.join(",")}->${typeKey(library, slot.callback.returnValue.type)}`;
121
+ };
122
+ const isShadowingSlot = (library, slot, inherited) => inherited.some((other) => other.key === slot.key &&
123
+ slotIdentity(other) !== slotIdentity(slot) &&
124
+ slotSignatureKey(library, other) !== slotSignatureKey(library, slot));
125
+ const disambiguateSlots = (context, namespaceName, klass, slots) => {
126
+ const inherited = ancestorSlots(context, namespaceName, klass);
127
+ return slots.map((slot) => isShadowingSlot(context.library, slot, inherited) ? { ...slot, key: shadowedSlotKey(klass, slot) } : slot);
128
+ };
129
+ const ancestorSlots = (context, namespaceName, klass) => {
130
+ const [, ...ancestors] = [...ancestorChain(context.library, klass, namespaceName)];
131
+ return ancestors.flatMap((ancestor) => collectVtable(context, ancestor.namespaceName, ancestor.klass)?.slots ?? []);
132
+ };
133
+ const vfuncMemberNames = (context, namespaceName, klass) => collectVtable(context, namespaceName, klass)?.slots.map((slot) => slot.key) ?? [];
134
+ const renderVfuncMetadata = (context, klass) => {
135
+ const vtable = collectVtable(context, context.namespace.name, klass);
136
+ if (vtable === undefined) {
137
+ return undefined;
138
+ }
139
+ const entries = vtable.slots.map((slot) => renderVtableSlotDescriptor(context, vtable, slot));
140
+ return renderBraced(entries.join("\n"));
141
+ };
142
+ const slotIdentity = (slot) => `${slot.key}:${String(slot.byteOffset)}`;
143
+ const inheritedSlotIdentities = (context, namespaceName, klass) => new Set(ancestorSlots(context, namespaceName, klass).map((slot) => slotIdentity(slot)));
144
+ const addInterfaceSlotKeys = (context, iface, keys, seen) => {
145
+ const identity = `${iface.namespaceName}.${iface.klass.name}`;
146
+ if (seen.has(identity)) {
147
+ return;
148
+ }
149
+ seen.add(identity);
150
+ for (const key of vfuncMemberNames(context, iface.namespaceName, iface.klass)) {
151
+ keys.add(key);
152
+ }
153
+ for (const ref of resolveInterfaces(context.library, iface.namespaceName, iface.klass.prerequisites)) {
154
+ addInterfaceSlotKeys(context, ref, keys, seen);
155
+ }
156
+ };
157
+ const implementedSlotKeys = (context, namespaceName, klass) => {
158
+ const keys = new Set();
159
+ const seen = new Set();
160
+ for (const ancestor of ancestorChain(context.library, klass, namespaceName)) {
161
+ for (const ref of resolveInterfaces(context.library, ancestor.namespaceName, ancestor.klass.implements)) {
162
+ addInterfaceSlotKeys(context, ref, keys, seen);
53
163
  }
54
- claimedNames.add(entry.key);
55
- entries.push(renderVtableSlotDescriptor(context, {
56
- key: entry.key,
57
- structName,
58
- kind,
59
- field,
60
- callback: entry.callback,
61
- byteOffset: slot.byteOffset,
62
- vtableSize: size,
63
- }));
64
- }
65
- return entries;
66
- };
67
- const isUnsupportedOutParam = (context, param) => (param.direction === "out" || param.direction === "inout") &&
68
- !param.callerAllocates &&
69
- !isScalarRef(context.library, param.type);
164
+ }
165
+ return keys;
166
+ };
167
+ const protectedSlotKeys = (options, slots) => {
168
+ const { context, klass } = options;
169
+ if (klass.isInterface) {
170
+ return new Set();
171
+ }
172
+ const shared = implementedSlotKeys(context, context.namespace.name, klass);
173
+ return new Set(slots.map((slot) => slot.key).filter((key) => !shared.has(key)));
174
+ };
175
+ const vfuncCallables = (context, namespaceName, klass) => {
176
+ const members = new Map();
177
+ for (const slot of callableVfuncSlots(context, namespaceName, klass)) {
178
+ const [, ...parameters] = slot.callback.parameters;
179
+ members.set(slot.key, { ...callbackAsFunction(slot.callback), parameters });
180
+ }
181
+ return members;
182
+ };
183
+ const addProtectedSlotKeys = (context, ancestor, keys) => {
184
+ const shared = implementedSlotKeys(context, ancestor.namespaceName, ancestor.klass);
185
+ for (const slot of callableVfuncSlots(context, ancestor.namespaceName, ancestor.klass)) {
186
+ if (!shared.has(slot.key)) {
187
+ keys.add(slot.key);
188
+ }
189
+ }
190
+ };
191
+ const protectedChainSlotKeys = (context, klass) => {
192
+ const keys = new Set();
193
+ for (const ancestor of ancestorChain(context.library, klass, context.namespace.name)) {
194
+ addProtectedSlotKeys(context, ancestor, keys);
195
+ }
196
+ return keys;
197
+ };
198
+ const callableVfuncSlots = (context, namespaceName, klass) => {
199
+ const vtable = collectVtable(context, namespaceName, klass);
200
+ if (vtable === undefined) {
201
+ return [];
202
+ }
203
+ const inherited = inheritedSlotIdentities(context, namespaceName, klass);
204
+ return vtable.slots.filter((slot) => isCallableSlot(context, slot) && !inherited.has(slotIdentity(slot)));
205
+ };
206
+ const hasCallableVfuncSlots = (context, namespaceName, klass) => callableVfuncSlots(context, namespaceName, klass).length > 0;
207
+ const slotDoc = (slot) => slot.vfunc?.doc ?? slot.field.doc ?? slot.callback.doc;
208
+ const slotDocParameters = (slot) => {
209
+ const [, ...parameters] = slot.callback.parameters;
210
+ const vfuncParameters = slot.vfunc?.parameters ?? [];
211
+ return parameters.map((parameter, index) => ({ ...parameter, doc: vfuncParameters[index]?.doc ?? parameter.doc }));
212
+ };
213
+ const slotDocSpec = (slot) => {
214
+ const parameters = slotDocParameters(slot);
215
+ const source = slot.vfunc ?? slot.callback;
216
+ return {
217
+ ...handlerSpec(source, parameters, renamesWithInstance(parameters, slot.callback.parameters[0])),
218
+ returns: slot.vfunc?.returnValue.doc ?? slot.callback.returnValue.doc,
219
+ throws: slot.callback.throws ? THROWS_TEXT : undefined,
220
+ };
221
+ };
222
+ const vfuncEntries = (context, namespaceName, klass) => callableVfuncSlots(context, namespaceName, klass).map((slot) => ({
223
+ name: slot.key,
224
+ signature: vfuncSlotSignature(context, slot).header,
225
+ doc: slotDoc(slot),
226
+ }));
227
+ const renderVfuncMembers = (options) => {
228
+ const { context, klass, mode } = options;
229
+ const ownerRef = sanitizeTypeIdentifier(klass.name);
230
+ const slots = callableVfuncSlots(context, context.namespace.name, klass);
231
+ if (slots.length === 0) {
232
+ return [];
233
+ }
234
+ if (mode === "implementation") {
235
+ context.addRuntimeImport("callVfunc");
236
+ }
237
+ const protectedKeys = protectedSlotKeys(options, slots);
238
+ return slots.map((slot) => renderVfuncMember({ context, ownerRef, slot, mode, isProtected: protectedKeys.has(slot.key) }));
239
+ };
240
+ const hasUnannotatedPointerParam = (context, slot) => {
241
+ const [, ...parameters] = slot.callback.parameters;
242
+ return parameters.some((parameter) => parameter.direction === "in" &&
243
+ parameter.cType?.endsWith("*") === true &&
244
+ isScalarRef(context.library, parameter.type));
245
+ };
246
+ const isCallableSlot = (context, slot) => !UNCALLABLE_SLOT_KEYS.has(slot.key) && !hasUnannotatedPointerParam(context, slot);
247
+ const vfuncSlotSignature = (context, slot, isOptional = false) => {
248
+ const [, ...parameters] = slot.callback.parameters;
249
+ const renderType = (ref, isNullable) => renderTsType(context, ref, isNullable);
250
+ const signature = renderHandlerParameters(parameters, renderType).join(", ");
251
+ const folded = foldedLengthParameters(context.library, slot.callback);
252
+ const returnType = renderHandlerResultType({
253
+ library: context.library,
254
+ signal: { ...slot.callback, parameters },
255
+ renderType,
256
+ shouldIncludeCallerAllocated: true,
257
+ isOptOut: false,
258
+ shouldExcludeOut: (parameter) => folded.has(parameter),
259
+ });
260
+ return { header: `${slot.key}${isOptional ? "?" : ""}(${signature}): ${returnType}`, returnType };
261
+ };
262
+ const renderVfuncMember = (options) => {
263
+ const { context, ownerRef, slot, mode, isProtected } = options;
264
+ const { header, returnType } = vfuncSlotSignature(context, slot, mode === "requirement");
265
+ const declaration = `${isProtected ? "protected " : ""}${header}`;
266
+ const doc = renderJsDoc(slotDoc(slot), vfuncMemberNote(options), slotDocSpec(slot));
267
+ if (mode !== "implementation") {
268
+ return `${doc}${declaration};`;
269
+ }
270
+ const [, ...parameters] = slot.callback.parameters;
271
+ const inputs = handlerParameters(parameters).map((parameter, index) => parameterIdentifier(parameter, index));
272
+ const call = `callVfunc(${ownerRef}, ${sourceStringLiteral(slot.key)}, this, [${inputs.join(", ")}])`;
273
+ const body = returnType === "void" ? `${call};` : `return ${call} as ${returnType};`;
274
+ return `${doc}${renderBlock(declaration, body)}`;
275
+ };
70
276
  const isEligibleVtableParam = (context, param) => {
71
277
  if (param.isVarargs) {
72
278
  return false;
73
279
  }
74
- if (isUnsupportedOutParam(context, param)) {
75
- return false;
76
- }
77
280
  return !isInlineCallbackRef(context.library, param.type);
78
281
  };
79
282
  const isVtableSlotEligible = (context, callback) => {
@@ -87,22 +290,25 @@ const isVtableSlotEligible = (context, callback) => {
87
290
  }
88
291
  return !isInlineCallbackRef(context.library, callback.returnValue.type);
89
292
  };
90
- const renderVtableSlotDescriptor = (context, options) => {
91
- const { key, structName, kind, field, callback, byteOffset, vtableSize } = options;
293
+ const renderVtableSlotDescriptor = (context, vtable, slot) => {
294
+ const { key, field, callback, byteOffset } = slot;
92
295
  const argDescriptors = callback.parameters
93
296
  .map((param) => renderParamDescriptor(context, param, param.type))
94
297
  .join(", ");
95
298
  const returnDescriptor = renderDescriptor(context, callback.returnValue.type, callback.returnValue.transferOwnership);
96
299
  const lines = [
97
- `kind: ${sourceStringLiteral(kind)} as const,`,
98
- `className: ${sourceStringLiteral(structName)},`,
300
+ `className: ${sourceStringLiteral(vtable.structName)},`,
99
301
  `vfuncName: ${sourceStringLiteral(field.name)},`,
100
302
  `byteOffset: ${String(byteOffset)},`,
101
- `vtableSize: ${String(vtableSize)},`,
102
- `argDescriptors: [${argDescriptors}],`,
103
- `returnDescriptor: ${returnDescriptor},`,
104
303
  ];
304
+ if (vtable.kind === "interface") {
305
+ lines.push(`vtableSize: ${String(vtable.vtableSize)},`);
306
+ }
307
+ lines.push(`argDescriptors: [${argDescriptors}],`, `returnDescriptor: ${returnDescriptor},`);
308
+ if (callback.throws) {
309
+ lines.push("canThrow: true,");
310
+ }
105
311
  return `${key}: ${renderBraced(lines.join("\n"))},`;
106
312
  };
107
- export { renderVfuncMetadata };
313
+ export { hasCallableVfuncSlots, protectedChainSlotKeys, renderVfuncMembers, vfuncCallables, renderVfuncMetadata, vfuncEntries, vfuncMemberNames, };
108
314
  //# sourceMappingURL=vtable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vtable.js","sourceRoot":"","sources":["../../../src/store/gi/vtable.ts"],"names":[],"mappings":"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","sourcesContent":["import { pascalCase, sourceStringLiteral, toCamelIdentifier } from \"@gtkx/utils\";\nimport type { GirCallback } from \"../../gir/callback.js\";\nimport type { GirClass } from \"../../gir/class.js\";\nimport type { GirField } from \"../../gir/field.js\";\nimport type { GirParameter } from \"../../gir/parameter.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport {\n isInlineCallbackRef,\n isScalarRef,\n renderDescriptor,\n renderParamDescriptor,\n} from \"../../analysis/descriptor-render.js\";\nimport { renderBraced } from \"../../writer/emit.js\";\nimport { computeRecordFieldSlots } from \"./record-layout.js\";\n\ntype VtableKind = \"class\" | \"interface\";\n\ntype RenderVtableSlotDescriptorOptions = {\n key: string;\n structName: string;\n kind: VtableKind;\n field: GirField;\n callback: GirCallback;\n byteOffset: number;\n vtableSize: number;\n};\n\nconst renderVfuncMetadata = (context: ModuleContext, klass: GirClass): string | undefined => {\n if (klass.glibTypeStruct === undefined) {\n return undefined;\n }\n\n const structName = pascalCase(klass.glibTypeStruct);\n const kind: VtableKind = klass.isInterface ? \"interface\" : \"class\";\n const entries = vtableEntries(context, structName, kind, klass.glibTypeStruct);\n\n if (entries.length === 0) {\n return undefined;\n }\n\n return renderBraced(entries.join(\"\\n\"));\n};\n\nconst vtableCallbackType = (context: ModuleContext, field: GirField): GirCallback | undefined => {\n if (field.type === undefined) {\n return undefined;\n }\n\n const type = context.library.typeFor(field.type);\n\n if (type?.kind !== \"callback\" || context.library.nameFor(field.type) !== undefined) {\n return undefined;\n }\n\n return type.value;\n};\n\nconst vtableSlotEntry = (\n context: ModuleContext,\n field: GirField,\n claimedNames: Set<string>,\n): { key: string; callback: GirCallback } | undefined => {\n const callback = vtableCallbackType(context, field);\n\n if (callback === undefined) {\n return undefined;\n }\n\n const key = toCamelIdentifier(field.name);\n\n if (key === \"constructor\" || claimedNames.has(key)) {\n return undefined;\n }\n\n if (!isVtableSlotEligible(context, callback)) {\n return undefined;\n }\n\n return { key, callback };\n};\n\nconst vtableEntries = (context: ModuleContext, structName: string, kind: VtableKind, typeStruct: string): string[] => {\n const resolved = context.library.resolveType(context.namespace.name, typeStruct);\n\n if (resolved?.kind !== \"record\") {\n return [];\n }\n\n const { slots, size } = computeRecordFieldSlots(context, resolved.value.fields, resolved.value.isUnion);\n const entries: string[] = [];\n const claimedNames: Set<string> = new Set();\n\n for (const { field, slot } of slots) {\n const entry = vtableSlotEntry(context, field, claimedNames);\n\n if (entry === undefined) {\n continue;\n }\n\n claimedNames.add(entry.key);\n\n entries.push(\n renderVtableSlotDescriptor(context, {\n key: entry.key,\n structName,\n kind,\n field,\n callback: entry.callback,\n byteOffset: slot.byteOffset,\n vtableSize: size,\n }),\n );\n }\n\n return entries;\n};\n\nconst isUnsupportedOutParam = (context: ModuleContext, param: GirParameter): boolean =>\n (param.direction === \"out\" || param.direction === \"inout\") &&\n !param.callerAllocates &&\n !isScalarRef(context.library, param.type);\n\nconst isEligibleVtableParam = (context: ModuleContext, param: GirParameter): boolean => {\n if (param.isVarargs) {\n return false;\n }\n\n if (isUnsupportedOutParam(context, param)) {\n return false;\n }\n\n return !isInlineCallbackRef(context.library, param.type);\n};\n\nconst isVtableSlotEligible = (context: ModuleContext, callback: GirCallback): boolean => {\n if (!callback.introspectable) {\n return false;\n }\n\n for (const param of callback.parameters) {\n if (!isEligibleVtableParam(context, param)) {\n return false;\n }\n }\n\n return !isInlineCallbackRef(context.library, callback.returnValue.type);\n};\n\nconst renderVtableSlotDescriptor = (context: ModuleContext, options: RenderVtableSlotDescriptorOptions): string => {\n const { key, structName, kind, field, callback, byteOffset, vtableSize } = options;\n\n const argDescriptors = callback.parameters\n .map((param) => renderParamDescriptor(context, param, param.type))\n .join(\", \");\n\n const returnDescriptor = renderDescriptor(\n context,\n callback.returnValue.type,\n callback.returnValue.transferOwnership,\n );\n\n const lines = [\n `kind: ${sourceStringLiteral(kind)} as const,`,\n `className: ${sourceStringLiteral(structName)},`,\n `vfuncName: ${sourceStringLiteral(field.name)},`,\n `byteOffset: ${String(byteOffset)},`,\n `vtableSize: ${String(vtableSize)},`,\n `argDescriptors: [${argDescriptors}],`,\n `returnDescriptor: ${returnDescriptor},`,\n ];\n\n return `${key}: ${renderBraced(lines.join(\"\\n\"))},`;\n};\n\nexport { renderVfuncMetadata };\n"]}
1
+ {"version":3,"file":"vtable.js","sourceRoot":"","sources":["../../../src/store/gi/vtable.ts"],"names":[],"mappings":"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","sourcesContent":["import { pascalCase, sanitizeTypeIdentifier, sourceStringLiteral } from \"@gtkx/utils\";\nimport type { GirClass, GirVirtualMethod } from \"../../gir/class.js\";\nimport type { GirField } from \"../../gir/field.js\";\nimport type { GirFunction } from \"../../gir/function.js\";\nimport type { Library } from \"../../gir/library.js\";\nimport type { GirParameter } from \"../../gir/parameter.js\";\nimport type { GirRecord } from \"../../gir/record.js\";\nimport type { TypeId } from \"../../gir/type-id.js\";\nimport type { ModuleContext } from \"../../writer/context.js\";\nimport type { JsDocSpec } from \"../../writer/doc.js\";\nimport {\n isInlineCallbackRef,\n isScalarRef,\n renderDescriptor,\n renderParamDescriptor,\n} from \"../../analysis/descriptor-render.js\";\nimport {\n foldedLengthParameters,\n handlerParameters,\n parameterIdentifier,\n renamesWithInstance,\n renderHandlerParameters,\n renderHandlerResultType,\n} from \"../../analysis/param-structure.js\";\nimport { renderTsType } from \"../../analysis/ts-type.js\";\nimport { typeKey } from \"../../analysis/type-key.js\";\nimport { ancestorChain, type ResolvedAncestor, resolveInterfaces } from \"../../gir/ancestry.js\";\nimport { callbackAsFunction, type GirCallback } from \"../../gir/callback.js\";\nimport { renderJsDoc } from \"../../writer/doc.js\";\nimport { renderBlock, renderBraced } from \"../../writer/emit.js\";\nimport { handlerSpec, THROWS_TEXT } from \"./doc-spec.js\";\nimport { computeRecordFieldSlots } from \"./record-layout.js\";\n\ntype VtableKind = \"class\" | \"interface\";\ntype VfuncMemberMode = \"implementation\" | \"requirement\" | \"signature\";\n\ntype VtableSlot = {\n key: string;\n field: GirField;\n callback: GirCallback;\n vfunc: GirVirtualMethod | undefined;\n byteOffset: number;\n};\n\ntype VfuncMemberOptions = {\n context: ModuleContext;\n ownerRef: string;\n slot: VtableSlot;\n mode: VfuncMemberMode;\n isProtected: boolean;\n};\n\ntype VfuncMembersOptions = {\n context: ModuleContext;\n klass: GirClass;\n mode: VfuncMemberMode;\n};\n\ntype VfuncSignature = {\n header: string;\n returnType: string;\n};\n\ntype VfuncEntry = {\n name: string;\n signature: string;\n doc: string | undefined;\n};\n\ntype Vtable = {\n structName: string;\n kind: VtableKind;\n vtableSize: number;\n slots: VtableSlot[];\n};\n\nconst PADDING_FIELD_NAME = /^(?:reserved|padding)\\d*$/i;\n\nconst UNCALLABLE_SLOT_KEYS: Set<string> = new Set([\n \"vfuncDispose\",\n \"vfuncFinalize\",\n \"vfuncGetProperty\",\n \"vfuncSetProperty\",\n]);\n\nconst VTABLE_CACHE: WeakMap<GirClass, Vtable> = new WeakMap();\nconst PROTECTED_SLOT_NOTE = \"It is `protected`, so only a subclass chaining up reaches it.\";\nconst PUBLIC_SLOT_NOTE = \"Calling it from anywhere else re-enters the slot on a live instance.\";\n\nconst vfuncMemberName = (fieldName: string): string => `vfunc${pascalCase(fieldName)}`;\n\nconst vfuncOverrideNote = (slot: VtableSlot, isProtected: boolean): string =>\n [\n `Invokes the \\`${slot.field.name}\\` vtable slot. Override it on a class passed to \\`registerClass\\``,\n `and chain up with \\`super.${slot.key}()\\`.`,\n isProtected ? PROTECTED_SLOT_NOTE : PUBLIC_SLOT_NOTE,\n ].join(\"\\n\");\n\nconst vfuncRequirementNote = (slot: VtableSlot, ownerRef: string): string =>\n [\n `Fills the \\`${slot.field.name}\\` vtable slot. Declare it on a class passed to \\`registerClass\\``,\n `with \\`${ownerRef}\\` in \\`implements\\`, which installs it in the interface vtable. Leaving it out`,\n \"keeps whatever the interface installs by default, the way it does for a C implementer.\",\n ].join(\"\\n\");\n\nconst vfuncMemberNote = (options: VfuncMemberOptions): string =>\n options.mode === \"requirement\"\n ? vfuncRequirementNote(options.slot, options.ownerRef)\n : vfuncOverrideNote(options.slot, options.isProtected);\n\nconst isPaddingField = (field: GirField): boolean =>\n field.name.startsWith(\"_\") || PADDING_FIELD_NAME.test(field.name);\n\nconst vtableCallbackType = (context: ModuleContext, field: GirField): GirCallback | undefined => {\n if (field.type === undefined) {\n return undefined;\n }\n\n const type = context.library.typeFor(field.type);\n\n if (type?.kind !== \"callback\" || context.library.nameFor(field.type) !== undefined) {\n return undefined;\n }\n\n return type.value;\n};\n\nconst vtableSlotEntry = (\n context: ModuleContext,\n field: GirField,\n claimedNames: Set<string>,\n): { key: string; callback: GirCallback } | undefined => {\n if (field.name === \"constructor\" || isPaddingField(field)) {\n return undefined;\n }\n\n const callback = vtableCallbackType(context, field);\n\n if (callback === undefined) {\n return undefined;\n }\n\n const key = vfuncMemberName(field.name);\n\n if (claimedNames.has(key)) {\n return undefined;\n }\n\n if (!isVtableSlotEligible(context, callback)) {\n return undefined;\n }\n\n return { key, callback };\n};\n\nconst collectVtableSlots = (\n context: ModuleContext,\n fields: GirField[],\n isUnion: boolean,\n): { slots: VtableSlot[]; vtableSize: number } => {\n const { slots, size } = computeRecordFieldSlots(context, fields, isUnion);\n const entries: VtableSlot[] = [];\n const claimedNames: Set<string> = new Set();\n\n for (const { field, slot } of slots) {\n const entry = vtableSlotEntry(context, field, claimedNames);\n\n if (entry !== undefined) {\n claimedNames.add(entry.key);\n entries.push({ ...entry, field, vfunc: undefined, byteOffset: slot.byteOffset });\n }\n }\n\n return { slots: entries, vtableSize: size };\n};\n\nconst resolveVtableRecord = (\n context: ModuleContext,\n namespaceName: string,\n klass: GirClass,\n): { typeStruct: string; record: GirRecord } | undefined => {\n const typeStruct = klass.glibTypeStruct;\n const resolved = typeStruct === undefined ? undefined : context.library.resolveType(namespaceName, typeStruct);\n\n if (typeStruct === undefined || resolved?.kind !== \"record\" || resolved.value.fields.length === 0) {\n return undefined;\n }\n\n return { typeStruct, record: resolved.value };\n};\n\nconst attachVirtualMethods = (slots: VtableSlot[], klass: GirClass): VtableSlot[] => {\n const byKey: Map<string, GirVirtualMethod> = new Map(\n klass.vfuncs.map((vfunc) => [vfuncMemberName(vfunc.name), vfunc]),\n );\n\n return slots.map((slot) => ({ ...slot, vfunc: byKey.get(slot.key) }));\n};\n\nconst buildVtable = (context: ModuleContext, namespaceName: string, klass: GirClass): Vtable | undefined => {\n const resolved = resolveVtableRecord(context, namespaceName, klass);\n\n if (resolved === undefined) {\n return undefined;\n }\n\n const { slots, vtableSize } = collectVtableSlots(context, resolved.record.fields, resolved.record.isUnion);\n\n if (slots.length === 0) {\n return undefined;\n }\n\n return {\n structName: pascalCase(resolved.typeStruct),\n kind: klass.isInterface ? \"interface\" : \"class\",\n vtableSize,\n slots: disambiguateSlots(context, namespaceName, klass, attachVirtualMethods(slots, klass)),\n };\n};\n\nconst collectVtable = (context: ModuleContext, namespaceName: string, klass: GirClass): Vtable | undefined => {\n const cached = VTABLE_CACHE.get(klass);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const vtable = buildVtable(context, namespaceName, klass);\n\n if (vtable !== undefined) {\n VTABLE_CACHE.set(klass, vtable);\n }\n\n return vtable;\n};\n\nconst shadowedSlotKey = (klass: GirClass, slot: VtableSlot): string =>\n `vfunc${sanitizeTypeIdentifier(klass.name)}${pascalCase(slot.field.name)}`;\n\nconst slotSignatureKey = (library: Library, slot: VtableSlot): string => {\n const [, ...parameters] = slot.callback.parameters;\n\n const parts = parameters.map(\n (parameter) => `${typeKey(library, parameter.type)}/${parameter.direction}/${String(parameter.nullable)}`);\n\n return `${parts.join(\",\")}->${typeKey(library, slot.callback.returnValue.type)}`;\n};\n\nconst isShadowingSlot = (library: Library, slot: VtableSlot, inherited: VtableSlot[]): boolean =>\n inherited.some(\n (other) =>\n other.key === slot.key &&\n slotIdentity(other) !== slotIdentity(slot) &&\n slotSignatureKey(library, other) !== slotSignatureKey(library, slot));\n\nconst disambiguateSlots = (\n context: ModuleContext,\n namespaceName: string,\n klass: GirClass,\n slots: VtableSlot[],\n): VtableSlot[] => {\n const inherited = ancestorSlots(context, namespaceName, klass);\n\n return slots.map((slot) =>\n isShadowingSlot(context.library, slot, inherited) ? { ...slot, key: shadowedSlotKey(klass, slot) } : slot);\n};\n\nconst ancestorSlots = (context: ModuleContext, namespaceName: string, klass: GirClass): VtableSlot[] => {\n const [, ...ancestors] = [...ancestorChain(context.library, klass, namespaceName)];\n\n return ancestors.flatMap((ancestor) => collectVtable(context, ancestor.namespaceName, ancestor.klass)?.slots ?? []);\n};\n\nconst vfuncMemberNames = (context: ModuleContext, namespaceName: string, klass: GirClass): string[] =>\n collectVtable(context, namespaceName, klass)?.slots.map((slot) => slot.key) ?? [];\n\nconst renderVfuncMetadata = (context: ModuleContext, klass: GirClass): string | undefined => {\n const vtable = collectVtable(context, context.namespace.name, klass);\n\n if (vtable === undefined) {\n return undefined;\n }\n\n const entries = vtable.slots.map((slot) => renderVtableSlotDescriptor(context, vtable, slot));\n\n return renderBraced(entries.join(\"\\n\"));\n};\n\nconst slotIdentity = (slot: VtableSlot): string => `${slot.key}:${String(slot.byteOffset)}`;\n\nconst inheritedSlotIdentities = (context: ModuleContext, namespaceName: string, klass: GirClass): Set<string> =>\n new Set(ancestorSlots(context, namespaceName, klass).map((slot) => slotIdentity(slot)));\n\nconst addInterfaceSlotKeys = (\n context: ModuleContext,\n iface: ResolvedAncestor,\n keys: Set<string>,\n seen: Set<string>,\n): void => {\n const identity = `${iface.namespaceName}.${iface.klass.name}`;\n\n if (seen.has(identity)) {\n return;\n }\n\n seen.add(identity);\n\n for (const key of vfuncMemberNames(context, iface.namespaceName, iface.klass)) {\n keys.add(key);\n }\n\n for (const ref of resolveInterfaces(context.library, iface.namespaceName, iface.klass.prerequisites)) {\n addInterfaceSlotKeys(context, ref, keys, seen);\n }\n};\n\nconst implementedSlotKeys = (context: ModuleContext, namespaceName: string, klass: GirClass): Set<string> => {\n const keys: Set<string> = new Set();\n const seen: Set<string> = new Set();\n\n for (const ancestor of ancestorChain(context.library, klass, namespaceName)) {\n for (const ref of resolveInterfaces(context.library, ancestor.namespaceName, ancestor.klass.implements)) {\n addInterfaceSlotKeys(context, ref, keys, seen);\n }\n }\n\n return keys;\n};\n\nconst protectedSlotKeys = (options: VfuncMembersOptions, slots: VtableSlot[]): Set<string> => {\n const { context, klass } = options;\n\n if (klass.isInterface) {\n return new Set();\n }\n\n const shared = implementedSlotKeys(context, context.namespace.name, klass);\n\n return new Set(slots.map((slot) => slot.key).filter((key) => !shared.has(key)));\n};\n\nconst vfuncCallables = (context: ModuleContext, namespaceName: string, klass: GirClass): Map<string, GirFunction> => {\n const members: Map<string, GirFunction> = new Map();\n\n for (const slot of callableVfuncSlots(context, namespaceName, klass)) {\n const [, ...parameters] = slot.callback.parameters;\n members.set(slot.key, { ...callbackAsFunction(slot.callback), parameters });\n }\n\n return members;\n};\n\nconst addProtectedSlotKeys = (context: ModuleContext, ancestor: ResolvedAncestor, keys: Set<string>): void => {\n const shared = implementedSlotKeys(context, ancestor.namespaceName, ancestor.klass);\n\n for (const slot of callableVfuncSlots(context, ancestor.namespaceName, ancestor.klass)) {\n if (!shared.has(slot.key)) {\n keys.add(slot.key);\n }\n }\n};\n\nconst protectedChainSlotKeys = (context: ModuleContext, klass: GirClass): Set<string> => {\n const keys: Set<string> = new Set();\n\n for (const ancestor of ancestorChain(context.library, klass, context.namespace.name)) {\n addProtectedSlotKeys(context, ancestor, keys);\n }\n\n return keys;\n};\n\nconst callableVfuncSlots = (context: ModuleContext, namespaceName: string, klass: GirClass): VtableSlot[] => {\n const vtable = collectVtable(context, namespaceName, klass);\n\n if (vtable === undefined) {\n return [];\n }\n\n const inherited = inheritedSlotIdentities(context, namespaceName, klass);\n\n return vtable.slots.filter((slot) => isCallableSlot(context, slot) && !inherited.has(slotIdentity(slot)));\n};\n\nconst hasCallableVfuncSlots = (context: ModuleContext, namespaceName: string, klass: GirClass): boolean =>\n callableVfuncSlots(context, namespaceName, klass).length > 0;\n\nconst slotDoc = (slot: VtableSlot): string | undefined => slot.vfunc?.doc ?? slot.field.doc ?? slot.callback.doc;\n\nconst slotDocParameters = (slot: VtableSlot): GirParameter[] => {\n const [, ...parameters] = slot.callback.parameters;\n const vfuncParameters = slot.vfunc?.parameters ?? [];\n\n return parameters.map((parameter, index) => ({ ...parameter, doc: vfuncParameters[index]?.doc ?? parameter.doc }));\n};\n\nconst slotDocSpec = (slot: VtableSlot): JsDocSpec => {\n const parameters = slotDocParameters(slot);\n const source = slot.vfunc ?? slot.callback;\n\n return {\n ...handlerSpec(source, parameters, renamesWithInstance(parameters, slot.callback.parameters[0])),\n returns: slot.vfunc?.returnValue.doc ?? slot.callback.returnValue.doc,\n throws: slot.callback.throws ? THROWS_TEXT : undefined,\n };\n};\n\nconst vfuncEntries = (context: ModuleContext, namespaceName: string, klass: GirClass): VfuncEntry[] =>\n callableVfuncSlots(context, namespaceName, klass).map((slot) => ({\n name: slot.key,\n signature: vfuncSlotSignature(context, slot).header,\n doc: slotDoc(slot),\n }));\n\nconst renderVfuncMembers = (options: VfuncMembersOptions): string[] => {\n const { context, klass, mode } = options;\n const ownerRef = sanitizeTypeIdentifier(klass.name);\n const slots = callableVfuncSlots(context, context.namespace.name, klass);\n\n if (slots.length === 0) {\n return [];\n }\n\n if (mode === \"implementation\") {\n context.addRuntimeImport(\"callVfunc\");\n }\n\n const protectedKeys = protectedSlotKeys(options, slots);\n\n return slots.map((slot) =>\n renderVfuncMember({ context, ownerRef, slot, mode, isProtected: protectedKeys.has(slot.key) }));\n};\n\nconst hasUnannotatedPointerParam = (context: ModuleContext, slot: VtableSlot): boolean => {\n const [, ...parameters] = slot.callback.parameters;\n\n return parameters.some(\n (parameter) =>\n parameter.direction === \"in\" &&\n parameter.cType?.endsWith(\"*\") === true &&\n isScalarRef(context.library, parameter.type),\n );\n};\n\nconst isCallableSlot = (context: ModuleContext, slot: VtableSlot): boolean =>\n !UNCALLABLE_SLOT_KEYS.has(slot.key) && !hasUnannotatedPointerParam(context, slot);\n\nconst vfuncSlotSignature = (context: ModuleContext, slot: VtableSlot, isOptional = false): VfuncSignature => {\n const [, ...parameters] = slot.callback.parameters;\n\n const renderType = (ref: TypeId | undefined, isNullable: boolean): string =>\n renderTsType(context, ref, isNullable);\n\n const signature = renderHandlerParameters(parameters, renderType).join(\", \");\n const folded = foldedLengthParameters(context.library, slot.callback);\n\n const returnType = renderHandlerResultType({\n library: context.library,\n signal: { ...slot.callback, parameters },\n renderType,\n shouldIncludeCallerAllocated: true,\n isOptOut: false,\n shouldExcludeOut: (parameter) => folded.has(parameter),\n });\n\n return { header: `${slot.key}${isOptional ? \"?\" : \"\"}(${signature}): ${returnType}`, returnType };\n};\n\nconst renderVfuncMember = (options: VfuncMemberOptions): string => {\n const { context, ownerRef, slot, mode, isProtected } = options;\n const { header, returnType } = vfuncSlotSignature(context, slot, mode === \"requirement\");\n const declaration = `${isProtected ? \"protected \" : \"\"}${header}`;\n const doc = renderJsDoc(slotDoc(slot), vfuncMemberNote(options), slotDocSpec(slot));\n\n if (mode !== \"implementation\") {\n return `${doc}${declaration};`;\n }\n\n const [, ...parameters] = slot.callback.parameters;\n\n const inputs = handlerParameters(parameters).map((parameter, index) =>\n parameterIdentifier(parameter, index));\n\n const call = `callVfunc(${ownerRef}, ${sourceStringLiteral(slot.key)}, this, [${inputs.join(\", \")}])`;\n const body = returnType === \"void\" ? `${call};` : `return ${call} as ${returnType};`;\n\n return `${doc}${renderBlock(declaration, body)}`;\n};\n\nconst isEligibleVtableParam = (context: ModuleContext, param: GirParameter): boolean => {\n if (param.isVarargs) {\n return false;\n }\n\n return !isInlineCallbackRef(context.library, param.type);\n};\n\nconst isVtableSlotEligible = (context: ModuleContext, callback: GirCallback): boolean => {\n if (!callback.introspectable) {\n return false;\n }\n\n for (const param of callback.parameters) {\n if (!isEligibleVtableParam(context, param)) {\n return false;\n }\n }\n\n return !isInlineCallbackRef(context.library, callback.returnValue.type);\n};\n\nconst renderVtableSlotDescriptor = (context: ModuleContext, vtable: Vtable, slot: VtableSlot): string => {\n const { key, field, callback, byteOffset } = slot;\n\n const argDescriptors = callback.parameters\n .map((param) => renderParamDescriptor(context, param, param.type))\n .join(\", \");\n\n const returnDescriptor = renderDescriptor(\n context,\n callback.returnValue.type,\n callback.returnValue.transferOwnership,\n );\n\n const lines = [\n `className: ${sourceStringLiteral(vtable.structName)},`,\n `vfuncName: ${sourceStringLiteral(field.name)},`,\n `byteOffset: ${String(byteOffset)},`,\n ];\n\n if (vtable.kind === \"interface\") {\n lines.push(`vtableSize: ${String(vtable.vtableSize)},`);\n }\n\n lines.push(`argDescriptors: [${argDescriptors}],`, `returnDescriptor: ${returnDescriptor},`);\n\n if (callback.throws) {\n lines.push(\"canThrow: true,\");\n }\n\n return `${key}: ${renderBraced(lines.join(\"\\n\"))},`;\n};\n\nexport {\n hasCallableVfuncSlots,\n protectedChainSlotKeys,\n renderVfuncMembers,\n vfuncCallables,\n renderVfuncMetadata,\n vfuncEntries,\n vfuncMemberNames,\n type VfuncMemberMode,\n};\n"]}
@@ -3,6 +3,7 @@ import { type StoreOptions } from "./store-fs.js";
3
3
  type GiNamespaceInput = {
4
4
  directory: string;
5
5
  rawSource: string;
6
+ girFile: string;
6
7
  };
7
8
  declare const writeGiStore: (options: StoreOptions, namespaces: GiNamespaceInput[], fingerprint: GiFingerprint) => void;
8
9
  export { writeGiStore, type GiNamespaceInput };
@@ -1 +1 @@
1
- {"version":3,"file":"gi-store.d.ts","sourceRoot":"","sources":["../../src/store/gi-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAiB,KAAK,YAAY,EAA6B,MAAM,eAAe,CAAC;AAE5F,KAAK,gBAAgB,GAAG;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AA2DF,QAAA,MAAM,YAAY,GACd,SAAS,YAAY,EACrB,YAAY,gBAAgB,EAAE,EAC9B,aAAa,aAAa,KAC3B,IAeF,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"gi-store.d.ts","sourceRoot":"","sources":["../../src/store/gi-store.ts"],"names":[],"mappings":"AAIA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAkC,KAAK,YAAY,EAA6B,MAAM,eAAe,CAAC;AAE7G,KAAK,gBAAgB,GAAG;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAoDF,QAAA,MAAM,YAAY,GACd,SAAS,YAAY,EACrB,YAAY,gBAAgB,EAAE,EAC9B,aAAa,aAAa,KAC3B,IAeF,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,CAAC"}
@@ -2,40 +2,35 @@ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
2
  import { dirname, join, resolve } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { FINGERPRINT_FILENAME } from "../fingerprint.js";
5
- import { buildManifest, subpathExport, writeStore } from "./store-fs.js";
5
+ import { buildManifest, namespaceBarrel, subpathExport, writeStore } from "./store-fs.js";
6
6
  const OVERRIDES_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "overrides");
7
7
  const overrideFiles = (directory) => {
8
8
  const dir = join(OVERRIDES_ROOT, directory);
9
9
  if (!existsSync(dir)) {
10
10
  return [];
11
11
  }
12
- return readdirSync(dir).filter((name) => name.endsWith(".ejs") && name !== "index.ts.ejs");
12
+ return readdirSync(dir)
13
+ .filter((name) => name.endsWith(".ejs") && name !== "index.ts.ejs")
14
+ .map((name) => overrideModule(`${directory}/overrides/${name.replace(/\.ejs$/, "")}`, join(dir, name)));
13
15
  };
14
- const barrelSource = (directory) => {
16
+ const overrideModule = (fileName, overridePath) => ({
17
+ fileName,
18
+ source: readFileSync(overridePath, "utf8"),
19
+ origin: overridePath,
20
+ });
21
+ const barrelFile = (directory, girFile) => {
22
+ const barrel = namespaceBarrel(directory);
15
23
  const overrideIndex = join(OVERRIDES_ROOT, directory, "index.ts.ejs");
16
24
  if (!existsSync(overrideIndex)) {
17
- return `export * from "./${directory}.js";\n`;
25
+ return { ...barrel, origin: girFile };
18
26
  }
19
- return readFileSync(overrideIndex, "utf8");
27
+ return overrideModule(barrel.fileName, overrideIndex);
20
28
  };
21
29
  const collectStoreSources = (namespaces) => {
22
30
  const exportsMap = {};
23
31
  const collected = [];
24
- for (const { directory, rawSource } of namespaces) {
25
- collected.push({
26
- fileName: `${directory}/${directory}.ts`,
27
- source: rawSource,
28
- });
29
- for (const file of overrideFiles(directory)) {
30
- collected.push({
31
- fileName: `${directory}/overrides/${file.replace(/\.ejs$/, "")}`,
32
- source: readFileSync(join(OVERRIDES_ROOT, directory, file), "utf8"),
33
- });
34
- }
35
- collected.push({
36
- fileName: `${directory}/index.ts`,
37
- source: barrelSource(directory),
38
- });
32
+ for (const { directory, rawSource, girFile } of namespaces) {
33
+ collected.push({ fileName: `${directory}/${directory}.ts`, source: rawSource, origin: girFile }, ...overrideFiles(directory), barrelFile(directory, girFile));
39
34
  exportsMap[`./${directory}`] = subpathExport(`${directory}/index`);
40
35
  }
41
36
  return { collected, exportsMap };