@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
package/src/khronos/render.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { sourceStringLiteral, toCamelIdentifier } from "@gtkx/utils";
|
|
2
|
+
import type { GlDocContext } from "./doc-context.js";
|
|
2
3
|
import type { CommandPlan, GlScalar, ReturnPlan } from "./plan.js";
|
|
4
|
+
import type { GlSymbolProvenance } from "./select.js";
|
|
3
5
|
import { tBind, tInlineStruct, tRef, tString, tUint8, tVoid } from "../analysis/descriptor.js";
|
|
4
|
-
import { type OutArg, planArgs,
|
|
5
|
-
import { commandJsDoc,
|
|
6
|
+
import { type InArg, type OutArg, planArgs, returnPlanTsType, scalarPrefixArgs, trackInto } from "./args.js";
|
|
7
|
+
import { commandJsDoc, derivedJsDoc, inParamDocLine } from "./jsdoc.js";
|
|
8
|
+
import { commandExportName } from "./notes.js";
|
|
6
9
|
|
|
7
10
|
type RenderedCommand = {
|
|
8
11
|
exportName: string;
|
|
@@ -10,6 +13,12 @@ type RenderedCommand = {
|
|
|
10
13
|
declaration: string;
|
|
11
14
|
};
|
|
12
15
|
|
|
16
|
+
type SingularContext = {
|
|
17
|
+
plan: CommandPlan & { isOk: true };
|
|
18
|
+
provenance: GlSymbolProvenance;
|
|
19
|
+
docs: GlDocContext;
|
|
20
|
+
};
|
|
21
|
+
|
|
13
22
|
type EmittedReturn = {
|
|
14
23
|
tsType: string;
|
|
15
24
|
descriptor: string;
|
|
@@ -34,9 +43,6 @@ const glBind = (name: string, argList: string, returnType: string): string =>
|
|
|
34
43
|
returnType,
|
|
35
44
|
});
|
|
36
45
|
|
|
37
|
-
const commandExportName = (name: string): string =>
|
|
38
|
-
toCamelIdentifier(name.startsWith("gl") ? lowerFirst(name.slice(2)) : name);
|
|
39
|
-
|
|
40
46
|
const singularize = (plural: string): string =>
|
|
41
47
|
plural.endsWith("ies") ? `${plural.slice(0, -3)}y` : plural.replace(/s$/, "");
|
|
42
48
|
|
|
@@ -48,32 +54,27 @@ const buildEmittedReturn = (
|
|
|
48
54
|
returnGroup: string | undefined,
|
|
49
55
|
usedTypes: Set<string>,
|
|
50
56
|
): EmittedReturn => {
|
|
51
|
-
const
|
|
57
|
+
const tsType = trackInto(usedTypes)(returnPlanTsType(plan, returnGroup));
|
|
58
|
+
const cast = (call: string): string => `${call} as ${tsType}`;
|
|
52
59
|
|
|
53
60
|
switch (plan.kind) {
|
|
54
61
|
case "void": {
|
|
55
|
-
return { tsType
|
|
62
|
+
return { tsType, descriptor: tVoid };
|
|
56
63
|
}
|
|
57
64
|
case "scalar": {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return { tsType: alias, descriptor: plan.scalar.descriptor, expr: (call) => `${call} as ${alias}` };
|
|
65
|
+
return { tsType, descriptor: plan.scalar.descriptor, expr: cast };
|
|
61
66
|
}
|
|
62
67
|
case "boolean": {
|
|
63
|
-
return { tsType
|
|
68
|
+
return { tsType, descriptor: tUint8, expr: (call) => `(${call} as number) !== 0` };
|
|
64
69
|
}
|
|
65
70
|
case "string": {
|
|
66
|
-
return { tsType
|
|
71
|
+
return { tsType, descriptor: tString("borrowed"), expr: cast };
|
|
67
72
|
}
|
|
68
73
|
case "sync": {
|
|
69
|
-
return { tsType
|
|
74
|
+
return { tsType, descriptor: tInlineStruct(), expr: cast };
|
|
70
75
|
}
|
|
71
76
|
case "opaque-pointer": {
|
|
72
|
-
return {
|
|
73
|
-
tsType: track("GLpointer"),
|
|
74
|
-
descriptor: tInlineStruct(),
|
|
75
|
-
expr: (call) => `${call} as GLpointer`,
|
|
76
|
-
};
|
|
77
|
+
return { tsType, descriptor: tInlineStruct(), expr: cast };
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
};
|
|
@@ -117,19 +118,20 @@ const returnStatements = (call: string, returned: EmittedReturn, outs: OutArg[])
|
|
|
117
118
|
};
|
|
118
119
|
|
|
119
120
|
const renderCommand = (
|
|
120
|
-
plan: CommandPlan & {
|
|
121
|
-
|
|
121
|
+
plan: CommandPlan & { isOk: true },
|
|
122
|
+
provenance: GlSymbolProvenance,
|
|
122
123
|
usedTypes: Set<string>,
|
|
124
|
+
docs: GlDocContext,
|
|
123
125
|
): RenderedCommand => {
|
|
124
126
|
const { command } = plan;
|
|
125
127
|
const exportName = commandExportName(command.name);
|
|
126
128
|
const { args, ins, outs } = planArgs(plan, usedTypes);
|
|
127
129
|
const returned = buildEmittedReturn(plan.returnPlan, command.returnGroup, usedTypes);
|
|
128
130
|
const signature = ins.map((arg) => `${arg.name}: ${arg.tsType}`).join(", ");
|
|
129
|
-
const argNames = args.map((arg) => (arg.
|
|
131
|
+
const argNames = args.map((arg) => (arg.isOut ? arg.cellName : arg.name)).join(", ");
|
|
130
132
|
const descriptors = renderDescriptorList(args.map((arg) => arg.descriptor));
|
|
131
133
|
const tsReturn = returnTsType(returned, outs);
|
|
132
|
-
const jsDoc = commandJsDoc({
|
|
134
|
+
const jsDoc = commandJsDoc({ plan, provenance, ins, outs, docs });
|
|
133
135
|
const seeds = outs.map((out) => out.seed);
|
|
134
136
|
const bindExpression = glBind(command.name, descriptors, returned.descriptor);
|
|
135
137
|
const isInline = plan.params.some((paramPlan) => paramPlan.kind === "string-out");
|
|
@@ -150,15 +152,17 @@ const renderCommand = (
|
|
|
150
152
|
};
|
|
151
153
|
};
|
|
152
154
|
|
|
153
|
-
const singularCommandJsDoc = (
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
155
|
+
const singularCommandJsDoc = (context: SingularContext, summary: string, body: string[]): string =>
|
|
156
|
+
derivedJsDoc({
|
|
157
|
+
command: context.plan.command,
|
|
158
|
+
provenance: context.provenance,
|
|
159
|
+
docs: context.docs,
|
|
160
|
+
summary,
|
|
161
|
+
body,
|
|
162
|
+
});
|
|
159
163
|
|
|
160
164
|
const genSingularScalars = (
|
|
161
|
-
plan: CommandPlan & {
|
|
165
|
+
plan: CommandPlan & { isOk: true },
|
|
162
166
|
): { countScalar: GlScalar; outScalar: GlScalar; lenParamName: string } | undefined => {
|
|
163
167
|
const countPlan = plan.params.at(-2);
|
|
164
168
|
|
|
@@ -175,7 +179,7 @@ const genSingularScalars = (
|
|
|
175
179
|
return { countScalar: countPlan.scalar, outScalar: outPlan.scalar, lenParamName: outPlan.lenParamName };
|
|
176
180
|
};
|
|
177
181
|
|
|
178
|
-
const genSingularObjectClass = (plan: CommandPlan & {
|
|
182
|
+
const genSingularObjectClass = (plan: CommandPlan & { isOk: true }, lenParamName: string): string | undefined => {
|
|
179
183
|
const countParam = plan.command.params[plan.params.length - 2];
|
|
180
184
|
const outParam = plan.command.params[plan.params.length - 1];
|
|
181
185
|
|
|
@@ -190,7 +194,7 @@ const genSingularObjectClass = (plan: CommandPlan & { ok: true }, lenParamName:
|
|
|
190
194
|
return outParam.objectClass;
|
|
191
195
|
};
|
|
192
196
|
|
|
193
|
-
const genSingularShape = (plan: CommandPlan & {
|
|
197
|
+
const genSingularShape = (plan: CommandPlan & { isOk: true }): GenSingularShape | undefined => {
|
|
194
198
|
const scalars = genSingularScalars(plan);
|
|
195
199
|
|
|
196
200
|
if (scalars === undefined) {
|
|
@@ -206,10 +210,25 @@ const genSingularShape = (plan: CommandPlan & { ok: true }): GenSingularShape |
|
|
|
206
210
|
return { countScalar: scalars.countScalar, outScalar: scalars.outScalar, objectClass };
|
|
207
211
|
};
|
|
208
212
|
|
|
213
|
+
const genSingularJsDoc = (context: SingularContext, prefix: InArg[], shape: GenSingularShape): string => {
|
|
214
|
+
const { command } = context.plan;
|
|
215
|
+
|
|
216
|
+
return singularCommandJsDoc(
|
|
217
|
+
context,
|
|
218
|
+
`Returns one ${shape.objectClass} object name via ` +
|
|
219
|
+
`\`${command.name}(${prefix.length > 0 ? "..., " : ""}1, ...)\`.`,
|
|
220
|
+
[
|
|
221
|
+
...prefix.map((arg) => inParamDocLine(context.plan, arg, context.docs)),
|
|
222
|
+
` * @returns \`${shape.outScalar.tsAlias}\`, object class \`${shape.objectClass}\``,
|
|
223
|
+
],
|
|
224
|
+
);
|
|
225
|
+
};
|
|
226
|
+
|
|
209
227
|
const deriveGenSingular = (
|
|
210
|
-
plan: CommandPlan & {
|
|
211
|
-
|
|
228
|
+
plan: CommandPlan & { isOk: true },
|
|
229
|
+
provenance: GlSymbolProvenance,
|
|
212
230
|
usedTypes: Set<string>,
|
|
231
|
+
docs: GlDocContext,
|
|
213
232
|
): RenderedCommand | undefined => {
|
|
214
233
|
if (!GEN_FAMILY.test(plan.command.name)) {
|
|
215
234
|
return undefined;
|
|
@@ -227,21 +246,14 @@ const deriveGenSingular = (
|
|
|
227
246
|
return undefined;
|
|
228
247
|
}
|
|
229
248
|
|
|
230
|
-
const { countScalar, outScalar
|
|
249
|
+
const { countScalar, outScalar } = shape;
|
|
231
250
|
const exportName = singularize(commandExportName(plan.command.name));
|
|
232
251
|
const bindingName = `${plan.command.name}Single`;
|
|
233
252
|
const descriptors = [...prefix.map((arg) => arg.descriptor), countScalar.descriptor, tRef(outScalar.descriptor)];
|
|
234
253
|
usedTypes.add(outScalar.tsAlias);
|
|
235
254
|
const signature = prefix.map((arg) => `${arg.name}: ${arg.tsType}`).join(", ");
|
|
236
255
|
const callArgs = [...prefix.map((arg) => arg.name), "1", "out"].join(", ");
|
|
237
|
-
|
|
238
|
-
const jsDoc = singularCommandJsDoc(
|
|
239
|
-
plan,
|
|
240
|
-
feature,
|
|
241
|
-
`Returns one ${objectClass} object name via ` +
|
|
242
|
-
`\`${plan.command.name}(${prefix.length > 0 ? "..., " : ""}1, ...)\`.`,
|
|
243
|
-
[...prefix.map((arg) => inParamDocLine(plan.command, arg)), ` * @returns The new ${objectClass} object name`],
|
|
244
|
-
);
|
|
256
|
+
const jsDoc = genSingularJsDoc({ plan, provenance, docs }, prefix, shape);
|
|
245
257
|
|
|
246
258
|
const body = [" const out = { value: 0 };", ` ${bindingName}(${callArgs});`, " return out.value;"].join(
|
|
247
259
|
"\n",
|
|
@@ -256,7 +268,7 @@ const deriveGenSingular = (
|
|
|
256
268
|
};
|
|
257
269
|
};
|
|
258
270
|
|
|
259
|
-
const deleteSingularAlias = (plan: CommandPlan & {
|
|
271
|
+
const deleteSingularAlias = (plan: CommandPlan & { isOk: true }): string | undefined => {
|
|
260
272
|
if (plan.params.length !== 2) {
|
|
261
273
|
return undefined;
|
|
262
274
|
}
|
|
@@ -274,7 +286,7 @@ const deleteSingularAlias = (plan: CommandPlan & { ok: true }): string | undefin
|
|
|
274
286
|
return arrayPlan.scalar.tsAlias;
|
|
275
287
|
};
|
|
276
288
|
|
|
277
|
-
const deleteSingularObjectClass = (plan: CommandPlan & {
|
|
289
|
+
const deleteSingularObjectClass = (plan: CommandPlan & { isOk: true }): string | undefined => {
|
|
278
290
|
const [countParam, arrayParam] = plan.command.params;
|
|
279
291
|
|
|
280
292
|
if (countParam === undefined || arrayParam === undefined) {
|
|
@@ -289,9 +301,10 @@ const deleteSingularObjectClass = (plan: CommandPlan & { ok: true }): string | u
|
|
|
289
301
|
};
|
|
290
302
|
|
|
291
303
|
const deriveDeleteSingular = (
|
|
292
|
-
plan: CommandPlan & {
|
|
293
|
-
|
|
304
|
+
plan: CommandPlan & { isOk: true },
|
|
305
|
+
provenance: GlSymbolProvenance,
|
|
294
306
|
usedTypes: Set<string>,
|
|
307
|
+
docs: GlDocContext,
|
|
295
308
|
): RenderedCommand | undefined => {
|
|
296
309
|
if (!DELETE_FAMILY.test(plan.command.name)) {
|
|
297
310
|
return undefined;
|
|
@@ -313,10 +326,9 @@ const deriveDeleteSingular = (
|
|
|
313
326
|
const exportName = singularize(commandExportName(plan.command.name));
|
|
314
327
|
|
|
315
328
|
const jsDoc = singularCommandJsDoc(
|
|
316
|
-
plan,
|
|
317
|
-
feature,
|
|
329
|
+
{ plan, provenance, docs },
|
|
318
330
|
`Deletes one ${objectClass} object name via \`${plan.command.name}(1, ...)\`.`,
|
|
319
|
-
[` * @param name -
|
|
331
|
+
[` * @param name - \`${scalarAlias}\`, object class \`${objectClass}\``],
|
|
320
332
|
);
|
|
321
333
|
|
|
322
334
|
return {
|
package/src/khronos/select.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { sortStringsBy } from "@gtkx/utils";
|
|
1
2
|
import type { GlEnum, GlFeature, GlInterfaceBlock, GlRegistry } from "./model.js";
|
|
2
3
|
|
|
3
4
|
type GlProfile = "core";
|
|
@@ -8,60 +9,94 @@ type GlSelection = {
|
|
|
8
9
|
profile: GlProfile;
|
|
9
10
|
};
|
|
10
11
|
|
|
12
|
+
type GlSymbolKind = "command" | "enum";
|
|
13
|
+
|
|
14
|
+
type GlRemoval = {
|
|
15
|
+
feature: string;
|
|
16
|
+
comment?: string;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
type GlSymbolProvenance = {
|
|
20
|
+
feature: string;
|
|
21
|
+
requireComment?: string;
|
|
22
|
+
removals: GlRemoval[];
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
type GlRemovedSymbol = {
|
|
26
|
+
name: string;
|
|
27
|
+
kind: GlSymbolKind;
|
|
28
|
+
feature: string;
|
|
29
|
+
comment?: string;
|
|
30
|
+
};
|
|
31
|
+
|
|
11
32
|
type GlSubset = {
|
|
12
|
-
commands: Map<string,
|
|
13
|
-
enums: Map<string,
|
|
33
|
+
commands: Map<string, GlSymbolProvenance>;
|
|
34
|
+
enums: Map<string, GlSymbolProvenance>;
|
|
35
|
+
removed: GlRemovedSymbol[];
|
|
14
36
|
};
|
|
15
37
|
|
|
16
|
-
|
|
17
|
-
|
|
38
|
+
type SelectionState = GlSubset & {
|
|
39
|
+
history: Map<string, GlRemoval[]>;
|
|
40
|
+
};
|
|
18
41
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
}
|
|
42
|
+
type MemberContext = {
|
|
43
|
+
feature: GlFeature;
|
|
44
|
+
block: GlInterfaceBlock;
|
|
45
|
+
kind: GlSymbolKind;
|
|
25
46
|
};
|
|
26
47
|
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
selection
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
for (const block of feature.requires) {
|
|
34
|
-
if (!isBlockApplicable(block, selection)) {
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
48
|
+
const isBlockApplicable = (block: GlInterfaceBlock, selection: GlSelection): boolean =>
|
|
49
|
+
(block.profile === undefined || block.profile === selection.profile) &&
|
|
50
|
+
(block.api === undefined || block.api === selection.api);
|
|
51
|
+
|
|
52
|
+
const targetFor = (state: SelectionState, kind: GlSymbolKind): Map<string, GlSymbolProvenance> =>
|
|
53
|
+
kind === "command" ? state.commands : state.enums;
|
|
37
54
|
|
|
38
|
-
|
|
39
|
-
|
|
55
|
+
const commentEntry = (comment: string | undefined): { comment?: string } =>
|
|
56
|
+
comment === undefined ? {} : { comment };
|
|
57
|
+
|
|
58
|
+
const requireMember = (state: SelectionState, name: string, context: MemberContext): void => {
|
|
59
|
+
const target = targetFor(state, context.kind);
|
|
60
|
+
|
|
61
|
+
if (target.has(name)) {
|
|
62
|
+
return;
|
|
40
63
|
}
|
|
64
|
+
|
|
65
|
+
const { block, feature } = context;
|
|
66
|
+
|
|
67
|
+
target.set(name, {
|
|
68
|
+
feature: feature.name,
|
|
69
|
+
...(block.comment !== undefined && { requireComment: block.comment }),
|
|
70
|
+
removals: [...(state.history.get(name) ?? [])],
|
|
71
|
+
});
|
|
41
72
|
};
|
|
42
73
|
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
74
|
+
const removeMember = (state: SelectionState, name: string, context: MemberContext): void => {
|
|
75
|
+
const { block, feature, kind } = context;
|
|
76
|
+
const removal: GlRemoval = { feature: feature.name, ...commentEntry(block.comment) };
|
|
77
|
+
targetFor(state, kind).delete(name);
|
|
78
|
+
state.history.set(name, [...(state.history.get(name) ?? []), removal]);
|
|
79
|
+
state.removed.push({ name, kind, ...removal });
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const applyMembers = (state: SelectionState, names: string[], context: MemberContext): void => {
|
|
83
|
+
const apply = context.block.kind === "require" ? requireMember : removeMember;
|
|
47
84
|
|
|
48
|
-
for (const name of
|
|
49
|
-
|
|
85
|
+
for (const name of names) {
|
|
86
|
+
apply(state, name, context);
|
|
50
87
|
}
|
|
51
88
|
};
|
|
52
89
|
|
|
53
|
-
const
|
|
54
|
-
feature:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
enums: Map<string, string>,
|
|
58
|
-
): void => {
|
|
59
|
-
for (const block of feature.removes) {
|
|
60
|
-
if (!isBlockApplicable(block, selection)) {
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
90
|
+
const applyBlock = (state: SelectionState, feature: GlFeature, block: GlInterfaceBlock): void => {
|
|
91
|
+
applyMembers(state, block.commands, { feature, block, kind: "command" });
|
|
92
|
+
applyMembers(state, block.enums, { feature, block, kind: "enum" });
|
|
93
|
+
};
|
|
63
94
|
|
|
64
|
-
|
|
95
|
+
const applyFeature = (state: SelectionState, feature: GlFeature, selection: GlSelection): void => {
|
|
96
|
+
for (const block of feature.blocks) {
|
|
97
|
+
if (isBlockApplicable(block, selection)) {
|
|
98
|
+
applyBlock(state, feature, block);
|
|
99
|
+
}
|
|
65
100
|
}
|
|
66
101
|
};
|
|
67
102
|
|
|
@@ -70,22 +105,28 @@ const selectSubset = (registry: GlRegistry, selection: GlSelection): GlSubset =>
|
|
|
70
105
|
.filter((feature) => feature.api === selection.api && feature.number <= selection.version)
|
|
71
106
|
.toSorted((a, b) => a.number - b.number);
|
|
72
107
|
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
108
|
+
const state: SelectionState = {
|
|
109
|
+
commands: new Map(),
|
|
110
|
+
enums: new Map(),
|
|
111
|
+
removed: [],
|
|
112
|
+
history: new Map(),
|
|
113
|
+
};
|
|
79
114
|
|
|
80
115
|
for (const feature of features) {
|
|
81
|
-
|
|
116
|
+
applyFeature(state, feature, selection);
|
|
82
117
|
}
|
|
83
118
|
|
|
84
|
-
return {
|
|
119
|
+
return {
|
|
120
|
+
commands: state.commands,
|
|
121
|
+
enums: state.enums,
|
|
122
|
+
removed: sortStringsBy(state.removed, (entry) => entry.name),
|
|
123
|
+
};
|
|
85
124
|
};
|
|
86
125
|
|
|
87
|
-
const resolveEnum = (registry: GlRegistry, name: string): GlEnum => {
|
|
88
|
-
const found = registry.enums.find(
|
|
126
|
+
const resolveEnum = (registry: GlRegistry, name: string, api: string): GlEnum => {
|
|
127
|
+
const found = registry.enums.find(
|
|
128
|
+
(candidate) => candidate.name === name && (candidate.api === undefined || candidate.api === api),
|
|
129
|
+
);
|
|
89
130
|
|
|
90
131
|
if (found === undefined) {
|
|
91
132
|
throw new Error(`Enum token ${name} has no definition in the registry`);
|
|
@@ -94,4 +135,4 @@ const resolveEnum = (registry: GlRegistry, name: string): GlEnum => {
|
|
|
94
135
|
return found;
|
|
95
136
|
};
|
|
96
137
|
|
|
97
|
-
export { selectSubset, resolveEnum, type GlSelection };
|
|
138
|
+
export { selectSubset, resolveEnum, type GlRemoval, type GlSelection, type GlSubset, type GlSymbolProvenance };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ModuleExport } from "@gtkx/react/
|
|
1
|
+
import type { ModuleExport } from "@gtkx/react/config";
|
|
2
2
|
import { readdirSync } from "node:fs";
|
|
3
3
|
import type { OmittedProps } from "../store/jsx/omitted-props.js";
|
|
4
4
|
|
|
@@ -96,5 +96,5 @@ const readBuiltinElements = async (reactSubexports: string[], giStoreDir: string
|
|
|
96
96
|
return result;
|
|
97
97
|
};
|
|
98
98
|
|
|
99
|
-
export type { ModuleExport } from "@gtkx/react/
|
|
99
|
+
export type { ModuleExport } from "@gtkx/react/config";
|
|
100
100
|
export { readBuiltinElements, type BuiltinElements };
|
package/src/runner.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
+
import type { ModuleExport } from "./react/element-config.js";
|
|
3
4
|
import type { OmittedProps } from "./store/jsx/omitted-props.js";
|
|
4
5
|
import type { StoreOptions } from "./store/store-fs.js";
|
|
5
6
|
import { checkModules } from "./compile.js";
|
|
@@ -8,14 +9,6 @@ import { runGiCodegen } from "./gi.js";
|
|
|
8
9
|
import { Library } from "./gir/library.js";
|
|
9
10
|
import { generateGlModules, type GlGenerationReport } from "./khronos/pipeline.js";
|
|
10
11
|
|
|
11
|
-
/** A named export in a module, referenced as plain data (the module is never imported at runtime). */
|
|
12
|
-
type ModuleExport = {
|
|
13
|
-
/** Specifier the export is imported from. */
|
|
14
|
-
module: string;
|
|
15
|
-
/** Identifier the module exports it under. */
|
|
16
|
-
export: string;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
12
|
type GlCodegenOptions = {
|
|
20
13
|
registryPath: string;
|
|
21
14
|
overrideExports: Set<string>;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { GirFunction } from "../../gir/function.js";
|
|
2
|
+
import type { GirCallable } from "../../gir/parameter.js";
|
|
3
|
+
import type { ModuleContext } from "../../writer/context.js";
|
|
4
|
+
import type { JsDocSpec } from "../../writer/doc.js";
|
|
5
|
+
import { shouldOmitPrimaryReturn } from "../../analysis/descriptor-render.js";
|
|
6
|
+
import { nulTerminatedByteParams } from "../../analysis/nul-terminated-bytes.js";
|
|
7
|
+
import {
|
|
8
|
+
documentedParameters,
|
|
9
|
+
type InputParameter,
|
|
10
|
+
parameterIdentifier,
|
|
11
|
+
renamesWithInstance,
|
|
12
|
+
} from "../../analysis/param-structure.js";
|
|
13
|
+
import { renderJsDoc } from "../../writer/doc.js";
|
|
14
|
+
import { annotationSpec, THROWS_TEXT } from "./doc-spec.js";
|
|
15
|
+
import { isCallbackParameter, returnedOutParameters } from "./method.js";
|
|
16
|
+
|
|
17
|
+
type CallableDocOptions = {
|
|
18
|
+
finishFn?: GirFunction | undefined;
|
|
19
|
+
renames?: Map<string, string> | undefined;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const WHITESPACE_RUN_PATTERN = /\s+/g;
|
|
23
|
+
|
|
24
|
+
const nulTerminatedNote = (context: ModuleContext, callable: GirCallable): string | undefined => {
|
|
25
|
+
const parameters = nulTerminatedByteParams(context.library, callable);
|
|
26
|
+
|
|
27
|
+
if (parameters.length === 0) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const names = parameters.map((parameter) => `\`${parameter.name}\``).join(", ");
|
|
32
|
+
|
|
33
|
+
return [
|
|
34
|
+
`The C function reads ${names} as a NUL-terminated string, so it stops at the`,
|
|
35
|
+
"first zero byte and drops every byte after it without reporting an error.",
|
|
36
|
+
"Pass binary data through a `GLib.Bytes` route such as `GLib.Variant.newFromBytes`",
|
|
37
|
+
"instead.",
|
|
38
|
+
].join("\n");
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const tupleBullet = (name: string, doc: string | undefined): string | undefined => {
|
|
42
|
+
const text = (doc ?? "").replaceAll(WHITESPACE_RUN_PATTERN, " ").trim();
|
|
43
|
+
|
|
44
|
+
return text.length === 0 ? undefined : `- \`${name}\`: ${text}`;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const tupleReturnsText = (primary: string | undefined, outs: InputParameter[]): string | undefined => {
|
|
48
|
+
const bullets = [
|
|
49
|
+
tupleBullet("result", primary),
|
|
50
|
+
...outs.map(({ parameter, index }) => tupleBullet(parameterIdentifier(parameter, index), parameter.doc)),
|
|
51
|
+
].filter((bullet) => bullet !== undefined);
|
|
52
|
+
|
|
53
|
+
return bullets.length === 0 ? undefined : `Tuple of:\n\n${bullets.join("\n")}`;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const returnsText = (context: ModuleContext, fn: GirFunction): string | undefined => {
|
|
57
|
+
const outs = returnedOutParameters(context, fn);
|
|
58
|
+
const isPrimaryOmitted = shouldOmitPrimaryReturn(context.library, fn.returnValue);
|
|
59
|
+
const primary = isPrimaryOmitted ? undefined : fn.returnValue.doc;
|
|
60
|
+
|
|
61
|
+
if (outs.length === 0) {
|
|
62
|
+
return primary;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (isPrimaryOmitted && outs.length === 1) {
|
|
66
|
+
return outs[0]?.parameter.doc;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return tupleReturnsText(primary, outs);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const docIdentifiers = (callable: GirFunction, renames: Map<string, string> | undefined): Map<string, string> => {
|
|
73
|
+
const identifiers = renamesWithInstance(callable.parameters, callable.instance);
|
|
74
|
+
const overrides = renames ?? new Map<string, string>();
|
|
75
|
+
|
|
76
|
+
for (const [girName, declaredName] of overrides) {
|
|
77
|
+
identifiers.set(girName, declaredName);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return identifiers;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const canCallableThrow = (callable: GirFunction, finishFn: GirFunction | undefined): boolean =>
|
|
84
|
+
callable.throws || finishFn?.throws === true;
|
|
85
|
+
|
|
86
|
+
const callableSpec = (context: ModuleContext, callable: GirFunction, options: CallableDocOptions): JsDocSpec => ({
|
|
87
|
+
...annotationSpec(callable.annotations),
|
|
88
|
+
identifiers: docIdentifiers(callable, options.renames),
|
|
89
|
+
params: documentedParameters(
|
|
90
|
+
context.library,
|
|
91
|
+
callable,
|
|
92
|
+
(parameter) => options.finishFn !== undefined && isCallbackParameter(context, parameter),
|
|
93
|
+
options.renames,
|
|
94
|
+
),
|
|
95
|
+
returns: returnsText(context, options.finishFn ?? callable),
|
|
96
|
+
throws: canCallableThrow(callable, options.finishFn) ? THROWS_TEXT : undefined,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
const callableDoc = (context: ModuleContext, callable: GirFunction, options: CallableDocOptions = {}): string =>
|
|
100
|
+
renderJsDoc(callable.doc, nulTerminatedNote(context, callable), callableSpec(context, callable, options));
|
|
101
|
+
|
|
102
|
+
export { callableDoc, callableSpec };
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { camelCase, toCamelIdentifier, uniqBy } from "@gtkx/utils";
|
|
2
2
|
import type { GirFunction } from "../../gir/function.js";
|
|
3
3
|
import type { ModuleContext } from "../../writer/context.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import type { JsDocSpec } from "../../writer/doc.js";
|
|
5
|
+
import { hasUnmarshalableParam } from "../../analysis/param-capability.js";
|
|
6
6
|
import { renderBlock } from "../../writer/emit.js";
|
|
7
7
|
import { matchAsyncFinish } from "./async.js";
|
|
8
|
+
import { callableDoc, callableSpec } from "./callable-doc.js";
|
|
8
9
|
import { renderFnExpression } from "./function.js";
|
|
9
10
|
import { gtypeMemberDeclaration } from "./gtype-binding.js";
|
|
10
11
|
import {
|
|
@@ -16,7 +17,7 @@ import {
|
|
|
16
17
|
renderPromisifiedBody,
|
|
17
18
|
renderPromisifiedSignature,
|
|
18
19
|
} from "./method.js";
|
|
19
|
-
import { renderRuntimeOverride } from "./runtime-override.js";
|
|
20
|
+
import { renderRuntimeOverride, runtimeOverrideRenames } from "./runtime-override.js";
|
|
20
21
|
|
|
21
22
|
type Callables = {
|
|
22
23
|
constructors: GirFunction[];
|
|
@@ -64,7 +65,7 @@ type PlainTypeMembersOptions = {
|
|
|
64
65
|
|
|
65
66
|
const renderInstanceMethodSignature: InstanceMemberRenderer = instanceMemberRenderer(
|
|
66
67
|
(context, callable, { name, finishFn }) =>
|
|
67
|
-
`${
|
|
68
|
+
`${memberDoc(context, callable, finishFn)}${memberSignatureText(context, callable, name, { finishFn })};`,
|
|
68
69
|
);
|
|
69
70
|
|
|
70
71
|
const renderClassInstanceMember: InstanceMemberRenderer = instanceMemberRenderer(
|
|
@@ -78,6 +79,12 @@ const renderClassInstanceMember: InstanceMemberRenderer = instanceMemberRenderer
|
|
|
78
79
|
}),
|
|
79
80
|
);
|
|
80
81
|
|
|
82
|
+
const memberDoc = (context: ModuleContext, callable: GirFunction, finishFn: GirFunction | undefined): string =>
|
|
83
|
+
callableDoc(context, callable, { finishFn });
|
|
84
|
+
|
|
85
|
+
const instanceMemberSpec = (context: ModuleContext, callable: GirFunction, scope: InstanceScope): JsDocSpec =>
|
|
86
|
+
callableSpec(context, callable, { finishFn: matchFinishFunction(context, callable, scope) });
|
|
87
|
+
|
|
81
88
|
const instanceScope = (ownerName: string, callables: Callables): InstanceScope => ({
|
|
82
89
|
ownerName,
|
|
83
90
|
methodByName: indexMethodsByName(callables.methods),
|
|
@@ -96,11 +103,7 @@ const renderBinding = (
|
|
|
96
103
|
context: ModuleContext,
|
|
97
104
|
callable: GirFunction,
|
|
98
105
|
): { text: string; cIdentifier: string } | undefined => {
|
|
99
|
-
if (!callable
|
|
100
|
-
return undefined;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (callable.shadowedBy !== undefined) {
|
|
106
|
+
if (!isEmittableCallable(context, callable)) {
|
|
104
107
|
return undefined;
|
|
105
108
|
}
|
|
106
109
|
|
|
@@ -182,7 +185,8 @@ const renderCallableMember = (
|
|
|
182
185
|
}
|
|
183
186
|
|
|
184
187
|
const { cIdentifier, name } = resolved;
|
|
185
|
-
const
|
|
188
|
+
const renames = options.canUseRuntimeOverride === true ? runtimeOverrideRenames(callable) : undefined;
|
|
189
|
+
const doc = callableDoc(context, callable, { renames });
|
|
186
190
|
const override = runtimeOverrideMember(callable, name, doc, options.canUseRuntimeOverride);
|
|
187
191
|
|
|
188
192
|
if (override !== undefined) {
|
|
@@ -349,7 +353,7 @@ const renderPromisifiedCallable = (
|
|
|
349
353
|
const prefix = member.isStatic ? "static " : "";
|
|
350
354
|
const header = `${prefix}${member.name}(${signature}): ${returnType}`;
|
|
351
355
|
|
|
352
|
-
return `${
|
|
356
|
+
return `${memberDoc(context, callable, finishFn)}${renderBlock(header, body)}`;
|
|
353
357
|
};
|
|
354
358
|
|
|
355
359
|
const indexMethodsByName = (methods: GirFunction[]): Map<string, GirFunction> => {
|
|
@@ -366,7 +370,7 @@ const isEmittableCallable = (context: ModuleContext, callable: GirFunction): boo
|
|
|
366
370
|
callable.introspectable &&
|
|
367
371
|
callable.shadowedBy === undefined &&
|
|
368
372
|
callable.cIdentifier !== undefined &&
|
|
369
|
-
!
|
|
373
|
+
!hasUnmarshalableParam(context, callable);
|
|
370
374
|
|
|
371
375
|
const constructorMemberName = (girName: string): string | undefined => {
|
|
372
376
|
const camel = camelCase(girName);
|
|
@@ -497,6 +501,7 @@ const renderPlainTypeMembers = (
|
|
|
497
501
|
export {
|
|
498
502
|
renderInstanceMethodSignature,
|
|
499
503
|
renderClassInstanceMember,
|
|
504
|
+
instanceMemberSpec,
|
|
500
505
|
instanceScope,
|
|
501
506
|
dedupeCallables,
|
|
502
507
|
generateBindings,
|
|
@@ -508,5 +513,6 @@ export {
|
|
|
508
513
|
renderStaticHead,
|
|
509
514
|
renderPlainTypeMembers,
|
|
510
515
|
type Callables,
|
|
516
|
+
type InstanceMemberRenderer,
|
|
511
517
|
type InstanceScope,
|
|
512
518
|
};
|