@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
package/dist/patterns.js CHANGED
@@ -1,408 +1,644 @@
1
1
  /**
2
- * Pattern Lowering Module
2
+ * Pattern lowering (AST-only).
3
3
  *
4
- * Transforms destructuring patterns into sequences of C# variable declarations.
5
- * This module is used by variable declarations, for-of loops, and function parameters.
6
- *
7
- * Example transformations:
8
- *
9
- * Array pattern:
10
- * const [a, b, c] = arr;
11
- * =>
12
- * var __t0 = arr;
13
- * var a = __t0[0];
14
- * var b = __t0[1];
15
- * var c = __t0[2];
16
- *
17
- * Array pattern with rest:
18
- * const [first, ...rest] = arr;
19
- * =>
20
- * var __t0 = arr;
21
- * var first = __t0[0];
22
- * var rest = Tsonic.Runtime.ArrayHelpers.Slice(__t0, 1);
23
- *
24
- * Object pattern:
25
- * const { name, age } = person;
26
- * =>
27
- * var __t0 = person;
28
- * var name = __t0.name;
29
- * var age = __t0.age;
30
- *
31
- * Object pattern with rest:
32
- * const { name, ...rest } = person;
33
- * =>
34
- * var __t0 = person;
35
- * var name = __t0.name;
36
- * var rest = new __Rest_xxxx { age = __t0.age, email = __t0.email };
37
- */
38
- import { emitType } from "./types/emitter.js";
39
- import { escapeCSharpIdentifier } from "./emitter-types/identifiers.js";
40
- import { allocateLocalName, emitRemappedLocalName, registerLocalName, } from "./core/local-names.js";
41
- /**
42
- * Generate a unique temporary variable name
4
+ * Handles destructuring for:
5
+ * - local declarations
6
+ * - static/module-level field declarations
7
+ * - assignment expressions
43
8
  */
9
+ import { emitTypeAst } from "./types/emitter.js";
10
+ import { emitExpressionAst } from "./expression-emitter.js";
11
+ import { emitCSharpName } from "./naming-policy.js";
12
+ import { allocateLocalName, emitRemappedLocalName, registerLocalName, } from "./core/format/local-names.js";
13
+ const objectTypeAst = { kind: "identifierType", name: "object" };
44
14
  const generateTemp = (prefix, ctx) => {
45
15
  const tempId = ctx.tempVarId ?? 0;
46
16
  const name = `__${prefix}${tempId}`;
47
- const newCtx = { ...ctx, tempVarId: tempId + 1 };
48
- return [name, newCtx];
17
+ return [name, { ...ctx, tempVarId: tempId + 1 }];
49
18
  };
50
- /**
51
- * Lower an identifier pattern to a simple variable declaration
52
- */
53
- const lowerIdentifier = (name, inputExpr, type, indent, ctx) => {
54
- // In static context, we can't use 'var' - need explicit type with modifiers
55
- if (ctx.isStatic) {
56
- const escapedName = escapeCSharpIdentifier(name);
57
- const typeStr = type ? emitType(type, ctx)[0] : "object";
58
- const stmt = `${indent}private static readonly ${typeStr} ${escapedName} = ${inputExpr};`;
59
- return { statements: [stmt], context: ctx };
19
+ const emitDefaultExprAst = (expr, ctx) => {
20
+ if (expr.kind === "literal") {
21
+ if (typeof expr.value === "string") {
22
+ return [{ kind: "literalExpression", text: `"${expr.value}"` }, ctx];
23
+ }
24
+ if (typeof expr.value === "number") {
25
+ return [{ kind: "literalExpression", text: String(expr.value) }, ctx];
26
+ }
27
+ if (typeof expr.value === "boolean") {
28
+ return [
29
+ { kind: "literalExpression", text: expr.value ? "true" : "false" },
30
+ ctx,
31
+ ];
32
+ }
33
+ if (expr.value === null) {
34
+ return [{ kind: "literalExpression", text: "null" }, ctx];
35
+ }
36
+ }
37
+ if (expr.kind === "identifier") {
38
+ return [
39
+ {
40
+ kind: "identifierExpression",
41
+ identifier: emitRemappedLocalName(expr.name, ctx),
42
+ },
43
+ ctx,
44
+ ];
45
+ }
46
+ return emitExpressionAst(expr, ctx);
47
+ };
48
+ const getPropertyType = (type, key, ctx) => {
49
+ if (!type)
50
+ return undefined;
51
+ if (type.kind === "objectType") {
52
+ const prop = type.members.find((m) => m.kind === "propertySignature" && m.name === key);
53
+ return prop?.kind === "propertySignature" ? prop.type : undefined;
54
+ }
55
+ if (type.kind === "referenceType" && type.structuralMembers) {
56
+ const prop = type.structuralMembers.find((m) => m.kind === "propertySignature" && m.name === key);
57
+ return prop?.kind === "propertySignature" ? prop.type : undefined;
58
+ }
59
+ if (type.kind === "referenceType") {
60
+ const localType = ctx.localTypes?.get(type.name);
61
+ if (!localType)
62
+ return undefined;
63
+ if (localType.kind === "interface") {
64
+ const prop = localType.members.find((m) => m.kind === "propertySignature" && m.name === key);
65
+ return prop?.kind === "propertySignature" ? prop.type : undefined;
66
+ }
67
+ if (localType.kind === "class") {
68
+ const prop = localType.members.find((m) => m.kind === "propertyDeclaration" && m.name === key);
69
+ return prop?.kind === "propertyDeclaration" ? prop.type : undefined;
70
+ }
71
+ if (localType.kind === "typeAlias") {
72
+ return getPropertyType(localType.type, key, ctx);
73
+ }
60
74
  }
75
+ return undefined;
76
+ };
77
+ const lowerIdentifierAst = (name, inputExpr, type, ctx) => {
61
78
  const alloc = allocateLocalName(name, ctx);
62
79
  const localName = alloc.emittedName;
63
80
  let currentCtx = alloc.context;
64
- // Local context: use var when type not available
65
- let typeStr = "var";
81
+ let typeAst = { kind: "varType" };
66
82
  if (type) {
67
- const [emittedType, next] = emitType(type, currentCtx);
68
- typeStr = emittedType;
83
+ const [emittedType, next] = emitTypeAst(type, currentCtx);
84
+ typeAst = emittedType;
69
85
  currentCtx = next;
70
86
  }
71
- const stmt = `${indent}${typeStr} ${localName} = ${inputExpr};`;
87
+ const stmt = {
88
+ kind: "localDeclarationStatement",
89
+ modifiers: [],
90
+ type: typeAst,
91
+ declarators: [{ name: localName, initializer: inputExpr }],
92
+ };
72
93
  currentCtx = registerLocalName(name, localName, currentCtx);
73
94
  return { statements: [stmt], context: currentCtx };
74
95
  };
75
- /**
76
- * Lower an array pattern to a sequence of indexed accesses
77
- */
78
- const lowerArrayPattern = (pattern, inputExpr, elementType, indent, ctx, arrayType) => {
96
+ const lowerArrayPatternAst = (pattern, inputExpr, elementType, ctx) => {
79
97
  const statements = [];
80
98
  let currentCtx = ctx;
81
- // Create temporary for the input to avoid re-evaluation
82
- let [tempName, ctx1] = generateTemp("arr", currentCtx);
83
- currentCtx = ctx1;
84
- if (!ctx.isStatic) {
85
- const alloc = allocateLocalName(tempName, currentCtx);
86
- tempName = alloc.emittedName;
87
- currentCtx = alloc.context;
88
- }
89
- // In static context, we can't use 'var' - need explicit type
90
- if (ctx.isStatic && arrayType) {
91
- const [typeStr, ctx2] = emitType(arrayType, currentCtx);
92
- currentCtx = ctx2;
93
- statements.push(`${indent}private static readonly ${typeStr} ${tempName} = ${inputExpr};`);
94
- }
95
- else if (ctx.isStatic) {
96
- // Static without type - use object as fallback
97
- statements.push(`${indent}private static readonly object ${tempName} = ${inputExpr};`);
98
- }
99
- else {
100
- statements.push(`${indent}var ${tempName} = ${inputExpr};`);
101
- }
102
- // Process each element
99
+ const [rawTempName, nextCtx] = generateTemp("arr", currentCtx);
100
+ currentCtx = nextCtx;
101
+ const alloc = allocateLocalName(rawTempName, currentCtx);
102
+ const tempName = alloc.emittedName;
103
+ currentCtx = alloc.context;
104
+ statements.push({
105
+ kind: "localDeclarationStatement",
106
+ modifiers: [],
107
+ type: { kind: "varType" },
108
+ declarators: [{ name: tempName, initializer: inputExpr }],
109
+ });
110
+ const tempId = {
111
+ kind: "identifierExpression",
112
+ identifier: tempName,
113
+ };
103
114
  let index = 0;
104
115
  for (const elem of pattern.elements) {
105
116
  if (!elem) {
106
- // Hole in pattern - skip this index
107
117
  index++;
108
118
  continue;
109
119
  }
110
120
  if (elem.isRest) {
111
- // Rest element: use ArrayHelpers.Slice
112
- const result = lowerPattern(elem.pattern, `Tsonic.Runtime.ArrayHelpers.Slice(${tempName}, ${index})`, elementType ? { kind: "arrayType", elementType } : undefined, indent, currentCtx);
113
- statements.push(...result.statements);
114
- currentCtx = result.context;
115
- // Rest must be last, so break
121
+ const sliceExpr = {
122
+ kind: "invocationExpression",
123
+ expression: {
124
+ kind: "memberAccessExpression",
125
+ expression: {
126
+ kind: "identifierExpression",
127
+ identifier: "Tsonic.Runtime.ArrayHelpers",
128
+ },
129
+ memberName: "Slice",
130
+ },
131
+ arguments: [tempId, { kind: "literalExpression", text: String(index) }],
132
+ };
133
+ const rest = lowerPatternAst(elem.pattern, sliceExpr, elementType ? { kind: "arrayType", elementType } : undefined, currentCtx);
134
+ statements.push(...rest.statements);
135
+ currentCtx = rest.context;
116
136
  break;
117
137
  }
118
- // Regular element: index access
119
- const accessExpr = `${tempName}[${index}]`;
120
- // Handle default value
138
+ const accessExpr = {
139
+ kind: "elementAccessExpression",
140
+ expression: tempId,
141
+ arguments: [{ kind: "literalExpression", text: String(index) }],
142
+ };
121
143
  let valueExpr = accessExpr;
122
144
  if (elem.defaultExpr) {
123
- // For nullable types: value ?? default
124
- // For now, use simple null-coalescing (assumes nullable element type)
125
- const defaultValue = emitDefaultExpr(elem.defaultExpr, currentCtx);
126
- valueExpr = `${accessExpr} ?? ${defaultValue}`;
145
+ const [defaultAst, defaultCtx] = emitDefaultExprAst(elem.defaultExpr, currentCtx);
146
+ currentCtx = defaultCtx;
147
+ valueExpr = {
148
+ kind: "binaryExpression",
149
+ operatorToken: "??",
150
+ left: accessExpr,
151
+ right: defaultAst,
152
+ };
127
153
  }
128
- const result = lowerPattern(elem.pattern, valueExpr, elementType, indent, currentCtx);
129
- statements.push(...result.statements);
130
- currentCtx = result.context;
154
+ const nested = lowerPatternAst(elem.pattern, valueExpr, elementType, currentCtx);
155
+ statements.push(...nested.statements);
156
+ currentCtx = nested.context;
131
157
  index++;
132
158
  }
133
159
  return { statements, context: currentCtx };
134
160
  };
135
- /**
136
- * Lower an object pattern to a sequence of property accesses
137
- */
138
- const lowerObjectPattern = (pattern, inputExpr, inputType, indent, ctx) => {
161
+ const lowerObjectPatternAst = (pattern, inputExpr, inputType, ctx) => {
139
162
  const statements = [];
140
163
  let currentCtx = ctx;
141
- // Create temporary for the input to avoid re-evaluation
142
- let [tempName, ctx1] = generateTemp("obj", currentCtx);
143
- currentCtx = ctx1;
144
- if (!ctx.isStatic) {
145
- const alloc = allocateLocalName(tempName, currentCtx);
146
- tempName = alloc.emittedName;
147
- currentCtx = alloc.context;
148
- }
149
- // In static context, we can't use 'var' - need explicit type with modifiers
150
- if (ctx.isStatic && inputType) {
151
- const [typeStr, ctx2] = emitType(inputType, currentCtx);
152
- currentCtx = ctx2;
153
- statements.push(`${indent}private static readonly ${typeStr} ${tempName} = ${inputExpr};`);
154
- }
155
- else if (ctx.isStatic) {
156
- // Static without type - use object as fallback
157
- statements.push(`${indent}private static readonly object ${tempName} = ${inputExpr};`);
158
- }
159
- else {
160
- statements.push(`${indent}var ${tempName} = ${inputExpr};`);
161
- }
162
- // Process each property
164
+ const [rawTempName, nextCtx] = generateTemp("obj", currentCtx);
165
+ currentCtx = nextCtx;
166
+ const alloc = allocateLocalName(rawTempName, currentCtx);
167
+ const tempName = alloc.emittedName;
168
+ currentCtx = alloc.context;
169
+ statements.push({
170
+ kind: "localDeclarationStatement",
171
+ modifiers: [],
172
+ type: { kind: "varType" },
173
+ declarators: [{ name: tempName, initializer: inputExpr }],
174
+ });
175
+ const tempId = {
176
+ kind: "identifierExpression",
177
+ identifier: tempName,
178
+ };
163
179
  for (const prop of pattern.properties) {
164
180
  if (prop.kind === "rest") {
165
- // Rest property: create new synthetic object with remaining props
166
- if (prop.restShapeMembers && prop.restSynthTypeName) {
167
- // Generate object initializer for rest
168
- const initProps = prop.restShapeMembers
169
- .filter((m) => m.kind === "propertySignature")
170
- .map((m) => `${m.name} = ${tempName}.${m.name}`)
171
- .join(", ");
172
- const restExpr = `new ${prop.restSynthTypeName} { ${initProps} }`;
173
- const result = lowerPattern(prop.pattern, restExpr, undefined, // Type is the synthetic type
174
- indent, currentCtx);
175
- statements.push(...result.statements);
176
- currentCtx = result.context;
177
- }
178
- else {
181
+ if (!prop.restShapeMembers || !prop.restSynthTypeName) {
179
182
  throw new Error("Object rest destructuring requires rest shape information from the frontend (restShapeMembers/restSynthTypeName).");
180
183
  }
184
+ const initMembers = prop.restShapeMembers
185
+ .filter((m) => m.kind === "propertySignature")
186
+ .map((m) => ({
187
+ kind: "assignmentExpression",
188
+ operatorToken: "=",
189
+ left: {
190
+ kind: "identifierExpression",
191
+ identifier: m.name,
192
+ },
193
+ right: {
194
+ kind: "memberAccessExpression",
195
+ expression: tempId,
196
+ memberName: m.name,
197
+ },
198
+ }));
199
+ const restExpr = {
200
+ kind: "objectCreationExpression",
201
+ type: { kind: "identifierType", name: prop.restSynthTypeName },
202
+ arguments: [],
203
+ initializer: initMembers,
204
+ };
205
+ const rest = lowerPatternAst(prop.pattern, restExpr, undefined, currentCtx);
206
+ statements.push(...rest.statements);
207
+ currentCtx = rest.context;
181
208
  continue;
182
209
  }
183
- // Regular property
184
- const propAccessExpr = `${tempName}.${prop.key}`;
185
- // Handle default value
210
+ const propAccessExpr = {
211
+ kind: "memberAccessExpression",
212
+ expression: tempId,
213
+ memberName: prop.key,
214
+ };
186
215
  let valueExpr = propAccessExpr;
187
216
  if (prop.defaultExpr) {
188
- const defaultValue = emitDefaultExpr(prop.defaultExpr, currentCtx);
189
- valueExpr = `${propAccessExpr} ?? ${defaultValue}`;
217
+ const [defaultAst, defaultCtx] = emitDefaultExprAst(prop.defaultExpr, currentCtx);
218
+ currentCtx = defaultCtx;
219
+ valueExpr = {
220
+ kind: "binaryExpression",
221
+ operatorToken: "??",
222
+ left: propAccessExpr,
223
+ right: defaultAst,
224
+ };
190
225
  }
191
- // Get property type if available
192
226
  const propType = getPropertyType(inputType, prop.key, currentCtx);
193
- const result = lowerPattern(prop.value, valueExpr, propType, indent, currentCtx);
194
- statements.push(...result.statements);
195
- currentCtx = result.context;
227
+ const nested = lowerPatternAst(prop.value, valueExpr, propType, currentCtx);
228
+ statements.push(...nested.statements);
229
+ currentCtx = nested.context;
196
230
  }
197
231
  return { statements, context: currentCtx };
198
232
  };
199
- /**
200
- * Get property type from an object/interface type
201
- */
202
- const getPropertyType = (type, key, ctx) => {
203
- if (!type)
204
- return undefined;
205
- if (type.kind === "objectType") {
206
- const prop = type.members.find((m) => m.kind === "propertySignature" && m.name === key);
207
- if (prop && prop.kind === "propertySignature") {
208
- return prop.type;
233
+ export const lowerPatternAst = (pattern, inputExpr, type, ctx) => {
234
+ switch (pattern.kind) {
235
+ case "identifierPattern":
236
+ return lowerIdentifierAst(pattern.name, inputExpr, type, ctx);
237
+ case "arrayPattern": {
238
+ const elementType = type?.kind === "arrayType" ? type.elementType : undefined;
239
+ return lowerArrayPatternAst(pattern, inputExpr, elementType, ctx);
209
240
  }
241
+ case "objectPattern":
242
+ return lowerObjectPatternAst(pattern, inputExpr, type, ctx);
210
243
  }
211
- if (type.kind === "referenceType" && type.structuralMembers) {
212
- const prop = type.structuralMembers.find((m) => m.kind === "propertySignature" && m.name === key);
213
- if (prop && prop.kind === "propertySignature") {
214
- return prop.type;
215
- }
244
+ };
245
+ const createStaticField = (name, type, initializer) => ({
246
+ kind: "fieldDeclaration",
247
+ attributes: [],
248
+ modifiers: ["private", "static", "readonly"],
249
+ type,
250
+ name,
251
+ initializer,
252
+ });
253
+ const lowerIdentifierStaticAst = (name, inputExpr, type, ctx) => {
254
+ let currentCtx = ctx;
255
+ let typeAst = objectTypeAst;
256
+ if (type) {
257
+ const [emittedType, next] = emitTypeAst(type, currentCtx);
258
+ typeAst = emittedType;
259
+ currentCtx = next;
216
260
  }
217
- if (type.kind === "referenceType") {
218
- const localType = ctx.localTypes?.get(type.name);
219
- if (!localType)
220
- return undefined;
221
- if (localType.kind === "interface") {
222
- const prop = localType.members.find((m) => m.kind === "propertySignature" && m.name === key);
223
- if (prop && prop.kind === "propertySignature") {
224
- return prop.type;
225
- }
226
- return undefined;
261
+ return {
262
+ members: [
263
+ createStaticField(emitCSharpName(name, "fields", ctx), typeAst, inputExpr),
264
+ ],
265
+ context: currentCtx,
266
+ };
267
+ };
268
+ const lowerArrayPatternStaticAst = (pattern, inputExpr, elementType, arrayType, ctx) => {
269
+ const members = [];
270
+ let currentCtx = ctx;
271
+ const [rawTempName, nextCtx] = generateTemp("arr", currentCtx);
272
+ currentCtx = nextCtx;
273
+ const tempName = emitCSharpName(rawTempName, "fields", currentCtx);
274
+ let tempTypeAst = objectTypeAst;
275
+ if (arrayType) {
276
+ const [emittedType, typeCtx] = emitTypeAst(arrayType, currentCtx);
277
+ tempTypeAst = emittedType;
278
+ currentCtx = typeCtx;
279
+ }
280
+ members.push(createStaticField(tempName, tempTypeAst, inputExpr));
281
+ const tempExpr = {
282
+ kind: "identifierExpression",
283
+ identifier: tempName,
284
+ };
285
+ let index = 0;
286
+ for (const elem of pattern.elements) {
287
+ if (!elem) {
288
+ index++;
289
+ continue;
227
290
  }
228
- if (localType.kind === "class") {
229
- const prop = localType.members.find((m) => m.kind === "propertyDeclaration" && m.name === key);
230
- if (prop && prop.kind === "propertyDeclaration") {
231
- return prop.type;
232
- }
233
- return undefined;
291
+ if (elem.isRest) {
292
+ const restExpr = {
293
+ kind: "invocationExpression",
294
+ expression: {
295
+ kind: "memberAccessExpression",
296
+ expression: {
297
+ kind: "identifierExpression",
298
+ identifier: "Tsonic.Runtime.ArrayHelpers",
299
+ },
300
+ memberName: "Slice",
301
+ },
302
+ arguments: [
303
+ tempExpr,
304
+ { kind: "literalExpression", text: String(index) },
305
+ ],
306
+ };
307
+ const rest = lowerPatternToStaticMembersAst(elem.pattern, restExpr, elementType ? { kind: "arrayType", elementType } : undefined, currentCtx);
308
+ members.push(...rest.members);
309
+ currentCtx = rest.context;
310
+ break;
234
311
  }
235
- if (localType.kind === "typeAlias") {
236
- return getPropertyType(localType.type, key, ctx);
312
+ const accessExpr = {
313
+ kind: "elementAccessExpression",
314
+ expression: tempExpr,
315
+ arguments: [{ kind: "literalExpression", text: String(index) }],
316
+ };
317
+ let valueExpr = accessExpr;
318
+ if (elem.defaultExpr) {
319
+ const [defaultAst, defaultCtx] = emitDefaultExprAst(elem.defaultExpr, currentCtx);
320
+ currentCtx = defaultCtx;
321
+ valueExpr = {
322
+ kind: "binaryExpression",
323
+ operatorToken: "??",
324
+ left: accessExpr,
325
+ right: defaultAst,
326
+ };
237
327
  }
328
+ const nested = lowerPatternToStaticMembersAst(elem.pattern, valueExpr, elementType, currentCtx);
329
+ members.push(...nested.members);
330
+ currentCtx = nested.context;
331
+ index++;
238
332
  }
239
- return undefined;
333
+ return { members, context: currentCtx };
240
334
  };
241
- /**
242
- * Emit a default expression (simplified - just literals for now)
243
- */
244
- const emitDefaultExpr = (expr, ctx) => {
245
- // Simplified default expression emission
246
- if (expr.kind === "literal") {
247
- if (typeof expr.value === "string") {
248
- return `"${expr.value}"`;
249
- }
250
- if (typeof expr.value === "number") {
251
- return String(expr.value);
252
- }
253
- if (typeof expr.value === "boolean") {
254
- return expr.value ? "true" : "false";
335
+ const lowerObjectPatternStaticAst = (pattern, inputExpr, inputType, ctx) => {
336
+ const members = [];
337
+ let currentCtx = ctx;
338
+ const [rawTempName, nextCtx] = generateTemp("obj", currentCtx);
339
+ currentCtx = nextCtx;
340
+ const tempName = emitCSharpName(rawTempName, "fields", currentCtx);
341
+ let tempTypeAst = objectTypeAst;
342
+ if (inputType) {
343
+ const [emittedType, typeCtx] = emitTypeAst(inputType, currentCtx);
344
+ tempTypeAst = emittedType;
345
+ currentCtx = typeCtx;
346
+ }
347
+ members.push(createStaticField(tempName, tempTypeAst, inputExpr));
348
+ const tempExpr = {
349
+ kind: "identifierExpression",
350
+ identifier: tempName,
351
+ };
352
+ for (const prop of pattern.properties) {
353
+ if (prop.kind === "rest") {
354
+ if (!prop.restShapeMembers || !prop.restSynthTypeName) {
355
+ throw new Error("Object rest destructuring requires rest shape information from the frontend (restShapeMembers/restSynthTypeName).");
356
+ }
357
+ const initMembers = prop.restShapeMembers
358
+ .filter((m) => m.kind === "propertySignature")
359
+ .map((m) => ({
360
+ kind: "assignmentExpression",
361
+ operatorToken: "=",
362
+ left: {
363
+ kind: "identifierExpression",
364
+ identifier: m.name,
365
+ },
366
+ right: {
367
+ kind: "memberAccessExpression",
368
+ expression: tempExpr,
369
+ memberName: m.name,
370
+ },
371
+ }));
372
+ const restExpr = {
373
+ kind: "objectCreationExpression",
374
+ type: { kind: "identifierType", name: prop.restSynthTypeName },
375
+ arguments: [],
376
+ initializer: initMembers,
377
+ };
378
+ const rest = lowerPatternToStaticMembersAst(prop.pattern, restExpr, undefined, currentCtx);
379
+ members.push(...rest.members);
380
+ currentCtx = rest.context;
381
+ continue;
255
382
  }
256
- if (expr.value === null) {
257
- return "null";
383
+ const accessExpr = {
384
+ kind: "memberAccessExpression",
385
+ expression: tempExpr,
386
+ memberName: prop.key,
387
+ };
388
+ let valueExpr = accessExpr;
389
+ if (prop.defaultExpr) {
390
+ const [defaultAst, defaultCtx] = emitDefaultExprAst(prop.defaultExpr, currentCtx);
391
+ currentCtx = defaultCtx;
392
+ valueExpr = {
393
+ kind: "binaryExpression",
394
+ operatorToken: "??",
395
+ left: accessExpr,
396
+ right: defaultAst,
397
+ };
258
398
  }
399
+ const propType = getPropertyType(inputType, prop.key, currentCtx);
400
+ const nested = lowerPatternToStaticMembersAst(prop.value, valueExpr, propType, currentCtx);
401
+ members.push(...nested.members);
402
+ currentCtx = nested.context;
259
403
  }
260
- if (expr.kind === "identifier") {
261
- return emitRemappedLocalName(expr.name, ctx);
262
- }
263
- throw new Error(`Unsupported destructuring default expression kind '${expr.kind}'. ` +
264
- "Only literals and identifiers are supported (airplane-grade: no silent placeholder emission).");
404
+ return { members, context: currentCtx };
265
405
  };
266
- /**
267
- * Lower a pattern to a sequence of C# statements
268
- *
269
- * @param pattern - The pattern to lower (identifier, array, or object)
270
- * @param inputExpr - The C# expression being destructured
271
- * @param type - The type of the input expression (for type annotations)
272
- * @param indent - Indentation prefix for generated code
273
- * @param ctx - The current emitter context
274
- * @returns The generated statements and updated context
275
- */
276
- export const lowerPattern = (pattern, inputExpr, type, indent, ctx) => {
406
+ export const lowerPatternToStaticMembersAst = (pattern, inputExpr, type, ctx) => {
277
407
  switch (pattern.kind) {
278
408
  case "identifierPattern":
279
- return lowerIdentifier(pattern.name, inputExpr, type, indent, ctx);
409
+ return lowerIdentifierStaticAst(pattern.name, inputExpr, type, ctx);
280
410
  case "arrayPattern": {
281
- // Get element type from array type, and pass full array type for static context
282
411
  const elementType = type?.kind === "arrayType" ? type.elementType : undefined;
283
- return lowerArrayPattern(pattern, inputExpr, elementType, indent, ctx, type);
412
+ return lowerArrayPatternStaticAst(pattern, inputExpr, elementType, type, ctx);
284
413
  }
285
414
  case "objectPattern":
286
- return lowerObjectPattern(pattern, inputExpr, type, indent, ctx);
287
- default:
288
- // Unknown pattern kind
289
- return {
290
- statements: [`${indent}// Unsupported pattern kind`],
291
- context: ctx,
292
- };
415
+ return lowerObjectPatternStaticAst(pattern, inputExpr, type, ctx);
293
416
  }
294
417
  };
295
- /**
296
- * Lower a pattern for a for-of loop variable
297
- * Similar to lowerPattern but handles the iteration context
298
- */
299
- export const lowerForOfPattern = (pattern, iteratorVar, elementType, indent, ctx) => {
300
- // For simple identifier patterns, no lowering needed
301
- if (pattern.kind === "identifierPattern") {
302
- // The for-of loop itself declares the variable
303
- return { statements: [], context: ctx };
418
+ const isRuntimeRepresentableType = (type) => {
419
+ if (type.kind === "anyType" || type.kind === "unknownType")
420
+ return false;
421
+ if (type.kind === "objectType")
422
+ return false;
423
+ if (type.kind === "unionType") {
424
+ return type.types.every(isRuntimeRepresentableType);
304
425
  }
305
- // For complex patterns, lower to statements inside the loop body
306
- return lowerPattern(pattern, iteratorVar, elementType, indent, ctx);
426
+ return true;
307
427
  };
308
- /**
309
- * Lower a parameter pattern for function definitions
310
- * Generates statements to go at the beginning of the function body
311
- */
312
- export const lowerParameterPattern = (pattern, paramName, paramType, indent, ctx) => {
313
- // For simple identifier patterns, no lowering needed
314
- if (pattern.kind === "identifierPattern") {
315
- return { statements: [], context: ctx };
428
+ const resolveAssignmentResultTypeAst = (type, ctx) => {
429
+ if (!type || !isRuntimeRepresentableType(type)) {
430
+ return [objectTypeAst, ctx];
316
431
  }
317
- // For complex patterns, generate statements to destructure the synthetic param
318
- return lowerPattern(pattern, paramName, paramType, indent, ctx);
432
+ return emitTypeAst(type, ctx);
319
433
  };
320
- /**
321
- * Lower an assignment pattern to a C# expression
322
- *
323
- * In JavaScript, destructuring assignment is an expression that returns the RHS:
324
- * const result = ([a, b] = arr); // result === arr
325
- *
326
- * We emit this as a parenthesized sequence expression:
327
- * ((__t = rhs), (a = __t[0]), (b = __t[1]), __t)
328
- *
329
- * @param pattern - The pattern being assigned to
330
- * @param rhsExpr - The C# expression for the right-hand side
331
- * @param type - The type of the RHS expression
332
- * @param ctx - The current emitter context
333
- * @returns The expression and updated context
334
- */
335
- export const lowerAssignmentPattern = (pattern, rhsExpr, type, ctx) => {
336
- // For identifier pattern, just emit simple assignment
434
+ const lowerAssignmentPatternStatementsAst = (pattern, inputExpr, type, ctx) => {
337
435
  if (pattern.kind === "identifierPattern") {
338
- const escapedName = emitRemappedLocalName(pattern.name, ctx);
339
436
  return {
340
- expression: `${escapedName} = ${rhsExpr}`,
437
+ statements: [
438
+ {
439
+ kind: "expressionStatement",
440
+ expression: {
441
+ kind: "assignmentExpression",
442
+ operatorToken: "=",
443
+ left: {
444
+ kind: "identifierExpression",
445
+ identifier: emitRemappedLocalName(pattern.name, ctx),
446
+ },
447
+ right: inputExpr,
448
+ },
449
+ },
450
+ ],
341
451
  context: ctx,
342
452
  };
343
453
  }
344
- // For complex patterns, generate sequence expression
345
- const [tempName, ctx1] = generateTemp("t", ctx);
346
- let currentCtx = ctx1;
347
- // Collect assignment expressions
348
- const assignments = [];
454
+ let currentCtx = ctx;
455
+ const statements = [];
456
+ const [rawTempName, nextCtx] = generateTemp("t", currentCtx);
457
+ currentCtx = nextCtx;
458
+ const alloc = allocateLocalName(rawTempName, currentCtx);
459
+ const tempName = alloc.emittedName;
460
+ currentCtx = alloc.context;
461
+ statements.push({
462
+ kind: "localDeclarationStatement",
463
+ modifiers: [],
464
+ type: { kind: "varType" },
465
+ declarators: [{ name: tempName, initializer: inputExpr }],
466
+ });
467
+ const tempExpr = {
468
+ kind: "identifierExpression",
469
+ identifier: tempName,
470
+ };
349
471
  if (pattern.kind === "arrayPattern") {
350
472
  const elementType = type?.kind === "arrayType" ? type.elementType : undefined;
351
473
  let index = 0;
352
474
  for (const elem of pattern.elements) {
353
475
  if (!elem) {
354
- // Hole in pattern - skip
355
476
  index++;
356
477
  continue;
357
478
  }
358
479
  if (elem.isRest) {
359
- // Rest element
360
- const result = lowerAssignmentPatternElement(elem.pattern, `Tsonic.Runtime.ArrayHelpers.Slice(${tempName}, ${index})`, elementType ? { kind: "arrayType", elementType } : undefined, currentCtx);
361
- assignments.push(result.expression);
362
- currentCtx = result.context;
480
+ const restExpr = {
481
+ kind: "invocationExpression",
482
+ expression: {
483
+ kind: "memberAccessExpression",
484
+ expression: {
485
+ kind: "identifierExpression",
486
+ identifier: "Tsonic.Runtime.ArrayHelpers",
487
+ },
488
+ memberName: "Slice",
489
+ },
490
+ arguments: [
491
+ tempExpr,
492
+ { kind: "literalExpression", text: String(index) },
493
+ ],
494
+ };
495
+ const rest = lowerAssignmentPatternStatementsAst(elem.pattern, restExpr, elementType ? { kind: "arrayType", elementType } : undefined, currentCtx);
496
+ statements.push(...rest.statements);
497
+ currentCtx = rest.context;
363
498
  break;
364
499
  }
365
- // Regular element
366
- const result = lowerAssignmentPatternElement(elem.pattern, `${tempName}[${index}]`, elementType, currentCtx);
367
- assignments.push(result.expression);
368
- currentCtx = result.context;
500
+ const accessExpr = {
501
+ kind: "elementAccessExpression",
502
+ expression: tempExpr,
503
+ arguments: [{ kind: "literalExpression", text: String(index) }],
504
+ };
505
+ let valueExpr = accessExpr;
506
+ if (elem.defaultExpr) {
507
+ const [defaultAst, defaultCtx] = emitDefaultExprAst(elem.defaultExpr, currentCtx);
508
+ currentCtx = defaultCtx;
509
+ valueExpr = {
510
+ kind: "binaryExpression",
511
+ operatorToken: "??",
512
+ left: accessExpr,
513
+ right: defaultAst,
514
+ };
515
+ }
516
+ const nested = lowerAssignmentPatternStatementsAst(elem.pattern, valueExpr, elementType, currentCtx);
517
+ statements.push(...nested.statements);
518
+ currentCtx = nested.context;
369
519
  index++;
370
520
  }
521
+ return { statements, context: currentCtx };
371
522
  }
372
- else if (pattern.kind === "objectPattern") {
373
- for (const prop of pattern.properties) {
374
- if (prop.kind === "rest") {
375
- // Rest property - would need synthetic type
376
- if (prop.pattern.kind === "identifierPattern") {
377
- const escapedName = emitRemappedLocalName(prop.pattern.name, currentCtx);
378
- assignments.push(`/* ${escapedName} = rest of ${tempName} - needs synthetic type */`);
379
- }
380
- continue;
523
+ for (const prop of pattern.properties) {
524
+ if (prop.kind === "rest") {
525
+ if (!prop.restShapeMembers || !prop.restSynthTypeName) {
526
+ throw new Error("Object rest destructuring requires rest shape information from the frontend (restShapeMembers/restSynthTypeName).");
381
527
  }
382
- // Regular property
383
- const propType = getPropertyType(type, prop.key, currentCtx);
384
- const result = lowerAssignmentPatternElement(prop.value, `${tempName}.${prop.key}`, propType, currentCtx);
385
- assignments.push(result.expression);
386
- currentCtx = result.context;
528
+ const initMembers = prop.restShapeMembers
529
+ .filter((m) => m.kind === "propertySignature")
530
+ .map((m) => ({
531
+ kind: "assignmentExpression",
532
+ operatorToken: "=",
533
+ left: {
534
+ kind: "identifierExpression",
535
+ identifier: m.name,
536
+ },
537
+ right: {
538
+ kind: "memberAccessExpression",
539
+ expression: tempExpr,
540
+ memberName: m.name,
541
+ },
542
+ }));
543
+ const restExpr = {
544
+ kind: "objectCreationExpression",
545
+ type: { kind: "identifierType", name: prop.restSynthTypeName },
546
+ arguments: [],
547
+ initializer: initMembers,
548
+ };
549
+ const rest = lowerAssignmentPatternStatementsAst(prop.pattern, restExpr, undefined, currentCtx);
550
+ statements.push(...rest.statements);
551
+ currentCtx = rest.context;
552
+ continue;
553
+ }
554
+ const accessExpr = {
555
+ kind: "memberAccessExpression",
556
+ expression: tempExpr,
557
+ memberName: prop.key,
558
+ };
559
+ let valueExpr = accessExpr;
560
+ if (prop.defaultExpr) {
561
+ const [defaultAst, defaultCtx] = emitDefaultExprAst(prop.defaultExpr, currentCtx);
562
+ currentCtx = defaultCtx;
563
+ valueExpr = {
564
+ kind: "binaryExpression",
565
+ operatorToken: "??",
566
+ left: accessExpr,
567
+ right: defaultAst,
568
+ };
387
569
  }
570
+ const propType = getPropertyType(type, prop.key, currentCtx);
571
+ const nested = lowerAssignmentPatternStatementsAst(prop.value, valueExpr, propType, currentCtx);
572
+ statements.push(...nested.statements);
573
+ currentCtx = nested.context;
388
574
  }
389
- // Build sequence expression: (__t = rhs, a = __t[0], ..., __t)
390
- const allParts = [`${tempName} = ${rhsExpr}`, ...assignments, tempName];
391
- const expression = `(${allParts.join(", ")})`;
392
- return { expression, context: currentCtx };
575
+ return { statements, context: currentCtx };
393
576
  };
394
- /**
395
- * Helper to lower a single element/property in an assignment pattern
396
- */
397
- const lowerAssignmentPatternElement = (pattern, inputExpr, type, ctx) => {
577
+ export const lowerAssignmentPatternAst = (pattern, rhsExpr, rhsType, ctx) => {
398
578
  if (pattern.kind === "identifierPattern") {
399
- const escapedName = emitRemappedLocalName(pattern.name, ctx);
400
579
  return {
401
- expression: `${escapedName} = ${inputExpr}`,
580
+ expression: {
581
+ kind: "assignmentExpression",
582
+ operatorToken: "=",
583
+ left: {
584
+ kind: "identifierExpression",
585
+ identifier: emitRemappedLocalName(pattern.name, ctx),
586
+ },
587
+ right: rhsExpr,
588
+ },
402
589
  context: ctx,
403
590
  };
404
591
  }
405
- // Nested pattern - recurse
406
- return lowerAssignmentPattern(pattern, inputExpr, type, ctx);
592
+ let currentCtx = ctx;
593
+ const [resultTypeAst, typeCtx] = resolveAssignmentResultTypeAst(rhsType, currentCtx);
594
+ currentCtx = typeCtx;
595
+ const [rawResultName, nextCtx] = generateTemp("assign", currentCtx);
596
+ currentCtx = nextCtx;
597
+ const alloc = allocateLocalName(rawResultName, currentCtx);
598
+ const resultName = alloc.emittedName;
599
+ currentCtx = alloc.context;
600
+ const nested = lowerAssignmentPatternStatementsAst(pattern, {
601
+ kind: "identifierExpression",
602
+ identifier: resultName,
603
+ }, rhsType, currentCtx);
604
+ currentCtx = nested.context;
605
+ const lambdaStatements = [
606
+ {
607
+ kind: "localDeclarationStatement",
608
+ modifiers: [],
609
+ type: resultTypeAst,
610
+ declarators: [{ name: resultName, initializer: rhsExpr }],
611
+ },
612
+ ...nested.statements,
613
+ {
614
+ kind: "returnStatement",
615
+ expression: { kind: "identifierExpression", identifier: resultName },
616
+ },
617
+ ];
618
+ const iifeExpr = {
619
+ kind: "invocationExpression",
620
+ expression: {
621
+ kind: "parenthesizedExpression",
622
+ expression: {
623
+ kind: "castExpression",
624
+ type: {
625
+ kind: "identifierType",
626
+ name: "global::System.Func",
627
+ typeArguments: [resultTypeAst],
628
+ },
629
+ expression: {
630
+ kind: "parenthesizedExpression",
631
+ expression: {
632
+ kind: "lambdaExpression",
633
+ isAsync: false,
634
+ parameters: [],
635
+ body: { kind: "blockStatement", statements: lambdaStatements },
636
+ },
637
+ },
638
+ },
639
+ },
640
+ arguments: [],
641
+ };
642
+ return { expression: iifeExpr, context: currentCtx };
407
643
  };
408
644
  //# sourceMappingURL=patterns.js.map