@gtkx/codegen 1.0.0-rc.1 → 1.0.0-rc.3
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/dist/analysis/descriptor-render.d.ts +20 -11
- package/dist/analysis/descriptor-render.d.ts.map +1 -1
- package/dist/analysis/descriptor-render.js +296 -152
- package/dist/analysis/descriptor-render.js.map +1 -1
- package/dist/analysis/descriptor.d.ts +37 -34
- package/dist/analysis/descriptor.d.ts.map +1 -1
- package/dist/analysis/descriptor.js +34 -30
- package/dist/analysis/descriptor.js.map +1 -1
- package/dist/analysis/inheritance.d.ts +16 -16
- package/dist/analysis/inheritance.d.ts.map +1 -1
- package/dist/analysis/inheritance.js +139 -84
- package/dist/analysis/inheritance.js.map +1 -1
- package/dist/analysis/param-structure.d.ts +14 -13
- package/dist/analysis/param-structure.d.ts.map +1 -1
- package/dist/analysis/param-structure.js +104 -53
- package/dist/analysis/param-structure.js.map +1 -1
- package/dist/analysis/ts-type.d.ts +6 -5
- package/dist/analysis/ts-type.d.ts.map +1 -1
- package/dist/analysis/ts-type.js +71 -29
- package/dist/analysis/ts-type.js.map +1 -1
- package/dist/compile.d.ts +5 -5
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +70 -63
- package/dist/compile.js.map +1 -1
- package/dist/docs/api-reference.d.ts +12 -11
- package/dist/docs/api-reference.d.ts.map +1 -1
- package/dist/docs/api-reference.js +192 -123
- package/dist/docs/api-reference.js.map +1 -1
- package/dist/docs/element-page.d.ts +6 -9
- package/dist/docs/element-page.d.ts.map +1 -1
- package/dist/docs/element-page.js +69 -133
- package/dist/docs/element-page.js.map +1 -1
- package/dist/docs/pipeline.d.ts +10 -7
- package/dist/docs/pipeline.d.ts.map +1 -1
- package/dist/docs/pipeline.js +81 -53
- package/dist/docs/pipeline.js.map +1 -1
- package/dist/docs/render.d.ts +21 -19
- package/dist/docs/render.d.ts.map +1 -1
- package/dist/docs/render.js +80 -71
- package/dist/docs/render.js.map +1 -1
- package/dist/docs/symbol-page.d.ts +6 -6
- package/dist/docs/symbol-page.d.ts.map +1 -1
- package/dist/docs/symbol-page.js +126 -84
- package/dist/docs/symbol-page.js.map +1 -1
- package/dist/fingerprint.d.ts +29 -5
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +69 -13
- package/dist/fingerprint.js.map +1 -1
- package/dist/gi.d.ts +18 -0
- package/dist/gi.d.ts.map +1 -0
- package/dist/gi.js +23 -0
- package/dist/gi.js.map +1 -0
- package/dist/gir/ancestry.d.ts +4 -3
- package/dist/gir/ancestry.d.ts.map +1 -1
- package/dist/gir/ancestry.js +12 -15
- package/dist/gir/ancestry.js.map +1 -1
- package/dist/gir/callback.d.ts +6 -11
- package/dist/gir/callback.d.ts.map +1 -1
- package/dist/gir/callback.js +6 -7
- package/dist/gir/callback.js.map +1 -1
- package/dist/gir/class.d.ts +7 -5
- package/dist/gir/class.d.ts.map +1 -1
- package/dist/gir/class.js +14 -12
- package/dist/gir/class.js.map +1 -1
- package/dist/gir/enum.d.ts +3 -3
- package/dist/gir/enum.d.ts.map +1 -1
- package/dist/gir/enum.js +7 -6
- package/dist/gir/enum.js.map +1 -1
- package/dist/gir/field.d.ts +8 -3
- package/dist/gir/field.d.ts.map +1 -1
- package/dist/gir/field.js +30 -7
- package/dist/gir/field.js.map +1 -1
- package/dist/gir/function.d.ts +6 -3
- package/dist/gir/function.d.ts.map +1 -1
- package/dist/gir/function.js +23 -7
- package/dist/gir/function.js.map +1 -1
- package/dist/gir/gir-path.d.ts +2 -1
- package/dist/gir/gir-path.d.ts.map +1 -1
- package/dist/gir/gir-path.js +26 -10
- package/dist/gir/gir-path.js.map +1 -1
- package/dist/gir/libraries.d.ts +5 -3
- package/dist/gir/libraries.d.ts.map +1 -1
- package/dist/gir/libraries.js +41 -28
- package/dist/gir/libraries.js.map +1 -1
- package/dist/gir/library.d.ts +17 -11
- package/dist/gir/library.d.ts.map +1 -1
- package/dist/gir/library.js +116 -92
- package/dist/gir/library.js.map +1 -1
- package/dist/gir/namespace.d.ts +10 -10
- package/dist/gir/namespace.d.ts.map +1 -1
- package/dist/gir/namespace.js +21 -20
- package/dist/gir/namespace.js.map +1 -1
- package/dist/gir/nullable-overrides.d.ts +3 -0
- package/dist/gir/nullable-overrides.d.ts.map +1 -0
- package/dist/gir/nullable-overrides.js +5 -0
- package/dist/gir/nullable-overrides.js.map +1 -0
- package/dist/gir/parameter.d.ts +14 -12
- package/dist/gir/parameter.d.ts.map +1 -1
- package/dist/gir/parameter.js +27 -18
- package/dist/gir/parameter.js.map +1 -1
- package/dist/gir/parse.d.ts +12 -13
- package/dist/gir/parse.d.ts.map +1 -1
- package/dist/gir/parse.js +50 -40
- package/dist/gir/parse.js.map +1 -1
- package/dist/gir/primitives.d.ts +5 -4
- package/dist/gir/primitives.d.ts.map +1 -1
- package/dist/gir/primitives.js +4 -3
- package/dist/gir/primitives.js.map +1 -1
- package/dist/gir/property.d.ts +5 -4
- package/dist/gir/property.d.ts.map +1 -1
- package/dist/gir/property.js +10 -9
- package/dist/gir/property.js.map +1 -1
- package/dist/gir/record.d.ts +5 -4
- package/dist/gir/record.d.ts.map +1 -1
- package/dist/gir/record.js +13 -12
- package/dist/gir/record.js.map +1 -1
- package/dist/gir/size.d.ts +6 -5
- package/dist/gir/size.d.ts.map +1 -1
- package/dist/gir/size.js +49 -47
- package/dist/gir/size.js.map +1 -1
- package/dist/gir/type-id.d.ts +17 -15
- package/dist/gir/type-id.d.ts.map +1 -1
- package/dist/gir/type-id.js +5 -1
- package/dist/gir/type-id.js.map +1 -1
- package/dist/gir/type-ref.d.ts +3 -2
- package/dist/gir/type-ref.d.ts.map +1 -1
- package/dist/gir/type-ref.js +36 -25
- package/dist/gir/type-ref.js.map +1 -1
- package/dist/gir/type.d.ts +3 -2
- package/dist/gir/type.d.ts.map +1 -1
- package/dist/gir/type.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/jsx.d.ts +28 -0
- package/dist/jsx.d.ts.map +1 -0
- package/dist/jsx.js +44 -0
- package/dist/jsx.js.map +1 -0
- package/dist/khronos/args.d.ts +7 -7
- package/dist/khronos/args.d.ts.map +1 -1
- package/dist/khronos/args.js +88 -67
- package/dist/khronos/args.js.map +1 -1
- package/dist/khronos/jsdoc.d.ts +4 -4
- package/dist/khronos/jsdoc.d.ts.map +1 -1
- package/dist/khronos/jsdoc.js +29 -16
- package/dist/khronos/jsdoc.js.map +1 -1
- package/dist/khronos/model.d.ts +8 -7
- package/dist/khronos/model.d.ts.map +1 -1
- package/dist/khronos/model.js +94 -59
- package/dist/khronos/model.js.map +1 -1
- package/dist/khronos/modules.d.ts +4 -3
- package/dist/khronos/modules.d.ts.map +1 -1
- package/dist/khronos/modules.js +40 -25
- package/dist/khronos/modules.js.map +1 -1
- package/dist/khronos/param-pair.d.ts +11 -0
- package/dist/khronos/param-pair.d.ts.map +1 -0
- package/dist/khronos/param-pair.js +6 -0
- package/dist/khronos/param-pair.js.map +1 -0
- package/dist/khronos/parse.d.ts +7 -8
- package/dist/khronos/parse.d.ts.map +1 -1
- package/dist/khronos/parse.js +17 -16
- package/dist/khronos/parse.js.map +1 -1
- package/dist/khronos/pipeline.d.ts +4 -4
- package/dist/khronos/pipeline.d.ts.map +1 -1
- package/dist/khronos/pipeline.js +97 -56
- package/dist/khronos/pipeline.js.map +1 -1
- package/dist/khronos/plan.d.ts +11 -10
- package/dist/khronos/plan.d.ts.map +1 -1
- package/dist/khronos/plan.js +109 -45
- package/dist/khronos/plan.js.map +1 -1
- package/dist/khronos/render.d.ts +5 -4
- package/dist/khronos/render.d.ts.map +1 -1
- package/dist/khronos/render.js +106 -59
- package/dist/khronos/render.js.map +1 -1
- package/dist/khronos/select.d.ts +4 -4
- package/dist/khronos/select.d.ts.map +1 -1
- package/dist/khronos/select.js +30 -19
- package/dist/khronos/select.js.map +1 -1
- package/dist/react/element-config.d.ts +20 -0
- package/dist/react/element-config.d.ts.map +1 -0
- package/dist/react/element-config.js +64 -0
- package/dist/react/element-config.js.map +1 -0
- package/dist/runner.d.ts +19 -10
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +48 -43
- package/dist/runner.js.map +1 -1
- package/dist/store/compile-store.d.ts +5 -3
- package/dist/store/compile-store.d.ts.map +1 -1
- package/dist/store/compile-store.js +24 -22
- package/dist/store/compile-store.js.map +1 -1
- package/dist/store/gi/async.d.ts +2 -1
- package/dist/store/gi/async.d.ts.map +1 -1
- package/dist/store/gi/async.js +28 -24
- package/dist/store/gi/async.js.map +1 -1
- package/dist/store/gi/callables.d.ts +26 -20
- package/dist/store/gi/callables.d.ts.map +1 -1
- package/dist/store/gi/callables.js +157 -100
- package/dist/store/gi/callables.js.map +1 -1
- package/dist/store/gi/callback.d.ts +3 -2
- package/dist/store/gi/callback.d.ts.map +1 -1
- package/dist/store/gi/callback.js +6 -3
- package/dist/store/gi/callback.js.map +1 -1
- package/dist/store/gi/class.d.ts +2 -1
- package/dist/store/gi/class.d.ts.map +1 -1
- package/dist/store/gi/class.js +86 -47
- package/dist/store/gi/class.js.map +1 -1
- package/dist/store/gi/companion.d.ts +2 -1
- package/dist/store/gi/companion.d.ts.map +1 -1
- package/dist/store/gi/companion.js +8 -5
- package/dist/store/gi/companion.js.map +1 -1
- package/dist/store/gi/constant.d.ts +3 -2
- package/dist/store/gi/constant.d.ts.map +1 -1
- package/dist/store/gi/constant.js +25 -8
- package/dist/store/gi/constant.js.map +1 -1
- package/dist/store/gi/constructor-props.d.ts +3 -2
- package/dist/store/gi/constructor-props.d.ts.map +1 -1
- package/dist/store/gi/constructor-props.js +17 -10
- package/dist/store/gi/constructor-props.js.map +1 -1
- package/dist/store/gi/enum.d.ts +3 -2
- package/dist/store/gi/enum.d.ts.map +1 -1
- package/dist/store/gi/enum.js +14 -11
- package/dist/store/gi/enum.js.map +1 -1
- package/dist/store/gi/function.d.ts +5 -4
- package/dist/store/gi/function.d.ts.map +1 -1
- package/dist/store/gi/function.js +48 -23
- package/dist/store/gi/function.js.map +1 -1
- package/dist/store/gi/gtype-binding.d.ts +4 -4
- package/dist/store/gi/gtype-binding.d.ts.map +1 -1
- package/dist/store/gi/gtype-binding.js +15 -11
- package/dist/store/gi/gtype-binding.js.map +1 -1
- package/dist/store/gi/interface.d.ts +2 -1
- package/dist/store/gi/interface.d.ts.map +1 -1
- package/dist/store/gi/interface.js +36 -18
- package/dist/store/gi/interface.js.map +1 -1
- package/dist/store/gi/item-comparators.d.ts +3 -2
- package/dist/store/gi/item-comparators.d.ts.map +1 -1
- package/dist/store/gi/item-comparators.js +33 -21
- package/dist/store/gi/item-comparators.js.map +1 -1
- package/dist/store/gi/method.d.ts +13 -13
- package/dist/store/gi/method.d.ts.map +1 -1
- package/dist/store/gi/method.js +188 -130
- package/dist/store/gi/method.js.map +1 -1
- package/dist/store/gi/param-marshal.d.ts +7 -6
- package/dist/store/gi/param-marshal.d.ts.map +1 -1
- package/dist/store/gi/param-marshal.js +26 -13
- package/dist/store/gi/param-marshal.js.map +1 -1
- package/dist/store/gi/pipeline.d.ts +2 -1
- package/dist/store/gi/pipeline.d.ts.map +1 -1
- package/dist/store/gi/pipeline.js +38 -23
- 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 -4
- package/dist/store/gi/properties.js.map +1 -1
- package/dist/store/gi/property-accessor.d.ts +11 -10
- package/dist/store/gi/property-accessor.d.ts.map +1 -1
- package/dist/store/gi/property-accessor.js +86 -60
- package/dist/store/gi/property-accessor.js.map +1 -1
- package/dist/store/gi/record-constructor.d.ts +3 -2
- package/dist/store/gi/record-constructor.d.ts.map +1 -1
- package/dist/store/gi/record-constructor.js +40 -28
- package/dist/store/gi/record-constructor.js.map +1 -1
- package/dist/store/gi/record-field-accessor.d.ts +9 -8
- package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
- package/dist/store/gi/record-field-accessor.js +187 -99
- package/dist/store/gi/record-field-accessor.js.map +1 -1
- package/dist/store/gi/record-layout.d.ts +6 -5
- package/dist/store/gi/record-layout.d.ts.map +1 -1
- package/dist/store/gi/record-layout.js +75 -39
- package/dist/store/gi/record-layout.js.map +1 -1
- package/dist/store/gi/record.d.ts +2 -1
- package/dist/store/gi/record.d.ts.map +1 -1
- package/dist/store/gi/record.js +15 -16
- package/dist/store/gi/record.js.map +1 -1
- package/dist/store/gi/registration.d.ts +3 -3
- package/dist/store/gi/registration.d.ts.map +1 -1
- package/dist/store/gi/registration.js +3 -2
- package/dist/store/gi/registration.js.map +1 -1
- package/dist/store/gi/return-wrap.d.ts +2 -2
- package/dist/store/gi/return-wrap.d.ts.map +1 -1
- package/dist/store/gi/return-wrap.js +43 -22
- package/dist/store/gi/return-wrap.js.map +1 -1
- package/dist/store/gi/runtime-override.d.ts +2 -1
- package/dist/store/gi/runtime-override.d.ts.map +1 -1
- package/dist/store/gi/runtime-override.js +6 -3
- package/dist/store/gi/runtime-override.js.map +1 -1
- package/dist/store/gi/signal.d.ts +3 -2
- package/dist/store/gi/signal.d.ts.map +1 -1
- package/dist/store/gi/signal.js +113 -66
- package/dist/store/gi/signal.js.map +1 -1
- package/dist/store/gi/value-marshalable.d.ts +15 -0
- package/dist/store/gi/value-marshalable.d.ts.map +1 -0
- package/dist/store/gi/value-marshalable.js +66 -0
- package/dist/store/gi/value-marshalable.js.map +1 -0
- package/dist/store/gi/vtable.d.ts +2 -1
- package/dist/store/gi/vtable.d.ts.map +1 -1
- package/dist/store/gi/vtable.js +60 -30
- package/dist/store/gi/vtable.js.map +1 -1
- package/dist/store/gi-store.d.ts +5 -4
- package/dist/store/gi-store.d.ts.map +1 -1
- package/dist/store/gi-store.js +4 -2
- package/dist/store/gi-store.js.map +1 -1
- package/dist/store/jsx/element-components.d.ts +23 -0
- package/dist/store/jsx/element-components.d.ts.map +1 -0
- package/dist/store/jsx/element-components.js +86 -0
- package/dist/store/jsx/element-components.js.map +1 -0
- package/dist/store/jsx/element-prop-imports.d.ts +17 -0
- package/dist/store/jsx/element-prop-imports.d.ts.map +1 -0
- package/dist/store/jsx/element-prop-imports.js +15 -0
- package/dist/store/jsx/element-prop-imports.js.map +1 -0
- package/dist/store/jsx/element-prop-types.d.ts +10 -0
- package/dist/store/jsx/element-prop-types.d.ts.map +1 -0
- package/dist/store/jsx/element-prop-types.js +41 -0
- package/dist/store/jsx/element-prop-types.js.map +1 -0
- package/dist/store/jsx/gir-index.d.ts +16 -0
- package/dist/store/jsx/gir-index.d.ts.map +1 -0
- package/dist/store/jsx/gir-index.js +33 -0
- package/dist/store/jsx/gir-index.js.map +1 -0
- package/dist/store/jsx/intrinsic-elements.d.ts +26 -0
- package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -0
- package/dist/store/jsx/intrinsic-elements.js +127 -0
- package/dist/store/jsx/intrinsic-elements.js.map +1 -0
- package/dist/store/{react → jsx}/jsx.d.ts +2 -4
- package/dist/store/jsx/jsx.d.ts.map +1 -0
- package/dist/store/{react → jsx}/jsx.js +110 -71
- package/dist/store/jsx/jsx.js.map +1 -0
- package/dist/store/jsx/metadata.d.ts +4 -0
- package/dist/store/jsx/metadata.d.ts.map +1 -0
- package/dist/store/{react → jsx}/metadata.js +148 -69
- package/dist/store/jsx/metadata.js.map +1 -0
- package/dist/store/jsx/omitted-props.d.ts +10 -0
- package/dist/store/jsx/omitted-props.d.ts.map +1 -0
- package/dist/store/jsx/omitted-props.js +22 -0
- package/dist/store/jsx/omitted-props.js.map +1 -0
- package/dist/store/jsx/pipeline.d.ts +23 -0
- package/dist/store/jsx/pipeline.d.ts.map +1 -0
- package/dist/store/{react → jsx}/pipeline.js +38 -15
- package/dist/store/jsx/pipeline.js.map +1 -0
- package/dist/store/{react → jsx}/props.d.ts +9 -12
- package/dist/store/jsx/props.d.ts.map +1 -0
- package/dist/store/jsx/props.js +153 -0
- package/dist/store/jsx/props.js.map +1 -0
- package/dist/store/jsx-store.d.ts +5 -3
- package/dist/store/jsx-store.d.ts.map +1 -1
- package/dist/store/jsx-store.js +4 -1
- package/dist/store/jsx-store.js.map +1 -1
- package/dist/store/store-fs.d.ts +14 -12
- package/dist/store/store-fs.d.ts.map +1 -1
- package/dist/store/store-fs.js +9 -7
- package/dist/store/store-fs.js.map +1 -1
- package/dist/writer/context.d.ts +2 -1
- package/dist/writer/context.d.ts.map +1 -1
- package/dist/writer/context.js +12 -6
- package/dist/writer/context.js.map +1 -1
- package/dist/writer/doc.d.ts +2 -1
- package/dist/writer/doc.d.ts.map +1 -1
- package/dist/writer/doc.js +13 -7
- package/dist/writer/doc.js.map +1 -1
- package/dist/writer/emit.d.ts +8 -7
- package/dist/writer/emit.d.ts.map +1 -1
- package/dist/writer/emit.js +13 -10
- package/dist/writer/emit.js.map +1 -1
- package/dist/writer/gtk-doc.d.ts +2 -1
- package/dist/writer/gtk-doc.d.ts.map +1 -1
- package/dist/writer/gtk-doc.js +29 -18
- package/dist/writer/gtk-doc.js.map +1 -1
- package/dist/writer/imports.d.ts +4 -2
- package/dist/writer/imports.d.ts.map +1 -1
- package/dist/writer/imports.js +35 -24
- package/dist/writer/imports.js.map +1 -1
- package/dist/writer/module.d.ts +3 -2
- package/dist/writer/module.d.ts.map +1 -1
- package/dist/writer/module.js +16 -9
- package/dist/writer/module.js.map +1 -1
- package/dist/xml.d.ts +4 -0
- package/dist/xml.d.ts.map +1 -0
- package/dist/xml.js +10 -0
- package/dist/xml.js.map +1 -0
- package/overrides/cairo/context.ts.ejs +7 -7
- package/overrides/cairo/matrix.ts.ejs +2 -2
- package/overrides/cairo/recording-surface.ts.ejs +2 -2
- package/overrides/cairo/region.ts.ejs +1 -1
- package/overrides/cairo/scaled-font.ts.ejs +3 -3
- package/package.json +14 -9
- package/src/analysis/descriptor-render.ts +516 -168
- package/src/analysis/descriptor.ts +162 -125
- package/src/analysis/inheritance.ts +286 -98
- package/src/analysis/param-structure.ts +188 -57
- package/src/analysis/ts-type.ts +113 -34
- package/src/compile.ts +103 -76
- package/src/docs/api-reference.ts +337 -146
- package/src/docs/element-page.ts +137 -150
- package/src/docs/pipeline.ts +135 -73
- package/src/docs/render.ts +151 -87
- package/src/docs/symbol-page.ts +268 -123
- package/src/fingerprint.ts +138 -26
- package/src/gi.ts +35 -0
- package/src/gir/ancestry.ts +26 -14
- package/src/gir/callback.ts +10 -15
- package/src/gir/class.ts +20 -16
- package/src/gir/enum.ts +9 -7
- package/src/gir/field.ts +37 -8
- package/src/gir/function.ts +33 -9
- package/src/gir/gir-path.ts +36 -12
- package/src/gir/libraries.ts +59 -33
- package/src/gir/library.ts +200 -97
- package/src/gir/namespace.ts +42 -26
- package/src/gir/nullable-overrides.ts +5 -0
- package/src/gir/parameter.ts +80 -42
- package/src/gir/parse.ts +102 -47
- package/src/gir/primitives.ts +25 -23
- package/src/gir/property.ts +13 -11
- package/src/gir/record.ts +16 -14
- package/src/gir/size.ts +91 -58
- package/src/gir/type-id.ts +33 -18
- package/src/gir/type-ref.ts +62 -26
- package/src/gir/type.ts +10 -8
- package/src/index.ts +8 -0
- package/src/jsx.ts +75 -0
- package/src/khronos/args.ts +158 -89
- package/src/khronos/jsdoc.ts +67 -29
- package/src/khronos/model.ts +154 -53
- package/src/khronos/modules.ts +67 -27
- package/src/khronos/param-pair.ts +14 -0
- package/src/khronos/parse.ts +37 -17
- package/src/khronos/pipeline.ts +193 -90
- package/src/khronos/plan.ts +235 -86
- package/src/khronos/render.ts +208 -71
- package/src/khronos/select.ts +48 -18
- package/src/react/element-config.ts +97 -0
- package/src/runner.ts +100 -57
- package/src/store/compile-store.ts +32 -26
- package/src/store/gi/async.ts +48 -21
- package/src/store/gi/callables.ts +339 -136
- package/src/store/gi/callback.ts +13 -4
- package/src/store/gi/class.ts +186 -64
- package/src/store/gi/companion.ts +15 -6
- package/src/store/gi/constant.ts +42 -8
- package/src/store/gi/constructor-props.ts +42 -16
- package/src/store/gi/enum.ts +28 -13
- package/src/store/gi/function.ts +88 -24
- package/src/store/gi/gtype-binding.ts +31 -18
- package/src/store/gi/interface.ts +101 -36
- package/src/store/gi/item-comparators.ts +74 -26
- package/src/store/gi/method.ts +377 -159
- package/src/store/gi/param-marshal.ts +38 -15
- package/src/store/gi/pipeline.ts +72 -22
- package/src/store/gi/properties.ts +16 -5
- package/src/store/gi/property-accessor.ts +192 -84
- package/src/store/gi/record-constructor.ts +70 -33
- package/src/store/gi/record-field-accessor.ts +415 -167
- package/src/store/gi/record-layout.ts +130 -43
- package/src/store/gi/record.ts +29 -15
- package/src/store/gi/registration.ts +15 -9
- package/src/store/gi/return-wrap.ts +71 -23
- package/src/store/gi/runtime-override.ts +13 -3
- package/src/store/gi/signal.ts +244 -104
- package/src/store/gi/value-marshalable.ts +96 -0
- package/src/store/gi/vtable.ts +117 -41
- package/src/store/gi-store.ts +26 -13
- package/src/store/jsx/element-components.ts +152 -0
- package/src/store/jsx/element-prop-imports.ts +24 -0
- package/src/store/jsx/element-prop-types.ts +59 -0
- package/src/store/jsx/gir-index.ts +62 -0
- package/src/store/jsx/intrinsic-elements.ts +253 -0
- package/src/store/{react → jsx}/jsx.ts +213 -99
- package/src/store/jsx/metadata.ts +385 -0
- package/src/store/jsx/omitted-props.ts +32 -0
- package/src/store/jsx/pipeline.ts +148 -0
- package/src/store/jsx/props.ts +262 -0
- package/src/store/jsx-store.ts +15 -3
- package/src/store/store-fs.ts +36 -20
- package/src/writer/context.ts +25 -6
- package/src/writer/doc.ts +19 -5
- package/src/writer/emit.ts +20 -11
- package/src/writer/gtk-doc.ts +48 -21
- package/src/writer/imports.ts +63 -28
- package/src/writer/module.ts +35 -11
- package/src/xml.ts +12 -0
- package/dist/store/gi/class-struct-record.d.ts +0 -9
- package/dist/store/gi/class-struct-record.d.ts.map +0 -1
- package/dist/store/gi/class-struct-record.js +0 -34
- package/dist/store/gi/class-struct-record.js.map +0 -1
- package/dist/store/react/built-ins.d.ts +0 -9
- package/dist/store/react/built-ins.d.ts.map +0 -1
- package/dist/store/react/built-ins.js +0 -226
- package/dist/store/react/built-ins.js.map +0 -1
- package/dist/store/react/element-components.d.ts +0 -15
- package/dist/store/react/element-components.d.ts.map +0 -1
- package/dist/store/react/element-components.js +0 -92
- package/dist/store/react/element-components.js.map +0 -1
- package/dist/store/react/element-prop-types.d.ts +0 -19
- package/dist/store/react/element-prop-types.d.ts.map +0 -1
- package/dist/store/react/element-prop-types.js +0 -244
- package/dist/store/react/element-prop-types.js.map +0 -1
- package/dist/store/react/element-props.d.ts +0 -4
- package/dist/store/react/element-props.d.ts.map +0 -1
- package/dist/store/react/element-props.js +0 -178
- package/dist/store/react/element-props.js.map +0 -1
- package/dist/store/react/gir-index.d.ts +0 -25
- package/dist/store/react/gir-index.d.ts.map +0 -1
- package/dist/store/react/gir-index.js +0 -55
- package/dist/store/react/gir-index.js.map +0 -1
- package/dist/store/react/intrinsic-elements.d.ts +0 -26
- package/dist/store/react/intrinsic-elements.d.ts.map +0 -1
- package/dist/store/react/intrinsic-elements.js +0 -107
- package/dist/store/react/intrinsic-elements.js.map +0 -1
- package/dist/store/react/jsx.d.ts.map +0 -1
- package/dist/store/react/jsx.js.map +0 -1
- package/dist/store/react/metadata.d.ts +0 -4
- package/dist/store/react/metadata.d.ts.map +0 -1
- package/dist/store/react/metadata.js.map +0 -1
- package/dist/store/react/pipeline.d.ts +0 -14
- package/dist/store/react/pipeline.d.ts.map +0 -1
- package/dist/store/react/pipeline.js.map +0 -1
- package/dist/store/react/props.d.ts.map +0 -1
- package/dist/store/react/props.js +0 -133
- package/dist/store/react/props.js.map +0 -1
- package/overrides/gtk/constants.ts.ejs +0 -3
- package/overrides/gtk/index.ts.ejs +0 -2
- package/src/store/gi/class-struct-record.ts +0 -40
- package/src/store/react/built-ins.ts +0 -260
- package/src/store/react/element-components.ts +0 -138
- package/src/store/react/element-prop-types.ts +0 -280
- package/src/store/react/element-props.ts +0 -204
- package/src/store/react/gir-index.ts +0 -85
- package/src/store/react/intrinsic-elements.ts +0 -161
- package/src/store/react/metadata.ts +0 -197
- package/src/store/react/pipeline.ts +0 -90
- package/src/store/react/props.ts +0 -197
package/src/store/gi/signal.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { camelCase, sourceStringLiteral } from "@gtkx/utils";
|
|
2
|
+
import type { GirClass } from "../../gir/class.js";
|
|
3
|
+
import type { GirCallable, GirParameter } from "../../gir/parameter.js";
|
|
4
|
+
import type { GirProperty } from "../../gir/property.js";
|
|
5
|
+
import type { ModuleContext } from "../../writer/context.js";
|
|
3
6
|
import {
|
|
4
7
|
isCellInout,
|
|
5
|
-
omitsPrimaryReturn,
|
|
6
8
|
renderDescriptor,
|
|
7
9
|
renderParamDescriptor,
|
|
10
|
+
shouldOmitPrimaryReturn,
|
|
8
11
|
} from "../../analysis/descriptor-render.js";
|
|
12
|
+
import { tCallback, tObject, tVoid } from "../../analysis/descriptor.js";
|
|
9
13
|
import {
|
|
10
14
|
collectInterfaceProperties,
|
|
11
15
|
forEachAncestor,
|
|
@@ -14,60 +18,84 @@ import {
|
|
|
14
18
|
} from "../../analysis/inheritance.js";
|
|
15
19
|
import { renderHandlerParameters, renderHandlerResultType } from "../../analysis/param-structure.js";
|
|
16
20
|
import { renderTsType } from "../../analysis/ts-type.js";
|
|
17
|
-
import type { GirClass } from "../../gir/class.js";
|
|
18
|
-
import type { GirParameter, GirSignal } from "../../gir/parameter.js";
|
|
19
21
|
import { isCallerAllocatedOut, isOutParameter } from "../../gir/parameter.js";
|
|
20
|
-
import type { GirProperty } from "../../gir/property.js";
|
|
21
|
-
import type { ModuleContext } from "../../writer/context.js";
|
|
22
22
|
import { renderJsDoc } from "../../writer/doc.js";
|
|
23
23
|
import { indent, renderBlock, renderBracedOrEmpty } from "../../writer/emit.js";
|
|
24
24
|
import { parentCompanionRef } from "./companion.js";
|
|
25
25
|
import { isRecordCallerOut, isRecordInout } from "./param-marshal.js";
|
|
26
26
|
|
|
27
|
+
type SignalMapSpec = {
|
|
28
|
+
context: ModuleContext;
|
|
29
|
+
klass: GirClass;
|
|
30
|
+
className: string;
|
|
31
|
+
parentlessExtendsObject: boolean;
|
|
32
|
+
suffix: string;
|
|
33
|
+
renderEntry: (context: ModuleContext, signal: GirCallable) => string;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
type EmitArgOptions = {
|
|
37
|
+
context: ModuleContext;
|
|
38
|
+
parameter: GirParameter;
|
|
39
|
+
descriptor: string;
|
|
40
|
+
argIndex: number;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
type NamedMember = { name: string };
|
|
44
|
+
|
|
27
45
|
const SIGNAL_HANDLER_TYPE = "(...args: any[]) => any";
|
|
46
|
+
const SIGNALS_SUFFIX = "Signals";
|
|
47
|
+
const SIGNAL_EMIT_SUFFIX = "SignalEmit";
|
|
48
|
+
|
|
49
|
+
const renderSignalMembers = (context: ModuleContext, klass: GirClass): string[] => {
|
|
50
|
+
if (klass.glibGetType === undefined) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
28
53
|
|
|
29
|
-
export const renderSignalMembers = (context: ModuleContext, klass: GirClass): string[] => {
|
|
30
|
-
if (klass.glibGetType === undefined) return [];
|
|
31
54
|
const signals = collectClassSignals(context, klass);
|
|
32
|
-
if (signals.length === 0) return [];
|
|
33
|
-
const isRootObject = context.namespace.name === "GObject" && klass.name === "Object";
|
|
34
55
|
|
|
56
|
+
if (signals.length === 0) {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const isRootObject = context.namespace.name === "GObject" && klass.name === "Object";
|
|
35
61
|
context.addRuntimeImport("connectSignal");
|
|
36
62
|
context.addRuntimeImport("getSignalBaseName");
|
|
37
63
|
context.addRuntimeImport("t");
|
|
38
|
-
|
|
39
64
|
const connectCases = signals.map((signal) => renderConnectCase(context, signal));
|
|
40
65
|
const emitCases = signals.map((signal) => renderEmitCase(context, signal));
|
|
66
|
+
|
|
41
67
|
const connectDefault = isRootObject
|
|
42
|
-
?
|
|
68
|
+
? "default:\n throw new globalThis.Error(\"Unknown signal '\" + signal + \"'\");"
|
|
43
69
|
: "default:\n return super.connect(signal, handler, after);";
|
|
70
|
+
|
|
44
71
|
const emitDefault = isRootObject
|
|
45
|
-
?
|
|
72
|
+
? "default:\n throw new globalThis.Error(\"Unknown signal '\" + sigName + \"'\");"
|
|
46
73
|
: "default:\n return super.emit(sigName, ...args);";
|
|
47
74
|
|
|
48
|
-
const
|
|
49
|
-
const
|
|
75
|
+
const connectBody = indent([...connectCases, connectDefault].join("\n"), 1);
|
|
76
|
+
const connectSwitch = `switch (getSignalBaseName(signal)) {\n${connectBody}\n}`;
|
|
77
|
+
const emitBody = indent([...emitCases, emitDefault].join("\n"), 1);
|
|
78
|
+
const emitSwitch = `switch (getSignalBaseName(sigName)) {\n${emitBody}\n}`;
|
|
50
79
|
|
|
51
80
|
return [
|
|
52
81
|
renderBlock(`connect(signal: string, handler: ${SIGNAL_HANDLER_TYPE}, after?: boolean): number`, connectSwitch),
|
|
53
|
-
renderBlock(
|
|
82
|
+
renderBlock("emit(sigName: string, ...args: unknown[]): unknown", emitSwitch),
|
|
54
83
|
];
|
|
55
84
|
};
|
|
56
85
|
|
|
57
|
-
const
|
|
58
|
-
const SIGNAL_EMIT_SUFFIX = "SignalEmit";
|
|
59
|
-
|
|
60
|
-
export const renderSignalDeclarations = (
|
|
86
|
+
const renderSignalDeclarations = (
|
|
61
87
|
context: ModuleContext,
|
|
62
88
|
klass: GirClass,
|
|
63
89
|
className: string,
|
|
64
|
-
|
|
90
|
+
isParentlessObjectSubclass: boolean,
|
|
65
91
|
): string[] => {
|
|
66
|
-
const base = { context, klass, className, parentlessExtendsObject };
|
|
92
|
+
const base = { context, klass, className, parentlessExtendsObject: isParentlessObjectSubclass };
|
|
93
|
+
|
|
67
94
|
const declarations = [
|
|
68
95
|
renderSignalMap({ ...base, suffix: SIGNALS_SUFFIX, renderEntry: renderSignalHandlerType }),
|
|
69
96
|
renderSignalMap({ ...base, suffix: SIGNAL_EMIT_SUFFIX, renderEntry: renderSignalEmitEntry }),
|
|
70
97
|
];
|
|
98
|
+
|
|
71
99
|
if (
|
|
72
100
|
klass.glibGetType !== undefined &&
|
|
73
101
|
(collectClassSignals(context, klass).length > 0 ||
|
|
@@ -77,62 +105,76 @@ export const renderSignalDeclarations = (
|
|
|
77
105
|
const isRootObject = context.namespace.name === "GObject" && klass.name === "Object";
|
|
78
106
|
declarations.push(renderSignalConnectInterface(className, isRootObject));
|
|
79
107
|
}
|
|
80
|
-
return declarations;
|
|
81
|
-
};
|
|
82
108
|
|
|
83
|
-
|
|
84
|
-
context: ModuleContext;
|
|
85
|
-
klass: GirClass;
|
|
86
|
-
className: string;
|
|
87
|
-
parentlessExtendsObject: boolean;
|
|
88
|
-
suffix: string;
|
|
89
|
-
renderEntry: (context: ModuleContext, signal: GirSignal) => string;
|
|
109
|
+
return declarations;
|
|
90
110
|
};
|
|
91
111
|
|
|
92
112
|
const renderSignalMap = (spec: SignalMapSpec): string => {
|
|
93
113
|
const { context, klass, className, parentlessExtendsObject, suffix, renderEntry } = spec;
|
|
94
114
|
const extendsRefs = signalMapParentRefs(context, klass, parentlessExtendsObject, suffix);
|
|
95
115
|
const extendsClause = extendsRefs.length === 0 ? "" : ` extends ${extendsRefs.join(", ")}`;
|
|
116
|
+
|
|
96
117
|
const signalEntries = collectClassSignals(context, klass).map((signal) => {
|
|
97
118
|
const entry = `${sourceStringLiteral(signal.name)}: ${renderEntry(context, signal)};`;
|
|
119
|
+
|
|
98
120
|
return suffix === SIGNALS_SUFFIX ? `${renderJsDoc(signal.doc)}${entry}` : entry;
|
|
99
121
|
});
|
|
122
|
+
|
|
100
123
|
const entries = [...signalEntries, ...renderNotifyDetailEntries(context, klass, suffix)];
|
|
124
|
+
|
|
101
125
|
return renderBracedOrEmpty(`export interface ${className}${suffix}${extendsClause}`, entries.join("\n"));
|
|
102
126
|
};
|
|
103
127
|
|
|
104
128
|
const renderNotifyDetailEntries = (context: ModuleContext, klass: GirClass, suffix: string): string[] => {
|
|
105
129
|
const notifyValue = `${gobjectObjectMapRef(context, suffix)}["notify"]`;
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
130
|
+
|
|
131
|
+
return collectNotifyDetails(context, klass).map((name) => {
|
|
132
|
+
const detailedSignal = `notify::${name}`;
|
|
133
|
+
|
|
134
|
+
return `${sourceStringLiteral(detailedSignal)}: ${notifyValue};`;
|
|
135
|
+
});
|
|
109
136
|
};
|
|
110
137
|
|
|
111
138
|
const signalMapParentRefs = (
|
|
112
139
|
context: ModuleContext,
|
|
113
140
|
klass: GirClass,
|
|
114
|
-
|
|
141
|
+
isParentlessObjectSubclass: boolean,
|
|
115
142
|
suffix: string,
|
|
116
143
|
): string[] => {
|
|
117
144
|
const parentRef = parentCompanionRef(context, klass, suffix);
|
|
118
|
-
|
|
119
|
-
if (
|
|
145
|
+
|
|
146
|
+
if (parentRef !== undefined) {
|
|
147
|
+
return [parentRef];
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (!isParentlessObjectSubclass) {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
|
|
120
154
|
const prerequisiteRefs = klass.prerequisites
|
|
121
155
|
.map((name) => resolvePrerequisiteReference(context, name))
|
|
122
156
|
.filter((entry): entry is string => entry !== undefined)
|
|
123
157
|
.map((entry) => `${entry}${suffix}`);
|
|
124
|
-
|
|
158
|
+
|
|
159
|
+
if (prerequisiteRefs.length > 0) {
|
|
160
|
+
return prerequisiteRefs;
|
|
161
|
+
}
|
|
162
|
+
|
|
125
163
|
return [gobjectObjectMapRef(context, suffix)];
|
|
126
164
|
};
|
|
127
165
|
|
|
128
166
|
const gobjectObjectMapRef = (context: ModuleContext, suffix: string): string => {
|
|
129
|
-
if (context.namespace.name === "GObject")
|
|
167
|
+
if (context.namespace.name === "GObject") {
|
|
168
|
+
return `Object${suffix}`;
|
|
169
|
+
}
|
|
170
|
+
|
|
130
171
|
return `${context.addCrossNamespaceImport("GObject")}.Object${suffix}`;
|
|
131
172
|
};
|
|
132
173
|
|
|
133
174
|
const renderSignalConnectInterface = (className: string, isRootObject: boolean): string => {
|
|
134
175
|
const map = `${className}${SIGNALS_SUFFIX}`;
|
|
135
176
|
const emitMap = `${className}${SIGNAL_EMIT_SUFFIX}`;
|
|
177
|
+
|
|
136
178
|
const lines = [
|
|
137
179
|
`__signals__?: ${map};`,
|
|
138
180
|
`connect<K extends keyof ${map}>(signal: K, handler: ${map}[K], after?: boolean): number;`,
|
|
@@ -140,94 +182,133 @@ const renderSignalConnectInterface = (className: string, isRootObject: boolean):
|
|
|
140
182
|
`emit<K extends keyof ${emitMap}>(sigName: K, ...args: ${emitMap}[K]["args"]): ${emitMap}[K]["result"];`,
|
|
141
183
|
"emit(sigName: string, ...args: unknown[]): unknown;",
|
|
142
184
|
];
|
|
185
|
+
|
|
143
186
|
if (!isRootObject) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
}
|
|
187
|
+
const chainable = (methods: string[], trailing: string): void => {
|
|
188
|
+
for (const method of methods) {
|
|
189
|
+
lines.push(
|
|
190
|
+
`${method}<K extends keyof ${map}>(signal: K, handler: ${map}[K]${trailing}): this;`,
|
|
191
|
+
`${method}(signal: string, handler: ${SIGNAL_HANDLER_TYPE}${trailing}): this;`,
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
chainable(["on", "once", "addEventListener"], ", after?: boolean");
|
|
197
|
+
chainable(["off", "removeEventListener"], "");
|
|
156
198
|
}
|
|
199
|
+
|
|
157
200
|
return renderBracedOrEmpty(`export interface ${className}`, lines.join("\n"));
|
|
158
201
|
};
|
|
159
202
|
|
|
160
|
-
const renderSignalHandlerType = (context: ModuleContext, signal:
|
|
203
|
+
const renderSignalHandlerType = (context: ModuleContext, signal: GirCallable): string => {
|
|
161
204
|
const params = renderHandlerParameters(signal.parameters, (ref, nullable) => renderTsType(context, ref, nullable));
|
|
205
|
+
|
|
162
206
|
return `(${params.join(", ")}) => ${renderResultType(context, signal, false, true)}`;
|
|
163
207
|
};
|
|
164
208
|
|
|
165
209
|
const renderResultType = (
|
|
166
210
|
context: ModuleContext,
|
|
167
|
-
signal:
|
|
168
|
-
|
|
169
|
-
|
|
211
|
+
signal: GirCallable,
|
|
212
|
+
shouldIncludeCallerAllocated: boolean,
|
|
213
|
+
isOptOut: boolean,
|
|
170
214
|
): string =>
|
|
171
215
|
renderHandlerResultType({
|
|
172
216
|
library: context.library,
|
|
173
217
|
signal,
|
|
174
218
|
renderType: (ref, nullable) => renderTsType(context, ref, nullable),
|
|
175
|
-
includeCallerAllocated,
|
|
176
|
-
optOut,
|
|
219
|
+
includeCallerAllocated: shouldIncludeCallerAllocated,
|
|
220
|
+
optOut: isOptOut,
|
|
177
221
|
});
|
|
178
222
|
|
|
179
|
-
const renderSignalEmitEntry = (context: ModuleContext, signal:
|
|
223
|
+
const renderSignalEmitEntry = (context: ModuleContext, signal: GirCallable): string => {
|
|
180
224
|
const args = renderHandlerParameters(
|
|
181
225
|
signal.parameters,
|
|
182
226
|
(ref, nullable) => renderTsType(context, ref, nullable),
|
|
183
227
|
isCallerAllocatedOut,
|
|
184
228
|
);
|
|
229
|
+
|
|
185
230
|
const result = renderResultType(context, signal, true, false);
|
|
231
|
+
|
|
186
232
|
return `{ args: [${args.join(", ")}]; result: ${result} }`;
|
|
187
233
|
};
|
|
188
234
|
|
|
189
|
-
const
|
|
235
|
+
const nonVarargParameters = (signal: GirCallable): GirParameter[] =>
|
|
236
|
+
signal.parameters.filter((parameter) => !parameter.isVarargs);
|
|
237
|
+
|
|
238
|
+
const renderConnectCase = (context: ModuleContext, signal: GirCallable): string => {
|
|
190
239
|
const callback = renderCallback(context, signal);
|
|
191
240
|
const body = `return connectSignal(this, signal, { callback: ${callback}, handler, after: after ?? false });`;
|
|
241
|
+
|
|
192
242
|
return renderBlock(`case ${sourceStringLiteral(signal.name)}:`, body);
|
|
193
243
|
};
|
|
194
244
|
|
|
195
|
-
const
|
|
196
|
-
const
|
|
245
|
+
const renderEmitArgLiteral = (options: EmitArgOptions): { literal: string; nextArgIndex: number } => {
|
|
246
|
+
const { context, parameter, descriptor, argIndex } = options;
|
|
247
|
+
|
|
248
|
+
if (isOutParameter(parameter)) {
|
|
249
|
+
return { literal: `{ type: ${descriptor}, direction: "out" }`, nextArgIndex: argIndex };
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (isCellInout(context.library, parameter)) {
|
|
253
|
+
return {
|
|
254
|
+
literal: `{ type: ${descriptor}, direction: "inout", value: args[${String(argIndex)}] }`,
|
|
255
|
+
nextArgIndex: argIndex + 1,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if (isCallerAllocatedOut(parameter)) {
|
|
260
|
+
const value = renderCallerOutAllocation(context, parameter);
|
|
261
|
+
|
|
262
|
+
return {
|
|
263
|
+
literal: `{ type: ${descriptor}, direction: "out", callerAllocated: true, value: ${value} }`,
|
|
264
|
+
nextArgIndex: argIndex,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (isRecordInout(context, parameter)) {
|
|
269
|
+
return {
|
|
270
|
+
literal:
|
|
271
|
+
`{ type: ${descriptor}, direction: "inout", callerAllocated: true, ` +
|
|
272
|
+
`value: args[${String(argIndex)}] }`,
|
|
273
|
+
nextArgIndex: argIndex + 1,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return { literal: `{ type: ${descriptor}, value: args[${String(argIndex)}] }`, nextArgIndex: argIndex + 1 };
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
const renderEmitCase = (context: ModuleContext, signal: GirCallable): string => {
|
|
281
|
+
const params = nonVarargParameters(signal);
|
|
282
|
+
|
|
197
283
|
if (params.some((parameter) => isCallerAllocatedOut(parameter) && !isRecordCallerOut(context, parameter))) {
|
|
198
284
|
return renderUnsupportedEmitCase(signal);
|
|
199
285
|
}
|
|
200
|
-
context.addRuntimeImport("emitSignal");
|
|
201
286
|
|
|
287
|
+
context.addRuntimeImport("emitSignal");
|
|
202
288
|
let argIndex = 0;
|
|
289
|
+
|
|
203
290
|
const argLiterals = params.map((parameter) => {
|
|
204
291
|
const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership);
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
return `{ type: ${descriptor}, direction: "inout", value: args[${argIndex++}] }`;
|
|
210
|
-
}
|
|
211
|
-
if (isCallerAllocatedOut(parameter)) {
|
|
212
|
-
return `{ type: ${descriptor}, direction: "out", callerAllocated: true, value: ${renderCallerOutAllocation(context, parameter)} }`;
|
|
213
|
-
}
|
|
214
|
-
if (isRecordInout(context, parameter)) {
|
|
215
|
-
return `{ type: ${descriptor}, direction: "inout", callerAllocated: true, value: args[${argIndex++}] }`;
|
|
216
|
-
}
|
|
217
|
-
return `{ type: ${descriptor}, value: args[${argIndex++}] }`;
|
|
292
|
+
const rendered = renderEmitArgLiteral({ context, parameter, descriptor, argIndex });
|
|
293
|
+
argIndex = rendered.nextArgIndex;
|
|
294
|
+
|
|
295
|
+
return rendered.literal;
|
|
218
296
|
});
|
|
219
297
|
|
|
220
|
-
const isVoid =
|
|
298
|
+
const isVoid = shouldOmitPrimaryReturn(context.library, signal.returnValue);
|
|
299
|
+
|
|
221
300
|
const returnArg = isVoid
|
|
222
301
|
? ""
|
|
223
302
|
: `, ${renderDescriptor(context, signal.returnValue.type, signal.returnValue.transferOwnership)}`;
|
|
303
|
+
|
|
224
304
|
const body = `return emitSignal(this, sigName, [${argLiterals.join(", ")}]${returnArg});`;
|
|
225
305
|
|
|
226
306
|
return renderBlock(`case ${sourceStringLiteral(signal.name)}:`, body);
|
|
227
307
|
};
|
|
228
308
|
|
|
229
|
-
const renderUnsupportedEmitCase = (signal:
|
|
309
|
+
const renderUnsupportedEmitCase = (signal: GirCallable): string => {
|
|
230
310
|
const message = `emit() cannot allocate the caller-allocated out-parameter of '${signal.name}'`;
|
|
311
|
+
|
|
231
312
|
return renderBlock(
|
|
232
313
|
`case ${sourceStringLiteral(signal.name)}:`,
|
|
233
314
|
`throw new globalThis.Error(${sourceStringLiteral(message)});`,
|
|
@@ -235,59 +316,104 @@ const renderUnsupportedEmitCase = (signal: GirSignal): string => {
|
|
|
235
316
|
};
|
|
236
317
|
|
|
237
318
|
const renderCallerOutAllocation = (context: ModuleContext, parameter: GirParameter): string => {
|
|
238
|
-
const name = parameter.type === undefined ? undefined : context.library.
|
|
319
|
+
const name = parameter.type === undefined ? undefined : context.library.nameFor(parameter.type);
|
|
320
|
+
|
|
239
321
|
if (name === undefined) {
|
|
240
322
|
throw new Error("renderCallerOutAllocation: expected a named caller-allocated out-parameter");
|
|
241
323
|
}
|
|
324
|
+
|
|
242
325
|
return `new ${context.qualify(name.namespaceName, name.typeName)}()`;
|
|
243
326
|
};
|
|
244
327
|
|
|
245
|
-
const renderCallback = (context: ModuleContext, signal:
|
|
246
|
-
const params = signal
|
|
328
|
+
const renderCallback = (context: ModuleContext, signal: GirCallable): string => {
|
|
329
|
+
const params = nonVarargParameters(signal);
|
|
330
|
+
|
|
331
|
+
// The emitted argument list prepends the instance the signal was raised on, so every index a
|
|
332
|
+
// parameter descriptor carries (an array's `sizeParamIndex`, above all) sits one slot further
|
|
333
|
+
// right than the position GIR assigned it.
|
|
247
334
|
const callbackParamDescriptors = params.map((parameter) =>
|
|
248
|
-
renderParamDescriptor(context, parameter, parameter.type),
|
|
335
|
+
renderParamDescriptor(context, parameter, parameter.type, { argIndexOffset: 1 }),
|
|
249
336
|
);
|
|
250
|
-
|
|
337
|
+
|
|
338
|
+
const isVoid = shouldOmitPrimaryReturn(context.library, signal.returnValue);
|
|
339
|
+
|
|
251
340
|
const returnDescriptor = isVoid
|
|
252
341
|
? tVoid
|
|
253
342
|
: renderDescriptor(context, signal.returnValue.type, signal.returnValue.transferOwnership);
|
|
343
|
+
|
|
254
344
|
const callbackArgs = [tObject("borrowed"), ...callbackParamDescriptors, tVoid];
|
|
255
|
-
|
|
345
|
+
|
|
346
|
+
return tCallback(
|
|
347
|
+
callbackArgs,
|
|
348
|
+
returnDescriptor,
|
|
349
|
+
`{ hasDestroy: true, userDataIndex: ${String(params.length + 1)} }`,
|
|
350
|
+
);
|
|
256
351
|
};
|
|
257
352
|
|
|
258
|
-
const
|
|
353
|
+
const forEachInterfaceSignal = (
|
|
354
|
+
context: ModuleContext,
|
|
355
|
+
klass: GirClass,
|
|
356
|
+
consider: (signal: GirCallable) => void,
|
|
357
|
+
): void => {
|
|
358
|
+
for (const implementName of klass.implements) {
|
|
359
|
+
const iface = resolveImplementedInterface(context, implementName);
|
|
360
|
+
|
|
361
|
+
if (iface === undefined) {
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
for (const signal of iface.klass.signals) {
|
|
366
|
+
consider(signal);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
const collectClassSignals = (context: ModuleContext, klass: GirClass): GirCallable[] => {
|
|
259
372
|
const inheritedNames = collectInheritedSignalNames(context, klass);
|
|
260
|
-
const seen = new Set
|
|
261
|
-
const result:
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
373
|
+
const seen: Set<string> = new Set();
|
|
374
|
+
const result: GirCallable[] = [];
|
|
375
|
+
|
|
376
|
+
const consider = (signal: GirCallable): void => {
|
|
377
|
+
const name = camelCase(signal.name);
|
|
378
|
+
|
|
379
|
+
if (!signal.introspectable || inheritedNames.has(name) || seen.has(name)) {
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
|
|
265
383
|
seen.add(name);
|
|
266
384
|
result.push(signal);
|
|
267
385
|
};
|
|
268
|
-
|
|
269
|
-
for (const
|
|
270
|
-
|
|
271
|
-
if (iface === undefined) continue;
|
|
272
|
-
for (const signal of iface.klass.signals) consider(signal);
|
|
386
|
+
|
|
387
|
+
for (const signal of klass.signals) {
|
|
388
|
+
consider(signal);
|
|
273
389
|
}
|
|
390
|
+
|
|
391
|
+
forEachInterfaceSignal(context, klass, consider);
|
|
392
|
+
|
|
274
393
|
return result;
|
|
275
394
|
};
|
|
276
395
|
|
|
277
|
-
|
|
396
|
+
const addMemberNames = (target: Set<string>, source: GirClass, select: (source: GirClass) => NamedMember[]): void => {
|
|
397
|
+
for (const member of select(source)) {
|
|
398
|
+
target.add(camelCase(member.name));
|
|
399
|
+
}
|
|
400
|
+
};
|
|
278
401
|
|
|
279
402
|
const collectInheritedMemberNames = (
|
|
280
403
|
context: ModuleContext,
|
|
281
404
|
klass: GirClass,
|
|
282
405
|
select: (source: GirClass) => NamedMember[],
|
|
283
406
|
): Set<string> => {
|
|
284
|
-
const names = new Set
|
|
407
|
+
const names: Set<string> = new Set();
|
|
408
|
+
|
|
285
409
|
forEachAncestor(context, klass, (ancestor, interfaces) => {
|
|
286
|
-
|
|
410
|
+
addMemberNames(names, ancestor.klass, select);
|
|
411
|
+
|
|
287
412
|
for (const iface of interfaces) {
|
|
288
|
-
|
|
413
|
+
addMemberNames(names, iface.klass, select);
|
|
289
414
|
}
|
|
290
415
|
});
|
|
416
|
+
|
|
291
417
|
return names;
|
|
292
418
|
};
|
|
293
419
|
|
|
@@ -296,15 +422,29 @@ const collectInheritedSignalNames = (context: ModuleContext, klass: GirClass): S
|
|
|
296
422
|
|
|
297
423
|
const collectNotifyDetails = (context: ModuleContext, klass: GirClass): string[] => {
|
|
298
424
|
const inherited = collectInheritedMemberNames(context, klass, (source) => source.properties);
|
|
299
|
-
const seen = new Set
|
|
425
|
+
const seen: Set<string> = new Set();
|
|
300
426
|
const result: string[] = [];
|
|
427
|
+
|
|
301
428
|
const consider = (property: GirProperty): void => {
|
|
302
|
-
const name =
|
|
303
|
-
|
|
429
|
+
const name = camelCase(property.name);
|
|
430
|
+
|
|
431
|
+
if (inherited.has(name) || seen.has(name)) {
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
|
|
304
435
|
seen.add(name);
|
|
305
436
|
result.push(property.name);
|
|
306
437
|
};
|
|
307
|
-
|
|
308
|
-
for (const
|
|
438
|
+
|
|
439
|
+
for (const property of klass.properties) {
|
|
440
|
+
consider(property);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
for (const { property } of collectInterfaceProperties(context, klass)) {
|
|
444
|
+
consider(property);
|
|
445
|
+
}
|
|
446
|
+
|
|
309
447
|
return result;
|
|
310
448
|
};
|
|
449
|
+
|
|
450
|
+
export { renderSignalMembers, renderSignalDeclarations };
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { GirField } from "../../gir/field.js";
|
|
2
|
+
import type { PrimitiveCategory } from "../../gir/primitives.js";
|
|
3
|
+
import type { GirRecord } from "../../gir/record.js";
|
|
4
|
+
import type { TypeId } from "../../gir/type-id.js";
|
|
5
|
+
import type { GirType } from "../../gir/type.js";
|
|
6
|
+
import type { ModuleContext } from "../../writer/context.js";
|
|
7
|
+
|
|
8
|
+
type Scope = { context: ModuleContext; seen: Set<string> };
|
|
9
|
+
|
|
10
|
+
/** Primitive categories that are a pointer at the C level, so copying the bytes aliases the pointee. */
|
|
11
|
+
const POINTER_CATEGORIES: Set<PrimitiveCategory> = new Set<PrimitiveCategory>(["string", "pointer"]);
|
|
12
|
+
|
|
13
|
+
const recordKey = (namespaceName: string, record: GirRecord): string => `${namespaceName}.${record.name}`;
|
|
14
|
+
|
|
15
|
+
const hasOwnCopySemantics = (record: GirRecord): boolean =>
|
|
16
|
+
record.glibGetType !== undefined ||
|
|
17
|
+
((record.glibRefFunc ?? record.copyFunc) !== undefined && (record.glibUnrefFunc ?? record.freeFunc) !== undefined);
|
|
18
|
+
|
|
19
|
+
const isValueSafeArray = (scope: Scope, type: Extract<GirType, { kind: "carray" }>): boolean =>
|
|
20
|
+
type.fixedSize !== undefined && isValueSafeRef(scope, type.element, type.elementCType);
|
|
21
|
+
|
|
22
|
+
const isValueSafeAlias = (scope: Scope, type: Extract<GirType, { kind: "alias" }>): boolean =>
|
|
23
|
+
isValueSafeRef(scope, type.value.target, type.value.targetCType);
|
|
24
|
+
|
|
25
|
+
function isValueSafeType(scope: Scope, type: GirType): boolean {
|
|
26
|
+
switch (type.kind) {
|
|
27
|
+
case "primitive": {
|
|
28
|
+
return !POINTER_CATEGORIES.has(type.category);
|
|
29
|
+
}
|
|
30
|
+
case "enum": {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
case "record": {
|
|
34
|
+
return isValueSafeRecord(scope, type.namespace.name, type.value);
|
|
35
|
+
}
|
|
36
|
+
case "carray": {
|
|
37
|
+
return isValueSafeArray(scope, type);
|
|
38
|
+
}
|
|
39
|
+
case "alias": {
|
|
40
|
+
return isValueSafeAlias(scope, type);
|
|
41
|
+
}
|
|
42
|
+
case "callback":
|
|
43
|
+
case "class":
|
|
44
|
+
case "hashtable":
|
|
45
|
+
case "interface":
|
|
46
|
+
case "list":
|
|
47
|
+
case "varargs": {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function isValueSafeRef(scope: Scope, ref: TypeId | undefined, cType: string | undefined): boolean {
|
|
54
|
+
if (ref === undefined || cType?.endsWith("*") === true) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const type = scope.context.library.typeFor(ref);
|
|
59
|
+
|
|
60
|
+
return type === undefined ? false : isValueSafeType(scope, type);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const isValueSafeField = (scope: Scope, field: GirField): boolean =>
|
|
64
|
+
field.inlineMembers === undefined
|
|
65
|
+
? isValueSafeRef(scope, field.type, field.cType)
|
|
66
|
+
: field.inlineMembers.every((member) => isValueSafeField(scope, member));
|
|
67
|
+
|
|
68
|
+
function isValueSafeRecord(scope: Scope, namespaceName: string, record: GirRecord): boolean {
|
|
69
|
+
const key = recordKey(namespaceName, record);
|
|
70
|
+
|
|
71
|
+
if (scope.seen.has(key) || record.fields.length === 0) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
scope.seen.add(key);
|
|
76
|
+
const isSafe = record.fields.every((field) => isValueSafeField(scope, field));
|
|
77
|
+
scope.seen.delete(key);
|
|
78
|
+
|
|
79
|
+
return isSafe;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Whether a record can be copied by value. A plain struct is duplicated with a byte-wise `g_memdup2`,
|
|
84
|
+
* which shallow-copies whatever the bytes hold, so only a record whose every field is transitively a
|
|
85
|
+
* scalar can be owned, allocated or written into an inline slot. A pointer, a string, a function
|
|
86
|
+
* pointer or an opaque record makes it borrow-only. Records that carry their own copy/free pair are
|
|
87
|
+
* duplicated through that instead and never reach the byte-wise path.
|
|
88
|
+
*/
|
|
89
|
+
const isValueMarshalable = (context: ModuleContext, namespaceName: string, record: GirRecord): boolean =>
|
|
90
|
+
isValueSafeRecord({ context, seen: new Set<string>() }, namespaceName, record);
|
|
91
|
+
|
|
92
|
+
/** Whether a record can be allocated and populated from JavaScript. */
|
|
93
|
+
const isConstructibleRecord = (context: ModuleContext, namespaceName: string, record: GirRecord): boolean =>
|
|
94
|
+
hasOwnCopySemantics(record) || isValueMarshalable(context, namespaceName, record);
|
|
95
|
+
|
|
96
|
+
export { hasOwnCopySemantics, isConstructibleRecord, isValueMarshalable };
|