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