@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
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { lowerFirst, pascalCase, sanitizeTypeIdentifier, toCamelIdentifier } from "@gtkx/utils";
|
|
2
2
|
import type { GirClass } from "../gir/class.js";
|
|
3
3
|
import type { GirFunction } from "../gir/function.js";
|
|
4
4
|
import type { Library } from "../gir/library.js";
|
|
5
|
+
import type { GirParameter } from "../gir/parameter.js";
|
|
5
6
|
import type { GirProperty } from "../gir/property.js";
|
|
6
7
|
import type { TypeId } from "../gir/type-id.js";
|
|
7
8
|
import type { ModuleContext } from "../writer/context.js";
|
|
8
|
-
import { ancestorChain, type ResolvedAncestor,
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { ancestorChain, type ResolvedAncestor, resolveInterfaces } from "../gir/ancestry.js";
|
|
10
|
+
import { isEmittableEntity } from "../gir/emittable.js";
|
|
11
|
+
import { memberName, methodExportName } from "../store/gi/method.js";
|
|
12
|
+
import { type InheritedAccessorTypes, resolveAccessorTypes } from "../store/gi/property-accessor.js";
|
|
13
|
+
import { vfuncMemberNames } from "../store/gi/vtable.js";
|
|
14
|
+
import { comparisonContextFor } from "../writer/comparison-context.js";
|
|
11
15
|
import { inputParameters } from "./param-structure.js";
|
|
12
16
|
import { renderTsType } from "./ts-type.js";
|
|
13
17
|
|
|
@@ -17,6 +21,8 @@ type AncestryContext = {
|
|
|
17
21
|
};
|
|
18
22
|
|
|
19
23
|
type OwnedProperty = { owner: GirClass; property: GirProperty };
|
|
24
|
+
type DeclaredAccessorType = { type: string; owner: string };
|
|
25
|
+
type DeclaredAccessorTypes = { read: DeclaredAccessorType | undefined; write: DeclaredAccessorType | undefined };
|
|
20
26
|
type MethodSignature = { returnType: string; arity: number };
|
|
21
27
|
|
|
22
28
|
type InheritedMethod = {
|
|
@@ -29,6 +35,11 @@ type InheritedMethods = {
|
|
|
29
35
|
definitions: Map<string, InheritedMethod>;
|
|
30
36
|
};
|
|
31
37
|
|
|
38
|
+
type ParameterPair = {
|
|
39
|
+
own: GirParameter;
|
|
40
|
+
inherited: GirParameter;
|
|
41
|
+
};
|
|
42
|
+
|
|
32
43
|
type InheritedMatch = {
|
|
33
44
|
inheritedReturn: string;
|
|
34
45
|
inheritedMethod: InheritedMethod;
|
|
@@ -45,29 +56,11 @@ const RESERVED_SIGNAL_MEMBERS = new Set([
|
|
|
45
56
|
"removeEventListener",
|
|
46
57
|
]);
|
|
47
58
|
|
|
48
|
-
const resolveImplementedInterface = (
|
|
49
|
-
context: AncestryContext,
|
|
50
|
-
name: string,
|
|
51
|
-
defaultNamespace: string = context.namespace.name,
|
|
52
|
-
): ResolvedAncestor | undefined => resolveInterface(context.library, defaultNamespace, name);
|
|
53
|
-
|
|
54
59
|
const resolveDirectInterfaces = (
|
|
55
60
|
context: AncestryContext,
|
|
56
61
|
klass: GirClass,
|
|
57
62
|
defaultNamespace: string,
|
|
58
|
-
): ResolvedAncestor[] =>
|
|
59
|
-
const interfaces: ResolvedAncestor[] = [];
|
|
60
|
-
|
|
61
|
-
for (const implementName of klass.implements) {
|
|
62
|
-
const iface = resolveImplementedInterface(context, implementName, defaultNamespace);
|
|
63
|
-
|
|
64
|
-
if (iface !== undefined) {
|
|
65
|
-
interfaces.push(iface);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return interfaces;
|
|
70
|
-
};
|
|
63
|
+
): ResolvedAncestor[] => resolveInterfaces(context.library, defaultNamespace, klass.implements);
|
|
71
64
|
|
|
72
65
|
const resolvePrerequisiteReference = (context: ModuleContext, name: string): string | undefined => {
|
|
73
66
|
const resolved = context.library.resolveType(context.namespace.name, name);
|
|
@@ -80,7 +73,11 @@ const resolvePrerequisiteReference = (context: ModuleContext, name: string): str
|
|
|
80
73
|
return undefined;
|
|
81
74
|
}
|
|
82
75
|
|
|
83
|
-
|
|
76
|
+
if (!isEmittableEntity(resolved.value)) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return context.qualify(resolved.namespace.name, sanitizeTypeIdentifier(resolved.value.name));
|
|
84
81
|
};
|
|
85
82
|
|
|
86
83
|
const forEachAncestor = (
|
|
@@ -116,7 +113,7 @@ const visitInterfaceProperties = (
|
|
|
116
113
|
}
|
|
117
114
|
};
|
|
118
115
|
|
|
119
|
-
const
|
|
116
|
+
const forEachAncestorProperty = (
|
|
120
117
|
context: ModuleContext,
|
|
121
118
|
klass: GirClass,
|
|
122
119
|
visit: (owner: GirClass, property: GirProperty) => void,
|
|
@@ -130,6 +127,15 @@ const forEachInheritedProperty = (
|
|
|
130
127
|
});
|
|
131
128
|
};
|
|
132
129
|
|
|
130
|
+
const forEachInheritedProperty = (
|
|
131
|
+
context: ModuleContext,
|
|
132
|
+
klass: GirClass,
|
|
133
|
+
visit: (owner: GirClass, property: GirProperty) => void,
|
|
134
|
+
): void => {
|
|
135
|
+
visitInterfaceProperties(resolveDirectInterfaces(context, klass, context.namespace.name), visit);
|
|
136
|
+
forEachAncestorProperty(context, klass, visit);
|
|
137
|
+
};
|
|
138
|
+
|
|
133
139
|
const collectSeenPropertyNames = (context: ModuleContext, klass: GirClass): Set<string> => {
|
|
134
140
|
const seen: Set<string> = new Set();
|
|
135
141
|
|
|
@@ -137,7 +143,7 @@ const collectSeenPropertyNames = (context: ModuleContext, klass: GirClass): Set<
|
|
|
137
143
|
seen.add(toCamelIdentifier(property.name));
|
|
138
144
|
}
|
|
139
145
|
|
|
140
|
-
|
|
146
|
+
forEachAncestorProperty(context, klass, (_owner, property) => seen.add(toCamelIdentifier(property.name)));
|
|
141
147
|
|
|
142
148
|
return seen;
|
|
143
149
|
};
|
|
@@ -176,7 +182,7 @@ const recordAncestorSignatures = (
|
|
|
176
182
|
signatures: Map<string, MethodSignature>,
|
|
177
183
|
): void => {
|
|
178
184
|
for (const method of klass.methods) {
|
|
179
|
-
const name =
|
|
185
|
+
const name = memberName(method.name);
|
|
180
186
|
|
|
181
187
|
if (!method.introspectable || signatures.has(name)) {
|
|
182
188
|
continue;
|
|
@@ -199,6 +205,9 @@ const ancestorClassMethodSignatures = (context: ModuleContext, klass: GirClass):
|
|
|
199
205
|
return signatures;
|
|
200
206
|
};
|
|
201
207
|
|
|
208
|
+
const ancestorClassMethodNames = (context: ModuleContext, klass: GirClass): Set<string> =>
|
|
209
|
+
new Set(ancestorClassMethodSignatures(context, klass).keys());
|
|
210
|
+
|
|
202
211
|
const mergeOmissionName = (
|
|
203
212
|
context: ModuleContext,
|
|
204
213
|
method: GirFunction,
|
|
@@ -208,7 +217,7 @@ const mergeOmissionName = (
|
|
|
208
217
|
return undefined;
|
|
209
218
|
}
|
|
210
219
|
|
|
211
|
-
const name =
|
|
220
|
+
const name = memberName(method.name);
|
|
212
221
|
const ancestor = ancestors.get(name);
|
|
213
222
|
|
|
214
223
|
if (ancestor === undefined) {
|
|
@@ -221,43 +230,105 @@ const mergeOmissionName = (
|
|
|
221
230
|
return ancestor.returnType !== returnType || ancestor.arity !== arity ? name : undefined;
|
|
222
231
|
};
|
|
223
232
|
|
|
224
|
-
const
|
|
233
|
+
const classChainVfuncNames = (context: ModuleContext, klass: GirClass): Set<string> => {
|
|
234
|
+
const names: Set<string> = new Set(vfuncMemberNames(context, context.namespace.name, klass));
|
|
235
|
+
|
|
236
|
+
forEachAncestor(context, klass, (ancestor) => {
|
|
237
|
+
for (const name of vfuncMemberNames(context, ancestor.namespaceName, ancestor.klass)) {
|
|
238
|
+
names.add(name);
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
return names;
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
const methodMergeOmissions = (context: ModuleContext, klass: GirClass, iface: GirClass): string[] => {
|
|
246
|
+
const ancestors = ancestorClassMethodSignatures(context, klass);
|
|
247
|
+
|
|
248
|
+
return iface.methods
|
|
249
|
+
.map((method) => mergeOmissionName(context, method, ancestors))
|
|
250
|
+
.filter((name): name is string => name !== undefined);
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
const vfuncMergeOmissions = (
|
|
225
254
|
context: ModuleContext,
|
|
226
255
|
klass: GirClass,
|
|
227
256
|
iface: { klass: GirClass; namespaceName: string },
|
|
228
257
|
): string[] => {
|
|
229
|
-
const
|
|
230
|
-
const omissions: string[] = [];
|
|
258
|
+
const claimed = classChainVfuncNames(context, klass);
|
|
231
259
|
|
|
232
|
-
|
|
233
|
-
|
|
260
|
+
return vfuncMemberNames(context, iface.namespaceName, iface.klass).filter((name) => claimed.has(name));
|
|
261
|
+
};
|
|
234
262
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
263
|
+
const collectInterfaceMergeOmissions = (
|
|
264
|
+
context: ModuleContext,
|
|
265
|
+
klass: GirClass,
|
|
266
|
+
iface: { klass: GirClass; namespaceName: string },
|
|
267
|
+
): string[] => [
|
|
268
|
+
...methodMergeOmissions(context, klass, iface.klass),
|
|
269
|
+
...vfuncMergeOmissions(context, klass, iface),
|
|
270
|
+
];
|
|
271
|
+
|
|
272
|
+
const declaredBy = (type: string | undefined, owner: string): DeclaredAccessorType | undefined =>
|
|
273
|
+
type === undefined ? undefined : { type, owner };
|
|
274
|
+
|
|
275
|
+
const reconcileAccessorType = (
|
|
276
|
+
jsName: string,
|
|
277
|
+
direction: string,
|
|
278
|
+
declared: DeclaredAccessorType | undefined,
|
|
279
|
+
candidate: DeclaredAccessorType | undefined,
|
|
280
|
+
): DeclaredAccessorType | undefined => {
|
|
281
|
+
if (candidate === undefined) {
|
|
282
|
+
return declared;
|
|
238
283
|
}
|
|
239
284
|
|
|
240
|
-
|
|
285
|
+
if (declared === undefined || declared.type === candidate.type) {
|
|
286
|
+
return declared ?? candidate;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
throw new Error(
|
|
290
|
+
`Cannot type the ${direction} accessor of ${jsName}: ${declared.owner} declares it as ${declared.type} ` +
|
|
291
|
+
`and ${candidate.owner} declares it as ${candidate.type}. Both are bases of the same class, so no single ` +
|
|
292
|
+
"member satisfies them; correct the GIR the disagreeing base comes from.",
|
|
293
|
+
);
|
|
241
294
|
};
|
|
242
295
|
|
|
243
|
-
const
|
|
244
|
-
|
|
296
|
+
const recordInheritedPropertyType = (
|
|
297
|
+
context: ModuleContext,
|
|
298
|
+
types: Map<string, DeclaredAccessorTypes>,
|
|
299
|
+
owner: GirClass,
|
|
300
|
+
property: GirProperty,
|
|
301
|
+
): void => {
|
|
302
|
+
const accessorTypes = resolveAccessorTypes(context, property, owner.methods);
|
|
245
303
|
|
|
246
|
-
|
|
247
|
-
|
|
304
|
+
if (accessorTypes === undefined) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
248
307
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}
|
|
308
|
+
const jsName = toCamelIdentifier(property.name);
|
|
309
|
+
const declared = types.get(jsName);
|
|
252
310
|
|
|
253
|
-
|
|
311
|
+
types.set(jsName, {
|
|
312
|
+
read: reconcileAccessorType(jsName, "read", declared?.read, declaredBy(accessorTypes.readType, owner.name)),
|
|
313
|
+
write: reconcileAccessorType(jsName, "write", declared?.write, declaredBy(accessorTypes.writeType, owner.name)),
|
|
314
|
+
});
|
|
315
|
+
};
|
|
254
316
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
317
|
+
const collectInheritedPropertyTypes = (
|
|
318
|
+
context: ModuleContext,
|
|
319
|
+
klass: GirClass,
|
|
320
|
+
): Map<string, InheritedAccessorTypes> => {
|
|
321
|
+
const declared: Map<string, DeclaredAccessorTypes> = new Map();
|
|
322
|
+
|
|
323
|
+
forEachInheritedProperty(context, klass, (owner, property) => {
|
|
324
|
+
recordInheritedPropertyType(context, declared, owner, property);
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
const types: Map<string, InheritedAccessorTypes> = new Map();
|
|
259
328
|
|
|
260
|
-
|
|
329
|
+
for (const [jsName, entry] of declared) {
|
|
330
|
+
types.set(jsName, { readType: entry.read?.type, writeType: entry.write?.type });
|
|
331
|
+
}
|
|
261
332
|
|
|
262
333
|
return types;
|
|
263
334
|
};
|
|
@@ -295,7 +366,7 @@ const absorbInheritedMethods = (
|
|
|
295
366
|
continue;
|
|
296
367
|
}
|
|
297
368
|
|
|
298
|
-
const name =
|
|
369
|
+
const name = memberName(method.name);
|
|
299
370
|
|
|
300
371
|
if (returnTypes.has(name)) {
|
|
301
372
|
continue;
|
|
@@ -329,11 +400,49 @@ const hasMethodConflict = (options: {
|
|
|
329
400
|
return (
|
|
330
401
|
inheritedReturn !== ownReturn ||
|
|
331
402
|
hasParameterEnumConflict(context, callable, inheritedMethod) ||
|
|
332
|
-
|
|
333
|
-
inputParameters(context.library, inheritedMethod.method).length
|
|
403
|
+
hasParameterTypeConflict(context, callable, inheritedMethod.method)
|
|
334
404
|
);
|
|
335
405
|
};
|
|
336
406
|
|
|
407
|
+
const isCallbackType = (context: ModuleContext, ref: TypeId | undefined): boolean =>
|
|
408
|
+
ref !== undefined && context.library.typeFor(ref)?.kind === "callback";
|
|
409
|
+
|
|
410
|
+
const areParametersComparable = (context: ModuleContext, pair: ParameterPair): boolean => {
|
|
411
|
+
if (isCallbackType(context, pair.own.type) && isCallbackType(context, pair.inherited.type)) {
|
|
412
|
+
return true;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
const scratch = comparisonContextFor(context);
|
|
416
|
+
|
|
417
|
+
return renderTsType(scratch, pair.own.type, false) === renderTsType(scratch, pair.inherited.type, false);
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
const inputParameterPairs = (context: ModuleContext, own: GirFunction, inherited: GirFunction): ParameterPair[] => {
|
|
421
|
+
const ownParams = inputParameters(context.library, own);
|
|
422
|
+
const inheritedParams = inputParameters(context.library, inherited);
|
|
423
|
+
const pairs: ParameterPair[] = [];
|
|
424
|
+
|
|
425
|
+
for (const [index, entry] of ownParams.entries()) {
|
|
426
|
+
const other = inheritedParams[index];
|
|
427
|
+
|
|
428
|
+
if (other !== undefined) {
|
|
429
|
+
pairs.push({ own: entry.parameter, inherited: other.parameter });
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return pairs;
|
|
434
|
+
};
|
|
435
|
+
|
|
436
|
+
const hasParameterTypeConflict = (context: ModuleContext, own: GirFunction, inherited: GirFunction): boolean => {
|
|
437
|
+
const ownCount = inputParameters(context.library, own).length;
|
|
438
|
+
|
|
439
|
+
if (ownCount !== inputParameters(context.library, inherited).length) {
|
|
440
|
+
return true;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
return inputParameterPairs(context, own, inherited).some((pair) => !areParametersComparable(context, pair));
|
|
444
|
+
};
|
|
445
|
+
|
|
337
446
|
const conflictRename = (
|
|
338
447
|
context: ModuleContext,
|
|
339
448
|
callable: GirFunction,
|
|
@@ -380,26 +489,9 @@ const hasEnumConflict = (
|
|
|
380
489
|
return ownEnum !== undefined && inheritedEnum !== undefined && ownEnum !== inheritedEnum;
|
|
381
490
|
};
|
|
382
491
|
|
|
383
|
-
const hasParameterEnumConflict = (context: ModuleContext, own: GirFunction, inherited: InheritedMethod): boolean =>
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
const count = Math.min(ownParams.length, inheritedParams.length);
|
|
387
|
-
|
|
388
|
-
for (let index = 0; index < count; index += 1) {
|
|
389
|
-
const ownParam = ownParams[index];
|
|
390
|
-
const inheritedParam = inheritedParams[index];
|
|
391
|
-
|
|
392
|
-
if (
|
|
393
|
-
ownParam !== undefined &&
|
|
394
|
-
inheritedParam !== undefined &&
|
|
395
|
-
hasEnumConflict(context, ownParam.parameter.type, inheritedParam.parameter.type)
|
|
396
|
-
) {
|
|
397
|
-
return true;
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
return false;
|
|
402
|
-
};
|
|
492
|
+
const hasParameterEnumConflict = (context: ModuleContext, own: GirFunction, inherited: InheritedMethod): boolean =>
|
|
493
|
+
inputParameterPairs(context, own, inherited.method).some(
|
|
494
|
+
(pair) => hasEnumConflict(context, pair.own.type, pair.inherited.type));
|
|
403
495
|
|
|
404
496
|
const enumIdentity = (context: ModuleContext, ref: TypeId | undefined): string | undefined => {
|
|
405
497
|
if (ref === undefined) {
|
|
@@ -416,7 +508,7 @@ const enumIdentity = (context: ModuleContext, ref: TypeId | undefined): string |
|
|
|
416
508
|
};
|
|
417
509
|
|
|
418
510
|
export {
|
|
419
|
-
|
|
511
|
+
ancestorClassMethodNames,
|
|
420
512
|
resolvePrerequisiteReference,
|
|
421
513
|
forEachAncestor,
|
|
422
514
|
collectInterfaceProperties,
|
|
@@ -425,6 +517,5 @@ export {
|
|
|
425
517
|
collectInheritedMethods,
|
|
426
518
|
conflictRename,
|
|
427
519
|
reservedSignalMemberRename,
|
|
428
|
-
type OwnedProperty,
|
|
429
520
|
type InheritedMethods,
|
|
430
521
|
};
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import type { GirClass } from "../gir/class.js";
|
|
2
|
+
import type { GirFunction } from "../gir/function.js";
|
|
3
|
+
import type { Library } from "../gir/library.js";
|
|
4
|
+
import type { ModuleContext } from "../writer/context.js";
|
|
5
|
+
import { resolveClassOrInterface, type ResolvedAncestor, resolveInterfaces } from "../gir/ancestry.js";
|
|
6
|
+
import { isOutParameter } from "../gir/parameter.js";
|
|
7
|
+
import { memberName } from "../store/gi/method.js";
|
|
8
|
+
import { protectedChainSlotKeys, vfuncCallables, vfuncMemberNames } from "../store/gi/vtable.js";
|
|
9
|
+
import { forEachAncestor } from "./inheritance.js";
|
|
10
|
+
import { inputParameters } from "./param-structure.js";
|
|
11
|
+
import { typeKey } from "./type-key.js";
|
|
12
|
+
|
|
13
|
+
type MemberTable = Map<string, GirFunction>;
|
|
14
|
+
|
|
15
|
+
type ClaimedMembers = {
|
|
16
|
+
inherited: MemberTable;
|
|
17
|
+
interfaces: MemberTable;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
type InterfaceConflictOptions = {
|
|
21
|
+
context: ModuleContext;
|
|
22
|
+
klass: GirClass;
|
|
23
|
+
iface: GirClass;
|
|
24
|
+
ifaceNamespace: string;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
type CallableKeys = {
|
|
28
|
+
inputs: string[];
|
|
29
|
+
outputs: string[];
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type CallableKeyPair = {
|
|
33
|
+
own: CallableKeys;
|
|
34
|
+
other: CallableKeys;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const CHAINABLE_SIGNAL_MEMBERS = ["addEventListener", "off", "on", "once", "removeEventListener"];
|
|
38
|
+
|
|
39
|
+
const callableKeys = (library: Library, fn: GirFunction): CallableKeys => ({
|
|
40
|
+
inputs: inputParameters(library, fn).map((entry) => typeKey(library, entry.parameter.type)),
|
|
41
|
+
outputs: [
|
|
42
|
+
typeKey(library, fn.returnValue.type),
|
|
43
|
+
...fn.parameters
|
|
44
|
+
.filter((parameter) => isOutParameter(parameter))
|
|
45
|
+
.map((parameter) => typeKey(library, parameter.type)),
|
|
46
|
+
],
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const areKeysEqual = (left: string[], right: string[]): boolean =>
|
|
50
|
+
left.length === right.length && left.every((key, index) => key === right[index]);
|
|
51
|
+
|
|
52
|
+
const callableKeyPair = (library: Library, own: GirFunction, other: GirFunction): CallableKeyPair => ({
|
|
53
|
+
own: callableKeys(library, own),
|
|
54
|
+
other: callableKeys(library, other),
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const areCallablesIdentical = (library: Library, own: GirFunction, other: GirFunction): boolean => {
|
|
58
|
+
const keys = callableKeyPair(library, own, other);
|
|
59
|
+
|
|
60
|
+
return areKeysEqual(keys.own.inputs, keys.other.inputs) && areKeysEqual(keys.own.outputs, keys.other.outputs);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const areCallablesAssignable = (library: Library, own: GirFunction, other: GirFunction): boolean => {
|
|
64
|
+
const keys = callableKeyPair(library, own, other);
|
|
65
|
+
|
|
66
|
+
if (keys.own.inputs.length > keys.other.inputs.length) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (keys.own.inputs.some((key, index) => key !== keys.other.inputs[index])) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return areKeysEqual(keys.other.outputs, ["void"]) || areKeysEqual(keys.own.outputs, keys.other.outputs);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const collectMethods = (klass: GirClass, members: MemberTable): void => {
|
|
78
|
+
for (const method of klass.methods) {
|
|
79
|
+
const name = memberName(method.name);
|
|
80
|
+
|
|
81
|
+
if (method.introspectable && !members.has(name)) {
|
|
82
|
+
members.set(name, method);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const inheritedMembers = (context: ModuleContext, klass: GirClass): ClaimedMembers => {
|
|
88
|
+
const inherited: MemberTable = new Map();
|
|
89
|
+
|
|
90
|
+
forEachAncestor(context, klass, (ancestor) => {
|
|
91
|
+
collectMethods(ancestor.klass, inherited);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
return { inherited, interfaces: new Map() };
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const interfaceMembers = (options: InterfaceConflictOptions): MemberTable => {
|
|
98
|
+
const members: MemberTable = new Map();
|
|
99
|
+
collectMethods(options.iface, members);
|
|
100
|
+
|
|
101
|
+
for (const [key, callable] of vfuncCallables(options.context, options.ifaceNamespace, options.iface)) {
|
|
102
|
+
members.set(key, callable);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return members;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const claimInterfaceMembers = (options: InterfaceConflictOptions, claimed: ClaimedMembers): void => {
|
|
109
|
+
for (const [key, callable] of interfaceMembers(options)) {
|
|
110
|
+
if (!claimed.interfaces.has(key)) {
|
|
111
|
+
claimed.interfaces.set(key, callable);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const isConflictingMember = (library: Library, claimed: ClaimedMembers, entry: [string, GirFunction]): boolean => {
|
|
117
|
+
const [name, method] = entry;
|
|
118
|
+
const owned = claimed.inherited.get(name);
|
|
119
|
+
|
|
120
|
+
if (owned !== undefined) {
|
|
121
|
+
return !areCallablesAssignable(library, owned, method);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const sibling = claimed.interfaces.get(name);
|
|
125
|
+
|
|
126
|
+
return sibling !== undefined && !areCallablesIdentical(library, sibling, method);
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const conflictingMemberNames = (options: InterfaceConflictOptions, claimed: ClaimedMembers): string[] =>
|
|
130
|
+
[...interfaceMembers(options)]
|
|
131
|
+
.filter((entry) => isConflictingMember(options.context.library, claimed, entry))
|
|
132
|
+
.map(([name]) => name);
|
|
133
|
+
|
|
134
|
+
const protectedVfuncNames = (options: InterfaceConflictOptions): string[] => {
|
|
135
|
+
const { context, klass, iface, ifaceNamespace } = options;
|
|
136
|
+
const protectedKeys = protectedChainSlotKeys(context, klass);
|
|
137
|
+
|
|
138
|
+
return vfuncMemberNames(context, ifaceNamespace, iface).filter((key) => protectedKeys.has(key));
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const interfaceConflicts = (options: InterfaceConflictOptions, claimed: ClaimedMembers): string[] => {
|
|
142
|
+
const names = [...conflictingMemberNames(options, claimed), ...protectedVfuncNames(options)];
|
|
143
|
+
|
|
144
|
+
return names.length === 0 ? names : [...new Set([...names, ...CHAINABLE_SIGNAL_MEMBERS])];
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const rootPrerequisite = (library: Library): ResolvedAncestor[] => {
|
|
148
|
+
const root = resolveClassOrInterface(library, "GObject", "Object");
|
|
149
|
+
|
|
150
|
+
return root === undefined ? [] : [root];
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
const interfaceSupertypes = (library: Library, entry: ResolvedAncestor): ResolvedAncestor[] => {
|
|
154
|
+
const prerequisites = entry.klass.prerequisites
|
|
155
|
+
.map((name) => resolveClassOrInterface(library, entry.namespaceName, name))
|
|
156
|
+
.filter((prerequisite) => prerequisite !== undefined);
|
|
157
|
+
|
|
158
|
+
return prerequisites.length === 0 ? rootPrerequisite(library) : prerequisites;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
const classSupertypes = (library: Library, entry: ResolvedAncestor): ResolvedAncestor[] => {
|
|
162
|
+
const interfaces = resolveInterfaces(library, entry.namespaceName, entry.klass.implements);
|
|
163
|
+
|
|
164
|
+
if (entry.klass.parent === undefined) {
|
|
165
|
+
return interfaces;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const parent = resolveClassOrInterface(library, entry.namespaceName, entry.klass.parent);
|
|
169
|
+
|
|
170
|
+
return parent === undefined ? interfaces : [parent, ...interfaces];
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const directSupertypes = (library: Library, entry: ResolvedAncestor): ResolvedAncestor[] =>
|
|
174
|
+
entry.klass.isInterface ? interfaceSupertypes(library, entry) : classSupertypes(library, entry);
|
|
175
|
+
|
|
176
|
+
const collectSupertypeMembers = (
|
|
177
|
+
library: Library,
|
|
178
|
+
entry: ResolvedAncestor,
|
|
179
|
+
visited: Set<string>,
|
|
180
|
+
members: MemberTable,
|
|
181
|
+
): void => {
|
|
182
|
+
const key = `${entry.namespaceName}.${entry.klass.name}`;
|
|
183
|
+
|
|
184
|
+
if (visited.has(key)) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
visited.add(key);
|
|
189
|
+
collectMethods(entry.klass, members);
|
|
190
|
+
|
|
191
|
+
for (const supertype of directSupertypes(library, entry)) {
|
|
192
|
+
collectSupertypeMembers(library, supertype, visited, members);
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
const supertypeMembers = (library: Library, base: ResolvedAncestor): MemberTable => {
|
|
197
|
+
const members: MemberTable = new Map();
|
|
198
|
+
collectSupertypeMembers(library, base, new Set(), members);
|
|
199
|
+
|
|
200
|
+
return members;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
const prerequisiteConflicts = (library: Library, iface: GirClass, base: ResolvedAncestor): string[] => {
|
|
204
|
+
const members: MemberTable = new Map();
|
|
205
|
+
collectMethods(iface, members);
|
|
206
|
+
const inherited = supertypeMembers(library, base);
|
|
207
|
+
const names: string[] = [];
|
|
208
|
+
|
|
209
|
+
for (const [name, method] of members) {
|
|
210
|
+
const owned = inherited.get(name);
|
|
211
|
+
|
|
212
|
+
if (owned !== undefined && !areCallablesAssignable(library, method, owned)) {
|
|
213
|
+
names.push(name);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return names;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const omittedTypeRef = (typeRef: string, omissions: string[]): string => {
|
|
221
|
+
if (omissions.length === 0) {
|
|
222
|
+
return typeRef;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const keys = [...new Set(omissions)].map((name) => JSON.stringify(name)).join(" | ");
|
|
226
|
+
|
|
227
|
+
return `Omit<${typeRef}, ${keys}>`;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
export {
|
|
231
|
+
type ClaimedMembers,
|
|
232
|
+
claimInterfaceMembers,
|
|
233
|
+
inheritedMembers,
|
|
234
|
+
interfaceConflicts,
|
|
235
|
+
omittedTypeRef,
|
|
236
|
+
prerequisiteConflicts,
|
|
237
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Library } from "../gir/library.js";
|
|
2
|
+
import type { GirCallable, GirParameter } from "../gir/parameter.js";
|
|
3
|
+
import type { TypeId } from "../gir/type-id.js";
|
|
4
|
+
import { isOutParameter } from "../gir/parameter.js";
|
|
5
|
+
import { carrayFor, isUnboundedArray, primitiveCategoryFor } from "./type-shape.js";
|
|
6
|
+
|
|
7
|
+
const BYTE_CATEGORIES: Set<string> = new Set(["int8", "uint8"]);
|
|
8
|
+
const CHAR_POINTER = /char\s*\*/;
|
|
9
|
+
|
|
10
|
+
const isByteElement = (library: Library, element: TypeId): boolean => {
|
|
11
|
+
const category = primitiveCategoryFor(library, element);
|
|
12
|
+
|
|
13
|
+
return category !== undefined && BYTE_CATEGORIES.has(category);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const isNulTerminatedBytes = (library: Library, ref: TypeId | undefined): boolean => {
|
|
17
|
+
const type = carrayFor(library, ref);
|
|
18
|
+
|
|
19
|
+
if (type?.arrayCType === undefined || !CHAR_POINTER.test(type.arrayCType)) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return isUnboundedArray(type) && isByteElement(library, type.element);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const nulTerminatedByteParams = (library: Library, callable: GirCallable): GirParameter[] =>
|
|
27
|
+
callable.parameters.filter(
|
|
28
|
+
(parameter) => !isOutParameter(parameter) && isNulTerminatedBytes(library, parameter.type),
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
export { nulTerminatedByteParams };
|