@gtkx/codegen 1.0.0 → 1.2.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.
- package/README.md +1 -1
- package/dist/analysis/descriptor-render.d.ts +12 -15
- package/dist/analysis/descriptor-render.d.ts.map +1 -1
- package/dist/analysis/descriptor-render.js +59 -38
- package/dist/analysis/descriptor-render.js.map +1 -1
- package/dist/analysis/descriptor.d.ts +25 -10
- package/dist/analysis/descriptor.d.ts.map +1 -1
- package/dist/analysis/descriptor.js +37 -9
- package/dist/analysis/descriptor.js.map +1 -1
- package/dist/analysis/inheritance.d.ts +4 -2
- package/dist/analysis/inheritance.d.ts.map +1 -1
- package/dist/analysis/inheritance.js +80 -38
- package/dist/analysis/inheritance.js.map +1 -1
- package/dist/analysis/interface-conflicts.d.ts +25 -0
- package/dist/analysis/interface-conflicts.d.ts.map +1 -0
- package/dist/analysis/interface-conflicts.js +139 -0
- package/dist/analysis/interface-conflicts.js.map +1 -0
- package/dist/analysis/param-capability.d.ts.map +1 -1
- package/dist/analysis/param-capability.js +3 -4
- package/dist/analysis/param-capability.js.map +1 -1
- package/dist/analysis/param-structure.js +2 -2
- package/dist/analysis/param-structure.js.map +1 -1
- package/dist/analysis/ts-type.d.ts +3 -2
- package/dist/analysis/ts-type.d.ts.map +1 -1
- package/dist/analysis/ts-type.js +26 -26
- package/dist/analysis/ts-type.js.map +1 -1
- package/dist/analysis/type-key.d.ts +5 -0
- package/dist/analysis/type-key.d.ts.map +1 -0
- package/dist/analysis/type-key.js +9 -0
- package/dist/analysis/type-key.js.map +1 -0
- package/dist/analysis/type-shape.d.ts +3 -2
- package/dist/analysis/type-shape.d.ts.map +1 -1
- package/dist/analysis/type-shape.js +2 -1
- package/dist/analysis/type-shape.js.map +1 -1
- package/dist/compile.d.ts +14 -6
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +125 -24
- package/dist/compile.js.map +1 -1
- package/dist/docs/api-reference.d.ts +2 -0
- package/dist/docs/api-reference.d.ts.map +1 -1
- package/dist/docs/api-reference.js +11 -10
- package/dist/docs/api-reference.js.map +1 -1
- package/dist/docs/element-page.d.ts.map +1 -1
- package/dist/docs/element-page.js +5 -3
- package/dist/docs/element-page.js.map +1 -1
- package/dist/docs/pipeline.d.ts +1 -0
- package/dist/docs/pipeline.d.ts.map +1 -1
- package/dist/docs/pipeline.js +93 -19
- package/dist/docs/pipeline.js.map +1 -1
- package/dist/docs/render.d.ts +2 -1
- package/dist/docs/render.d.ts.map +1 -1
- package/dist/docs/render.js +5 -4
- package/dist/docs/render.js.map +1 -1
- package/dist/docs/symbol-page.d.ts.map +1 -1
- package/dist/docs/symbol-page.js +10 -9
- package/dist/docs/symbol-page.js.map +1 -1
- package/dist/fingerprint.d.ts +20 -3
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +56 -37
- package/dist/fingerprint.js.map +1 -1
- package/dist/gi.d.ts +1 -0
- package/dist/gi.d.ts.map +1 -1
- package/dist/gi.js +8 -2
- package/dist/gi.js.map +1 -1
- package/dist/gir/ancestry.d.ts +7 -1
- package/dist/gir/ancestry.d.ts.map +1 -1
- package/dist/gir/ancestry.js +9 -1
- package/dist/gir/ancestry.js.map +1 -1
- package/dist/gir/annotations.d.ts +1 -2
- package/dist/gir/annotations.d.ts.map +1 -1
- package/dist/gir/annotations.js +1 -1
- package/dist/gir/annotations.js.map +1 -1
- package/dist/gir/cursor-overrides.d.ts +8 -0
- package/dist/gir/cursor-overrides.d.ts.map +1 -0
- package/dist/gir/cursor-overrides.js +6 -0
- package/dist/gir/cursor-overrides.js.map +1 -0
- package/dist/gir/emittable.d.ts +7 -0
- package/dist/gir/emittable.d.ts.map +1 -0
- package/dist/gir/emittable.js +3 -0
- package/dist/gir/emittable.js.map +1 -0
- package/dist/gir/function.d.ts.map +1 -1
- package/dist/gir/function.js +28 -2
- package/dist/gir/function.js.map +1 -1
- package/dist/gir/gir-path.d.ts +1 -1
- package/dist/gir/gir-path.js +1 -1
- package/dist/gir/gir-path.js.map +1 -1
- package/dist/gir/library.d.ts +5 -1
- package/dist/gir/library.d.ts.map +1 -1
- package/dist/gir/library.js +9 -2
- package/dist/gir/library.js.map +1 -1
- package/dist/gir/namespace.d.ts +5 -1
- package/dist/gir/namespace.d.ts.map +1 -1
- package/dist/gir/namespace.js +4 -2
- package/dist/gir/namespace.js.map +1 -1
- package/dist/gir/parameter.d.ts +13 -1
- package/dist/gir/parameter.d.ts.map +1 -1
- package/dist/gir/parameter.js +1 -0
- package/dist/gir/parameter.js.map +1 -1
- package/dist/gir/parse.d.ts.map +1 -1
- package/dist/gir/parse.js +6 -6
- package/dist/gir/parse.js.map +1 -1
- package/dist/gir/primitives.js +1 -1
- package/dist/gir/primitives.js.map +1 -1
- package/dist/guards.d.ts +16 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +11 -0
- package/dist/guards.js.map +1 -0
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +2 -0
- package/dist/internal.js.map +1 -1
- package/dist/json.d.ts +3 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +11 -0
- package/dist/json.js.map +1 -0
- package/dist/khronos/args.d.ts.map +1 -1
- package/dist/khronos/args.js +8 -6
- package/dist/khronos/args.js.map +1 -1
- package/dist/khronos/modules.d.ts.map +1 -1
- package/dist/khronos/modules.js +22 -7
- package/dist/khronos/modules.js.map +1 -1
- package/dist/khronos/parse.d.ts.map +1 -1
- package/dist/khronos/parse.js +3 -4
- package/dist/khronos/parse.js.map +1 -1
- package/dist/khronos/pipeline.d.ts +1 -1
- package/dist/khronos/pipeline.d.ts.map +1 -1
- package/dist/khronos/pipeline.js.map +1 -1
- package/dist/khronos/plan.d.ts +1 -7
- package/dist/khronos/plan.d.ts.map +1 -1
- package/dist/khronos/plan.js +1 -1
- package/dist/khronos/plan.js.map +1 -1
- package/dist/khronos/render.d.ts.map +1 -1
- package/dist/khronos/render.js +8 -4
- package/dist/khronos/render.js.map +1 -1
- package/dist/runner.d.ts +7 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +21 -3
- package/dist/runner.js.map +1 -1
- package/dist/staging.d.ts +5 -0
- package/dist/staging.d.ts.map +1 -0
- package/dist/staging.js +57 -0
- package/dist/staging.js.map +1 -0
- package/dist/store/compile-store.d.ts +0 -1
- package/dist/store/compile-store.d.ts.map +1 -1
- package/dist/store/compile-store.js +7 -32
- package/dist/store/compile-store.js.map +1 -1
- package/dist/store/gi/callables.d.ts +6 -3
- package/dist/store/gi/callables.d.ts.map +1 -1
- package/dist/store/gi/callables.js +40 -30
- package/dist/store/gi/callables.js.map +1 -1
- package/dist/store/gi/callback.d.ts.map +1 -1
- package/dist/store/gi/callback.js +9 -5
- package/dist/store/gi/callback.js.map +1 -1
- package/dist/store/gi/class.d.ts.map +1 -1
- package/dist/store/gi/class.js +104 -44
- package/dist/store/gi/class.js.map +1 -1
- package/dist/store/gi/companion.d.ts.map +1 -1
- package/dist/store/gi/companion.js +6 -6
- package/dist/store/gi/companion.js.map +1 -1
- package/dist/store/gi/constant.d.ts.map +1 -1
- package/dist/store/gi/constant.js +11 -3
- package/dist/store/gi/constant.js.map +1 -1
- package/dist/store/gi/constructor-props.js +1 -1
- package/dist/store/gi/constructor-props.js.map +1 -1
- package/dist/store/gi/enum.d.ts.map +1 -1
- package/dist/store/gi/enum.js +29 -12
- package/dist/store/gi/enum.js.map +1 -1
- package/dist/store/gi/function.d.ts +1 -3
- package/dist/store/gi/function.d.ts.map +1 -1
- package/dist/store/gi/function.js +24 -18
- package/dist/store/gi/function.js.map +1 -1
- package/dist/store/gi/gtype-binding.d.ts.map +1 -1
- package/dist/store/gi/gtype-binding.js +4 -1
- package/dist/store/gi/gtype-binding.js.map +1 -1
- package/dist/store/gi/interface.d.ts.map +1 -1
- package/dist/store/gi/interface.js +34 -19
- package/dist/store/gi/interface.js.map +1 -1
- package/dist/store/gi/method.d.ts +7 -6
- package/dist/store/gi/method.d.ts.map +1 -1
- package/dist/store/gi/method.js +13 -24
- package/dist/store/gi/method.js.map +1 -1
- package/dist/store/gi/param-marshal.d.ts +3 -2
- package/dist/store/gi/param-marshal.d.ts.map +1 -1
- package/dist/store/gi/param-marshal.js +50 -5
- package/dist/store/gi/param-marshal.js.map +1 -1
- package/dist/store/gi/pipeline.d.ts.map +1 -1
- package/dist/store/gi/pipeline.js +21 -10
- package/dist/store/gi/pipeline.js.map +1 -1
- package/dist/store/gi/properties.d.ts +2 -1
- package/dist/store/gi/properties.d.ts.map +1 -1
- package/dist/store/gi/properties.js +6 -3
- package/dist/store/gi/properties.js.map +1 -1
- package/dist/store/gi/property-accessor.d.ts +10 -8
- package/dist/store/gi/property-accessor.d.ts.map +1 -1
- package/dist/store/gi/property-accessor.js +49 -91
- package/dist/store/gi/property-accessor.js.map +1 -1
- package/dist/store/gi/record-constructor.d.ts +8 -1
- package/dist/store/gi/record-constructor.d.ts.map +1 -1
- package/dist/store/gi/record-constructor.js +34 -13
- package/dist/store/gi/record-constructor.js.map +1 -1
- package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
- package/dist/store/gi/record-field-accessor.js +20 -4
- package/dist/store/gi/record-field-accessor.js.map +1 -1
- package/dist/store/gi/record-layout.d.ts +6 -1
- package/dist/store/gi/record-layout.d.ts.map +1 -1
- package/dist/store/gi/record-layout.js +8 -1
- package/dist/store/gi/record-layout.js.map +1 -1
- package/dist/store/gi/record.d.ts.map +1 -1
- package/dist/store/gi/record.js +19 -8
- package/dist/store/gi/record.js.map +1 -1
- package/dist/store/gi/registration.js +2 -2
- package/dist/store/gi/registration.js.map +1 -1
- package/dist/store/gi/return-wrap.js +1 -1
- package/dist/store/gi/return-wrap.js.map +1 -1
- package/dist/store/gi/signal.d.ts +2 -1
- package/dist/store/gi/signal.d.ts.map +1 -1
- package/dist/store/gi/signal.js +55 -28
- package/dist/store/gi/signal.js.map +1 -1
- package/dist/store/gi/value-marshalable.d.ts.map +1 -1
- package/dist/store/gi/value-marshalable.js +2 -1
- package/dist/store/gi/value-marshalable.js.map +1 -1
- package/dist/store/gi/vtable.d.ts +4 -1
- package/dist/store/gi/vtable.d.ts.map +1 -1
- package/dist/store/gi/vtable.js +60 -17
- package/dist/store/gi/vtable.js.map +1 -1
- package/dist/store/gi-store.d.ts +1 -0
- package/dist/store/gi-store.d.ts.map +1 -1
- package/dist/store/gi-store.js +15 -20
- package/dist/store/gi-store.js.map +1 -1
- package/dist/store/jsx/generated-elements.d.ts +2 -1
- package/dist/store/jsx/generated-elements.d.ts.map +1 -1
- package/dist/store/jsx/generated-elements.js +13 -7
- package/dist/store/jsx/generated-elements.js.map +1 -1
- package/dist/store/jsx/jsx.js +3 -3
- package/dist/store/jsx/jsx.js.map +1 -1
- package/dist/store/jsx/metadata.d.ts.map +1 -1
- package/dist/store/jsx/metadata.js +3 -1
- package/dist/store/jsx/metadata.js.map +1 -1
- package/dist/store/jsx-store.d.ts.map +1 -1
- package/dist/store/jsx-store.js +3 -4
- package/dist/store/jsx-store.js.map +1 -1
- package/dist/store/resolve-store.d.ts +14 -3
- package/dist/store/resolve-store.d.ts.map +1 -1
- package/dist/store/resolve-store.js +98 -15
- package/dist/store/resolve-store.js.map +1 -1
- package/dist/store/store-fs.d.ts +9 -7
- package/dist/store/store-fs.d.ts.map +1 -1
- package/dist/store/store-fs.js +54 -25
- package/dist/store/store-fs.js.map +1 -1
- package/dist/store/store-links.d.ts +3 -0
- package/dist/store/store-links.d.ts.map +1 -0
- package/dist/store/store-links.js +39 -0
- package/dist/store/store-links.js.map +1 -0
- package/dist/writer/comparison-context.d.ts +4 -0
- package/dist/writer/comparison-context.d.ts.map +1 -0
- package/dist/writer/comparison-context.js +13 -0
- package/dist/writer/comparison-context.js.map +1 -0
- package/dist/writer/context.d.ts +3 -3
- package/dist/writer/context.d.ts.map +1 -1
- package/dist/writer/context.js +11 -6
- package/dist/writer/context.js.map +1 -1
- package/dist/writer/module.d.ts +13 -5
- package/dist/writer/module.d.ts.map +1 -1
- package/dist/writer/module.js +68 -11
- package/dist/writer/module.js.map +1 -1
- package/dist/xml.d.ts +8 -1
- package/dist/xml.d.ts.map +1 -1
- package/dist/xml.js +70 -1
- package/dist/xml.js.map +1 -1
- package/overrides/gobject/object.ts.ejs +2 -0
- package/package.json +14 -3
- package/src/analysis/descriptor-render.ts +106 -52
- package/src/analysis/descriptor.ts +76 -15
- package/src/analysis/inheritance.ts +134 -44
- package/src/analysis/interface-conflicts.ts +235 -0
- package/src/analysis/param-capability.ts +3 -6
- package/src/analysis/param-structure.ts +2 -2
- package/src/analysis/ts-type.ts +43 -28
- package/src/analysis/type-key.ts +14 -0
- package/src/analysis/type-shape.ts +5 -2
- package/src/compile.ts +192 -27
- package/src/docs/api-reference.ts +13 -10
- package/src/docs/element-page.ts +5 -2
- package/src/docs/pipeline.ts +140 -24
- package/src/docs/render.ts +7 -3
- package/src/docs/symbol-page.ts +12 -11
- package/src/fingerprint.ts +95 -47
- package/src/gi.ts +10 -2
- package/src/gir/ancestry.ts +17 -1
- package/src/gir/annotations.ts +1 -1
- package/src/gir/cursor-overrides.ts +12 -0
- package/src/gir/emittable.ts +8 -0
- package/src/gir/function.ts +45 -9
- package/src/gir/gir-path.ts +1 -1
- package/src/gir/library.ts +10 -2
- package/src/gir/namespace.ts +8 -2
- package/src/gir/parameter.ts +15 -0
- package/src/gir/parse.ts +10 -7
- package/src/gir/primitives.ts +1 -1
- package/src/guards.ts +23 -0
- package/src/internal.ts +2 -0
- package/src/json.ts +11 -0
- package/src/khronos/args.ts +9 -6
- package/src/khronos/modules.ts +25 -9
- package/src/khronos/parse.ts +3 -4
- package/src/khronos/pipeline.ts +1 -1
- package/src/khronos/plan.ts +0 -1
- package/src/khronos/render.ts +8 -6
- package/src/runner.ts +26 -4
- package/src/staging.ts +67 -0
- package/src/store/compile-store.ts +7 -38
- package/src/store/gi/callables.ts +60 -33
- package/src/store/gi/callback.ts +9 -9
- package/src/store/gi/class.ts +140 -53
- package/src/store/gi/companion.ts +7 -6
- package/src/store/gi/constant.ts +13 -3
- package/src/store/gi/constructor-props.ts +1 -1
- package/src/store/gi/enum.ts +36 -26
- package/src/store/gi/function.ts +30 -24
- package/src/store/gi/gtype-binding.ts +7 -2
- package/src/store/gi/interface.ts +39 -20
- package/src/store/gi/method.ts +26 -32
- package/src/store/gi/param-marshal.ts +77 -6
- package/src/store/gi/pipeline.ts +25 -15
- package/src/store/gi/properties.ts +8 -4
- package/src/store/gi/property-accessor.ts +73 -161
- package/src/store/gi/record-constructor.ts +53 -21
- package/src/store/gi/record-field-accessor.ts +26 -4
- package/src/store/gi/record-layout.ts +11 -1
- package/src/store/gi/record.ts +20 -12
- package/src/store/gi/registration.ts +2 -2
- package/src/store/gi/return-wrap.ts +1 -1
- package/src/store/gi/signal.ts +66 -42
- package/src/store/gi/value-marshalable.ts +3 -1
- package/src/store/gi/vtable.ts +97 -20
- package/src/store/gi-store.ts +26 -31
- package/src/store/jsx/generated-elements.ts +17 -8
- package/src/store/jsx/jsx.ts +3 -3
- package/src/store/jsx/metadata.ts +4 -1
- package/src/store/jsx-store.ts +3 -4
- package/src/store/resolve-store.ts +133 -18
- package/src/store/store-fs.ts +82 -35
- package/src/store/store-links.ts +49 -0
- package/src/writer/comparison-context.ts +18 -0
- package/src/writer/context.ts +12 -6
- package/src/writer/module.ts +101 -14
- package/src/xml.ts +103 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-marshalable.js","sourceRoot":"","sources":["../../../src/store/gi/value-marshalable.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"value-marshalable.js","sourceRoot":"","sources":["../../../src/store/gi/value-marshalable.ts"],"names":[],"mappings":"AASA,MAAM,kBAAkB,GAA2B,IAAI,GAAG,CAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAErG,MAAM,SAAS,GAAG,CAAC,aAAqB,EAAE,MAAiB,EAAU,EAAE,CAAC,GAAG,aAAa,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;AAE1G,MAAM,mBAAmB,GAAG,CAAC,MAAiB,EAAW,EAAE,CACvD,MAAM,CAAC,WAAW,KAAK,SAAS;IAChC,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC;AAEvH,MAAM,cAAc,GAAG,CAAC,MAAiB,EAAW,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC;AAEzF,MAAM,gBAAgB,GAAG,CAAC,KAAY,EAAE,IAA0C,EAAW,EAAE,CAC3F,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;AAE3F,MAAM,gBAAgB,GAAG,CAAC,KAAY,EAAE,IAAyC,EAAW,EAAE,CAC1F,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAErE,SAAS,eAAe,CAAC,KAAY,EAAE,IAAa;IAChD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,WAAW,CAAC,CAAC,CAAC;YACf,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACV,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,OAAO,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACrE,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,OAAO,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACX,OAAO,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,UAAU,CAAC;QAChB,KAAK,OAAO,CAAC;QACb,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS,CAAC,CAAC,CAAC;YACb,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,KAAY,EAAE,GAAuB,EAAE,KAAyB;IACpF,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEhD,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,KAAY,EAAE,KAAe,EAAW,EAAE,CAChE,KAAK,CAAC,aAAa,KAAK,SAAS;IAC7B,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;IAChD,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjF,SAAS,iBAAiB,CAAC,KAAY,EAAE,aAAqB,EAAE,MAAiB;IAC7E,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAE7C,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEvB,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC,OAAsB,EAAE,aAAqB,EAAE,MAAiB,EAAW,EAAE,CACrG,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAU,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAEnF,MAAM,qBAAqB,GAAG,CAAC,OAAsB,EAAE,aAAqB,EAAE,MAAiB,EAAW,EAAE,CACxG,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;AAEnH,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAC","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,4 +1,5 @@
|
|
|
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";
|
|
3
4
|
type VfuncMemberMode = "implementation" | "requirement" | "signature";
|
|
4
5
|
type VfuncMembersOptions = {
|
|
@@ -13,8 +14,10 @@ type VfuncEntry = {
|
|
|
13
14
|
};
|
|
14
15
|
declare const vfuncMemberNames: (context: ModuleContext, namespaceName: string, klass: GirClass) => string[];
|
|
15
16
|
declare const renderVfuncMetadata: (context: ModuleContext, klass: GirClass) => string | undefined;
|
|
17
|
+
declare const vfuncCallables: (context: ModuleContext, namespaceName: string, klass: GirClass) => Map<string, GirFunction>;
|
|
18
|
+
declare const protectedChainSlotKeys: (context: ModuleContext, klass: GirClass) => Set<string>;
|
|
16
19
|
declare const hasCallableVfuncSlots: (context: ModuleContext, namespaceName: string, klass: GirClass) => boolean;
|
|
17
20
|
declare const vfuncEntries: (context: ModuleContext, namespaceName: string, klass: GirClass) => VfuncEntry[];
|
|
18
21
|
declare const renderVfuncMembers: (options: VfuncMembersOptions) => string[];
|
|
19
|
-
export { hasCallableVfuncSlots, renderVfuncMembers, renderVfuncMetadata, vfuncEntries, vfuncMemberNames, type VfuncMemberMode, };
|
|
22
|
+
export { hasCallableVfuncSlots, protectedChainSlotKeys, renderVfuncMembers, vfuncCallables, renderVfuncMetadata, vfuncEntries, vfuncMemberNames, type VfuncMemberMode, };
|
|
20
23
|
//# sourceMappingURL=vtable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vtable.d.ts","sourceRoot":"","sources":["../../../src/store/gi/vtable.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/store/gi/vtable.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { pascalCase, sourceStringLiteral } from "@gtkx/utils";
|
|
1
|
+
import { pascalCase, sanitizeTypeIdentifier, sourceStringLiteral } from "@gtkx/utils";
|
|
2
2
|
import { isInlineCallbackRef, isScalarRef, renderDescriptor, renderParamDescriptor, } from "../../analysis/descriptor-render.js";
|
|
3
3
|
import { foldedLengthParameters, handlerParameters, parameterIdentifier, renamesWithInstance, renderHandlerParameters, renderHandlerResultType, } from "../../analysis/param-structure.js";
|
|
4
4
|
import { renderTsType } from "../../analysis/ts-type.js";
|
|
5
|
+
import { typeKey } from "../../analysis/type-key.js";
|
|
5
6
|
import { ancestorChain, resolveInterfaces } from "../../gir/ancestry.js";
|
|
7
|
+
import { callbackAsFunction } from "../../gir/callback.js";
|
|
6
8
|
import { renderJsDoc } from "../../writer/doc.js";
|
|
7
9
|
import { renderBlock, renderBraced } from "../../writer/emit.js";
|
|
8
10
|
import { handlerSpec, THROWS_TEXT } from "./doc-spec.js";
|
|
@@ -14,6 +16,7 @@ const UNCALLABLE_SLOT_KEYS = new Set([
|
|
|
14
16
|
"vfuncGetProperty",
|
|
15
17
|
"vfuncSetProperty",
|
|
16
18
|
]);
|
|
19
|
+
const VTABLE_CACHE = new WeakMap();
|
|
17
20
|
const PROTECTED_SLOT_NOTE = "It is `protected`, so only a subclass chaining up reaches it.";
|
|
18
21
|
const PUBLIC_SLOT_NOTE = "Calling it from anywhere else re-enters the slot on a live instance.";
|
|
19
22
|
const vfuncMemberName = (fieldName) => `vfunc${pascalCase(fieldName)}`;
|
|
@@ -83,7 +86,7 @@ const attachVirtualMethods = (slots, klass) => {
|
|
|
83
86
|
const byKey = new Map(klass.vfuncs.map((vfunc) => [vfuncMemberName(vfunc.name), vfunc]));
|
|
84
87
|
return slots.map((slot) => ({ ...slot, vfunc: byKey.get(slot.key) }));
|
|
85
88
|
};
|
|
86
|
-
const
|
|
89
|
+
const buildVtable = (context, namespaceName, klass) => {
|
|
87
90
|
const resolved = resolveVtableRecord(context, namespaceName, klass);
|
|
88
91
|
if (resolved === undefined) {
|
|
89
92
|
return undefined;
|
|
@@ -96,9 +99,37 @@ const collectVtable = (context, namespaceName, klass) => {
|
|
|
96
99
|
structName: pascalCase(resolved.typeStruct),
|
|
97
100
|
kind: klass.isInterface ? "interface" : "class",
|
|
98
101
|
vtableSize,
|
|
99
|
-
slots: attachVirtualMethods(slots, klass),
|
|
102
|
+
slots: disambiguateSlots(context, namespaceName, klass, attachVirtualMethods(slots, klass)),
|
|
100
103
|
};
|
|
101
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
|
+
};
|
|
102
133
|
const vfuncMemberNames = (context, namespaceName, klass) => collectVtable(context, namespaceName, klass)?.slots.map((slot) => slot.key) ?? [];
|
|
103
134
|
const renderVfuncMetadata = (context, klass) => {
|
|
104
135
|
const vtable = collectVtable(context, context.namespace.name, klass);
|
|
@@ -109,18 +140,7 @@ const renderVfuncMetadata = (context, klass) => {
|
|
|
109
140
|
return renderBraced(entries.join("\n"));
|
|
110
141
|
};
|
|
111
142
|
const slotIdentity = (slot) => `${slot.key}:${String(slot.byteOffset)}`;
|
|
112
|
-
const inheritedSlotIdentities = (context, namespaceName, klass) =>
|
|
113
|
-
const identities = new Set();
|
|
114
|
-
const [, ...ancestors] = [...ancestorChain(context.library, klass, namespaceName)];
|
|
115
|
-
for (const ancestor of ancestors) {
|
|
116
|
-
const vtable = collectVtable(context, ancestor.namespaceName, ancestor.klass);
|
|
117
|
-
const slots = vtable?.slots ?? [];
|
|
118
|
-
for (const slot of slots) {
|
|
119
|
-
identities.add(slotIdentity(slot));
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return identities;
|
|
123
|
-
};
|
|
143
|
+
const inheritedSlotIdentities = (context, namespaceName, klass) => new Set(ancestorSlots(context, namespaceName, klass).map((slot) => slotIdentity(slot)));
|
|
124
144
|
const addInterfaceSlotKeys = (context, iface, keys, seen) => {
|
|
125
145
|
const identity = `${iface.namespaceName}.${iface.klass.name}`;
|
|
126
146
|
if (seen.has(identity)) {
|
|
@@ -152,6 +172,29 @@ const protectedSlotKeys = (options, slots) => {
|
|
|
152
172
|
const shared = implementedSlotKeys(context, context.namespace.name, klass);
|
|
153
173
|
return new Set(slots.map((slot) => slot.key).filter((key) => !shared.has(key)));
|
|
154
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
|
+
};
|
|
155
198
|
const callableVfuncSlots = (context, namespaceName, klass) => {
|
|
156
199
|
const vtable = collectVtable(context, namespaceName, klass);
|
|
157
200
|
if (vtable === undefined) {
|
|
@@ -183,7 +226,7 @@ const vfuncEntries = (context, namespaceName, klass) => callableVfuncSlots(conte
|
|
|
183
226
|
}));
|
|
184
227
|
const renderVfuncMembers = (options) => {
|
|
185
228
|
const { context, klass, mode } = options;
|
|
186
|
-
const ownerRef =
|
|
229
|
+
const ownerRef = sanitizeTypeIdentifier(klass.name);
|
|
187
230
|
const slots = callableVfuncSlots(context, context.namespace.name, klass);
|
|
188
231
|
if (slots.length === 0) {
|
|
189
232
|
return [];
|
|
@@ -267,5 +310,5 @@ const renderVtableSlotDescriptor = (context, vtable, slot) => {
|
|
|
267
310
|
}
|
|
268
311
|
return `${key}: ${renderBraced(lines.join("\n"))},`;
|
|
269
312
|
};
|
|
270
|
-
export { hasCallableVfuncSlots, renderVfuncMembers, renderVfuncMetadata, vfuncEntries, vfuncMemberNames, };
|
|
313
|
+
export { hasCallableVfuncSlots, protectedChainSlotKeys, renderVfuncMembers, vfuncCallables, renderVfuncMetadata, vfuncEntries, vfuncMemberNames, };
|
|
271
314
|
//# sourceMappingURL=vtable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vtable.js","sourceRoot":"","sources":["../../../src/store/gi/vtable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAS9D,OAAO,EACH,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,qBAAqB,GACxB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACH,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAyB,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AA6C7D,MAAM,kBAAkB,GAAG,4BAA4B,CAAC;AAExD,MAAM,oBAAoB,GAAgB,IAAI,GAAG,CAAC;IAC9C,cAAc;IACd,eAAe;IACf,kBAAkB;IAClB,kBAAkB;CACrB,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,+DAA+D,CAAC;AAC5F,MAAM,gBAAgB,GAAG,sEAAsE,CAAC;AAEhG,MAAM,eAAe,GAAG,CAAC,SAAiB,EAAU,EAAE,CAAC,QAAQ,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;AAEvF,MAAM,iBAAiB,GAAG,CAAC,IAAgB,EAAE,WAAoB,EAAU,EAAE,CACzE;IACI,iBAAiB,IAAI,CAAC,KAAK,CAAC,IAAI,oEAAoE;IACpG,6BAA6B,IAAI,CAAC,GAAG,OAAO;IAC5C,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,gBAAgB;CACvD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEjB,MAAM,oBAAoB,GAAG,CAAC,IAAgB,EAAE,QAAgB,EAAU,EAAE,CACxE;IACI,eAAe,IAAI,CAAC,KAAK,CAAC,IAAI,mEAAmE;IACjG,UAAU,QAAQ,iFAAiF;IACnG,wFAAwF;CAC3F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEjB,MAAM,eAAe,GAAG,CAAC,OAA2B,EAAU,EAAE,CAC5D,OAAO,CAAC,IAAI,KAAK,aAAa;IAC1B,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC;IACtD,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;AAE/D,MAAM,cAAc,GAAG,CAAC,KAAe,EAAW,EAAE,CAChD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAEtE,MAAM,kBAAkB,GAAG,CAAC,OAAsB,EAAE,KAAe,EAA2B,EAAE;IAC5F,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjD,IAAI,IAAI,EAAE,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACjF,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACpB,OAAsB,EACtB,KAAe,EACf,YAAyB,EACyB,EAAE;IACpD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAEpD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CACvB,OAAsB,EACtB,MAAkB,EAClB,OAAgB,EAC2B,EAAE;IAC7C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,YAAY,GAAgB,IAAI,GAAG,EAAE,CAAC;IAE5C,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QAE5D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACrF,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CACxB,OAAsB,EACtB,aAAqB,EACrB,KAAe,EACsC,EAAE;IACvD,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC;IACxC,MAAM,QAAQ,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAE/G,IAAI,UAAU,KAAK,SAAS,IAAI,QAAQ,EAAE,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChG,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAmB,EAAE,KAAe,EAAgB,EAAE;IAChF,MAAM,KAAK,GAAkC,IAAI,GAAG,CAChD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CACpE,CAAC;IAEF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,OAAsB,EAAE,aAAqB,EAAE,KAAe,EAAsB,EAAE;IACzG,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;IAEpE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE3G,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO;QACH,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC3C,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO;QAC/C,UAAU;QACV,KAAK,EAAE,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC;KAC5C,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,OAAsB,EAAE,aAAqB,EAAE,KAAe,EAAY,EAAE,CAClG,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AAEtF,MAAM,mBAAmB,GAAG,CAAC,OAAsB,EAAE,KAAe,EAAsB,EAAE;IACxF,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAErE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAE9F,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAgB,EAAU,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;AAE5F,MAAM,uBAAuB,GAAG,CAAC,OAAsB,EAAE,aAAqB,EAAE,KAAe,EAAe,EAAE;IAC5G,MAAM,UAAU,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC1C,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IAEnF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9E,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CACzB,OAAsB,EACtB,KAAuB,EACvB,IAAiB,EACjB,IAAiB,EACb,EAAE;IACN,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAE9D,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrB,OAAO;IACX,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEnB,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QACnG,oBAAoB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,OAAsB,EAAE,aAAqB,EAAE,KAAe,EAAe,EAAE;IACxG,MAAM,IAAI,GAAgB,IAAI,GAAG,EAAE,CAAC;IACpC,MAAM,IAAI,GAAgB,IAAI,GAAG,EAAE,CAAC;IAEpC,KAAK,MAAM,QAAQ,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC;QAC1E,KAAK,MAAM,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACtG,oBAAoB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,OAA4B,EAAE,KAAmB,EAAe,EAAE;IACzF,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEnC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACpB,OAAO,IAAI,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE3E,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpF,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,OAAsB,EAAE,aAAqB,EAAE,KAAe,EAAgB,EAAE;IACxG,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;IAE5D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;IAEzE,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9G,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,OAAsB,EAAE,aAAqB,EAAE,KAAe,EAAW,EAAE,CACtG,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAEjE,MAAM,OAAO,GAAG,CAAC,IAAgB,EAAsB,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AAEjH,MAAM,iBAAiB,GAAG,CAAC,IAAgB,EAAkB,EAAE;IAC3D,MAAM,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;IACnD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE,CAAC;IAErD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACvH,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAgB,EAAa,EAAE;IAChD,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC;IAE3C,OAAO;QACH,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAChG,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG;QACrE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KACzD,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,OAAsB,EAAE,aAAqB,EAAE,KAAe,EAAgB,EAAE,CAClG,kBAAkB,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7D,IAAI,EAAE,IAAI,CAAC,GAAG;IACd,SAAS,EAAE,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM;IACnD,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC;CACrB,CAAC,CAAC,CAAC;AAER,MAAM,kBAAkB,GAAG,CAAC,OAA4B,EAAY,EAAE;IAClE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEzE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC5B,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAExD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACtB,iBAAiB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACxG,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,OAAsB,EAAE,IAAgB,EAAW,EAAE;IACrF,MAAM,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;IAEnD,OAAO,UAAU,CAAC,IAAI,CAClB,CAAC,SAAS,EAAE,EAAE,CACV,SAAS,CAAC,SAAS,KAAK,IAAI;QAC5B,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI;QACvC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CACnD,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,OAAsB,EAAE,IAAgB,EAAW,EAAE,CACzE,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAEtF,MAAM,kBAAkB,GAAG,CAAC,OAAsB,EAAE,IAAgB,EAAE,UAAU,GAAG,KAAK,EAAkB,EAAE;IACxG,MAAM,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;IAEnD,MAAM,UAAU,GAAG,CAAC,GAAuB,EAAE,UAAmB,EAAU,EAAE,CACxE,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAE3C,MAAM,SAAS,GAAG,uBAAuB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEtE,MAAM,UAAU,GAAG,uBAAuB,CAAC;QACvC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE;QACxC,UAAU;QACV,4BAA4B,EAAE,IAAI;QAClC,QAAQ,EAAE,KAAK;QACf,gBAAgB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;KACzD,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,SAAS,MAAM,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC;AACtG,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,OAA2B,EAAU,EAAE;IAC9D,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAC/D,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,aAAa,CAAC,CAAC;IACzF,MAAM,WAAW,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;IAClE,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAEpF,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC5B,OAAO,GAAG,GAAG,GAAG,WAAW,GAAG,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;IAEnD,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAClE,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,aAAa,QAAQ,KAAK,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACtG,MAAM,IAAI,GAAG,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,OAAO,UAAU,GAAG,CAAC;IAErF,OAAO,GAAG,GAAG,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,OAAsB,EAAE,KAAmB,EAAW,EAAE;IACnF,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,OAAsB,EAAE,QAAqB,EAAW,EAAE;IACpF,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtC,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAC5E,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,OAAsB,EAAE,MAAc,EAAE,IAAgB,EAAU,EAAE;IACpG,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAElD,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU;SACrC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;SACjE,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhB,MAAM,gBAAgB,GAAG,gBAAgB,CACrC,OAAO,EACP,QAAQ,CAAC,WAAW,CAAC,IAAI,EACzB,QAAQ,CAAC,WAAW,CAAC,iBAAiB,CACzC,CAAC;IAEF,MAAM,KAAK,GAAG;QACV,cAAc,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG;QACvD,cAAc,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;QAChD,eAAe,MAAM,CAAC,UAAU,CAAC,GAAG;KACvC,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,oBAAoB,cAAc,IAAI,EAAE,qBAAqB,gBAAgB,GAAG,CAAC,CAAC;IAE7F,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,GAAG,GAAG,KAAK,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AACxD,CAAC,CAAC;AAEF,OAAO,EACH,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,GAEnB,CAAC","sourcesContent":["import { pascalCase, sourceStringLiteral } from \"@gtkx/utils\";\nimport type { GirCallback } from \"../../gir/callback.js\";\nimport type { GirClass, GirVirtualMethod } from \"../../gir/class.js\";\nimport type { GirField } from \"../../gir/field.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 { ancestorChain, type ResolvedAncestor, resolveInterfaces } from \"../../gir/ancestry.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 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 collectVtable = (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: attachVirtualMethods(slots, klass),\n };\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 const identities: Set<string> = new Set();\n const [, ...ancestors] = [...ancestorChain(context.library, klass, namespaceName)];\n\n for (const ancestor of ancestors) {\n const vtable = collectVtable(context, ancestor.namespaceName, ancestor.klass);\n const slots = vtable?.slots ?? [];\n\n for (const slot of slots) {\n identities.add(slotIdentity(slot));\n }\n }\n\n return identities;\n};\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 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 = pascalCase(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 renderVfuncMembers,\n renderVfuncMetadata,\n vfuncEntries,\n vfuncMemberNames,\n type VfuncMemberMode,\n};\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"]}
|
package/dist/store/gi-store.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/store/gi-store.js
CHANGED
|
@@ -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)
|
|
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
|
|
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
|
|
25
|
+
return { ...barrel, origin: girFile };
|
|
18
26
|
}
|
|
19
|
-
return
|
|
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 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gi-store.js","sourceRoot":"","sources":["../../src/store/gi-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"gi-store.js","sourceRoot":"","sources":["../../src/store/gi-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { SourceModule } from \"../compile.js\";\nimport { FINGERPRINT_FILENAME, type GiFingerprint } from \"../fingerprint.js\";\nimport { buildManifest, namespaceBarrel, type StoreOptions, subpathExport, writeStore } from \"./store-fs.js\";\n\ntype GiNamespaceInput = {\n directory: string;\n rawSource: string;\n girFile: string;\n};\n\nconst OVERRIDES_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"overrides\");\n\nconst overrideFiles = (directory: string): SourceModule[] => {\n const dir = join(OVERRIDES_ROOT, directory);\n\n if (!existsSync(dir)) {\n return [];\n }\n\n return readdirSync(dir)\n .filter((name) => name.endsWith(\".ejs\") && name !== \"index.ts.ejs\")\n .map((name) => overrideModule(`${directory}/overrides/${name.replace(/\\.ejs$/, \"\")}`, join(dir, name)));\n};\n\nconst overrideModule = (fileName: string, overridePath: string): SourceModule => ({\n fileName,\n source: readFileSync(overridePath, \"utf8\"),\n origin: overridePath,\n});\n\nconst barrelFile = (directory: string, girFile: string): SourceModule => {\n const barrel = namespaceBarrel(directory);\n const overrideIndex = join(OVERRIDES_ROOT, directory, \"index.ts.ejs\");\n\n if (!existsSync(overrideIndex)) {\n return { ...barrel, origin: girFile };\n }\n\n return overrideModule(barrel.fileName, overrideIndex);\n};\n\nconst collectStoreSources = (\n namespaces: GiNamespaceInput[],\n): { collected: SourceModule[]; exportsMap: Record<string, unknown> } => {\n const exportsMap: Record<string, unknown> = {};\n const collected: SourceModule[] = [];\n\n for (const { directory, rawSource, girFile } of namespaces) {\n collected.push(\n { fileName: `${directory}/${directory}.ts`, source: rawSource, origin: girFile },\n ...overrideFiles(directory),\n barrelFile(directory, girFile),\n );\n\n exportsMap[`./${directory}`] = subpathExport(`${directory}/index`);\n }\n\n return { collected, exportsMap };\n};\n\nconst writeGiStore = (\n options: StoreOptions,\n namespaces: GiNamespaceInput[],\n fingerprint: GiFingerprint,\n): void => {\n const { collected, exportsMap } = collectStoreSources(namespaces);\n\n writeStore({\n storeDir: options.storeDir,\n linkDir: options.linkDir,\n files: collected,\n manifest: buildManifest({\n name: \"@gtkx/gi\",\n version: options.version,\n exports: exportsMap,\n peerDependencies: { \"@gtkx/runtime\": \"*\" },\n }),\n rawFiles: [{ relativePath: FINGERPRINT_FILENAME, content: `${JSON.stringify(fingerprint, null, 2)}\\n` }],\n });\n};\n\nexport { writeGiStore, type GiNamespaceInput };\n"]}
|
|
@@ -22,7 +22,8 @@ declare const renderGeneratedElements: (elements: GeneratedElement[]) => string;
|
|
|
22
22
|
* that only exist inside a Vite or Vitest build.
|
|
23
23
|
*
|
|
24
24
|
* @param jsxStoreDir The jsx store directory, as given by `resolveStore(projectRoot).jsx.storeDir`.
|
|
25
|
-
* @returns Every bound element, sorted by GLib type name, or an empty array when the store
|
|
25
|
+
* @returns Every bound element, sorted by GLib type name, or an empty array when the store holds no inventory
|
|
26
|
+
* codegen wrote, which covers an absent, unreadable, unparseable and structurally foreign store file alike.
|
|
26
27
|
*/
|
|
27
28
|
declare const readGeneratedElements: (jsxStoreDir: string) => GeneratedElement[];
|
|
28
29
|
export { ELEMENTS_FILENAME, collectGeneratedElements, readGeneratedElements, renderGeneratedElements, type GeneratedElement, };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated-elements.d.ts","sourceRoot":"","sources":["../../../src/store/jsx/generated-elements.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generated-elements.d.ts","sourceRoot":"","sources":["../../../src/store/jsx/generated-elements.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAK9D,+CAA+C;AAC/C,KAAK,gBAAgB,GAAG;IACpB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,QAAA,MAAM,iBAAiB,kBAAkB,CAAC;AAE1C,QAAA,MAAM,wBAAwB,GAAI,mBAAmB,cAAc,EAAE,KAAG,gBAAgB,EAQvB,CAAC;AAElE,QAAA,MAAM,uBAAuB,GAAI,UAAU,gBAAgB,EAAE,KAAG,MACpB,CAAC;AAa7C;;;;;;;;GAQG;AACH,QAAA,MAAM,qBAAqB,GAAI,aAAa,MAAM,KAAG,gBAAgB,EAIpE,CAAC;AAEF,OAAO,EACH,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,gBAAgB,GACxB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
2
1
|
import { join } from "node:path";
|
|
3
2
|
import { namespaceDirectory } from "../../gir/namespace.js";
|
|
3
|
+
import { arrayGuard, hasFields, isBoolean, isString } from "../../guards.js";
|
|
4
|
+
import { readJsonFile } from "../../json.js";
|
|
4
5
|
const ELEMENTS_FILENAME = "elements.json";
|
|
5
6
|
const collectGeneratedElements = (intrinsicElements) => intrinsicElements
|
|
6
7
|
.map((entry) => ({
|
|
@@ -11,20 +12,25 @@ const collectGeneratedElements = (intrinsicElements) => intrinsicElements
|
|
|
11
12
|
}))
|
|
12
13
|
.toSorted((a, b) => a.glibName.localeCompare(b.glibName));
|
|
13
14
|
const renderGeneratedElements = (elements) => `${JSON.stringify(elements, null, 2)}\n`;
|
|
15
|
+
const isGeneratedElement = (value) => hasFields(value, {
|
|
16
|
+
namespace: isString,
|
|
17
|
+
directory: isString,
|
|
18
|
+
glibName: isString,
|
|
19
|
+
isMountable: isBoolean,
|
|
20
|
+
});
|
|
21
|
+
const isGeneratedInventory = (value) => arrayGuard(isGeneratedElement)(value);
|
|
14
22
|
/**
|
|
15
23
|
* Reads the inventory of elements the `@gtkx/jsx` store binds, written into the store by codegen. Answers
|
|
16
24
|
* "what does this project's JSX layer cover" without loading the store, which resolves `virtual:` specifiers
|
|
17
25
|
* that only exist inside a Vite or Vitest build.
|
|
18
26
|
*
|
|
19
27
|
* @param jsxStoreDir The jsx store directory, as given by `resolveStore(projectRoot).jsx.storeDir`.
|
|
20
|
-
* @returns Every bound element, sorted by GLib type name, or an empty array when the store
|
|
28
|
+
* @returns Every bound element, sorted by GLib type name, or an empty array when the store holds no inventory
|
|
29
|
+
* codegen wrote, which covers an absent, unreadable, unparseable and structurally foreign store file alike.
|
|
21
30
|
*/
|
|
22
31
|
const readGeneratedElements = (jsxStoreDir) => {
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
return [];
|
|
26
|
-
}
|
|
27
|
-
return JSON.parse(readFileSync(path, "utf8"));
|
|
32
|
+
const parsed = readJsonFile(join(jsxStoreDir, ELEMENTS_FILENAME));
|
|
33
|
+
return isGeneratedInventory(parsed) ? parsed : [];
|
|
28
34
|
};
|
|
29
35
|
export { ELEMENTS_FILENAME, collectGeneratedElements, readGeneratedElements, renderGeneratedElements, };
|
|
30
36
|
//# sourceMappingURL=generated-elements.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated-elements.js","sourceRoot":"","sources":["../../../src/store/jsx/generated-elements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"generated-elements.js","sourceRoot":"","sources":["../../../src/store/jsx/generated-elements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAiB7C,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAE1C,MAAM,wBAAwB,GAAG,CAAC,iBAAmC,EAAsB,EAAE,CACzF,iBAAiB;KACZ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACb,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI;IAC/B,SAAS,EAAE,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC;IAC9C,QAAQ,EAAE,KAAK,CAAC,QAAQ;IACxB,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU;CACvC,CAAC,CAAC;KACF,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAElE,MAAM,uBAAuB,GAAG,CAAC,QAA4B,EAAU,EAAE,CACrE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAE7C,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAA6B,EAAE,CACrE,SAAS,CAAmB,KAAK,EAAE;IAC/B,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE,QAAQ;IACnB,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,SAAS;CACzB,CAAC,CAAC;AAEP,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAA+B,EAAE,CACzE,UAAU,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAC;AAE1C;;;;;;;;GAQG;AACH,MAAM,qBAAqB,GAAG,CAAC,WAAmB,EAAsB,EAAE;IACtE,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAElE,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC,CAAC;AAEF,OAAO,EACH,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,GAE1B,CAAC","sourcesContent":["import { join } from \"node:path\";\nimport type { GlibNamedClass } from \"./intrinsic-elements.js\";\nimport { namespaceDirectory } from \"../../gir/namespace.js\";\nimport { arrayGuard, hasFields, isBoolean, isString } from \"../../guards.js\";\nimport { readJsonFile } from \"../../json.js\";\n\n/** One element the `@gtkx/jsx` store binds. */\ntype GeneratedElement = {\n /** GIR namespace name, such as `\"Gtk\"`. */\n namespace: string;\n /** Subexport the element is reachable through, such as `\"gtk\"` in `@gtkx/jsx/gtk`. */\n directory: string;\n /** GLib type name, which is also the JSX tag name, such as `\"GtkButton\"`. */\n glibName: string;\n /**\n * Whether the element can be rendered. An abstract GType is bound for its props and metadata but\n * exports no component, because `g_object_new` on one is a fatal GObject error.\n */\n isMountable: boolean;\n};\n\nconst ELEMENTS_FILENAME = \"elements.json\";\n\nconst collectGeneratedElements = (intrinsicElements: GlibNamedClass[]): GeneratedElement[] =>\n intrinsicElements\n .map((entry) => ({\n namespace: entry.namespace.name,\n directory: namespaceDirectory(entry.namespace),\n glibName: entry.glibName,\n isMountable: !entry.klass.isAbstract,\n }))\n .toSorted((a, b) => a.glibName.localeCompare(b.glibName));\n\nconst renderGeneratedElements = (elements: GeneratedElement[]): string =>\n `${JSON.stringify(elements, null, 2)}\\n`;\n\nconst isGeneratedElement = (value: unknown): value is GeneratedElement =>\n hasFields<GeneratedElement>(value, {\n namespace: isString,\n directory: isString,\n glibName: isString,\n isMountable: isBoolean,\n });\n\nconst isGeneratedInventory = (value: unknown): value is GeneratedElement[] =>\n arrayGuard(isGeneratedElement)(value);\n\n/**\n * Reads the inventory of elements the `@gtkx/jsx` store binds, written into the store by codegen. Answers\n * \"what does this project's JSX layer cover\" without loading the store, which resolves `virtual:` specifiers\n * that only exist inside a Vite or Vitest build.\n *\n * @param jsxStoreDir The jsx store directory, as given by `resolveStore(projectRoot).jsx.storeDir`.\n * @returns Every bound element, sorted by GLib type name, or an empty array when the store holds no inventory\n * codegen wrote, which covers an absent, unreadable, unparseable and structurally foreign store file alike.\n */\nconst readGeneratedElements = (jsxStoreDir: string): GeneratedElement[] => {\n const parsed = readJsonFile(join(jsxStoreDir, ELEMENTS_FILENAME));\n\n return isGeneratedInventory(parsed) ? parsed : [];\n};\n\nexport {\n ELEMENTS_FILENAME,\n collectGeneratedElements,\n readGeneratedElements,\n renderGeneratedElements,\n type GeneratedElement,\n};\n"]}
|
package/dist/store/jsx/jsx.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { sourceStringLiteral } from "@gtkx/utils";
|
|
1
|
+
import { sanitizeTypeIdentifier, sourceStringLiteral } from "@gtkx/utils";
|
|
2
2
|
import { renderBlock } from "../../writer/emit.js";
|
|
3
3
|
import { getDoc } from "../gi/doc-spec.js";
|
|
4
4
|
import { elementPropTypeFor } from "./element-prop-imports.js";
|
|
@@ -158,7 +158,7 @@ const renderInterfacePropsBlock = (iface, glib, context) => {
|
|
|
158
158
|
}
|
|
159
159
|
const extendsClause = prerequisiteExtends.length === 0 ? "" : ` extends ${prerequisiteExtends.join(", ")}`;
|
|
160
160
|
addGiNamespace(imports, iface.namespace.name, giNamespaceAlias(iface.namespace.name));
|
|
161
|
-
const selfDefault = `${giNamespaceAlias(iface.namespace.name)}.${iface.klass.name}`;
|
|
161
|
+
const selfDefault = `${giNamespaceAlias(iface.namespace.name)}.${sanitizeTypeIdentifier(iface.klass.name)}`;
|
|
162
162
|
const signature = `export interface ${glib}Props<Self = ${selfDefault}>${extendsClause}`;
|
|
163
163
|
const block = `${getDoc(iface.klass)}${renderBlock(signature, ownerLines.join("\n"))}`;
|
|
164
164
|
return { block, objectPropNames };
|
|
@@ -186,7 +186,7 @@ const renderPropBlock = (library, entry, context) => {
|
|
|
186
186
|
const ownerLines = dedupePropLines(["ref?: Ref<Self | null> | undefined;", ...propLines]);
|
|
187
187
|
const extendsList = resolveElementExtends(library, entry, context);
|
|
188
188
|
const extendsClause = extendsList.length === 0 ? "" : ` extends ${extendsList.join(", ")}`;
|
|
189
|
-
const selfDefault = `${giNamespaceAlias(entry.namespace.name)}.${entry.klass.name}`;
|
|
189
|
+
const selfDefault = `${giNamespaceAlias(entry.namespace.name)}.${sanitizeTypeIdentifier(entry.klass.name)}`;
|
|
190
190
|
const block = `${getDoc(entry.klass)}${renderBlock(`export interface ${entry.glibName}Props<Self = ${selfDefault}>${extendsClause}`, ownerLines.join("\n"))}`;
|
|
191
191
|
return { block, objectPropNames };
|
|
192
192
|
};
|