@tsonic/emitter 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/adapter-generator.d.ts +5 -15
- package/dist/adapter-generator.d.ts.map +1 -1
- package/dist/adapter-generator.js +60 -53
- package/dist/adapter-generator.js.map +1 -1
- package/dist/contracts/backend-adapter.d.ts +36 -0
- package/dist/contracts/backend-adapter.d.ts.map +1 -0
- package/dist/contracts/backend-adapter.js +9 -0
- package/dist/contracts/backend-adapter.js.map +1 -0
- package/dist/contracts/emitter-contract.d.ts +54 -0
- package/dist/contracts/emitter-contract.d.ts.map +1 -0
- package/dist/contracts/emitter-contract.js +8 -0
- package/dist/contracts/emitter-contract.js.map +1 -0
- package/dist/contracts/import-classifier.d.ts +36 -0
- package/dist/contracts/import-classifier.d.ts.map +1 -0
- package/dist/contracts/import-classifier.js +9 -0
- package/dist/contracts/import-classifier.js.map +1 -0
- package/dist/core/{attributes.d.ts → format/attributes.d.ts} +9 -14
- package/dist/core/format/attributes.d.ts.map +1 -0
- package/dist/core/format/attributes.js +190 -0
- package/dist/core/format/attributes.js.map +1 -0
- package/dist/core/format/attributes.test.d.ts.map +1 -0
- package/dist/core/{attributes.test.js → format/attributes.test.js} +70 -32
- package/dist/core/format/attributes.test.js.map +1 -0
- package/dist/core/format/backend-ast/index.d.ts +7 -0
- package/dist/core/format/backend-ast/index.d.ts.map +1 -0
- package/dist/core/format/backend-ast/index.js +6 -0
- package/dist/core/format/backend-ast/index.js.map +1 -0
- package/dist/core/format/backend-ast/printer.d.ts +33 -0
- package/dist/core/format/backend-ast/printer.d.ts.map +1 -0
- package/dist/core/format/backend-ast/printer.js +1151 -0
- package/dist/core/format/backend-ast/printer.js.map +1 -0
- package/dist/core/format/backend-ast/types.d.ts +504 -0
- package/dist/core/format/backend-ast/types.d.ts.map +1 -0
- package/dist/core/format/backend-ast/types.js +13 -0
- package/dist/core/format/backend-ast/types.js.map +1 -0
- package/dist/core/format/backend-ast/utils.d.ts +26 -0
- package/dist/core/format/backend-ast/utils.d.ts.map +1 -0
- package/dist/core/format/backend-ast/utils.js +65 -0
- package/dist/core/format/backend-ast/utils.js.map +1 -0
- package/dist/core/{exports.d.ts → format/exports.d.ts} +2 -2
- package/dist/core/format/exports.d.ts.map +1 -0
- package/dist/core/format/exports.js +22 -0
- package/dist/core/format/exports.js.map +1 -0
- package/dist/core/format/index.d.ts +9 -0
- package/dist/core/format/index.d.ts.map +1 -0
- package/dist/core/format/index.js +9 -0
- package/dist/core/format/index.js.map +1 -0
- package/dist/core/{local-names.d.ts → format/local-names.d.ts} +1 -1
- package/dist/core/format/local-names.d.ts.map +1 -0
- package/dist/core/{local-names.js → format/local-names.js} +1 -1
- package/dist/core/format/local-names.js.map +1 -0
- package/dist/core/format/module-emitter/assembly.d.ts +27 -0
- package/dist/core/format/module-emitter/assembly.d.ts.map +1 -0
- package/dist/core/format/module-emitter/assembly.js +44 -0
- package/dist/core/format/module-emitter/assembly.js.map +1 -0
- package/dist/core/{module-emitter → format/module-emitter}/header.d.ts +1 -1
- package/dist/core/format/module-emitter/header.d.ts.map +1 -0
- package/dist/core/{module-emitter → format/module-emitter}/header.js +1 -1
- package/dist/core/format/module-emitter/header.js.map +1 -0
- package/dist/core/format/module-emitter/index.d.ts.map +1 -0
- package/dist/core/format/module-emitter/index.js.map +1 -0
- package/dist/core/format/module-emitter/namespace.d.ts +21 -0
- package/dist/core/format/module-emitter/namespace.d.ts.map +1 -0
- package/dist/core/format/module-emitter/namespace.js +58 -0
- package/dist/core/format/module-emitter/namespace.js.map +1 -0
- package/dist/core/{module-emitter → format/module-emitter}/orchestrator.d.ts +1 -1
- package/dist/core/format/module-emitter/orchestrator.d.ts.map +1 -0
- package/dist/core/{module-emitter → format/module-emitter}/orchestrator.js +19 -19
- package/dist/core/format/module-emitter/orchestrator.js.map +1 -0
- package/dist/core/format/module-emitter/separation.d.ts.map +1 -0
- package/dist/core/format/module-emitter/separation.js.map +1 -0
- package/dist/core/{module-emitter → format/module-emitter}/static-container.d.ts +8 -3
- package/dist/core/format/module-emitter/static-container.d.ts.map +1 -0
- package/dist/core/format/module-emitter/static-container.js +202 -0
- package/dist/core/format/module-emitter/static-container.js.map +1 -0
- package/dist/core/format/module-emitter.d.ts.map +1 -0
- package/dist/core/format/module-emitter.js.map +1 -0
- package/dist/core/{options.d.ts → format/options.d.ts} +1 -1
- package/dist/core/format/options.d.ts.map +1 -0
- package/dist/core/format/options.js.map +1 -0
- package/dist/core/index.d.ts +2 -7
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -7
- package/dist/core/index.js.map +1 -1
- package/dist/core/semantic/boolean-context.d.ts +44 -0
- package/dist/core/semantic/boolean-context.d.ts.map +1 -0
- package/dist/core/semantic/boolean-context.js +655 -0
- package/dist/core/semantic/boolean-context.js.map +1 -0
- package/dist/core/semantic/boolean-context.test.d.ts.map +1 -0
- package/dist/core/{boolean-context.test.js → semantic/boolean-context.test.js} +44 -108
- package/dist/core/semantic/boolean-context.test.js.map +1 -0
- package/dist/core/{imports.d.ts → semantic/imports.d.ts} +1 -5
- package/dist/core/semantic/imports.d.ts.map +1 -0
- package/dist/core/{imports.js → semantic/imports.js} +6 -77
- package/dist/core/semantic/imports.js.map +1 -0
- package/dist/core/semantic/imports.test.d.ts.map +1 -0
- package/dist/core/{imports.test.js → semantic/imports.test.js} +1 -1
- package/dist/core/semantic/imports.test.js.map +1 -0
- package/dist/core/semantic/index.d.ts +15 -0
- package/dist/core/semantic/index.d.ts.map +1 -0
- package/dist/core/semantic/index.js +15 -0
- package/dist/core/semantic/index.js.map +1 -0
- package/dist/core/{local-types.d.ts → semantic/local-types.d.ts} +1 -1
- package/dist/core/semantic/local-types.d.ts.map +1 -0
- package/dist/core/semantic/local-types.js.map +1 -0
- package/dist/core/{module-map.d.ts → semantic/module-map.d.ts} +1 -1
- package/dist/core/semantic/module-map.d.ts.map +1 -0
- package/dist/core/semantic/module-map.js.map +1 -0
- package/dist/core/semantic/module-map.test.d.ts.map +1 -0
- package/dist/core/semantic/module-map.test.js.map +1 -0
- package/dist/core/semantic/naming-collisions.d.ts.map +1 -0
- package/dist/core/{naming-collisions.js → semantic/naming-collisions.js} +1 -1
- package/dist/core/semantic/naming-collisions.js.map +1 -0
- package/dist/core/{type-alias-index.d.ts → semantic/type-alias-index.d.ts} +1 -1
- package/dist/core/semantic/type-alias-index.d.ts.map +1 -0
- package/dist/core/semantic/type-alias-index.js.map +1 -0
- package/dist/core/semantic/type-compatibility.d.ts.map +1 -0
- package/dist/core/semantic/type-compatibility.js.map +1 -0
- package/dist/core/{type-member-index.d.ts → semantic/type-member-index.d.ts} +1 -1
- package/dist/core/semantic/type-member-index.d.ts.map +1 -0
- package/dist/core/semantic/type-member-index.js.map +1 -0
- package/dist/core/semantic/type-params.d.ts.map +1 -0
- package/dist/core/semantic/type-params.js.map +1 -0
- package/dist/core/{type-resolution.d.ts → semantic/type-resolution.d.ts} +3 -6
- package/dist/core/semantic/type-resolution.d.ts.map +1 -0
- package/dist/core/{type-resolution.js → semantic/type-resolution.js} +15 -25
- package/dist/core/semantic/type-resolution.js.map +1 -0
- package/dist/core/semantic/type-resolution.test.d.ts.map +1 -0
- package/dist/core/{type-resolution.test.js → semantic/type-resolution.test.js} +11 -19
- package/dist/core/semantic/type-resolution.test.js.map +1 -0
- package/dist/core/semantic/unsafe.d.ts.map +1 -0
- package/dist/core/semantic/unsafe.js.map +1 -0
- package/dist/emitter-types/core.d.ts +4 -12
- package/dist/emitter-types/core.d.ts.map +1 -1
- package/dist/emitter-types/index.d.ts +1 -1
- package/dist/emitter-types/index.d.ts.map +1 -1
- package/dist/emitter-types/index.js.map +1 -1
- package/dist/emitter.d.ts +1 -1
- package/dist/emitter.d.ts.map +1 -1
- package/dist/emitter.js +9 -8
- package/dist/emitter.js.map +1 -1
- package/dist/expression-emitter.d.ts +10 -5
- package/dist/expression-emitter.d.ts.map +1 -1
- package/dist/expression-emitter.js +111 -117
- package/dist/expression-emitter.js.map +1 -1
- package/dist/expressions/access.d.ts +4 -3
- package/dist/expressions/access.d.ts.map +1 -1
- package/dist/expressions/access.js +176 -102
- package/dist/expressions/access.js.map +1 -1
- package/dist/expressions/calls/call-analysis.d.ts +86 -0
- package/dist/expressions/calls/call-analysis.d.ts.map +1 -0
- package/dist/expressions/calls/call-analysis.js +284 -0
- package/dist/expressions/calls/call-analysis.js.map +1 -0
- package/dist/expressions/calls/call-emitter.d.ts +13 -0
- package/dist/expressions/calls/call-emitter.d.ts.map +1 -0
- package/dist/expressions/calls/call-emitter.js +876 -0
- package/dist/expressions/calls/call-emitter.js.map +1 -0
- package/dist/expressions/calls/new-emitter.d.ts +13 -0
- package/dist/expressions/calls/new-emitter.d.ts.map +1 -0
- package/dist/expressions/calls/new-emitter.js +641 -0
- package/dist/expressions/calls/new-emitter.js.map +1 -0
- package/dist/expressions/calls.d.ts +2 -14
- package/dist/expressions/calls.d.ts.map +1 -1
- package/dist/expressions/calls.js +2 -909
- package/dist/expressions/calls.js.map +1 -1
- package/dist/expressions/collections.d.ts +6 -16
- package/dist/expressions/collections.d.ts.map +1 -1
- package/dist/expressions/collections.js +301 -217
- package/dist/expressions/collections.js.map +1 -1
- package/dist/expressions/functions.d.ts +6 -5
- package/dist/expressions/functions.d.ts.map +1 -1
- package/dist/expressions/functions.js +57 -62
- package/dist/expressions/functions.js.map +1 -1
- package/dist/expressions/identifiers.d.ts +11 -6
- package/dist/expressions/identifiers.d.ts.map +1 -1
- package/dist/expressions/identifiers.js +76 -25
- package/dist/expressions/identifiers.js.map +1 -1
- package/dist/expressions/index.d.ts +1 -1
- package/dist/expressions/index.d.ts.map +1 -1
- package/dist/expressions/index.js +1 -1
- package/dist/expressions/index.js.map +1 -1
- package/dist/expressions/index.test.js +143 -0
- package/dist/expressions/index.test.js.map +1 -1
- package/dist/expressions/literals.d.ts +4 -3
- package/dist/expressions/literals.d.ts.map +1 -1
- package/dist/expressions/literals.js +25 -17
- package/dist/expressions/literals.js.map +1 -1
- package/dist/expressions/literals.test.js +18 -18
- package/dist/expressions/literals.test.js.map +1 -1
- package/dist/expressions/operators/assignment-emitter.d.ts +16 -0
- package/dist/expressions/operators/assignment-emitter.d.ts.map +1 -0
- package/dist/expressions/operators/assignment-emitter.js +118 -0
- package/dist/expressions/operators/assignment-emitter.js.map +1 -0
- package/dist/expressions/operators/binary-emitter.d.ts +33 -0
- package/dist/expressions/operators/binary-emitter.d.ts.map +1 -0
- package/dist/expressions/operators/binary-emitter.js +398 -0
- package/dist/expressions/operators/binary-emitter.js.map +1 -0
- package/dist/expressions/operators/conditional-emitter.d.ts +17 -0
- package/dist/expressions/operators/conditional-emitter.d.ts.map +1 -0
- package/dist/expressions/operators/conditional-emitter.js +306 -0
- package/dist/expressions/operators/conditional-emitter.js.map +1 -0
- package/dist/expressions/operators/helpers.d.ts +37 -0
- package/dist/expressions/operators/helpers.d.ts.map +1 -0
- package/dist/expressions/operators/helpers.js +136 -0
- package/dist/expressions/operators/helpers.js.map +1 -0
- package/dist/expressions/operators/logical-emitter.d.ts +23 -0
- package/dist/expressions/operators/logical-emitter.d.ts.map +1 -0
- package/dist/expressions/operators/logical-emitter.js +73 -0
- package/dist/expressions/operators/logical-emitter.js.map +1 -0
- package/dist/expressions/operators/unary-emitter.d.ts +30 -0
- package/dist/expressions/operators/unary-emitter.d.ts.map +1 -0
- package/dist/expressions/operators/unary-emitter.js +244 -0
- package/dist/expressions/operators/unary-emitter.js.map +1 -0
- package/dist/expressions/operators.d.ts +5 -81
- package/dist/expressions/operators.d.ts.map +1 -1
- package/dist/expressions/operators.js +5 -949
- package/dist/expressions/operators.js.map +1 -1
- package/dist/expressions/other.d.ts +15 -11
- package/dist/expressions/other.d.ts.map +1 -1
- package/dist/expressions/other.js +51 -36
- package/dist/expressions/other.js.map +1 -1
- package/dist/expressions/precedence.test.js +1 -1
- package/dist/expressions/precedence.test.js.map +1 -1
- package/dist/generator-exchange.d.ts +10 -3
- package/dist/generator-exchange.d.ts.map +1 -1
- package/dist/generator-exchange.js +57 -54
- package/dist/generator-exchange.js.map +1 -1
- package/dist/generator-wrapper.d.ts +17 -65
- package/dist/generator-wrapper.d.ts.map +1 -1
- package/dist/generator-wrapper.js +396 -220
- package/dist/generator-wrapper.js.map +1 -1
- package/dist/generator-wrapper.test.js +22 -14
- package/dist/generator-wrapper.test.js.map +1 -1
- package/dist/integration.test.js +166 -1
- package/dist/integration.test.js.map +1 -1
- package/dist/patterns.d.ts +18 -88
- package/dist/patterns.d.ts.map +1 -1
- package/dist/patterns.js +540 -304
- package/dist/patterns.js.map +1 -1
- package/dist/patterns.test.js +5 -4
- package/dist/patterns.test.js.map +1 -1
- package/dist/specialization/generation.d.ts +7 -3
- package/dist/specialization/generation.d.ts.map +1 -1
- package/dist/specialization/generation.js +31 -15
- package/dist/specialization/generation.js.map +1 -1
- package/dist/specialization/type-aliases.test.js +3 -2
- package/dist/specialization/type-aliases.test.js.map +1 -1
- package/dist/statement-emitter.d.ts +15 -4
- package/dist/statement-emitter.d.ts.map +1 -1
- package/dist/statement-emitter.js +54 -47
- package/dist/statement-emitter.js.map +1 -1
- package/dist/statements/blocks.d.ts +24 -16
- package/dist/statements/blocks.d.ts.map +1 -1
- package/dist/statements/blocks.js +191 -65
- package/dist/statements/blocks.js.map +1 -1
- package/dist/statements/classes/index.d.ts +1 -1
- package/dist/statements/classes/index.d.ts.map +1 -1
- package/dist/statements/classes/index.js +1 -1
- package/dist/statements/classes/index.js.map +1 -1
- package/dist/statements/classes/inline-types.d.ts +4 -3
- package/dist/statements/classes/inline-types.d.ts.map +1 -1
- package/dist/statements/classes/inline-types.js +21 -21
- package/dist/statements/classes/inline-types.js.map +1 -1
- package/dist/statements/classes/members/constructors.d.ts +4 -3
- package/dist/statements/classes/members/constructors.d.ts.map +1 -1
- package/dist/statements/classes/members/constructors.js +57 -58
- package/dist/statements/classes/members/constructors.js.map +1 -1
- package/dist/statements/classes/members/methods.d.ts +4 -3
- package/dist/statements/classes/members/methods.d.ts.map +1 -1
- package/dist/statements/classes/members/methods.js +98 -98
- package/dist/statements/classes/members/methods.js.map +1 -1
- package/dist/statements/classes/members/orchestrator.d.ts +4 -3
- package/dist/statements/classes/members/orchestrator.d.ts.map +1 -1
- package/dist/statements/classes/members/orchestrator.js +2 -2
- package/dist/statements/classes/members/orchestrator.js.map +1 -1
- package/dist/statements/classes/members/properties.d.ts +4 -3
- package/dist/statements/classes/members/properties.d.ts.map +1 -1
- package/dist/statements/classes/members/properties.js +105 -88
- package/dist/statements/classes/members/properties.js.map +1 -1
- package/dist/statements/classes/members/shadowing.test.js +7 -2
- package/dist/statements/classes/members/shadowing.test.js.map +1 -1
- package/dist/statements/classes/members/static-readonly-properties.test.js +4 -1
- package/dist/statements/classes/members/static-readonly-properties.test.js.map +1 -1
- package/dist/statements/classes/parameters.d.ts +8 -10
- package/dist/statements/classes/parameters.d.ts.map +1 -1
- package/dist/statements/classes/parameters.js +30 -26
- package/dist/statements/classes/parameters.js.map +1 -1
- package/dist/statements/classes/properties.d.ts +4 -3
- package/dist/statements/classes/properties.d.ts.map +1 -1
- package/dist/statements/classes/properties.js +76 -50
- package/dist/statements/classes/properties.js.map +1 -1
- package/dist/statements/classes.d.ts +1 -1
- package/dist/statements/classes.d.ts.map +1 -1
- package/dist/statements/classes.js +1 -1
- package/dist/statements/classes.js.map +1 -1
- package/dist/statements/control/conditionals/guard-analysis.d.ts +169 -0
- package/dist/statements/control/conditionals/guard-analysis.d.ts.map +1 -0
- package/dist/statements/control/conditionals/guard-analysis.js +591 -0
- package/dist/statements/control/conditionals/guard-analysis.js.map +1 -0
- package/dist/statements/control/conditionals/if-emitter.d.ts +14 -0
- package/dist/statements/control/conditionals/if-emitter.d.ts.map +1 -0
- package/dist/statements/control/conditionals/if-emitter.js +725 -0
- package/dist/statements/control/conditionals/if-emitter.js.map +1 -0
- package/dist/statements/control/conditionals/switch-emitter.d.ts +13 -0
- package/dist/statements/control/conditionals/switch-emitter.d.ts.map +1 -0
- package/dist/statements/control/conditionals/switch-emitter.js +60 -0
- package/dist/statements/control/conditionals/switch-emitter.js.map +1 -0
- package/dist/statements/control/conditionals.d.ts +3 -15
- package/dist/statements/control/conditionals.d.ts.map +1 -1
- package/dist/statements/control/conditionals.js +3 -1152
- package/dist/statements/control/conditionals.js.map +1 -1
- package/dist/statements/control/exceptions.d.ts +8 -6
- package/dist/statements/control/exceptions.d.ts.map +1 -1
- package/dist/statements/control/exceptions.js +35 -23
- package/dist/statements/control/exceptions.js.map +1 -1
- package/dist/statements/control/index.d.ts +3 -3
- package/dist/statements/control/index.d.ts.map +1 -1
- package/dist/statements/control/index.js +3 -3
- package/dist/statements/control/index.js.map +1 -1
- package/dist/statements/control/loops.d.ts +14 -12
- package/dist/statements/control/loops.d.ts.map +1 -1
- package/dist/statements/control/loops.js +147 -82
- package/dist/statements/control/loops.js.map +1 -1
- package/dist/statements/control.d.ts +1 -1
- package/dist/statements/control.d.ts.map +1 -1
- package/dist/statements/control.js +1 -1
- package/dist/statements/control.js.map +1 -1
- package/dist/statements/declarations/classes.d.ts +7 -3
- package/dist/statements/declarations/classes.d.ts.map +1 -1
- package/dist/statements/declarations/classes.js +66 -83
- package/dist/statements/declarations/classes.js.map +1 -1
- package/dist/statements/declarations/enums.d.ts +4 -3
- package/dist/statements/declarations/enums.d.ts.map +1 -1
- package/dist/statements/declarations/enums.js +16 -15
- package/dist/statements/declarations/enums.js.map +1 -1
- package/dist/statements/declarations/functions.d.ts +18 -2
- package/dist/statements/declarations/functions.d.ts.map +1 -1
- package/dist/statements/declarations/functions.js +625 -159
- package/dist/statements/declarations/functions.js.map +1 -1
- package/dist/statements/declarations/index.d.ts +2 -2
- package/dist/statements/declarations/index.d.ts.map +1 -1
- package/dist/statements/declarations/index.js +2 -2
- package/dist/statements/declarations/index.js.map +1 -1
- package/dist/statements/declarations/interfaces.d.ts +7 -3
- package/dist/statements/declarations/interfaces.d.ts.map +1 -1
- package/dist/statements/declarations/interfaces.js +119 -106
- package/dist/statements/declarations/interfaces.js.map +1 -1
- package/dist/statements/declarations/type-aliases.d.ts +7 -3
- package/dist/statements/declarations/type-aliases.d.ts.map +1 -1
- package/dist/statements/declarations/type-aliases.js +95 -82
- package/dist/statements/declarations/type-aliases.js.map +1 -1
- package/dist/statements/declarations/variables.d.ts +12 -2
- package/dist/statements/declarations/variables.d.ts.map +1 -1
- package/dist/statements/declarations/variables.js +533 -425
- package/dist/statements/declarations/variables.js.map +1 -1
- package/dist/statements/declarations.d.ts +1 -1
- package/dist/statements/declarations.d.ts.map +1 -1
- package/dist/statements/declarations.js +1 -1
- package/dist/statements/declarations.js.map +1 -1
- package/dist/statements/index.d.ts +3 -3
- package/dist/statements/index.d.ts.map +1 -1
- package/dist/statements/index.js +5 -5
- package/dist/statements/index.js.map +1 -1
- package/dist/type-emitter.d.ts +1 -1
- package/dist/type-emitter.d.ts.map +1 -1
- package/dist/type-emitter.js +1 -1
- package/dist/type-emitter.js.map +1 -1
- package/dist/types/arrays.d.ts +3 -2
- package/dist/types/arrays.d.ts.map +1 -1
- package/dist/types/arrays.js +7 -5
- package/dist/types/arrays.js.map +1 -1
- package/dist/types/dictionaries.d.ts +6 -3
- package/dist/types/dictionaries.d.ts.map +1 -1
- package/dist/types/dictionaries.js +22 -10
- package/dist/types/dictionaries.js.map +1 -1
- package/dist/types/emitter.d.ts +8 -2
- package/dist/types/emitter.d.ts.map +1 -1
- package/dist/types/emitter.js +20 -6
- package/dist/types/emitter.js.map +1 -1
- package/dist/types/functions.d.ts +3 -2
- package/dist/types/functions.d.ts.map +1 -1
- package/dist/types/functions.js +36 -13
- package/dist/types/functions.js.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/index.test.js +137 -0
- package/dist/types/index.test.js.map +1 -1
- package/dist/types/intersections.d.ts +3 -2
- package/dist/types/intersections.d.ts.map +1 -1
- package/dist/types/intersections.js +2 -2
- package/dist/types/intersections.js.map +1 -1
- package/dist/types/literals.d.ts +9 -2
- package/dist/types/literals.d.ts.map +1 -1
- package/dist/types/literals.js +11 -5
- package/dist/types/literals.js.map +1 -1
- package/dist/types/objects.d.ts +3 -2
- package/dist/types/objects.d.ts.map +1 -1
- package/dist/types/objects.js +1 -1
- package/dist/types/objects.js.map +1 -1
- package/dist/types/parameters.d.ts +6 -5
- package/dist/types/parameters.d.ts.map +1 -1
- package/dist/types/parameters.js +88 -29
- package/dist/types/parameters.js.map +1 -1
- package/dist/types/parameters.test.js +9 -4
- package/dist/types/parameters.test.js.map +1 -1
- package/dist/types/primitives.d.ts +5 -4
- package/dist/types/primitives.d.ts.map +1 -1
- package/dist/types/primitives.js +14 -13
- package/dist/types/primitives.js.map +1 -1
- package/dist/types/references.d.ts +3 -2
- package/dist/types/references.d.ts.map +1 -1
- package/dist/types/references.js +135 -111
- package/dist/types/references.js.map +1 -1
- package/dist/types/tuples.d.ts +3 -2
- package/dist/types/tuples.d.ts.map +1 -1
- package/dist/types/tuples.js +25 -11
- package/dist/types/tuples.js.map +1 -1
- package/dist/types/unions.d.ts +3 -2
- package/dist/types/unions.d.ts.map +1 -1
- package/dist/types/unions.js +36 -21
- package/dist/types/unions.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/dist/core/attributes.d.ts.map +0 -1
- package/dist/core/attributes.js +0 -141
- package/dist/core/attributes.js.map +0 -1
- package/dist/core/attributes.test.d.ts.map +0 -1
- package/dist/core/attributes.test.js.map +0 -1
- package/dist/core/boolean-context.d.ts +0 -42
- package/dist/core/boolean-context.d.ts.map +0 -1
- package/dist/core/boolean-context.js +0 -442
- package/dist/core/boolean-context.js.map +0 -1
- package/dist/core/boolean-context.test.d.ts.map +0 -1
- package/dist/core/boolean-context.test.js.map +0 -1
- package/dist/core/exports.d.ts.map +0 -1
- package/dist/core/exports.js +0 -28
- package/dist/core/exports.js.map +0 -1
- package/dist/core/imports.d.ts.map +0 -1
- package/dist/core/imports.js.map +0 -1
- package/dist/core/imports.test.d.ts.map +0 -1
- package/dist/core/imports.test.js.map +0 -1
- package/dist/core/local-names.d.ts.map +0 -1
- package/dist/core/local-names.js.map +0 -1
- package/dist/core/local-types.d.ts.map +0 -1
- package/dist/core/local-types.js.map +0 -1
- package/dist/core/module-emitter/assembly.d.ts +0 -24
- package/dist/core/module-emitter/assembly.d.ts.map +0 -1
- package/dist/core/module-emitter/assembly.js +0 -69
- package/dist/core/module-emitter/assembly.js.map +0 -1
- package/dist/core/module-emitter/header.d.ts.map +0 -1
- package/dist/core/module-emitter/header.js.map +0 -1
- package/dist/core/module-emitter/index.d.ts.map +0 -1
- package/dist/core/module-emitter/index.js.map +0 -1
- package/dist/core/module-emitter/namespace.d.ts +0 -14
- package/dist/core/module-emitter/namespace.d.ts.map +0 -1
- package/dist/core/module-emitter/namespace.js +0 -26
- package/dist/core/module-emitter/namespace.js.map +0 -1
- package/dist/core/module-emitter/orchestrator.d.ts.map +0 -1
- package/dist/core/module-emitter/orchestrator.js.map +0 -1
- package/dist/core/module-emitter/separation.d.ts.map +0 -1
- package/dist/core/module-emitter/separation.js.map +0 -1
- package/dist/core/module-emitter/static-container.d.ts.map +0 -1
- package/dist/core/module-emitter/static-container.js +0 -139
- package/dist/core/module-emitter/static-container.js.map +0 -1
- package/dist/core/module-emitter.d.ts.map +0 -1
- package/dist/core/module-emitter.js.map +0 -1
- package/dist/core/module-map.d.ts.map +0 -1
- package/dist/core/module-map.js.map +0 -1
- package/dist/core/module-map.test.d.ts.map +0 -1
- package/dist/core/module-map.test.js.map +0 -1
- package/dist/core/naming-collisions.d.ts.map +0 -1
- package/dist/core/naming-collisions.js.map +0 -1
- package/dist/core/options.d.ts.map +0 -1
- package/dist/core/options.js.map +0 -1
- package/dist/core/type-alias-index.d.ts.map +0 -1
- package/dist/core/type-alias-index.js.map +0 -1
- package/dist/core/type-compatibility.d.ts.map +0 -1
- package/dist/core/type-compatibility.js.map +0 -1
- package/dist/core/type-member-index.d.ts.map +0 -1
- package/dist/core/type-member-index.js.map +0 -1
- package/dist/core/type-params.d.ts.map +0 -1
- package/dist/core/type-params.js.map +0 -1
- package/dist/core/type-resolution.d.ts.map +0 -1
- package/dist/core/type-resolution.js.map +0 -1
- package/dist/core/type-resolution.test.d.ts.map +0 -1
- package/dist/core/type-resolution.test.js.map +0 -1
- package/dist/core/unsafe.d.ts.map +0 -1
- package/dist/core/unsafe.js.map +0 -1
- /package/dist/core/{attributes.test.d.ts → format/attributes.test.d.ts} +0 -0
- /package/dist/core/{module-emitter → format/module-emitter}/index.d.ts +0 -0
- /package/dist/core/{module-emitter → format/module-emitter}/index.js +0 -0
- /package/dist/core/{module-emitter → format/module-emitter}/separation.d.ts +0 -0
- /package/dist/core/{module-emitter → format/module-emitter}/separation.js +0 -0
- /package/dist/core/{module-emitter.d.ts → format/module-emitter.d.ts} +0 -0
- /package/dist/core/{module-emitter.js → format/module-emitter.js} +0 -0
- /package/dist/core/{options.js → format/options.js} +0 -0
- /package/dist/core/{boolean-context.test.d.ts → semantic/boolean-context.test.d.ts} +0 -0
- /package/dist/core/{imports.test.d.ts → semantic/imports.test.d.ts} +0 -0
- /package/dist/core/{local-types.js → semantic/local-types.js} +0 -0
- /package/dist/core/{module-map.js → semantic/module-map.js} +0 -0
- /package/dist/core/{module-map.test.d.ts → semantic/module-map.test.d.ts} +0 -0
- /package/dist/core/{module-map.test.js → semantic/module-map.test.js} +0 -0
- /package/dist/core/{naming-collisions.d.ts → semantic/naming-collisions.d.ts} +0 -0
- /package/dist/core/{type-alias-index.js → semantic/type-alias-index.js} +0 -0
- /package/dist/core/{type-compatibility.d.ts → semantic/type-compatibility.d.ts} +0 -0
- /package/dist/core/{type-compatibility.js → semantic/type-compatibility.js} +0 -0
- /package/dist/core/{type-member-index.js → semantic/type-member-index.js} +0 -0
- /package/dist/core/{type-params.d.ts → semantic/type-params.d.ts} +0 -0
- /package/dist/core/{type-params.js → semantic/type-params.js} +0 -0
- /package/dist/core/{type-resolution.test.d.ts → semantic/type-resolution.test.d.ts} +0 -0
- /package/dist/core/{unsafe.d.ts → semantic/unsafe.d.ts} +0 -0
- /package/dist/core/{unsafe.js → semantic/unsafe.js} +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Collection expression emitters (arrays and objects)
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { getPropertyType, stripNullish, resolveTypeAlias, selectUnionMemberForObjectLiteral, } from "../core/type-resolution.js";
|
|
4
|
+
import { emitTypeAst } from "../type-emitter.js";
|
|
5
|
+
import { emitExpressionAst } from "../expression-emitter.js";
|
|
6
|
+
import { getPropertyType, stripNullish, resolveTypeAlias, selectUnionMemberForObjectLiteral, } from "../core/semantic/type-resolution.js";
|
|
7
7
|
import { emitCSharpName } from "../naming-policy.js";
|
|
8
|
+
import { extractCalleeNameFromAst } from "../core/format/backend-ast/utils.js";
|
|
8
9
|
const bucketFromMemberKind = (kind) => {
|
|
9
10
|
switch (kind) {
|
|
10
11
|
case "method":
|
|
@@ -95,9 +96,16 @@ const emitObjectMemberName = (receiverType, memberName, context) => {
|
|
|
95
96
|
const kind = getMemberKind(receiverType, memberName, context);
|
|
96
97
|
return emitCSharpName(memberName, bucketFromMemberKind(kind), context);
|
|
97
98
|
};
|
|
99
|
+
const getDeterministicObjectKeyName = (key) => {
|
|
100
|
+
if (typeof key === "string")
|
|
101
|
+
return key;
|
|
102
|
+
if (key.kind === "literal" && typeof key.value === "string") {
|
|
103
|
+
return key.value;
|
|
104
|
+
}
|
|
105
|
+
return undefined;
|
|
106
|
+
};
|
|
98
107
|
/**
|
|
99
108
|
* Escape a string for use in a C# string literal.
|
|
100
|
-
* Handles backslashes, quotes, newlines, carriage returns, and tabs.
|
|
101
109
|
*/
|
|
102
110
|
const escapeCSharpString = (str) => str
|
|
103
111
|
.replace(/\\/g, "\\\\")
|
|
@@ -106,11 +114,10 @@ const escapeCSharpString = (str) => str
|
|
|
106
114
|
.replace(/\r/g, "\\r")
|
|
107
115
|
.replace(/\t/g, "\\t");
|
|
108
116
|
/**
|
|
109
|
-
* Emit an array literal
|
|
117
|
+
* Emit an array literal as CSharpExpressionAst
|
|
110
118
|
*/
|
|
111
119
|
export const emitArray = (expr, context, expectedType) => {
|
|
112
120
|
// Resolve type alias to check for tuple types
|
|
113
|
-
// (e.g., type Point = [number, number] → resolve Point to the tuple type)
|
|
114
121
|
const resolvedExpectedType = expectedType
|
|
115
122
|
? resolveTypeAlias(expectedType, context)
|
|
116
123
|
: undefined;
|
|
@@ -118,25 +125,27 @@ export const emitArray = (expr, context, expectedType) => {
|
|
|
118
125
|
if (resolvedExpectedType?.kind === "tupleType") {
|
|
119
126
|
return emitTupleLiteral(expr, context, resolvedExpectedType);
|
|
120
127
|
}
|
|
121
|
-
// Check if inferred type is a tuple
|
|
128
|
+
// Check if inferred type is a tuple
|
|
122
129
|
if (expr.inferredType?.kind === "tupleType") {
|
|
123
130
|
return emitTupleLiteral(expr, context, expr.inferredType);
|
|
124
131
|
}
|
|
125
132
|
let currentContext = context;
|
|
126
|
-
const
|
|
127
|
-
// Determine element type
|
|
128
|
-
|
|
129
|
-
|
|
133
|
+
const elementAsts = [];
|
|
134
|
+
// Determine element type as AST
|
|
135
|
+
let elementTypeAst = {
|
|
136
|
+
kind: "predefinedType",
|
|
137
|
+
keyword: "object",
|
|
138
|
+
};
|
|
139
|
+
let elementTypeResolved = false;
|
|
130
140
|
let expectedElementType = undefined;
|
|
131
|
-
// Priority 1: Use explicit type annotation
|
|
132
|
-
// This ensures the array type matches the declared variable type
|
|
133
|
-
// IMPORTANT: Resolve aliases and strip nullish to handle type Longs = long[] etc.
|
|
141
|
+
// Priority 1: Use explicit type annotation
|
|
134
142
|
if (expectedType) {
|
|
135
143
|
const resolvedExpected = resolveTypeAlias(stripNullish(expectedType), context);
|
|
136
144
|
if (resolvedExpected.kind === "arrayType") {
|
|
137
145
|
expectedElementType = resolvedExpected.elementType;
|
|
138
|
-
const [
|
|
139
|
-
|
|
146
|
+
const [typeAst, newContext] = emitTypeAst(resolvedExpected.elementType, currentContext);
|
|
147
|
+
elementTypeAst = typeAst;
|
|
148
|
+
elementTypeResolved = true;
|
|
140
149
|
currentContext = newContext;
|
|
141
150
|
}
|
|
142
151
|
else if (resolvedExpected.kind === "referenceType" &&
|
|
@@ -146,139 +155,155 @@ export const emitArray = (expr, context, expectedType) => {
|
|
|
146
155
|
const firstArg = resolvedExpected.typeArguments[0];
|
|
147
156
|
if (firstArg) {
|
|
148
157
|
expectedElementType = firstArg;
|
|
149
|
-
const [
|
|
150
|
-
|
|
158
|
+
const [typeAst, newContext] = emitTypeAst(firstArg, currentContext);
|
|
159
|
+
elementTypeAst = typeAst;
|
|
160
|
+
elementTypeResolved = true;
|
|
151
161
|
currentContext = newContext;
|
|
152
162
|
}
|
|
153
163
|
}
|
|
154
164
|
}
|
|
155
|
-
// Priority 2:
|
|
156
|
-
|
|
157
|
-
if (elementType === "object") {
|
|
165
|
+
// Priority 2: Infer from literals
|
|
166
|
+
if (!elementTypeResolved) {
|
|
158
167
|
const definedElements = expr.elements.filter((el) => el !== undefined);
|
|
159
168
|
if (definedElements.length > 0) {
|
|
160
169
|
const allLiterals = definedElements.every((el) => el.kind === "literal");
|
|
161
170
|
if (allLiterals) {
|
|
162
171
|
const literals = definedElements;
|
|
163
|
-
// Check if all are numbers
|
|
164
172
|
const allNumbers = literals.every((lit) => typeof lit.value === "number");
|
|
165
173
|
if (allNumbers) {
|
|
166
|
-
// Infer int vs long vs double from numericIntent (based on raw lexeme)
|
|
167
|
-
// Any Double → double, any Int64 → long, otherwise → int
|
|
168
174
|
const hasDouble = literals.some((lit) => lit.numericIntent === "Double");
|
|
169
175
|
const hasLong = literals.some((lit) => lit.numericIntent === "Int64");
|
|
170
176
|
if (hasDouble) {
|
|
171
|
-
|
|
177
|
+
elementTypeAst = { kind: "predefinedType", keyword: "double" };
|
|
178
|
+
elementTypeResolved = true;
|
|
172
179
|
}
|
|
173
180
|
else if (hasLong) {
|
|
174
|
-
|
|
181
|
+
elementTypeAst = { kind: "predefinedType", keyword: "long" };
|
|
182
|
+
elementTypeResolved = true;
|
|
175
183
|
}
|
|
176
184
|
else {
|
|
177
|
-
|
|
185
|
+
elementTypeAst = { kind: "predefinedType", keyword: "int" };
|
|
186
|
+
elementTypeResolved = true;
|
|
178
187
|
}
|
|
179
188
|
}
|
|
180
|
-
// Check if all are strings
|
|
181
189
|
else if (literals.every((lit) => typeof lit.value === "string")) {
|
|
182
|
-
|
|
190
|
+
elementTypeAst = { kind: "predefinedType", keyword: "string" };
|
|
191
|
+
elementTypeResolved = true;
|
|
183
192
|
}
|
|
184
|
-
// Check if all are booleans
|
|
185
193
|
else if (literals.every((lit) => typeof lit.value === "boolean")) {
|
|
186
|
-
|
|
194
|
+
elementTypeAst = { kind: "predefinedType", keyword: "bool" };
|
|
195
|
+
elementTypeResolved = true;
|
|
187
196
|
}
|
|
188
197
|
}
|
|
189
198
|
}
|
|
190
199
|
}
|
|
191
|
-
// Priority 3: Fall back to inferred type
|
|
192
|
-
|
|
193
|
-
if (elementType === "object") {
|
|
200
|
+
// Priority 3: Fall back to inferred type
|
|
201
|
+
if (!elementTypeResolved) {
|
|
194
202
|
if (expr.inferredType && expr.inferredType.kind === "arrayType") {
|
|
195
203
|
expectedElementType = expr.inferredType.elementType;
|
|
196
|
-
const [
|
|
197
|
-
|
|
204
|
+
const [typeAst, newContext] = emitTypeAst(expr.inferredType.elementType, currentContext);
|
|
205
|
+
elementTypeAst = typeAst;
|
|
198
206
|
currentContext = newContext;
|
|
199
207
|
}
|
|
200
208
|
}
|
|
201
|
-
// Check if array contains only spread elements
|
|
209
|
+
// Check if array contains only spread elements
|
|
202
210
|
const allSpreads = expr.elements.every((el) => el !== undefined && el.kind === "spread");
|
|
203
211
|
if (allSpreads && expr.elements.length > 0) {
|
|
204
|
-
// Emit as chained Enumerable.Concat calls
|
|
205
|
-
// Note: Concat returns IEnumerable<T>, so wrap in Enumerable.ToList() at the end
|
|
212
|
+
// Emit as chained Enumerable.Concat calls + ToArray()
|
|
206
213
|
const spreadElements = expr.elements.filter((el) => el !== undefined && el.kind === "spread");
|
|
207
214
|
const firstSpread = spreadElements[0];
|
|
208
215
|
if (!firstSpread) {
|
|
209
|
-
|
|
210
|
-
|
|
216
|
+
return [
|
|
217
|
+
{
|
|
218
|
+
kind: "arrayCreationExpression",
|
|
219
|
+
elementType: { kind: "predefinedType", keyword: "object" },
|
|
220
|
+
sizeExpression: { kind: "literalExpression", text: "0" },
|
|
221
|
+
},
|
|
222
|
+
currentContext,
|
|
223
|
+
];
|
|
211
224
|
}
|
|
212
|
-
const [
|
|
225
|
+
const [firstAst, firstContext] = emitExpressionAst(firstSpread.expression, currentContext);
|
|
213
226
|
currentContext = firstContext;
|
|
214
|
-
|
|
227
|
+
// Build chain of Concat calls
|
|
228
|
+
let concatAst = firstAst;
|
|
215
229
|
for (let i = 1; i < spreadElements.length; i++) {
|
|
216
230
|
const spread = spreadElements[i];
|
|
217
231
|
if (spread) {
|
|
218
|
-
const [
|
|
219
|
-
|
|
220
|
-
|
|
232
|
+
const [spreadAst, newContext] = emitExpressionAst(spread.expression, currentContext);
|
|
233
|
+
concatAst = {
|
|
234
|
+
kind: "invocationExpression",
|
|
235
|
+
expression: {
|
|
236
|
+
kind: "identifierExpression",
|
|
237
|
+
identifier: "global::System.Linq.Enumerable.Concat",
|
|
238
|
+
},
|
|
239
|
+
arguments: [concatAst, spreadAst],
|
|
240
|
+
};
|
|
221
241
|
currentContext = newContext;
|
|
222
242
|
}
|
|
223
243
|
}
|
|
224
|
-
//
|
|
244
|
+
// Wrap in ToArray()
|
|
225
245
|
return [
|
|
226
|
-
{
|
|
246
|
+
{
|
|
247
|
+
kind: "invocationExpression",
|
|
248
|
+
expression: {
|
|
249
|
+
kind: "identifierExpression",
|
|
250
|
+
identifier: "global::System.Linq.Enumerable.ToArray",
|
|
251
|
+
},
|
|
252
|
+
arguments: [concatAst],
|
|
253
|
+
},
|
|
227
254
|
currentContext,
|
|
228
255
|
];
|
|
229
256
|
}
|
|
230
257
|
// Regular array or mixed spreads/elements
|
|
231
258
|
for (const element of expr.elements) {
|
|
232
259
|
if (element === undefined) {
|
|
233
|
-
// Sparse array hole
|
|
234
|
-
|
|
260
|
+
// Sparse array hole
|
|
261
|
+
elementAsts.push({ kind: "defaultExpression" });
|
|
235
262
|
}
|
|
236
263
|
else if (element.kind === "spread") {
|
|
237
264
|
// Spread mixed with other elements - not yet supported
|
|
238
|
-
|
|
265
|
+
elementAsts.push({
|
|
266
|
+
kind: "identifierExpression",
|
|
267
|
+
identifier: "/* ...spread */",
|
|
268
|
+
});
|
|
239
269
|
}
|
|
240
270
|
else {
|
|
241
|
-
const [
|
|
242
|
-
|
|
271
|
+
const [elemAst, newContext] = emitExpressionAst(element, currentContext, expectedElementType);
|
|
272
|
+
elementAsts.push(elemAst);
|
|
243
273
|
currentContext = newContext;
|
|
244
274
|
}
|
|
245
275
|
}
|
|
246
276
|
// Always emit native CLR array
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
277
|
+
if (elementAsts.length === 0) {
|
|
278
|
+
// Array.Empty<T>() for empty arrays
|
|
279
|
+
return [
|
|
280
|
+
{
|
|
281
|
+
kind: "invocationExpression",
|
|
282
|
+
expression: {
|
|
283
|
+
kind: "identifierExpression",
|
|
284
|
+
identifier: "global::System.Array.Empty",
|
|
285
|
+
},
|
|
286
|
+
arguments: [],
|
|
287
|
+
typeArguments: [elementTypeAst],
|
|
288
|
+
},
|
|
289
|
+
currentContext,
|
|
290
|
+
];
|
|
291
|
+
}
|
|
292
|
+
// new T[] { elem1, elem2, ... }
|
|
293
|
+
return [
|
|
294
|
+
{
|
|
295
|
+
kind: "arrayCreationExpression",
|
|
296
|
+
elementType: elementTypeAst,
|
|
297
|
+
initializer: elementAsts,
|
|
298
|
+
},
|
|
299
|
+
currentContext,
|
|
300
|
+
];
|
|
253
301
|
};
|
|
254
302
|
/**
|
|
255
|
-
* Emit an object literal
|
|
256
|
-
*
|
|
257
|
-
* Handles three cases based on contextual type and structure:
|
|
258
|
-
* 1. Dictionary type (Record<K,V> or index signature) → Dictionary<string, T> initializer
|
|
259
|
-
* 2. Object with spreads → IIFE pattern: (() => { var __tmp = new T(); ... return __tmp; })()
|
|
260
|
-
* 3. Nominal type (interface, class) → new TypeName { prop = value, ... }
|
|
261
|
-
*
|
|
262
|
-
* Anonymous object types should be caught by validation (TSN7403) before reaching here.
|
|
263
|
-
*
|
|
264
|
-
* @param expr - The object expression
|
|
265
|
-
* @param context - Emitter context
|
|
266
|
-
* @param expectedType - Optional expected type (for property type resolution in generic contexts)
|
|
303
|
+
* Emit an object literal as CSharpExpressionAst
|
|
267
304
|
*/
|
|
268
305
|
export const emitObject = (expr, context, expectedType) => {
|
|
269
306
|
let currentContext = context;
|
|
270
|
-
// Use expectedType if provided, fall back to contextualType.
|
|
271
|
-
//
|
|
272
|
-
// IMPORTANT: Do not allow non-instantiable expected types (unknown/object/any)
|
|
273
|
-
// to override a synthesized contextual type (TSN7403 anonymous object synthesis).
|
|
274
|
-
//
|
|
275
|
-
// Example:
|
|
276
|
-
// function f(x: unknown): void {}
|
|
277
|
-
// f({ ok: true })
|
|
278
|
-
//
|
|
279
|
-
// The object literal is synthesized to a nominal `__Anon_*` type, but the call
|
|
280
|
-
// argument's expectedType is still `unknown`. We must instantiate the synthesized
|
|
281
|
-
// type, not `new object { ok = true }` (invalid C#).
|
|
282
307
|
const effectiveType = (() => {
|
|
283
308
|
if (!expectedType)
|
|
284
309
|
return expr.contextualType;
|
|
@@ -295,154 +320,214 @@ export const emitObject = (expr, context, expectedType) => {
|
|
|
295
320
|
if (effectiveType?.kind === "dictionaryType") {
|
|
296
321
|
return emitDictionaryLiteral(expr, currentContext, effectiveType);
|
|
297
322
|
}
|
|
298
|
-
// Check for contextual type (from return type, variable annotation, etc.)
|
|
299
|
-
// Strip null/undefined from type - `new T? { ... }` is invalid C#, use `new T { ... }`
|
|
300
323
|
const strippedType = effectiveType
|
|
301
324
|
? stripNullish(effectiveType)
|
|
302
325
|
: undefined;
|
|
303
326
|
// Handle union type aliases: select the best-matching union member
|
|
304
|
-
// e.g., for `type Result<T,E> = { ok: true; value: T } | { ok: false; error: E }`
|
|
305
|
-
// we want to emit `new Result__0<T,E> { ... }` not `new Result<T,E> { ... }`
|
|
306
327
|
const instantiationType = (() => {
|
|
307
328
|
if (!strippedType)
|
|
308
329
|
return undefined;
|
|
309
330
|
const resolved = resolveTypeAlias(strippedType, currentContext);
|
|
310
331
|
if (resolved.kind !== "unionType")
|
|
311
332
|
return strippedType;
|
|
312
|
-
// Extract only plain string keys from the literal
|
|
313
333
|
const literalKeys = expr.properties
|
|
314
334
|
.filter((p) => p.kind === "property" && typeof p.key === "string")
|
|
315
335
|
.map((p) => p.key);
|
|
316
|
-
// If any property is not a plain string key, cannot match
|
|
317
336
|
if (literalKeys.length !== expr.properties.length)
|
|
318
337
|
return strippedType;
|
|
319
338
|
const selected = selectUnionMemberForObjectLiteral(resolved, literalKeys, currentContext);
|
|
320
339
|
return selected ?? strippedType;
|
|
321
340
|
})();
|
|
322
|
-
const [
|
|
341
|
+
const [typeAst, typeContext] = resolveContextualTypeAst(instantiationType, currentContext);
|
|
323
342
|
currentContext = typeContext;
|
|
324
|
-
if (!
|
|
325
|
-
// ICE: Validation (TSN7403) should have caught anonymous object literals
|
|
343
|
+
if (!typeAst) {
|
|
326
344
|
throw new Error("ICE: Object literal without contextual type reached emitter - validation missed TSN7403");
|
|
327
345
|
}
|
|
328
|
-
//
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
? typeName.slice(0, -1)
|
|
332
|
-
: typeName;
|
|
333
|
-
// Check if object has spreads - use IIFE pattern for spread lowering
|
|
346
|
+
// Strip nullable wrapper for object construction
|
|
347
|
+
const safeTypeAst = typeAst.kind === "nullableType" ? typeAst.underlyingType : typeAst;
|
|
348
|
+
// Check if object has spreads - use IIFE pattern
|
|
334
349
|
if (expr.hasSpreads) {
|
|
335
|
-
return emitObjectWithSpreads(expr, currentContext, effectiveType,
|
|
350
|
+
return emitObjectWithSpreads(expr, currentContext, effectiveType, safeTypeAst, instantiationType);
|
|
336
351
|
}
|
|
337
|
-
// Regular object literal with nominal type
|
|
338
|
-
const
|
|
352
|
+
// Regular object literal with nominal type
|
|
353
|
+
const initializerAsts = [];
|
|
339
354
|
for (const prop of expr.properties) {
|
|
340
355
|
if (prop.kind === "spread") {
|
|
341
|
-
// Should not reach here if hasSpreads is correctly set
|
|
342
356
|
throw new Error("ICE: Spread in object literal but hasSpreads is false");
|
|
343
357
|
}
|
|
344
358
|
else {
|
|
345
|
-
const
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
const
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
359
|
+
const keyName = getDeterministicObjectKeyName(prop.key);
|
|
360
|
+
if (!keyName) {
|
|
361
|
+
throw new Error("ICE: Unsupported computed property key reached nominal object emission");
|
|
362
|
+
}
|
|
363
|
+
const key = emitObjectMemberName(instantiationType, keyName, currentContext);
|
|
364
|
+
const propertyExpectedType = getPropertyType(instantiationType ?? effectiveType, keyName, currentContext);
|
|
365
|
+
const [valueAst, newContext] = emitExpressionAst(prop.value, currentContext, propertyExpectedType);
|
|
366
|
+
initializerAsts.push({
|
|
367
|
+
kind: "assignmentExpression",
|
|
368
|
+
operatorToken: "=",
|
|
369
|
+
left: { kind: "identifierExpression", identifier: key },
|
|
370
|
+
right: valueAst,
|
|
371
|
+
});
|
|
354
372
|
currentContext = newContext;
|
|
355
373
|
}
|
|
356
374
|
}
|
|
357
|
-
|
|
358
|
-
|
|
375
|
+
return [
|
|
376
|
+
{
|
|
377
|
+
kind: "objectCreationExpression",
|
|
378
|
+
type: safeTypeAst,
|
|
379
|
+
arguments: [],
|
|
380
|
+
initializer: initializerAsts,
|
|
381
|
+
},
|
|
382
|
+
currentContext,
|
|
383
|
+
];
|
|
359
384
|
};
|
|
360
385
|
/**
|
|
361
386
|
* Emit an object literal with spreads using IIFE pattern.
|
|
362
|
-
*
|
|
363
|
-
* Input: { ...base, y: 2 }
|
|
364
|
-
* Output: ((global::System.Func<T>)(() => { var __tmp = new T(); __tmp.x = base.x; __tmp.y = 2.0; return __tmp; }))()
|
|
365
|
-
*
|
|
366
|
-
* Properties are set in order: spread properties first, then explicit properties.
|
|
367
|
-
* Later properties override earlier ones (JavaScript semantics).
|
|
368
387
|
*/
|
|
369
|
-
const emitObjectWithSpreads = (expr, context, effectiveType,
|
|
388
|
+
const emitObjectWithSpreads = (expr, context, effectiveType, typeAst, targetType) => {
|
|
370
389
|
let currentContext = context;
|
|
371
|
-
const
|
|
390
|
+
const bodyStatements = [];
|
|
391
|
+
// var __tmp = new TypeName()
|
|
392
|
+
const initStatement = {
|
|
393
|
+
kind: "localDeclarationStatement",
|
|
394
|
+
modifiers: [],
|
|
395
|
+
type: { kind: "varType" },
|
|
396
|
+
declarators: [
|
|
397
|
+
{
|
|
398
|
+
name: "__tmp",
|
|
399
|
+
initializer: {
|
|
400
|
+
kind: "objectCreationExpression",
|
|
401
|
+
type: typeAst,
|
|
402
|
+
arguments: [],
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
],
|
|
406
|
+
};
|
|
407
|
+
bodyStatements.push(initStatement);
|
|
372
408
|
for (const prop of expr.properties) {
|
|
373
409
|
if (prop.kind === "spread") {
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
assignments.push(...spreadAssignments);
|
|
410
|
+
const [spreadStatements, newContext] = emitSpreadPropertyCopyStatements(targetType, prop.expression, currentContext);
|
|
411
|
+
bodyStatements.push(...spreadStatements);
|
|
377
412
|
currentContext = newContext;
|
|
378
413
|
}
|
|
379
414
|
else {
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
const
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
415
|
+
const keyName = getDeterministicObjectKeyName(prop.key);
|
|
416
|
+
if (!keyName) {
|
|
417
|
+
throw new Error("ICE: Unsupported computed property key reached spread object emission");
|
|
418
|
+
}
|
|
419
|
+
const key = emitObjectMemberName(targetType, keyName, currentContext);
|
|
420
|
+
const propertyExpectedType = getPropertyType(targetType ?? effectiveType, keyName, currentContext);
|
|
421
|
+
const [valueAst, newContext] = emitExpressionAst(prop.value, currentContext, propertyExpectedType);
|
|
422
|
+
bodyStatements.push({
|
|
423
|
+
kind: "expressionStatement",
|
|
424
|
+
expression: {
|
|
425
|
+
kind: "assignmentExpression",
|
|
426
|
+
operatorToken: "=",
|
|
427
|
+
left: {
|
|
428
|
+
kind: "memberAccessExpression",
|
|
429
|
+
expression: { kind: "identifierExpression", identifier: "__tmp" },
|
|
430
|
+
memberName: key,
|
|
431
|
+
},
|
|
432
|
+
right: valueAst,
|
|
433
|
+
},
|
|
434
|
+
});
|
|
389
435
|
currentContext = newContext;
|
|
390
436
|
}
|
|
391
437
|
}
|
|
392
|
-
//
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
const
|
|
399
|
-
|
|
438
|
+
// return __tmp
|
|
439
|
+
bodyStatements.push({
|
|
440
|
+
kind: "returnStatement",
|
|
441
|
+
expression: { kind: "identifierExpression", identifier: "__tmp" },
|
|
442
|
+
});
|
|
443
|
+
// IIFE: ((System.Func<T>)(() => { body }))()
|
|
444
|
+
const funcTypeAst = {
|
|
445
|
+
kind: "identifierType",
|
|
446
|
+
name: "global::System.Func",
|
|
447
|
+
typeArguments: [typeAst],
|
|
448
|
+
};
|
|
449
|
+
const lambdaAst = {
|
|
450
|
+
kind: "lambdaExpression",
|
|
451
|
+
isAsync: false,
|
|
452
|
+
parameters: [],
|
|
453
|
+
body: { kind: "blockStatement", statements: bodyStatements },
|
|
454
|
+
};
|
|
455
|
+
const castAst = {
|
|
456
|
+
kind: "castExpression",
|
|
457
|
+
type: funcTypeAst,
|
|
458
|
+
expression: {
|
|
459
|
+
kind: "parenthesizedExpression",
|
|
460
|
+
expression: lambdaAst,
|
|
461
|
+
},
|
|
462
|
+
};
|
|
463
|
+
return [
|
|
464
|
+
{
|
|
465
|
+
kind: "invocationExpression",
|
|
466
|
+
expression: {
|
|
467
|
+
kind: "parenthesizedExpression",
|
|
468
|
+
expression: castAst,
|
|
469
|
+
},
|
|
470
|
+
arguments: [],
|
|
471
|
+
},
|
|
472
|
+
currentContext,
|
|
473
|
+
];
|
|
400
474
|
};
|
|
401
475
|
/**
|
|
402
|
-
* Emit property copy assignments from a spread source.
|
|
403
|
-
*
|
|
404
|
-
* For `...base` where base has type { x: number, y: string }:
|
|
405
|
-
* Returns ["__tmp.x = base.x", "__tmp.y = base.y"]
|
|
476
|
+
* Emit property copy assignments from a spread source as AST statements.
|
|
406
477
|
*/
|
|
407
|
-
const
|
|
478
|
+
const emitSpreadPropertyCopyStatements = (targetType, spreadExpr, context) => {
|
|
408
479
|
let currentContext = context;
|
|
409
|
-
const
|
|
410
|
-
// Get the spread expression's type to know which properties to copy
|
|
480
|
+
const statements = [];
|
|
411
481
|
const spreadType = spreadExpr.inferredType;
|
|
412
482
|
if (!spreadType) {
|
|
413
|
-
|
|
414
|
-
const
|
|
415
|
-
|
|
416
|
-
|
|
483
|
+
const [exprAst, newContext] = emitExpressionAst(spreadExpr, currentContext);
|
|
484
|
+
const exprText = extractCalleeNameFromAst(exprAst);
|
|
485
|
+
statements.push({
|
|
486
|
+
kind: "expressionStatement",
|
|
487
|
+
expression: {
|
|
488
|
+
kind: "identifierExpression",
|
|
489
|
+
identifier: `/* spread: ${exprText} (no type info) */`,
|
|
490
|
+
},
|
|
491
|
+
});
|
|
492
|
+
return [statements, newContext];
|
|
417
493
|
}
|
|
418
|
-
|
|
419
|
-
const [sourceFrag, sourceContext] = emitExpression(spreadExpr, currentContext);
|
|
494
|
+
const [sourceAst, sourceContext] = emitExpressionAst(spreadExpr, currentContext);
|
|
420
495
|
currentContext = sourceContext;
|
|
421
|
-
const sourceExpr = sourceFrag.text;
|
|
422
|
-
// Extract properties from the spread type
|
|
423
496
|
const propertyNames = getObjectTypePropertyNames(spreadType, currentContext);
|
|
424
497
|
for (const propName of propertyNames) {
|
|
425
498
|
const targetMember = emitObjectMemberName(targetType, propName, currentContext);
|
|
426
499
|
const sourceMember = emitObjectMemberName(spreadType, propName, currentContext);
|
|
427
|
-
|
|
500
|
+
statements.push({
|
|
501
|
+
kind: "expressionStatement",
|
|
502
|
+
expression: {
|
|
503
|
+
kind: "assignmentExpression",
|
|
504
|
+
operatorToken: "=",
|
|
505
|
+
left: {
|
|
506
|
+
kind: "memberAccessExpression",
|
|
507
|
+
expression: { kind: "identifierExpression", identifier: "__tmp" },
|
|
508
|
+
memberName: targetMember,
|
|
509
|
+
},
|
|
510
|
+
right: {
|
|
511
|
+
kind: "memberAccessExpression",
|
|
512
|
+
expression: sourceAst,
|
|
513
|
+
memberName: sourceMember,
|
|
514
|
+
},
|
|
515
|
+
},
|
|
516
|
+
});
|
|
428
517
|
}
|
|
429
|
-
return [
|
|
518
|
+
return [statements, currentContext];
|
|
430
519
|
};
|
|
431
520
|
/**
|
|
432
521
|
* Get property names from an object-like type.
|
|
433
|
-
* Handles objectType, referenceType (to interfaces/classes), and resolved type aliases.
|
|
434
522
|
*/
|
|
435
523
|
const getObjectTypePropertyNames = (type, context) => {
|
|
436
524
|
const resolved = resolveTypeAlias(stripNullish(type), context);
|
|
437
|
-
// Direct object type
|
|
438
525
|
if (resolved.kind === "objectType") {
|
|
439
526
|
return resolved.members
|
|
440
527
|
.filter((m) => m.kind === "propertySignature")
|
|
441
528
|
.map((m) => m.name);
|
|
442
529
|
}
|
|
443
|
-
// Reference type - check type aliases registry
|
|
444
530
|
if (resolved.kind === "referenceType") {
|
|
445
|
-
// Check localTypes for class/interface/typeAlias members
|
|
446
531
|
const localType = context.localTypes?.get(resolved.name);
|
|
447
532
|
if (localType?.kind === "interface") {
|
|
448
533
|
return localType.members
|
|
@@ -460,7 +545,6 @@ const getObjectTypePropertyNames = (type, context) => {
|
|
|
460
545
|
.filter((m) => m.kind === "propertySignature")
|
|
461
546
|
.map((m) => m.name);
|
|
462
547
|
}
|
|
463
|
-
// Cross-module: fall back to global member kind index when available
|
|
464
548
|
const receiverFqn = resolveReceiverTypeFqn(resolved, context);
|
|
465
549
|
if (receiverFqn) {
|
|
466
550
|
const perType = context.options.typeMemberIndex?.get(receiverFqn);
|
|
@@ -475,125 +559,125 @@ const getObjectTypePropertyNames = (type, context) => {
|
|
|
475
559
|
}
|
|
476
560
|
}
|
|
477
561
|
}
|
|
478
|
-
// Unknown type structure - return empty
|
|
479
562
|
return [];
|
|
480
563
|
};
|
|
481
564
|
/**
|
|
482
|
-
* Emit a dictionary literal
|
|
483
|
-
*
|
|
484
|
-
* Input: const d: Record<string, number> = { a: 1, b: 2 };
|
|
485
|
-
* Output: new Dictionary<string, double> { ["a"] = 1.0, ["b"] = 2.0 }
|
|
565
|
+
* Emit a dictionary literal as CSharpExpressionAst
|
|
486
566
|
*/
|
|
487
567
|
const emitDictionaryLiteral = (expr, context, dictType) => {
|
|
488
568
|
let currentContext = context;
|
|
489
|
-
|
|
490
|
-
const [
|
|
491
|
-
const [valueTypeStr, ctx2] = emitType(dictType.valueType, ctx1);
|
|
569
|
+
const keyTypeAst = emitDictKeyTypeAst(dictType.keyType);
|
|
570
|
+
const [valueTypeAst, ctx2] = emitTypeAst(dictType.valueType, currentContext);
|
|
492
571
|
currentContext = ctx2;
|
|
493
|
-
|
|
494
|
-
|
|
572
|
+
const dictTypeAst = {
|
|
573
|
+
kind: "identifierType",
|
|
574
|
+
name: "global::System.Collections.Generic.Dictionary",
|
|
575
|
+
typeArguments: [keyTypeAst, valueTypeAst],
|
|
576
|
+
};
|
|
577
|
+
const initializerAsts = [];
|
|
495
578
|
for (const prop of expr.properties) {
|
|
496
579
|
if (prop.kind === "spread") {
|
|
497
|
-
// Spread in dictionary literal - not supported
|
|
498
580
|
throw new Error("ICE: Spread in dictionary literal not supported");
|
|
499
581
|
}
|
|
500
582
|
else {
|
|
501
|
-
// Key must be a string literal for dictionary initialization
|
|
502
583
|
if (typeof prop.key !== "string") {
|
|
503
584
|
throw new Error("ICE: Computed property key in dictionary literal - validation gap");
|
|
504
585
|
}
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
586
|
+
const [valueAst, newContext] = emitExpressionAst(prop.value, currentContext, dictType.valueType);
|
|
587
|
+
// Dictionary initializer: ["key"] = value
|
|
588
|
+
initializerAsts.push({
|
|
589
|
+
kind: "assignmentExpression",
|
|
590
|
+
operatorToken: "=",
|
|
591
|
+
left: {
|
|
592
|
+
kind: "identifierExpression",
|
|
593
|
+
identifier: `["${escapeCSharpString(prop.key)}"]`,
|
|
594
|
+
},
|
|
595
|
+
right: valueAst,
|
|
596
|
+
});
|
|
508
597
|
currentContext = newContext;
|
|
509
598
|
}
|
|
510
599
|
}
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
600
|
+
return [
|
|
601
|
+
{
|
|
602
|
+
kind: "objectCreationExpression",
|
|
603
|
+
type: dictTypeAst,
|
|
604
|
+
arguments: [],
|
|
605
|
+
initializer: initializerAsts.length > 0 ? initializerAsts : undefined,
|
|
606
|
+
},
|
|
607
|
+
currentContext,
|
|
608
|
+
];
|
|
515
609
|
};
|
|
516
610
|
/**
|
|
517
|
-
* Emit dictionary key type.
|
|
518
|
-
* Allowed: string, number (→ double).
|
|
519
|
-
* Enforced by TSN7413.
|
|
611
|
+
* Emit dictionary key type as AST.
|
|
520
612
|
*/
|
|
521
|
-
const
|
|
613
|
+
const emitDictKeyTypeAst = (keyType) => {
|
|
522
614
|
if (keyType.kind === "primitiveType") {
|
|
523
615
|
switch (keyType.name) {
|
|
524
616
|
case "string":
|
|
525
|
-
return
|
|
617
|
+
return { kind: "predefinedType", keyword: "string" };
|
|
526
618
|
case "number":
|
|
527
|
-
return
|
|
619
|
+
return { kind: "predefinedType", keyword: "double" };
|
|
528
620
|
}
|
|
529
621
|
}
|
|
530
|
-
|
|
622
|
+
if (keyType.kind === "referenceType" && keyType.name === "object") {
|
|
623
|
+
return { kind: "predefinedType", keyword: "object" };
|
|
624
|
+
}
|
|
531
625
|
throw new Error(`ICE: Unsupported dictionary key type reached emitter - validation missed TSN7413. Got: ${JSON.stringify(keyType)}`);
|
|
532
626
|
};
|
|
533
627
|
/**
|
|
534
|
-
* Resolve contextual type to C# type
|
|
535
|
-
* Uses emitType to properly handle generic type arguments.
|
|
536
|
-
* For imported types, qualifies using importBindings.
|
|
628
|
+
* Resolve contextual type to C# type AST.
|
|
537
629
|
*/
|
|
538
|
-
const
|
|
630
|
+
const resolveContextualTypeAst = (contextualType, context) => {
|
|
539
631
|
if (!contextualType) {
|
|
540
632
|
return [undefined, context];
|
|
541
633
|
}
|
|
542
|
-
// For reference types, check if imported and qualify if needed
|
|
543
634
|
if (contextualType.kind === "referenceType") {
|
|
544
635
|
const typeName = contextualType.name;
|
|
545
636
|
const importBinding = context.importBindings?.get(typeName);
|
|
546
637
|
if (importBinding && importBinding.kind === "type") {
|
|
547
|
-
// Imported type - use qualified name from binding
|
|
548
|
-
// Emit type arguments if present
|
|
549
638
|
if (contextualType.typeArguments &&
|
|
550
639
|
contextualType.typeArguments.length > 0) {
|
|
551
640
|
let currentContext = context;
|
|
552
|
-
const
|
|
641
|
+
const typeArgAsts = [];
|
|
553
642
|
for (const typeArg of contextualType.typeArguments) {
|
|
554
|
-
const [
|
|
555
|
-
|
|
643
|
+
const [typeArgAst, newContext] = emitTypeAst(typeArg, currentContext);
|
|
644
|
+
typeArgAsts.push(typeArgAst);
|
|
556
645
|
currentContext = newContext;
|
|
557
646
|
}
|
|
558
647
|
return [
|
|
559
|
-
|
|
648
|
+
{
|
|
649
|
+
kind: "identifierType",
|
|
650
|
+
name: importBinding.clrName,
|
|
651
|
+
typeArguments: typeArgAsts,
|
|
652
|
+
},
|
|
560
653
|
currentContext,
|
|
561
654
|
];
|
|
562
655
|
}
|
|
563
|
-
return [importBinding.clrName, context];
|
|
656
|
+
return [{ kind: "identifierType", name: importBinding.clrName }, context];
|
|
564
657
|
}
|
|
565
|
-
// Local type - use emitType to handle type arguments
|
|
566
|
-
const [typeStr, newContext] = emitType(contextualType, context);
|
|
567
|
-
return [typeStr, newContext];
|
|
568
658
|
}
|
|
569
|
-
|
|
570
|
-
const [typeStr, newContext] = emitType(contextualType, context);
|
|
571
|
-
return [typeStr, newContext];
|
|
659
|
+
return emitTypeAst(contextualType, context);
|
|
572
660
|
};
|
|
573
661
|
/**
|
|
574
|
-
* Emit a tuple literal as
|
|
662
|
+
* Emit a tuple literal as CSharpExpressionAst
|
|
575
663
|
*
|
|
576
664
|
* Input: const t: [string, number] = ["hello", 42];
|
|
577
665
|
* Output: ("hello", 42.0)
|
|
578
|
-
*
|
|
579
|
-
* C# ValueTuple has implicit tuple literal syntax with parentheses.
|
|
580
666
|
*/
|
|
581
667
|
const emitTupleLiteral = (expr, context, tupleType) => {
|
|
582
668
|
let currentContext = context;
|
|
583
|
-
const
|
|
669
|
+
const elemAsts = [];
|
|
584
670
|
const definedElements = expr.elements.filter((el) => el !== undefined);
|
|
585
|
-
// Emit each element with its expected type from the tuple type
|
|
586
671
|
for (let i = 0; i < definedElements.length; i++) {
|
|
587
672
|
const element = definedElements[i];
|
|
588
673
|
const expectedElementType = tupleType.elementTypes[i];
|
|
589
674
|
if (element) {
|
|
590
|
-
const [
|
|
591
|
-
|
|
675
|
+
const [elemAst, newContext] = emitExpressionAst(element, currentContext, expectedElementType);
|
|
676
|
+
elemAsts.push(elemAst);
|
|
592
677
|
currentContext = newContext;
|
|
593
678
|
}
|
|
594
679
|
}
|
|
595
|
-
//
|
|
596
|
-
|
|
597
|
-
return [{ text }, currentContext];
|
|
680
|
+
// C# tuple literal: (elem1, elem2, ...)
|
|
681
|
+
return [{ kind: "tupleExpression", elements: elemAsts }, currentContext];
|
|
598
682
|
};
|
|
599
683
|
//# sourceMappingURL=collections.js.map
|