@gtkx/codegen 1.0.0-rc.4 → 1.0.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 +8 -1
- package/dist/analysis/descriptor-render.d.ts.map +1 -1
- package/dist/analysis/descriptor-render.js +37 -24
- package/dist/analysis/descriptor-render.js.map +1 -1
- package/dist/analysis/descriptor.d.ts +1 -1
- package/dist/analysis/descriptor.d.ts.map +1 -1
- package/dist/analysis/descriptor.js.map +1 -1
- package/dist/analysis/inheritance.d.ts +1 -2
- package/dist/analysis/inheritance.d.ts.map +1 -1
- package/dist/analysis/inheritance.js +25 -22
- package/dist/analysis/inheritance.js.map +1 -1
- 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 +130 -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 +40 -14
- package/dist/analysis/param-structure.js.map +1 -1
- 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 +1 -1
- package/dist/compile.d.ts.map +1 -1
- 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 +7 -14
- 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 +32 -20
- 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.js +2 -2
- package/dist/docs/pipeline.js.map +1 -1
- package/dist/docs/render.d.ts +25 -5
- package/dist/docs/render.d.ts.map +1 -1
- package/dist/docs/render.js +84 -22
- 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 +128 -43
- package/dist/docs/symbol-page.js.map +1 -1
- package/dist/fingerprint.d.ts +1 -1
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js.map +1 -1
- package/dist/gir/ancestry.d.ts +2 -2
- package/dist/gir/ancestry.d.ts.map +1 -1
- package/dist/gir/ancestry.js +11 -1
- package/dist/gir/ancestry.js.map +1 -1
- package/dist/gir/annotations.d.ts +22 -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/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.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 +34 -0
- package/dist/gir/library.js.map +1 -1
- package/dist/gir/namespace.d.ts +38 -0
- package/dist/gir/namespace.d.ts.map +1 -1
- package/dist/gir/namespace.js +4 -5
- package/dist/gir/namespace.js.map +1 -1
- package/dist/gir/parameter.d.ts +39 -0
- package/dist/gir/parameter.d.ts.map +1 -1
- package/dist/gir/parameter.js +7 -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 +6 -3
- 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/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 +96 -26
- 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/pipeline.d.ts +3 -1
- 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 -3
- package/dist/khronos/plan.d.ts.map +1 -1
- package/dist/khronos/plan.js +2 -2
- 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 +1 -7
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js.map +1 -1
- 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.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 +3 -1
- package/dist/store/gi/callables.d.ts.map +1 -1
- package/dist/store/gi/callables.js +12 -12
- 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 +2 -2
- 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 +5 -3
- 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/constant.d.ts.map +1 -1
- package/dist/store/gi/constant.js +3 -2
- 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 +29 -16
- package/dist/store/gi/enum.js.map +1 -1
- package/dist/store/gi/function.d.ts.map +1 -1
- package/dist/store/gi/function.js +27 -12
- package/dist/store/gi/function.js.map +1 -1
- package/dist/store/gi/interface.d.ts.map +1 -1
- package/dist/store/gi/interface.js +130 -16
- 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 +9 -1
- package/dist/store/gi/method.d.ts.map +1 -1
- package/dist/store/gi/method.js +69 -26
- package/dist/store/gi/method.js.map +1 -1
- package/dist/store/gi/param-marshal.d.ts +4 -1
- package/dist/store/gi/param-marshal.d.ts.map +1 -1
- package/dist/store/gi/param-marshal.js +5 -1
- 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 +3 -2
- package/dist/store/gi/pipeline.js.map +1 -1
- package/dist/store/gi/properties.d.ts.map +1 -1
- package/dist/store/gi/properties.js +2 -2
- package/dist/store/gi/properties.js.map +1 -1
- package/dist/store/gi/property-accessor.d.ts +3 -1
- package/dist/store/gi/property-accessor.d.ts.map +1 -1
- package/dist/store/gi/property-accessor.js +6 -5
- package/dist/store/gi/property-accessor.js.map +1 -1
- package/dist/store/gi/record-constructor.d.ts.map +1 -1
- package/dist/store/gi/record-constructor.js +3 -1
- 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 +3 -2
- package/dist/store/gi/record-field-accessor.js.map +1 -1
- package/dist/store/gi/record-layout.js +1 -1
- package/dist/store/gi/record-layout.js.map +1 -1
- package/dist/store/gi/record.d.ts.map +1 -1
- package/dist/store/gi/record.js +3 -2
- package/dist/store/gi/record.js.map +1 -1
- package/dist/store/gi/registration.d.ts +1 -1
- package/dist/store/gi/registration.js +2 -2
- 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.map +1 -1
- package/dist/store/gi/signal.js +14 -15
- 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 +1 -1
- package/dist/store/gi/value-marshalable.js.map +1 -1
- package/dist/store/gi/vtable.d.ts +16 -1
- package/dist/store/gi/vtable.d.ts.map +1 -1
- package/dist/store/gi/vtable.js +214 -51
- package/dist/store/gi/vtable.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/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 +7 -6
- package/dist/store/jsx/jsx.js.map +1 -1
- package/dist/store/jsx/metadata.js +2 -2
- 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/writer/context.d.ts +2 -1
- package/dist/writer/context.d.ts.map +1 -1
- package/dist/writer/context.js +3 -0
- 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 +8 -2
- package/dist/writer/module.d.ts.map +1 -1
- package/dist/writer/module.js +13 -1
- package/dist/writer/module.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 +4 -4
- package/src/analysis/descriptor-render.ts +47 -28
- package/src/analysis/descriptor.ts +0 -3
- package/src/analysis/inheritance.ts +35 -34
- package/src/analysis/nul-terminated-bytes.ts +31 -0
- package/src/analysis/param-capability.ts +172 -0
- package/src/analysis/param-structure.ts +83 -23
- package/src/analysis/type-shape.ts +24 -0
- package/src/compile.ts +1 -1
- package/src/docs/api-reference.ts +36 -25
- package/src/docs/element-page.ts +53 -47
- package/src/docs/handwritten-props.ts +230 -0
- package/src/docs/pipeline.ts +2 -2
- package/src/docs/render.ts +146 -32
- package/src/docs/symbol-page.ts +224 -79
- package/src/fingerprint.ts +0 -1
- package/src/gir/ancestry.ts +15 -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/enum.ts +30 -10
- package/src/gir/field.ts +24 -9
- package/src/gir/function.ts +15 -0
- package/src/gir/libraries.ts +11 -3
- package/src/gir/library.ts +51 -2
- package/src/gir/namespace.ts +41 -5
- package/src/gir/parameter.ts +47 -3
- package/src/gir/parse.ts +8 -2
- 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/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 +134 -40
- package/src/khronos/notes.ts +74 -0
- package/src/khronos/param-pair.ts +1 -1
- package/src/khronos/pipeline.ts +94 -41
- package/src/khronos/plan.ts +4 -5
- 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 +1 -8
- package/src/store/compile-store.ts +1 -1
- package/src/store/gi/callable-doc.ts +102 -0
- package/src/store/gi/callables.ts +18 -12
- package/src/store/gi/callback.ts +3 -2
- package/src/store/gi/class.ts +6 -3
- package/src/store/gi/closure-invocation.ts +26 -0
- package/src/store/gi/constant.ts +3 -4
- package/src/store/gi/constructor-props.ts +19 -23
- package/src/store/gi/doc-spec.ts +38 -0
- package/src/store/gi/enum.ts +55 -20
- package/src/store/gi/function.ts +43 -21
- package/src/store/gi/interface.ts +214 -26
- package/src/store/gi/item-comparators.ts +3 -5
- package/src/store/gi/method.ts +98 -42
- package/src/store/gi/param-marshal.ts +15 -1
- package/src/store/gi/pipeline.ts +7 -2
- package/src/store/gi/properties.ts +3 -2
- package/src/store/gi/property-accessor.ts +9 -4
- package/src/store/gi/record-constructor.ts +6 -1
- package/src/store/gi/record-field-accessor.ts +5 -3
- package/src/store/gi/record-layout.ts +1 -1
- package/src/store/gi/record.ts +8 -2
- package/src/store/gi/registration.ts +3 -3
- package/src/store/gi/runtime-override.ts +13 -6
- package/src/store/gi/signal.ts +19 -20
- package/src/store/gi/value-marshalable.ts +1 -1
- package/src/store/gi/vtable.ts +361 -60
- 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/intrinsic-elements.ts +4 -0
- package/src/store/jsx/jsx.ts +8 -6
- package/src/store/jsx/metadata.ts +2 -2
- package/src/store/jsx/pipeline.ts +1 -1
- package/src/store/jsx/props.ts +20 -7
- package/src/writer/context.ts +5 -1
- 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 +25 -2
|
@@ -1,20 +1,24 @@
|
|
|
1
|
-
import { pascalCase } from "@gtkx/utils";
|
|
1
|
+
import { pascalCase, sourceStringLiteral } from "@gtkx/utils";
|
|
2
2
|
import type { GirClass } from "../../gir/class.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { GirProperty } from "../../gir/property.js";
|
|
4
4
|
import type { ModuleContext } from "../../writer/context.js";
|
|
5
5
|
import { reservedSignalMemberRename, resolvePrerequisiteReference } from "../../analysis/inheritance.js";
|
|
6
|
+
import { resolveInterfaces } from "../../gir/ancestry.js";
|
|
6
7
|
import { renderJsDoc } from "../../writer/doc.js";
|
|
7
|
-
import { renderBlock, renderBracedOrEmpty } from "../../writer/emit.js";
|
|
8
|
+
import { renderBlock, renderBraced, renderBracedOrEmpty } from "../../writer/emit.js";
|
|
8
9
|
import {
|
|
9
10
|
type Callables,
|
|
10
11
|
dedupeCallables,
|
|
11
12
|
generateBindings,
|
|
13
|
+
type InstanceMemberRenderer,
|
|
12
14
|
type InstanceScope,
|
|
13
15
|
instanceScope,
|
|
16
|
+
isEmittableCallable,
|
|
14
17
|
renderClassInstanceMember,
|
|
15
18
|
renderInstanceMethodSignature,
|
|
16
19
|
renderStaticHead,
|
|
17
20
|
} from "./callables.js";
|
|
21
|
+
import { annotationSpec, getDoc } from "./doc-spec.js";
|
|
18
22
|
import { renderSourceGtype } from "./gtype-binding.js";
|
|
19
23
|
import { methodExportName } from "./method.js";
|
|
20
24
|
import {
|
|
@@ -24,15 +28,15 @@ import {
|
|
|
24
28
|
} from "./property-accessor.js";
|
|
25
29
|
import { appendInterfaceRegistration } from "./registration.js";
|
|
26
30
|
import { renderSignalDeclarations, renderSignalMembers } from "./signal.js";
|
|
27
|
-
import {
|
|
31
|
+
import {
|
|
32
|
+
hasCallableVfuncSlots,
|
|
33
|
+
renderVfuncMembers,
|
|
34
|
+
renderVfuncMetadata,
|
|
35
|
+
type VfuncMemberMode,
|
|
36
|
+
} from "./vtable.js";
|
|
28
37
|
|
|
29
38
|
type InterfaceMemberRenderers = {
|
|
30
|
-
renderMethod:
|
|
31
|
-
context: ModuleContext,
|
|
32
|
-
callable: GirFunction,
|
|
33
|
-
scope: InstanceScope,
|
|
34
|
-
nameOverride?: string,
|
|
35
|
-
) => string | undefined;
|
|
39
|
+
renderMethod: InstanceMemberRenderer;
|
|
36
40
|
renderProperty: (args: PropertyAccessorArgs) => string | undefined;
|
|
37
41
|
};
|
|
38
42
|
|
|
@@ -53,6 +57,20 @@ type PropertyMemberOptions = {
|
|
|
53
57
|
claimedNames: Set<string>;
|
|
54
58
|
};
|
|
55
59
|
|
|
60
|
+
type InterfaceClassOptions = {
|
|
61
|
+
iface: GirClass;
|
|
62
|
+
className: string;
|
|
63
|
+
callables: Callables;
|
|
64
|
+
gtypeExpr: string | undefined;
|
|
65
|
+
implRef: string;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const BRAND_NOTE = [
|
|
69
|
+
"Phantom link to the type a class fills to adopt the interface, which `registerClass` reads",
|
|
70
|
+
"through its `implements` option. It holds no value at runtime. `unknown` asks nothing of the",
|
|
71
|
+
"class, which is what an interface with no slot to fill carries.",
|
|
72
|
+
].join("\n");
|
|
73
|
+
|
|
56
74
|
const generateInterface = (context: ModuleContext, iface: GirClass): void => {
|
|
57
75
|
if (!iface.introspectable) {
|
|
58
76
|
return;
|
|
@@ -72,8 +90,9 @@ const generateInterface = (context: ModuleContext, iface: GirClass): void => {
|
|
|
72
90
|
|
|
73
91
|
generateBindings(context, callables);
|
|
74
92
|
const gtypeExpr = renderSourceGtype(context, iface);
|
|
75
|
-
|
|
76
|
-
|
|
93
|
+
const implRef = appendInterfaceTypes(context, iface, className, callables) ?? "unknown";
|
|
94
|
+
const classCode = renderInterfaceClass(context, { iface, className, callables, gtypeExpr, implRef });
|
|
95
|
+
context.module.appendDeclaration(classCode, context.declaredType(className));
|
|
77
96
|
|
|
78
97
|
for (const declaration of renderSignalDeclarations(context, iface, className, true)) {
|
|
79
98
|
context.module.appendDeclaration(declaration);
|
|
@@ -85,12 +104,116 @@ const generateInterface = (context: ModuleContext, iface: GirClass): void => {
|
|
|
85
104
|
className,
|
|
86
105
|
makerName: makerName(className),
|
|
87
106
|
gtypeExpr,
|
|
88
|
-
|
|
107
|
+
layout: renderInterfaceLayout(context, iface, callables),
|
|
89
108
|
});
|
|
90
109
|
};
|
|
91
110
|
|
|
92
111
|
const makerName = (className: string): string => `make${className}`;
|
|
93
112
|
|
|
113
|
+
const renderInterfaceLayout = (
|
|
114
|
+
context: ModuleContext,
|
|
115
|
+
iface: GirClass,
|
|
116
|
+
callables: Callables,
|
|
117
|
+
): string | undefined => {
|
|
118
|
+
const vfuncs = renderVfuncMetadata(context, iface);
|
|
119
|
+
const properties = renderSlotBackedProperties(context, iface, callables);
|
|
120
|
+
|
|
121
|
+
if (vfuncs === undefined && properties === undefined) {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const entries: string[] = [];
|
|
126
|
+
|
|
127
|
+
if (vfuncs !== undefined) {
|
|
128
|
+
entries.push(`vfuncs: ${vfuncs},`);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (properties !== undefined) {
|
|
132
|
+
entries.push(`properties: ${properties},`);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return renderBraced(entries.join("\n"));
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const invokerMembers = (context: ModuleContext, iface: GirClass, callables: Callables): Map<string, string> => {
|
|
139
|
+
const className = pascalCase(iface.name);
|
|
140
|
+
|
|
141
|
+
const invokers: Set<string> = new Set(
|
|
142
|
+
iface.vfuncs.map((vfunc) => vfunc.invoker).filter((invoker) => invoker !== undefined),
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
const members: Map<string, string> = new Map();
|
|
146
|
+
|
|
147
|
+
for (const callable of callables.methods) {
|
|
148
|
+
if (invokers.has(callable.name) && isEmittableCallable(context, callable)) {
|
|
149
|
+
members.set(callable.name, reservedSignalMemberRename(className, callable) ?? methodExportName(callable));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return members;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const renderSlotAccessor = (
|
|
157
|
+
key: string,
|
|
158
|
+
method: string | undefined,
|
|
159
|
+
members: Map<string, string>,
|
|
160
|
+
): string | undefined => {
|
|
161
|
+
const member = method === undefined ? undefined : members.get(method);
|
|
162
|
+
|
|
163
|
+
return member === undefined ? undefined : `${key}: ${sourceStringLiteral(member)},`;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
const renderSlotBackedProperty = (property: GirProperty, members: Map<string, string>): string | undefined => {
|
|
167
|
+
if (!property.introspectable) {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const fields = [
|
|
172
|
+
renderSlotAccessor("getter", property.getter, members),
|
|
173
|
+
renderSlotAccessor("setter", property.setter, members),
|
|
174
|
+
].filter((field) => field !== undefined);
|
|
175
|
+
|
|
176
|
+
if (fields.length === 0) {
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return `${sourceStringLiteral(property.name)}: ${renderBraced(fields.join("\n"))},`;
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
const renderSlotBackedProperties = (
|
|
184
|
+
context: ModuleContext,
|
|
185
|
+
iface: GirClass,
|
|
186
|
+
callables: Callables,
|
|
187
|
+
): string | undefined => {
|
|
188
|
+
const members = invokerMembers(context, iface, callables);
|
|
189
|
+
|
|
190
|
+
const entries = iface.properties
|
|
191
|
+
.map((property) => renderSlotBackedProperty(property, members))
|
|
192
|
+
.filter((entry) => entry !== undefined);
|
|
193
|
+
|
|
194
|
+
return entries.length === 0 ? undefined : renderBraced(entries.join("\n"));
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
const appendInterfaceTypes = (
|
|
198
|
+
context: ModuleContext,
|
|
199
|
+
iface: GirClass,
|
|
200
|
+
className: string,
|
|
201
|
+
callables: Callables,
|
|
202
|
+
): string | undefined => {
|
|
203
|
+
const typeCode = renderInterfaceType(context, iface, className, callables);
|
|
204
|
+
context.module.appendDeclaration(typeCode, context.declaredType(className));
|
|
205
|
+
const implType = renderInterfaceImplType(context, iface, className);
|
|
206
|
+
|
|
207
|
+
if (implType === undefined) {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const implName = implTypeName(className);
|
|
212
|
+
context.module.appendDeclaration(implType, context.declaredType(className, implName));
|
|
213
|
+
|
|
214
|
+
return implName;
|
|
215
|
+
};
|
|
216
|
+
|
|
94
217
|
const interfaceTypeExtends = (context: ModuleContext, iface: GirClass): string => {
|
|
95
218
|
const refs = iface.prerequisites
|
|
96
219
|
.map((name) => resolvePrerequisiteReference(context, name))
|
|
@@ -111,12 +234,69 @@ const renderInterfaceType = (
|
|
|
111
234
|
): string => {
|
|
112
235
|
const members = renderInterfaceTypeMembers(context, iface, callables);
|
|
113
236
|
|
|
114
|
-
return `${
|
|
237
|
+
return `${getDoc(iface)}${renderBracedOrEmpty(
|
|
115
238
|
`export interface ${className} extends ${interfaceTypeExtends(context, iface)}`,
|
|
116
239
|
members.join("\n"),
|
|
117
240
|
)}`;
|
|
118
241
|
};
|
|
119
242
|
|
|
243
|
+
const implTypeName = (className: string): string => `${className}Impl`;
|
|
244
|
+
|
|
245
|
+
const implTypeNote = (className: string): string =>
|
|
246
|
+
[
|
|
247
|
+
`Implementer side of \`${className}\`: the vtable slots a class fills to adopt the interface.`,
|
|
248
|
+
"",
|
|
249
|
+
`Declare it with \`implements ${implTypeName(className)}\` on a class passed to \`registerClass\``,
|
|
250
|
+
`with \`${className}\` in \`implements\`. The interface's methods, properties, and signals come from`,
|
|
251
|
+
"GLib dispatch, so they are not part of this type.",
|
|
252
|
+
"",
|
|
253
|
+
"Every slot is optional: an unfilled one keeps whatever the interface installs by default, and a",
|
|
254
|
+
"GIR update can add one. Declaring a slot pins its signature; declaring it as a class field rather",
|
|
255
|
+
"than a method satisfies this type but never reaches the vtable.",
|
|
256
|
+
].join("\n");
|
|
257
|
+
|
|
258
|
+
const implPrerequisiteRefs = (context: ModuleContext, iface: GirClass): string[] => {
|
|
259
|
+
const prerequisites = resolveInterfaces(context.library, context.namespace.name, iface.prerequisites);
|
|
260
|
+
const refs: string[] = [];
|
|
261
|
+
|
|
262
|
+
for (const prerequisite of prerequisites) {
|
|
263
|
+
if (!hasCallableVfuncSlots(context, prerequisite.namespaceName, prerequisite.klass)) {
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const name = implTypeName(pascalCase(prerequisite.klass.name));
|
|
268
|
+
refs.push(context.qualify(prerequisite.namespaceName, name));
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return refs;
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
const implTypeExtends = (context: ModuleContext, iface: GirClass): string => {
|
|
275
|
+
const refs = implPrerequisiteRefs(context, iface);
|
|
276
|
+
|
|
277
|
+
return refs.length > 0 ? ` extends ${refs.join(", ")}` : "";
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
const interfaceVfuncMembers = (context: ModuleContext, iface: GirClass, mode: VfuncMemberMode): string[] =>
|
|
281
|
+
renderVfuncMembers({ context, klass: iface, mode });
|
|
282
|
+
|
|
283
|
+
const renderInterfaceImplType = (
|
|
284
|
+
context: ModuleContext,
|
|
285
|
+
iface: GirClass,
|
|
286
|
+
className: string,
|
|
287
|
+
): string | undefined => {
|
|
288
|
+
const members = interfaceVfuncMembers(context, iface, "requirement");
|
|
289
|
+
|
|
290
|
+
if (members.length === 0) {
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return `${renderJsDoc(iface.doc, implTypeNote(className), annotationSpec(iface.annotations))}${renderBracedOrEmpty(
|
|
295
|
+
`export interface ${implTypeName(className)}${implTypeExtends(context, iface)}`,
|
|
296
|
+
members.join("\n"),
|
|
297
|
+
)}`;
|
|
298
|
+
};
|
|
299
|
+
|
|
120
300
|
const collectMethodMembers = (options: MethodMemberOptions): string[] => {
|
|
121
301
|
const { context, className, scope, callables, renderers, claimedNames } = options;
|
|
122
302
|
const members: string[] = [];
|
|
@@ -166,27 +346,34 @@ const renderInterfaceMembers = (
|
|
|
166
346
|
return [...methodMembers, ...propertyMembers];
|
|
167
347
|
};
|
|
168
348
|
|
|
169
|
-
const renderInterfaceTypeMembers = (context: ModuleContext, iface: GirClass, callables: Callables): string[] =>
|
|
170
|
-
renderInterfaceMembers(context, iface, callables, {
|
|
349
|
+
const renderInterfaceTypeMembers = (context: ModuleContext, iface: GirClass, callables: Callables): string[] => [
|
|
350
|
+
...renderInterfaceMembers(context, iface, callables, {
|
|
171
351
|
renderMethod: renderInstanceMethodSignature,
|
|
172
352
|
renderProperty: renderPropertyAccessorSignature,
|
|
173
|
-
})
|
|
353
|
+
}),
|
|
354
|
+
...interfaceVfuncMembers(context, iface, "signature"),
|
|
355
|
+
];
|
|
174
356
|
|
|
175
|
-
const renderInterfaceClass = (
|
|
176
|
-
|
|
177
|
-
className: string,
|
|
178
|
-
callables: Callables,
|
|
179
|
-
gtypeExpr: string | undefined,
|
|
180
|
-
): string => {
|
|
357
|
+
const renderInterfaceClass = (context: ModuleContext, options: InterfaceClassOptions): string => {
|
|
358
|
+
const { iface, className, callables, gtypeExpr, implRef } = options;
|
|
181
359
|
const members: string[] = [];
|
|
182
360
|
|
|
183
361
|
if (gtypeExpr !== undefined) {
|
|
184
362
|
members.push(renderInterfaceHasInstance(context, className, gtypeExpr));
|
|
185
363
|
}
|
|
186
364
|
|
|
187
|
-
members.push(...renderStaticHead(context, callables, className));
|
|
365
|
+
members.push(...renderStaticHead(context, callables, className), renderInterfaceBrand(context, implRef));
|
|
366
|
+
|
|
367
|
+
return `${getDoc(iface)}${renderBracedOrEmpty(
|
|
368
|
+
`export abstract class ${className}`,
|
|
369
|
+
members.join("\n\n"),
|
|
370
|
+
)}`;
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
const renderInterfaceBrand = (context: ModuleContext, implRef: string): string => {
|
|
374
|
+
context.addRuntimeTypeImport("Interface");
|
|
188
375
|
|
|
189
|
-
return
|
|
376
|
+
return `${renderJsDoc(undefined, BRAND_NOTE)}declare static __impl__: Interface<${implRef}>["__impl__"];`;
|
|
190
377
|
};
|
|
191
378
|
|
|
192
379
|
const renderInterfaceHasInstance = (context: ModuleContext, className: string, gtypeExpr: string): string => {
|
|
@@ -208,7 +395,7 @@ const renderInterfaceMaker = (
|
|
|
208
395
|
const members = renderInterfaceInstanceMembers(context, iface, callables);
|
|
209
396
|
const classExpression = renderBracedOrEmpty("class extends Base", members.join("\n\n"));
|
|
210
397
|
|
|
211
|
-
return
|
|
398
|
+
return `${getDoc(iface)}export const ${makerName(className)}: Mixin = (Base) =>\n${classExpression};`;
|
|
212
399
|
};
|
|
213
400
|
|
|
214
401
|
const renderInterfaceInstanceMembers = (context: ModuleContext, iface: GirClass, callables: Callables): string[] => [
|
|
@@ -216,6 +403,7 @@ const renderInterfaceInstanceMembers = (context: ModuleContext, iface: GirClass,
|
|
|
216
403
|
renderMethod: renderClassInstanceMember,
|
|
217
404
|
renderProperty: renderPropertyAccessor,
|
|
218
405
|
}),
|
|
406
|
+
...interfaceVfuncMembers(context, iface, "implementation"),
|
|
219
407
|
...renderSignalMembers(context, iface),
|
|
220
408
|
];
|
|
221
409
|
|
|
@@ -5,7 +5,7 @@ import type { ModuleContext } from "../../writer/context.js";
|
|
|
5
5
|
import { tObject } from "../../analysis/descriptor.js";
|
|
6
6
|
import { inputParameters, parameterIdentifier } from "../../analysis/param-structure.js";
|
|
7
7
|
import { renderTsType } from "../../analysis/ts-type.js";
|
|
8
|
-
import {
|
|
8
|
+
import { resolveInterfaces } from "../../gir/ancestry.js";
|
|
9
9
|
import { callbackAsFunction, type GirCallback } from "../../gir/callback.js";
|
|
10
10
|
|
|
11
11
|
const COMPARATOR_CALLBACK_TYPES = new Set([
|
|
@@ -30,11 +30,9 @@ const isListModelImplementor = (context: ModuleContext, ref: TypeId): boolean =>
|
|
|
30
30
|
return false;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
const iface = resolveInterface(context.library, resolved.namespace.name, interfaceName);
|
|
33
|
+
const interfaces = resolveInterfaces(context.library, resolved.namespace.name, resolved.value.implements);
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
});
|
|
35
|
+
return interfaces.some((iface) => iface.namespaceName === "Gio" && iface.klass.name === "ListModel");
|
|
38
36
|
};
|
|
39
37
|
|
|
40
38
|
const isObjectItemComparator = (context: ModuleContext, fn: GirFunction): boolean => {
|
package/src/store/gi/method.ts
CHANGED
|
@@ -14,17 +14,29 @@ import {
|
|
|
14
14
|
emittedArgIndices,
|
|
15
15
|
foldedLengthIndices,
|
|
16
16
|
foldOutParamShape,
|
|
17
|
+
type InputParameter,
|
|
17
18
|
inputParameters,
|
|
18
19
|
parameterIdentifier,
|
|
19
20
|
} from "../../analysis/param-structure.js";
|
|
20
21
|
import { renderTsType } from "../../analysis/ts-type.js";
|
|
21
22
|
import { type GirParameter, isCallerAllocatedOut, isInoutParameter, isOutParameter } from "../../gir/parameter.js";
|
|
22
23
|
import { hasUnknownArrayLength, type TypeId } from "../../gir/type-id.js";
|
|
24
|
+
import { areClosuresInvoked } from "./closure-invocation.js";
|
|
23
25
|
import { itemComparatorArgDescriptors, itemComparatorTsType } from "./item-comparators.js";
|
|
24
|
-
import { isCollectibleCallerOut, isHandlePassedInPlace, isHandlePassing } from "./param-marshal.js";
|
|
26
|
+
import { isClosureType, isCollectibleCallerOut, isHandlePassedInPlace, isHandlePassing } from "./param-marshal.js";
|
|
25
27
|
|
|
26
28
|
type PromisifiedStep = { hasSeenOptional: boolean; expression: string | undefined };
|
|
27
29
|
|
|
30
|
+
type InputParameterOptions = {
|
|
31
|
+
shouldSkip: (parameter: GirParameter) => boolean;
|
|
32
|
+
isOptionalExtra: (parameter: GirParameter) => boolean;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type CallExpressionOptions = {
|
|
36
|
+
fn: GirFunction;
|
|
37
|
+
isForcedNullable?: boolean | undefined;
|
|
38
|
+
};
|
|
39
|
+
|
|
28
40
|
type PromisifyContext = {
|
|
29
41
|
context: ModuleContext;
|
|
30
42
|
asyncFn: GirFunction;
|
|
@@ -71,15 +83,34 @@ const arrayLengthArgument = (source: GirParameter, sourceIndex: number): string
|
|
|
71
83
|
};
|
|
72
84
|
|
|
73
85
|
const renderMethodSignature = (context: ModuleContext, fn: GirFunction): string =>
|
|
74
|
-
renderInputParameters(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
86
|
+
renderInputParameters(context, fn, {
|
|
87
|
+
shouldSkip: () => false,
|
|
88
|
+
isOptionalExtra: () => false,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
const closureAnnotation = (context: ModuleContext, base: string): string => {
|
|
92
|
+
context.addRuntimeTypeImport("ClosureCallback");
|
|
93
|
+
|
|
94
|
+
return `${base} | ClosureCallback`;
|
|
95
|
+
};
|
|
80
96
|
|
|
81
|
-
const
|
|
82
|
-
|
|
97
|
+
const requiresClosureMarshal = (context: ModuleContext, fn: GirFunction, ref: TypeId): boolean =>
|
|
98
|
+
isClosureType(context, ref) && areClosuresInvoked(fn);
|
|
99
|
+
|
|
100
|
+
const requiresClosureAnnotation = (context: ModuleContext, fn: GirFunction, parameter: GirParameter): boolean =>
|
|
101
|
+
parameter.type !== undefined && requiresClosureMarshal(context, fn, parameter.type);
|
|
102
|
+
|
|
103
|
+
const parameterAnnotation = (context: ModuleContext, fn: GirFunction, parameter: GirParameter): string => {
|
|
104
|
+
const comparator = itemComparatorTsType(context, fn, parameter);
|
|
105
|
+
|
|
106
|
+
if (comparator !== undefined) {
|
|
107
|
+
return comparator;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const base = renderTsType(context, parameter.type, parameter.nullable);
|
|
111
|
+
|
|
112
|
+
return requiresClosureAnnotation(context, fn, parameter) ? closureAnnotation(context, base) : base;
|
|
113
|
+
};
|
|
83
114
|
|
|
84
115
|
const isParameterOptional = (parameter: GirParameter, isOptionalExtra: (parameter: GirParameter) => boolean): boolean =>
|
|
85
116
|
parameter.optional || isOptionalExtra(parameter);
|
|
@@ -87,27 +118,23 @@ const isParameterOptional = (parameter: GirParameter, isOptionalExtra: (paramete
|
|
|
87
118
|
const formatParameterPart = (name: string, annotation: string, isOptional: boolean): string =>
|
|
88
119
|
isOptional ? `${name}?: ${annotation}` : `${name}: ${annotation}`;
|
|
89
120
|
|
|
90
|
-
const renderInputParameters = (
|
|
91
|
-
context: ModuleContext,
|
|
92
|
-
fn: GirFunction,
|
|
93
|
-
shouldSkip: (parameter: GirParameter) => boolean,
|
|
94
|
-
isOptionalExtra: (parameter: GirParameter) => boolean,
|
|
95
|
-
): string => {
|
|
121
|
+
const renderInputParameters = (context: ModuleContext, fn: GirFunction, options: InputParameterOptions): string => {
|
|
96
122
|
const parts: string[] = [];
|
|
97
123
|
let hasSeenOptional = false;
|
|
98
124
|
|
|
99
125
|
for (const { parameter, index } of inputParameters(context.library, fn)) {
|
|
100
|
-
if (shouldSkip(parameter)) {
|
|
126
|
+
if (options.shouldSkip(parameter)) {
|
|
101
127
|
continue;
|
|
102
128
|
}
|
|
103
129
|
|
|
104
130
|
const name = parameterIdentifier(parameter, index);
|
|
105
131
|
|
|
106
|
-
if (isParameterOptional(parameter, isOptionalExtra)) {
|
|
132
|
+
if (isParameterOptional(parameter, options.isOptionalExtra)) {
|
|
107
133
|
hasSeenOptional = true;
|
|
108
134
|
}
|
|
109
135
|
|
|
110
|
-
|
|
136
|
+
const annotation = parameterAnnotation(context, fn, parameter);
|
|
137
|
+
parts.push(formatParameterPart(name, annotation, hasSeenOptional));
|
|
111
138
|
}
|
|
112
139
|
|
|
113
140
|
return parts.join(", ");
|
|
@@ -118,9 +145,21 @@ const isReturnedOutParameter = (context: ModuleContext, parameter: GirParameter)
|
|
|
118
145
|
(isCallerAllocatedOut(parameter) && isCollectibleCallerOut(context, parameter)) ||
|
|
119
146
|
isInoutParameter(parameter);
|
|
120
147
|
|
|
121
|
-
const
|
|
148
|
+
const returnedOutParameters = (context: ModuleContext, fn: GirFunction): InputParameter[] => {
|
|
122
149
|
const folded = foldedLengthIndices(context.library, fn);
|
|
123
|
-
const
|
|
150
|
+
const result: InputParameter[] = [];
|
|
151
|
+
|
|
152
|
+
for (const [index, parameter] of fn.parameters.entries()) {
|
|
153
|
+
if (isReturnedOutParameter(context, parameter) && !folded.has(index)) {
|
|
154
|
+
result.push({ parameter, index });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return result;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
const renderMethodReturnType = (context: ModuleContext, fn: GirFunction): string => {
|
|
162
|
+
const outs = returnedOutParameters(context, fn);
|
|
124
163
|
|
|
125
164
|
const primary = shouldOmitPrimaryReturn(context.library, fn.returnValue)
|
|
126
165
|
? undefined
|
|
@@ -130,7 +169,7 @@ const renderMethodReturnType = (context: ModuleContext, fn: GirFunction): string
|
|
|
130
169
|
return primary ?? "void";
|
|
131
170
|
}
|
|
132
171
|
|
|
133
|
-
const outTypes = outs.map((parameter) => renderTsType(context, parameter.type, parameter.nullable));
|
|
172
|
+
const outTypes = outs.map(({ parameter }) => renderTsType(context, parameter.type, parameter.nullable));
|
|
134
173
|
|
|
135
174
|
return foldOutParamShape(primary, outTypes);
|
|
136
175
|
};
|
|
@@ -242,7 +281,7 @@ const promisifiedArgument = (
|
|
|
242
281
|
return arrayLengthArgument(source, sourceIndex);
|
|
243
282
|
}
|
|
244
283
|
|
|
245
|
-
return parameterCallExpression(context, parameter, index, hasSeenOptional);
|
|
284
|
+
return parameterCallExpression(context, parameter, index, { fn: asyncFn, isForcedNullable: hasSeenOptional });
|
|
246
285
|
};
|
|
247
286
|
|
|
248
287
|
const findCancellableIndex = (context: ModuleContext, parameters: GirParameter[]): number =>
|
|
@@ -253,12 +292,10 @@ const renderPromisifiedSignature = (
|
|
|
253
292
|
asyncFn: GirFunction,
|
|
254
293
|
finishFn: GirFunction,
|
|
255
294
|
): { signature: string; returnType: string } => {
|
|
256
|
-
const signature = renderInputParameters(
|
|
257
|
-
context,
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
(parameter) => isCancellable(context, parameter),
|
|
261
|
-
);
|
|
295
|
+
const signature = renderInputParameters(context, asyncFn, {
|
|
296
|
+
shouldSkip: (parameter) => isCallbackParameter(context, parameter),
|
|
297
|
+
isOptionalExtra: (parameter) => isCancellable(context, parameter),
|
|
298
|
+
});
|
|
262
299
|
|
|
263
300
|
const finishReturn = renderMethodReturnType(context, finishFn);
|
|
264
301
|
|
|
@@ -405,6 +442,7 @@ const planInoutArgument = (
|
|
|
405
442
|
: undefined;
|
|
406
443
|
|
|
407
444
|
return planInoutParam(context, parameter, {
|
|
445
|
+
fn,
|
|
408
446
|
index,
|
|
409
447
|
argIndex: planContext.argIndex,
|
|
410
448
|
isConsumed: folded.has(index),
|
|
@@ -433,7 +471,10 @@ const planOutParam = (
|
|
|
433
471
|
argIndex: ArgIndexOptions,
|
|
434
472
|
isConsumed: boolean,
|
|
435
473
|
): CallArgPlan => {
|
|
436
|
-
const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership,
|
|
474
|
+
const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, {
|
|
475
|
+
...argIndex,
|
|
476
|
+
hasOutIndirection: true,
|
|
477
|
+
});
|
|
437
478
|
|
|
438
479
|
return {
|
|
439
480
|
paramLiteral: paramDescriptorLiteral(descriptor, { direction: "out", isConsumed }),
|
|
@@ -486,13 +527,14 @@ const planInoutParam = (
|
|
|
486
527
|
context: ModuleContext,
|
|
487
528
|
parameter: GirParameter,
|
|
488
529
|
options: {
|
|
530
|
+
fn: GirFunction;
|
|
489
531
|
index: number;
|
|
490
532
|
argIndex: ArgIndexOptions;
|
|
491
533
|
isConsumed: boolean;
|
|
492
534
|
lengthSource?: { source: GirParameter; index: number } | undefined;
|
|
493
535
|
},
|
|
494
536
|
): CallArgPlan => {
|
|
495
|
-
const { index, argIndex, isConsumed, lengthSource } = options;
|
|
537
|
+
const { fn, index, argIndex, isConsumed, lengthSource } = options;
|
|
496
538
|
|
|
497
539
|
if (isHandlePassedInPlace(context, parameter)) {
|
|
498
540
|
const descriptor = renderDescriptor(context, parameter.type, "none", argIndex);
|
|
@@ -507,13 +549,16 @@ const planInoutParam = (
|
|
|
507
549
|
};
|
|
508
550
|
}
|
|
509
551
|
|
|
510
|
-
const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership,
|
|
552
|
+
const descriptor = renderDescriptor(context, parameter.type, parameter.transferOwnership, {
|
|
553
|
+
...argIndex,
|
|
554
|
+
hasOutIndirection: true,
|
|
555
|
+
});
|
|
511
556
|
|
|
512
557
|
return {
|
|
513
558
|
paramLiteral: paramDescriptorLiteral(descriptor, { direction: "inout", isConsumed }),
|
|
514
559
|
inputExpr:
|
|
515
560
|
lengthSource === undefined
|
|
516
|
-
? parameterCallExpression(context, parameter, index)
|
|
561
|
+
? parameterCallExpression(context, parameter, index, { fn })
|
|
517
562
|
: arrayLengthArgument(lengthSource.source, lengthSource.index),
|
|
518
563
|
};
|
|
519
564
|
};
|
|
@@ -544,27 +589,30 @@ const planInParam = (
|
|
|
544
589
|
|
|
545
590
|
return {
|
|
546
591
|
paramLiteral: paramDescriptorLiteral(descriptor, {}),
|
|
547
|
-
inputExpr: parameterCallExpression(context, parameter, index),
|
|
592
|
+
inputExpr: parameterCallExpression(context, parameter, index, { fn }),
|
|
548
593
|
};
|
|
549
594
|
};
|
|
550
595
|
|
|
596
|
+
const nullableHandleExpression = (name: string): string => `${name} == null ? null : getHandle(${name})`;
|
|
597
|
+
|
|
551
598
|
const handleArgument = (context: ModuleContext, name: string, isNullable: boolean): string => {
|
|
552
|
-
|
|
553
|
-
context.addRuntimeImport("tryGetHandle");
|
|
599
|
+
context.addRuntimeImport("getHandle");
|
|
554
600
|
|
|
555
|
-
|
|
556
|
-
|
|
601
|
+
return isNullable ? nullableHandleExpression(name) : `getHandle(${name})`;
|
|
602
|
+
};
|
|
557
603
|
|
|
558
|
-
|
|
604
|
+
const closureArgument = (context: ModuleContext, name: string, isNullable: boolean): string => {
|
|
605
|
+
const helper = isNullable ? "tryToClosure" : "toClosure";
|
|
606
|
+
context.addRuntimeImport(helper);
|
|
559
607
|
|
|
560
|
-
return
|
|
608
|
+
return `${helper}(${name})`;
|
|
561
609
|
};
|
|
562
610
|
|
|
563
611
|
const hashtableArgument = (context: ModuleContext, valueRef: TypeId, name: string): string => {
|
|
564
612
|
if (isHandlePassing(context, valueRef)) {
|
|
565
|
-
context.addRuntimeImport("
|
|
613
|
+
context.addRuntimeImport("getHandle");
|
|
566
614
|
|
|
567
|
-
return `${name} ? globalThis.Array.from(${name}).map(([k, v]) => [k,
|
|
615
|
+
return `${name} ? globalThis.Array.from(${name}).map(([k, v]) => [k, ${nullableHandleExpression("v")}]) : null`;
|
|
568
616
|
}
|
|
569
617
|
|
|
570
618
|
return `${name} ? globalThis.Array.from(${name}) : null`;
|
|
@@ -604,8 +652,9 @@ const parameterCallExpression = (
|
|
|
604
652
|
context: ModuleContext,
|
|
605
653
|
parameter: GirParameter,
|
|
606
654
|
index: number,
|
|
607
|
-
|
|
655
|
+
options: CallExpressionOptions,
|
|
608
656
|
): string => {
|
|
657
|
+
const { fn, isForcedNullable = false } = options;
|
|
609
658
|
const name = parameterIdentifier(parameter, index);
|
|
610
659
|
const ref = parameter.type;
|
|
611
660
|
|
|
@@ -615,6 +664,10 @@ const parameterCallExpression = (
|
|
|
615
664
|
|
|
616
665
|
const isNullable = parameter.nullable || parameter.optional || isForcedNullable;
|
|
617
666
|
|
|
667
|
+
if (requiresClosureMarshal(context, fn, ref)) {
|
|
668
|
+
return closureArgument(context, name, isNullable);
|
|
669
|
+
}
|
|
670
|
+
|
|
618
671
|
if (isHandlePassing(context, ref)) {
|
|
619
672
|
return handleArgument(context, name, isNullable);
|
|
620
673
|
}
|
|
@@ -625,9 +678,12 @@ const parameterCallExpression = (
|
|
|
625
678
|
};
|
|
626
679
|
|
|
627
680
|
export {
|
|
681
|
+
constructibleName,
|
|
682
|
+
isCallbackParameter,
|
|
628
683
|
methodExportName,
|
|
629
684
|
renderMethodSignature,
|
|
630
685
|
renderMethodReturnType,
|
|
686
|
+
returnedOutParameters,
|
|
631
687
|
renderPromisifiedBody,
|
|
632
688
|
finishCallExpression,
|
|
633
689
|
renderPromisifiedSignature,
|
|
@@ -68,4 +68,18 @@ const isHandlePassing = (context: ModuleContext, ref: TypeId): boolean => {
|
|
|
68
68
|
}
|
|
69
69
|
};
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
const isClosureType = (context: ModuleContext, ref: TypeId): boolean => {
|
|
72
|
+
const name = context.library.nameFor(ref);
|
|
73
|
+
|
|
74
|
+
return name?.namespaceName === "GObject" && name.typeName === "Closure";
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export {
|
|
78
|
+
isClosureType,
|
|
79
|
+
isHandlePassedInPlace,
|
|
80
|
+
isCollectibleCallerOut,
|
|
81
|
+
isRecordCallerOut,
|
|
82
|
+
isRecordInout,
|
|
83
|
+
isHandlePassing,
|
|
84
|
+
underlyingType,
|
|
85
|
+
};
|