@gtkx/codegen 1.0.0-rc.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/analysis/descriptor-render.d.ts +13 -9
- package/dist/analysis/descriptor-render.d.ts.map +1 -1
- package/dist/analysis/descriptor-render.js +80 -50
- package/dist/analysis/descriptor-render.js.map +1 -1
- package/dist/analysis/descriptor.d.ts +16 -7
- package/dist/analysis/descriptor.d.ts.map +1 -1
- package/dist/analysis/descriptor.js +15 -3
- package/dist/analysis/descriptor.js.map +1 -1
- package/dist/analysis/inheritance.d.ts +4 -3
- package/dist/analysis/inheritance.d.ts.map +1 -1
- package/dist/analysis/inheritance.js +103 -58
- package/dist/analysis/inheritance.js.map +1 -1
- package/dist/analysis/interface-conflicts.d.ts +23 -0
- package/dist/analysis/interface-conflicts.d.ts.map +1 -0
- package/dist/analysis/interface-conflicts.js +144 -0
- package/dist/analysis/interface-conflicts.js.map +1 -0
- package/dist/analysis/nul-terminated-bytes.d.ts +5 -0
- package/dist/analysis/nul-terminated-bytes.d.ts.map +1 -0
- package/dist/analysis/nul-terminated-bytes.js +18 -0
- package/dist/analysis/nul-terminated-bytes.js.map +1 -0
- package/dist/analysis/param-capability.d.ts +5 -0
- package/dist/analysis/param-capability.d.ts.map +1 -0
- package/dist/analysis/param-capability.js +129 -0
- package/dist/analysis/param-capability.js.map +1 -0
- package/dist/analysis/param-structure.d.ts +11 -4
- package/dist/analysis/param-structure.d.ts.map +1 -1
- package/dist/analysis/param-structure.js +42 -16
- package/dist/analysis/param-structure.js.map +1 -1
- package/dist/analysis/ts-type.d.ts.map +1 -1
- package/dist/analysis/ts-type.js +10 -17
- 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 +8 -0
- package/dist/analysis/type-shape.d.ts.map +1 -0
- package/dist/analysis/type-shape.js +12 -0
- package/dist/analysis/type-shape.js.map +1 -0
- package/dist/compile.d.ts +12 -3
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +73 -24
- package/dist/compile.js.map +1 -1
- package/dist/docs/api-reference.d.ts +2 -2
- package/dist/docs/api-reference.d.ts.map +1 -1
- package/dist/docs/api-reference.js +17 -23
- package/dist/docs/api-reference.js.map +1 -1
- package/dist/docs/element-page.d.ts +4 -4
- package/dist/docs/element-page.d.ts.map +1 -1
- package/dist/docs/element-page.js +36 -22
- package/dist/docs/element-page.js.map +1 -1
- package/dist/docs/handwritten-props.d.ts +9 -0
- package/dist/docs/handwritten-props.d.ts.map +1 -0
- package/dist/docs/handwritten-props.js +149 -0
- package/dist/docs/handwritten-props.js.map +1 -0
- package/dist/docs/pipeline.d.ts.map +1 -1
- package/dist/docs/pipeline.js +87 -20
- package/dist/docs/pipeline.js.map +1 -1
- package/dist/docs/render.d.ts +26 -5
- package/dist/docs/render.d.ts.map +1 -1
- package/dist/docs/render.js +88 -25
- package/dist/docs/render.js.map +1 -1
- package/dist/docs/symbol-page.d.ts +17 -0
- package/dist/docs/symbol-page.d.ts.map +1 -1
- package/dist/docs/symbol-page.js +132 -44
- package/dist/docs/symbol-page.js.map +1 -1
- package/dist/fingerprint.d.ts +12 -1
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +44 -28
- package/dist/fingerprint.js.map +1 -1
- package/dist/gi.d.ts.map +1 -1
- package/dist/gi.js +1 -0
- package/dist/gi.js.map +1 -1
- package/dist/gir/ancestry.d.ts +8 -2
- package/dist/gir/ancestry.d.ts.map +1 -1
- package/dist/gir/ancestry.js +19 -1
- package/dist/gir/ancestry.js.map +1 -1
- package/dist/gir/annotations.d.ts +21 -0
- package/dist/gir/annotations.d.ts.map +1 -0
- package/dist/gir/annotations.js +15 -0
- package/dist/gir/annotations.js.map +1 -0
- package/dist/gir/callback.d.ts +1 -0
- package/dist/gir/callback.d.ts.map +1 -1
- package/dist/gir/callback.js +1 -0
- package/dist/gir/callback.js.map +1 -1
- package/dist/gir/class.d.ts +32 -1
- package/dist/gir/class.d.ts.map +1 -1
- package/dist/gir/class.js +8 -3
- package/dist/gir/class.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/enum.d.ts +21 -1
- package/dist/gir/enum.d.ts.map +1 -1
- package/dist/gir/enum.js +9 -9
- package/dist/gir/enum.js.map +1 -1
- package/dist/gir/field.d.ts +19 -3
- package/dist/gir/field.d.ts.map +1 -1
- package/dist/gir/field.js +7 -8
- package/dist/gir/field.js.map +1 -1
- package/dist/gir/function.d.ts +15 -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/libraries.d.ts +1 -3
- package/dist/gir/libraries.d.ts.map +1 -1
- package/dist/gir/libraries.js +0 -1
- package/dist/gir/libraries.js.map +1 -1
- package/dist/gir/library.d.ts +36 -0
- package/dist/gir/library.d.ts.map +1 -1
- package/dist/gir/library.js +35 -1
- package/dist/gir/library.js.map +1 -1
- package/dist/gir/namespace.d.ts +43 -1
- package/dist/gir/namespace.d.ts.map +1 -1
- package/dist/gir/namespace.js +8 -7
- package/dist/gir/namespace.js.map +1 -1
- package/dist/gir/parameter.d.ts +52 -1
- package/dist/gir/parameter.d.ts.map +1 -1
- package/dist/gir/parameter.js +8 -3
- package/dist/gir/parameter.js.map +1 -1
- package/dist/gir/parse.d.ts +3 -1
- package/dist/gir/parse.d.ts.map +1 -1
- package/dist/gir/parse.js +9 -9
- package/dist/gir/parse.js.map +1 -1
- package/dist/gir/primitives.d.ts +1 -0
- package/dist/gir/primitives.d.ts.map +1 -1
- package/dist/gir/primitives.js.map +1 -1
- package/dist/gir/property.d.ts +16 -0
- package/dist/gir/property.d.ts.map +1 -1
- package/dist/gir/property.js +3 -3
- package/dist/gir/property.js.map +1 -1
- package/dist/gir/record.d.ts +22 -0
- package/dist/gir/record.d.ts.map +1 -1
- package/dist/gir/record.js +3 -2
- package/dist/gir/record.js.map +1 -1
- package/dist/gir/size.d.ts +5 -4
- package/dist/gir/size.d.ts.map +1 -1
- package/dist/gir/size.js.map +1 -1
- package/dist/gir/type-id.d.ts +35 -0
- package/dist/gir/type-id.d.ts.map +1 -1
- package/dist/gir/type-id.js +1 -0
- package/dist/gir/type-id.js.map +1 -1
- package/dist/gir/type-ref.d.ts.map +1 -1
- package/dist/gir/type-ref.js +1 -0
- package/dist/gir/type-ref.js.map +1 -1
- package/dist/gir/type.d.ts +20 -0
- package/dist/gir/type.d.ts.map +1 -1
- package/dist/gir/type.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 +7 -6
- package/dist/khronos/args.d.ts.map +1 -1
- package/dist/khronos/args.js +28 -6
- package/dist/khronos/args.js.map +1 -1
- package/dist/khronos/doc-context.d.ts +29 -0
- package/dist/khronos/doc-context.d.ts.map +1 -0
- package/dist/khronos/doc-context.js +29 -0
- package/dist/khronos/doc-context.js.map +1 -0
- package/dist/khronos/extensions.d.ts +13 -0
- package/dist/khronos/extensions.d.ts.map +1 -0
- package/dist/khronos/extensions.js +49 -0
- package/dist/khronos/extensions.js.map +1 -0
- package/dist/khronos/jsdoc.d.ts +17 -11
- package/dist/khronos/jsdoc.d.ts.map +1 -1
- package/dist/khronos/jsdoc.js +104 -46
- package/dist/khronos/jsdoc.js.map +1 -1
- package/dist/khronos/model.d.ts +42 -3
- package/dist/khronos/model.d.ts.map +1 -1
- package/dist/khronos/model.js +218 -63
- package/dist/khronos/model.js.map +1 -1
- package/dist/khronos/modules.d.ts +9 -6
- package/dist/khronos/modules.d.ts.map +1 -1
- package/dist/khronos/modules.js +112 -27
- package/dist/khronos/modules.js.map +1 -1
- package/dist/khronos/notes.d.ts +19 -0
- package/dist/khronos/notes.d.ts.map +1 -0
- package/dist/khronos/notes.js +35 -0
- package/dist/khronos/notes.js.map +1 -0
- package/dist/khronos/param-pair.d.ts +1 -1
- package/dist/khronos/param-pair.d.ts.map +1 -1
- package/dist/khronos/param-pair.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 +4 -2
- package/dist/khronos/pipeline.d.ts.map +1 -1
- package/dist/khronos/pipeline.js +58 -27
- package/dist/khronos/pipeline.js.map +1 -1
- package/dist/khronos/plan.d.ts +3 -9
- package/dist/khronos/plan.d.ts.map +1 -1
- package/dist/khronos/plan.js +3 -3
- package/dist/khronos/plan.js.map +1 -1
- package/dist/khronos/render.d.ts +8 -6
- package/dist/khronos/render.d.ts.map +1 -1
- package/dist/khronos/render.js +35 -26
- package/dist/khronos/render.js.map +1 -1
- package/dist/khronos/select.d.ts +21 -4
- package/dist/khronos/select.d.ts.map +1 -1
- package/dist/khronos/select.js +47 -34
- package/dist/khronos/select.js.map +1 -1
- package/dist/react/element-config.d.ts +2 -2
- package/dist/react/element-config.d.ts.map +1 -1
- package/dist/react/element-config.js.map +1 -1
- package/dist/runner.d.ts +6 -8
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +16 -0
- 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 +1 -1
- package/dist/store/compile-store.d.ts.map +1 -1
- package/dist/store/compile-store.js +4 -2
- package/dist/store/compile-store.js.map +1 -1
- package/dist/store/gi/callable-doc.d.ts +11 -0
- package/dist/store/gi/callable-doc.d.ts.map +1 -0
- package/dist/store/gi/callable-doc.js +62 -0
- package/dist/store/gi/callable-doc.js.map +1 -0
- package/dist/store/gi/callables.d.ts +9 -2
- package/dist/store/gi/callables.d.ts.map +1 -1
- package/dist/store/gi/callables.js +35 -40
- 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 +10 -6
- 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 +63 -40
- package/dist/store/gi/class.js.map +1 -1
- package/dist/store/gi/closure-invocation.d.ts +4 -0
- package/dist/store/gi/closure-invocation.d.ts.map +1 -0
- package/dist/store/gi/closure-invocation.js +22 -0
- package/dist/store/gi/closure-invocation.js.map +1 -0
- 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 +12 -3
- package/dist/store/gi/constant.js.map +1 -1
- package/dist/store/gi/constructor-props.d.ts.map +1 -1
- package/dist/store/gi/constructor-props.js +18 -20
- package/dist/store/gi/constructor-props.js.map +1 -1
- package/dist/store/gi/doc-spec.d.ts +14 -0
- package/dist/store/gi/doc-spec.d.ts.map +1 -0
- package/dist/store/gi/doc-spec.js +23 -0
- package/dist/store/gi/doc-spec.js.map +1 -0
- package/dist/store/gi/enum.d.ts.map +1 -1
- package/dist/store/gi/enum.js +52 -19
- 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 +50 -29
- 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 +155 -26
- package/dist/store/gi/interface.js.map +1 -1
- package/dist/store/gi/item-comparators.d.ts.map +1 -1
- package/dist/store/gi/item-comparators.js +3 -5
- package/dist/store/gi/item-comparators.js.map +1 -1
- package/dist/store/gi/method.d.ts +11 -2
- package/dist/store/gi/method.d.ts.map +1 -1
- package/dist/store/gi/method.js +80 -45
- package/dist/store/gi/method.js.map +1 -1
- package/dist/store/gi/param-marshal.d.ts +6 -2
- package/dist/store/gi/param-marshal.d.ts.map +1 -1
- package/dist/store/gi/param-marshal.js +54 -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 +23 -11
- 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 +7 -4
- package/dist/store/gi/properties.js.map +1 -1
- package/dist/store/gi/property-accessor.d.ts +12 -5
- package/dist/store/gi/property-accessor.d.ts.map +1 -1
- package/dist/store/gi/property-accessor.js +98 -46
- 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 -11
- package/dist/store/gi/record-constructor.js.map +1 -1
- package/dist/store/gi/record-field-accessor.d.ts +3 -1
- package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
- package/dist/store/gi/record-field-accessor.js +8 -3
- 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 +9 -2
- 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 +21 -9
- package/dist/store/gi/record.js.map +1 -1
- package/dist/store/gi/registration.d.ts +1 -1
- package/dist/store/gi/registration.js +4 -4
- package/dist/store/gi/registration.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 +8 -5
- package/dist/store/gi/runtime-override.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 +42 -37
- package/dist/store/gi/signal.js.map +1 -1
- package/dist/store/gi/value-marshalable.d.ts +1 -2
- package/dist/store/gi/value-marshalable.d.ts.map +1 -1
- package/dist/store/gi/value-marshalable.js +3 -2
- package/dist/store/gi/value-marshalable.js.map +1 -1
- package/dist/store/gi/vtable.d.ts +19 -1
- package/dist/store/gi/vtable.d.ts.map +1 -1
- package/dist/store/gi/vtable.js +257 -51
- 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/element-components.d.ts +1 -1
- package/dist/store/jsx/element-components.d.ts.map +1 -1
- package/dist/store/jsx/element-components.js +6 -4
- package/dist/store/jsx/element-components.js.map +1 -1
- package/dist/store/jsx/element-prop-imports.d.ts +1 -3
- package/dist/store/jsx/element-prop-imports.d.ts.map +1 -1
- package/dist/store/jsx/element-prop-imports.js.map +1 -1
- package/dist/store/jsx/element-prop-types.d.ts +3 -0
- package/dist/store/jsx/element-prop-types.d.ts.map +1 -1
- package/dist/store/jsx/element-prop-types.js +7 -1
- package/dist/store/jsx/element-prop-types.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/intrinsic-elements.d.ts +4 -0
- package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -1
- package/dist/store/jsx/intrinsic-elements.js.map +1 -1
- package/dist/store/jsx/jsx.d.ts.map +1 -1
- package/dist/store/jsx/jsx.js +10 -9
- 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 +5 -3
- package/dist/store/jsx/metadata.js.map +1 -1
- package/dist/store/jsx/pipeline.d.ts +1 -1
- package/dist/store/jsx/pipeline.d.ts.map +1 -1
- package/dist/store/jsx/pipeline.js.map +1 -1
- package/dist/store/jsx/props.d.ts +1 -7
- package/dist/store/jsx/props.d.ts.map +1 -1
- package/dist/store/jsx/props.js +14 -6
- package/dist/store/jsx/props.js.map +1 -1
- package/dist/store/jsx-store.d.ts.map +1 -1
- package/dist/store/jsx-store.js +3 -3
- 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 -6
- package/dist/store/store-fs.d.ts.map +1 -1
- package/dist/store/store-fs.js +59 -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 -2
- package/dist/writer/context.d.ts.map +1 -1
- package/dist/writer/context.js +11 -3
- package/dist/writer/context.js.map +1 -1
- package/dist/writer/doc-tags.d.ts +21 -0
- package/dist/writer/doc-tags.d.ts.map +1 -0
- package/dist/writer/doc-tags.js +38 -0
- package/dist/writer/doc-tags.js.map +1 -0
- package/dist/writer/doc.d.ts +3 -1
- package/dist/writer/doc.d.ts.map +1 -1
- package/dist/writer/doc.js +19 -6
- package/dist/writer/doc.js.map +1 -1
- package/dist/writer/gtk-doc.d.ts +1 -1
- package/dist/writer/gtk-doc.d.ts.map +1 -1
- package/dist/writer/gtk-doc.js +64 -15
- package/dist/writer/gtk-doc.js.map +1 -1
- package/dist/writer/module.d.ts +17 -3
- package/dist/writer/module.d.ts.map +1 -1
- package/dist/writer/module.js +72 -3
- package/dist/writer/module.js.map +1 -1
- package/dist/xml.d.ts +7 -1
- package/dist/xml.d.ts.map +1 -1
- package/dist/xml.js +43 -1
- package/dist/xml.js.map +1 -1
- package/overrides/gdk/rgba.ts.ejs +26 -0
- package/overrides/gobject/object.ts.ejs +48 -3
- package/overrides/gobject/value.ts.ejs +7 -0
- package/overrides/graphene/structs.ts.ejs +55 -0
- package/package.json +15 -4
- package/src/analysis/descriptor-render.ts +130 -66
- package/src/analysis/descriptor.ts +35 -11
- package/src/analysis/inheritance.ts +166 -75
- package/src/analysis/interface-conflicts.ts +237 -0
- package/src/analysis/nul-terminated-bytes.ts +31 -0
- package/src/analysis/param-capability.ts +169 -0
- package/src/analysis/param-structure.ts +85 -25
- package/src/analysis/ts-type.ts +13 -17
- package/src/analysis/type-key.ts +14 -0
- package/src/analysis/type-shape.ts +24 -0
- package/src/compile.ts +110 -26
- package/src/docs/api-reference.ts +46 -34
- package/src/docs/element-page.ts +58 -49
- package/src/docs/handwritten-props.ts +230 -0
- package/src/docs/pipeline.ts +131 -21
- package/src/docs/render.ts +153 -35
- package/src/docs/symbol-page.ts +230 -80
- package/src/fingerprint.ts +86 -32
- package/src/gi.ts +1 -0
- package/src/gir/ancestry.ts +31 -1
- package/src/gir/annotations.ts +37 -0
- package/src/gir/callback.ts +2 -0
- package/src/gir/class.ts +42 -4
- package/src/gir/cursor-overrides.ts +12 -0
- package/src/gir/emittable.ts +8 -0
- package/src/gir/enum.ts +30 -10
- package/src/gir/field.ts +24 -9
- package/src/gir/function.ts +60 -9
- package/src/gir/libraries.ts +11 -3
- package/src/gir/library.ts +52 -3
- package/src/gir/namespace.ts +49 -7
- package/src/gir/parameter.ts +62 -3
- package/src/gir/parse.ts +13 -9
- package/src/gir/primitives.ts +1 -0
- package/src/gir/property.ts +18 -3
- package/src/gir/record.ts +24 -2
- package/src/gir/size.ts +8 -3
- package/src/gir/type-id.ts +49 -3
- package/src/gir/type-ref.ts +1 -0
- package/src/gir/type.ts +50 -6
- package/src/guards.ts +23 -0
- package/src/internal.ts +2 -0
- package/src/json.ts +11 -0
- package/src/khronos/args.ts +36 -13
- package/src/khronos/doc-context.ts +62 -0
- package/src/khronos/extensions.ts +85 -0
- package/src/khronos/jsdoc.ts +152 -56
- package/src/khronos/model.ts +314 -69
- package/src/khronos/modules.ts +150 -40
- package/src/khronos/notes.ts +74 -0
- package/src/khronos/param-pair.ts +1 -1
- package/src/khronos/parse.ts +3 -4
- package/src/khronos/pipeline.ts +95 -42
- package/src/khronos/plan.ts +4 -6
- package/src/khronos/render.ts +62 -50
- package/src/khronos/select.ts +91 -50
- package/src/react/element-config.ts +2 -2
- package/src/runner.ts +20 -9
- package/src/staging.ts +69 -0
- package/src/store/compile-store.ts +7 -5
- package/src/store/gi/callable-doc.ts +102 -0
- package/src/store/gi/callables.ts +58 -44
- package/src/store/gi/callback.ts +10 -9
- package/src/store/gi/class.ts +83 -49
- package/src/store/gi/closure-invocation.ts +26 -0
- package/src/store/gi/companion.ts +7 -6
- package/src/store/gi/constant.ts +14 -5
- package/src/store/gi/constructor-props.ts +19 -23
- package/src/store/gi/doc-spec.ts +38 -0
- package/src/store/gi/enum.ts +75 -26
- package/src/store/gi/function.ts +72 -44
- package/src/store/gi/gtype-binding.ts +7 -2
- package/src/store/gi/interface.ts +244 -37
- package/src/store/gi/item-comparators.ts +3 -5
- package/src/store/gi/method.ts +124 -69
- package/src/store/gi/param-marshal.ts +91 -6
- package/src/store/gi/pipeline.ts +28 -13
- package/src/store/gi/properties.ts +10 -5
- package/src/store/gi/property-accessor.ts +163 -75
- package/src/store/gi/record-constructor.ts +56 -19
- package/src/store/gi/record-field-accessor.ts +13 -4
- package/src/store/gi/record-layout.ts +12 -2
- package/src/store/gi/record.ts +24 -10
- package/src/store/gi/registration.ts +5 -5
- package/src/store/gi/runtime-override.ts +13 -6
- package/src/store/gi/signal.ts +54 -57
- package/src/store/gi/value-marshalable.ts +4 -2
- package/src/store/gi/vtable.ts +439 -61
- package/src/store/gi-store.ts +26 -31
- package/src/store/jsx/element-components.ts +8 -5
- package/src/store/jsx/element-prop-imports.ts +1 -3
- package/src/store/jsx/element-prop-types.ts +10 -1
- package/src/store/jsx/generated-elements.ts +17 -8
- package/src/store/jsx/intrinsic-elements.ts +4 -0
- package/src/store/jsx/jsx.ts +11 -9
- package/src/store/jsx/metadata.ts +6 -3
- package/src/store/jsx/pipeline.ts +1 -1
- package/src/store/jsx/props.ts +20 -7
- package/src/store/jsx-store.ts +3 -3
- package/src/store/resolve-store.ts +133 -18
- package/src/store/store-fs.ts +87 -34
- package/src/store/store-links.ts +49 -0
- package/src/writer/comparison-context.ts +18 -0
- package/src/writer/context.ts +14 -4
- package/src/writer/doc-tags.ts +70 -0
- package/src/writer/doc.ts +29 -6
- package/src/writer/gtk-doc.ts +82 -15
- package/src/writer/module.ts +114 -4
- package/src/xml.ts +61 -1
|
@@ -6,18 +6,30 @@ import { renderDescriptor } from "../../analysis/descriptor-render.js";
|
|
|
6
6
|
import { inputParameters } from "../../analysis/param-structure.js";
|
|
7
7
|
import { renderTsType } from "../../analysis/ts-type.js";
|
|
8
8
|
import { type GirProperty, isConstructableProperty } from "../../gir/property.js";
|
|
9
|
-
import {
|
|
9
|
+
import { comparisonContextFor } from "../../writer/comparison-context.js";
|
|
10
10
|
import { renderBlock } from "../../writer/emit.js";
|
|
11
11
|
import { isEmittableCallable } from "./callables.js";
|
|
12
|
+
import { getDoc } from "./doc-spec.js";
|
|
12
13
|
import { methodExportName, renderMethodReturnType } from "./method.js";
|
|
13
14
|
|
|
15
|
+
type AccessorTypes = {
|
|
16
|
+
readType: string;
|
|
17
|
+
writeType: string;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
type InheritedAccessorTypes = {
|
|
21
|
+
readType: string | undefined;
|
|
22
|
+
writeType: string | undefined;
|
|
23
|
+
};
|
|
24
|
+
|
|
14
25
|
type ResolvedAccessor = {
|
|
26
|
+
property: GirProperty;
|
|
15
27
|
jsName: string;
|
|
16
|
-
|
|
28
|
+
readType: string;
|
|
29
|
+
writeType: string;
|
|
17
30
|
hasGetter: boolean;
|
|
18
31
|
isWritable: boolean;
|
|
19
32
|
getterMember: string | undefined;
|
|
20
|
-
getterMethod: GirFunction | undefined;
|
|
21
33
|
setterMember: string | undefined;
|
|
22
34
|
};
|
|
23
35
|
|
|
@@ -26,18 +38,15 @@ type PropertyAccessorArgs = {
|
|
|
26
38
|
property: GirProperty;
|
|
27
39
|
claimedNames: Set<string>;
|
|
28
40
|
methodByName: Map<string, GirFunction>;
|
|
29
|
-
|
|
41
|
+
inheritedTypes?: InheritedAccessorTypes | undefined;
|
|
42
|
+
inheritedNames?: Set<string> | undefined;
|
|
30
43
|
};
|
|
31
44
|
|
|
32
|
-
type AccessorDelegate = { member: string
|
|
45
|
+
type AccessorDelegate = { member: string; method: GirFunction };
|
|
46
|
+
type AccessorDelegates = { getter: AccessorDelegate | undefined; setter: AccessorDelegate | undefined };
|
|
47
|
+
type TypedDelegates = { types: AccessorTypes; delegates: AccessorDelegates };
|
|
33
48
|
|
|
34
|
-
|
|
35
|
-
context: ModuleContext;
|
|
36
|
-
property: GirProperty;
|
|
37
|
-
getterMember: string | undefined;
|
|
38
|
-
getterMethod: GirFunction | undefined;
|
|
39
|
-
tsType: string;
|
|
40
|
-
};
|
|
49
|
+
const NULLABLE_SUFFIX = " | null";
|
|
41
50
|
|
|
42
51
|
const isNullablePropertyType = (context: ModuleContext, type: TypeId | undefined): boolean => {
|
|
43
52
|
if (type === undefined) {
|
|
@@ -70,14 +79,17 @@ const resolveDelegate = (
|
|
|
70
79
|
attribute: string | undefined,
|
|
71
80
|
member: string | undefined,
|
|
72
81
|
isDelegatable: (method: GirFunction) => boolean,
|
|
73
|
-
): AccessorDelegate => {
|
|
82
|
+
): AccessorDelegate | undefined => {
|
|
74
83
|
const method = member !== undefined && attribute !== undefined ? args.methodByName.get(attribute) : undefined;
|
|
75
|
-
const canDelegate = method === undefined || isDelegatable(method);
|
|
76
84
|
|
|
77
|
-
|
|
85
|
+
if (member === undefined || method === undefined || !isDelegatable(method)) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return { member, method };
|
|
78
90
|
};
|
|
79
91
|
|
|
80
|
-
const resolveGetterDelegate = (args: PropertyAccessorArgs, jsName: string): AccessorDelegate => {
|
|
92
|
+
const resolveGetterDelegate = (args: PropertyAccessorArgs, jsName: string): AccessorDelegate | undefined => {
|
|
81
93
|
const { context, property, claimedNames } = args;
|
|
82
94
|
const member = delegateMember(property.getter, jsName, claimedNames);
|
|
83
95
|
|
|
@@ -91,7 +103,11 @@ const resolveGetterDelegate = (args: PropertyAccessorArgs, jsName: string): Acce
|
|
|
91
103
|
);
|
|
92
104
|
};
|
|
93
105
|
|
|
94
|
-
const resolveSetterDelegate = (
|
|
106
|
+
const resolveSetterDelegate = (
|
|
107
|
+
args: PropertyAccessorArgs,
|
|
108
|
+
jsName: string,
|
|
109
|
+
isWritable: boolean,
|
|
110
|
+
): AccessorDelegate | undefined => {
|
|
95
111
|
const { context, property, claimedNames } = args;
|
|
96
112
|
const member = isWritable ? delegateMember(property.setter, jsName, claimedNames) : undefined;
|
|
97
113
|
|
|
@@ -103,52 +119,114 @@ const resolveSetterDelegate = (args: PropertyAccessorArgs, jsName: string, isWri
|
|
|
103
119
|
);
|
|
104
120
|
};
|
|
105
121
|
|
|
106
|
-
const
|
|
122
|
+
const baseTypeName = (type: string): string =>
|
|
123
|
+
type.endsWith(NULLABLE_SUFFIX) ? type.slice(0, -NULLABLE_SUFFIX.length) : type;
|
|
124
|
+
|
|
125
|
+
const areDelegateBaseTypesAgreeing = (
|
|
107
126
|
context: ModuleContext,
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
const setterParam = setterMethod?.parameters[0];
|
|
127
|
+
getter: AccessorDelegate | undefined,
|
|
128
|
+
setter: AccessorDelegate | undefined,
|
|
129
|
+
): boolean => {
|
|
130
|
+
const setterParam = setter?.method.parameters[0];
|
|
113
131
|
|
|
114
|
-
if (setterParam
|
|
115
|
-
return
|
|
132
|
+
if (setterParam === undefined || getter === undefined) {
|
|
133
|
+
return true;
|
|
116
134
|
}
|
|
117
135
|
|
|
118
|
-
|
|
119
|
-
|
|
136
|
+
const scratch = comparisonContextFor(context);
|
|
137
|
+
const read = baseTypeName(renderMethodReturnType(scratch, getter.method));
|
|
138
|
+
const written = baseTypeName(renderTsType(scratch, setterParam.type, false));
|
|
139
|
+
|
|
140
|
+
return read === written;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const resolveDelegates = (args: PropertyAccessorArgs, jsName: string, isWritable: boolean): AccessorDelegates => {
|
|
144
|
+
const getter = resolveGetterDelegate(args, jsName);
|
|
145
|
+
const setter = resolveSetterDelegate(args, jsName, isWritable);
|
|
146
|
+
|
|
147
|
+
if (areDelegateBaseTypesAgreeing(args.context, getter, setter)) {
|
|
148
|
+
return { getter, setter };
|
|
120
149
|
}
|
|
121
150
|
|
|
122
|
-
return
|
|
151
|
+
return { getter, setter: undefined };
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const declaredPropertyType = (context: ModuleContext, property: GirProperty): string =>
|
|
155
|
+
renderTsType(context, property.type, isNullablePropertyType(context, property.type));
|
|
156
|
+
|
|
157
|
+
const resolveOwnTypes = (
|
|
158
|
+
context: ModuleContext,
|
|
159
|
+
property: GirProperty,
|
|
160
|
+
delegates: AccessorDelegates,
|
|
161
|
+
): AccessorTypes => {
|
|
162
|
+
const getterMethod = delegates.getter?.method;
|
|
163
|
+
const setterParam = delegates.setter?.method.parameters[0];
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
readType: getterMethod === undefined
|
|
167
|
+
? declaredPropertyType(context, property)
|
|
168
|
+
: renderMethodReturnType(context, getterMethod),
|
|
169
|
+
writeType: setterParam === undefined
|
|
170
|
+
? declaredPropertyType(context, property)
|
|
171
|
+
: renderTsType(context, setterParam.type, setterParam.nullable || setterParam.optional),
|
|
172
|
+
};
|
|
123
173
|
};
|
|
124
174
|
|
|
125
|
-
const
|
|
126
|
-
|
|
175
|
+
const isAssignableType = (source: string, target: string): boolean =>
|
|
176
|
+
source === target || baseTypeName(target) === source;
|
|
127
177
|
|
|
128
|
-
const
|
|
129
|
-
|
|
178
|
+
const agreeingDelegates = (
|
|
179
|
+
delegates: AccessorDelegates,
|
|
180
|
+
ownTypes: AccessorTypes,
|
|
181
|
+
declaredTypes: AccessorTypes,
|
|
182
|
+
): AccessorDelegates => ({
|
|
183
|
+
getter: isAssignableType(ownTypes.readType, declaredTypes.readType) ? delegates.getter : undefined,
|
|
184
|
+
setter: isAssignableType(declaredTypes.writeType, ownTypes.writeType) ? delegates.setter : undefined,
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const resolveTypedDelegates = (args: PropertyAccessorArgs, resolved: AccessorDelegates): TypedDelegates => {
|
|
188
|
+
const ownTypes = resolveOwnTypes(args.context, args.property, resolved);
|
|
189
|
+
|
|
190
|
+
const types = {
|
|
191
|
+
readType: args.inheritedTypes?.readType ?? ownTypes.readType,
|
|
192
|
+
writeType: args.inheritedTypes?.writeType ?? ownTypes.writeType,
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
return { types, delegates: agreeingDelegates(resolved, ownTypes, types) };
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
const isSkippedAccessor = (args: PropertyAccessorArgs, jsName: string): boolean =>
|
|
199
|
+
!args.property.introspectable ||
|
|
200
|
+
args.claimedNames.has(jsName) ||
|
|
201
|
+
args.inheritedNames?.has(jsName) === true ||
|
|
202
|
+
jsName === "constructor";
|
|
130
203
|
|
|
131
204
|
const resolveAccessor = (args: PropertyAccessorArgs): ResolvedAccessor | undefined => {
|
|
132
|
-
const {
|
|
205
|
+
const { property } = args;
|
|
133
206
|
const jsName = toCamelIdentifier(property.name);
|
|
134
207
|
|
|
135
|
-
if (isSkippedAccessor(
|
|
208
|
+
if (isSkippedAccessor(args, jsName)) {
|
|
136
209
|
return undefined;
|
|
137
210
|
}
|
|
138
211
|
|
|
139
212
|
const isWritable = isConstructableProperty(property) && !property.constructOnly;
|
|
140
|
-
const {
|
|
141
|
-
const
|
|
142
|
-
const hasGetter = property.readable || getterMember !== undefined;
|
|
213
|
+
const { types, delegates } = resolveTypedDelegates(args, resolveDelegates(args, jsName, isWritable));
|
|
214
|
+
const hasGetter = property.readable || delegates.getter !== undefined;
|
|
143
215
|
|
|
144
216
|
if (!hasGetter && !isWritable) {
|
|
145
217
|
return undefined;
|
|
146
218
|
}
|
|
147
219
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
220
|
+
return {
|
|
221
|
+
property,
|
|
222
|
+
jsName,
|
|
223
|
+
readType: types.readType,
|
|
224
|
+
writeType: types.writeType,
|
|
225
|
+
hasGetter,
|
|
226
|
+
isWritable,
|
|
227
|
+
getterMember: delegates.getter?.member,
|
|
228
|
+
setterMember: delegates.setter?.member,
|
|
229
|
+
};
|
|
152
230
|
};
|
|
153
231
|
|
|
154
232
|
const resolveOwnerAccessor = (
|
|
@@ -171,11 +249,22 @@ const resolveOwnerAccessor = (
|
|
|
171
249
|
return resolveAccessor({ context, property, claimedNames, methodByName });
|
|
172
250
|
};
|
|
173
251
|
|
|
174
|
-
const
|
|
252
|
+
const resolveAccessorTypes = (
|
|
175
253
|
context: ModuleContext,
|
|
176
254
|
property: GirProperty,
|
|
177
255
|
methods: GirFunction[],
|
|
178
|
-
):
|
|
256
|
+
): InheritedAccessorTypes | undefined => {
|
|
257
|
+
const accessor = resolveOwnerAccessor(context, property, methods);
|
|
258
|
+
|
|
259
|
+
if (accessor === undefined) {
|
|
260
|
+
return undefined;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return {
|
|
264
|
+
readType: accessor.hasGetter ? accessor.readType : undefined,
|
|
265
|
+
writeType: accessor.isWritable ? accessor.writeType : undefined,
|
|
266
|
+
};
|
|
267
|
+
};
|
|
179
268
|
|
|
180
269
|
const withAccessor = (
|
|
181
270
|
args: PropertyAccessorArgs,
|
|
@@ -195,41 +284,49 @@ const renderResolvedPropertyAccessor = (
|
|
|
195
284
|
property: GirProperty,
|
|
196
285
|
accessor: ResolvedAccessor,
|
|
197
286
|
): string => {
|
|
198
|
-
const { jsName,
|
|
287
|
+
const { jsName, readType, writeType, hasGetter, isWritable, setterMember } = accessor;
|
|
199
288
|
const blocks: string[] = [];
|
|
200
289
|
|
|
201
290
|
if (hasGetter) {
|
|
202
|
-
|
|
203
|
-
blocks.push(renderBlock(`get ${jsName}(): ${tsType}`, getterBody));
|
|
291
|
+
blocks.push(renderBlock(`get ${jsName}(): ${readType}`, renderGetterBody(context, property, accessor)));
|
|
204
292
|
}
|
|
205
293
|
|
|
206
294
|
if (isWritable) {
|
|
207
295
|
const setterBody =
|
|
208
296
|
setterMember === undefined ? renderGenericSetBody(context, property) : `this.${setterMember}(value);`;
|
|
209
297
|
|
|
210
|
-
blocks.push(renderBlock(`set ${jsName}(value: ${
|
|
298
|
+
blocks.push(renderBlock(`set ${jsName}(value: ${writeType})`, setterBody));
|
|
211
299
|
}
|
|
212
300
|
|
|
213
|
-
return `${
|
|
301
|
+
return `${propertyDoc(property)}${blocks.join("\n\n")}`;
|
|
214
302
|
};
|
|
215
303
|
|
|
304
|
+
const propertyDoc = (property: GirProperty): string =>
|
|
305
|
+
getDoc(property);
|
|
306
|
+
|
|
216
307
|
const renderPropertyAccessor = (args: PropertyAccessorArgs): string | undefined =>
|
|
217
308
|
withAccessor(args, (accessor) => renderResolvedPropertyAccessor(args.context, args.property, accessor));
|
|
218
309
|
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
const doc = renderJsDoc(args.property.doc);
|
|
310
|
+
const renderAccessorPairSignature = (accessor: ResolvedAccessor): string => {
|
|
311
|
+
const { jsName, readType, writeType, hasGetter, isWritable } = accessor;
|
|
222
312
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
313
|
+
if (!hasGetter) {
|
|
314
|
+
return `set ${jsName}(value: ${writeType});`;
|
|
315
|
+
}
|
|
226
316
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
317
|
+
if (!isWritable) {
|
|
318
|
+
return `get ${jsName}(): ${readType};`;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (readType === writeType) {
|
|
322
|
+
return `${jsName}: ${readType};`;
|
|
323
|
+
}
|
|
230
324
|
|
|
231
|
-
|
|
232
|
-
|
|
325
|
+
return `get ${jsName}(): ${readType};\nset ${jsName}(value: ${writeType});`;
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
const renderPropertyAccessorSignature = (args: PropertyAccessorArgs): string | undefined =>
|
|
329
|
+
withAccessor(args, (accessor) => `${propertyDoc(args.property)}${renderAccessorPairSignature(accessor)}`);
|
|
233
330
|
|
|
234
331
|
const renderPropertyDescriptor = (context: ModuleContext, property: GirProperty): string =>
|
|
235
332
|
renderDescriptor(context, property.type, property.transferOwnership);
|
|
@@ -250,21 +347,10 @@ const renderGenericSetBody = (context: ModuleContext, property: GirProperty): st
|
|
|
250
347
|
return `setObjectProperty(this, ${sourceStringLiteral(property.name)}, ${descriptor}, value);`;
|
|
251
348
|
};
|
|
252
349
|
|
|
253
|
-
const renderGetterBody = (
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
return renderGenericGetBody(context, property, tsType);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
if (getterMethod === undefined) {
|
|
261
|
-
return `return this.${getterMember}() as ${tsType};`;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
const getterType = renderMethodReturnType(context, getterMethod);
|
|
265
|
-
|
|
266
|
-
return getterType === tsType ? `return this.${getterMember}();` : `return this.${getterMember}() as ${tsType};`;
|
|
267
|
-
};
|
|
350
|
+
const renderGetterBody = (context: ModuleContext, property: GirProperty, accessor: ResolvedAccessor): string =>
|
|
351
|
+
accessor.getterMember === undefined
|
|
352
|
+
? renderGenericGetBody(context, property, accessor.readType)
|
|
353
|
+
: `return this.${accessor.getterMember}();`;
|
|
268
354
|
|
|
269
355
|
const delegateMember = (
|
|
270
356
|
attribute: string | undefined,
|
|
@@ -289,12 +375,14 @@ const delegateMember = (
|
|
|
289
375
|
};
|
|
290
376
|
|
|
291
377
|
export {
|
|
378
|
+
propertyDoc,
|
|
292
379
|
resolveAccessor,
|
|
293
380
|
resolveOwnerAccessor,
|
|
294
|
-
|
|
381
|
+
resolveAccessorTypes,
|
|
295
382
|
renderResolvedPropertyAccessor,
|
|
296
383
|
renderPropertyAccessor,
|
|
297
384
|
renderPropertyAccessorSignature,
|
|
385
|
+
type InheritedAccessorTypes,
|
|
298
386
|
type ResolvedAccessor,
|
|
299
387
|
type PropertyAccessorArgs,
|
|
300
388
|
};
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { sourceStringLiteral, toCamelIdentifier } from "@gtkx/utils";
|
|
2
2
|
import type { GirField } from "../../gir/field.js";
|
|
3
|
+
import type { GirFunction } from "../../gir/function.js";
|
|
3
4
|
import type { GirRecord } from "../../gir/record.js";
|
|
4
5
|
import type { TypeId } from "../../gir/type-id.js";
|
|
5
6
|
import type { ModuleContext } from "../../writer/context.js";
|
|
6
7
|
import { renderDescriptor } from "../../analysis/descriptor-render.js";
|
|
8
|
+
import { inputParameters, parameterIdentifier } from "../../analysis/param-structure.js";
|
|
7
9
|
import { renderTsType } from "../../analysis/ts-type.js";
|
|
8
10
|
import { renderBlock, renderBracedOrEmpty } from "../../writer/emit.js";
|
|
11
|
+
import { type Callables, staticMembers } from "./callables.js";
|
|
12
|
+
import { getDoc } from "./doc-spec.js";
|
|
9
13
|
import { renderSourceGtype } from "./gtype-binding.js";
|
|
10
14
|
import { emitFieldWrite, isEmittableField, isInlineField } from "./record-field-accessor.js";
|
|
11
15
|
import { computeRecordFieldSlots, type RecordFieldSlot } from "./record-layout.js";
|
|
@@ -13,33 +17,70 @@ import { isConstructibleRecord } from "./value-marshalable.js";
|
|
|
13
17
|
|
|
14
18
|
type WritableFieldSlot = RecordFieldSlot & { field: GirField & { type: TypeId } };
|
|
15
19
|
|
|
20
|
+
type RecordConstructorSpec = {
|
|
21
|
+
record: GirRecord;
|
|
22
|
+
className: string;
|
|
23
|
+
callables: Callables;
|
|
24
|
+
isErrorSubclass: boolean;
|
|
25
|
+
};
|
|
26
|
+
|
|
16
27
|
const isWritableFieldSlot = (context: ModuleContext, entry: RecordFieldSlot): entry is WritableFieldSlot =>
|
|
17
28
|
entry.field.writable && isEmittableField(context, entry.field);
|
|
18
29
|
|
|
19
|
-
const isOpaque = (record: GirRecord): boolean => record.opaque || record.disguised;
|
|
20
|
-
|
|
21
30
|
const renderRecordConstructorPropsInterface = (
|
|
22
31
|
context: ModuleContext,
|
|
23
32
|
record: GirRecord,
|
|
24
33
|
className: string,
|
|
25
34
|
): string => {
|
|
26
35
|
const head = `export interface ${className}ConstructorProps`;
|
|
27
|
-
|
|
28
|
-
if (isOpaque(record) || !isConstructibleRecord(context, context.namespace.name, record)) {
|
|
29
|
-
return renderBracedOrEmpty(head, "");
|
|
30
|
-
}
|
|
31
|
-
|
|
32
36
|
const { slots } = computeRecordFieldSlots(context, record.fields, record.isUnion);
|
|
33
37
|
|
|
34
38
|
const lines = slots
|
|
35
39
|
.filter((entry): entry is WritableFieldSlot => isWritableFieldSlot(context, entry))
|
|
36
|
-
.map(
|
|
40
|
+
.map(
|
|
41
|
+
(entry) =>
|
|
42
|
+
`${getDoc(entry.field)}${toCamelIdentifier(entry.field.name)}?: ` +
|
|
43
|
+
`${renderTsType(context, entry.field.type, true)};`,
|
|
44
|
+
);
|
|
37
45
|
|
|
38
46
|
return renderBracedOrEmpty(head, lines.join("\n"));
|
|
39
47
|
};
|
|
40
48
|
|
|
41
|
-
const
|
|
42
|
-
const
|
|
49
|
+
const isSelfReturning = (context: ModuleContext, record: GirRecord, callable: GirFunction): boolean => {
|
|
50
|
+
const ref = callable.returnValue.type;
|
|
51
|
+
const name = ref === undefined ? undefined : context.library.nameFor(ref);
|
|
52
|
+
|
|
53
|
+
return name?.namespaceName === context.namespace.name && name.typeName === record.name;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const renderStaticCall = (context: ModuleContext, callable: GirFunction, name: string): string => {
|
|
57
|
+
const args = inputParameters(context.library, callable).map(({ parameter, index }) =>
|
|
58
|
+
parameterIdentifier(parameter, index));
|
|
59
|
+
|
|
60
|
+
return `${name}(${args.join(", ")})`;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const constructionHint = (context: ModuleContext, spec: RecordConstructorSpec): string | undefined => {
|
|
64
|
+
const candidates = staticMembers(context, spec.callables).filter(({ callable }) =>
|
|
65
|
+
isSelfReturning(context, spec.record, callable));
|
|
66
|
+
|
|
67
|
+
const candidate = candidates.find(({ name }) => name === "new") ?? candidates[0];
|
|
68
|
+
|
|
69
|
+
return candidate === undefined ? undefined : renderStaticCall(context, candidate.callable, candidate.name);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const unconstructibleMessage = (context: ModuleContext, spec: RecordConstructorSpec): string => {
|
|
73
|
+
const qualified = `${context.namespace.name}.${spec.className}`;
|
|
74
|
+
const hint = constructionHint(context, spec);
|
|
75
|
+
|
|
76
|
+
return hint === undefined
|
|
77
|
+
? `Cannot construct ${qualified} with new: its instances come from the functions that return them.`
|
|
78
|
+
: `Cannot construct ${qualified} with new: use ${qualified}.${hint} instead.`;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const renderUnconstructibleGuard = (context: ModuleContext, spec: RecordConstructorSpec): string => {
|
|
82
|
+
const superCall = spec.isErrorSubclass ? ["super();"] : [];
|
|
83
|
+
const message = sourceStringLiteral(unconstructibleMessage(context, spec));
|
|
43
84
|
|
|
44
85
|
return renderBlock("constructor()", [...superCall, `throw new globalThis.Error(${message});`].join("\n"));
|
|
45
86
|
};
|
|
@@ -61,18 +102,14 @@ const renderFieldWrites = (context: ModuleContext, slots: RecordFieldSlot[]): st
|
|
|
61
102
|
return statements;
|
|
62
103
|
};
|
|
63
104
|
|
|
64
|
-
const renderRecordConstructor = (
|
|
65
|
-
|
|
66
|
-
record: GirRecord,
|
|
67
|
-
className: string,
|
|
68
|
-
isErrorSubclass = false,
|
|
69
|
-
): string => {
|
|
70
|
-
const superCall = isErrorSubclass ? ["super();"] : [];
|
|
105
|
+
const renderRecordConstructor = (context: ModuleContext, spec: RecordConstructorSpec): string => {
|
|
106
|
+
const { record, className, isErrorSubclass } = spec;
|
|
71
107
|
|
|
72
|
-
if (
|
|
73
|
-
return
|
|
108
|
+
if (!isConstructibleRecord(context, context.namespace.name, record)) {
|
|
109
|
+
return renderUnconstructibleGuard(context, spec);
|
|
74
110
|
}
|
|
75
111
|
|
|
112
|
+
const superCall = isErrorSubclass ? ["super();"] : [];
|
|
76
113
|
const { slots, size } = computeRecordFieldSlots(context, record.fields, record.isUnion);
|
|
77
114
|
|
|
78
115
|
if (size === 0) {
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { toCamelIdentifier } from "@gtkx/utils";
|
|
2
|
+
import type { GirAnnotations } from "../../gir/annotations.js";
|
|
2
3
|
import type { GirField } from "../../gir/field.js";
|
|
4
|
+
import type { GirRecord } from "../../gir/record.js";
|
|
3
5
|
import type { FieldSlot } from "../../gir/size.js";
|
|
4
6
|
import type { TypeId } from "../../gir/type-id.js";
|
|
5
7
|
import type { GirType } from "../../gir/type.js";
|
|
@@ -7,8 +9,8 @@ import type { ModuleContext } from "../../writer/context.js";
|
|
|
7
9
|
import { isInlineCallbackRef, renderDescriptor } from "../../analysis/descriptor-render.js";
|
|
8
10
|
import { tStruct } from "../../analysis/descriptor.js";
|
|
9
11
|
import { renderTsType } from "../../analysis/ts-type.js";
|
|
10
|
-
import { renderJsDoc } from "../../writer/doc.js";
|
|
11
12
|
import { indent, renderBlock } from "../../writer/emit.js";
|
|
13
|
+
import { getDoc } from "./doc-spec.js";
|
|
12
14
|
import { bitMask, computeRecordFieldSlots, mergeBitfield, type RecordFieldSlot } from "./record-layout.js";
|
|
13
15
|
import { wrapReturnValue } from "./return-wrap.js";
|
|
14
16
|
import { isValueMarshalable } from "./value-marshalable.js";
|
|
@@ -30,6 +32,7 @@ type RecordFieldEntry = {
|
|
|
30
32
|
tsType: string;
|
|
31
33
|
isWritable: boolean;
|
|
32
34
|
doc: string | undefined;
|
|
35
|
+
annotations: GirAnnotations;
|
|
33
36
|
};
|
|
34
37
|
|
|
35
38
|
type InlineFieldVisit = {
|
|
@@ -180,6 +183,7 @@ const resolveRecordFieldEntry = (
|
|
|
180
183
|
tsType: renderTsType(context, admitted.field.type, false),
|
|
181
184
|
isWritable: admitted.field.writable,
|
|
182
185
|
doc: admitted.field.doc,
|
|
186
|
+
annotations: admitted.field.annotations,
|
|
183
187
|
};
|
|
184
188
|
};
|
|
185
189
|
|
|
@@ -196,7 +200,7 @@ const renderRecordFieldAccessor = (
|
|
|
196
200
|
}
|
|
197
201
|
|
|
198
202
|
const { field, jsName } = admitted;
|
|
199
|
-
const doc =
|
|
203
|
+
const doc = getDoc(field);
|
|
200
204
|
const structArray = renderStructArrayAccessor(context, { field, jsName, slot: slot.slot, siblingFields });
|
|
201
205
|
|
|
202
206
|
if (structArray !== undefined) {
|
|
@@ -476,6 +480,12 @@ const structArraySetterBlock = (options: StructArrayAccessorOptions): string =>
|
|
|
476
480
|
structArraySetterStatements(options.context, options),
|
|
477
481
|
);
|
|
478
482
|
|
|
483
|
+
const isPlainDataRecord = (record: GirRecord): boolean =>
|
|
484
|
+
record.glibGetType === undefined &&
|
|
485
|
+
record.constructors.length === 0 &&
|
|
486
|
+
record.functions.length === 0 &&
|
|
487
|
+
record.methods.length === 0;
|
|
488
|
+
|
|
479
489
|
const resolveStructArrayElements = (context: ModuleContext, fieldType: TypeId): StructArrayElements | undefined => {
|
|
480
490
|
const arrayType = context.library.typeFor(fieldType);
|
|
481
491
|
|
|
@@ -485,7 +495,7 @@ const resolveStructArrayElements = (context: ModuleContext, fieldType: TypeId):
|
|
|
485
495
|
|
|
486
496
|
const elementType = context.library.typeFor(arrayType.element);
|
|
487
497
|
|
|
488
|
-
if (elementType?.kind === "record" && elementType.value
|
|
498
|
+
if (elementType?.kind === "record" && !isPlainDataRecord(elementType.value)) {
|
|
489
499
|
return undefined;
|
|
490
500
|
}
|
|
491
501
|
|
|
@@ -632,5 +642,4 @@ export {
|
|
|
632
642
|
emitFieldWrite,
|
|
633
643
|
resolveRecordFieldEntry,
|
|
634
644
|
renderRecordFieldAccessor,
|
|
635
|
-
type RecordFieldEntry,
|
|
636
645
|
};
|
|
@@ -46,6 +46,16 @@ const computeRecordFieldSlots = (
|
|
|
46
46
|
return { slots, size: result.size };
|
|
47
47
|
};
|
|
48
48
|
|
|
49
|
+
const recordInlineSize = (context: ModuleContext, record: ResolvedRecordValue): number | undefined => {
|
|
50
|
+
if (record.opaque || record.disguised || record.fields.length === 0) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const { size } = computeRecordFieldSlots(context, record.fields, record.isUnion);
|
|
55
|
+
|
|
56
|
+
return size > 0 ? size : undefined;
|
|
57
|
+
};
|
|
58
|
+
|
|
49
59
|
const bitMask = (width: number): number => {
|
|
50
60
|
if (width >= 32) {
|
|
51
61
|
return 0xFF_FF_FF_FF;
|
|
@@ -66,7 +76,7 @@ const mergeBitfield = (readExpr: string, valueExpr: string, mask: number, shift:
|
|
|
66
76
|
|
|
67
77
|
const fieldLayoutInput = (context: ModuleContext, field: GirField, visited: Set<string>): FieldLayoutInput => {
|
|
68
78
|
if (field.inlineMembers !== undefined) {
|
|
69
|
-
const layout = inlineMemberLayout(context, field.inlineMembers, field.
|
|
79
|
+
const layout = inlineMemberLayout(context, field.inlineMembers, field.isInlineUnion, visited);
|
|
70
80
|
|
|
71
81
|
return { layout, bits: undefined };
|
|
72
82
|
}
|
|
@@ -214,4 +224,4 @@ const resolveAliasLayout = (
|
|
|
214
224
|
return layoutOfType(context, ref, resolved.value.targetCType, visited);
|
|
215
225
|
};
|
|
216
226
|
|
|
217
|
-
export { computeRecordFieldSlots, bitMask, mergeBitfield, type RecordFieldSlot };
|
|
227
|
+
export { computeRecordFieldSlots, recordInlineSize, bitMask, mergeBitfield, type RecordFieldSlot };
|
package/src/store/gi/record.ts
CHANGED
|
@@ -1,27 +1,26 @@
|
|
|
1
|
+
import { sanitizeTypeIdentifier } from "@gtkx/utils";
|
|
1
2
|
import type { GirRecord } from "../../gir/record.js";
|
|
2
3
|
import type { ModuleContext } from "../../writer/context.js";
|
|
3
|
-
import {
|
|
4
|
+
import { isEmittableEntity } from "../../gir/emittable.js";
|
|
4
5
|
import { indentMembers } from "../../writer/emit.js";
|
|
5
6
|
import { type Callables, dedupeCallables, generateBindings, renderPlainTypeMembers } from "./callables.js";
|
|
7
|
+
import { getDoc } from "./doc-spec.js";
|
|
6
8
|
import { renderSourceGtype } from "./gtype-binding.js";
|
|
7
9
|
import { renderRecordConstructor, renderRecordConstructorPropsInterface } from "./record-constructor.js";
|
|
8
10
|
import { renderRecordFieldAccessor } from "./record-field-accessor.js";
|
|
9
11
|
import { computeRecordFieldSlots } from "./record-layout.js";
|
|
10
12
|
import { appendWrapperClassRegistration } from "./registration.js";
|
|
13
|
+
import { isConstructibleRecord } from "./value-marshalable.js";
|
|
11
14
|
|
|
12
15
|
const isGErrorRecord = (context: ModuleContext, record: GirRecord): boolean =>
|
|
13
16
|
context.namespace.name === "GLib" && record.glibGetType === "g_error_get_type";
|
|
14
17
|
|
|
15
18
|
const generateRecord = (context: ModuleContext, record: GirRecord): void => {
|
|
16
|
-
if (!record
|
|
19
|
+
if (!isEmittableEntity(record)) {
|
|
17
20
|
return;
|
|
18
21
|
}
|
|
19
22
|
|
|
20
|
-
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const className = record.name;
|
|
23
|
+
const className = sanitizeTypeIdentifier(record.name);
|
|
25
24
|
const isErrorSubclass = isGErrorRecord(context, record);
|
|
26
25
|
|
|
27
26
|
const callables: Callables = {
|
|
@@ -34,8 +33,23 @@ const generateRecord = (context: ModuleContext, record: GirRecord): void => {
|
|
|
34
33
|
const members = renderRecordMembers(context, record, className, callables);
|
|
35
34
|
const body = indentMembers(members);
|
|
36
35
|
const heritage = isErrorSubclass ? " extends globalThis.Error" : "";
|
|
37
|
-
|
|
38
|
-
context.
|
|
36
|
+
const doc = getDoc(record);
|
|
37
|
+
const isConstructible = isConstructibleRecord(context, context.namespace.name, record);
|
|
38
|
+
const modifier = isConstructible ? "" : "abstract ";
|
|
39
|
+
|
|
40
|
+
context.declare({
|
|
41
|
+
name: className,
|
|
42
|
+
code: `${doc}export ${modifier}class ${className}${heritage} {\n${body}\n}`,
|
|
43
|
+
owner: record.name,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
if (isConstructible) {
|
|
47
|
+
context.declare({
|
|
48
|
+
name: `${className}ConstructorProps`,
|
|
49
|
+
code: renderRecordConstructorPropsInterface(context, record, className),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
39
53
|
const gtypeExpr = renderSourceGtype(context, record);
|
|
40
54
|
|
|
41
55
|
appendWrapperClassRegistration(context, {
|
|
@@ -59,7 +73,7 @@ const renderRecordMembers = (
|
|
|
59
73
|
hasGtype: record.glibGetType !== undefined,
|
|
60
74
|
});
|
|
61
75
|
|
|
62
|
-
members.unshift(renderRecordConstructor(context, record, className, isErrorSubclass));
|
|
76
|
+
members.unshift(renderRecordConstructor(context, { record, className, callables, isErrorSubclass }));
|
|
63
77
|
const { slots } = computeRecordFieldSlots(context, record.fields, record.isUnion);
|
|
64
78
|
|
|
65
79
|
for (const slot of slots) {
|