@tsonic/emitter 0.0.62 → 0.0.63

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