@tsonic/frontend 0.0.62 → 0.0.63
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/dist/.tsbuildinfo +1 -1
- package/dist/dependency-graph.d.ts +1 -1
- package/dist/dependency-graph.d.ts.map +1 -1
- package/dist/dependency-graph.js +1 -1
- package/dist/dependency-graph.js.map +1 -1
- package/dist/dotnet-metadata.d.ts +0 -12
- package/dist/dotnet-metadata.d.ts.map +1 -1
- package/dist/dotnet-metadata.js +0 -24
- package/dist/dotnet-metadata.js.map +1 -1
- package/dist/generic-function-values.d.ts +11 -0
- package/dist/generic-function-values.d.ts.map +1 -0
- package/dist/generic-function-values.js +243 -0
- package/dist/generic-function-values.js.map +1 -0
- package/dist/generic-function-values.test.d.ts +2 -0
- package/dist/generic-function-values.test.d.ts.map +1 -0
- package/dist/generic-function-values.test.js +256 -0
- package/dist/generic-function-values.test.js.map +1 -0
- package/dist/graph/extraction/imports.d.ts +5 -0
- package/dist/graph/extraction/imports.d.ts.map +1 -1
- package/dist/graph/extraction/imports.js +30 -0
- package/dist/graph/extraction/imports.js.map +1 -1
- package/dist/graph/extraction/index.d.ts +1 -1
- package/dist/graph/extraction/index.d.ts.map +1 -1
- package/dist/graph/extraction/index.js +1 -1
- package/dist/graph/extraction/index.js.map +1 -1
- package/dist/graph/extraction/orchestrator.d.ts.map +1 -1
- package/dist/graph/extraction/orchestrator.js +16 -2
- package/dist/graph/extraction/orchestrator.js.map +1 -1
- package/dist/graph/extraction.d.ts +1 -1
- package/dist/graph/extraction.d.ts.map +1 -1
- package/dist/graph/extraction.js +1 -1
- package/dist/graph/extraction.js.map +1 -1
- package/dist/ir/binding/binding-factory.d.ts +17 -0
- package/dist/ir/binding/binding-factory.d.ts.map +1 -0
- package/dist/ir/binding/binding-factory.js +765 -0
- package/dist/ir/binding/binding-factory.js.map +1 -0
- package/dist/ir/binding/binding-helpers.d.ts +90 -0
- package/dist/ir/binding/binding-helpers.d.ts.map +1 -0
- package/dist/ir/binding/binding-helpers.js +387 -0
- package/dist/ir/binding/binding-helpers.js.map +1 -0
- package/dist/ir/binding/binding-types.d.ts +203 -0
- package/dist/ir/binding/binding-types.d.ts.map +1 -0
- package/dist/ir/binding/binding-types.js +9 -0
- package/dist/ir/binding/binding-types.js.map +1 -0
- package/dist/ir/binding/index.d.ts +4 -158
- package/dist/ir/binding/index.d.ts.map +1 -1
- package/dist/ir/binding/index.js +3 -1134
- package/dist/ir/binding/index.js.map +1 -1
- package/dist/ir/builder.test.js +223 -0
- package/dist/ir/builder.test.js.map +1 -1
- package/dist/ir/converters/anonymous-synthesis.d.ts +3 -3
- package/dist/ir/converters/anonymous-synthesis.d.ts.map +1 -1
- package/dist/ir/converters/anonymous-synthesis.js +45 -8
- package/dist/ir/converters/anonymous-synthesis.js.map +1 -1
- package/dist/ir/converters/expressions/access/access-converter.d.ts +14 -0
- package/dist/ir/converters/expressions/access/access-converter.d.ts.map +1 -0
- package/dist/ir/converters/expressions/access/access-converter.js +141 -0
- package/dist/ir/converters/expressions/access/access-converter.js.map +1 -0
- package/dist/ir/converters/expressions/access/binding-resolution.d.ts +35 -0
- package/dist/ir/converters/expressions/access/binding-resolution.d.ts.map +1 -0
- package/dist/ir/converters/expressions/access/binding-resolution.js +384 -0
- package/dist/ir/converters/expressions/access/binding-resolution.js.map +1 -0
- package/dist/ir/converters/expressions/access/member-resolution.d.ts +67 -0
- package/dist/ir/converters/expressions/access/member-resolution.d.ts.map +1 -0
- package/dist/ir/converters/expressions/access/member-resolution.js +262 -0
- package/dist/ir/converters/expressions/access/member-resolution.js.map +1 -0
- package/dist/ir/converters/expressions/access.d.ts +1 -7
- package/dist/ir/converters/expressions/access.d.ts.map +1 -1
- package/dist/ir/converters/expressions/access.js +1 -720
- package/dist/ir/converters/expressions/access.js.map +1 -1
- package/dist/ir/converters/expressions/calls/call-converter.d.ts +23 -0
- package/dist/ir/converters/expressions/calls/call-converter.d.ts.map +1 -0
- package/dist/ir/converters/expressions/calls/call-converter.js +526 -0
- package/dist/ir/converters/expressions/calls/call-converter.js.map +1 -0
- package/dist/ir/converters/expressions/calls/call-site-analysis.d.ts +53 -0
- package/dist/ir/converters/expressions/calls/call-site-analysis.d.ts.map +1 -0
- package/dist/ir/converters/expressions/calls/call-site-analysis.js +554 -0
- package/dist/ir/converters/expressions/calls/call-site-analysis.js.map +1 -0
- package/dist/ir/converters/expressions/calls/new-converter.d.ts +21 -0
- package/dist/ir/converters/expressions/calls/new-converter.d.ts.map +1 -0
- package/dist/ir/converters/expressions/calls/new-converter.js +182 -0
- package/dist/ir/converters/expressions/calls/new-converter.js.map +1 -0
- package/dist/ir/converters/expressions/calls.d.ts +2 -28
- package/dist/ir/converters/expressions/calls.d.ts.map +1 -1
- package/dist/ir/converters/expressions/calls.js +2 -1344
- package/dist/ir/converters/expressions/calls.js.map +1 -1
- package/dist/ir/converters/expressions/collections.d.ts.map +1 -1
- package/dist/ir/converters/expressions/collections.js +37 -6
- package/dist/ir/converters/expressions/collections.js.map +1 -1
- package/dist/ir/converters/expressions/functions.js +1 -1
- package/dist/ir/converters/expressions/functions.js.map +1 -1
- package/dist/ir/converters/expressions/helpers.d.ts.map +1 -1
- package/dist/ir/converters/expressions/helpers.js +1 -0
- package/dist/ir/converters/expressions/helpers.js.map +1 -1
- package/dist/ir/converters/expressions/other.d.ts.map +1 -1
- package/dist/ir/converters/expressions/other.js +3 -2
- package/dist/ir/converters/expressions/other.js.map +1 -1
- package/dist/ir/converters/flow-narrowing.d.ts.map +1 -1
- package/dist/ir/converters/flow-narrowing.js +3 -2
- package/dist/ir/converters/flow-narrowing.js.map +1 -1
- package/dist/ir/converters/statements/declarations/classes/methods.js +1 -1
- package/dist/ir/converters/statements/declarations/classes/methods.js.map +1 -1
- package/dist/ir/converters/statements/declarations/type-aliases.js +1 -1
- package/dist/ir/converters/statements/declarations/type-aliases.js.map +1 -1
- package/dist/ir/converters/statements/declarations/variables.d.ts +2 -2
- package/dist/ir/converters/statements/declarations/variables.d.ts.map +1 -1
- package/dist/ir/converters/statements/declarations/variables.js +289 -2
- package/dist/ir/converters/statements/declarations/variables.js.map +1 -1
- package/dist/ir/expression-converter.d.ts +0 -1
- package/dist/ir/expression-converter.d.ts.map +1 -1
- package/dist/ir/expression-converter.js +0 -2
- package/dist/ir/expression-converter.js.map +1 -1
- package/dist/ir/generic-function-value-lowering.test.d.ts +2 -0
- package/dist/ir/generic-function-value-lowering.test.d.ts.map +1 -0
- package/dist/ir/generic-function-value-lowering.test.js +312 -0
- package/dist/ir/generic-function-value-lowering.test.js.map +1 -0
- package/dist/ir/generic-validator.d.ts +3 -4
- package/dist/ir/generic-validator.d.ts.map +1 -1
- package/dist/ir/generic-validator.js +3 -35
- package/dist/ir/generic-validator.js.map +1 -1
- package/dist/ir/program-context.d.ts +7 -0
- package/dist/ir/program-context.d.ts.map +1 -1
- package/dist/ir/program-context.js +1 -0
- package/dist/ir/program-context.js.map +1 -1
- package/dist/ir/statement-converter.d.ts +0 -2
- package/dist/ir/statement-converter.d.ts.map +1 -1
- package/dist/ir/statement-converter.js +0 -3
- package/dist/ir/statement-converter.js.map +1 -1
- package/dist/ir/type-system/internal/handle-types.d.ts +16 -16
- package/dist/ir/type-system/internal/handle-types.d.ts.map +1 -1
- package/dist/ir/type-system/internal/nominal-env.d.ts +0 -2
- package/dist/ir/type-system/internal/nominal-env.d.ts.map +1 -1
- package/dist/ir/type-system/internal/nominal-env.js +2 -6
- package/dist/ir/type-system/internal/nominal-env.js.map +1 -1
- package/dist/ir/type-system/internal/type-converter/converter.d.ts +3 -1
- package/dist/ir/type-system/internal/type-converter/converter.d.ts.map +1 -1
- package/dist/ir/type-system/internal/type-converter/converter.js +3 -1
- package/dist/ir/type-system/internal/type-converter/converter.js.map +1 -1
- package/dist/ir/type-system/internal/type-converter/objects.js +7 -1
- package/dist/ir/type-system/internal/type-converter/objects.js.map +1 -1
- package/dist/ir/type-system/internal/type-converter/orchestrator.d.ts +0 -2
- package/dist/ir/type-system/internal/type-converter/orchestrator.d.ts.map +1 -1
- package/dist/ir/type-system/internal/type-converter/orchestrator.js +315 -23
- package/dist/ir/type-system/internal/type-converter/orchestrator.js.map +1 -1
- package/dist/ir/type-system/internal/type-converter/orchestrator.test.d.ts +2 -0
- package/dist/ir/type-system/internal/type-converter/orchestrator.test.d.ts.map +1 -0
- package/dist/ir/type-system/internal/type-converter/orchestrator.test.js +265 -0
- package/dist/ir/type-system/internal/type-converter/orchestrator.test.js.map +1 -0
- package/dist/ir/type-system/internal/type-converter/primitives.d.ts.map +1 -1
- package/dist/ir/type-system/internal/type-converter/primitives.js +5 -0
- package/dist/ir/type-system/internal/type-converter/primitives.js.map +1 -1
- package/dist/ir/type-system/internal/type-converter/references.d.ts.map +1 -1
- package/dist/ir/type-system/internal/type-converter/references.js +67 -29
- package/dist/ir/type-system/internal/type-converter/references.js.map +1 -1
- package/dist/ir/type-system/internal/type-converter/utility-types.d.ts.map +1 -1
- package/dist/ir/type-system/internal/type-converter/utility-types.js +145 -0
- package/dist/ir/type-system/internal/type-converter/utility-types.js.map +1 -1
- package/dist/ir/type-system/internal/type-converter/utility-types.test.js +91 -1
- package/dist/ir/type-system/internal/type-converter/utility-types.test.js.map +1 -1
- package/dist/ir/type-system/internal/type-registry.d.ts +1 -1
- package/dist/ir/type-system/internal/type-registry.js +7 -7
- package/dist/ir/type-system/internal/type-registry.js.map +1 -1
- package/dist/ir/type-system/internal/universe/alias-table.d.ts +0 -14
- package/dist/ir/type-system/internal/universe/alias-table.d.ts.map +1 -1
- package/dist/ir/type-system/internal/universe/alias-table.js +0 -17
- package/dist/ir/type-system/internal/universe/alias-table.js.map +1 -1
- package/dist/ir/type-system/internal/universe/clr-catalog.d.ts +3 -0
- package/dist/ir/type-system/internal/universe/clr-catalog.d.ts.map +1 -1
- package/dist/ir/type-system/internal/universe/clr-catalog.js +4 -1044
- package/dist/ir/type-system/internal/universe/clr-catalog.js.map +1 -1
- package/dist/ir/type-system/internal/universe/clr-entry-converter.d.ts +51 -0
- package/dist/ir/type-system/internal/universe/clr-entry-converter.d.ts.map +1 -0
- package/dist/ir/type-system/internal/universe/clr-entry-converter.js +657 -0
- package/dist/ir/type-system/internal/universe/clr-entry-converter.js.map +1 -0
- package/dist/ir/type-system/internal/universe/clr-type-parser.d.ts +52 -0
- package/dist/ir/type-system/internal/universe/clr-type-parser.d.ts.map +1 -0
- package/dist/ir/type-system/internal/universe/clr-type-parser.js +415 -0
- package/dist/ir/type-system/internal/universe/clr-type-parser.js.map +1 -0
- package/dist/ir/type-system/internal/universe/index.d.ts +1 -1
- package/dist/ir/type-system/internal/universe/index.d.ts.map +1 -1
- package/dist/ir/type-system/internal/universe/index.js +1 -3
- package/dist/ir/type-system/internal/universe/index.js.map +1 -1
- package/dist/ir/type-system/internal/universe/unified-universe.test.js +2 -0
- package/dist/ir/type-system/internal/universe/unified-universe.test.js.map +1 -1
- package/dist/ir/type-system/type-system-call-resolution.d.ts +69 -0
- package/dist/ir/type-system/type-system-call-resolution.d.ts.map +1 -0
- package/dist/ir/type-system/type-system-call-resolution.js +1121 -0
- package/dist/ir/type-system/type-system-call-resolution.js.map +1 -0
- package/dist/ir/type-system/type-system-inference.d.ts +98 -0
- package/dist/ir/type-system/type-system-inference.d.ts.map +1 -0
- package/dist/ir/type-system/type-system-inference.js +1083 -0
- package/dist/ir/type-system/type-system-inference.js.map +1 -0
- package/dist/ir/type-system/type-system-relations.d.ts +15 -0
- package/dist/ir/type-system/type-system-relations.d.ts.map +1 -0
- package/dist/ir/type-system/type-system-relations.js +152 -0
- package/dist/ir/type-system/type-system-relations.js.map +1 -0
- package/dist/ir/type-system/type-system-state.d.ts +436 -0
- package/dist/ir/type-system/type-system-state.d.ts.map +1 -0
- package/dist/ir/type-system/type-system-state.js +212 -0
- package/dist/ir/type-system/type-system-state.js.map +1 -0
- package/dist/ir/type-system/type-system-utilities.d.ts +56 -0
- package/dist/ir/type-system/type-system-utilities.d.ts.map +1 -0
- package/dist/ir/type-system/type-system-utilities.js +373 -0
- package/dist/ir/type-system/type-system-utilities.js.map +1 -0
- package/dist/ir/type-system/type-system.d.ts +17 -358
- package/dist/ir/type-system/type-system.d.ts.map +1 -1
- package/dist/ir/type-system/type-system.js +67 -2945
- package/dist/ir/type-system/type-system.js.map +1 -1
- package/dist/ir/types/index.d.ts +1 -0
- package/dist/ir/types/index.d.ts.map +1 -1
- package/dist/ir/types/index.js +1 -0
- package/dist/ir/types/index.js.map +1 -1
- package/dist/ir/types/ir-substitution.js +1 -1
- package/dist/ir/types/ir-substitution.js.map +1 -1
- package/dist/ir/types/statements.d.ts +1 -1
- package/dist/ir/types/type-ops.d.ts +9 -0
- package/dist/ir/types/type-ops.d.ts.map +1 -0
- package/dist/ir/types/type-ops.js +134 -0
- package/dist/ir/types/type-ops.js.map +1 -0
- package/dist/ir/types/type-ops.test.d.ts +2 -0
- package/dist/ir/types/type-ops.test.d.ts.map +1 -0
- package/dist/ir/types/type-ops.test.js +73 -0
- package/dist/ir/types/type-ops.test.js.map +1 -0
- package/dist/ir/validation/attribute-collection/arg-extractor.d.ts +58 -0
- package/dist/ir/validation/attribute-collection/arg-extractor.d.ts.map +1 -0
- package/dist/ir/validation/attribute-collection/arg-extractor.js +284 -0
- package/dist/ir/validation/attribute-collection/arg-extractor.js.map +1 -0
- package/dist/ir/validation/attribute-collection/marker-parser.d.ts +28 -0
- package/dist/ir/validation/attribute-collection/marker-parser.d.ts.map +1 -0
- package/dist/ir/validation/attribute-collection/marker-parser.js +404 -0
- package/dist/ir/validation/attribute-collection/marker-parser.js.map +1 -0
- package/dist/ir/validation/attribute-collection/orchestrator.d.ts +28 -0
- package/dist/ir/validation/attribute-collection/orchestrator.d.ts.map +1 -0
- package/dist/ir/validation/attribute-collection/orchestrator.js +332 -0
- package/dist/ir/validation/attribute-collection/orchestrator.js.map +1 -0
- package/dist/ir/validation/attribute-collection-pass.d.ts +1 -23
- package/dist/ir/validation/attribute-collection-pass.d.ts.map +1 -1
- package/dist/ir/validation/attribute-collection-pass.js +1 -961
- package/dist/ir/validation/attribute-collection-pass.js.map +1 -1
- package/dist/ir/validation/attribute-collection-pass.test.js +12 -6
- package/dist/ir/validation/attribute-collection-pass.test.js.map +1 -1
- package/dist/ir/validation/soundness-gate.d.ts.map +1 -1
- package/dist/ir/validation/soundness-gate.js +2 -1
- package/dist/ir/validation/soundness-gate.js.map +1 -1
- package/dist/ir/validation/soundness-gate.test.js +69 -0
- package/dist/ir/validation/soundness-gate.test.js.map +1 -1
- package/dist/ir/validation/yield-lowering-pass.d.ts +11 -5
- package/dist/ir/validation/yield-lowering-pass.d.ts.map +1 -1
- package/dist/ir/validation/yield-lowering-pass.js +942 -48
- package/dist/ir/validation/yield-lowering-pass.js.map +1 -1
- package/dist/ir/validation/yield-lowering-pass.test.js +1333 -127
- package/dist/ir/validation/yield-lowering-pass.test.js.map +1 -1
- package/dist/program/binding-loader.d.ts +37 -0
- package/dist/program/binding-loader.d.ts.map +1 -0
- package/dist/program/binding-loader.js +155 -0
- package/dist/program/binding-loader.js.map +1 -0
- package/dist/program/binding-registry.d.ts +106 -0
- package/dist/program/binding-registry.d.ts.map +1 -0
- package/dist/program/binding-registry.js +590 -0
- package/dist/program/binding-registry.js.map +1 -0
- package/dist/program/binding-types.d.ts +166 -0
- package/dist/program/binding-types.d.ts.map +1 -0
- package/dist/program/binding-types.js +57 -0
- package/dist/program/binding-types.js.map +1 -0
- package/dist/program/bindings.d.ts +6 -271
- package/dist/program/bindings.d.ts.map +1 -1
- package/dist/program/bindings.js +7 -781
- package/dist/program/bindings.js.map +1 -1
- package/dist/resolver/clr-bindings-resolver.d.ts +0 -1
- package/dist/resolver/clr-bindings-resolver.d.ts.map +1 -1
- package/dist/resolver/clr-bindings-resolver.js +22 -32
- package/dist/resolver/clr-bindings-resolver.js.map +1 -1
- package/dist/resolver/clr-bindings-resolver.test.js +0 -27
- package/dist/resolver/clr-bindings-resolver.test.js.map +1 -1
- package/dist/resolver/import-resolution.d.ts +1 -1
- package/dist/resolver/import-resolution.d.ts.map +1 -1
- package/dist/resolver/import-resolution.js +2 -7
- package/dist/resolver/import-resolution.js.map +1 -1
- package/dist/resolver/naming.d.ts.map +1 -1
- package/dist/resolver/naming.js +1 -0
- package/dist/resolver/naming.js.map +1 -1
- package/dist/types/diagnostic.d.ts +1 -1
- package/dist/types/diagnostic.d.ts.map +1 -1
- package/dist/types/diagnostic.js.map +1 -1
- package/dist/validation/features.d.ts.map +1 -1
- package/dist/validation/features.js +38 -13
- package/dist/validation/features.js.map +1 -1
- package/dist/validation/features.test.d.ts +2 -0
- package/dist/validation/features.test.d.ts.map +1 -0
- package/dist/validation/features.test.js +273 -0
- package/dist/validation/features.test.js.map +1 -0
- package/dist/validation/generics.d.ts +1 -1
- package/dist/validation/generics.d.ts.map +1 -1
- package/dist/validation/generics.js +2 -26
- package/dist/validation/generics.js.map +1 -1
- package/dist/validation/imports.d.ts.map +1 -1
- package/dist/validation/imports.js +2 -1
- package/dist/validation/imports.js.map +1 -1
- package/dist/validation/imports.test.d.ts +2 -0
- package/dist/validation/imports.test.d.ts.map +1 -0
- package/dist/validation/imports.test.js +112 -0
- package/dist/validation/imports.test.js.map +1 -0
- package/dist/validation/static-safety.d.ts +6 -6
- package/dist/validation/static-safety.d.ts.map +1 -1
- package/dist/validation/static-safety.js +163 -109
- package/dist/validation/static-safety.js.map +1 -1
- package/dist/validation/unsupported-utility-types.d.ts +3 -3
- package/dist/validation/unsupported-utility-types.d.ts.map +1 -1
- package/dist/validation/unsupported-utility-types.js +4 -7
- package/dist/validation/unsupported-utility-types.js.map +1 -1
- package/dist/validator.maximus.test.d.ts +2 -0
- package/dist/validator.maximus.test.d.ts.map +1 -0
- package/dist/validator.maximus.test.js +1214 -0
- package/dist/validator.maximus.test.js.map +1 -0
- package/dist/validator.test.js +152 -18
- package/dist/validator.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/ir/converters/statements/declarations/registry.d.ts +0 -96
- package/dist/ir/converters/statements/declarations/registry.d.ts.map +0 -1
- package/dist/ir/converters/statements/declarations/registry.js +0 -130
- package/dist/ir/converters/statements/declarations/registry.js.map +0 -1
- package/dist/ir/this-parameter-inference.test.d.ts +0 -13
- package/dist/ir/this-parameter-inference.test.d.ts.map +0 -1
- package/dist/ir/this-parameter-inference.test.js +0 -165
- package/dist/ir/this-parameter-inference.test.js.map +0 -1
- package/dist/metadata/bindings-loader.d.ts +0 -41
- package/dist/metadata/bindings-loader.d.ts.map +0 -1
- package/dist/metadata/bindings-loader.js +0 -308
- package/dist/metadata/bindings-loader.js.map +0 -1
- package/dist/metadata/bindings-loader.test.d.ts +0 -5
- package/dist/metadata/bindings-loader.test.d.ts.map +0 -1
- package/dist/metadata/bindings-loader.test.js +0 -117
- package/dist/metadata/bindings-loader.test.js.map +0 -1
- package/dist/metadata/index.d.ts +0 -8
- package/dist/metadata/index.d.ts.map +0 -1
- package/dist/metadata/index.js +0 -7
- package/dist/metadata/index.js.map +0 -1
- package/dist/metadata/library-loader.d.ts +0 -42
- package/dist/metadata/library-loader.d.ts.map +0 -1
- package/dist/metadata/library-loader.js +0 -126
- package/dist/metadata/library-loader.js.map +0 -1
- package/dist/metadata/loader.d.ts +0 -26
- package/dist/metadata/loader.d.ts.map +0 -1
- package/dist/metadata/loader.js +0 -333
- package/dist/metadata/loader.js.map +0 -1
- package/dist/metadata/loader.test.d.ts +0 -5
- package/dist/metadata/loader.test.d.ts.map +0 -1
- package/dist/metadata/loader.test.js +0 -119
- package/dist/metadata/loader.test.js.map +0 -1
- package/dist/resolver/naming-policy.d.ts +0 -20
- package/dist/resolver/naming-policy.d.ts.map +0 -1
- package/dist/resolver/naming-policy.js +0 -40
- package/dist/resolver/naming-policy.js.map +0 -1
- package/dist/types/bindings.d.ts +0 -153
- package/dist/types/bindings.d.ts.map +0 -1
- package/dist/types/bindings.js +0 -14
- package/dist/types/bindings.js.map +0 -1
- package/dist/types/metadata.d.ts +0 -196
- package/dist/types/metadata.d.ts.map +0 -1
- package/dist/types/metadata.js +0 -10
- package/dist/types/metadata.js.map +0 -1
- package/dist/types/nested-types.d.ts +0 -111
- package/dist/types/nested-types.d.ts.map +0 -1
- package/dist/types/nested-types.js +0 -176
- package/dist/types/nested-types.js.map +0 -1
- package/dist/types/nested-types.test.d.ts +0 -5
- package/dist/types/nested-types.test.d.ts.map +0 -1
- package/dist/types/nested-types.test.js +0 -135
- package/dist/types/nested-types.test.js.map +0 -1
- package/dist/types/ref-parameters.d.ts +0 -123
- package/dist/types/ref-parameters.d.ts.map +0 -1
- package/dist/types/ref-parameters.js +0 -203
- package/dist/types/ref-parameters.js.map +0 -1
- package/dist/types/ref-parameters.test.d.ts +0 -5
- package/dist/types/ref-parameters.test.d.ts.map +0 -1
- package/dist/types/ref-parameters.test.js +0 -147
- package/dist/types/ref-parameters.test.js.map +0 -1
package/dist/program/bindings.js
CHANGED
|
@@ -1,787 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Binding manifest loading - maps JS/TS names to CLR types/members
|
|
3
3
|
* See spec/bindings.md for full manifest format
|
|
4
|
-
*/
|
|
5
|
-
import * as fs from "node:fs";
|
|
6
|
-
import * as path from "node:path";
|
|
7
|
-
import { tsbindgenClrTypeNameToTsTypeName } from "../tsbindgen/names.js";
|
|
8
|
-
/**
|
|
9
|
-
* Type guard to check if a manifest is the full format
|
|
10
|
-
*/
|
|
11
|
-
const isFullBindingManifest = (manifest) => {
|
|
12
|
-
return "assembly" in manifest && "namespaces" in manifest;
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* Type guard to check if a manifest is the tsbindgen format
|
|
16
|
-
*/
|
|
17
|
-
const isTsbindgenBindingFile = (manifest) => {
|
|
18
|
-
return ("namespace" in manifest &&
|
|
19
|
-
"types" in manifest &&
|
|
20
|
-
!("namespaces" in manifest));
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* Validate that a parsed JSON object is a valid binding file format.
|
|
24
|
-
* Returns an error message if invalid, undefined if valid.
|
|
25
|
-
*/
|
|
26
|
-
const validateBindingFile = (obj, filePath) => {
|
|
27
|
-
if (obj === null || typeof obj !== "object") {
|
|
28
|
-
return `${filePath}: Expected object, got ${typeof obj}`;
|
|
29
|
-
}
|
|
30
|
-
const manifest = obj;
|
|
31
|
-
// Check for tsbindgen format
|
|
32
|
-
if ("namespace" in manifest && "types" in manifest) {
|
|
33
|
-
if (typeof manifest.namespace !== "string") {
|
|
34
|
-
return `${filePath}: 'namespace' must be a string`;
|
|
35
|
-
}
|
|
36
|
-
if (!Array.isArray(manifest.types)) {
|
|
37
|
-
return `${filePath}: 'types' must be an array`;
|
|
38
|
-
}
|
|
39
|
-
return undefined; // Valid tsbindgen format
|
|
40
|
-
}
|
|
41
|
-
// Check for full manifest format
|
|
42
|
-
if ("assembly" in manifest && "namespaces" in manifest) {
|
|
43
|
-
if (typeof manifest.assembly !== "string") {
|
|
44
|
-
return `${filePath}: 'assembly' must be a string`;
|
|
45
|
-
}
|
|
46
|
-
if (!Array.isArray(manifest.namespaces)) {
|
|
47
|
-
return `${filePath}: 'namespaces' must be an array`;
|
|
48
|
-
}
|
|
49
|
-
return undefined; // Valid full format
|
|
50
|
-
}
|
|
51
|
-
// Check for simple format (global/module bindings)
|
|
52
|
-
if ("bindings" in manifest) {
|
|
53
|
-
if (typeof manifest.bindings !== "object" || manifest.bindings === null) {
|
|
54
|
-
return `${filePath}: 'bindings' must be an object`;
|
|
55
|
-
}
|
|
56
|
-
return undefined; // Valid simple format
|
|
57
|
-
}
|
|
58
|
-
return `${filePath}: Unrecognized binding file format. Expected tsbindgen (namespace+types), full (assembly+namespaces), or simple (bindings) format.`;
|
|
59
|
-
};
|
|
60
|
-
/**
|
|
61
|
-
* Registry of all loaded bindings
|
|
62
|
-
* Supports simple (global/module) and hierarchical (namespace/type/member) formats
|
|
63
|
-
*/
|
|
64
|
-
export class BindingRegistry {
|
|
65
|
-
constructor() {
|
|
66
|
-
this.loadedBindingFiles = new Set();
|
|
67
|
-
// Simple format: global/module bindings for identifiers like console, Math, fs
|
|
68
|
-
this.simpleBindings = new Map();
|
|
69
|
-
// Hierarchical format: namespace/type/member bindings
|
|
70
|
-
this.namespaces = new Map();
|
|
71
|
-
this.types = new Map(); // Flat lookup by TS name
|
|
72
|
-
this.members = new Map(); // Flat lookup by "type.member"
|
|
73
|
-
this.memberOverloads = new Map(); // Overload-aware lookup by "type.member"
|
|
74
|
-
this.clrMemberOverloads = new Map(); // Overload-aware lookup by CLR target key
|
|
75
|
-
this.tsbindgenExports = new Map();
|
|
76
|
-
this.tsSupertypes = new Map();
|
|
77
|
-
/**
|
|
78
|
-
* Extension method index for instance-style calls.
|
|
79
|
-
*
|
|
80
|
-
* Keyed by:
|
|
81
|
-
* - declaring namespace key (CLR namespace with '.' replaced by '_', e.g. "System_Linq")
|
|
82
|
-
* - receiver TS type name (e.g. "IEnumerable_1")
|
|
83
|
-
* - method TS name (e.g. "where")
|
|
84
|
-
*
|
|
85
|
-
* Values are one or more candidates (overloads share the same target).
|
|
86
|
-
*/
|
|
87
|
-
this.extensionMethods = new Map();
|
|
88
|
-
}
|
|
89
|
-
getExtensionMethodCandidates(namespaceKey, receiverTypeName, methodTsName) {
|
|
90
|
-
return this.extensionMethods
|
|
91
|
-
.get(namespaceKey)
|
|
92
|
-
?.get(receiverTypeName)
|
|
93
|
-
?.get(methodTsName);
|
|
94
|
-
}
|
|
95
|
-
addSupertype(typeAlias, superAlias) {
|
|
96
|
-
if (!typeAlias || !superAlias)
|
|
97
|
-
return;
|
|
98
|
-
if (typeAlias === superAlias)
|
|
99
|
-
return;
|
|
100
|
-
const set = this.tsSupertypes.get(typeAlias) ?? new Set();
|
|
101
|
-
set.add(superAlias);
|
|
102
|
-
this.tsSupertypes.set(typeAlias, set);
|
|
103
|
-
}
|
|
104
|
-
getDirectSupertypes(typeAlias) {
|
|
105
|
-
const set = this.tsSupertypes.get(typeAlias);
|
|
106
|
-
if (!set || set.size === 0)
|
|
107
|
-
return [];
|
|
108
|
-
return Array.from(set).sort((a, b) => a.localeCompare(b));
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Resolve an extension method binding target by extension interface name.
|
|
112
|
-
*
|
|
113
|
-
* @param extensionInterfaceName - e.g. "__Ext_System_Linq_IEnumerable_1"
|
|
114
|
-
* @param methodTsName - e.g. "where"
|
|
115
|
-
*/
|
|
116
|
-
resolveExtensionMethod(extensionInterfaceName, methodTsName, callArgumentCount) {
|
|
117
|
-
const parsed = this.parseExtensionInterfaceName(extensionInterfaceName);
|
|
118
|
-
if (!parsed)
|
|
119
|
-
return undefined;
|
|
120
|
-
return this.resolveExtensionMethodByKey(parsed.namespaceKey, parsed.receiverTypeName, methodTsName, callArgumentCount);
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Resolve an extension method binding target by explicit (namespaceKey, receiverTypeName).
|
|
124
|
-
*
|
|
125
|
-
* Used when extension methods are emitted as method-table members with explicit `this:`
|
|
126
|
-
* receiver constraints (the declaring interface name no longer encodes the receiver type).
|
|
127
|
-
*/
|
|
128
|
-
resolveExtensionMethodByKey(namespaceKey, receiverTypeName, methodTsName, callArgumentCount) {
|
|
129
|
-
const getParameterCount = (binding) => {
|
|
130
|
-
if (typeof binding.parameterCount === "number") {
|
|
131
|
-
return binding.parameterCount;
|
|
132
|
-
}
|
|
133
|
-
const sig = binding.signature;
|
|
134
|
-
if (!sig)
|
|
135
|
-
return undefined;
|
|
136
|
-
const paramsMatch = sig.match(/\|\(([^)]*)\):/);
|
|
137
|
-
const paramsStr = paramsMatch?.[1]?.trim();
|
|
138
|
-
if (!paramsStr)
|
|
139
|
-
return undefined;
|
|
140
|
-
return splitSignatureTypeList(paramsStr).length;
|
|
141
|
-
};
|
|
142
|
-
const getModifiersKey = (binding) => {
|
|
143
|
-
const mods = (binding.parameterModifiers ??
|
|
144
|
-
[]);
|
|
145
|
-
if (!Array.isArray(mods) || mods.length === 0)
|
|
146
|
-
return "";
|
|
147
|
-
return [...mods]
|
|
148
|
-
.slice()
|
|
149
|
-
.sort((a, b) => a.index - b.index)
|
|
150
|
-
.map((m) => `${m.index}:${m.modifier}`)
|
|
151
|
-
.join(",");
|
|
152
|
-
};
|
|
153
|
-
const resolveForReceiver = (receiverTypeName) => {
|
|
154
|
-
const candidates = this.getExtensionMethodCandidates(namespaceKey, receiverTypeName, methodTsName);
|
|
155
|
-
if (!candidates || candidates.length === 0)
|
|
156
|
-
return { kind: "none" };
|
|
157
|
-
let filteredCandidates = candidates;
|
|
158
|
-
if (typeof callArgumentCount === "number") {
|
|
159
|
-
const desiredParamCount = callArgumentCount + 1;
|
|
160
|
-
const exact = candidates.filter((c) => getParameterCount(c) === desiredParamCount);
|
|
161
|
-
if (exact.length > 0) {
|
|
162
|
-
filteredCandidates = exact;
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
// Optional-parameter safety: if no exact arity match, choose the smallest
|
|
166
|
-
// candidate arity that can still accept the provided arguments.
|
|
167
|
-
const larger = candidates
|
|
168
|
-
.map((c) => ({ c, count: getParameterCount(c) }))
|
|
169
|
-
.filter((x) => typeof x.count === "number" && x.count > desiredParamCount);
|
|
170
|
-
if (larger.length === 0)
|
|
171
|
-
return { kind: "none" };
|
|
172
|
-
const minCount = Math.min(...larger.map((x) => x.count));
|
|
173
|
-
filteredCandidates = larger
|
|
174
|
-
.filter((x) => x.count === minCount)
|
|
175
|
-
.map((x) => x.c);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
// If multiple candidates map to different CLR targets, treat as unresolved (unsafe).
|
|
179
|
-
const first = filteredCandidates[0];
|
|
180
|
-
if (!first)
|
|
181
|
-
return { kind: "none" };
|
|
182
|
-
const firstTarget = `${first.binding.type}::${first.binding.member}`;
|
|
183
|
-
const firstModsKey = getModifiersKey(first);
|
|
184
|
-
for (const c of filteredCandidates) {
|
|
185
|
-
const target = `${c.binding.type}::${c.binding.member}`;
|
|
186
|
-
if (target !== firstTarget) {
|
|
187
|
-
return { kind: "ambiguous" };
|
|
188
|
-
}
|
|
189
|
-
if (getModifiersKey(c) !== firstModsKey) {
|
|
190
|
-
return { kind: "ambiguous" };
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
return { kind: "resolved", binding: first };
|
|
194
|
-
};
|
|
195
|
-
// 1) Exact receiver match.
|
|
196
|
-
const direct = resolveForReceiver(receiverTypeName);
|
|
197
|
-
if (direct.kind === "resolved")
|
|
198
|
-
return direct.binding;
|
|
199
|
-
if (direct.kind === "ambiguous")
|
|
200
|
-
return undefined;
|
|
201
|
-
// 2) Airplane-grade fallback: CLR interface/base-type inheritance.
|
|
202
|
-
// This allows instance-style calls to resolve when TS surface selects a method
|
|
203
|
-
// declared on a derived type's extension bucket (e.g., IQueryable<T>.ToList)
|
|
204
|
-
// but the CLR binding is declared on a base interface (e.g., IEnumerable<T>).
|
|
205
|
-
//
|
|
206
|
-
// Determinism rules:
|
|
207
|
-
// - Prefer the closest base match (BFS).
|
|
208
|
-
// - If multiple matches exist at the same depth with different CLR targets,
|
|
209
|
-
// treat as unresolved (unsafe).
|
|
210
|
-
const visited = new Set([receiverTypeName]);
|
|
211
|
-
let frontier = [receiverTypeName];
|
|
212
|
-
for (let depth = 0; depth < 20; depth++) {
|
|
213
|
-
const next = [];
|
|
214
|
-
for (const t of frontier) {
|
|
215
|
-
for (const sup of this.getDirectSupertypes(t)) {
|
|
216
|
-
if (visited.has(sup))
|
|
217
|
-
continue;
|
|
218
|
-
visited.add(sup);
|
|
219
|
-
next.push(sup);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
if (next.length === 0)
|
|
223
|
-
break;
|
|
224
|
-
const resolvedAtDepth = [];
|
|
225
|
-
let sawAmbiguous = false;
|
|
226
|
-
for (const sup of next) {
|
|
227
|
-
const res = resolveForReceiver(sup);
|
|
228
|
-
if (res.kind === "ambiguous")
|
|
229
|
-
sawAmbiguous = true;
|
|
230
|
-
if (res.kind === "resolved")
|
|
231
|
-
resolvedAtDepth.push(res.binding);
|
|
232
|
-
}
|
|
233
|
-
if (resolvedAtDepth.length > 0 || sawAmbiguous) {
|
|
234
|
-
// If any ambiguity exists at the closest depth, do not guess.
|
|
235
|
-
if (sawAmbiguous)
|
|
236
|
-
return undefined;
|
|
237
|
-
const first = resolvedAtDepth[0];
|
|
238
|
-
if (!first)
|
|
239
|
-
return undefined;
|
|
240
|
-
const target0 = `${first.binding.type}::${first.binding.member}`;
|
|
241
|
-
const mods0 = getModifiersKey(first);
|
|
242
|
-
for (const b of resolvedAtDepth) {
|
|
243
|
-
const target = `${b.binding.type}::${b.binding.member}`;
|
|
244
|
-
if (target !== target0)
|
|
245
|
-
return undefined;
|
|
246
|
-
if (getModifiersKey(b) !== mods0)
|
|
247
|
-
return undefined;
|
|
248
|
-
}
|
|
249
|
-
return first;
|
|
250
|
-
}
|
|
251
|
-
frontier = next;
|
|
252
|
-
}
|
|
253
|
-
return undefined;
|
|
254
|
-
}
|
|
255
|
-
parseExtensionInterfaceName(extensionInterfaceName) {
|
|
256
|
-
if (!extensionInterfaceName.startsWith("__Ext_"))
|
|
257
|
-
return undefined;
|
|
258
|
-
const rest = extensionInterfaceName.slice("__Ext_".length);
|
|
259
|
-
// Find the longest namespaceKey prefix we have indexed.
|
|
260
|
-
let bestNamespaceKey;
|
|
261
|
-
for (const namespaceKey of this.extensionMethods.keys()) {
|
|
262
|
-
if (rest.startsWith(`${namespaceKey}_`)) {
|
|
263
|
-
if (!bestNamespaceKey ||
|
|
264
|
-
namespaceKey.length > bestNamespaceKey.length) {
|
|
265
|
-
bestNamespaceKey = namespaceKey;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
if (!bestNamespaceKey)
|
|
270
|
-
return undefined;
|
|
271
|
-
const receiverTypeName = rest.slice(bestNamespaceKey.length + 1);
|
|
272
|
-
if (!receiverTypeName)
|
|
273
|
-
return undefined;
|
|
274
|
-
return { namespaceKey: bestNamespaceKey, receiverTypeName };
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Load a binding manifest file and add its bindings to the registry
|
|
278
|
-
* Supports simple, full, and tsbindgen formats
|
|
279
|
-
*/
|
|
280
|
-
addBindings(_filePath, manifest) {
|
|
281
|
-
// Airplane-grade: a given bindings file must be loaded exactly once per
|
|
282
|
-
// ProgramContext. Some converters perform on-demand bindings.json loading
|
|
283
|
-
// based on Binding-resolved MemberIds; without this guard, overload sets
|
|
284
|
-
// can silently duplicate and become ambiguous.
|
|
285
|
-
if (this.loadedBindingFiles.has(_filePath))
|
|
286
|
-
return;
|
|
287
|
-
this.loadedBindingFiles.add(_filePath);
|
|
288
|
-
const addMemberOverload = (key, member) => {
|
|
289
|
-
const existing = this.memberOverloads.get(key) ?? [];
|
|
290
|
-
existing.push(member);
|
|
291
|
-
this.memberOverloads.set(key, existing);
|
|
292
|
-
};
|
|
293
|
-
const addClrMemberOverload = (member) => {
|
|
294
|
-
if (member.kind !== "method")
|
|
295
|
-
return;
|
|
296
|
-
const clrTargetKey = makeClrMemberKey(member.binding.assembly, member.binding.type, member.binding.member);
|
|
297
|
-
const existing = this.clrMemberOverloads.get(clrTargetKey) ?? [];
|
|
298
|
-
existing.push(member);
|
|
299
|
-
this.clrMemberOverloads.set(clrTargetKey, existing);
|
|
300
|
-
};
|
|
301
|
-
if (isFullBindingManifest(manifest)) {
|
|
302
|
-
// Full format: hierarchical namespace/type/member structure
|
|
303
|
-
// Index by alias (TS identifier) for quick lookup
|
|
304
|
-
for (const ns of manifest.namespaces) {
|
|
305
|
-
this.namespaces.set(ns.alias, ns);
|
|
306
|
-
// Index types for quick lookup by TS alias
|
|
307
|
-
for (const type of ns.types) {
|
|
308
|
-
this.types.set(type.alias, type);
|
|
309
|
-
// Index members for quick lookup (keyed by "typeAlias.memberAlias")
|
|
310
|
-
for (const member of type.members) {
|
|
311
|
-
const key = `${type.alias}.${member.alias}`;
|
|
312
|
-
this.members.set(key, member);
|
|
313
|
-
addMemberOverload(key, member);
|
|
314
|
-
addClrMemberOverload(member);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
else if (isTsbindgenBindingFile(manifest)) {
|
|
320
|
-
// tsbindgen format: convert to internal format
|
|
321
|
-
for (const tsbType of manifest.types) {
|
|
322
|
-
// Create members from methods, properties, and fields
|
|
323
|
-
const members = [];
|
|
324
|
-
for (const method of tsbType.methods) {
|
|
325
|
-
const memberBinding = {
|
|
326
|
-
kind: "method",
|
|
327
|
-
name: method.clrName,
|
|
328
|
-
// No naming policy: TS member names are the CLR names as authored.
|
|
329
|
-
alias: method.clrName,
|
|
330
|
-
signature: method.normalizedSignature,
|
|
331
|
-
parameterCount: method.parameterCount,
|
|
332
|
-
binding: {
|
|
333
|
-
assembly: method.declaringAssemblyName,
|
|
334
|
-
type: method.declaringClrType,
|
|
335
|
-
// member = clrName (what C# emits, e.g., "Add")
|
|
336
|
-
member: method.clrName,
|
|
337
|
-
},
|
|
338
|
-
// Include parameter modifiers for ref/out/in parameters
|
|
339
|
-
parameterModifiers: method.parameterModifiers,
|
|
340
|
-
isExtensionMethod: method.isExtensionMethod ?? false,
|
|
341
|
-
};
|
|
342
|
-
members.push(memberBinding);
|
|
343
|
-
addClrMemberOverload(memberBinding);
|
|
344
|
-
// Index extension methods by (declaring namespace, receiver type, method name).
|
|
345
|
-
if (method.isExtensionMethod && method.normalizedSignature) {
|
|
346
|
-
const receiverTypeName = extractExtensionReceiverType(method.normalizedSignature);
|
|
347
|
-
const namespaceKey = extractNamespaceKey(method.declaringClrType);
|
|
348
|
-
if (receiverTypeName && namespaceKey) {
|
|
349
|
-
const nsMap = this.extensionMethods.get(namespaceKey) ??
|
|
350
|
-
new Map();
|
|
351
|
-
if (!this.extensionMethods.has(namespaceKey)) {
|
|
352
|
-
this.extensionMethods.set(namespaceKey, nsMap);
|
|
353
|
-
}
|
|
354
|
-
const receiverMap = nsMap.get(receiverTypeName) ??
|
|
355
|
-
new Map();
|
|
356
|
-
if (!nsMap.has(receiverTypeName)) {
|
|
357
|
-
nsMap.set(receiverTypeName, receiverMap);
|
|
358
|
-
}
|
|
359
|
-
const list = receiverMap.get(memberBinding.alias) ?? [];
|
|
360
|
-
list.push(memberBinding);
|
|
361
|
-
receiverMap.set(memberBinding.alias, list);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
for (const prop of tsbType.properties) {
|
|
366
|
-
members.push({
|
|
367
|
-
kind: "property",
|
|
368
|
-
name: prop.clrName,
|
|
369
|
-
alias: prop.clrName,
|
|
370
|
-
binding: {
|
|
371
|
-
assembly: prop.declaringAssemblyName,
|
|
372
|
-
type: prop.declaringClrType,
|
|
373
|
-
member: prop.clrName,
|
|
374
|
-
},
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
for (const field of tsbType.fields) {
|
|
378
|
-
// Fields are treated as properties for binding purposes
|
|
379
|
-
members.push({
|
|
380
|
-
kind: "property",
|
|
381
|
-
name: field.clrName,
|
|
382
|
-
alias: field.clrName,
|
|
383
|
-
binding: {
|
|
384
|
-
assembly: field.declaringAssemblyName,
|
|
385
|
-
type: field.declaringClrType,
|
|
386
|
-
member: field.clrName,
|
|
387
|
-
},
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
const tsAlias = tsbindgenClrTypeNameToTsTypeName(tsbType.clrName);
|
|
391
|
-
// Record CLR inheritance relationships (base type + interfaces) so extension-method
|
|
392
|
-
// binding lookup can follow the CLR graph deterministically.
|
|
393
|
-
const baseAlias = tsbType.baseType?.clrName
|
|
394
|
-
? tsbindgenClrTypeNameToTsTypeName(tsbType.baseType.clrName)
|
|
395
|
-
: undefined;
|
|
396
|
-
if (baseAlias)
|
|
397
|
-
this.addSupertype(tsAlias, baseAlias);
|
|
398
|
-
for (const iface of tsbType.interfaces ?? []) {
|
|
399
|
-
if (!iface?.clrName)
|
|
400
|
-
continue;
|
|
401
|
-
const ifaceAlias = tsbindgenClrTypeNameToTsTypeName(iface.clrName);
|
|
402
|
-
this.addSupertype(tsAlias, ifaceAlias);
|
|
403
|
-
}
|
|
404
|
-
const kindFromBindings = (() => {
|
|
405
|
-
switch (tsbType.kind) {
|
|
406
|
-
case "Interface":
|
|
407
|
-
return "interface";
|
|
408
|
-
case "Struct":
|
|
409
|
-
return "struct";
|
|
410
|
-
case "Enum":
|
|
411
|
-
return "enum";
|
|
412
|
-
case "Class":
|
|
413
|
-
default:
|
|
414
|
-
return "class";
|
|
415
|
-
}
|
|
416
|
-
})();
|
|
417
|
-
// Create TypeBinding - TS alias is derived deterministically from CLR name.
|
|
418
|
-
const typeBinding = {
|
|
419
|
-
name: tsbType.clrName,
|
|
420
|
-
alias: tsAlias,
|
|
421
|
-
kind: kindFromBindings,
|
|
422
|
-
members,
|
|
423
|
-
};
|
|
424
|
-
// Index the type by its TS name.
|
|
425
|
-
this.types.set(typeBinding.alias, typeBinding);
|
|
426
|
-
// Also index by simple name if ts alias has arity suffix (e.g., "List_1" -> also index as "List")
|
|
427
|
-
// This is needed because TS exports both List_1 and List as aliases, and TS code uses List<T>
|
|
428
|
-
// IMPORTANT: Only set if not already present - non-generic versions should take precedence
|
|
429
|
-
// (e.g., Action should resolve to System.Action, not System.Action`9)
|
|
430
|
-
const arityMatch = typeBinding.alias.match(/^(.+)_(\d+)$/);
|
|
431
|
-
const simpleAlias = arityMatch ? arityMatch[1] : null;
|
|
432
|
-
if (simpleAlias &&
|
|
433
|
-
simpleAlias !== typeBinding.alias &&
|
|
434
|
-
!this.types.has(simpleAlias)) {
|
|
435
|
-
this.types.set(simpleAlias, typeBinding);
|
|
436
|
-
}
|
|
437
|
-
// Index members for direct lookup.
|
|
438
|
-
for (const member of members) {
|
|
439
|
-
// Key by TS name (e.g., "List_1.Add")
|
|
440
|
-
const tsKey = `${typeBinding.alias}.${member.alias}`;
|
|
441
|
-
this.members.set(tsKey, member);
|
|
442
|
-
addMemberOverload(tsKey, member);
|
|
443
|
-
// Also key by simple alias if applicable (e.g., "List.Add")
|
|
444
|
-
if (simpleAlias) {
|
|
445
|
-
const simpleKey = `${simpleAlias}.${member.alias}`;
|
|
446
|
-
this.members.set(simpleKey, member);
|
|
447
|
-
addMemberOverload(simpleKey, member);
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
// Optional flattened named exports.
|
|
452
|
-
// These are stable value exports for CLR namespace facade modules and are
|
|
453
|
-
// resolved by Tsonic during import binding (so `import { x }` maps to
|
|
454
|
-
// `global::<DeclaringType>.<member>` in C#).
|
|
455
|
-
if (manifest.exports) {
|
|
456
|
-
const nsExports = this.tsbindgenExports.get(manifest.namespace) ??
|
|
457
|
-
new Map();
|
|
458
|
-
for (const [exportName, exp] of Object.entries(manifest.exports)) {
|
|
459
|
-
nsExports.set(exportName, exp);
|
|
460
|
-
}
|
|
461
|
-
this.tsbindgenExports.set(manifest.namespace, nsExports);
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
else {
|
|
465
|
-
// Simple format: global/module bindings
|
|
466
|
-
for (const [name, descriptor] of Object.entries(manifest.bindings)) {
|
|
467
|
-
this.simpleBindings.set(name, descriptor);
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
/**
|
|
472
|
-
* Look up a simple global/module binding
|
|
473
|
-
*/
|
|
474
|
-
getBinding(name) {
|
|
475
|
-
return this.simpleBindings.get(name);
|
|
476
|
-
}
|
|
477
|
-
/**
|
|
478
|
-
* Look up a namespace binding by TS alias
|
|
479
|
-
*/
|
|
480
|
-
getNamespace(tsAlias) {
|
|
481
|
-
return this.namespaces.get(tsAlias);
|
|
482
|
-
}
|
|
483
|
-
/**
|
|
484
|
-
* Look up a type binding by TS alias
|
|
485
|
-
*/
|
|
486
|
-
getType(tsAlias) {
|
|
487
|
-
return this.types.get(tsAlias);
|
|
488
|
-
}
|
|
489
|
-
/**
|
|
490
|
-
* Look up a member binding by TS type alias and member alias
|
|
491
|
-
*/
|
|
492
|
-
getMember(typeAlias, memberAlias) {
|
|
493
|
-
const key = `${typeAlias}.${memberAlias}`;
|
|
494
|
-
const direct = this.members.get(key);
|
|
495
|
-
if (direct)
|
|
496
|
-
return direct;
|
|
497
|
-
// tsbindgen encodes protected CLR members on a synthetic `${TypeName}$protected` class.
|
|
498
|
-
// Those members are still declared on the real CLR type, so bindings must resolve
|
|
499
|
-
// through the owning type alias.
|
|
500
|
-
if (typeAlias.endsWith("$protected")) {
|
|
501
|
-
const ownerAlias = typeAlias.slice(0, -"$protected".length);
|
|
502
|
-
return this.members.get(`${ownerAlias}.${memberAlias}`);
|
|
503
|
-
}
|
|
504
|
-
return undefined;
|
|
505
|
-
}
|
|
506
|
-
/**
|
|
507
|
-
* Look up all member bindings for a TS type alias + member alias.
|
|
508
|
-
*
|
|
509
|
-
* IMPORTANT: Methods can be overloaded, and overloads can differ in ref/out/in
|
|
510
|
-
* modifiers (tsbindgen provides these via `parameterModifiers`). This accessor
|
|
511
|
-
* preserves overload sets so the call converter can select the correct one.
|
|
512
|
-
*/
|
|
513
|
-
getMemberOverloads(typeAlias, memberAlias) {
|
|
514
|
-
const key = `${typeAlias}.${memberAlias}`;
|
|
515
|
-
const direct = this.memberOverloads.get(key);
|
|
516
|
-
if (direct && direct.length > 0)
|
|
517
|
-
return direct;
|
|
518
|
-
// See getMember(): map `${TypeName}$protected` to `${TypeName}` for CLR binding lookup.
|
|
519
|
-
if (typeAlias.endsWith("$protected")) {
|
|
520
|
-
const ownerAlias = typeAlias.slice(0, -"$protected".length);
|
|
521
|
-
const ownerKey = `${ownerAlias}.${memberAlias}`;
|
|
522
|
-
const owner = this.memberOverloads.get(ownerKey);
|
|
523
|
-
if (owner && owner.length > 0)
|
|
524
|
-
return owner;
|
|
525
|
-
}
|
|
526
|
-
return undefined;
|
|
527
|
-
}
|
|
528
|
-
/**
|
|
529
|
-
* Look up all member bindings for a CLR member target.
|
|
530
|
-
*
|
|
531
|
-
* Keyed by declaring assembly, CLR type, and CLR member name.
|
|
532
|
-
*/
|
|
533
|
-
getClrMemberOverloads(assembly, clrType, clrMember) {
|
|
534
|
-
return this.clrMemberOverloads.get(makeClrMemberKey(assembly, clrType, clrMember));
|
|
535
|
-
}
|
|
536
|
-
/**
|
|
537
|
-
* Look up a tsbindgen flattened named export by CLR namespace + export name.
|
|
538
|
-
*/
|
|
539
|
-
getTsbindgenExport(namespace, exportName) {
|
|
540
|
-
return this.tsbindgenExports.get(namespace)?.get(exportName);
|
|
541
|
-
}
|
|
542
|
-
/**
|
|
543
|
-
* Get all loaded simple bindings
|
|
544
|
-
*/
|
|
545
|
-
getAllBindings() {
|
|
546
|
-
return Array.from(this.simpleBindings.entries());
|
|
547
|
-
}
|
|
548
|
-
/**
|
|
549
|
-
* Get all loaded namespaces
|
|
550
|
-
*/
|
|
551
|
-
getAllNamespaces() {
|
|
552
|
-
return Array.from(this.namespaces.values());
|
|
553
|
-
}
|
|
554
|
-
/**
|
|
555
|
-
* Get a copy of the types map for passing to the emitter.
|
|
556
|
-
* Returns a new Map to ensure immutability - callers cannot modify the registry.
|
|
557
|
-
*/
|
|
558
|
-
getTypesMap() {
|
|
559
|
-
return new Map(this.types);
|
|
560
|
-
}
|
|
561
|
-
/**
|
|
562
|
-
* Clear all loaded bindings
|
|
563
|
-
*/
|
|
564
|
-
clear() {
|
|
565
|
-
this.loadedBindingFiles.clear();
|
|
566
|
-
this.simpleBindings.clear();
|
|
567
|
-
this.namespaces.clear();
|
|
568
|
-
this.types.clear();
|
|
569
|
-
this.members.clear();
|
|
570
|
-
this.memberOverloads.clear();
|
|
571
|
-
this.clrMemberOverloads.clear();
|
|
572
|
-
this.extensionMethods.clear();
|
|
573
|
-
this.tsbindgenExports.clear();
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
const makeClrMemberKey = (assembly, clrType, clrMember) => `${assembly}:${clrType}::${clrMember}`;
|
|
577
|
-
/**
|
|
578
|
-
* Extract CLR namespace key ('.' → '_') from a full CLR type name.
|
|
579
|
-
* Example: "System.Linq.Enumerable" → "System_Linq"
|
|
580
|
-
*/
|
|
581
|
-
const extractNamespaceKey = (clrType) => {
|
|
582
|
-
const lastDot = clrType.lastIndexOf(".");
|
|
583
|
-
if (lastDot <= 0)
|
|
584
|
-
return undefined;
|
|
585
|
-
return clrType.slice(0, lastDot).replace(/\./g, "_");
|
|
586
|
-
};
|
|
587
|
-
/**
|
|
588
|
-
* Extract the extension receiver TS type name from a tsbindgen normalized signature.
|
|
589
|
-
*
|
|
590
|
-
* Format: "Name|(ParamTypes):ReturnType|static=true"
|
|
591
|
-
* Example: "Where|(IEnumerable_1,Func_2):IEnumerable_1|static=true"
|
|
592
|
-
*
|
|
593
|
-
* Returns the first parameter type name (stripped of byref suffix and namespace prefix).
|
|
594
|
-
*/
|
|
595
|
-
const extractExtensionReceiverType = (normalizedSignature) => {
|
|
596
|
-
const paramsMatch = normalizedSignature.match(/\|\(([^)]*)\):/);
|
|
597
|
-
const paramsStr = paramsMatch?.[1]?.trim();
|
|
598
|
-
if (!paramsStr)
|
|
599
|
-
return undefined;
|
|
600
|
-
const [first] = splitSignatureTypeList(paramsStr);
|
|
601
|
-
if (!first)
|
|
602
|
-
return undefined;
|
|
603
|
-
let receiver = first.trim();
|
|
604
|
-
if (receiver.endsWith("&"))
|
|
605
|
-
receiver = receiver.slice(0, -1);
|
|
606
|
-
if (receiver.endsWith("[]"))
|
|
607
|
-
receiver = receiver.slice(0, -2);
|
|
608
|
-
const lastDot = receiver.lastIndexOf(".");
|
|
609
|
-
if (lastDot >= 0)
|
|
610
|
-
receiver = receiver.slice(lastDot + 1);
|
|
611
|
-
return receiver || undefined;
|
|
612
|
-
};
|
|
613
|
-
/**
|
|
614
|
-
* Split a comma-delimited type list, respecting nested bracket depth.
|
|
615
|
-
* tsbindgen signatures use CLR-style nested generic brackets in some contexts.
|
|
616
|
-
*/
|
|
617
|
-
const splitSignatureTypeList = (str) => {
|
|
618
|
-
const result = [];
|
|
619
|
-
let depth = 0;
|
|
620
|
-
let current = "";
|
|
621
|
-
for (const char of str) {
|
|
622
|
-
if (char === "[") {
|
|
623
|
-
depth++;
|
|
624
|
-
current += char;
|
|
625
|
-
}
|
|
626
|
-
else if (char === "]") {
|
|
627
|
-
depth--;
|
|
628
|
-
current += char;
|
|
629
|
-
}
|
|
630
|
-
else if (char === "," && depth === 0) {
|
|
631
|
-
result.push(current.trim());
|
|
632
|
-
current = "";
|
|
633
|
-
}
|
|
634
|
-
else {
|
|
635
|
-
current += char;
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
if (current.trim()) {
|
|
639
|
-
result.push(current.trim());
|
|
640
|
-
}
|
|
641
|
-
return result;
|
|
642
|
-
};
|
|
643
|
-
/**
|
|
644
|
-
* Recursively scan a directory for .d.ts files
|
|
645
|
-
* Reuses the same helper as metadata loading
|
|
646
|
-
*/
|
|
647
|
-
const scanForDeclarationFiles = (dir) => {
|
|
648
|
-
if (!fs.existsSync(dir)) {
|
|
649
|
-
return [];
|
|
650
|
-
}
|
|
651
|
-
const results = [];
|
|
652
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
653
|
-
for (const entry of entries) {
|
|
654
|
-
const fullPath = path.join(dir, entry.name);
|
|
655
|
-
if (entry.isDirectory()) {
|
|
656
|
-
results.push(...scanForDeclarationFiles(fullPath));
|
|
657
|
-
}
|
|
658
|
-
else if (entry.name.endsWith(".d.ts")) {
|
|
659
|
-
results.push(fullPath);
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
return results;
|
|
663
|
-
};
|
|
664
|
-
/**
|
|
665
|
-
* Load bindings from a package directory and recursively from its @tsonic/* dependencies.
|
|
666
|
-
*
|
|
667
|
-
* This supports the common "namespace facade" layout:
|
|
668
|
-
* - `System.d.ts` (or `index.d.ts`) at the package root
|
|
669
|
-
* - `System/bindings.json` (or `index/bindings.json`) next to the namespace's `internal/index.d.ts`
|
|
670
|
-
*
|
|
671
|
-
* Some packages may also provide a root-level `bindings.json` (simple/global bindings).
|
|
672
|
-
*/
|
|
673
|
-
const loadBindingsFromPackage = (registry, packageRoot, visited) => {
|
|
674
|
-
// Avoid cycles
|
|
675
|
-
const absoluteRoot = path.resolve(packageRoot);
|
|
676
|
-
if (visited.has(absoluteRoot)) {
|
|
677
|
-
return;
|
|
678
|
-
}
|
|
679
|
-
visited.add(absoluteRoot);
|
|
680
|
-
// Skip if directory doesn't exist
|
|
681
|
-
if (!fs.existsSync(absoluteRoot)) {
|
|
682
|
-
return;
|
|
683
|
-
}
|
|
684
|
-
const rootEntries = fs.readdirSync(absoluteRoot, { withFileTypes: true });
|
|
685
|
-
// Strategy 1: root-level bindings.json (simple/global bindings)
|
|
686
|
-
const rootBindingsPath = path.join(absoluteRoot, "bindings.json");
|
|
687
|
-
loadBindingsFromPath(registry, rootBindingsPath);
|
|
688
|
-
// Strategy 2: Namespace/bindings.json for each Namespace.d.ts facade
|
|
689
|
-
const facadeFiles = rootEntries
|
|
690
|
-
.filter((e) => e.isFile() && e.name.endsWith(".d.ts"))
|
|
691
|
-
.map((e) => e.name);
|
|
692
|
-
for (const facadeFile of facadeFiles) {
|
|
693
|
-
// e.g., "System.d.ts" → "System"
|
|
694
|
-
const namespaceName = facadeFile.slice(0, -".d.ts".length);
|
|
695
|
-
const namespaceDir = path.join(absoluteRoot, namespaceName);
|
|
696
|
-
const bindingsPath = path.join(namespaceDir, "bindings.json");
|
|
697
|
-
if (fs.existsSync(bindingsPath)) {
|
|
698
|
-
loadBindingsFromPath(registry, bindingsPath);
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
// Strategy 3: Recursively load bindings from @tsonic/* dependencies
|
|
702
|
-
// This is crucial for packages like @tsonic/globals that depend on @tsonic/dotnet
|
|
703
|
-
const packageJsonPath = path.join(absoluteRoot, "package.json");
|
|
704
|
-
if (fs.existsSync(packageJsonPath)) {
|
|
705
|
-
try {
|
|
706
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
707
|
-
const deps = packageJson.dependencies || {};
|
|
708
|
-
for (const depName of Object.keys(deps)) {
|
|
709
|
-
// Only follow @tsonic/* dependencies to load their bindings
|
|
710
|
-
if (depName.startsWith("@tsonic/")) {
|
|
711
|
-
// Find the dependency in node_modules
|
|
712
|
-
// Try sibling node_modules first (hoisted), then nested
|
|
713
|
-
const nodeModulesDir = path.dirname(path.dirname(absoluteRoot));
|
|
714
|
-
const hoistedPath = path.join(nodeModulesDir, depName);
|
|
715
|
-
const nestedPath = path.join(absoluteRoot, "node_modules", depName);
|
|
716
|
-
if (fs.existsSync(hoistedPath)) {
|
|
717
|
-
loadBindingsFromPackage(registry, hoistedPath, visited);
|
|
718
|
-
}
|
|
719
|
-
else if (fs.existsSync(nestedPath)) {
|
|
720
|
-
loadBindingsFromPackage(registry, nestedPath, visited);
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
catch {
|
|
726
|
-
// Ignore JSON parse errors in package.json
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
};
|
|
730
|
-
/**
|
|
731
|
-
* Load binding manifests from configured type roots.
|
|
732
|
-
*
|
|
733
|
-
* Conventions:
|
|
734
|
-
* - Root-level `bindings.json` (simple/global bindings)
|
|
735
|
-
* - `Namespace.d.ts` + `Namespace/bindings.json` (namespace facade)
|
|
736
|
-
*
|
|
737
|
-
* Also recursively loads bindings from @tsonic/* dependencies of typeRoot packages.
|
|
738
|
-
*/
|
|
739
|
-
export const loadBindings = (typeRoots) => {
|
|
740
|
-
const registry = new BindingRegistry();
|
|
741
|
-
const visited = new Set();
|
|
742
|
-
for (const typeRoot of typeRoots) {
|
|
743
|
-
loadBindingsFromPackage(registry, typeRoot, visited);
|
|
744
|
-
}
|
|
745
|
-
return registry;
|
|
746
|
-
};
|
|
747
|
-
/**
|
|
748
|
-
* Load bindings from a specific file path into an existing registry.
|
|
749
|
-
* Validates the file format and logs a warning if invalid.
|
|
750
|
-
*/
|
|
751
|
-
export const loadBindingsFromPath = (registry, bindingsPath) => {
|
|
752
|
-
try {
|
|
753
|
-
if (fs.existsSync(bindingsPath)) {
|
|
754
|
-
const content = fs.readFileSync(bindingsPath, "utf-8");
|
|
755
|
-
const parsed = JSON.parse(content);
|
|
756
|
-
// Validate the parsed structure
|
|
757
|
-
const validationError = validateBindingFile(parsed, bindingsPath);
|
|
758
|
-
if (validationError) {
|
|
759
|
-
console.warn(`Invalid bindings file: ${validationError}`);
|
|
760
|
-
return;
|
|
761
|
-
}
|
|
762
|
-
registry.addBindings(bindingsPath, parsed);
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
catch (err) {
|
|
766
|
-
if (err instanceof SyntaxError) {
|
|
767
|
-
console.warn(`Failed to parse bindings from ${bindingsPath}: Invalid JSON - ${err.message}`);
|
|
768
|
-
}
|
|
769
|
-
else {
|
|
770
|
-
console.warn(`Failed to load bindings from ${bindingsPath}:`, err);
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
};
|
|
774
|
-
/**
|
|
775
|
-
* Load all CLR bindings discovered by the resolver.
|
|
776
|
-
* This should be called AFTER createProgram but BEFORE IR building
|
|
777
|
-
* to ensure all bindings are available during IR construction.
|
|
778
4
|
*
|
|
779
|
-
*
|
|
780
|
-
* so
|
|
5
|
+
* This barrel module re-exports all binding types, the registry, and loaders
|
|
6
|
+
* so that existing imports from "program/bindings.js" continue to work.
|
|
781
7
|
*/
|
|
782
|
-
export
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
};
|
|
8
|
+
export { isFullBindingManifest, isTsbindgenBindingFile, validateBindingFile, } from "./binding-types.js";
|
|
9
|
+
// ── Registry ───────────────────────────────────────────────────────────────
|
|
10
|
+
export { BindingRegistry } from "./binding-registry.js";
|
|
11
|
+
// ── Loaders ────────────────────────────────────────────────────────────────
|
|
12
|
+
export { scanForDeclarationFiles, loadBindings, loadBindingsFromPath, loadAllDiscoveredBindings, } from "./binding-loader.js";
|
|
787
13
|
//# sourceMappingURL=bindings.js.map
|