@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,22 +1,28 @@
1
1
  /**
2
2
  * Function declaration emission
3
3
  */
4
- import { getIndent, indent, withAsync, withStatic, withScoped, } from "../../types.js";
5
- import { emitType, emitTypeParameters } from "../../type-emitter.js";
6
- import { emitBlockStatement } from "../blocks.js";
7
- import { emitParametersWithDestructuring, generateParameterDestructuring, } from "../classes.js";
4
+ import { withAsync, withStatic } from "../../types.js";
5
+ import { emitTypeAst, emitTypeParametersAst } from "../../type-emitter.js";
6
+ import { emitBlockStatementAst } from "../blocks.js";
7
+ import { emitExpressionAst } from "../../expression-emitter.js";
8
8
  import { escapeCSharpIdentifier } from "../../emitter-types/index.js";
9
+ import { lowerPatternAst } from "../../patterns.js";
9
10
  import { needsBidirectionalSupport, hasGeneratorReturnType, extractGeneratorTypeArgs, } from "../../generator-wrapper.js";
10
- import { emitAttributes } from "../../core/attributes.js";
11
+ import { emitAttributes } from "../../core/format/attributes.js";
11
12
  import { emitCSharpName, getCSharpName } from "../../naming-policy.js";
12
- import { allocateLocalName } from "../../core/local-names.js";
13
+ import { allocateLocalName } from "../../core/format/local-names.js";
13
14
  const getAsyncBodyReturnType = (isAsync, returnType) => {
14
15
  if (!isAsync || !returnType)
15
16
  return returnType;
17
+ const simpleName = returnType.kind === "referenceType"
18
+ ? returnType.name.includes(".")
19
+ ? returnType.name.slice(returnType.name.lastIndexOf(".") + 1)
20
+ : returnType.name
21
+ : undefined;
16
22
  if (returnType.kind === "referenceType" &&
17
- (returnType.name === "Promise" ||
18
- returnType.name === "Task" ||
19
- returnType.name === "ValueTask") &&
23
+ (simpleName === "Promise" ||
24
+ simpleName === "Task" ||
25
+ simpleName === "ValueTask") &&
20
26
  returnType.typeArguments?.length === 1) {
21
27
  return returnType.typeArguments[0];
22
28
  }
@@ -34,8 +40,20 @@ const seedLocalNameMapFromParameters = (params, context) => {
34
40
  }
35
41
  return { ...context, localNameMap: map, usedLocalNames: used };
36
42
  };
43
+ const restoreFunctionScopeContext = (outerContext, innerContext, savedScoped) => ({
44
+ ...outerContext,
45
+ ...innerContext,
46
+ ...savedScoped,
47
+ indentLevel: outerContext.indentLevel,
48
+ isStatic: outerContext.isStatic,
49
+ isAsync: outerContext.isAsync,
50
+ className: outerContext.className,
51
+ });
37
52
  /**
38
- * Emit a function declaration
53
+ * Emit a module-level function declaration as CSharpMethodDeclarationAst.
54
+ *
55
+ * For generators, builds exchange initialization and wrapper structures
56
+ * in the method body using AST nodes.
39
57
  */
40
58
  export const emitFunctionDeclaration = (stmt, context) => {
41
59
  const savedScoped = {
@@ -43,106 +61,109 @@ export const emitFunctionDeclaration = (stmt, context) => {
43
61
  typeParamConstraints: context.typeParamConstraints,
44
62
  typeParameterNameMap: context.typeParameterNameMap,
45
63
  returnType: context.returnType,
64
+ narrowedBindings: context.narrowedBindings,
65
+ voidResolveNames: context.voidResolveNames,
46
66
  localNameMap: context.localNameMap,
47
67
  usedLocalNames: context.usedLocalNames,
48
68
  };
49
- const ind = getIndent(context);
50
- const parts = [];
51
69
  const csharpBaseName = getCSharpName(stmt.name, "methods", context);
52
- // Build type parameter names set FIRST - needed when emitting return type and parameters
53
- // Type parameters must be in scope before we emit types that reference them
70
+ // Build type parameter names set FIRST
54
71
  const funcTypeParams = new Set([
55
72
  ...(context.typeParameters ?? []),
56
73
  ...(stmt.typeParameters?.map((tp) => tp.name) ?? []),
57
74
  ]);
58
- // Create context with type parameters in scope for signature emission
59
75
  const signatureContext = {
60
76
  ...context,
61
77
  typeParameters: funcTypeParams,
62
78
  };
63
- // Emit the <T, U> syntax and where clauses EARLY so nullable union emission
64
- // can see type parameter constraint kinds when emitting return/parameter types.
65
- const [typeParamsStr, whereClauses, typeParamContext] = emitTypeParameters(stmt.typeParameters, signatureContext);
79
+ // Emit type parameters as AST
80
+ const [typeParamAsts, constraintAsts, typeParamContext] = emitTypeParametersAst(stmt.typeParameters, signatureContext);
66
81
  let currentContext = typeParamContext;
67
82
  // Access modifiers
68
- //
69
- // Top-level (module) functions are emitted as static methods on the module's
70
- // container class. When a module also has namespace-level declarations
71
- // (classes/interfaces/enums), those types must still be able to call module-local
72
- // helpers. `private` would make them inaccessible, so use `internal` for
73
- // non-exported module functions.
74
83
  const accessibility = stmt.isExported
75
84
  ? "public"
76
85
  : context.isStatic
77
86
  ? "internal"
78
87
  : "private";
79
- parts.push(accessibility);
80
- if (context.isStatic) {
81
- parts.push("static");
82
- }
83
- if (stmt.isAsync && !stmt.isGenerator) {
84
- parts.push("async");
85
- }
86
- // Check if this is a bidirectional generator (has TNext type)
88
+ const modifiers = [accessibility];
89
+ if (context.isStatic)
90
+ modifiers.push("static");
91
+ // Check generator features
87
92
  const isBidirectional = needsBidirectionalSupport(stmt);
88
93
  const generatorHasReturnType = stmt.isGenerator && isBidirectional ? hasGeneratorReturnType(stmt) : false;
89
- // Return type
94
+ // Return type AST and async modifier
95
+ let returnTypeAst;
90
96
  if (stmt.isGenerator) {
91
97
  if (isBidirectional) {
92
- // Bidirectional generators return the wrapper class
93
98
  const wrapperName = `${csharpBaseName}_Generator`;
94
- parts.push(wrapperName);
99
+ returnTypeAst = { kind: "identifierType", name: wrapperName };
95
100
  }
96
101
  else {
97
- // Unidirectional generators return IEnumerable<exchange> or IAsyncEnumerable<exchange>
98
102
  const exchangeName = `${csharpBaseName}_exchange`;
99
103
  if (stmt.isAsync) {
100
- parts.push(`async global::System.Collections.Generic.IAsyncEnumerable<${exchangeName}>`);
104
+ modifiers.push("async");
105
+ returnTypeAst = {
106
+ kind: "identifierType",
107
+ name: "global::System.Collections.Generic.IAsyncEnumerable",
108
+ typeArguments: [{ kind: "identifierType", name: exchangeName }],
109
+ };
101
110
  }
102
111
  else {
103
- parts.push(`global::System.Collections.Generic.IEnumerable<${exchangeName}>`);
112
+ returnTypeAst = {
113
+ kind: "identifierType",
114
+ name: "global::System.Collections.Generic.IEnumerable",
115
+ typeArguments: [{ kind: "identifierType", name: exchangeName }],
116
+ };
104
117
  }
105
118
  }
106
119
  }
107
120
  else if (stmt.returnType) {
108
- const [returnType, newContext] = emitType(stmt.returnType, currentContext);
109
- currentContext = newContext;
110
- // If async and return type is Promise, it's already converted to Task
111
- // Don't wrap it again
121
+ const [retAst, retCtx] = emitTypeAst(stmt.returnType, currentContext);
122
+ currentContext = retCtx;
123
+ if (stmt.isAsync) {
124
+ modifiers.push("async");
125
+ }
112
126
  if (stmt.isAsync &&
113
127
  stmt.returnType.kind === "referenceType" &&
114
128
  stmt.returnType.name === "Promise") {
115
- parts.push(returnType); // Already Task<T> from emitType
129
+ returnTypeAst = retAst;
130
+ }
131
+ else if (stmt.isAsync) {
132
+ returnTypeAst = {
133
+ kind: "identifierType",
134
+ name: "global::System.Threading.Tasks.Task",
135
+ typeArguments: [retAst],
136
+ };
116
137
  }
117
138
  else {
118
- parts.push(stmt.isAsync
119
- ? `global::System.Threading.Tasks.Task<${returnType}>`
120
- : returnType);
139
+ returnTypeAst = retAst;
121
140
  }
122
141
  }
123
142
  else {
124
- parts.push(stmt.isAsync ? "global::System.Threading.Tasks.Task" : "void");
143
+ if (stmt.isAsync) {
144
+ modifiers.push("async");
145
+ returnTypeAst = {
146
+ kind: "identifierType",
147
+ name: "global::System.Threading.Tasks.Task",
148
+ };
149
+ }
150
+ else {
151
+ returnTypeAst = { kind: "identifierType", name: "void" };
152
+ }
125
153
  }
126
- // Function name
127
- parts.push(emitCSharpName(stmt.name, "methods", context));
128
- // Parameters (with destructuring support)
129
- const paramsResult = emitParametersWithDestructuring(stmt.parameters, currentContext);
154
+ // Parameters
155
+ const paramsResult = buildParameterAsts(stmt.parameters, currentContext);
130
156
  currentContext = paramsResult.context;
131
- // Function body (not a static context - local variables)
132
- // Use withScoped to set typeParameters and returnType for nested expressions
133
- let baseBodyContext = seedLocalNameMapFromParameters(stmt.parameters, withAsync(withStatic(indent(currentContext), false), stmt.isAsync));
134
- // Reserve generator-internal locals BEFORE emitting the body so user locals can safely
135
- // use these names (and get deterministically renamed) without colliding in C#.
157
+ // Body context setup
158
+ let baseBodyContext = seedLocalNameMapFromParameters(stmt.parameters, withAsync(withStatic(currentContext, false), stmt.isAsync));
159
+ // Reserve generator-internal locals
136
160
  let generatorExchangeVar = "exchange";
137
161
  let generatorIteratorFn = "__iterator";
138
162
  let generatorReturnValueVar = "__returnValue";
139
163
  if (stmt.isGenerator) {
140
164
  const exchangeAlloc = allocateLocalName(generatorExchangeVar, baseBodyContext);
141
165
  generatorExchangeVar = exchangeAlloc.emittedName;
142
- baseBodyContext = {
143
- ...exchangeAlloc.context,
144
- generatorExchangeVar,
145
- };
166
+ baseBodyContext = { ...exchangeAlloc.context, generatorExchangeVar };
146
167
  if (isBidirectional) {
147
168
  const iterAlloc = allocateLocalName(generatorIteratorFn, baseBodyContext);
148
169
  generatorIteratorFn = iterAlloc.emittedName;
@@ -150,131 +171,581 @@ export const emitFunctionDeclaration = (stmt, context) => {
150
171
  if (generatorHasReturnType) {
151
172
  const retAlloc = allocateLocalName(generatorReturnValueVar, baseBodyContext);
152
173
  generatorReturnValueVar = retAlloc.emittedName;
153
- baseBodyContext = {
154
- ...retAlloc.context,
155
- generatorReturnValueVar,
156
- };
174
+ baseBodyContext = { ...retAlloc.context, generatorReturnValueVar };
157
175
  }
158
176
  }
159
177
  }
160
- // Generate parameter destructuring statements BEFORE emitting the body so
161
- // any renamed locals are visible to the body emitter via localNameMap.
162
- const bodyInd = getIndent(baseBodyContext);
163
- const [parameterDestructuringStmts, destructuringContext] = paramsResult.destructuringParams.length > 0
164
- ? generateParameterDestructuring(paramsResult.destructuringParams, bodyInd, baseBodyContext)
178
+ // Generate parameter destructuring as AST
179
+ const [paramDestructuringStmts, destructuringContext] = paramsResult.destructuringParams.length > 0
180
+ ? generateParameterDestructuringAst(paramsResult.destructuringParams, baseBodyContext)
165
181
  : [[], baseBodyContext];
166
- // Emit body with scoped typeParameters and returnType
167
- // funcTypeParams was already built at the start of this function
168
- const [bodyCode] = withScoped(destructuringContext, {
182
+ // Emit body as AST
183
+ const bodyReturnType = stmt.isAsync && !stmt.isGenerator
184
+ ? getAsyncBodyReturnType(stmt.isAsync, stmt.returnType)
185
+ : stmt.returnType;
186
+ const bodyContext = {
187
+ ...destructuringContext,
169
188
  typeParameters: funcTypeParams,
170
- returnType: stmt.isAsync && !stmt.isGenerator
171
- ? getAsyncBodyReturnType(stmt.isAsync, stmt.returnType)
172
- : stmt.returnType,
173
- }, (scopedCtx) => emitBlockStatement(stmt.body, scopedCtx));
174
- // Collect out parameters that need initialization
175
- const outParams = [];
176
- for (const param of stmt.parameters) {
177
- // Use param.passing to detect out parameters (type is already unwrapped by frontend)
178
- if (param.passing === "out" && param.pattern.kind === "identifierPattern") {
179
- // Get the type for default value
180
- let typeName = "object";
181
- if (param.type) {
182
- const [typeStr] = emitType(param.type, currentContext);
183
- typeName = typeStr;
184
- }
185
- outParams.push({
186
- name: escapeCSharpIdentifier(param.pattern.name),
187
- type: typeName,
188
- });
189
- }
190
- }
191
- // Inject initialization code for generators, out parameters, and destructuring
192
- let finalBodyCode = bodyCode;
193
- const injectLines = [];
194
- // Generate parameter destructuring statements
195
- if (parameterDestructuringStmts.length > 0) {
196
- injectLines.push(...parameterDestructuringStmts);
197
- }
198
- // Handle bidirectional generators specially
189
+ returnType: bodyReturnType,
190
+ };
191
+ const [bodyBlock, bodyCtxAfter] = emitBlockStatementAst(stmt.body, bodyContext);
192
+ // Build final body with injected statements
193
+ let finalBody;
199
194
  if (stmt.isGenerator && isBidirectional) {
195
+ // Bidirectional generator: build wrapper body
200
196
  const exchangeName = `${csharpBaseName}_exchange`;
201
197
  const wrapperName = `${csharpBaseName}_Generator`;
202
198
  const enumerableType = stmt.isAsync
203
- ? `global::System.Collections.Generic.IAsyncEnumerable<${exchangeName}>`
204
- : `global::System.Collections.Generic.IEnumerable<${exchangeName}>`;
205
- const asyncModifier = stmt.isAsync ? "async " : "";
206
- // generatorHasReturnType was computed earlier so we can reserve locals before body emission.
207
- const hasReturnType = generatorHasReturnType;
208
- // Extract return type for __returnValue variable
209
- let returnTypeStr = "object";
210
- if (hasReturnType) {
211
- const { returnType: extractedReturnType, newContext: typeExtractContext, } = extractGeneratorTypeArgs(stmt.returnType, currentContext);
199
+ ? {
200
+ kind: "identifierType",
201
+ name: "global::System.Collections.Generic.IAsyncEnumerable",
202
+ typeArguments: [{ kind: "identifierType", name: exchangeName }],
203
+ }
204
+ : {
205
+ kind: "identifierType",
206
+ name: "global::System.Collections.Generic.IEnumerable",
207
+ typeArguments: [{ kind: "identifierType", name: exchangeName }],
208
+ };
209
+ const wrapperBodyStatements = [];
210
+ // var exchange = new ExchangeName();
211
+ wrapperBodyStatements.push({
212
+ kind: "localDeclarationStatement",
213
+ modifiers: [],
214
+ type: { kind: "varType" },
215
+ declarators: [
216
+ {
217
+ name: generatorExchangeVar,
218
+ initializer: {
219
+ kind: "objectCreationExpression",
220
+ type: { kind: "identifierType", name: exchangeName },
221
+ arguments: [],
222
+ },
223
+ },
224
+ ],
225
+ });
226
+ // TReturn __returnValue = default!;
227
+ if (generatorHasReturnType) {
228
+ const { returnType: extractedReturnTypeAst, newContext: typeExtractContext, } = extractGeneratorTypeArgs(stmt.returnType, currentContext);
212
229
  currentContext = typeExtractContext;
213
- returnTypeStr = extractedReturnType;
230
+ if (!extractedReturnTypeAst) {
231
+ throw new Error("ICE: Generator marked with non-void return type but no return type AST was extracted.");
232
+ }
233
+ wrapperBodyStatements.push({
234
+ kind: "localDeclarationStatement",
235
+ modifiers: [],
236
+ type: extractedReturnTypeAst,
237
+ declarators: [
238
+ {
239
+ name: generatorReturnValueVar,
240
+ initializer: {
241
+ kind: "suppressNullableWarningExpression",
242
+ expression: { kind: "defaultExpression" },
243
+ },
244
+ },
245
+ ],
246
+ });
214
247
  }
215
- // Build the body with local iterator function
216
- const iteratorBody = bodyCode
217
- .split("\n")
218
- .slice(1, -1) // Remove opening and closing braces
219
- .map((line) => ` ${line}`) // Add extra indent
220
- .join("\n");
221
- // Construct the bidirectional generator body
222
- const bodyLines = [
223
- `${ind}{`,
224
- `${bodyInd}var ${generatorExchangeVar} = new ${exchangeName}();`,
248
+ // Inner local function __iterator()
249
+ const innerBodyStatements = [
250
+ ...paramDestructuringStmts,
251
+ ...bodyBlock.statements,
225
252
  ];
226
- // Add __returnValue capture if TReturn is not void
227
- if (hasReturnType) {
228
- bodyLines.push(`${bodyInd}${returnTypeStr} ${generatorReturnValueVar} = default!;`);
253
+ const iteratorModifiers = stmt.isAsync ? ["async"] : [];
254
+ wrapperBodyStatements.push({
255
+ kind: "localFunctionStatement",
256
+ modifiers: iteratorModifiers,
257
+ returnType: enumerableType,
258
+ name: generatorIteratorFn,
259
+ parameters: [],
260
+ body: { kind: "blockStatement", statements: innerBodyStatements },
261
+ });
262
+ // return new WrapperName(__iterator(), exchange, () => __returnValue);
263
+ const constructorArgs = [
264
+ {
265
+ kind: "invocationExpression",
266
+ expression: {
267
+ kind: "identifierExpression",
268
+ identifier: generatorIteratorFn,
269
+ },
270
+ arguments: [],
271
+ },
272
+ { kind: "identifierExpression", identifier: generatorExchangeVar },
273
+ ];
274
+ if (generatorHasReturnType) {
275
+ constructorArgs.push({
276
+ kind: "lambdaExpression",
277
+ isAsync: false,
278
+ parameters: [],
279
+ body: {
280
+ kind: "identifierExpression",
281
+ identifier: generatorReturnValueVar,
282
+ },
283
+ });
284
+ }
285
+ wrapperBodyStatements.push({
286
+ kind: "returnStatement",
287
+ expression: {
288
+ kind: "objectCreationExpression",
289
+ type: { kind: "identifierType", name: wrapperName },
290
+ arguments: constructorArgs,
291
+ },
292
+ });
293
+ finalBody = {
294
+ kind: "blockStatement",
295
+ statements: wrapperBodyStatements,
296
+ };
297
+ }
298
+ else {
299
+ // Non-bidirectional: build body with injected init lines
300
+ const finalBodyStatements = [];
301
+ // Parameter destructuring
302
+ finalBodyStatements.push(...paramDestructuringStmts);
303
+ // Generator exchange initialization
304
+ if (stmt.isGenerator) {
305
+ const exchangeName = `${csharpBaseName}_exchange`;
306
+ finalBodyStatements.push({
307
+ kind: "localDeclarationStatement",
308
+ modifiers: [],
309
+ type: { kind: "varType" },
310
+ declarators: [
311
+ {
312
+ name: generatorExchangeVar,
313
+ initializer: {
314
+ kind: "objectCreationExpression",
315
+ type: { kind: "identifierType", name: exchangeName },
316
+ arguments: [],
317
+ },
318
+ },
319
+ ],
320
+ });
229
321
  }
230
- bodyLines.push(``);
231
- bodyLines.push(`${bodyInd}${asyncModifier}${enumerableType} ${generatorIteratorFn}()`);
232
- bodyLines.push(`${bodyInd}{`);
233
- bodyLines.push(iteratorBody);
234
- bodyLines.push(`${bodyInd}}`);
235
- bodyLines.push(``);
236
- // Wrapper constructor call - pass return value getter if needed
237
- if (hasReturnType) {
238
- bodyLines.push(`${bodyInd}return new ${wrapperName}(${generatorIteratorFn}(), ${generatorExchangeVar}, () => ${generatorReturnValueVar});`);
322
+ // Out parameter initializations
323
+ for (const param of stmt.parameters) {
324
+ if (param.passing === "out" &&
325
+ param.pattern.kind === "identifierPattern") {
326
+ finalBodyStatements.push({
327
+ kind: "expressionStatement",
328
+ expression: {
329
+ kind: "assignmentExpression",
330
+ operatorToken: "=",
331
+ left: {
332
+ kind: "identifierExpression",
333
+ identifier: escapeCSharpIdentifier(param.pattern.name),
334
+ },
335
+ right: { kind: "defaultExpression" },
336
+ },
337
+ });
338
+ }
339
+ }
340
+ // Original body statements
341
+ finalBodyStatements.push(...bodyBlock.statements);
342
+ finalBody = {
343
+ kind: "blockStatement",
344
+ statements: finalBodyStatements,
345
+ };
346
+ }
347
+ // Attributes
348
+ const [attrs, attrContext] = emitAttributes(stmt.attributes, currentContext);
349
+ currentContext = attrContext;
350
+ const methodAst = {
351
+ kind: "methodDeclaration",
352
+ attributes: attrs,
353
+ modifiers,
354
+ returnType: returnTypeAst,
355
+ name: emitCSharpName(stmt.name, "methods", context),
356
+ typeParameters: typeParamAsts.length > 0 ? typeParamAsts : undefined,
357
+ constraints: constraintAsts.length > 0 ? constraintAsts : undefined,
358
+ parameters: [...paramsResult.paramAsts],
359
+ body: finalBody,
360
+ };
361
+ return [
362
+ [methodAst],
363
+ restoreFunctionScopeContext(context, bodyCtxAfter, savedScoped),
364
+ ];
365
+ };
366
+ const buildParameterAsts = (parameters, context) => {
367
+ let currentCtx = context;
368
+ const paramAsts = [];
369
+ const destructuringParams = [];
370
+ let syntheticIndex = 0;
371
+ for (const param of parameters) {
372
+ // Type
373
+ let typeAst = { kind: "identifierType", name: "object" };
374
+ if (param.type) {
375
+ const [t, c] = emitTypeAst(param.type, currentCtx);
376
+ typeAst = t;
377
+ currentCtx = c;
378
+ }
379
+ // Optional: make nullable
380
+ if (param.isOptional) {
381
+ typeAst = { kind: "nullableType", underlyingType: typeAst };
382
+ }
383
+ // Name
384
+ let name;
385
+ const isComplexPattern = param.pattern.kind === "arrayPattern" ||
386
+ param.pattern.kind === "objectPattern";
387
+ if (isComplexPattern) {
388
+ name = `__param${syntheticIndex}`;
389
+ syntheticIndex++;
390
+ destructuringParams.push({
391
+ syntheticName: name,
392
+ pattern: param.pattern,
393
+ type: param.type,
394
+ });
395
+ }
396
+ else if (param.pattern.kind === "identifierPattern") {
397
+ name = escapeCSharpIdentifier(param.pattern.name);
239
398
  }
240
399
  else {
241
- bodyLines.push(`${bodyInd}return new ${wrapperName}(${generatorIteratorFn}(), ${generatorExchangeVar});`);
400
+ name = "param";
401
+ }
402
+ // Modifiers
403
+ const modifiers = [];
404
+ if (param.isExtensionReceiver)
405
+ modifiers.push("this");
406
+ if (param.passing !== "value")
407
+ modifiers.push(param.passing);
408
+ // Default value
409
+ let defaultValue;
410
+ if (param.initializer) {
411
+ const [ast, c] = emitExpressionAst(param.initializer, currentCtx);
412
+ defaultValue = ast;
413
+ currentCtx = c;
414
+ }
415
+ else if (param.isOptional && !param.isRest) {
416
+ defaultValue = { kind: "defaultExpression" };
242
417
  }
243
- bodyLines.push(`${ind}}`);
244
- finalBodyCode = bodyLines.join("\n");
418
+ paramAsts.push({
419
+ name,
420
+ type: typeAst,
421
+ defaultValue,
422
+ modifiers: modifiers.length > 0 ? modifiers : undefined,
423
+ });
245
424
  }
246
- else {
247
- // Add generator exchange initialization for unidirectional generators
248
- if (stmt.isGenerator) {
425
+ return { paramAsts, destructuringParams, context: currentCtx };
426
+ };
427
+ /**
428
+ * Generate parameter destructuring as AST statements.
429
+ */
430
+ const generateParameterDestructuringAst = (destructuringParams, context) => {
431
+ let currentContext = context;
432
+ const statements = [];
433
+ for (const info of destructuringParams) {
434
+ const inputExpr = {
435
+ kind: "identifierExpression",
436
+ identifier: info.syntheticName,
437
+ };
438
+ const result = lowerPatternAst(info.pattern, inputExpr, info.type, currentContext);
439
+ statements.push(...result.statements);
440
+ currentContext = result.context;
441
+ }
442
+ return [statements, currentContext];
443
+ };
444
+ /**
445
+ * Emit a local (non-static) function declaration as AST.
446
+ *
447
+ * Returns CSharpLocalFunctionStatementAst for regular functions.
448
+ * For generators, builds exchange initialization and wrapper structures.
449
+ *
450
+ * Static function declarations (module-level methods) are handled by
451
+ * the text-based emitFunctionDeclaration above.
452
+ */
453
+ export const emitFunctionDeclarationAst = (stmt, context) => {
454
+ const savedScoped = {
455
+ typeParameters: context.typeParameters,
456
+ typeParamConstraints: context.typeParamConstraints,
457
+ typeParameterNameMap: context.typeParameterNameMap,
458
+ returnType: context.returnType,
459
+ narrowedBindings: context.narrowedBindings,
460
+ voidResolveNames: context.voidResolveNames,
461
+ localNameMap: context.localNameMap,
462
+ usedLocalNames: context.usedLocalNames,
463
+ };
464
+ const csharpBaseName = getCSharpName(stmt.name, "methods", context);
465
+ const emittedName = emitCSharpName(stmt.name, "methods", context);
466
+ // Build type parameter names set
467
+ const funcTypeParams = new Set([
468
+ ...(context.typeParameters ?? []),
469
+ ...(stmt.typeParameters?.map((tp) => tp.name) ?? []),
470
+ ]);
471
+ const signatureContext = {
472
+ ...context,
473
+ typeParameters: funcTypeParams,
474
+ };
475
+ // Build type parameter mapping for scoped emission.
476
+ const [, , typeParamContext] = emitTypeParametersAst(stmt.typeParameters, signatureContext);
477
+ let currentContext = typeParamContext;
478
+ // Type parameter names for AST
479
+ const typeParamNames = stmt.typeParameters && stmt.typeParameters.length > 0
480
+ ? stmt.typeParameters.map((tp) => currentContext.typeParameterNameMap?.get(tp.name) ?? tp.name)
481
+ : undefined;
482
+ // Check generator features
483
+ const isBidirectional = needsBidirectionalSupport(stmt);
484
+ const generatorHasReturnType = stmt.isGenerator && isBidirectional ? hasGeneratorReturnType(stmt) : false;
485
+ // Modifiers
486
+ const modifiers = [];
487
+ if (stmt.isAsync && !stmt.isGenerator) {
488
+ modifiers.push("async");
489
+ }
490
+ // Return type AST
491
+ let returnTypeAst;
492
+ if (stmt.isGenerator) {
493
+ if (isBidirectional) {
494
+ const wrapperName = `${csharpBaseName}_Generator`;
495
+ returnTypeAst = { kind: "identifierType", name: wrapperName };
496
+ }
497
+ else {
249
498
  const exchangeName = `${csharpBaseName}_exchange`;
250
- injectLines.push(`${bodyInd}var ${generatorExchangeVar} = new ${exchangeName}();`);
499
+ if (stmt.isAsync) {
500
+ modifiers.push("async");
501
+ returnTypeAst = {
502
+ kind: "identifierType",
503
+ name: "global::System.Collections.Generic.IAsyncEnumerable",
504
+ typeArguments: [{ kind: "identifierType", name: exchangeName }],
505
+ };
506
+ }
507
+ else {
508
+ returnTypeAst = {
509
+ kind: "identifierType",
510
+ name: "global::System.Collections.Generic.IEnumerable",
511
+ typeArguments: [{ kind: "identifierType", name: exchangeName }],
512
+ };
513
+ }
514
+ }
515
+ }
516
+ else if (stmt.returnType) {
517
+ const [retAst, retCtx] = emitTypeAst(stmt.returnType, currentContext);
518
+ currentContext = retCtx;
519
+ if (stmt.isAsync) {
520
+ modifiers.push("async");
521
+ }
522
+ if (stmt.isAsync &&
523
+ stmt.returnType.kind === "referenceType" &&
524
+ stmt.returnType.name === "Promise") {
525
+ returnTypeAst = retAst; // Already Task<T> from emitTypeAst
526
+ }
527
+ else if (stmt.isAsync) {
528
+ returnTypeAst = {
529
+ kind: "identifierType",
530
+ name: "global::System.Threading.Tasks.Task",
531
+ typeArguments: [retAst],
532
+ };
533
+ }
534
+ else {
535
+ returnTypeAst = retAst;
251
536
  }
252
- // Add out parameter initializations
253
- if (outParams.length > 0) {
254
- for (const outParam of outParams) {
255
- injectLines.push(`${bodyInd}${outParam.name} = default;`);
537
+ }
538
+ else {
539
+ returnTypeAst = stmt.isAsync
540
+ ? { kind: "identifierType", name: "global::System.Threading.Tasks.Task" }
541
+ : { kind: "identifierType", name: "void" };
542
+ }
543
+ // Parameters as AST
544
+ const paramsResult = buildParameterAsts(stmt.parameters, currentContext);
545
+ currentContext = paramsResult.context;
546
+ // Body context setup
547
+ let baseBodyContext = seedLocalNameMapFromParameters(stmt.parameters, withAsync(withStatic(currentContext, false), stmt.isAsync));
548
+ // Reserve generator-internal locals
549
+ let generatorExchangeVar = "exchange";
550
+ let generatorIteratorFn = "__iterator";
551
+ let generatorReturnValueVar = "__returnValue";
552
+ if (stmt.isGenerator) {
553
+ const exchangeAlloc = allocateLocalName(generatorExchangeVar, baseBodyContext);
554
+ generatorExchangeVar = exchangeAlloc.emittedName;
555
+ baseBodyContext = { ...exchangeAlloc.context, generatorExchangeVar };
556
+ if (isBidirectional) {
557
+ const iterAlloc = allocateLocalName(generatorIteratorFn, baseBodyContext);
558
+ generatorIteratorFn = iterAlloc.emittedName;
559
+ baseBodyContext = iterAlloc.context;
560
+ if (generatorHasReturnType) {
561
+ const retAlloc = allocateLocalName(generatorReturnValueVar, baseBodyContext);
562
+ generatorReturnValueVar = retAlloc.emittedName;
563
+ baseBodyContext = { ...retAlloc.context, generatorReturnValueVar };
256
564
  }
257
565
  }
258
- // Inject lines after opening brace
259
- if (injectLines.length > 0) {
260
- const lines = bodyCode.split("\n");
261
- if (lines.length > 1) {
262
- lines.splice(1, 0, ...injectLines, "");
263
- finalBodyCode = lines.join("\n");
566
+ }
567
+ // Generate parameter destructuring as AST
568
+ const [paramDestructuringStmts, destructuringContext] = paramsResult.destructuringParams.length > 0
569
+ ? generateParameterDestructuringAst(paramsResult.destructuringParams, baseBodyContext)
570
+ : [[], baseBodyContext];
571
+ // Emit body as AST with scoped typeParameters and returnType
572
+ const bodyReturnType = stmt.isAsync && !stmt.isGenerator
573
+ ? getAsyncBodyReturnType(stmt.isAsync, stmt.returnType)
574
+ : stmt.returnType;
575
+ const bodyContext = {
576
+ ...destructuringContext,
577
+ typeParameters: funcTypeParams,
578
+ returnType: bodyReturnType,
579
+ };
580
+ const [bodyBlock, bodyCtxAfter] = emitBlockStatementAst(stmt.body, bodyContext);
581
+ // Build final body with injected statements
582
+ if (stmt.isGenerator && isBidirectional) {
583
+ // Bidirectional generator: build wrapper body structure
584
+ const exchangeName = `${csharpBaseName}_exchange`;
585
+ const wrapperName = `${csharpBaseName}_Generator`;
586
+ const enumerableType = stmt.isAsync
587
+ ? {
588
+ kind: "identifierType",
589
+ name: "global::System.Collections.Generic.IAsyncEnumerable",
590
+ typeArguments: [{ kind: "identifierType", name: exchangeName }],
591
+ }
592
+ : {
593
+ kind: "identifierType",
594
+ name: "global::System.Collections.Generic.IEnumerable",
595
+ typeArguments: [{ kind: "identifierType", name: exchangeName }],
596
+ };
597
+ const wrapperBodyStatements = [];
598
+ // var exchange = new ExchangeName();
599
+ wrapperBodyStatements.push({
600
+ kind: "localDeclarationStatement",
601
+ modifiers: [],
602
+ type: { kind: "varType" },
603
+ declarators: [
604
+ {
605
+ name: generatorExchangeVar,
606
+ initializer: {
607
+ kind: "objectCreationExpression",
608
+ type: { kind: "identifierType", name: exchangeName },
609
+ arguments: [],
610
+ },
611
+ },
612
+ ],
613
+ });
614
+ // TReturn __returnValue = default!; (if has return type)
615
+ if (generatorHasReturnType) {
616
+ const { returnType: extractedReturnTypeAst, newContext: typeExtractContext, } = extractGeneratorTypeArgs(stmt.returnType, currentContext);
617
+ currentContext = typeExtractContext;
618
+ if (!extractedReturnTypeAst) {
619
+ throw new Error("ICE: Generator marked with non-void return type but no return type AST was extracted.");
264
620
  }
621
+ wrapperBodyStatements.push({
622
+ kind: "localDeclarationStatement",
623
+ modifiers: [],
624
+ type: extractedReturnTypeAst,
625
+ declarators: [
626
+ {
627
+ name: generatorReturnValueVar,
628
+ initializer: {
629
+ kind: "suppressNullableWarningExpression",
630
+ expression: { kind: "defaultExpression" },
631
+ },
632
+ },
633
+ ],
634
+ });
635
+ }
636
+ // Inner local function __iterator() with original body + exchange init
637
+ const innerBodyStatements = [
638
+ ...paramDestructuringStmts,
639
+ ...bodyBlock.statements,
640
+ ];
641
+ const iteratorModifiers = stmt.isAsync ? ["async"] : [];
642
+ wrapperBodyStatements.push({
643
+ kind: "localFunctionStatement",
644
+ modifiers: iteratorModifiers,
645
+ returnType: enumerableType,
646
+ name: generatorIteratorFn,
647
+ parameters: [],
648
+ body: { kind: "blockStatement", statements: innerBodyStatements },
649
+ });
650
+ // return new WrapperName(__iterator(), exchange, () => __returnValue);
651
+ const constructorArgs = [
652
+ {
653
+ kind: "invocationExpression",
654
+ expression: {
655
+ kind: "identifierExpression",
656
+ identifier: generatorIteratorFn,
657
+ },
658
+ arguments: [],
659
+ },
660
+ { kind: "identifierExpression", identifier: generatorExchangeVar },
661
+ ];
662
+ if (generatorHasReturnType) {
663
+ constructorArgs.push({
664
+ kind: "lambdaExpression",
665
+ isAsync: false,
666
+ parameters: [],
667
+ body: {
668
+ kind: "identifierExpression",
669
+ identifier: generatorReturnValueVar,
670
+ },
671
+ });
265
672
  }
673
+ wrapperBodyStatements.push({
674
+ kind: "returnStatement",
675
+ expression: {
676
+ kind: "objectCreationExpression",
677
+ type: { kind: "identifierType", name: wrapperName },
678
+ arguments: constructorArgs,
679
+ },
680
+ });
681
+ const localFn = {
682
+ kind: "localFunctionStatement",
683
+ modifiers,
684
+ returnType: returnTypeAst,
685
+ name: emittedName,
686
+ typeParameters: typeParamNames,
687
+ parameters: [...paramsResult.paramAsts],
688
+ body: { kind: "blockStatement", statements: wrapperBodyStatements },
689
+ };
690
+ return [
691
+ [localFn],
692
+ restoreFunctionScopeContext(context, bodyCtxAfter, savedScoped),
693
+ ];
266
694
  }
267
- // Emit attributes before the function declaration
268
- const [attributesCode, attrContext] = emitAttributes(stmt.attributes, currentContext);
269
- currentContext = attrContext;
270
- const signature = parts.join(" ");
271
- const whereClause = whereClauses.length > 0
272
- ? `\n${ind} ${whereClauses.join(`\n${ind} `)}`
273
- : "";
274
- // Build final code with attributes (if any)
275
- const attrPrefix = attributesCode ? attributesCode + "\n" : "";
276
- const code = `${attrPrefix}${ind}${signature}${typeParamsStr}(${paramsResult.parameterList})${whereClause}\n${finalBodyCode}`;
277
- // Return context - no usings tracking needed with global:: FQN approach
278
- return [code, { ...currentContext, ...savedScoped }];
695
+ // Non-bidirectional: build body with injected init lines
696
+ const finalBodyStatements = [];
697
+ // Parameter destructuring
698
+ finalBodyStatements.push(...paramDestructuringStmts);
699
+ // Generator exchange initialization
700
+ if (stmt.isGenerator) {
701
+ const exchangeName = `${csharpBaseName}_exchange`;
702
+ finalBodyStatements.push({
703
+ kind: "localDeclarationStatement",
704
+ modifiers: [],
705
+ type: { kind: "varType" },
706
+ declarators: [
707
+ {
708
+ name: generatorExchangeVar,
709
+ initializer: {
710
+ kind: "objectCreationExpression",
711
+ type: { kind: "identifierType", name: exchangeName },
712
+ arguments: [],
713
+ },
714
+ },
715
+ ],
716
+ });
717
+ }
718
+ // Out parameter initializations
719
+ for (const param of stmt.parameters) {
720
+ if (param.passing === "out" && param.pattern.kind === "identifierPattern") {
721
+ finalBodyStatements.push({
722
+ kind: "expressionStatement",
723
+ expression: {
724
+ kind: "assignmentExpression",
725
+ operatorToken: "=",
726
+ left: {
727
+ kind: "identifierExpression",
728
+ identifier: escapeCSharpIdentifier(param.pattern.name),
729
+ },
730
+ right: { kind: "defaultExpression" },
731
+ },
732
+ });
733
+ }
734
+ }
735
+ // Original body statements
736
+ finalBodyStatements.push(...bodyBlock.statements);
737
+ const localFn = {
738
+ kind: "localFunctionStatement",
739
+ modifiers,
740
+ returnType: returnTypeAst,
741
+ name: emittedName,
742
+ typeParameters: typeParamNames,
743
+ parameters: [...paramsResult.paramAsts],
744
+ body: { kind: "blockStatement", statements: finalBodyStatements },
745
+ };
746
+ return [
747
+ [localFn],
748
+ restoreFunctionScopeContext(context, bodyCtxAfter, savedScoped),
749
+ ];
279
750
  };
280
751
  //# sourceMappingURL=functions.js.map