@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.
Files changed (520) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/adapter-generator.d.ts +5 -15
  3. package/dist/adapter-generator.d.ts.map +1 -1
  4. package/dist/adapter-generator.js +60 -53
  5. package/dist/adapter-generator.js.map +1 -1
  6. package/dist/contracts/backend-adapter.d.ts +36 -0
  7. package/dist/contracts/backend-adapter.d.ts.map +1 -0
  8. package/dist/contracts/backend-adapter.js +9 -0
  9. package/dist/contracts/backend-adapter.js.map +1 -0
  10. package/dist/contracts/emitter-contract.d.ts +54 -0
  11. package/dist/contracts/emitter-contract.d.ts.map +1 -0
  12. package/dist/contracts/emitter-contract.js +8 -0
  13. package/dist/contracts/emitter-contract.js.map +1 -0
  14. package/dist/contracts/import-classifier.d.ts +36 -0
  15. package/dist/contracts/import-classifier.d.ts.map +1 -0
  16. package/dist/contracts/import-classifier.js +9 -0
  17. package/dist/contracts/import-classifier.js.map +1 -0
  18. package/dist/core/{attributes.d.ts → format/attributes.d.ts} +9 -14
  19. package/dist/core/format/attributes.d.ts.map +1 -0
  20. package/dist/core/format/attributes.js +190 -0
  21. package/dist/core/format/attributes.js.map +1 -0
  22. package/dist/core/format/attributes.test.d.ts.map +1 -0
  23. package/dist/core/{attributes.test.js → format/attributes.test.js} +70 -32
  24. package/dist/core/format/attributes.test.js.map +1 -0
  25. package/dist/core/format/backend-ast/index.d.ts +7 -0
  26. package/dist/core/format/backend-ast/index.d.ts.map +1 -0
  27. package/dist/core/format/backend-ast/index.js +6 -0
  28. package/dist/core/format/backend-ast/index.js.map +1 -0
  29. package/dist/core/format/backend-ast/printer.d.ts +33 -0
  30. package/dist/core/format/backend-ast/printer.d.ts.map +1 -0
  31. package/dist/core/format/backend-ast/printer.js +1151 -0
  32. package/dist/core/format/backend-ast/printer.js.map +1 -0
  33. package/dist/core/format/backend-ast/types.d.ts +504 -0
  34. package/dist/core/format/backend-ast/types.d.ts.map +1 -0
  35. package/dist/core/format/backend-ast/types.js +13 -0
  36. package/dist/core/format/backend-ast/types.js.map +1 -0
  37. package/dist/core/format/backend-ast/utils.d.ts +26 -0
  38. package/dist/core/format/backend-ast/utils.d.ts.map +1 -0
  39. package/dist/core/format/backend-ast/utils.js +65 -0
  40. package/dist/core/format/backend-ast/utils.js.map +1 -0
  41. package/dist/core/{exports.d.ts → format/exports.d.ts} +2 -2
  42. package/dist/core/format/exports.d.ts.map +1 -0
  43. package/dist/core/format/exports.js +22 -0
  44. package/dist/core/format/exports.js.map +1 -0
  45. package/dist/core/format/index.d.ts +9 -0
  46. package/dist/core/format/index.d.ts.map +1 -0
  47. package/dist/core/format/index.js +9 -0
  48. package/dist/core/format/index.js.map +1 -0
  49. package/dist/core/{local-names.d.ts → format/local-names.d.ts} +1 -1
  50. package/dist/core/format/local-names.d.ts.map +1 -0
  51. package/dist/core/{local-names.js → format/local-names.js} +1 -1
  52. package/dist/core/format/local-names.js.map +1 -0
  53. package/dist/core/format/module-emitter/assembly.d.ts +27 -0
  54. package/dist/core/format/module-emitter/assembly.d.ts.map +1 -0
  55. package/dist/core/format/module-emitter/assembly.js +44 -0
  56. package/dist/core/format/module-emitter/assembly.js.map +1 -0
  57. package/dist/core/{module-emitter → format/module-emitter}/header.d.ts +1 -1
  58. package/dist/core/format/module-emitter/header.d.ts.map +1 -0
  59. package/dist/core/{module-emitter → format/module-emitter}/header.js +1 -1
  60. package/dist/core/format/module-emitter/header.js.map +1 -0
  61. package/dist/core/format/module-emitter/index.d.ts.map +1 -0
  62. package/dist/core/format/module-emitter/index.js.map +1 -0
  63. package/dist/core/format/module-emitter/namespace.d.ts +21 -0
  64. package/dist/core/format/module-emitter/namespace.d.ts.map +1 -0
  65. package/dist/core/format/module-emitter/namespace.js +58 -0
  66. package/dist/core/format/module-emitter/namespace.js.map +1 -0
  67. package/dist/core/{module-emitter → format/module-emitter}/orchestrator.d.ts +1 -1
  68. package/dist/core/format/module-emitter/orchestrator.d.ts.map +1 -0
  69. package/dist/core/{module-emitter → format/module-emitter}/orchestrator.js +19 -19
  70. package/dist/core/format/module-emitter/orchestrator.js.map +1 -0
  71. package/dist/core/format/module-emitter/separation.d.ts.map +1 -0
  72. package/dist/core/format/module-emitter/separation.js.map +1 -0
  73. package/dist/core/{module-emitter → format/module-emitter}/static-container.d.ts +8 -3
  74. package/dist/core/format/module-emitter/static-container.d.ts.map +1 -0
  75. package/dist/core/format/module-emitter/static-container.js +202 -0
  76. package/dist/core/format/module-emitter/static-container.js.map +1 -0
  77. package/dist/core/format/module-emitter.d.ts.map +1 -0
  78. package/dist/core/format/module-emitter.js.map +1 -0
  79. package/dist/core/{options.d.ts → format/options.d.ts} +1 -1
  80. package/dist/core/format/options.d.ts.map +1 -0
  81. package/dist/core/format/options.js.map +1 -0
  82. package/dist/core/index.d.ts +2 -7
  83. package/dist/core/index.d.ts.map +1 -1
  84. package/dist/core/index.js +2 -7
  85. package/dist/core/index.js.map +1 -1
  86. package/dist/core/semantic/boolean-context.d.ts +44 -0
  87. package/dist/core/semantic/boolean-context.d.ts.map +1 -0
  88. package/dist/core/semantic/boolean-context.js +717 -0
  89. package/dist/core/semantic/boolean-context.js.map +1 -0
  90. package/dist/core/semantic/boolean-context.test.d.ts.map +1 -0
  91. package/dist/core/{boolean-context.test.js → semantic/boolean-context.test.js} +86 -109
  92. package/dist/core/semantic/boolean-context.test.js.map +1 -0
  93. package/dist/core/{imports.d.ts → semantic/imports.d.ts} +1 -5
  94. package/dist/core/semantic/imports.d.ts.map +1 -0
  95. package/dist/core/{imports.js → semantic/imports.js} +56 -74
  96. package/dist/core/semantic/imports.js.map +1 -0
  97. package/dist/core/semantic/imports.test.d.ts.map +1 -0
  98. package/dist/core/semantic/imports.test.js +229 -0
  99. package/dist/core/semantic/imports.test.js.map +1 -0
  100. package/dist/core/semantic/index.d.ts +15 -0
  101. package/dist/core/semantic/index.d.ts.map +1 -0
  102. package/dist/core/semantic/index.js +15 -0
  103. package/dist/core/semantic/index.js.map +1 -0
  104. package/dist/core/{local-types.d.ts → semantic/local-types.d.ts} +1 -1
  105. package/dist/core/semantic/local-types.d.ts.map +1 -0
  106. package/dist/core/semantic/local-types.js.map +1 -0
  107. package/dist/core/{module-map.d.ts → semantic/module-map.d.ts} +1 -1
  108. package/dist/core/semantic/module-map.d.ts.map +1 -0
  109. package/dist/core/semantic/module-map.js.map +1 -0
  110. package/dist/core/semantic/module-map.test.d.ts.map +1 -0
  111. package/dist/core/semantic/module-map.test.js.map +1 -0
  112. package/dist/core/semantic/naming-collisions.d.ts.map +1 -0
  113. package/dist/core/{naming-collisions.js → semantic/naming-collisions.js} +1 -1
  114. package/dist/core/semantic/naming-collisions.js.map +1 -0
  115. package/dist/core/{type-alias-index.d.ts → semantic/type-alias-index.d.ts} +1 -1
  116. package/dist/core/semantic/type-alias-index.d.ts.map +1 -0
  117. package/dist/core/semantic/type-alias-index.js.map +1 -0
  118. package/dist/core/semantic/type-compatibility.d.ts.map +1 -0
  119. package/dist/core/semantic/type-compatibility.js.map +1 -0
  120. package/dist/core/{type-member-index.d.ts → semantic/type-member-index.d.ts} +1 -1
  121. package/dist/core/semantic/type-member-index.d.ts.map +1 -0
  122. package/dist/core/semantic/type-member-index.js.map +1 -0
  123. package/dist/core/semantic/type-params.d.ts.map +1 -0
  124. package/dist/core/semantic/type-params.js.map +1 -0
  125. package/dist/core/{type-resolution.d.ts → semantic/type-resolution.d.ts} +3 -6
  126. package/dist/core/semantic/type-resolution.d.ts.map +1 -0
  127. package/dist/core/{type-resolution.js → semantic/type-resolution.js} +15 -25
  128. package/dist/core/semantic/type-resolution.js.map +1 -0
  129. package/dist/core/semantic/type-resolution.test.d.ts.map +1 -0
  130. package/dist/core/{type-resolution.test.js → semantic/type-resolution.test.js} +11 -19
  131. package/dist/core/semantic/type-resolution.test.js.map +1 -0
  132. package/dist/core/semantic/unsafe.d.ts.map +1 -0
  133. package/dist/core/semantic/unsafe.js.map +1 -0
  134. package/dist/emitter-types/core.d.ts +6 -12
  135. package/dist/emitter-types/core.d.ts.map +1 -1
  136. package/dist/emitter-types/index.d.ts +1 -1
  137. package/dist/emitter-types/index.d.ts.map +1 -1
  138. package/dist/emitter-types/index.js.map +1 -1
  139. package/dist/emitter.d.ts +1 -1
  140. package/dist/emitter.d.ts.map +1 -1
  141. package/dist/emitter.js +9 -8
  142. package/dist/emitter.js.map +1 -1
  143. package/dist/expression-emitter.d.ts +10 -5
  144. package/dist/expression-emitter.d.ts.map +1 -1
  145. package/dist/expression-emitter.js +333 -117
  146. package/dist/expression-emitter.js.map +1 -1
  147. package/dist/expressions/access.d.ts +4 -3
  148. package/dist/expressions/access.d.ts.map +1 -1
  149. package/dist/expressions/access.js +252 -102
  150. package/dist/expressions/access.js.map +1 -1
  151. package/dist/expressions/calls/call-analysis.d.ts +86 -0
  152. package/dist/expressions/calls/call-analysis.d.ts.map +1 -0
  153. package/dist/expressions/calls/call-analysis.js +284 -0
  154. package/dist/expressions/calls/call-analysis.js.map +1 -0
  155. package/dist/expressions/calls/call-emitter.d.ts +13 -0
  156. package/dist/expressions/calls/call-emitter.d.ts.map +1 -0
  157. package/dist/expressions/calls/call-emitter.js +1048 -0
  158. package/dist/expressions/calls/call-emitter.js.map +1 -0
  159. package/dist/expressions/calls/new-emitter.d.ts +13 -0
  160. package/dist/expressions/calls/new-emitter.d.ts.map +1 -0
  161. package/dist/expressions/calls/new-emitter.js +641 -0
  162. package/dist/expressions/calls/new-emitter.js.map +1 -0
  163. package/dist/expressions/calls.d.ts +2 -14
  164. package/dist/expressions/calls.d.ts.map +1 -1
  165. package/dist/expressions/calls.js +2 -909
  166. package/dist/expressions/calls.js.map +1 -1
  167. package/dist/expressions/collections.d.ts +6 -16
  168. package/dist/expressions/collections.d.ts.map +1 -1
  169. package/dist/expressions/collections.js +318 -217
  170. package/dist/expressions/collections.js.map +1 -1
  171. package/dist/expressions/functions.d.ts +6 -5
  172. package/dist/expressions/functions.d.ts.map +1 -1
  173. package/dist/expressions/functions.js +57 -62
  174. package/dist/expressions/functions.js.map +1 -1
  175. package/dist/expressions/identifiers.d.ts +11 -6
  176. package/dist/expressions/identifiers.d.ts.map +1 -1
  177. package/dist/expressions/identifiers.js +76 -25
  178. package/dist/expressions/identifiers.js.map +1 -1
  179. package/dist/expressions/index.d.ts +1 -1
  180. package/dist/expressions/index.d.ts.map +1 -1
  181. package/dist/expressions/index.js +1 -1
  182. package/dist/expressions/index.js.map +1 -1
  183. package/dist/expressions/index.test.js +605 -0
  184. package/dist/expressions/index.test.js.map +1 -1
  185. package/dist/expressions/literals.d.ts +4 -3
  186. package/dist/expressions/literals.d.ts.map +1 -1
  187. package/dist/expressions/literals.js +25 -17
  188. package/dist/expressions/literals.js.map +1 -1
  189. package/dist/expressions/literals.test.js +18 -18
  190. package/dist/expressions/literals.test.js.map +1 -1
  191. package/dist/expressions/operators/assignment-emitter.d.ts +16 -0
  192. package/dist/expressions/operators/assignment-emitter.d.ts.map +1 -0
  193. package/dist/expressions/operators/assignment-emitter.js +118 -0
  194. package/dist/expressions/operators/assignment-emitter.js.map +1 -0
  195. package/dist/expressions/operators/binary-emitter.d.ts +33 -0
  196. package/dist/expressions/operators/binary-emitter.d.ts.map +1 -0
  197. package/dist/expressions/operators/binary-emitter.js +398 -0
  198. package/dist/expressions/operators/binary-emitter.js.map +1 -0
  199. package/dist/expressions/operators/conditional-emitter.d.ts +17 -0
  200. package/dist/expressions/operators/conditional-emitter.d.ts.map +1 -0
  201. package/dist/expressions/operators/conditional-emitter.js +306 -0
  202. package/dist/expressions/operators/conditional-emitter.js.map +1 -0
  203. package/dist/expressions/operators/helpers.d.ts +37 -0
  204. package/dist/expressions/operators/helpers.d.ts.map +1 -0
  205. package/dist/expressions/operators/helpers.js +136 -0
  206. package/dist/expressions/operators/helpers.js.map +1 -0
  207. package/dist/expressions/operators/logical-emitter.d.ts +23 -0
  208. package/dist/expressions/operators/logical-emitter.d.ts.map +1 -0
  209. package/dist/expressions/operators/logical-emitter.js +73 -0
  210. package/dist/expressions/operators/logical-emitter.js.map +1 -0
  211. package/dist/expressions/operators/unary-emitter.d.ts +30 -0
  212. package/dist/expressions/operators/unary-emitter.d.ts.map +1 -0
  213. package/dist/expressions/operators/unary-emitter.js +244 -0
  214. package/dist/expressions/operators/unary-emitter.js.map +1 -0
  215. package/dist/expressions/operators.d.ts +5 -81
  216. package/dist/expressions/operators.d.ts.map +1 -1
  217. package/dist/expressions/operators.js +5 -949
  218. package/dist/expressions/operators.js.map +1 -1
  219. package/dist/expressions/other.d.ts +15 -11
  220. package/dist/expressions/other.d.ts.map +1 -1
  221. package/dist/expressions/other.js +51 -36
  222. package/dist/expressions/other.js.map +1 -1
  223. package/dist/expressions/precedence.test.js +1 -1
  224. package/dist/expressions/precedence.test.js.map +1 -1
  225. package/dist/generator-exchange.d.ts +10 -3
  226. package/dist/generator-exchange.d.ts.map +1 -1
  227. package/dist/generator-exchange.js +57 -54
  228. package/dist/generator-exchange.js.map +1 -1
  229. package/dist/generator-wrapper.d.ts +17 -65
  230. package/dist/generator-wrapper.d.ts.map +1 -1
  231. package/dist/generator-wrapper.js +396 -220
  232. package/dist/generator-wrapper.js.map +1 -1
  233. package/dist/generator-wrapper.test.js +22 -14
  234. package/dist/generator-wrapper.test.js.map +1 -1
  235. package/dist/integration.test.js +169 -1
  236. package/dist/integration.test.js.map +1 -1
  237. package/dist/patterns.d.ts +18 -88
  238. package/dist/patterns.d.ts.map +1 -1
  239. package/dist/patterns.js +540 -304
  240. package/dist/patterns.js.map +1 -1
  241. package/dist/patterns.test.js +5 -4
  242. package/dist/patterns.test.js.map +1 -1
  243. package/dist/specialization/generation.d.ts +7 -3
  244. package/dist/specialization/generation.d.ts.map +1 -1
  245. package/dist/specialization/generation.js +31 -15
  246. package/dist/specialization/generation.js.map +1 -1
  247. package/dist/specialization/type-aliases.test.js +47 -2
  248. package/dist/specialization/type-aliases.test.js.map +1 -1
  249. package/dist/statement-emitter.d.ts +15 -4
  250. package/dist/statement-emitter.d.ts.map +1 -1
  251. package/dist/statement-emitter.js +54 -47
  252. package/dist/statement-emitter.js.map +1 -1
  253. package/dist/statements/blocks.d.ts +24 -16
  254. package/dist/statements/blocks.d.ts.map +1 -1
  255. package/dist/statements/blocks.js +242 -65
  256. package/dist/statements/blocks.js.map +1 -1
  257. package/dist/statements/classes/index.d.ts +1 -1
  258. package/dist/statements/classes/index.d.ts.map +1 -1
  259. package/dist/statements/classes/index.js +1 -1
  260. package/dist/statements/classes/index.js.map +1 -1
  261. package/dist/statements/classes/inline-types.d.ts +4 -3
  262. package/dist/statements/classes/inline-types.d.ts.map +1 -1
  263. package/dist/statements/classes/inline-types.js +21 -21
  264. package/dist/statements/classes/inline-types.js.map +1 -1
  265. package/dist/statements/classes/members/constructors.d.ts +4 -3
  266. package/dist/statements/classes/members/constructors.d.ts.map +1 -1
  267. package/dist/statements/classes/members/constructors.js +57 -58
  268. package/dist/statements/classes/members/constructors.js.map +1 -1
  269. package/dist/statements/classes/members/methods.d.ts +4 -3
  270. package/dist/statements/classes/members/methods.d.ts.map +1 -1
  271. package/dist/statements/classes/members/methods.js +106 -101
  272. package/dist/statements/classes/members/methods.js.map +1 -1
  273. package/dist/statements/classes/members/orchestrator.d.ts +4 -3
  274. package/dist/statements/classes/members/orchestrator.d.ts.map +1 -1
  275. package/dist/statements/classes/members/orchestrator.js +2 -2
  276. package/dist/statements/classes/members/orchestrator.js.map +1 -1
  277. package/dist/statements/classes/members/properties.d.ts +4 -3
  278. package/dist/statements/classes/members/properties.d.ts.map +1 -1
  279. package/dist/statements/classes/members/properties.js +105 -88
  280. package/dist/statements/classes/members/properties.js.map +1 -1
  281. package/dist/statements/classes/members/shadowing.test.js +7 -2
  282. package/dist/statements/classes/members/shadowing.test.js.map +1 -1
  283. package/dist/statements/classes/members/static-readonly-properties.test.js +4 -1
  284. package/dist/statements/classes/members/static-readonly-properties.test.js.map +1 -1
  285. package/dist/statements/classes/parameters.d.ts +8 -10
  286. package/dist/statements/classes/parameters.d.ts.map +1 -1
  287. package/dist/statements/classes/parameters.js +30 -26
  288. package/dist/statements/classes/parameters.js.map +1 -1
  289. package/dist/statements/classes/properties.d.ts +4 -3
  290. package/dist/statements/classes/properties.d.ts.map +1 -1
  291. package/dist/statements/classes/properties.js +76 -50
  292. package/dist/statements/classes/properties.js.map +1 -1
  293. package/dist/statements/classes.d.ts +1 -1
  294. package/dist/statements/classes.d.ts.map +1 -1
  295. package/dist/statements/classes.js +1 -1
  296. package/dist/statements/classes.js.map +1 -1
  297. package/dist/statements/control/conditionals/guard-analysis.d.ts +169 -0
  298. package/dist/statements/control/conditionals/guard-analysis.d.ts.map +1 -0
  299. package/dist/statements/control/conditionals/guard-analysis.js +591 -0
  300. package/dist/statements/control/conditionals/guard-analysis.js.map +1 -0
  301. package/dist/statements/control/conditionals/if-emitter.d.ts +14 -0
  302. package/dist/statements/control/conditionals/if-emitter.d.ts.map +1 -0
  303. package/dist/statements/control/conditionals/if-emitter.js +725 -0
  304. package/dist/statements/control/conditionals/if-emitter.js.map +1 -0
  305. package/dist/statements/control/conditionals/switch-emitter.d.ts +13 -0
  306. package/dist/statements/control/conditionals/switch-emitter.d.ts.map +1 -0
  307. package/dist/statements/control/conditionals/switch-emitter.js +60 -0
  308. package/dist/statements/control/conditionals/switch-emitter.js.map +1 -0
  309. package/dist/statements/control/conditionals.d.ts +3 -15
  310. package/dist/statements/control/conditionals.d.ts.map +1 -1
  311. package/dist/statements/control/conditionals.js +3 -1152
  312. package/dist/statements/control/conditionals.js.map +1 -1
  313. package/dist/statements/control/exceptions.d.ts +8 -6
  314. package/dist/statements/control/exceptions.d.ts.map +1 -1
  315. package/dist/statements/control/exceptions.js +35 -23
  316. package/dist/statements/control/exceptions.js.map +1 -1
  317. package/dist/statements/control/index.d.ts +3 -3
  318. package/dist/statements/control/index.d.ts.map +1 -1
  319. package/dist/statements/control/index.js +3 -3
  320. package/dist/statements/control/index.js.map +1 -1
  321. package/dist/statements/control/loops.d.ts +14 -12
  322. package/dist/statements/control/loops.d.ts.map +1 -1
  323. package/dist/statements/control/loops.js +147 -82
  324. package/dist/statements/control/loops.js.map +1 -1
  325. package/dist/statements/control.d.ts +1 -1
  326. package/dist/statements/control.d.ts.map +1 -1
  327. package/dist/statements/control.js +1 -1
  328. package/dist/statements/control.js.map +1 -1
  329. package/dist/statements/declarations/classes.d.ts +7 -3
  330. package/dist/statements/declarations/classes.d.ts.map +1 -1
  331. package/dist/statements/declarations/classes.js +107 -83
  332. package/dist/statements/declarations/classes.js.map +1 -1
  333. package/dist/statements/declarations/enums.d.ts +4 -3
  334. package/dist/statements/declarations/enums.d.ts.map +1 -1
  335. package/dist/statements/declarations/enums.js +16 -15
  336. package/dist/statements/declarations/enums.js.map +1 -1
  337. package/dist/statements/declarations/functions.d.ts +18 -2
  338. package/dist/statements/declarations/functions.d.ts.map +1 -1
  339. package/dist/statements/declarations/functions.js +633 -162
  340. package/dist/statements/declarations/functions.js.map +1 -1
  341. package/dist/statements/declarations/index.d.ts +2 -2
  342. package/dist/statements/declarations/index.d.ts.map +1 -1
  343. package/dist/statements/declarations/index.js +2 -2
  344. package/dist/statements/declarations/index.js.map +1 -1
  345. package/dist/statements/declarations/interfaces.d.ts +7 -3
  346. package/dist/statements/declarations/interfaces.d.ts.map +1 -1
  347. package/dist/statements/declarations/interfaces.js +138 -105
  348. package/dist/statements/declarations/interfaces.js.map +1 -1
  349. package/dist/statements/declarations/type-aliases.d.ts +7 -3
  350. package/dist/statements/declarations/type-aliases.d.ts.map +1 -1
  351. package/dist/statements/declarations/type-aliases.js +122 -82
  352. package/dist/statements/declarations/type-aliases.js.map +1 -1
  353. package/dist/statements/declarations/variables.d.ts +12 -2
  354. package/dist/statements/declarations/variables.d.ts.map +1 -1
  355. package/dist/statements/declarations/variables.js +541 -428
  356. package/dist/statements/declarations/variables.js.map +1 -1
  357. package/dist/statements/declarations.d.ts +1 -1
  358. package/dist/statements/declarations.d.ts.map +1 -1
  359. package/dist/statements/declarations.js +1 -1
  360. package/dist/statements/declarations.js.map +1 -1
  361. package/dist/statements/index.d.ts +3 -3
  362. package/dist/statements/index.d.ts.map +1 -1
  363. package/dist/statements/index.js +5 -5
  364. package/dist/statements/index.js.map +1 -1
  365. package/dist/statements/index.test.js +307 -0
  366. package/dist/statements/index.test.js.map +1 -1
  367. package/dist/type-emitter.d.ts +1 -1
  368. package/dist/type-emitter.d.ts.map +1 -1
  369. package/dist/type-emitter.js +1 -1
  370. package/dist/type-emitter.js.map +1 -1
  371. package/dist/types/arrays.d.ts +3 -2
  372. package/dist/types/arrays.d.ts.map +1 -1
  373. package/dist/types/arrays.js +7 -5
  374. package/dist/types/arrays.js.map +1 -1
  375. package/dist/types/dictionaries.d.ts +6 -3
  376. package/dist/types/dictionaries.d.ts.map +1 -1
  377. package/dist/types/dictionaries.js +22 -10
  378. package/dist/types/dictionaries.js.map +1 -1
  379. package/dist/types/emitter.d.ts +8 -2
  380. package/dist/types/emitter.d.ts.map +1 -1
  381. package/dist/types/emitter.js +20 -6
  382. package/dist/types/emitter.js.map +1 -1
  383. package/dist/types/functions.d.ts +3 -2
  384. package/dist/types/functions.d.ts.map +1 -1
  385. package/dist/types/functions.js +36 -13
  386. package/dist/types/functions.js.map +1 -1
  387. package/dist/types/index.d.ts +2 -2
  388. package/dist/types/index.d.ts.map +1 -1
  389. package/dist/types/index.js +2 -2
  390. package/dist/types/index.js.map +1 -1
  391. package/dist/types/index.test.js +137 -0
  392. package/dist/types/index.test.js.map +1 -1
  393. package/dist/types/intersections.d.ts +3 -2
  394. package/dist/types/intersections.d.ts.map +1 -1
  395. package/dist/types/intersections.js +2 -2
  396. package/dist/types/intersections.js.map +1 -1
  397. package/dist/types/literals.d.ts +9 -2
  398. package/dist/types/literals.d.ts.map +1 -1
  399. package/dist/types/literals.js +11 -5
  400. package/dist/types/literals.js.map +1 -1
  401. package/dist/types/objects.d.ts +3 -2
  402. package/dist/types/objects.d.ts.map +1 -1
  403. package/dist/types/objects.js +1 -1
  404. package/dist/types/objects.js.map +1 -1
  405. package/dist/types/parameters.d.ts +6 -5
  406. package/dist/types/parameters.d.ts.map +1 -1
  407. package/dist/types/parameters.js +88 -29
  408. package/dist/types/parameters.js.map +1 -1
  409. package/dist/types/parameters.test.js +9 -4
  410. package/dist/types/parameters.test.js.map +1 -1
  411. package/dist/types/primitives.d.ts +5 -4
  412. package/dist/types/primitives.d.ts.map +1 -1
  413. package/dist/types/primitives.js +14 -13
  414. package/dist/types/primitives.js.map +1 -1
  415. package/dist/types/references.d.ts +3 -2
  416. package/dist/types/references.d.ts.map +1 -1
  417. package/dist/types/references.js +135 -111
  418. package/dist/types/references.js.map +1 -1
  419. package/dist/types/tuples.d.ts +3 -2
  420. package/dist/types/tuples.d.ts.map +1 -1
  421. package/dist/types/tuples.js +25 -11
  422. package/dist/types/tuples.js.map +1 -1
  423. package/dist/types/unions.d.ts +3 -2
  424. package/dist/types/unions.d.ts.map +1 -1
  425. package/dist/types/unions.js +36 -21
  426. package/dist/types/unions.js.map +1 -1
  427. package/dist/types.d.ts +1 -1
  428. package/dist/types.d.ts.map +1 -1
  429. package/dist/types.js.map +1 -1
  430. package/package.json +2 -2
  431. package/dist/core/attributes.d.ts.map +0 -1
  432. package/dist/core/attributes.js +0 -141
  433. package/dist/core/attributes.js.map +0 -1
  434. package/dist/core/attributes.test.d.ts.map +0 -1
  435. package/dist/core/attributes.test.js.map +0 -1
  436. package/dist/core/boolean-context.d.ts +0 -42
  437. package/dist/core/boolean-context.d.ts.map +0 -1
  438. package/dist/core/boolean-context.js +0 -442
  439. package/dist/core/boolean-context.js.map +0 -1
  440. package/dist/core/boolean-context.test.d.ts.map +0 -1
  441. package/dist/core/boolean-context.test.js.map +0 -1
  442. package/dist/core/exports.d.ts.map +0 -1
  443. package/dist/core/exports.js +0 -28
  444. package/dist/core/exports.js.map +0 -1
  445. package/dist/core/imports.d.ts.map +0 -1
  446. package/dist/core/imports.js.map +0 -1
  447. package/dist/core/imports.test.d.ts.map +0 -1
  448. package/dist/core/imports.test.js +0 -79
  449. package/dist/core/imports.test.js.map +0 -1
  450. package/dist/core/local-names.d.ts.map +0 -1
  451. package/dist/core/local-names.js.map +0 -1
  452. package/dist/core/local-types.d.ts.map +0 -1
  453. package/dist/core/local-types.js.map +0 -1
  454. package/dist/core/module-emitter/assembly.d.ts +0 -24
  455. package/dist/core/module-emitter/assembly.d.ts.map +0 -1
  456. package/dist/core/module-emitter/assembly.js +0 -69
  457. package/dist/core/module-emitter/assembly.js.map +0 -1
  458. package/dist/core/module-emitter/header.d.ts.map +0 -1
  459. package/dist/core/module-emitter/header.js.map +0 -1
  460. package/dist/core/module-emitter/index.d.ts.map +0 -1
  461. package/dist/core/module-emitter/index.js.map +0 -1
  462. package/dist/core/module-emitter/namespace.d.ts +0 -14
  463. package/dist/core/module-emitter/namespace.d.ts.map +0 -1
  464. package/dist/core/module-emitter/namespace.js +0 -26
  465. package/dist/core/module-emitter/namespace.js.map +0 -1
  466. package/dist/core/module-emitter/orchestrator.d.ts.map +0 -1
  467. package/dist/core/module-emitter/orchestrator.js.map +0 -1
  468. package/dist/core/module-emitter/separation.d.ts.map +0 -1
  469. package/dist/core/module-emitter/separation.js.map +0 -1
  470. package/dist/core/module-emitter/static-container.d.ts.map +0 -1
  471. package/dist/core/module-emitter/static-container.js +0 -139
  472. package/dist/core/module-emitter/static-container.js.map +0 -1
  473. package/dist/core/module-emitter.d.ts.map +0 -1
  474. package/dist/core/module-emitter.js.map +0 -1
  475. package/dist/core/module-map.d.ts.map +0 -1
  476. package/dist/core/module-map.js.map +0 -1
  477. package/dist/core/module-map.test.d.ts.map +0 -1
  478. package/dist/core/module-map.test.js.map +0 -1
  479. package/dist/core/naming-collisions.d.ts.map +0 -1
  480. package/dist/core/naming-collisions.js.map +0 -1
  481. package/dist/core/options.d.ts.map +0 -1
  482. package/dist/core/options.js.map +0 -1
  483. package/dist/core/type-alias-index.d.ts.map +0 -1
  484. package/dist/core/type-alias-index.js.map +0 -1
  485. package/dist/core/type-compatibility.d.ts.map +0 -1
  486. package/dist/core/type-compatibility.js.map +0 -1
  487. package/dist/core/type-member-index.d.ts.map +0 -1
  488. package/dist/core/type-member-index.js.map +0 -1
  489. package/dist/core/type-params.d.ts.map +0 -1
  490. package/dist/core/type-params.js.map +0 -1
  491. package/dist/core/type-resolution.d.ts.map +0 -1
  492. package/dist/core/type-resolution.js.map +0 -1
  493. package/dist/core/type-resolution.test.d.ts.map +0 -1
  494. package/dist/core/type-resolution.test.js.map +0 -1
  495. package/dist/core/unsafe.d.ts.map +0 -1
  496. package/dist/core/unsafe.js.map +0 -1
  497. /package/dist/core/{attributes.test.d.ts → format/attributes.test.d.ts} +0 -0
  498. /package/dist/core/{module-emitter → format/module-emitter}/index.d.ts +0 -0
  499. /package/dist/core/{module-emitter → format/module-emitter}/index.js +0 -0
  500. /package/dist/core/{module-emitter → format/module-emitter}/separation.d.ts +0 -0
  501. /package/dist/core/{module-emitter → format/module-emitter}/separation.js +0 -0
  502. /package/dist/core/{module-emitter.d.ts → format/module-emitter.d.ts} +0 -0
  503. /package/dist/core/{module-emitter.js → format/module-emitter.js} +0 -0
  504. /package/dist/core/{options.js → format/options.js} +0 -0
  505. /package/dist/core/{boolean-context.test.d.ts → semantic/boolean-context.test.d.ts} +0 -0
  506. /package/dist/core/{imports.test.d.ts → semantic/imports.test.d.ts} +0 -0
  507. /package/dist/core/{local-types.js → semantic/local-types.js} +0 -0
  508. /package/dist/core/{module-map.js → semantic/module-map.js} +0 -0
  509. /package/dist/core/{module-map.test.d.ts → semantic/module-map.test.d.ts} +0 -0
  510. /package/dist/core/{module-map.test.js → semantic/module-map.test.js} +0 -0
  511. /package/dist/core/{naming-collisions.d.ts → semantic/naming-collisions.d.ts} +0 -0
  512. /package/dist/core/{type-alias-index.js → semantic/type-alias-index.js} +0 -0
  513. /package/dist/core/{type-compatibility.d.ts → semantic/type-compatibility.d.ts} +0 -0
  514. /package/dist/core/{type-compatibility.js → semantic/type-compatibility.js} +0 -0
  515. /package/dist/core/{type-member-index.js → semantic/type-member-index.js} +0 -0
  516. /package/dist/core/{type-params.d.ts → semantic/type-params.d.ts} +0 -0
  517. /package/dist/core/{type-params.js → semantic/type-params.js} +0 -0
  518. /package/dist/core/{type-resolution.test.d.ts → semantic/type-resolution.test.d.ts} +0 -0
  519. /package/dist/core/{unsafe.d.ts → semantic/unsafe.d.ts} +0 -0
  520. /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 { emitType } from "./type-emitter.js";
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, emitNew } from "./expressions/calls.js";
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 maybeCastNullishTypeParam = (expr, fragment, context, expectedType) => {
46
+ const maybeCastNullishTypeParamAst = (expr, ast, context, expectedType) => {
44
47
  if (!expectedType)
45
- return [fragment, context];
48
+ return [ast, context];
46
49
  if (!expr.inferredType)
47
- return [fragment, context];
50
+ return [ast, context];
48
51
  const expectedTypeParam = getBareTypeParameterName(expectedType, context);
49
52
  if (!expectedTypeParam)
50
- return [fragment, context];
53
+ return [ast, context];
51
54
  const unionTypeParam = getUnconstrainedNullishTypeParamName(expr.inferredType, context);
52
55
  if (!unionTypeParam)
53
- return [fragment, context];
56
+ return [ast, context];
54
57
  if (unionTypeParam !== expectedTypeParam)
55
- return [fragment, context];
56
- const [typeName, newContext] = emitType(expectedType, context);
57
- return [{ text: `(${typeName})${fragment.text}` }, newContext];
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 maybeUnwrapNullableValueType = (expr, fragment, context, expectedType) => {
120
+ const maybeUnwrapNullableValueTypeAst = (expr, ast, context, expectedType) => {
114
121
  if (!expectedType)
115
- return [fragment, context];
122
+ return [ast, context];
116
123
  if (!expr.inferredType)
117
- return [fragment, context];
118
- // Only unwrap direct nullable values. For composite expressions (e.g. `a ?? b`)
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 [fragment, context];
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 [fragment, context];
150
+ return [ast, context];
148
151
  }
149
152
  const nullableBase = getNullableUnionBaseType(expr.inferredType);
150
153
  if (!nullableBase)
151
- return [fragment, context];
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 [fragment, context];
156
+ return [ast, context];
156
157
  if (!isSameTypeForNullableUnwrap(nullableBase, expectedType)) {
157
- return [fragment, context];
158
+ return [ast, context];
158
159
  }
159
- const needsParens = expr.kind !== "identifier" && expr.kind !== "memberAccess";
160
- const inner = needsParens ? `(${fragment.text})` : fragment.text;
161
- return [{ text: `${inner}.Value` }, context];
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 [innerCode, newContext] = emitExpression(expr.expression, context, expr.inferredType // Pass target type for correct literal format
181
- );
182
- return [innerCode, newContext];
396
+ const [innerAst, newContext] = emitExpressionAst(expr.expression, context, expr.inferredType);
397
+ return [innerAst, newContext];
183
398
  }
184
- // Numeric narrowings represent explicit user intent (`x as int`, `x as long`).
185
- // Even when the conversion is proven sound, C# generic inference can become
186
- // ambiguous without an explicit cast (e.g., choosing between `int` and `long`).
187
- const [innerCode, ctx1] = emitExpression(expr.expression, context);
188
- const [typeName, ctx2] = emitType(expr.inferredType, ctx1);
189
- const operandText = formatCastOperandText(expr.expression, innerCode.text);
190
- return [{ text: `(${typeName})${operandText}` }, ctx2];
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 [innerCode, ctx1] = emitExpression(expr.expression, context, expr.targetType);
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 [innerCode, ctx1];
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 [typeName, ctx2] = emitType(runtimeTarget, ctx1);
295
- const operandText = formatCastOperandText(expr.expression, innerCode.text);
296
- return [{ text: `(${typeName})${operandText}` }, ctx2];
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 emitExpression(expr.expression, context, expected);
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 [innerCode, ctx1] = emitExpression(expr.expression, context);
317
- const [typeName, ctx2] = emitType(expr.targetType, ctx1);
318
- const operandText = formatCastOperandText(expr.expression, innerCode.text);
319
- return [{ text: `${operandText} as ${typeName}` }, ctx2];
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 [elementTypeName, ctx1] = emitType(expr.elementType, context);
328
- const [sizeFrag, ctx2] = emitExpression(expr.size, ctx1, {
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 [{ text: `stackalloc ${elementTypeName}[${sizeFrag.text}]` }, ctx2];
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 [typeName, ctx1] = emitType(expr.targetType, context);
341
- return [{ text: `default(${typeName})` }, ctx1];
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 (e.g., array element type inference)
561
+ * @param expectedType Optional expected type for contextual typing
348
562
  */
349
- export const emitExpression = (expr, context, expectedType) => {
350
- const [fragment, newContext] = (() => {
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 [{ text: "this" }, context];
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 [castedFrag, castedContext] = maybeCastNullishTypeParam(expr, fragment, newContext, expectedType);
409
- return maybeUnwrapNullableValueType(expr, castedFrag, castedContext, expectedType);
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 for backward compatibility
412
- export { emitTypeArguments, generateSpecializedName, } from "./expressions/identifiers.js";
627
+ // Re-export commonly used functions from barrel
628
+ export { generateSpecializedName } from "./expressions/identifiers.js";
413
629
  //# sourceMappingURL=expression-emitter.js.map