@tsonic/frontend 0.0.62 → 0.0.64
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 +39 -1
- 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/binding-resolution.test.js +248 -0
- package/dist/ir/binding-resolution.test.js.map +1 -1
- package/dist/ir/builder/imports.d.ts.map +1 -1
- package/dist/ir/builder/imports.js +8 -1
- package/dist/ir/builder/imports.js.map +1 -1
- package/dist/ir/builder.test.js +360 -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 +447 -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 +12 -0
- package/dist/ir/program-context.d.ts.map +1 -1
- package/dist/ir/program-context.js +2 -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 +322 -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 +481 -0
- package/dist/ir/type-system/internal/universe/clr-type-parser.js.map +1 -0
- package/dist/ir/type-system/internal/universe/clr-type-parser.test.d.ts +2 -0
- package/dist/ir/type-system/internal/universe/clr-type-parser.test.d.ts.map +1 -0
- package/dist/ir/type-system/internal/universe/clr-type-parser.test.js +55 -0
- package/dist/ir/type-system/internal/universe/clr-type-parser.test.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 +1121 -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/anonymous-type-lowering-pass.d.ts.map +1 -1
- package/dist/ir/validation/anonymous-type-lowering-pass.js +34 -0
- package/dist/ir/validation/anonymous-type-lowering-pass.js.map +1 -1
- package/dist/ir/validation/anonymous-type-lowering-regressions.test.d.ts +2 -0
- package/dist/ir/validation/anonymous-type-lowering-regressions.test.d.ts.map +1 -0
- package/dist/ir/validation/anonymous-type-lowering-regressions.test.js +121 -0
- package/dist/ir/validation/anonymous-type-lowering-regressions.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/numeric-invariants.test.js +29 -0
- package/dist/ir/validation/numeric-invariants.test.js.map +1 -1
- package/dist/ir/validation/numeric-proof-pass.d.ts.map +1 -1
- package/dist/ir/validation/numeric-proof-pass.js +21 -0
- package/dist/ir/validation/numeric-proof-pass.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/program/creation.d.ts.map +1 -1
- package/dist/program/creation.js +104 -13
- package/dist/program/creation.js.map +1 -1
- package/dist/program/creation.test.js +133 -1
- package/dist/program/creation.test.js.map +1 -1
- package/dist/program/diagnostics.d.ts +1 -1
- package/dist/program/diagnostics.d.ts.map +1 -1
- package/dist/program/diagnostics.js +47 -2
- package/dist/program/diagnostics.js.map +1 -1
- package/dist/program/diagnostics.test.d.ts +2 -0
- package/dist/program/diagnostics.test.d.ts.map +1 -0
- package/dist/program/diagnostics.test.js +58 -0
- package/dist/program/diagnostics.test.js.map +1 -0
- package/dist/program/types.d.ts +2 -0
- package/dist/program/types.d.ts.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 +3 -1
- package/dist/resolver/import-resolution.d.ts.map +1 -1
- package/dist/resolver/import-resolution.js +14 -11
- 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/resolver/node-module-aliases.d.ts +6 -0
- package/dist/resolver/node-module-aliases.d.ts.map +1 -0
- package/dist/resolver/node-module-aliases.js +164 -0
- package/dist/resolver/node-module-aliases.js.map +1 -0
- package/dist/resolver/node-module-aliases.test.d.ts +2 -0
- package/dist/resolver/node-module-aliases.test.d.ts.map +1 -0
- package/dist/resolver/node-module-aliases.test.js +64 -0
- package/dist/resolver/node-module-aliases.test.js.map +1 -0
- package/dist/resolver.test.js +103 -0
- package/dist/resolver.test.js.map +1 -1
- package/dist/surface/js-surface-shims.d.ts +3 -0
- package/dist/surface/js-surface-shims.d.ts.map +1 -0
- package/dist/surface/js-surface-shims.js +332 -0
- package/dist/surface/js-surface-shims.js.map +1 -0
- package/dist/surface/js-surface-shims.test.d.ts +2 -0
- package/dist/surface/js-surface-shims.test.d.ts.map +1 -0
- package/dist/surface/js-surface-shims.test.js +53 -0
- package/dist/surface/js-surface-shims.test.js.map +1 -0
- package/dist/surface/profiles.d.ts +10 -0
- package/dist/surface/profiles.d.ts.map +1 -0
- package/dist/surface/profiles.js +65 -0
- package/dist/surface/profiles.js.map +1 -0
- package/dist/surface/profiles.test.d.ts +2 -0
- package/dist/surface/profiles.test.d.ts.map +1 -0
- package/dist/surface/profiles.test.js +44 -0
- package/dist/surface/profiles.test.js.map +1 -0
- 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 +29 -5
- 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 +211 -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
|
@@ -5,724 +5,5 @@
|
|
|
5
5
|
* Falls back to Binding-resolved MemberId only when the receiver type cannot
|
|
6
6
|
* be normalized nominally (e.g., tsbindgen `$instance & __views` intersections).
|
|
7
7
|
*/
|
|
8
|
-
|
|
9
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
10
|
-
import { dirname, join } from "node:path";
|
|
11
|
-
import { getSourceSpan } from "./helpers.js";
|
|
12
|
-
import { convertExpression } from "../../expression-converter.js";
|
|
13
|
-
import { tsbindgenClrTypeNameToTsTypeName } from "../../../tsbindgen/names.js";
|
|
14
|
-
import { createDiagnostic } from "../../../types/diagnostic.js";
|
|
15
|
-
import { loadBindingsFromPath } from "../../../program/bindings.js";
|
|
16
|
-
/**
|
|
17
|
-
* Fallback for getDeclaredPropertyType when TypeSystem can't resolve the member.
|
|
18
|
-
* Uses TypeSystem.typeOfMemberId() to get member types for:
|
|
19
|
-
* - Built-in types from globals (Array.Length, string.Length, etc.)
|
|
20
|
-
* - CLR-bound types from tsbindgen
|
|
21
|
-
* - Types with inherited members not in TypeRegistry
|
|
22
|
-
*
|
|
23
|
-
* ALICE'S SPEC: Uses TypeSystem as single source of truth.
|
|
24
|
-
*/
|
|
25
|
-
const getDeclaredPropertyTypeFallback = (node, ctx) => {
|
|
26
|
-
// ALICE'S SPEC: Use TypeSystem.typeOfMemberId() to get member type
|
|
27
|
-
const typeSystem = ctx.typeSystem;
|
|
28
|
-
// Resolve property member through Binding layer
|
|
29
|
-
const memberId = ctx.binding.resolvePropertyAccess(node);
|
|
30
|
-
if (!memberId)
|
|
31
|
-
return undefined;
|
|
32
|
-
// Use TypeSystem.typeOfMemberId() to get the member's declared type
|
|
33
|
-
const memberType = typeSystem.typeOfMemberId(memberId);
|
|
34
|
-
// If TypeSystem returns unknownType, treat as not found
|
|
35
|
-
if (memberType.kind === "unknownType") {
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
return memberType;
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* Get the declared property type from a property access expression.
|
|
42
|
-
*
|
|
43
|
-
* ALICE'S SPEC: Uses TypeSystem.typeOfMember() as primary source.
|
|
44
|
-
* Falls back to Binding for inherited members not in TypeRegistry.
|
|
45
|
-
*
|
|
46
|
-
* @param node - Property access expression node
|
|
47
|
-
* @param receiverIrType - Already-computed IR type of the receiver (object) expression
|
|
48
|
-
* @param ctx - ProgramContext for type system and binding access
|
|
49
|
-
* @returns The deterministically computed property type
|
|
50
|
-
*/
|
|
51
|
-
const getDeclaredPropertyType = (node, receiverIrType, ctx) => {
|
|
52
|
-
const DEBUG = process.env.DEBUG_PROPERTY_TYPE === "1";
|
|
53
|
-
const propertyName = node.name.text;
|
|
54
|
-
if (DEBUG) {
|
|
55
|
-
console.log("[getDeclaredPropertyType]", propertyName, "on receiver:", receiverIrType);
|
|
56
|
-
}
|
|
57
|
-
// Try TypeSystem.typeOfMember() first
|
|
58
|
-
const typeSystem = ctx.typeSystem;
|
|
59
|
-
if (receiverIrType && receiverIrType.kind !== "unknownType") {
|
|
60
|
-
const memberType = typeSystem.typeOfMember(receiverIrType, {
|
|
61
|
-
kind: "byName",
|
|
62
|
-
name: propertyName,
|
|
63
|
-
});
|
|
64
|
-
if (DEBUG) {
|
|
65
|
-
console.log("[getDeclaredPropertyType]", propertyName, "TypeSystem returned:", memberType);
|
|
66
|
-
}
|
|
67
|
-
// If TypeSystem returned a valid type (not unknownType), use it
|
|
68
|
-
if (memberType.kind !== "unknownType") {
|
|
69
|
-
return memberType;
|
|
70
|
-
}
|
|
71
|
-
// Fall through to Binding fallback
|
|
72
|
-
}
|
|
73
|
-
// Fallback: Use Binding for inherited members not in TypeRegistry
|
|
74
|
-
// (e.g., Array.Length from Array$instance)
|
|
75
|
-
const fallbackResult = getDeclaredPropertyTypeFallback(node, ctx);
|
|
76
|
-
if (DEBUG) {
|
|
77
|
-
console.log("[getDeclaredPropertyType]", propertyName, "fallback returned:", fallbackResult);
|
|
78
|
-
}
|
|
79
|
-
return fallbackResult;
|
|
80
|
-
};
|
|
81
|
-
/**
|
|
82
|
-
* Normalize a receiver type for computed access classification.
|
|
83
|
-
*
|
|
84
|
-
* This supports common TS shapes that appear at runtime:
|
|
85
|
-
* - Nullish unions (`T | undefined` / `T | null | undefined`)
|
|
86
|
-
* - tsbindgen-style intersection views (`T$instance & __T$views`, and primitives like
|
|
87
|
-
* `string & String$instance & __String$views`)
|
|
88
|
-
*
|
|
89
|
-
* The goal is to preserve deterministic proof behavior without heuristics.
|
|
90
|
-
*/
|
|
91
|
-
const normalizeForComputedAccess = (type) => {
|
|
92
|
-
if (!type)
|
|
93
|
-
return undefined;
|
|
94
|
-
if (type.kind === "unionType") {
|
|
95
|
-
const nonNullish = type.types.filter((t) => !(t.kind === "primitiveType" &&
|
|
96
|
-
(t.name === "null" || t.name === "undefined")));
|
|
97
|
-
if (nonNullish.length === 1) {
|
|
98
|
-
const only = nonNullish[0];
|
|
99
|
-
return only ? normalizeForComputedAccess(only) : undefined;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
if (type.kind === "intersectionType") {
|
|
103
|
-
const pick = type.types.find((t) => t.kind === "arrayType") ??
|
|
104
|
-
type.types.find((t) => t.kind === "dictionaryType") ??
|
|
105
|
-
type.types.find((t) => t.kind === "primitiveType" && t.name === "string") ??
|
|
106
|
-
type.types.find((t) => t.kind === "referenceType");
|
|
107
|
-
return pick ? normalizeForComputedAccess(pick) : type;
|
|
108
|
-
}
|
|
109
|
-
return type;
|
|
110
|
-
};
|
|
111
|
-
/**
|
|
112
|
-
* Classify computed member access for proof pass.
|
|
113
|
-
* This determines whether Int32 proof is required for the index.
|
|
114
|
-
*
|
|
115
|
-
* Classification is based on IR type kinds, NOT string matching.
|
|
116
|
-
* CLR indexers (arrays, List<T>, etc.) require Int32 proof for indices.
|
|
117
|
-
*
|
|
118
|
-
* IMPORTANT: If classification cannot be determined reliably for a CLR-bound
|
|
119
|
-
* reference type, we conservatively assume `clrIndexer` (requires Int32 proof).
|
|
120
|
-
* This is safer than allowing arbitrary dictionary access without proof.
|
|
121
|
-
*
|
|
122
|
-
* @param objectType - The inferred type of the object being accessed
|
|
123
|
-
* @returns The access kind classification
|
|
124
|
-
*/
|
|
125
|
-
const classifyComputedAccess = (objectType, ctx) => {
|
|
126
|
-
const normalized = normalizeForComputedAccess(objectType);
|
|
127
|
-
if (!normalized)
|
|
128
|
-
return "unknown";
|
|
129
|
-
objectType = normalized;
|
|
130
|
-
// TypeScript array type (number[], T[], etc.)
|
|
131
|
-
// Requires Int32 proof
|
|
132
|
-
if (objectType.kind === "arrayType") {
|
|
133
|
-
return "clrIndexer";
|
|
134
|
-
}
|
|
135
|
-
// IR dictionary type - this is the PRIMARY way to detect dictionaries
|
|
136
|
-
// tsbindgen should emit dictionaryType for Record<K,V> and {[key: K]: V}
|
|
137
|
-
if (objectType.kind === "dictionaryType") {
|
|
138
|
-
return "dictionary";
|
|
139
|
-
}
|
|
140
|
-
// String character access: string[int]
|
|
141
|
-
if (objectType.kind === "primitiveType" && objectType.name === "string") {
|
|
142
|
-
return "stringChar";
|
|
143
|
-
}
|
|
144
|
-
if (objectType.kind === "referenceType") {
|
|
145
|
-
const indexer = ctx.typeSystem.getIndexerInfo(objectType);
|
|
146
|
-
if (!indexer)
|
|
147
|
-
return "clrIndexer";
|
|
148
|
-
return indexer.keyClrType === "System.Int32" ? "clrIndexer" : "dictionary";
|
|
149
|
-
}
|
|
150
|
-
return "unknown";
|
|
151
|
-
};
|
|
152
|
-
/**
|
|
153
|
-
* Extract the type name from an inferred type for binding lookup.
|
|
154
|
-
* Handles tsbindgen's naming convention where instance types are suffixed with $instance
|
|
155
|
-
* (e.g., List_1$instance → List_1 for binding lookup)
|
|
156
|
-
*
|
|
157
|
-
* Also handles intersection types like `TypeName$instance & __TypeName$views`
|
|
158
|
-
* which are common in tsbindgen-generated types. In this case, we look for
|
|
159
|
-
* the $instance member and extract the type name from it.
|
|
160
|
-
*/
|
|
161
|
-
const extractTypeName = (inferredType) => {
|
|
162
|
-
if (!inferredType)
|
|
163
|
-
return undefined;
|
|
164
|
-
// Handle common nullish unions like `Uri | undefined` by stripping null/undefined.
|
|
165
|
-
// This enables CLR member binding after explicit null checks in source code.
|
|
166
|
-
if (inferredType.kind === "unionType") {
|
|
167
|
-
const nonNullish = inferredType.types.filter((t) => !(t.kind === "primitiveType" &&
|
|
168
|
-
(t.name === "null" || t.name === "undefined")));
|
|
169
|
-
if (nonNullish.length === 1) {
|
|
170
|
-
const only = nonNullish[0];
|
|
171
|
-
return only ? extractTypeName(only) : undefined;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// Handle primitive types - map to their CLR type names for binding lookup
|
|
175
|
-
// This enables binding resolution for methods like string.Split(), number.ToString()
|
|
176
|
-
if (inferredType.kind === "primitiveType") {
|
|
177
|
-
switch (inferredType.name) {
|
|
178
|
-
case "string":
|
|
179
|
-
return "String"; // System.String
|
|
180
|
-
case "number":
|
|
181
|
-
return "Double"; // System.Double (TS number is double)
|
|
182
|
-
case "boolean":
|
|
183
|
-
return "Boolean"; // System.Boolean
|
|
184
|
-
case "char":
|
|
185
|
-
return "Char"; // System.Char
|
|
186
|
-
default:
|
|
187
|
-
return undefined;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
// Handle literal types - determine the CLR type from the value type
|
|
191
|
-
// This enables binding resolution for string literals like "hello".Split(" ")
|
|
192
|
-
if (inferredType.kind === "literalType") {
|
|
193
|
-
const valueType = typeof inferredType.value;
|
|
194
|
-
switch (valueType) {
|
|
195
|
-
case "string":
|
|
196
|
-
return "String"; // System.String
|
|
197
|
-
case "number":
|
|
198
|
-
return "Double"; // System.Double
|
|
199
|
-
case "boolean":
|
|
200
|
-
return "Boolean"; // System.Boolean
|
|
201
|
-
default:
|
|
202
|
-
return undefined;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
if (inferredType.kind === "referenceType") {
|
|
206
|
-
const name = inferredType.name;
|
|
207
|
-
// Strip $instance suffix from tsbindgen-generated type names
|
|
208
|
-
// e.g., "List_1$instance" → "List_1" for binding lookup
|
|
209
|
-
if (name.endsWith("$instance")) {
|
|
210
|
-
return name.slice(0, -"$instance".length);
|
|
211
|
-
}
|
|
212
|
-
return name;
|
|
213
|
-
}
|
|
214
|
-
// Handle intersection types: TypeName$instance & __TypeName$views
|
|
215
|
-
// This happens when TypeScript expands a type alias to its underlying intersection
|
|
216
|
-
// during property access (e.g., listener.prefixes returns HttpListenerPrefixCollection
|
|
217
|
-
// which is HttpListenerPrefixCollection$instance & __HttpListenerPrefixCollection$views)
|
|
218
|
-
if (inferredType.kind === "intersectionType") {
|
|
219
|
-
// Look for a member that ends with $instance - that's the main type
|
|
220
|
-
for (const member of inferredType.types) {
|
|
221
|
-
if (member.kind === "referenceType" &&
|
|
222
|
-
member.name.endsWith("$instance")) {
|
|
223
|
-
// Found the $instance member, strip the suffix to get the type name
|
|
224
|
-
return member.name.slice(0, -"$instance".length);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
// Fallback: look for any referenceType that's not a $views type
|
|
228
|
-
for (const member of inferredType.types) {
|
|
229
|
-
if (member.kind === "referenceType" &&
|
|
230
|
-
!member.name.startsWith("__") &&
|
|
231
|
-
!member.name.endsWith("$views")) {
|
|
232
|
-
return member.name;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
return undefined;
|
|
237
|
-
};
|
|
238
|
-
/**
|
|
239
|
-
* Resolve hierarchical binding for a member access
|
|
240
|
-
* Handles namespace.type, type.member, directType.member, and instance.member patterns
|
|
241
|
-
*/
|
|
242
|
-
const resolveHierarchicalBinding = (object, propertyName, ctx) => {
|
|
243
|
-
const registry = ctx.bindings;
|
|
244
|
-
const toIrMemberBinding = (overloads) => {
|
|
245
|
-
const first = overloads[0];
|
|
246
|
-
if (!first)
|
|
247
|
-
return undefined;
|
|
248
|
-
const getTargetKey = (m) => `${m.binding.assembly}:${m.binding.type}::${m.binding.member}`;
|
|
249
|
-
const targetKey = getTargetKey(first);
|
|
250
|
-
if (overloads.some((m) => getTargetKey(m) !== targetKey)) {
|
|
251
|
-
// Unsafe: overloads map to different CLR targets.
|
|
252
|
-
return undefined;
|
|
253
|
-
}
|
|
254
|
-
const getModifiersKey = (m) => {
|
|
255
|
-
const mods = m.parameterModifiers ?? [];
|
|
256
|
-
if (mods.length === 0)
|
|
257
|
-
return "";
|
|
258
|
-
return [...mods]
|
|
259
|
-
.slice()
|
|
260
|
-
.sort((a, b) => a.index - b.index)
|
|
261
|
-
.map((mod) => `${mod.index}:${mod.modifier}`)
|
|
262
|
-
.join(",");
|
|
263
|
-
};
|
|
264
|
-
const modsKey = getModifiersKey(first);
|
|
265
|
-
const modsConsistent = overloads.every((m) => getModifiersKey(m) === modsKey);
|
|
266
|
-
return {
|
|
267
|
-
assembly: first.binding.assembly,
|
|
268
|
-
type: first.binding.type,
|
|
269
|
-
member: first.binding.member,
|
|
270
|
-
// IMPORTANT: Only attach parameterModifiers if consistent across all overloads.
|
|
271
|
-
// Overloads can differ in ref/out/in, and those must be selected at call time.
|
|
272
|
-
parameterModifiers: modsConsistent &&
|
|
273
|
-
first.parameterModifiers &&
|
|
274
|
-
first.parameterModifiers.length > 0
|
|
275
|
-
? first.parameterModifiers
|
|
276
|
-
: undefined,
|
|
277
|
-
isExtensionMethod: first.isExtensionMethod,
|
|
278
|
-
};
|
|
279
|
-
};
|
|
280
|
-
// Case 1: object is identifier → check if it's a namespace, then check if property is a type
|
|
281
|
-
if (object.kind === "identifier") {
|
|
282
|
-
const namespace = registry.getNamespace(object.name);
|
|
283
|
-
if (namespace) {
|
|
284
|
-
// Found namespace binding, check if property is a type within this namespace
|
|
285
|
-
// Note: After schema swap, we look up by alias (TS identifier)
|
|
286
|
-
const type = namespace.types.find((t) => t.alias === propertyName);
|
|
287
|
-
if (type) {
|
|
288
|
-
// This member access is namespace.type - we don't emit a member binding here
|
|
289
|
-
// because we're just accessing a type, not calling a member
|
|
290
|
-
return undefined;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
// Case 1b: object is a direct type import (like `Console` imported directly)
|
|
294
|
-
// Check if the identifier is a type alias, and if so, look up the member
|
|
295
|
-
// First try by local name, then by original name (handles aliased imports like `import { String as ClrString }`)
|
|
296
|
-
const directType = registry.getType(object.name) ??
|
|
297
|
-
(object.originalName ? registry.getType(object.originalName) : undefined);
|
|
298
|
-
if (directType) {
|
|
299
|
-
const overloads = registry.getMemberOverloads(directType.alias, propertyName);
|
|
300
|
-
if (!overloads || overloads.length === 0)
|
|
301
|
-
return undefined;
|
|
302
|
-
return toIrMemberBinding(overloads);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
// Case 2: object is member expression with a type reference → check if property is a member
|
|
306
|
-
if (object.kind === "memberAccess" && !object.isComputed) {
|
|
307
|
-
// Walk up the chain to find if this is a type reference
|
|
308
|
-
// For systemLinq.enumerable, the object is "systemLinq" and property is "enumerable"
|
|
309
|
-
if (object.object.kind === "identifier") {
|
|
310
|
-
const namespace = registry.getNamespace(object.object.name);
|
|
311
|
-
if (namespace && typeof object.property === "string") {
|
|
312
|
-
const type = namespace.types.find((t) => t.alias === object.property);
|
|
313
|
-
if (type) {
|
|
314
|
-
// The object is a type reference (namespace.type), now check if property is a member
|
|
315
|
-
const overloads = registry.getMemberOverloads(type.alias, propertyName);
|
|
316
|
-
if (!overloads || overloads.length === 0)
|
|
317
|
-
return undefined;
|
|
318
|
-
return toIrMemberBinding(overloads);
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
// Case 3: Instance member access (e.g., numbers.add where numbers is List<T>)
|
|
324
|
-
// Use the object's inferred type to look up the member binding
|
|
325
|
-
const objectTypeName = extractTypeName(object.inferredType);
|
|
326
|
-
if (objectTypeName) {
|
|
327
|
-
// Look up member by type alias and property name
|
|
328
|
-
const overloads = registry.getMemberOverloads(objectTypeName, propertyName);
|
|
329
|
-
if (!overloads || overloads.length === 0)
|
|
330
|
-
return undefined;
|
|
331
|
-
return toIrMemberBinding(overloads);
|
|
332
|
-
}
|
|
333
|
-
return undefined;
|
|
334
|
-
};
|
|
335
|
-
const findNearestBindingsJson = (filePath) => {
|
|
336
|
-
let currentDir = dirname(filePath);
|
|
337
|
-
while (true) {
|
|
338
|
-
const candidate = join(currentDir, "bindings.json");
|
|
339
|
-
if (existsSync(candidate))
|
|
340
|
-
return candidate;
|
|
341
|
-
const parentDir = dirname(currentDir);
|
|
342
|
-
if (parentDir === currentDir)
|
|
343
|
-
return undefined;
|
|
344
|
-
currentDir = parentDir;
|
|
345
|
-
}
|
|
346
|
-
};
|
|
347
|
-
const disambiguateOverloadsByDeclaringType = (overloads, memberId, declaringTypeTsName, ctx) => {
|
|
348
|
-
const declSourceFilePath = ctx.binding.getSourceFilePathOfMember(memberId);
|
|
349
|
-
if (!declSourceFilePath)
|
|
350
|
-
return undefined;
|
|
351
|
-
const bindingsPath = findNearestBindingsJson(declSourceFilePath);
|
|
352
|
-
if (!bindingsPath)
|
|
353
|
-
return undefined;
|
|
354
|
-
const raw = (() => {
|
|
355
|
-
try {
|
|
356
|
-
return JSON.parse(readFileSync(bindingsPath, "utf8"));
|
|
357
|
-
}
|
|
358
|
-
catch {
|
|
359
|
-
return undefined;
|
|
360
|
-
}
|
|
361
|
-
})();
|
|
362
|
-
if (!raw || typeof raw !== "object")
|
|
363
|
-
return undefined;
|
|
364
|
-
const types = raw.types;
|
|
365
|
-
if (!Array.isArray(types))
|
|
366
|
-
return undefined;
|
|
367
|
-
const typeEntry = types.find((t) => {
|
|
368
|
-
if (!t || typeof t !== "object")
|
|
369
|
-
return false;
|
|
370
|
-
const clrName = t.clrName;
|
|
371
|
-
if (typeof clrName !== "string")
|
|
372
|
-
return false;
|
|
373
|
-
return tsbindgenClrTypeNameToTsTypeName(clrName) === declaringTypeTsName;
|
|
374
|
-
});
|
|
375
|
-
const expectedClrType = typeEntry && typeof typeEntry.clrName === "string"
|
|
376
|
-
? typeEntry.clrName
|
|
377
|
-
: undefined;
|
|
378
|
-
if (!expectedClrType)
|
|
379
|
-
return undefined;
|
|
380
|
-
const filtered = overloads.filter((m) => m.binding.type === expectedClrType);
|
|
381
|
-
return filtered.length > 0 ? filtered : undefined;
|
|
382
|
-
};
|
|
383
|
-
/**
|
|
384
|
-
* Resolve hierarchical binding for a member access using Binding-resolved MemberId.
|
|
385
|
-
*
|
|
386
|
-
* This is a fallback for cases where the receiver's inferredType is unavailable
|
|
387
|
-
* (e.g., local variable typing inferred from a complex initializer), but TS can
|
|
388
|
-
* still resolve the member symbol deterministically.
|
|
389
|
-
*
|
|
390
|
-
* Critical use case: CLR property casing (e.g., `.expression` → `.Expression`).
|
|
391
|
-
*/
|
|
392
|
-
const resolveHierarchicalBindingFromMemberId = (node, propertyName, ctx) => {
|
|
393
|
-
const memberId = ctx.binding.resolvePropertyAccess(node);
|
|
394
|
-
if (!memberId)
|
|
395
|
-
return undefined;
|
|
396
|
-
const declaringTypeName = ctx.binding.getDeclaringTypeNameOfMember(memberId);
|
|
397
|
-
if (!declaringTypeName)
|
|
398
|
-
return undefined;
|
|
399
|
-
const normalizeDeclaringType = (name) => {
|
|
400
|
-
if (name.endsWith("$instance"))
|
|
401
|
-
return name.slice(0, -"$instance".length);
|
|
402
|
-
if (name.startsWith("__") && name.endsWith("$views")) {
|
|
403
|
-
return name.slice("__".length, -"$views".length);
|
|
404
|
-
}
|
|
405
|
-
return name;
|
|
406
|
-
};
|
|
407
|
-
const typeAlias = normalizeDeclaringType(declaringTypeName);
|
|
408
|
-
let overloadsAll = ctx.bindings.getMemberOverloads(typeAlias, propertyName);
|
|
409
|
-
if (!overloadsAll || overloadsAll.length === 0) {
|
|
410
|
-
const declSourceFilePath = ctx.binding.getSourceFilePathOfMember(memberId);
|
|
411
|
-
const bindingsPath = declSourceFilePath !== undefined
|
|
412
|
-
? findNearestBindingsJson(declSourceFilePath)
|
|
413
|
-
: undefined;
|
|
414
|
-
// Airplane-grade: If we can locate the bindings.json that corresponds to the
|
|
415
|
-
// tsbindgen declaration, load it on-demand and retry. This avoids relying on
|
|
416
|
-
// "import closure" heuristics and ensures CLR binding lookup is based on the
|
|
417
|
-
// declaration’s actual owning bindings.json.
|
|
418
|
-
if (bindingsPath) {
|
|
419
|
-
loadBindingsFromPath(ctx.bindings, bindingsPath);
|
|
420
|
-
overloadsAll = ctx.bindings.getMemberOverloads(typeAlias, propertyName);
|
|
421
|
-
}
|
|
422
|
-
// Airplane-grade rule: If this member resolves to a tsbindgen declaration,
|
|
423
|
-
// we MUST have a CLR binding; we must never guess member names via naming policy.
|
|
424
|
-
//
|
|
425
|
-
// We treat it as CLR-bound if:
|
|
426
|
-
// - The declaring type is a tsbindgen extension interface (`__Ext_*`), OR
|
|
427
|
-
// - We can locate a bindings.json near the declaration source file.
|
|
428
|
-
const isClrBound = declaringTypeName.startsWith("__Ext_") || bindingsPath !== undefined;
|
|
429
|
-
if (isClrBound && (!overloadsAll || overloadsAll.length === 0)) {
|
|
430
|
-
ctx.diagnostics.push(createDiagnostic("TSN4004", "error", `Missing CLR binding for '${typeAlias}.${propertyName}'.`, getSourceSpan(node), bindingsPath
|
|
431
|
-
? `No matching member binding was found in the loaded bindings for this tsbindgen declaration. (bindings.json: ${bindingsPath})`
|
|
432
|
-
: "No matching member binding was found for this tsbindgen extension interface member."));
|
|
433
|
-
}
|
|
434
|
-
return undefined;
|
|
435
|
-
}
|
|
436
|
-
let overloads = overloadsAll;
|
|
437
|
-
const targetKeys = new Set(overloads.map((m) => `${m.binding.assembly}:${m.binding.type}::${m.binding.member}`));
|
|
438
|
-
if (targetKeys.size > 1) {
|
|
439
|
-
const disambiguated = disambiguateOverloadsByDeclaringType(overloads, memberId, typeAlias, ctx);
|
|
440
|
-
if (disambiguated) {
|
|
441
|
-
overloads = disambiguated;
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
const first = overloads[0];
|
|
445
|
-
if (!first)
|
|
446
|
-
return undefined;
|
|
447
|
-
const targetKey = `${first.binding.assembly}:${first.binding.type}::${first.binding.member}`;
|
|
448
|
-
if (overloads.some((m) => `${m.binding.assembly}:${m.binding.type}::${m.binding.member}` !==
|
|
449
|
-
targetKey)) {
|
|
450
|
-
const declSourceFilePath = ctx.binding.getSourceFilePathOfMember(memberId);
|
|
451
|
-
const bindingsPath = declSourceFilePath !== undefined
|
|
452
|
-
? findNearestBindingsJson(declSourceFilePath)
|
|
453
|
-
: undefined;
|
|
454
|
-
// Only treat this as a CLR ambiguity when we can locate a bindings.json near the
|
|
455
|
-
// TS declaration source (tsbindgen packages). Otherwise, fall back to "no binding"
|
|
456
|
-
// and let local codepaths handle naming policy.
|
|
457
|
-
if (bindingsPath) {
|
|
458
|
-
const targets = [
|
|
459
|
-
...new Set(overloads.map((m) => `${m.binding.type}.${m.binding.member}`)),
|
|
460
|
-
]
|
|
461
|
-
.sort()
|
|
462
|
-
.join(", ");
|
|
463
|
-
ctx.diagnostics.push(createDiagnostic("TSN4003", "error", `Ambiguous CLR binding for '${typeAlias}.${propertyName}'. Multiple CLR targets found: ${targets}.`, getSourceSpan(node), `This usually indicates multiple tsbindgen packages export the same TS type/member alias. Ensure the correct package is imported, or regenerate bindings to avoid collisions. (bindings.json: ${bindingsPath})`));
|
|
464
|
-
}
|
|
465
|
-
return undefined;
|
|
466
|
-
}
|
|
467
|
-
const getModifiersKey = (m) => {
|
|
468
|
-
const mods = m.parameterModifiers ?? [];
|
|
469
|
-
if (mods.length === 0)
|
|
470
|
-
return "";
|
|
471
|
-
return [...mods]
|
|
472
|
-
.slice()
|
|
473
|
-
.sort((a, b) => a.index - b.index)
|
|
474
|
-
.map((mod) => `${mod.index}:${mod.modifier}`)
|
|
475
|
-
.join(",");
|
|
476
|
-
};
|
|
477
|
-
const modsKey = getModifiersKey(first);
|
|
478
|
-
const modsConsistent = overloads.every((m) => getModifiersKey(m) === modsKey);
|
|
479
|
-
return {
|
|
480
|
-
assembly: first.binding.assembly,
|
|
481
|
-
type: first.binding.type,
|
|
482
|
-
member: first.binding.member,
|
|
483
|
-
parameterModifiers: modsConsistent &&
|
|
484
|
-
first.parameterModifiers &&
|
|
485
|
-
first.parameterModifiers.length > 0
|
|
486
|
-
? first.parameterModifiers
|
|
487
|
-
: undefined,
|
|
488
|
-
isExtensionMethod: first.isExtensionMethod,
|
|
489
|
-
};
|
|
490
|
-
};
|
|
491
|
-
/**
|
|
492
|
-
* Resolve instance-style extension method bindings from tsbindgen's `ExtensionMethods` typing.
|
|
493
|
-
*
|
|
494
|
-
* tsbindgen emits extension methods as interface members on `__Ext_*` types, and users
|
|
495
|
-
* opt in via `ExtensionMethods<TShape>`. At runtime those members do not exist, so we
|
|
496
|
-
* must attach the underlying CLR binding so the emitter can lower the call to an
|
|
497
|
-
* explicit static invocation.
|
|
498
|
-
*/
|
|
499
|
-
const resolveExtensionMethodsBinding = (node, propertyName, ctx) => {
|
|
500
|
-
const memberId = ctx.binding.resolvePropertyAccess(node);
|
|
501
|
-
if (!memberId)
|
|
502
|
-
return undefined;
|
|
503
|
-
const declaringTypeName = ctx.binding.getDeclaringTypeNameOfMember(memberId);
|
|
504
|
-
if (!declaringTypeName)
|
|
505
|
-
return undefined;
|
|
506
|
-
const callArgumentCount = (() => {
|
|
507
|
-
const parent = node.parent;
|
|
508
|
-
if (ts.isCallExpression(parent) && parent.expression === node) {
|
|
509
|
-
return parent.arguments.length;
|
|
510
|
-
}
|
|
511
|
-
return undefined;
|
|
512
|
-
})();
|
|
513
|
-
// Debug/diagnostic context for airplane-grade failures.
|
|
514
|
-
// These are populated during resolution and surfaced only if resolution fails.
|
|
515
|
-
let sigDeclaringTypeNameForError;
|
|
516
|
-
let namespaceKeyForError;
|
|
517
|
-
let receiverTypeNameForError;
|
|
518
|
-
const resolved = (() => {
|
|
519
|
-
const parent = node.parent;
|
|
520
|
-
if (!ts.isCallExpression(parent) || parent.expression !== node)
|
|
521
|
-
return undefined;
|
|
522
|
-
const sigId = ctx.binding.resolveCallSignature(parent);
|
|
523
|
-
if (!sigId)
|
|
524
|
-
return undefined;
|
|
525
|
-
// IMPORTANT (airplane-grade): the same TS member name can exist in multiple extension
|
|
526
|
-
// namespaces (e.g., BCL async LINQ and EF Core both define ToArrayAsync). When the
|
|
527
|
-
// receiver expression is not an identifier, `resolvePropertyAccess` can key the member
|
|
528
|
-
// entry off the member symbol itself, which merges declarations. Always anchor to the
|
|
529
|
-
// resolved signature’s declaring type to choose the correct CLR extension binding.
|
|
530
|
-
const sigDeclaringTypeName = ctx.binding.getDeclaringTypeNameOfSignature(sigId);
|
|
531
|
-
sigDeclaringTypeNameForError = sigDeclaringTypeName;
|
|
532
|
-
if (!sigDeclaringTypeName)
|
|
533
|
-
return undefined;
|
|
534
|
-
// Legacy tsbindgen format: extension methods emitted on `__Ext_*` bucket interfaces.
|
|
535
|
-
if (sigDeclaringTypeName.startsWith("__Ext_")) {
|
|
536
|
-
return ctx.bindings.resolveExtensionMethod(sigDeclaringTypeName, propertyName, callArgumentCount);
|
|
537
|
-
}
|
|
538
|
-
// New format: extension methods emitted on method-table interfaces:
|
|
539
|
-
// interface __TsonicExtMethods_System_Linq { Where(this: IQueryable_1<T>, ...): ... }
|
|
540
|
-
if (sigDeclaringTypeName.startsWith("__TsonicExtMethods_")) {
|
|
541
|
-
const namespaceKey = sigDeclaringTypeName.slice("__TsonicExtMethods_".length);
|
|
542
|
-
namespaceKeyForError = namespaceKey;
|
|
543
|
-
if (!namespaceKey)
|
|
544
|
-
return undefined;
|
|
545
|
-
const thisTypeNode = ctx.binding.getThisTypeNodeOfSignature(sigId);
|
|
546
|
-
if (!thisTypeNode)
|
|
547
|
-
return undefined;
|
|
548
|
-
const extractReceiverTypeName = (typeNode) => {
|
|
549
|
-
let current = typeNode;
|
|
550
|
-
while (ts.isParenthesizedTypeNode(current))
|
|
551
|
-
current = current.type;
|
|
552
|
-
if (ts.isTypeReferenceNode(current)) {
|
|
553
|
-
const tn = current.typeName;
|
|
554
|
-
if (ts.isIdentifier(tn))
|
|
555
|
-
return tn.text;
|
|
556
|
-
if (ts.isQualifiedName(tn))
|
|
557
|
-
return tn.right.text;
|
|
558
|
-
}
|
|
559
|
-
return undefined;
|
|
560
|
-
};
|
|
561
|
-
const receiverTypeName = extractReceiverTypeName(thisTypeNode);
|
|
562
|
-
receiverTypeNameForError = receiverTypeName;
|
|
563
|
-
if (!receiverTypeName)
|
|
564
|
-
return undefined;
|
|
565
|
-
return ctx.bindings.resolveExtensionMethodByKey(namespaceKey, receiverTypeName, propertyName, callArgumentCount);
|
|
566
|
-
}
|
|
567
|
-
return undefined;
|
|
568
|
-
})();
|
|
569
|
-
if (!resolved) {
|
|
570
|
-
// Airplane-grade: if the TS surface indicates this member comes from an extension-method
|
|
571
|
-
// module, failing to attach a CLR binding would emit an instance call that cannot exist
|
|
572
|
-
// at runtime. Treat as a hard error rather than miscompiling.
|
|
573
|
-
if (declaringTypeName.startsWith("__Ext_") ||
|
|
574
|
-
declaringTypeName.startsWith("__TsonicExtMethods_")) {
|
|
575
|
-
const detail = [
|
|
576
|
-
sigDeclaringTypeNameForError
|
|
577
|
-
? `Resolved signature declares: '${sigDeclaringTypeNameForError}'.`
|
|
578
|
-
: "Resolved signature declaring type: <unknown>.",
|
|
579
|
-
namespaceKeyForError
|
|
580
|
-
? `Namespace key: '${namespaceKeyForError}'.`
|
|
581
|
-
: "Namespace key: <unknown>.",
|
|
582
|
-
receiverTypeNameForError
|
|
583
|
-
? `Receiver type: '${receiverTypeNameForError}'.`
|
|
584
|
-
: "Receiver type: <unknown>.",
|
|
585
|
-
].join(" ");
|
|
586
|
-
ctx.diagnostics.push(createDiagnostic("TSN4004", "error", `Failed to resolve CLR extension-method binding for '${propertyName}' on '${declaringTypeName}'. ${detail}`, getSourceSpan(node), "This indicates a mismatch between the generated .d.ts surface and bindings.json extension metadata. Regenerate bindings and ensure the correct packages are installed."));
|
|
587
|
-
}
|
|
588
|
-
return undefined;
|
|
589
|
-
}
|
|
590
|
-
// tsbindgen parameterModifiers indices include the extension receiver at index 0.
|
|
591
|
-
// For instance-style calls, our call-site arguments exclude the receiver, so shift by -1.
|
|
592
|
-
const shiftedModifiers = resolved.parameterModifiers
|
|
593
|
-
? resolved.parameterModifiers
|
|
594
|
-
.map((m) => ({ index: m.index - 1, modifier: m.modifier }))
|
|
595
|
-
.filter((m) => m.index >= 0)
|
|
596
|
-
: undefined;
|
|
597
|
-
return {
|
|
598
|
-
assembly: resolved.binding.assembly,
|
|
599
|
-
type: resolved.binding.type,
|
|
600
|
-
member: resolved.binding.member,
|
|
601
|
-
parameterModifiers: shiftedModifiers && shiftedModifiers.length > 0
|
|
602
|
-
? shiftedModifiers
|
|
603
|
-
: undefined,
|
|
604
|
-
isExtensionMethod: resolved.isExtensionMethod,
|
|
605
|
-
};
|
|
606
|
-
};
|
|
607
|
-
/**
|
|
608
|
-
* Derive element type from object type for element access.
|
|
609
|
-
* - Array type → element type
|
|
610
|
-
* - Dictionary type → value type
|
|
611
|
-
* - String → string (single character)
|
|
612
|
-
* - Other → undefined
|
|
613
|
-
*/
|
|
614
|
-
const deriveElementType = (objectType, ctx) => {
|
|
615
|
-
objectType = normalizeForComputedAccess(objectType);
|
|
616
|
-
if (!objectType)
|
|
617
|
-
return undefined;
|
|
618
|
-
if (objectType.kind === "arrayType") {
|
|
619
|
-
return objectType.elementType;
|
|
620
|
-
}
|
|
621
|
-
if (objectType.kind === "dictionaryType") {
|
|
622
|
-
return objectType.valueType;
|
|
623
|
-
}
|
|
624
|
-
if (objectType.kind === "primitiveType" && objectType.name === "string") {
|
|
625
|
-
// string[n] returns a single character (string in TS, char in C#)
|
|
626
|
-
return { kind: "primitiveType", name: "string" };
|
|
627
|
-
}
|
|
628
|
-
if (objectType.kind === "referenceType" &&
|
|
629
|
-
objectType.name === "Span" &&
|
|
630
|
-
objectType.typeArguments &&
|
|
631
|
-
objectType.typeArguments.length === 1) {
|
|
632
|
-
return objectType.typeArguments[0];
|
|
633
|
-
}
|
|
634
|
-
if (objectType.kind === "referenceType") {
|
|
635
|
-
return ctx.typeSystem.getIndexerInfo(objectType)?.valueType;
|
|
636
|
-
}
|
|
637
|
-
return undefined;
|
|
638
|
-
};
|
|
639
|
-
/**
|
|
640
|
-
* Convert property access or element access expression
|
|
641
|
-
*/
|
|
642
|
-
export const convertMemberExpression = (node, ctx) => {
|
|
643
|
-
const isOptional = node.questionDotToken !== undefined;
|
|
644
|
-
const sourceSpan = getSourceSpan(node);
|
|
645
|
-
if (ts.isPropertyAccessExpression(node)) {
|
|
646
|
-
const object = convertExpression(node.expression, ctx, undefined);
|
|
647
|
-
const propertyName = node.name.text;
|
|
648
|
-
// Try to resolve hierarchical binding
|
|
649
|
-
const memberBinding = resolveExtensionMethodsBinding(node, propertyName, ctx) ??
|
|
650
|
-
resolveHierarchicalBindingFromMemberId(node, propertyName, ctx) ??
|
|
651
|
-
resolveHierarchicalBinding(object, propertyName, ctx);
|
|
652
|
-
// DETERMINISTIC TYPING: Property type comes from NominalEnv + TypeRegistry for
|
|
653
|
-
// user-defined types (including inherited members), with fallback to Binding layer
|
|
654
|
-
// for built-ins and CLR types.
|
|
655
|
-
//
|
|
656
|
-
// The receiver's inferredType enables NominalEnv to walk inheritance chains
|
|
657
|
-
// and substitute type parameters correctly for inherited generic members.
|
|
658
|
-
//
|
|
659
|
-
// Built-ins like string.length work because globals declare them with proper types.
|
|
660
|
-
// If getDeclaredPropertyType returns undefined, it means the property declaration
|
|
661
|
-
// is missing - use unknownType as poison so validation can emit TSN5203.
|
|
662
|
-
//
|
|
663
|
-
// EXCEPTION: If memberBinding exists AND declaredType is undefined, return undefined.
|
|
664
|
-
// This handles pure CLR-bound methods like Console.WriteLine that have no TS declaration.
|
|
665
|
-
const declaredType = getDeclaredPropertyType(node, object.inferredType, ctx);
|
|
666
|
-
// Hierarchical bindings: namespace.type is a static type reference, not a runtime
|
|
667
|
-
// value. When this pattern is present in the binding manifest, avoid poisoning the
|
|
668
|
-
// receiver with unknownType; the emitter uses "no inferredType" to classify the
|
|
669
|
-
// receiver as a static type, enabling global::Type.Member emission.
|
|
670
|
-
const isNamespaceTypeReference = object.kind === "identifier" &&
|
|
671
|
-
ctx.bindings
|
|
672
|
-
.getNamespace(object.name)
|
|
673
|
-
?.types.some((t) => t.alias === propertyName) === true;
|
|
674
|
-
// DETERMINISTIC TYPING: Set inferredType for validation passes (like numeric proof).
|
|
675
|
-
// The emitter uses memberBinding separately for C# casing (e.g., length -> Length).
|
|
676
|
-
//
|
|
677
|
-
// Priority order for inferredType:
|
|
678
|
-
// 1. If declaredType exists, use it (covers built-ins like string.length -> int)
|
|
679
|
-
// 2. If memberBinding exists but no declaredType, use undefined (pure CLR-bound)
|
|
680
|
-
// 3. Otherwise, poison with unknownType for validation (TSN5203)
|
|
681
|
-
//
|
|
682
|
-
// Note: Both memberBinding AND inferredType can be set - they serve different purposes:
|
|
683
|
-
// - memberBinding: used by emitter for C# member names
|
|
684
|
-
// - inferredType: used by validation passes for type checking
|
|
685
|
-
//
|
|
686
|
-
// Class fields without explicit type annotations will emit TSN5203.
|
|
687
|
-
// Users must add explicit types like `count: int = 0` instead of `count = 0`.
|
|
688
|
-
const propertyInferredType = declaredType
|
|
689
|
-
? declaredType
|
|
690
|
-
: isNamespaceTypeReference
|
|
691
|
-
? undefined
|
|
692
|
-
: memberBinding
|
|
693
|
-
? undefined
|
|
694
|
-
: { kind: "unknownType" };
|
|
695
|
-
return {
|
|
696
|
-
kind: "memberAccess",
|
|
697
|
-
object,
|
|
698
|
-
property: propertyName,
|
|
699
|
-
isComputed: false,
|
|
700
|
-
isOptional,
|
|
701
|
-
inferredType: propertyInferredType,
|
|
702
|
-
sourceSpan,
|
|
703
|
-
memberBinding,
|
|
704
|
-
};
|
|
705
|
-
}
|
|
706
|
-
else {
|
|
707
|
-
// Element access (computed): obj[expr]
|
|
708
|
-
const object = convertExpression(node.expression, ctx, undefined);
|
|
709
|
-
// DETERMINISTIC TYPING: Use object's inferredType (not getInferredType)
|
|
710
|
-
const objectType = object.inferredType;
|
|
711
|
-
// Classify the access kind for proof pass
|
|
712
|
-
// This determines whether Int32 proof is required for the index
|
|
713
|
-
const accessKind = classifyComputedAccess(objectType, ctx);
|
|
714
|
-
// Derive element type from object type
|
|
715
|
-
const elementType = deriveElementType(objectType, ctx);
|
|
716
|
-
return {
|
|
717
|
-
kind: "memberAccess",
|
|
718
|
-
object,
|
|
719
|
-
property: convertExpression(node.argumentExpression, ctx, undefined),
|
|
720
|
-
isComputed: true,
|
|
721
|
-
isOptional,
|
|
722
|
-
inferredType: elementType,
|
|
723
|
-
sourceSpan,
|
|
724
|
-
accessKind,
|
|
725
|
-
};
|
|
726
|
-
}
|
|
727
|
-
};
|
|
8
|
+
export { convertMemberExpression } from "./access/access-converter.js";
|
|
728
9
|
//# sourceMappingURL=access.js.map
|