@ts-for-gir/lib 4.0.0-beta.4 → 4.0.0-beta.41
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 +13 -1
- package/package.json +18 -31
- package/src/constants.ts +152 -0
- package/src/dependency-manager.ts +445 -0
- package/src/formatters/default.ts +7 -0
- package/src/formatters/formatter.ts +3 -0
- package/src/formatters/index.ts +3 -0
- package/src/formatters/json.ts +7 -0
- package/src/generators/generator.ts +65 -0
- package/src/generators/index.ts +2 -0
- package/src/generics/clutter.ts +80 -0
- package/src/generics/generify.ts +101 -0
- package/src/generics/gio.ts +91 -0
- package/src/generics/glib.ts +31 -0
- package/src/generics/gtk.ts +99 -0
- package/src/generics/meta.ts +50 -0
- package/src/generics/st.ts +206 -0
- package/src/generics/visitor.ts +484 -0
- package/src/gir/alias.ts +73 -0
- package/src/gir/callback.ts +79 -0
- package/src/gir/const.ts +73 -0
- package/src/gir/constructor.ts +91 -0
- package/src/gir/data.ts +12 -0
- package/src/gir/dependency-resolver.ts +81 -0
- package/src/gir/direct-allocation-constructor.ts +65 -0
- package/src/gir/enum-member.ts +51 -0
- package/src/gir/enum.ts +129 -0
- package/src/gir/error.ts +89 -0
- package/src/gir/function.ts +296 -0
- package/src/gir/generics.ts +66 -0
- package/src/gir/gir-complex-record.ts +7 -0
- package/src/gir/index.ts +25 -0
- package/src/gir/introspected-base.ts +104 -0
- package/src/gir/introspected-class-member.ts +15 -0
- package/src/gir/introspected-classes.ts +1484 -0
- package/src/gir/introspected-namespace-member.ts +24 -0
- package/src/gir/namespace.ts +76 -0
- package/src/gir/parameter.ts +199 -0
- package/src/gir/promisify.ts +209 -0
- package/src/gir/property.ts +203 -0
- package/src/gir/record.ts +488 -0
- package/src/gir/registry.ts +183 -0
- package/src/gir/signal.ts +278 -0
- package/src/gir-module.ts +719 -0
- package/src/gir.ts +869 -0
- package/src/index.ts +16 -0
- package/src/injections/gee08.ts +89 -0
- package/src/injections/gee1.ts +35 -0
- package/src/injections/gio.ts +720 -0
- package/src/injections/glib.ts +280 -0
- package/src/injections/gobject.ts +906 -0
- package/src/injections/gtk4.ts +23 -0
- package/src/injections/inject.ts +49 -0
- package/src/injections/shell.ts +49 -0
- package/src/injections/tracker1.ts +42 -0
- package/src/library-version.ts +50 -0
- package/src/logger.ts +104 -0
- package/src/messages.ts +57 -0
- package/src/templates/index.ts +1 -0
- package/src/templates/template-engine.ts +178 -0
- package/src/types/answer-version.ts +4 -0
- package/src/types/any-introspected-type.ts +5 -0
- package/src/types/class-function-types.ts +57 -0
- package/src/types/class-member.ts +5 -0
- package/src/types/class-parent.ts +14 -0
- package/src/types/class.ts +43 -0
- package/src/types/config-flags.ts +5 -0
- package/src/types/construct-name.ts +13 -0
- package/src/types/dependency-map.ts +4 -0
- package/src/types/dependency.ts +49 -0
- package/src/types/file-info.ts +14 -0
- package/src/types/format.ts +1 -0
- package/src/types/generator-constructor.ts +7 -0
- package/src/types/generics-config.ts +90 -0
- package/src/types/gir-any-element.ts +35 -0
- package/src/types/gir-module-interface.ts +22 -0
- package/src/types/gir-module-resolved.ts +32 -0
- package/src/types/gir-type-name.ts +20 -0
- package/src/types/index.ts +92 -0
- package/{lib/types/inheritance-table.d.ts → src/types/inheritance-table.ts} +1 -1
- package/src/types/introspected.ts +18 -0
- package/src/types/local-name-check.ts +5 -0
- package/src/types/local-name-type.ts +1 -0
- package/src/types/local-name.ts +8 -0
- package/src/types/local-names.ts +5 -0
- package/src/types/metadata.ts +6 -0
- package/src/types/ns-loader.ts +6 -0
- package/src/types/options-base.ts +8 -0
- package/src/types/options-generation.ts +65 -0
- package/src/types/options-load.ts +6 -0
- package/src/types/options-transform.ts +5 -0
- package/src/types/output-format.ts +1 -0
- package/src/types/package-data-parsed.ts +28 -0
- package/src/types/package-data.ts +24 -0
- package/src/types/package-section-parsed.ts +9 -0
- package/src/types/parsed-gir.ts +5 -0
- package/src/types/parsed-package-data.ts +7 -0
- package/src/types/property-case.ts +1 -0
- package/src/types/resolve-type.ts +4 -0
- package/src/types/template-data.ts +8 -0
- package/src/types/template-options.ts +33 -0
- package/src/types/transformation-case.ts +9 -0
- package/src/types/transformations.ts +5 -0
- package/{lib/types/ts-doc-tag.d.ts → src/types/ts-doc-tag.ts} +14 -12
- package/src/types/ts-doc.ts +18 -0
- package/{lib/types/type-gir-alias.d.ts → src/types/type-gir-alias.ts} +1 -1
- package/src/types/type-gir-class.ts +2 -0
- package/src/types/type-gir-element.ts +25 -0
- package/src/types/type-gir-enumeration-member.ts +2 -0
- package/{lib/types/type-gir-enumeration.d.ts → src/types/type-gir-enumeration.ts} +1 -1
- package/src/types/type-gir-function.ts +8 -0
- package/{lib/types/type-gir-interface.d.ts → src/types/type-gir-interface.ts} +1 -1
- package/src/types/type-gir-method.ts +2 -0
- package/src/types/type-gir-parameter.ts +1 -0
- package/{lib/types/type-gir-property.d.ts → src/types/type-gir-property.ts} +1 -1
- package/src/types/type-gir-variable.ts +1 -0
- package/src/types/type-ts-element.ts +13 -0
- package/{lib/types/type-ts-enumeration-member.d.ts → src/types/type-ts-enumeration-member.ts} +1 -1
- package/src/types/type-ts-function.ts +1 -0
- package/src/types/type-ts-property.ts +1 -0
- package/src/types/user-config-load-result.ts +6 -0
- package/src/types/user-config.ts +70 -0
- package/src/util.ts +84 -0
- package/src/utils/conflicts/conflict-resolver.ts +122 -0
- package/src/utils/conflicts/function-conflict-detector.ts +139 -0
- package/src/utils/conflicts/index.ts +2 -0
- package/src/utils/conflicts.ts +593 -0
- package/src/utils/documentation.ts +471 -0
- package/src/utils/files.ts +71 -0
- package/src/utils/function-type-guards.ts +61 -0
- package/src/utils/generation.ts +69 -0
- package/src/utils/gir-parsing.ts +262 -0
- package/src/utils/girs.ts +113 -0
- package/src/utils/index.ts +14 -0
- package/src/utils/naming.ts +188 -0
- package/src/utils/numbers.ts +8 -0
- package/src/utils/objects.ts +129 -0
- package/src/utils/path.ts +7 -0
- package/src/utils/registry.ts +5 -0
- package/src/utils/strings.ts +134 -0
- package/src/utils/type-resolution.ts +116 -0
- package/src/utils/types.ts +249 -0
- package/src/validators/class.ts +324 -0
- package/src/validators/function-parameters.ts +52 -0
- package/src/validators/interface.ts +20 -0
- package/src/visitor.ts +58 -0
- package/lib/constants.d.ts +0 -26
- package/lib/constants.js +0 -28
- package/lib/constants.js.map +0 -1
- package/lib/dependency-manager.d.ts +0 -183
- package/lib/dependency-manager.js +0 -401
- package/lib/dependency-manager.js.map +0 -1
- package/lib/formatters/default.d.ts +0 -4
- package/lib/formatters/default.js +0 -7
- package/lib/formatters/default.js.map +0 -1
- package/lib/formatters/formatter.d.ts +0 -3
- package/lib/formatters/formatter.js +0 -3
- package/lib/formatters/formatter.js.map +0 -1
- package/lib/formatters/json.d.ts +0 -4
- package/lib/formatters/json.js +0 -7
- package/lib/formatters/json.js.map +0 -1
- package/lib/generators/dts/glib.d.ts +0 -2
- package/lib/generators/dts/glib.js +0 -514
- package/lib/generators/dts/glib.js.map +0 -1
- package/lib/generators/dts/gobject.d.ts +0 -2
- package/lib/generators/dts/gobject.js +0 -117
- package/lib/generators/dts/gobject.js.map +0 -1
- package/lib/generators/dts-inline.d.ts +0 -8
- package/lib/generators/dts-inline.js +0 -59
- package/lib/generators/dts-inline.js.map +0 -1
- package/lib/generators/dts-modules.d.ts +0 -8
- package/lib/generators/dts-modules.js +0 -100
- package/lib/generators/dts-modules.js.map +0 -1
- package/lib/generators/dts.d.ts +0 -45
- package/lib/generators/dts.js +0 -682
- package/lib/generators/dts.js.map +0 -1
- package/lib/generators/generator.d.ts +0 -45
- package/lib/generators/generator.js +0 -9
- package/lib/generators/generator.js.map +0 -1
- package/lib/generators/index.d.ts +0 -5
- package/lib/generators/index.js +0 -6
- package/lib/generators/index.js.map +0 -1
- package/lib/generators/json.d.ts +0 -256
- package/lib/generators/json.js +0 -869
- package/lib/generators/json.js.map +0 -1
- package/lib/generics/clutter.d.ts +0 -26
- package/lib/generics/clutter.js +0 -49
- package/lib/generics/clutter.js.map +0 -1
- package/lib/generics/generify.d.ts +0 -2
- package/lib/generics/generify.js +0 -39
- package/lib/generics/generify.js.map +0 -1
- package/lib/generics/gio.d.ts +0 -7
- package/lib/generics/gio.js +0 -51
- package/lib/generics/gio.js.map +0 -1
- package/lib/generics/glib.d.ts +0 -7
- package/lib/generics/glib.js +0 -18
- package/lib/generics/glib.js.map +0 -1
- package/lib/generics/meta.d.ts +0 -21
- package/lib/generics/meta.js +0 -26
- package/lib/generics/meta.js.map +0 -1
- package/lib/generics/st.d.ts +0 -16
- package/lib/generics/st.js +0 -92
- package/lib/generics/st.js.map +0 -1
- package/lib/generics/visitor.d.ts +0 -20
- package/lib/generics/visitor.js +0 -255
- package/lib/generics/visitor.js.map +0 -1
- package/lib/gir/alias.d.ts +0 -24
- package/lib/gir/alias.js +0 -43
- package/lib/gir/alias.js.map +0 -1
- package/lib/gir/base.d.ts +0 -62
- package/lib/gir/base.js +0 -95
- package/lib/gir/base.js.map +0 -1
- package/lib/gir/class.d.ts +0 -189
- package/lib/gir/class.js +0 -1131
- package/lib/gir/class.js.map +0 -1
- package/lib/gir/const.d.ts +0 -25
- package/lib/gir/const.js +0 -43
- package/lib/gir/const.js.map +0 -1
- package/lib/gir/enum.d.ts +0 -45
- package/lib/gir/enum.js +0 -164
- package/lib/gir/enum.js.map +0 -1
- package/lib/gir/function.d.ts +0 -199
- package/lib/gir/function.js +0 -683
- package/lib/gir/function.js.map +0 -1
- package/lib/gir/generics.d.ts +0 -5
- package/lib/gir/generics.js +0 -57
- package/lib/gir/generics.js.map +0 -1
- package/lib/gir/namespace.d.ts +0 -21
- package/lib/gir/namespace.js +0 -57
- package/lib/gir/namespace.js.map +0 -1
- package/lib/gir/nodes.d.ts +0 -11
- package/lib/gir/nodes.js +0 -12
- package/lib/gir/nodes.js.map +0 -1
- package/lib/gir/property.d.ts +0 -60
- package/lib/gir/property.js +0 -128
- package/lib/gir/property.js.map +0 -1
- package/lib/gir/registry.d.ts +0 -51
- package/lib/gir/registry.js +0 -144
- package/lib/gir/registry.js.map +0 -1
- package/lib/gir/signal.d.ts +0 -33
- package/lib/gir/signal.js +0 -165
- package/lib/gir/signal.js.map +0 -1
- package/lib/gir/util.d.ts +0 -49
- package/lib/gir/util.js +0 -559
- package/lib/gir/util.js.map +0 -1
- package/lib/gir-module.d.ts +0 -112
- package/lib/gir-module.js +0 -570
- package/lib/gir-module.js.map +0 -1
- package/lib/gir.d.ts +0 -253
- package/lib/gir.js +0 -642
- package/lib/gir.js.map +0 -1
- package/lib/index.d.ts +0 -14
- package/lib/index.js +0 -17
- package/lib/index.js.map +0 -1
- package/lib/injections/gee08.d.ts +0 -7
- package/lib/injections/gee08.js +0 -68
- package/lib/injections/gee08.js.map +0 -1
- package/lib/injections/gee1.d.ts +0 -7
- package/lib/injections/gee1.js +0 -28
- package/lib/injections/gee1.js.map +0 -1
- package/lib/injections/gio.d.ts +0 -7
- package/lib/injections/gio.js +0 -431
- package/lib/injections/gio.js.map +0 -1
- package/lib/injections/glib.d.ts +0 -7
- package/lib/injections/glib.js +0 -204
- package/lib/injections/glib.js.map +0 -1
- package/lib/injections/gobject.d.ts +0 -7
- package/lib/injections/gobject.js +0 -479
- package/lib/injections/gobject.js.map +0 -1
- package/lib/injections/inject.d.ts +0 -4
- package/lib/injections/inject.js +0 -28
- package/lib/injections/inject.js.map +0 -1
- package/lib/injections/tracker1.d.ts +0 -7
- package/lib/injections/tracker1.js +0 -30
- package/lib/injections/tracker1.js.map +0 -1
- package/lib/library-version.d.ts +0 -10
- package/lib/library-version.js +0 -45
- package/lib/library-version.js.map +0 -1
- package/lib/logger.d.ts +0 -36
- package/lib/logger.js +0 -134
- package/lib/logger.js.map +0 -1
- package/lib/messages.d.ts +0 -26
- package/lib/messages.js +0 -42
- package/lib/messages.js.map +0 -1
- package/lib/registry.d.ts +0 -8
- package/lib/registry.js +0 -12
- package/lib/registry.js.map +0 -1
- package/lib/transformation.d.ts +0 -181
- package/lib/transformation.js +0 -480
- package/lib/transformation.js.map +0 -1
- package/lib/types/answer-version.d.ts +0 -4
- package/lib/types/answer-version.js +0 -2
- package/lib/types/answer-version.js.map +0 -1
- package/lib/types/class-parent.d.ts +0 -13
- package/lib/types/class-parent.js +0 -2
- package/lib/types/class-parent.js.map +0 -1
- package/lib/types/config-flags.d.ts +0 -4
- package/lib/types/config-flags.js +0 -2
- package/lib/types/config-flags.js.map +0 -1
- package/lib/types/construct-name.d.ts +0 -1
- package/lib/types/construct-name.js +0 -2
- package/lib/types/construct-name.js.map +0 -1
- package/lib/types/dependency-map.d.ts +0 -4
- package/lib/types/dependency-map.js +0 -2
- package/lib/types/dependency-map.js.map +0 -1
- package/lib/types/dependency.d.ts +0 -42
- package/lib/types/dependency.js +0 -2
- package/lib/types/dependency.js.map +0 -1
- package/lib/types/file-info.d.ts +0 -14
- package/lib/types/file-info.js +0 -2
- package/lib/types/file-info.js.map +0 -1
- package/lib/types/format.d.ts +0 -1
- package/lib/types/format.js +0 -2
- package/lib/types/format.js.map +0 -1
- package/lib/types/gir-alias-element.d.ts +0 -4
- package/lib/types/gir-alias-element.js +0 -2
- package/lib/types/gir-alias-element.js.map +0 -1
- package/lib/types/gir-annotation.d.ts +0 -9
- package/lib/types/gir-annotation.js +0 -2
- package/lib/types/gir-annotation.js.map +0 -1
- package/lib/types/gir-any-element.d.ts +0 -2
- package/lib/types/gir-any-element.js +0 -2
- package/lib/types/gir-any-element.js.map +0 -1
- package/lib/types/gir-bitfield-element.d.ts +0 -6
- package/lib/types/gir-bitfield-element.js +0 -2
- package/lib/types/gir-bitfield-element.js.map +0 -1
- package/lib/types/gir-callable-param-element.d.ts +0 -4
- package/lib/types/gir-callable-param-element.js +0 -2
- package/lib/types/gir-callable-param-element.js.map +0 -1
- package/lib/types/gir-callable-params.d.ts +0 -7
- package/lib/types/gir-callable-params.js +0 -2
- package/lib/types/gir-callable-params.js.map +0 -1
- package/lib/types/gir-callable-return.d.ts +0 -5
- package/lib/types/gir-callable-return.js +0 -2
- package/lib/types/gir-callable-return.js.map +0 -1
- package/lib/types/gir-callback-element.d.ts +0 -6
- package/lib/types/gir-callback-element.js +0 -2
- package/lib/types/gir-callback-element.js.map +0 -1
- package/lib/types/gir-class-element.d.ts +0 -17
- package/lib/types/gir-class-element.js +0 -2
- package/lib/types/gir-class-element.js.map +0 -1
- package/lib/types/gir-constant-element.d.ts +0 -4
- package/lib/types/gir-constant-element.js +0 -2
- package/lib/types/gir-constant-element.js.map +0 -1
- package/lib/types/gir-constructor-element.d.ts +0 -6
- package/lib/types/gir-constructor-element.js +0 -2
- package/lib/types/gir-constructor-element.js.map +0 -1
- package/lib/types/gir-enum-element.d.ts +0 -6
- package/lib/types/gir-enum-element.js +0 -2
- package/lib/types/gir-enum-element.js.map +0 -1
- package/lib/types/gir-field-element.d.ts +0 -5
- package/lib/types/gir-field-element.js +0 -2
- package/lib/types/gir-field-element.js.map +0 -1
- package/lib/types/gir-function-element.d.ts +0 -6
- package/lib/types/gir-function-element.js +0 -2
- package/lib/types/gir-function-element.js.map +0 -1
- package/lib/types/gir-instance-parameter.d.ts +0 -8
- package/lib/types/gir-instance-parameter.js +0 -2
- package/lib/types/gir-instance-parameter.js.map +0 -1
- package/lib/types/gir-interface-element.d.ts +0 -16
- package/lib/types/gir-interface-element.js +0 -2
- package/lib/types/gir-interface-element.js.map +0 -1
- package/lib/types/gir-member-element.d.ts +0 -5
- package/lib/types/gir-member-element.js +0 -2
- package/lib/types/gir-member-element.js.map +0 -1
- package/lib/types/gir-method-element.d.ts +0 -7
- package/lib/types/gir-method-element.js +0 -2
- package/lib/types/gir-method-element.js.map +0 -1
- package/lib/types/gir-module-resolved-by.d.ts +0 -15
- package/lib/types/gir-module-resolved-by.js +0 -2
- package/lib/types/gir-module-resolved-by.js.map +0 -1
- package/lib/types/gir-modules-grouped-map.d.ts +0 -4
- package/lib/types/gir-modules-grouped-map.js +0 -2
- package/lib/types/gir-modules-grouped-map.js.map +0 -1
- package/lib/types/gir-modules-grouped.d.ts +0 -12
- package/lib/types/gir-modules-grouped.js +0 -2
- package/lib/types/gir-modules-grouped.js.map +0 -1
- package/lib/types/gir-namespace.d.ts +0 -27
- package/lib/types/gir-namespace.js +0 -2
- package/lib/types/gir-namespace.js.map +0 -1
- package/lib/types/gir-property-element.d.ts +0 -4
- package/lib/types/gir-property-element.js +0 -2
- package/lib/types/gir-property-element.js.map +0 -1
- package/lib/types/gir-record-element.d.ts +0 -10
- package/lib/types/gir-record-element.js +0 -2
- package/lib/types/gir-record-element.js.map +0 -1
- package/lib/types/gir-repository.d.ts +0 -5
- package/lib/types/gir-repository.js +0 -2
- package/lib/types/gir-repository.js.map +0 -1
- package/lib/types/gir-signal.d.ts +0 -10
- package/lib/types/gir-signal.js +0 -2
- package/lib/types/gir-signal.js.map +0 -1
- package/lib/types/gir-type-name.d.ts +0 -2
- package/lib/types/gir-type-name.js +0 -2
- package/lib/types/gir-type-name.js.map +0 -1
- package/lib/types/gir-union-element.d.ts +0 -9
- package/lib/types/gir-union-element.js +0 -2
- package/lib/types/gir-union-element.js.map +0 -1
- package/lib/types/gir-unparsed-number.d.ts +0 -2
- package/lib/types/gir-unparsed-number.js +0 -2
- package/lib/types/gir-unparsed-number.js.map +0 -1
- package/lib/types/gir-virtual-method.d.ts +0 -6
- package/lib/types/gir-virtual-method.js +0 -2
- package/lib/types/gir-virtual-method.js.map +0 -1
- package/lib/types/index.d.ts +0 -79
- package/lib/types/index.js +0 -80
- package/lib/types/index.js.map +0 -1
- package/lib/types/inheritance-table.js +0 -2
- package/lib/types/inheritance-table.js.map +0 -1
- package/lib/types/local-name-check.d.ts +0 -4
- package/lib/types/local-name-check.js +0 -2
- package/lib/types/local-name-check.js.map +0 -1
- package/lib/types/local-name-type.d.ts +0 -1
- package/lib/types/local-name-type.js +0 -2
- package/lib/types/local-name-type.js.map +0 -1
- package/lib/types/local-name.d.ts +0 -7
- package/lib/types/local-name.js +0 -2
- package/lib/types/local-name.js.map +0 -1
- package/lib/types/local-names.d.ts +0 -4
- package/lib/types/local-names.js +0 -2
- package/lib/types/local-names.js.map +0 -1
- package/lib/types/metadata.d.ts +0 -8
- package/lib/types/metadata.js +0 -2
- package/lib/types/metadata.js.map +0 -1
- package/lib/types/options-base.d.ts +0 -4
- package/lib/types/options-base.js +0 -2
- package/lib/types/options-base.js.map +0 -1
- package/lib/types/options-generation.d.ts +0 -33
- package/lib/types/options-generation.js +0 -2
- package/lib/types/options-generation.js.map +0 -1
- package/lib/types/options-load.d.ts +0 -5
- package/lib/types/options-load.js +0 -2
- package/lib/types/options-load.js.map +0 -1
- package/lib/types/options-transform.d.ts +0 -4
- package/lib/types/options-transform.js +0 -2
- package/lib/types/options-transform.js.map +0 -1
- package/lib/types/output-format.d.ts +0 -1
- package/lib/types/output-format.js +0 -2
- package/lib/types/output-format.js.map +0 -1
- package/lib/types/package-data-parsed.d.ts +0 -28
- package/lib/types/package-data-parsed.js +0 -2
- package/lib/types/package-data-parsed.js.map +0 -1
- package/lib/types/package-data.d.ts +0 -23
- package/lib/types/package-data.js +0 -2
- package/lib/types/package-data.js.map +0 -1
- package/lib/types/package-section-parsed.d.ts +0 -8
- package/lib/types/package-section-parsed.js +0 -2
- package/lib/types/package-section-parsed.js.map +0 -1
- package/lib/types/parsed-gir.d.ts +0 -5
- package/lib/types/parsed-gir.js +0 -2
- package/lib/types/parsed-gir.js.map +0 -1
- package/lib/types/parsed-package-data.d.ts +0 -6
- package/lib/types/parsed-package-data.js +0 -2
- package/lib/types/parsed-package-data.js.map +0 -1
- package/lib/types/part-of-class.d.ts +0 -7
- package/lib/types/part-of-class.js +0 -2
- package/lib/types/part-of-class.js.map +0 -1
- package/lib/types/part-of-module.d.ts +0 -6
- package/lib/types/part-of-module.js +0 -2
- package/lib/types/part-of-module.js.map +0 -1
- package/lib/types/property-case.d.ts +0 -1
- package/lib/types/property-case.js +0 -2
- package/lib/types/property-case.js.map +0 -1
- package/lib/types/resolve-type.d.ts +0 -4
- package/lib/types/resolve-type.js +0 -6
- package/lib/types/resolve-type.js.map +0 -1
- package/lib/types/template-data.d.ts +0 -7
- package/lib/types/template-data.js +0 -2
- package/lib/types/template-data.js.map +0 -1
- package/lib/types/transformation-case.d.ts +0 -1
- package/lib/types/transformation-case.js +0 -2
- package/lib/types/transformation-case.js.map +0 -1
- package/lib/types/transformations.d.ts +0 -4
- package/lib/types/transformations.js +0 -2
- package/lib/types/transformations.js.map +0 -1
- package/lib/types/ts-doc-tag.js +0 -2
- package/lib/types/ts-doc-tag.js.map +0 -1
- package/lib/types/ts-doc.d.ts +0 -16
- package/lib/types/ts-doc.js +0 -2
- package/lib/types/ts-doc.js.map +0 -1
- package/lib/types/type-gir-alias.js +0 -2
- package/lib/types/type-gir-alias.js.map +0 -1
- package/lib/types/type-gir-class.d.ts +0 -2
- package/lib/types/type-gir-class.js +0 -2
- package/lib/types/type-gir-class.js.map +0 -1
- package/lib/types/type-gir-element.d.ts +0 -3
- package/lib/types/type-gir-element.js +0 -2
- package/lib/types/type-gir-element.js.map +0 -1
- package/lib/types/type-gir-enumeration-member.d.ts +0 -2
- package/lib/types/type-gir-enumeration-member.js +0 -2
- package/lib/types/type-gir-enumeration-member.js.map +0 -1
- package/lib/types/type-gir-enumeration.js +0 -2
- package/lib/types/type-gir-enumeration.js.map +0 -1
- package/lib/types/type-gir-function.d.ts +0 -1
- package/lib/types/type-gir-function.js +0 -2
- package/lib/types/type-gir-function.js.map +0 -1
- package/lib/types/type-gir-interface.js +0 -2
- package/lib/types/type-gir-interface.js.map +0 -1
- package/lib/types/type-gir-method.d.ts +0 -2
- package/lib/types/type-gir-method.js +0 -2
- package/lib/types/type-gir-method.js.map +0 -1
- package/lib/types/type-gir-parameter.d.ts +0 -1
- package/lib/types/type-gir-parameter.js +0 -2
- package/lib/types/type-gir-parameter.js.map +0 -1
- package/lib/types/type-gir-property.js +0 -2
- package/lib/types/type-gir-property.js.map +0 -1
- package/lib/types/type-gir-variable.d.ts +0 -1
- package/lib/types/type-gir-variable.js +0 -2
- package/lib/types/type-gir-variable.js.map +0 -1
- package/lib/types/type-ts-element.d.ts +0 -3
- package/lib/types/type-ts-element.js +0 -2
- package/lib/types/type-ts-element.js.map +0 -1
- package/lib/types/type-ts-enumeration-member.js +0 -2
- package/lib/types/type-ts-enumeration-member.js.map +0 -1
- package/lib/types/type-ts-function.d.ts +0 -1
- package/lib/types/type-ts-function.js +0 -2
- package/lib/types/type-ts-function.js.map +0 -1
- package/lib/types/type-ts-property.d.ts +0 -1
- package/lib/types/type-ts-property.js +0 -2
- package/lib/types/type-ts-property.js.map +0 -1
- package/lib/types/user-config-load-result.d.ts +0 -6
- package/lib/types/user-config-load-result.js +0 -2
- package/lib/types/user-config-load-result.js.map +0 -1
- package/lib/types/user-config.d.ts +0 -35
- package/lib/types/user-config.js +0 -2
- package/lib/types/user-config.js.map +0 -1
- package/lib/util.d.ts +0 -20
- package/lib/util.js +0 -67
- package/lib/util.js.map +0 -1
- package/lib/utils.d.ts +0 -268
- package/lib/utils.js +0 -417
- package/lib/utils.js.map +0 -1
- package/lib/validators/class.d.ts +0 -7
- package/lib/validators/class.js +0 -217
- package/lib/validators/class.js.map +0 -1
- package/lib/validators/interface.d.ts +0 -5
- package/lib/validators/interface.js +0 -16
- package/lib/validators/interface.js.map +0 -1
- package/lib/visitor.d.ts +0 -35
- package/lib/visitor.js +0 -29
- package/lib/visitor.js.map +0 -1
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
import { GirDirection } from "@gi.ts/parser";
|
|
2
|
+
import { LazyReporter } from "@ts-for-gir/reporter";
|
|
3
|
+
import { IntrospectedConstructor } from "../gir/constructor.ts";
|
|
4
|
+
import { FilterBehavior } from "../gir/data.ts";
|
|
5
|
+
import type { IntrospectedFunction } from "../gir/function.ts";
|
|
6
|
+
import type { IntrospectedClassMember } from "../gir/introspected-class-member.ts";
|
|
7
|
+
import type { IntrospectedBaseClass } from "../gir/introspected-classes.ts";
|
|
8
|
+
import {
|
|
9
|
+
IntrospectedClass,
|
|
10
|
+
IntrospectedClassFunction,
|
|
11
|
+
IntrospectedInterface,
|
|
12
|
+
IntrospectedStaticClassFunction,
|
|
13
|
+
IntrospectedVirtualClassFunction,
|
|
14
|
+
} from "../gir/introspected-classes.ts";
|
|
15
|
+
import type { IntrospectedNamespace } from "../gir/namespace.ts";
|
|
16
|
+
import { IntrospectedFunctionParameter } from "../gir/parameter.ts";
|
|
17
|
+
import { IntrospectedField, IntrospectedProperty } from "../gir/property.ts";
|
|
18
|
+
import type { TypeIdentifier } from "../gir.ts";
|
|
19
|
+
import { AnyType, ArrayType, ConflictType, NeverType, TypeConflict } from "../gir.ts";
|
|
20
|
+
import { findMap } from "../util.ts";
|
|
21
|
+
import { isSubtypeOf } from "./type-resolution.ts";
|
|
22
|
+
|
|
23
|
+
export const conflictsReporter = new LazyReporter("conflicts");
|
|
24
|
+
|
|
25
|
+
// Use a function to always get the current reporter instance.
|
|
26
|
+
// A module-level `const log = conflictsReporter.get()` would capture a stale
|
|
27
|
+
// reference from before configure() is called, causing problems to be logged
|
|
28
|
+
// to console but not stored in the report.
|
|
29
|
+
function getLog() {
|
|
30
|
+
return conflictsReporter.get();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Constants for GObject methods that always conflict
|
|
34
|
+
const GOBJECT_RESERVED_METHODS = ["connect", "connect_after", "emit"] as const;
|
|
35
|
+
|
|
36
|
+
export function isConflictingFunction(
|
|
37
|
+
namespace: IntrospectedNamespace,
|
|
38
|
+
childThis: TypeIdentifier,
|
|
39
|
+
child: IntrospectedFunction | IntrospectedClassFunction | IntrospectedConstructor,
|
|
40
|
+
parentThis: TypeIdentifier,
|
|
41
|
+
parent: IntrospectedClassFunction | IntrospectedFunction | IntrospectedConstructor,
|
|
42
|
+
): boolean {
|
|
43
|
+
if (!parent.isIntrospectable || !child.isIntrospectable) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Handle constructor conflicts
|
|
48
|
+
if (isConstructorConflict(namespace, childThis, child, parentThis, parent)) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Handle mixed constructor/function conflicts
|
|
53
|
+
if (isMixedConstructorFunctionConflict(child, parent)) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Handle different function types (no conflict if different prototypes)
|
|
58
|
+
if (hasDifferentPrototypes(child, parent)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Check parameter and return type conflicts
|
|
63
|
+
return hasParameterOrReturnTypeConflicts(namespace, childThis, child, parentThis, parent);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function filterFunctionConflict<
|
|
67
|
+
T extends
|
|
68
|
+
| IntrospectedStaticClassFunction
|
|
69
|
+
| IntrospectedVirtualClassFunction
|
|
70
|
+
| IntrospectedClassFunction
|
|
71
|
+
| IntrospectedConstructor,
|
|
72
|
+
>(
|
|
73
|
+
ns: IntrospectedNamespace,
|
|
74
|
+
base: IntrospectedBaseClass,
|
|
75
|
+
elements: T[],
|
|
76
|
+
conflict_ids: string[],
|
|
77
|
+
isInheritedMethods: boolean = false,
|
|
78
|
+
): T[] {
|
|
79
|
+
const nextType = base.getType();
|
|
80
|
+
|
|
81
|
+
return elements
|
|
82
|
+
.filter((m) => m.name)
|
|
83
|
+
.reduce((prev, next) => {
|
|
84
|
+
const conflictResult = checkFunctionConflicts(ns, base, next, conflict_ids, nextType);
|
|
85
|
+
|
|
86
|
+
if (conflictResult.shouldOmit) {
|
|
87
|
+
// Always omit methods that conflict with properties/fields
|
|
88
|
+
getLog().reportTypeConflict(
|
|
89
|
+
"field_property",
|
|
90
|
+
next.name,
|
|
91
|
+
next.parent?.namespace.namespace || "unknown",
|
|
92
|
+
"Field/property name conflict",
|
|
93
|
+
);
|
|
94
|
+
} else if (conflictResult.hasConflict) {
|
|
95
|
+
if (isInheritedMethods) {
|
|
96
|
+
getLog().reportTypeConflict(
|
|
97
|
+
"method",
|
|
98
|
+
next.name,
|
|
99
|
+
next.parent?.namespace.namespace || "unknown",
|
|
100
|
+
"Parent method conflict",
|
|
101
|
+
);
|
|
102
|
+
} else {
|
|
103
|
+
const neverFunction = createNeverFunction(next, base, conflictResult.message);
|
|
104
|
+
prev.push(next, neverFunction as T);
|
|
105
|
+
}
|
|
106
|
+
} else {
|
|
107
|
+
prev.push(next);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return prev;
|
|
111
|
+
}, [] as T[]);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function filterConflicts<T extends IntrospectedClassMember | IntrospectedClassFunction | IntrospectedProperty>(
|
|
115
|
+
ns: IntrospectedNamespace,
|
|
116
|
+
c: IntrospectedBaseClass,
|
|
117
|
+
elements: T[],
|
|
118
|
+
behavior = FilterBehavior.PRESERVE,
|
|
119
|
+
): T[] {
|
|
120
|
+
const filtered = elements.filter((p) => p?.name);
|
|
121
|
+
const thisType = c.getType();
|
|
122
|
+
const result: T[] = [];
|
|
123
|
+
|
|
124
|
+
for (const element of filtered) {
|
|
125
|
+
const conflictType = detectConflictType(ns, c, element, thisType);
|
|
126
|
+
|
|
127
|
+
if (conflictType) {
|
|
128
|
+
if (behavior === FilterBehavior.PRESERVE) {
|
|
129
|
+
const conflictElement = createConflictElement(element, conflictType);
|
|
130
|
+
if (conflictElement) {
|
|
131
|
+
result.push(conflictElement);
|
|
132
|
+
} else {
|
|
133
|
+
result.push(element);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
} else {
|
|
137
|
+
result.push(element);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Helper Functions
|
|
145
|
+
|
|
146
|
+
function isConstructorConflict(
|
|
147
|
+
namespace: IntrospectedNamespace,
|
|
148
|
+
childThis: TypeIdentifier,
|
|
149
|
+
child: IntrospectedFunction | IntrospectedClassFunction | IntrospectedConstructor,
|
|
150
|
+
parentThis: TypeIdentifier,
|
|
151
|
+
parent: IntrospectedClassFunction | IntrospectedFunction | IntrospectedConstructor,
|
|
152
|
+
): boolean {
|
|
153
|
+
if (!(child instanceof IntrospectedConstructor && parent instanceof IntrospectedConstructor)) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return (
|
|
158
|
+
child.parameters.length > parent.parameters.length ||
|
|
159
|
+
!isSubtypeOf(namespace, childThis, parentThis, child.return(), parent.return()) ||
|
|
160
|
+
child.parameters.some((p, i) => !isSubtypeOf(namespace, childThis, parentThis, p.type, parent.parameters[i].type))
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function isMixedConstructorFunctionConflict(
|
|
165
|
+
child: IntrospectedFunction | IntrospectedClassFunction | IntrospectedConstructor,
|
|
166
|
+
parent: IntrospectedClassFunction | IntrospectedFunction | IntrospectedConstructor,
|
|
167
|
+
): boolean {
|
|
168
|
+
return child instanceof IntrospectedConstructor !== parent instanceof IntrospectedConstructor;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function hasDifferentPrototypes(
|
|
172
|
+
child: IntrospectedFunction | IntrospectedClassFunction | IntrospectedConstructor,
|
|
173
|
+
parent: IntrospectedClassFunction | IntrospectedFunction | IntrospectedConstructor,
|
|
174
|
+
): boolean {
|
|
175
|
+
// This occurs if two functions of the same name are passed but they
|
|
176
|
+
// are different types (e.g. GirStaticClassFunction vs GirClassFunction)
|
|
177
|
+
return Object.getPrototypeOf(child) !== Object.getPrototypeOf(parent);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function hasParameterOrReturnTypeConflicts(
|
|
181
|
+
namespace: IntrospectedNamespace,
|
|
182
|
+
childThis: TypeIdentifier,
|
|
183
|
+
child: IntrospectedFunction | IntrospectedClassFunction | IntrospectedConstructor,
|
|
184
|
+
parentThis: TypeIdentifier,
|
|
185
|
+
parent: IntrospectedClassFunction | IntrospectedFunction | IntrospectedConstructor,
|
|
186
|
+
): boolean {
|
|
187
|
+
// Check basic parameter conflicts
|
|
188
|
+
if (child.parameters.length > parent.parameters.length) {
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Check return type conflicts
|
|
193
|
+
if (!isSubtypeOf(namespace, childThis, parentThis, child.return(), parent.return())) {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Check parameter type conflicts
|
|
198
|
+
if (
|
|
199
|
+
child.parameters.some((np, i) => !isSubtypeOf(namespace, childThis, parentThis, np.type, parent.parameters[i].type))
|
|
200
|
+
) {
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Only check output parameters if both functions have them (constructors don't have output_parameters)
|
|
205
|
+
const childHasOutputParams = "output_parameters" in child;
|
|
206
|
+
const parentHasOutputParams = "output_parameters" in parent;
|
|
207
|
+
|
|
208
|
+
if (childHasOutputParams && parentHasOutputParams) {
|
|
209
|
+
// Length mismatch
|
|
210
|
+
if (child.output_parameters.length !== parent.output_parameters.length) {
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Type mismatch
|
|
215
|
+
if (
|
|
216
|
+
child.output_parameters.some(
|
|
217
|
+
(np, i) => !isSubtypeOf(namespace, childThis, parentThis, np.type, parent.output_parameters[i].type),
|
|
218
|
+
)
|
|
219
|
+
) {
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
interface ConflictResult {
|
|
228
|
+
hasConflict: boolean;
|
|
229
|
+
shouldOmit: boolean;
|
|
230
|
+
message: string | null;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function checkFunctionConflicts<T extends IntrospectedClassFunction | IntrospectedConstructor>(
|
|
234
|
+
ns: IntrospectedNamespace,
|
|
235
|
+
base: IntrospectedBaseClass,
|
|
236
|
+
functionElement: T,
|
|
237
|
+
conflict_ids: string[],
|
|
238
|
+
nextType: TypeIdentifier,
|
|
239
|
+
): ConflictResult {
|
|
240
|
+
let message: string | null = null;
|
|
241
|
+
|
|
242
|
+
// Check explicit conflict IDs
|
|
243
|
+
if (conflict_ids.includes(functionElement.name)) {
|
|
244
|
+
return { hasConflict: true, shouldOmit: false, message };
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Check parent function conflicts
|
|
248
|
+
const hasParentConflict = base.someParent((resolved_parent) => {
|
|
249
|
+
const parentType = resolved_parent.getType();
|
|
250
|
+
return [...resolved_parent.constructors, ...resolved_parent.members].some((p) => {
|
|
251
|
+
if (p.name && p.name === functionElement.name) {
|
|
252
|
+
const conflicting = isConflictingFunction(ns, nextType, functionElement, parentType, p);
|
|
253
|
+
|
|
254
|
+
if (conflicting) {
|
|
255
|
+
message = `// Conflicted with ${resolved_parent.namespace.namespace}.${resolved_parent.name}.${p.name}`;
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
return false;
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
// Check field/property conflicts
|
|
265
|
+
const hasFieldConflicts = checkFieldPropertyConflicts(base, functionElement.name);
|
|
266
|
+
|
|
267
|
+
// Check GObject reserved methods
|
|
268
|
+
const hasGObjectConflicts = checkGObjectConflicts(base, functionElement.name);
|
|
269
|
+
|
|
270
|
+
const hasConflict = hasParentConflict || hasGObjectConflicts;
|
|
271
|
+
|
|
272
|
+
return {
|
|
273
|
+
hasConflict,
|
|
274
|
+
shouldOmit: hasFieldConflicts && !hasConflict,
|
|
275
|
+
message,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function checkFieldPropertyConflicts(base: IntrospectedBaseClass, name: string): boolean {
|
|
280
|
+
// Check if the method name conflicts with any props or fields either on
|
|
281
|
+
// the class or in the parent...
|
|
282
|
+
return (
|
|
283
|
+
[...base.props, ...base.fields].some((p) => p.name && p.name === name) ||
|
|
284
|
+
base.someParent((resolved_parent) =>
|
|
285
|
+
[...resolved_parent.props, ...resolved_parent.fields].some((p) => p.name && p.name === name),
|
|
286
|
+
)
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function checkGObjectConflicts(base: IntrospectedBaseClass, name: string): boolean {
|
|
291
|
+
const isGObject = base.someParent((p) => p.namespace.namespace === "GObject" && p.name === "Object");
|
|
292
|
+
return isGObject && (GOBJECT_RESERVED_METHODS as readonly string[]).includes(name);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function createNeverFunction<T extends IntrospectedClassFunction | IntrospectedConstructor>(
|
|
296
|
+
original: T,
|
|
297
|
+
base: IntrospectedBaseClass,
|
|
298
|
+
message: string | null,
|
|
299
|
+
):
|
|
300
|
+
| IntrospectedClassFunction
|
|
301
|
+
| IntrospectedConstructor
|
|
302
|
+
| IntrospectedStaticClassFunction
|
|
303
|
+
| IntrospectedVirtualClassFunction {
|
|
304
|
+
const neverParam = new IntrospectedFunctionParameter({
|
|
305
|
+
name: "args",
|
|
306
|
+
direction: GirDirection.In,
|
|
307
|
+
isVarArgs: true,
|
|
308
|
+
type: new ArrayType(NeverType),
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
const neverOptions = {
|
|
312
|
+
name: original.name,
|
|
313
|
+
parent: base,
|
|
314
|
+
parameters: [neverParam],
|
|
315
|
+
return_type: AnyType,
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
let neverFunction:
|
|
319
|
+
| IntrospectedClassFunction
|
|
320
|
+
| IntrospectedConstructor
|
|
321
|
+
| IntrospectedStaticClassFunction
|
|
322
|
+
| IntrospectedVirtualClassFunction;
|
|
323
|
+
|
|
324
|
+
if (original instanceof IntrospectedConstructor) {
|
|
325
|
+
neverFunction = new IntrospectedConstructor(neverOptions);
|
|
326
|
+
} else if (original instanceof IntrospectedStaticClassFunction) {
|
|
327
|
+
neverFunction = new IntrospectedStaticClassFunction({ ...neverOptions, parent: original.parent });
|
|
328
|
+
} else if (original instanceof IntrospectedVirtualClassFunction && original.parent instanceof IntrospectedClass) {
|
|
329
|
+
neverFunction = new IntrospectedVirtualClassFunction({ ...neverOptions, parent: original.parent });
|
|
330
|
+
} else if (original instanceof IntrospectedClassFunction) {
|
|
331
|
+
neverFunction = new IntrospectedClassFunction({ ...neverOptions, parent: original.parent });
|
|
332
|
+
} else {
|
|
333
|
+
const parent = Object.getPrototypeOf(original as (...args: unknown[]) => unknown) as
|
|
334
|
+
| ((...args: unknown[]) => unknown)
|
|
335
|
+
| null
|
|
336
|
+
| undefined;
|
|
337
|
+
throw new Error(`Unknown function type ${parent?.name} encountered.`);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
if (message) {
|
|
341
|
+
neverFunction.setWarning(message);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
return neverFunction;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function detectConflictType<T extends IntrospectedClassMember | IntrospectedClassFunction | IntrospectedProperty>(
|
|
348
|
+
ns: IntrospectedNamespace,
|
|
349
|
+
c: IntrospectedBaseClass,
|
|
350
|
+
element: T,
|
|
351
|
+
thisType: TypeIdentifier,
|
|
352
|
+
): ConflictType | undefined {
|
|
353
|
+
// Check field conflicts first
|
|
354
|
+
const fieldConflict = checkFieldConflicts(c, element);
|
|
355
|
+
if (fieldConflict) return fieldConflict;
|
|
356
|
+
|
|
357
|
+
// Check property conflicts
|
|
358
|
+
const propertyConflict = checkPropertyConflicts(ns, c, element, thisType);
|
|
359
|
+
if (propertyConflict) return propertyConflict;
|
|
360
|
+
|
|
361
|
+
// Check virtual function signature conflicts (for interfaces)
|
|
362
|
+
if (element instanceof IntrospectedVirtualClassFunction) {
|
|
363
|
+
const vfuncConflict = checkVfuncSignatureConflicts(ns, c, element, thisType);
|
|
364
|
+
if (vfuncConflict) return vfuncConflict;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// Check function conflicts
|
|
368
|
+
return checkFunctionNameConflicts(ns, c, element, thisType);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
function checkFieldConflicts<T extends IntrospectedClassMember | IntrospectedClassFunction | IntrospectedProperty>(
|
|
372
|
+
c: IntrospectedBaseClass,
|
|
373
|
+
element: T,
|
|
374
|
+
): ConflictType | undefined {
|
|
375
|
+
return c.findParentMap((resolved_parent) => {
|
|
376
|
+
return findMap([...resolved_parent.fields], (p) => {
|
|
377
|
+
if (p.name && p.name === element.name) {
|
|
378
|
+
if (element instanceof IntrospectedProperty) {
|
|
379
|
+
return ConflictType.ACCESSOR_PROPERTY_CONFLICT;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
if (
|
|
383
|
+
element instanceof IntrospectedField &&
|
|
384
|
+
!isSubtypeOf(c.namespace, c.getType(), resolved_parent.getType(), element.type, p.type)
|
|
385
|
+
) {
|
|
386
|
+
return ConflictType.FIELD_NAME_CONFLICT;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
return undefined;
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
function checkPropertyConflicts<T extends IntrospectedClassMember | IntrospectedClassFunction | IntrospectedProperty>(
|
|
396
|
+
ns: IntrospectedNamespace,
|
|
397
|
+
c: IntrospectedBaseClass,
|
|
398
|
+
element: T,
|
|
399
|
+
thisType: TypeIdentifier,
|
|
400
|
+
): ConflictType | undefined {
|
|
401
|
+
return c.findParentMap((resolved_parent) => {
|
|
402
|
+
return findMap([...resolved_parent.props], (p) => {
|
|
403
|
+
if (p.name && p.name === element.name) {
|
|
404
|
+
// Classes can override parent interface accessors with properties _but_
|
|
405
|
+
// classes cannot override parent class accessors with properties without an error occurring.
|
|
406
|
+
if (p.parent instanceof IntrospectedClass && element instanceof IntrospectedField) {
|
|
407
|
+
return ConflictType.PROPERTY_ACCESSOR_CONFLICT;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
if (
|
|
411
|
+
element instanceof IntrospectedProperty &&
|
|
412
|
+
!isSubtypeOf(ns, thisType, resolved_parent.getType(), element.type, p.type)
|
|
413
|
+
) {
|
|
414
|
+
getLog().reportTypeConflict(
|
|
415
|
+
"general",
|
|
416
|
+
element.name,
|
|
417
|
+
element.parent?.namespace.namespace || "unknown",
|
|
418
|
+
`Conflict with ${p.parent?.name}.${p.name}`,
|
|
419
|
+
);
|
|
420
|
+
return ConflictType.PROPERTY_NAME_CONFLICT;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
return undefined;
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
function checkFunctionNameConflicts<
|
|
430
|
+
T extends IntrospectedClassMember | IntrospectedClassFunction | IntrospectedProperty,
|
|
431
|
+
>(ns: IntrospectedNamespace, c: IntrospectedBaseClass, element: T, thisType: TypeIdentifier): ConflictType | undefined {
|
|
432
|
+
return c.findParentMap((resolved_parent) =>
|
|
433
|
+
findMap([...resolved_parent.constructors, ...resolved_parent.members], (p) => {
|
|
434
|
+
if (p.name && p.name === element.name) {
|
|
435
|
+
if (element instanceof IntrospectedProperty) {
|
|
436
|
+
// Properties that conflict with parent functions should be treated as FUNCTION_NAME_CONFLICT
|
|
437
|
+
return ConflictType.FUNCTION_NAME_CONFLICT;
|
|
438
|
+
}
|
|
439
|
+
if (
|
|
440
|
+
!(element instanceof IntrospectedClassFunction) ||
|
|
441
|
+
isConflictingFunction(ns, thisType, element, resolved_parent.getType(), p)
|
|
442
|
+
) {
|
|
443
|
+
return ConflictType.FUNCTION_NAME_CONFLICT;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
return undefined;
|
|
448
|
+
}),
|
|
449
|
+
);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
function checkVfuncSignatureConflicts(
|
|
453
|
+
ns: IntrospectedNamespace,
|
|
454
|
+
c: IntrospectedBaseClass,
|
|
455
|
+
element: IntrospectedVirtualClassFunction,
|
|
456
|
+
thisType: TypeIdentifier,
|
|
457
|
+
): ConflictType | undefined {
|
|
458
|
+
// Only check for vfunc conflicts on interfaces
|
|
459
|
+
if (!(c instanceof IntrospectedInterface)) {
|
|
460
|
+
return undefined;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// Check if this virtual method conflicts with parent class or interface methods
|
|
464
|
+
return c.findParentMap((resolved_parent) => {
|
|
465
|
+
// Look for virtual methods with the same name in parent classes/interfaces
|
|
466
|
+
const parentVirtualMethods = resolved_parent.members.filter(
|
|
467
|
+
(m) => m instanceof IntrospectedVirtualClassFunction && m.name === element.name,
|
|
468
|
+
);
|
|
469
|
+
|
|
470
|
+
for (const parentMethod of parentVirtualMethods) {
|
|
471
|
+
// Check if signatures conflict
|
|
472
|
+
if (isConflictingFunction(ns, thisType, element, resolved_parent.getType(), parentMethod)) {
|
|
473
|
+
return ConflictType.VFUNC_SIGNATURE_CONFLICT;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// Also check if the parent is an interface that might have virtual methods from its Interface namespace
|
|
478
|
+
// This is important for cases like List extends Collection where both have vfunc_get_read_only_view
|
|
479
|
+
if (resolved_parent instanceof IntrospectedInterface) {
|
|
480
|
+
// Get the virtual methods from the parent interface
|
|
481
|
+
const parentInterfaceVirtualMethods = resolved_parent.members.filter(
|
|
482
|
+
(m) => m instanceof IntrospectedVirtualClassFunction && m.name === element.name,
|
|
483
|
+
);
|
|
484
|
+
|
|
485
|
+
for (const parentMethod of parentInterfaceVirtualMethods) {
|
|
486
|
+
// Check if signatures conflict between the interfaces
|
|
487
|
+
if (isConflictingFunction(ns, thisType, element, resolved_parent.getType(), parentMethod)) {
|
|
488
|
+
return ConflictType.VFUNC_SIGNATURE_CONFLICT;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
return undefined;
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
function createConflictElement<T extends IntrospectedClassMember | IntrospectedClassFunction | IntrospectedProperty>(
|
|
498
|
+
element: T,
|
|
499
|
+
conflictType: ConflictType,
|
|
500
|
+
): T | null {
|
|
501
|
+
if (element instanceof IntrospectedField || element instanceof IntrospectedProperty) {
|
|
502
|
+
return element.copy({
|
|
503
|
+
type: new TypeConflict(element.type, conflictType),
|
|
504
|
+
}) as T;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// For VFUNC_SIGNATURE_CONFLICT, we'll handle it differently in the generator
|
|
508
|
+
// Just mark the element so the generator knows to create overloads
|
|
509
|
+
if (conflictType === ConflictType.VFUNC_SIGNATURE_CONFLICT && element instanceof IntrospectedVirtualClassFunction) {
|
|
510
|
+
// Return the element with a marker that will be handled in the generator
|
|
511
|
+
// We don't use TypeConflict here as that causes resolution errors
|
|
512
|
+
return element;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
return null;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* Check if an interface has virtual methods that conflict with parent class or interface methods.
|
|
520
|
+
* This is used to determine whether to inherit from Interface namespace or generate method overloads.
|
|
521
|
+
*/
|
|
522
|
+
export function hasVfuncSignatureConflicts(ns: IntrospectedNamespace, interfaceClass: IntrospectedInterface): boolean {
|
|
523
|
+
const thisType = interfaceClass.getType();
|
|
524
|
+
const virtualMethods = interfaceClass.members.filter(
|
|
525
|
+
(m) => m instanceof IntrospectedVirtualClassFunction,
|
|
526
|
+
) as IntrospectedVirtualClassFunction[];
|
|
527
|
+
|
|
528
|
+
// If we don't have any virtual methods, no conflicts possible
|
|
529
|
+
if (virtualMethods.length === 0) {
|
|
530
|
+
return false;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// Check each virtual method for conflicts with parent classes/interfaces
|
|
534
|
+
for (const vmethod of virtualMethods) {
|
|
535
|
+
const conflictType = checkVfuncSignatureConflicts(ns, interfaceClass, vmethod, thisType);
|
|
536
|
+
if (conflictType === ConflictType.VFUNC_SIGNATURE_CONFLICT) {
|
|
537
|
+
return true;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Check if any parent interface already inherits from its own .Interface namespace
|
|
542
|
+
// If it does, and we have virtual methods with the same name but different signatures,
|
|
543
|
+
// we have a conflict (e.g., List extends Collection, List.Interface and BidirList extends List, BidirList.Interface)
|
|
544
|
+
const hasParentWithVirtualMethods = interfaceClass.someParent((parent) => {
|
|
545
|
+
// Only check parent interfaces (not classes)
|
|
546
|
+
if (!(parent instanceof IntrospectedInterface)) {
|
|
547
|
+
return false;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// Check if the parent interface has virtual methods (which means it probably inherits from its .Interface namespace)
|
|
551
|
+
const parentHasVirtualMethods = parent.members.some((m) => m instanceof IntrospectedVirtualClassFunction);
|
|
552
|
+
|
|
553
|
+
if (!parentHasVirtualMethods) {
|
|
554
|
+
return false; // Parent has no virtual methods, no conflict
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
// Check if any of our virtual methods have the same name as parent's virtual methods
|
|
558
|
+
// but with different signatures (especially return types)
|
|
559
|
+
for (const vmethod of virtualMethods) {
|
|
560
|
+
// Find virtual methods with the same name in the parent
|
|
561
|
+
const parentVirtualMethods = parent.members.filter(
|
|
562
|
+
(m) => m instanceof IntrospectedVirtualClassFunction && m.name === vmethod.name,
|
|
563
|
+
) as IntrospectedVirtualClassFunction[];
|
|
564
|
+
|
|
565
|
+
for (const parentMethod of parentVirtualMethods) {
|
|
566
|
+
// For interfaces, even if the return type is a subtype, TypeScript won't allow
|
|
567
|
+
// multiple inheritance from interfaces with the same method but different return types
|
|
568
|
+
// So we need to check if there's any difference in signatures
|
|
569
|
+
// Note: We can't just use isConflictingFunction because it allows subtype relationships
|
|
570
|
+
// but TypeScript doesn't allow that for interface multiple inheritance
|
|
571
|
+
|
|
572
|
+
// Check if return types are different (even if one is a subtype of the other)
|
|
573
|
+
const ourReturn = vmethod.return();
|
|
574
|
+
const parentReturn = parentMethod.return();
|
|
575
|
+
|
|
576
|
+
// Check if return types are not exactly the same
|
|
577
|
+
// For interface inheritance, even subtype relationships cause conflicts
|
|
578
|
+
if (!ourReturn.equals(parentReturn)) {
|
|
579
|
+
return true; // Different return types = conflict
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// Also check parameters using the existing conflict detection
|
|
583
|
+
if (isConflictingFunction(ns, thisType, vmethod, parent.getType(), parentMethod)) {
|
|
584
|
+
return true;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
return false;
|
|
590
|
+
});
|
|
591
|
+
|
|
592
|
+
return hasParentWithVirtualMethods;
|
|
593
|
+
}
|