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