@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,19 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Expression Emitter - IR expressions to C# code
|
|
3
3
|
* Main dispatcher - delegates to specialized modules
|
|
4
|
+
*
|
|
5
|
+
* Primary entry point is emitExpressionAst which returns [CSharpExpressionAst, EmitterContext].
|
|
4
6
|
*/
|
|
5
|
-
import {
|
|
6
|
-
import { substituteTypeArgs } from "./core/type-resolution.js";
|
|
7
|
+
import { emitTypeAst } from "./type-emitter.js";
|
|
8
|
+
import { substituteTypeArgs, resolveTypeAlias, stripNullish, } from "./core/semantic/type-resolution.js";
|
|
9
|
+
import { renderTypeAst } from "./core/format/backend-ast/utils.js";
|
|
7
10
|
// Import expression emitters from specialized modules
|
|
8
11
|
import { emitLiteral } from "./expressions/literals.js";
|
|
9
12
|
import { emitIdentifier } from "./expressions/identifiers.js";
|
|
10
13
|
import { emitArray, emitObject } from "./expressions/collections.js";
|
|
11
14
|
import { emitMemberAccess } from "./expressions/access.js";
|
|
12
|
-
import { emitCall
|
|
15
|
+
import { emitCall } from "./expressions/calls/call-emitter.js";
|
|
16
|
+
import { emitNew } from "./expressions/calls/new-emitter.js";
|
|
13
17
|
import { emitBinary, emitLogical, emitUnary, emitUpdate, emitAssignment, emitConditional, } from "./expressions/operators.js";
|
|
14
18
|
import { emitFunctionExpression, emitArrowFunction, } from "./expressions/functions.js";
|
|
15
19
|
import { emitTemplateLiteral, emitSpread, emitAwait, } from "./expressions/other.js";
|
|
16
|
-
import { formatCastOperandText } from "./expressions/parentheses.js";
|
|
17
20
|
const getBareTypeParameterName = (type, context) => {
|
|
18
21
|
if (type.kind === "typeParameterType")
|
|
19
22
|
return type.name;
|
|
@@ -40,21 +43,28 @@ const getUnconstrainedNullishTypeParamName = (type, context) => {
|
|
|
40
43
|
const constraintKind = context.typeParamConstraints?.get(typeParamName) ?? "unconstrained";
|
|
41
44
|
return constraintKind === "unconstrained" ? typeParamName : undefined;
|
|
42
45
|
};
|
|
43
|
-
const
|
|
46
|
+
const maybeCastNullishTypeParamAst = (expr, ast, context, expectedType) => {
|
|
44
47
|
if (!expectedType)
|
|
45
|
-
return [
|
|
48
|
+
return [ast, context];
|
|
46
49
|
if (!expr.inferredType)
|
|
47
|
-
return [
|
|
50
|
+
return [ast, context];
|
|
48
51
|
const expectedTypeParam = getBareTypeParameterName(expectedType, context);
|
|
49
52
|
if (!expectedTypeParam)
|
|
50
|
-
return [
|
|
53
|
+
return [ast, context];
|
|
51
54
|
const unionTypeParam = getUnconstrainedNullishTypeParamName(expr.inferredType, context);
|
|
52
55
|
if (!unionTypeParam)
|
|
53
|
-
return [
|
|
56
|
+
return [ast, context];
|
|
54
57
|
if (unionTypeParam !== expectedTypeParam)
|
|
55
|
-
return [
|
|
56
|
-
const [
|
|
57
|
-
return [
|
|
58
|
+
return [ast, context];
|
|
59
|
+
const [typeAst, newContext] = emitTypeAst(expectedType, context);
|
|
60
|
+
return [
|
|
61
|
+
{
|
|
62
|
+
kind: "castExpression",
|
|
63
|
+
type: typeAst,
|
|
64
|
+
expression: ast,
|
|
65
|
+
},
|
|
66
|
+
newContext,
|
|
67
|
+
];
|
|
58
68
|
};
|
|
59
69
|
const getNullableUnionBaseType = (type) => {
|
|
60
70
|
if (type.kind !== "unionType")
|
|
@@ -73,8 +83,6 @@ const isNonNullableValueType = (type) => {
|
|
|
73
83
|
type.name === "char");
|
|
74
84
|
}
|
|
75
85
|
if (type.kind === "referenceType") {
|
|
76
|
-
// C# primitive aliases represented as reference types via @tsonic/core.
|
|
77
|
-
// Keep this list strict — we only unwrap when `.Value` exists.
|
|
78
86
|
return (type.name === "sbyte" ||
|
|
79
87
|
type.name === "short" ||
|
|
80
88
|
type.name === "int" ||
|
|
@@ -103,23 +111,20 @@ const isSameTypeForNullableUnwrap = (base, expected) => {
|
|
|
103
111
|
return base.name === expected.name;
|
|
104
112
|
}
|
|
105
113
|
if (base.kind === "referenceType" && expected.kind === "referenceType") {
|
|
106
|
-
// This unwrap is only for Nullable<T> value types, so keep matching strict.
|
|
107
114
|
return (base.name === expected.name &&
|
|
108
115
|
(base.typeArguments?.length ?? 0) === 0 &&
|
|
109
116
|
(expected.typeArguments?.length ?? 0) === 0);
|
|
110
117
|
}
|
|
111
118
|
return false;
|
|
112
119
|
};
|
|
113
|
-
const
|
|
120
|
+
const maybeUnwrapNullableValueTypeAst = (expr, ast, context, expectedType) => {
|
|
114
121
|
if (!expectedType)
|
|
115
|
-
return [
|
|
122
|
+
return [ast, context];
|
|
116
123
|
if (!expr.inferredType)
|
|
117
|
-
return [
|
|
118
|
-
// Only unwrap direct nullable values.
|
|
119
|
-
// C# nullish coalescing already produces a non-nullable result when the
|
|
120
|
-
// fallback is non-nullable, so adding `.Value` is incorrect.
|
|
124
|
+
return [ast, context];
|
|
125
|
+
// Only unwrap direct nullable values.
|
|
121
126
|
if (expr.kind !== "identifier" && expr.kind !== "memberAccess") {
|
|
122
|
-
return [
|
|
127
|
+
return [ast, context];
|
|
123
128
|
}
|
|
124
129
|
const getMemberAccessNarrowKey = (m) => {
|
|
125
130
|
if (m.isComputed)
|
|
@@ -135,8 +140,6 @@ const maybeUnwrapNullableValueType = (expr, fragment, context, expectedType) =>
|
|
|
135
140
|
}
|
|
136
141
|
return undefined;
|
|
137
142
|
};
|
|
138
|
-
// If a narrowing pass already rewrote this identifier (e.g., `id` → `id.Value`
|
|
139
|
-
// or `id` → `id__n`), don't apply a second Nullable<T> unwrap.
|
|
140
143
|
if (context.narrowedBindings &&
|
|
141
144
|
((expr.kind === "identifier" && context.narrowedBindings.has(expr.name)) ||
|
|
142
145
|
(expr.kind === "memberAccess" &&
|
|
@@ -144,67 +147,278 @@ const maybeUnwrapNullableValueType = (expr, fragment, context, expectedType) =>
|
|
|
144
147
|
const key = getMemberAccessNarrowKey(expr);
|
|
145
148
|
return key ? context.narrowedBindings.has(key) : false;
|
|
146
149
|
})()))) {
|
|
147
|
-
return [
|
|
150
|
+
return [ast, context];
|
|
148
151
|
}
|
|
149
152
|
const nullableBase = getNullableUnionBaseType(expr.inferredType);
|
|
150
153
|
if (!nullableBase)
|
|
151
|
-
return [
|
|
152
|
-
// Only unwrap when the expected type is a non-nullable value type and
|
|
153
|
-
// the expression is a nullable union of that exact base type.
|
|
154
|
+
return [ast, context];
|
|
154
155
|
if (!isNonNullableValueType(expectedType))
|
|
155
|
-
return [
|
|
156
|
+
return [ast, context];
|
|
156
157
|
if (!isSameTypeForNullableUnwrap(nullableBase, expectedType)) {
|
|
157
|
-
return [
|
|
158
|
+
return [ast, context];
|
|
158
159
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
160
|
+
// Append .Value
|
|
161
|
+
return [
|
|
162
|
+
{
|
|
163
|
+
kind: "memberAccessExpression",
|
|
164
|
+
expression: ast,
|
|
165
|
+
memberName: "Value",
|
|
166
|
+
},
|
|
167
|
+
context,
|
|
168
|
+
];
|
|
169
|
+
};
|
|
170
|
+
const normalizeComparableType = (type, context) => resolveTypeAlias(stripNullish(type), context);
|
|
171
|
+
const areIrTypesEquivalent = (left, right, context) => {
|
|
172
|
+
const a = normalizeComparableType(left, context);
|
|
173
|
+
const b = normalizeComparableType(right, context);
|
|
174
|
+
if (a.kind !== b.kind)
|
|
175
|
+
return false;
|
|
176
|
+
switch (a.kind) {
|
|
177
|
+
case "primitiveType":
|
|
178
|
+
return a.name === b.name;
|
|
179
|
+
case "literalType":
|
|
180
|
+
return a.value === b.value;
|
|
181
|
+
case "referenceType": {
|
|
182
|
+
const rb = b;
|
|
183
|
+
if (a.name !== rb.name)
|
|
184
|
+
return false;
|
|
185
|
+
const aArgs = a.typeArguments ?? [];
|
|
186
|
+
const bArgs = rb.typeArguments ?? [];
|
|
187
|
+
if (aArgs.length !== bArgs.length)
|
|
188
|
+
return false;
|
|
189
|
+
for (let i = 0; i < aArgs.length; i++) {
|
|
190
|
+
const aa = aArgs[i];
|
|
191
|
+
const bb = bArgs[i];
|
|
192
|
+
if (!aa || !bb || !areIrTypesEquivalent(aa, bb, context))
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
case "arrayType":
|
|
198
|
+
return areIrTypesEquivalent(a.elementType, b.elementType, context);
|
|
199
|
+
case "dictionaryType":
|
|
200
|
+
return (areIrTypesEquivalent(a.keyType, b.keyType, context) &&
|
|
201
|
+
areIrTypesEquivalent(a.valueType, b.valueType, context));
|
|
202
|
+
case "tupleType": {
|
|
203
|
+
const rb = b;
|
|
204
|
+
if (a.elementTypes.length !== rb.elementTypes.length)
|
|
205
|
+
return false;
|
|
206
|
+
for (let i = 0; i < a.elementTypes.length; i++) {
|
|
207
|
+
const ae = a.elementTypes[i];
|
|
208
|
+
const be = rb.elementTypes[i];
|
|
209
|
+
if (!ae || !be || !areIrTypesEquivalent(ae, be, context))
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
case "functionType": {
|
|
215
|
+
const rb = b;
|
|
216
|
+
if (a.parameters.length !== rb.parameters.length)
|
|
217
|
+
return false;
|
|
218
|
+
for (let i = 0; i < a.parameters.length; i++) {
|
|
219
|
+
const ap = a.parameters[i];
|
|
220
|
+
const bp = rb.parameters[i];
|
|
221
|
+
if (!ap || !bp)
|
|
222
|
+
return false;
|
|
223
|
+
if (!ap.type && !bp.type)
|
|
224
|
+
continue;
|
|
225
|
+
if (!ap.type || !bp.type)
|
|
226
|
+
return false;
|
|
227
|
+
if (!areIrTypesEquivalent(ap.type, bp.type, context))
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
return areIrTypesEquivalent(a.returnType, rb.returnType, context);
|
|
231
|
+
}
|
|
232
|
+
case "unionType":
|
|
233
|
+
case "intersectionType": {
|
|
234
|
+
const rb = b;
|
|
235
|
+
if (a.types.length !== rb.types.length)
|
|
236
|
+
return false;
|
|
237
|
+
const used = new Set();
|
|
238
|
+
for (const at of a.types) {
|
|
239
|
+
if (!at)
|
|
240
|
+
return false;
|
|
241
|
+
let matched = false;
|
|
242
|
+
for (let i = 0; i < rb.types.length; i++) {
|
|
243
|
+
if (used.has(i))
|
|
244
|
+
continue;
|
|
245
|
+
const bt = rb.types[i];
|
|
246
|
+
if (!bt)
|
|
247
|
+
continue;
|
|
248
|
+
if (areIrTypesEquivalent(at, bt, context)) {
|
|
249
|
+
used.add(i);
|
|
250
|
+
matched = true;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (!matched)
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
case "typeParameterType":
|
|
260
|
+
return a.name === b.name;
|
|
261
|
+
case "voidType":
|
|
262
|
+
case "anyType":
|
|
263
|
+
case "unknownType":
|
|
264
|
+
case "neverType":
|
|
265
|
+
return true;
|
|
266
|
+
case "objectType": {
|
|
267
|
+
const rb = b;
|
|
268
|
+
if (a.members.length !== rb.members.length)
|
|
269
|
+
return false;
|
|
270
|
+
for (let i = 0; i < a.members.length; i++) {
|
|
271
|
+
const am = a.members[i];
|
|
272
|
+
const bm = rb.members[i];
|
|
273
|
+
if (!am || !bm || am.kind !== bm.kind)
|
|
274
|
+
return false;
|
|
275
|
+
if (am.kind === "propertySignature" &&
|
|
276
|
+
bm.kind === "propertySignature") {
|
|
277
|
+
if (am.name !== bm.name)
|
|
278
|
+
return false;
|
|
279
|
+
if (!areIrTypesEquivalent(am.type, bm.type, context))
|
|
280
|
+
return false;
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
if (am.kind === "methodSignature" && bm.kind === "methodSignature") {
|
|
284
|
+
if (am.name !== bm.name)
|
|
285
|
+
return false;
|
|
286
|
+
if (am.parameters.length !== bm.parameters.length)
|
|
287
|
+
return false;
|
|
288
|
+
for (let j = 0; j < am.parameters.length; j++) {
|
|
289
|
+
const ap = am.parameters[j];
|
|
290
|
+
const bp = bm.parameters[j];
|
|
291
|
+
if (!ap || !bp)
|
|
292
|
+
return false;
|
|
293
|
+
if (!ap.type || !bp.type)
|
|
294
|
+
return false;
|
|
295
|
+
if (!areIrTypesEquivalent(ap.type, bp.type, context))
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
if (!am.returnType || !bm.returnType)
|
|
299
|
+
return false;
|
|
300
|
+
if (!areIrTypesEquivalent(am.returnType, bm.returnType, context))
|
|
301
|
+
return false;
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
const maybeUpcastDictionaryUnionValueAst = (expr, ast, context, expectedType) => {
|
|
311
|
+
if (!expectedType || !expr.inferredType)
|
|
312
|
+
return [ast, context];
|
|
313
|
+
const expected = normalizeComparableType(expectedType, context);
|
|
314
|
+
const actual = normalizeComparableType(expr.inferredType, context);
|
|
315
|
+
if (expected.kind !== "dictionaryType" || actual.kind !== "dictionaryType") {
|
|
316
|
+
return [ast, context];
|
|
317
|
+
}
|
|
318
|
+
if (!areIrTypesEquivalent(expected.keyType, actual.keyType, context)) {
|
|
319
|
+
return [ast, context];
|
|
320
|
+
}
|
|
321
|
+
const expectedValue = normalizeComparableType(expected.valueType, context);
|
|
322
|
+
if (expectedValue.kind !== "unionType")
|
|
323
|
+
return [ast, context];
|
|
324
|
+
const actualValue = normalizeComparableType(actual.valueType, context);
|
|
325
|
+
if (areIrTypesEquivalent(expectedValue, actualValue, context)) {
|
|
326
|
+
return [ast, context];
|
|
327
|
+
}
|
|
328
|
+
let matchingMemberIndex = -1;
|
|
329
|
+
for (let i = 0; i < expectedValue.types.length; i++) {
|
|
330
|
+
const member = expectedValue.types[i];
|
|
331
|
+
if (!member)
|
|
332
|
+
continue;
|
|
333
|
+
if (areIrTypesEquivalent(member, actualValue, context)) {
|
|
334
|
+
matchingMemberIndex = i + 1;
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
if (matchingMemberIndex === -1)
|
|
339
|
+
return [ast, context];
|
|
340
|
+
const [unionValueTypeAst, ctx1] = emitTypeAst(expected.valueType, context);
|
|
341
|
+
const unionTypeText = renderTypeAst(unionValueTypeAst);
|
|
342
|
+
const kvpId = "kvp";
|
|
343
|
+
const keySelector = {
|
|
344
|
+
kind: "lambdaExpression",
|
|
345
|
+
isAsync: false,
|
|
346
|
+
parameters: [{ name: kvpId }],
|
|
347
|
+
body: {
|
|
348
|
+
kind: "memberAccessExpression",
|
|
349
|
+
expression: { kind: "identifierExpression", identifier: kvpId },
|
|
350
|
+
memberName: "Key",
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
const valueSelector = {
|
|
354
|
+
kind: "lambdaExpression",
|
|
355
|
+
isAsync: false,
|
|
356
|
+
parameters: [{ name: kvpId }],
|
|
357
|
+
body: {
|
|
358
|
+
kind: "invocationExpression",
|
|
359
|
+
expression: {
|
|
360
|
+
kind: "memberAccessExpression",
|
|
361
|
+
expression: {
|
|
362
|
+
kind: "identifierExpression",
|
|
363
|
+
identifier: unionTypeText,
|
|
364
|
+
},
|
|
365
|
+
memberName: `From${matchingMemberIndex}`,
|
|
366
|
+
},
|
|
367
|
+
arguments: [
|
|
368
|
+
{
|
|
369
|
+
kind: "memberAccessExpression",
|
|
370
|
+
expression: { kind: "identifierExpression", identifier: kvpId },
|
|
371
|
+
memberName: "Value",
|
|
372
|
+
},
|
|
373
|
+
],
|
|
374
|
+
},
|
|
375
|
+
};
|
|
376
|
+
const converted = {
|
|
377
|
+
kind: "invocationExpression",
|
|
378
|
+
expression: {
|
|
379
|
+
kind: "memberAccessExpression",
|
|
380
|
+
expression: {
|
|
381
|
+
kind: "identifierExpression",
|
|
382
|
+
identifier: "global::System.Linq.Enumerable",
|
|
383
|
+
},
|
|
384
|
+
memberName: "ToDictionary",
|
|
385
|
+
},
|
|
386
|
+
arguments: [ast, keySelector, valueSelector],
|
|
387
|
+
};
|
|
388
|
+
return [converted, ctx1];
|
|
162
389
|
};
|
|
163
390
|
/**
|
|
164
|
-
* Emit a numeric narrowing expression.
|
|
165
|
-
*
|
|
166
|
-
* If the inner expression is already proven to produce the target type,
|
|
167
|
-
* emit it directly without a cast. Otherwise, emit with an explicit cast.
|
|
168
|
-
*
|
|
169
|
-
* Key cases:
|
|
170
|
-
* - Literal 10 as int → "10" (no cast, no .0)
|
|
171
|
-
* - Variable x as int (where x is already int) → "x" (no cast)
|
|
172
|
-
* - Expression (x + y) as int (where result is int) → "x + y" (no cast)
|
|
391
|
+
* Emit a numeric narrowing expression as CSharpExpressionAst.
|
|
173
392
|
*/
|
|
174
393
|
const emitNumericNarrowing = (expr, context) => {
|
|
175
|
-
// If we have a proof that the inner expression already produces the target type,
|
|
176
|
-
// we don't need a cast - just emit the inner expression
|
|
177
394
|
if (expr.proof !== undefined) {
|
|
178
|
-
// For literals, pass the target type so they emit without decimal point
|
|
179
395
|
if (expr.proof.source.type === "literal") {
|
|
180
|
-
const [
|
|
181
|
-
|
|
182
|
-
return [innerCode, newContext];
|
|
396
|
+
const [innerAst, newContext] = emitExpressionAst(expr.expression, context, expr.inferredType);
|
|
397
|
+
return [innerAst, newContext];
|
|
183
398
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
399
|
+
const [innerAst, ctx1] = emitExpressionAst(expr.expression, context);
|
|
400
|
+
const [typeAst, ctx2] = emitTypeAst(expr.inferredType, ctx1);
|
|
401
|
+
return [
|
|
402
|
+
{
|
|
403
|
+
kind: "castExpression",
|
|
404
|
+
type: typeAst,
|
|
405
|
+
expression: innerAst,
|
|
406
|
+
},
|
|
407
|
+
ctx2,
|
|
408
|
+
];
|
|
191
409
|
}
|
|
192
|
-
// HARD GATE: No proof means the proof pass failed to catch an unprovable narrowing.
|
|
193
|
-
// This is an internal compiler error - the proof pass should have aborted compilation.
|
|
194
|
-
// We must NOT silently emit a cast, as that would be a soundness violation.
|
|
195
410
|
throw new Error(`Internal error: numericNarrowing without proof reached emitter. ` +
|
|
196
411
|
`Target: ${expr.targetKind}, Expression kind: ${expr.expression.kind}. ` +
|
|
197
412
|
`This indicates a bug in the numeric proof pass - it should have ` +
|
|
198
413
|
`emitted a diagnostic and aborted compilation.`);
|
|
199
414
|
};
|
|
200
415
|
/**
|
|
201
|
-
* Emit a type assertion expression.
|
|
416
|
+
* Emit a type assertion expression as CSharpExpressionAst.
|
|
202
417
|
*
|
|
203
418
|
* TypeScript `x as T` becomes C# `(T)x` (throwing cast).
|
|
204
|
-
* This is a checked cast that throws InvalidCastException on failure.
|
|
205
419
|
*/
|
|
206
420
|
const emitTypeAssertion = (expr, context) => {
|
|
207
|
-
const [
|
|
421
|
+
const [innerAst, ctx1] = emitExpressionAst(expr.expression, context, expr.targetType);
|
|
208
422
|
const resolveLocalTypeAliases = (target) => {
|
|
209
423
|
if (target.kind === "referenceType" && ctx1.localTypes) {
|
|
210
424
|
const typeInfo = ctx1.localTypes.get(target.name);
|
|
@@ -218,15 +432,7 @@ const emitTypeAssertion = (expr, context) => {
|
|
|
218
432
|
return target;
|
|
219
433
|
};
|
|
220
434
|
const shouldEraseTypeAssertion = (target) => {
|
|
221
|
-
// tsbindgen `ExtensionMethods<TShape>` is a TYPE-ONLY helper used to surface C#
|
|
222
|
-
// extension methods as instance-style members in TypeScript. It must never
|
|
223
|
-
// introduce runtime casts in emitted C# (notably for EF Core query precompilation).
|
|
224
|
-
//
|
|
225
|
-
// `x as ExtensionMethods<T>` (or a local alias that expands to it) is a no-op
|
|
226
|
-
// at runtime; preserve the original expression verbatim.
|
|
227
435
|
const resolved = resolveLocalTypeAliases(target);
|
|
228
|
-
// TypeScript `as unknown` is also type-only. Casting to `object` in C# is a
|
|
229
|
-
// semantic no-op and can break analyzers that expect idiomatic syntax.
|
|
230
436
|
if (resolved.kind === "unknownType") {
|
|
231
437
|
return true;
|
|
232
438
|
}
|
|
@@ -237,21 +443,15 @@ const emitTypeAssertion = (expr, context) => {
|
|
|
237
443
|
return true;
|
|
238
444
|
}
|
|
239
445
|
}
|
|
240
|
-
// ExtensionMethods_* aliases often normalize to an intersection that includes one
|
|
241
|
-
// or more `__Ext_*` constituents. Those `__Ext_*` types have no runtime
|
|
242
|
-
// representation, so the assertion must be erased.
|
|
243
446
|
if (resolved.kind === "intersectionType") {
|
|
244
447
|
return resolved.types.some((t) => t.kind === "referenceType" && t.name.startsWith("__Ext_"));
|
|
245
448
|
}
|
|
246
449
|
return false;
|
|
247
450
|
};
|
|
248
451
|
if (shouldEraseTypeAssertion(expr.targetType)) {
|
|
249
|
-
return [
|
|
452
|
+
return [innerAst, ctx1];
|
|
250
453
|
}
|
|
251
454
|
const resolveRuntimeCastTarget = (target, ctx) => {
|
|
252
|
-
// 1) Resolve local type aliases for runtime casting.
|
|
253
|
-
// TypeScript type aliases have no runtime representation in C#, except for
|
|
254
|
-
// object-literal aliases which we synthesize as classes (`Foo__Alias`).
|
|
255
455
|
if (target.kind === "referenceType" && ctx.localTypes) {
|
|
256
456
|
const typeInfo = ctx.localTypes.get(target.name);
|
|
257
457
|
if (typeInfo?.kind === "typeAlias") {
|
|
@@ -261,12 +461,9 @@ const emitTypeAssertion = (expr, context) => {
|
|
|
261
461
|
: typeInfo.type;
|
|
262
462
|
return resolveRuntimeCastTarget(substituted, ctx);
|
|
263
463
|
}
|
|
264
|
-
// objectType aliases are emitted as `Name__Alias` by emitReferenceType
|
|
265
464
|
return target;
|
|
266
465
|
}
|
|
267
466
|
}
|
|
268
|
-
// 2) Erase tsbindgen extension-method wrapper types at runtime:
|
|
269
|
-
// ExtensionMethods<TShape> is type-only; values are just TShape.
|
|
270
467
|
if (target.kind === "referenceType" && target.typeArguments?.length) {
|
|
271
468
|
const importBinding = ctx.importBindings?.get(target.name);
|
|
272
469
|
const clrName = importBinding?.kind === "type" ? importBinding.clrName : "";
|
|
@@ -276,7 +473,6 @@ const emitTypeAssertion = (expr, context) => {
|
|
|
276
473
|
return resolveRuntimeCastTarget(shape, ctx);
|
|
277
474
|
}
|
|
278
475
|
}
|
|
279
|
-
// 3) Intersection types have no C# cast target; cast to the first runtime-like constituent.
|
|
280
476
|
if (target.kind === "intersectionType") {
|
|
281
477
|
for (const part of target.types) {
|
|
282
478
|
const resolved = resolveRuntimeCastTarget(part, ctx);
|
|
@@ -291,67 +487,83 @@ const emitTypeAssertion = (expr, context) => {
|
|
|
291
487
|
return target;
|
|
292
488
|
};
|
|
293
489
|
const runtimeTarget = resolveRuntimeCastTarget(expr.targetType, ctx1);
|
|
294
|
-
const [
|
|
295
|
-
|
|
296
|
-
|
|
490
|
+
const [typeAst, ctx2] = emitTypeAst(runtimeTarget, ctx1);
|
|
491
|
+
return [
|
|
492
|
+
{
|
|
493
|
+
kind: "castExpression",
|
|
494
|
+
type: typeAst,
|
|
495
|
+
expression: innerAst,
|
|
496
|
+
},
|
|
497
|
+
ctx2,
|
|
498
|
+
];
|
|
297
499
|
};
|
|
298
500
|
/**
|
|
299
|
-
* Emit an asinterface expression.
|
|
300
|
-
*
|
|
301
|
-
* `asinterface<T>(x)` is a compile-time-only intrinsic. It must never emit a runtime
|
|
302
|
-
* cast or function call. Emission relies on contextual typing in C# (typed locals,
|
|
303
|
-
* parameter types, return types) to apply the interface conversion.
|
|
501
|
+
* Emit an asinterface expression as CSharpExpressionAst.
|
|
304
502
|
*/
|
|
305
503
|
const emitAsInterface = (expr, context, expectedType) => {
|
|
306
504
|
const expected = expectedType ?? expr.targetType;
|
|
307
|
-
return
|
|
505
|
+
return emitExpressionAst(expr.expression, context, expected);
|
|
308
506
|
};
|
|
309
507
|
/**
|
|
310
|
-
* Emit a trycast expression.
|
|
508
|
+
* Emit a trycast expression as CSharpExpressionAst.
|
|
311
509
|
*
|
|
312
510
|
* TypeScript `trycast<T>(x)` becomes C# `x as T` (safe cast).
|
|
313
|
-
* This returns null if the cast fails instead of throwing.
|
|
314
511
|
*/
|
|
315
512
|
const emitTryCast = (expr, context) => {
|
|
316
|
-
const [
|
|
317
|
-
const [
|
|
318
|
-
|
|
319
|
-
|
|
513
|
+
const [innerAst, ctx1] = emitExpressionAst(expr.expression, context);
|
|
514
|
+
const [typeAst, ctx2] = emitTypeAst(expr.targetType, ctx1);
|
|
515
|
+
return [
|
|
516
|
+
{
|
|
517
|
+
kind: "asExpression",
|
|
518
|
+
expression: innerAst,
|
|
519
|
+
type: typeAst,
|
|
520
|
+
},
|
|
521
|
+
ctx2,
|
|
522
|
+
];
|
|
320
523
|
};
|
|
321
524
|
/**
|
|
322
|
-
* Emit a stackalloc expression.
|
|
323
|
-
*
|
|
324
|
-
* TypeScript `stackalloc<T>(n)` becomes C# `stackalloc T[n]`.
|
|
525
|
+
* Emit a stackalloc expression as CSharpExpressionAst.
|
|
325
526
|
*/
|
|
326
527
|
const emitStackAlloc = (expr, context) => {
|
|
327
|
-
const [
|
|
328
|
-
const [
|
|
528
|
+
const [elementTypeAst, ctx1] = emitTypeAst(expr.elementType, context);
|
|
529
|
+
const [sizeAst, ctx2] = emitExpressionAst(expr.size, ctx1, {
|
|
329
530
|
kind: "primitiveType",
|
|
330
531
|
name: "int",
|
|
331
532
|
});
|
|
332
|
-
return [
|
|
533
|
+
return [
|
|
534
|
+
{
|
|
535
|
+
kind: "stackAllocArrayCreationExpression",
|
|
536
|
+
elementType: elementTypeAst,
|
|
537
|
+
sizeExpression: sizeAst,
|
|
538
|
+
},
|
|
539
|
+
ctx2,
|
|
540
|
+
];
|
|
333
541
|
};
|
|
334
542
|
/**
|
|
335
|
-
* Emit a defaultof expression.
|
|
336
|
-
*
|
|
337
|
-
* TypeScript `defaultof<T>()` becomes C# `default(T)`.
|
|
543
|
+
* Emit a defaultof expression as CSharpExpressionAst.
|
|
338
544
|
*/
|
|
339
545
|
const emitDefaultOf = (expr, context) => {
|
|
340
|
-
const [
|
|
341
|
-
return [
|
|
546
|
+
const [typeAst, ctx1] = emitTypeAst(expr.targetType, context);
|
|
547
|
+
return [
|
|
548
|
+
{
|
|
549
|
+
kind: "defaultExpression",
|
|
550
|
+
type: typeAst,
|
|
551
|
+
},
|
|
552
|
+
ctx1,
|
|
553
|
+
];
|
|
342
554
|
};
|
|
343
555
|
/**
|
|
344
|
-
* Emit a C# expression from an IR expression
|
|
556
|
+
* Emit a C# expression AST from an IR expression.
|
|
557
|
+
* Primary entry point for expression emission.
|
|
558
|
+
*
|
|
345
559
|
* @param expr The IR expression to emit
|
|
346
560
|
* @param context The emitter context
|
|
347
|
-
* @param expectedType Optional expected type for contextual typing
|
|
561
|
+
* @param expectedType Optional expected type for contextual typing
|
|
348
562
|
*/
|
|
349
|
-
export const
|
|
350
|
-
const [
|
|
563
|
+
export const emitExpressionAst = (expr, context, expectedType) => {
|
|
564
|
+
const [ast, newContext] = (() => {
|
|
351
565
|
switch (expr.kind) {
|
|
352
566
|
case "literal":
|
|
353
|
-
// Pass expectedType for null → default conversion in generic contexts
|
|
354
|
-
// Numeric literals use raw lexeme (no contextual widening under new spec)
|
|
355
567
|
return emitLiteral(expr, context, expectedType);
|
|
356
568
|
case "identifier":
|
|
357
569
|
return emitIdentifier(expr, context, expectedType);
|
|
@@ -388,7 +600,10 @@ export const emitExpression = (expr, context, expectedType) => {
|
|
|
388
600
|
case "await":
|
|
389
601
|
return emitAwait(expr, context);
|
|
390
602
|
case "this":
|
|
391
|
-
return [
|
|
603
|
+
return [
|
|
604
|
+
{ kind: "identifierExpression", identifier: "this" },
|
|
605
|
+
context,
|
|
606
|
+
];
|
|
392
607
|
case "numericNarrowing":
|
|
393
608
|
return emitNumericNarrowing(expr, context);
|
|
394
609
|
case "asinterface":
|
|
@@ -405,9 +620,10 @@ export const emitExpression = (expr, context, expectedType) => {
|
|
|
405
620
|
throw new Error(`Unhandled IR expression kind: ${String(expr.kind)}`);
|
|
406
621
|
}
|
|
407
622
|
})();
|
|
408
|
-
const [
|
|
409
|
-
|
|
623
|
+
const [castedAst, castedContext] = maybeCastNullishTypeParamAst(expr, ast, newContext, expectedType);
|
|
624
|
+
const [dictUpcastAst, dictUpcastContext] = maybeUpcastDictionaryUnionValueAst(expr, castedAst, castedContext, expectedType);
|
|
625
|
+
return maybeUnwrapNullableValueTypeAst(expr, dictUpcastAst, dictUpcastContext, expectedType);
|
|
410
626
|
};
|
|
411
|
-
// Re-export commonly used functions
|
|
412
|
-
export {
|
|
627
|
+
// Re-export commonly used functions from barrel
|
|
628
|
+
export { generateSpecializedName } from "./expressions/identifiers.js";
|
|
413
629
|
//# sourceMappingURL=expression-emitter.js.map
|