@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,37 +1,79 @@
1
1
  /**
2
- * Generator Wrapper Class Generator
3
- * Per spec/13-generators.md - Generate wrapper classes for bidirectional communication
2
+ * Generator wrapper declaration emission.
4
3
  *
5
- * For TypeScript: function* accumulator(start = 0): Generator<number, void, number> { }
6
- *
7
- * Generates:
8
- * 1. Exchange class: accumulator_exchange { Input?, Output }
9
- * 2. Wrapper class: accumulator_Generator { next(), return(), throw() }
10
- * 3. Core method: accumulator_core(exchange) returning IEnumerable<exchange>
11
- * 4. Public method: accumulator(start = 0) returning accumulator_Generator
4
+ * Builds wrapper classes as typed CSharp AST declarations (no text templates).
12
5
  */
13
- import { getIndent, indent } from "./types.js";
14
- import { emitType } from "./type-emitter.js";
6
+ import { emitTypeAst } from "./type-emitter.js";
15
7
  import { emitCSharpName, getCSharpName } from "./naming-policy.js";
8
+ const objectTypeAst = { kind: "identifierType", name: "object" };
9
+ const boolTypeAst = { kind: "predefinedType", keyword: "bool" };
10
+ const literal = (text) => ({
11
+ kind: "literalExpression",
12
+ text,
13
+ });
14
+ const id = (identifier) => ({
15
+ kind: "identifierExpression",
16
+ identifier,
17
+ });
18
+ const member = (expression, memberName) => ({
19
+ kind: "memberAccessExpression",
20
+ expression,
21
+ memberName,
22
+ });
23
+ const invoke = (expression, args = []) => ({
24
+ kind: "invocationExpression",
25
+ expression,
26
+ arguments: args,
27
+ });
28
+ const assign = (left, right) => ({
29
+ kind: "assignmentExpression",
30
+ operatorToken: "=",
31
+ left,
32
+ right,
33
+ });
34
+ const suppressDefault = () => ({
35
+ kind: "suppressNullableWarningExpression",
36
+ expression: { kind: "defaultExpression" },
37
+ });
38
+ const iteratorResultType = (yieldType) => ({
39
+ kind: "identifierType",
40
+ name: "global::Tsonic.Runtime.IteratorResult",
41
+ typeArguments: [yieldType],
42
+ });
43
+ const iteratorResultCtor = (yieldType, value, done) => ({
44
+ kind: "objectCreationExpression",
45
+ type: iteratorResultType(yieldType),
46
+ arguments: [value, literal(done ? "true" : "false")],
47
+ });
48
+ const taskOf = (typeArg) => ({
49
+ kind: "identifierType",
50
+ name: "global::System.Threading.Tasks.Task",
51
+ typeArguments: [typeArg],
52
+ });
53
+ const funcType = (typeArg) => ({
54
+ kind: "identifierType",
55
+ name: "global::System.Func",
56
+ typeArguments: [typeArg],
57
+ });
16
58
  /**
17
- * Extract Generator type arguments from a return type
18
- * Generator<T, TReturn, TNext> -> { yieldType: T, returnType: TReturn, nextType: TNext }
59
+ * Extract generator type arguments as CSharpTypeAst.
60
+ *
61
+ * Generator<TYield, TReturn, TNext> -> { yieldType, returnType?, nextType }
19
62
  */
20
63
  export const extractGeneratorTypeArgs = (returnType, context) => {
21
- let yieldType = "object";
22
- let retType = "void";
23
- let nextType = "object";
64
+ let yieldType = objectTypeAst;
65
+ let returnTypeAst;
66
+ let nextType = objectTypeAst;
24
67
  let hasNextType = false;
25
68
  let currentContext = context;
26
69
  if (returnType?.kind === "referenceType") {
27
70
  const typeRef = returnType;
28
- // Generator<Yield, Return, Next> or AsyncGenerator<Yield, Return, Next>
29
71
  if (typeRef.typeArguments && typeRef.typeArguments.length > 0) {
30
72
  const yieldTypeArg = typeRef.typeArguments[0];
31
73
  if (yieldTypeArg) {
32
- const [yt, ctx1] = emitType(yieldTypeArg, currentContext);
74
+ const [ytAst, ctx1] = emitTypeAst(yieldTypeArg, currentContext);
33
75
  currentContext = ctx1;
34
- yieldType = yt;
76
+ yieldType = ytAst;
35
77
  }
36
78
  if (typeRef.typeArguments.length > 1) {
37
79
  const returnTypeArg = typeRef.typeArguments[1];
@@ -39,9 +81,9 @@ export const extractGeneratorTypeArgs = (returnType, context) => {
39
81
  returnTypeArg.kind !== "voidType" &&
40
82
  !(returnTypeArg.kind === "primitiveType" &&
41
83
  returnTypeArg.name === "undefined")) {
42
- const [rt, ctx2] = emitType(returnTypeArg, currentContext);
84
+ const [rtAst, ctx2] = emitTypeAst(returnTypeArg, currentContext);
43
85
  currentContext = ctx2;
44
- retType = rt;
86
+ returnTypeAst = rtAst;
45
87
  }
46
88
  }
47
89
  if (typeRef.typeArguments.length > 2) {
@@ -49,9 +91,9 @@ export const extractGeneratorTypeArgs = (returnType, context) => {
49
91
  if (nextTypeArg &&
50
92
  !(nextTypeArg.kind === "primitiveType" &&
51
93
  nextTypeArg.name === "undefined")) {
52
- const [nt, ctx3] = emitType(nextTypeArg, currentContext);
94
+ const [ntAst, ctx3] = emitTypeAst(nextTypeArg, currentContext);
53
95
  currentContext = ctx3;
54
- nextType = nt;
96
+ nextType = ntAst;
55
97
  hasNextType = true;
56
98
  }
57
99
  }
@@ -59,66 +101,275 @@ export const extractGeneratorTypeArgs = (returnType, context) => {
59
101
  }
60
102
  return {
61
103
  yieldType,
62
- returnType: retType,
104
+ returnType: returnTypeAst,
63
105
  nextType,
64
106
  hasNextType,
65
107
  newContext: currentContext,
66
108
  };
67
109
  };
68
- // Note: IteratorResult<T> is now defined in Tsonic.Runtime.Generators
69
- // Use global::Tsonic.Runtime.IteratorResult<T> in generated code
110
+ const buildConstructor = (wrapperName, exchangeName, isAsync, returnType) => {
111
+ const enumerableType = {
112
+ kind: "identifierType",
113
+ name: isAsync
114
+ ? "global::System.Collections.Generic.IAsyncEnumerable"
115
+ : "global::System.Collections.Generic.IEnumerable",
116
+ typeArguments: [{ kind: "identifierType", name: exchangeName }],
117
+ };
118
+ const parameters = [
119
+ { name: "enumerable", type: enumerableType },
120
+ { name: "exchange", type: { kind: "identifierType", name: exchangeName } },
121
+ ];
122
+ if (returnType) {
123
+ parameters.push({
124
+ name: "getReturnValue",
125
+ type: funcType(returnType),
126
+ });
127
+ }
128
+ const getEnumeratorCall = invoke(member(id("enumerable"), isAsync ? "GetAsyncEnumerator" : "GetEnumerator"));
129
+ const statements = [
130
+ {
131
+ kind: "expressionStatement",
132
+ expression: assign(id("_enumerator"), getEnumeratorCall),
133
+ },
134
+ {
135
+ kind: "expressionStatement",
136
+ expression: assign(id("_exchange"), id("exchange")),
137
+ },
138
+ ];
139
+ if (returnType) {
140
+ statements.push({
141
+ kind: "expressionStatement",
142
+ expression: assign(id("_getReturnValue"), id("getReturnValue")),
143
+ });
144
+ }
145
+ return {
146
+ kind: "constructorDeclaration",
147
+ attributes: [],
148
+ modifiers: ["public"],
149
+ name: wrapperName,
150
+ parameters,
151
+ body: { kind: "blockStatement", statements },
152
+ };
153
+ };
154
+ const buildDoneGuard = (yieldType) => ({
155
+ kind: "ifStatement",
156
+ condition: id("_done"),
157
+ thenStatement: {
158
+ kind: "blockStatement",
159
+ statements: [
160
+ {
161
+ kind: "returnStatement",
162
+ expression: iteratorResultCtor(yieldType, suppressDefault(), true),
163
+ },
164
+ ],
165
+ },
166
+ });
167
+ const buildNextMethod = (yieldType, nextType, hasNextType, isAsync, nextMethodName) => {
168
+ const resultType = iteratorResultType(yieldType);
169
+ const returnType = isAsync ? taskOf(resultType) : resultType;
170
+ const paramType = hasNextType
171
+ ? { kind: "nullableType", underlyingType: nextType }
172
+ : { kind: "nullableType", underlyingType: objectTypeAst };
173
+ const moveNextExpr = invoke(member(id("_enumerator"), isAsync ? "MoveNextAsync" : "MoveNext"));
174
+ const moveNextCondition = isAsync
175
+ ? {
176
+ kind: "awaitExpression",
177
+ expression: moveNextExpr,
178
+ }
179
+ : moveNextExpr;
180
+ return {
181
+ kind: "methodDeclaration",
182
+ attributes: [],
183
+ modifiers: ["public", ...(isAsync ? ["async"] : [])],
184
+ returnType,
185
+ name: nextMethodName,
186
+ parameters: [
187
+ {
188
+ name: "value",
189
+ type: paramType,
190
+ defaultValue: { kind: "defaultExpression" },
191
+ },
192
+ ],
193
+ body: {
194
+ kind: "blockStatement",
195
+ statements: [
196
+ buildDoneGuard(yieldType),
197
+ {
198
+ kind: "expressionStatement",
199
+ expression: assign(member(id("_exchange"), "Input"), id("value")),
200
+ },
201
+ {
202
+ kind: "ifStatement",
203
+ condition: moveNextCondition,
204
+ thenStatement: {
205
+ kind: "blockStatement",
206
+ statements: [
207
+ {
208
+ kind: "returnStatement",
209
+ expression: iteratorResultCtor(yieldType, member(id("_exchange"), "Output"), false),
210
+ },
211
+ ],
212
+ },
213
+ },
214
+ {
215
+ kind: "expressionStatement",
216
+ expression: assign(id("_done"), literal("true")),
217
+ },
218
+ {
219
+ kind: "returnStatement",
220
+ expression: iteratorResultCtor(yieldType, suppressDefault(), true),
221
+ },
222
+ ],
223
+ },
224
+ };
225
+ };
226
+ const buildReturnValueProperty = (returnType, propertyName) => ({
227
+ kind: "propertyDeclaration",
228
+ attributes: [],
229
+ modifiers: ["public"],
230
+ type: returnType,
231
+ name: propertyName,
232
+ hasGetter: true,
233
+ hasSetter: false,
234
+ isAutoProperty: false,
235
+ getterBody: {
236
+ kind: "blockStatement",
237
+ statements: [
238
+ {
239
+ kind: "returnStatement",
240
+ expression: {
241
+ kind: "conditionalExpression",
242
+ condition: id("_wasExternallyTerminated"),
243
+ whenTrue: id("_returnValue"),
244
+ whenFalse: invoke(id("_getReturnValue")),
245
+ },
246
+ },
247
+ ],
248
+ },
249
+ });
250
+ const buildDisposeExpression = (isAsync) => isAsync
251
+ ? {
252
+ kind: "awaitExpression",
253
+ expression: invoke(member(id("_enumerator"), "DisposeAsync")),
254
+ }
255
+ : invoke(member(id("_enumerator"), "Dispose"));
256
+ const buildReturnMethod = (yieldType, returnType, isAsync, returnMethodName) => {
257
+ const resultType = iteratorResultType(yieldType);
258
+ const methodReturnType = isAsync ? taskOf(resultType) : resultType;
259
+ const returnParamType = returnType ?? {
260
+ kind: "nullableType",
261
+ underlyingType: objectTypeAst,
262
+ };
263
+ const statements = [
264
+ {
265
+ kind: "expressionStatement",
266
+ expression: assign(id("_done"), literal("true")),
267
+ },
268
+ ];
269
+ if (returnType) {
270
+ statements.push({
271
+ kind: "expressionStatement",
272
+ expression: assign(id("_returnValue"), id("value")),
273
+ }, {
274
+ kind: "expressionStatement",
275
+ expression: assign(id("_wasExternallyTerminated"), literal("true")),
276
+ });
277
+ }
278
+ statements.push({
279
+ kind: "expressionStatement",
280
+ expression: buildDisposeExpression(isAsync),
281
+ });
282
+ statements.push({
283
+ kind: "returnStatement",
284
+ expression: iteratorResultCtor(yieldType, suppressDefault(), true),
285
+ });
286
+ return {
287
+ kind: "methodDeclaration",
288
+ attributes: [],
289
+ modifiers: ["public", ...(isAsync ? ["async"] : [])],
290
+ returnType: methodReturnType,
291
+ name: returnMethodName,
292
+ parameters: [
293
+ {
294
+ name: "value",
295
+ type: returnParamType,
296
+ defaultValue: suppressDefault(),
297
+ },
298
+ ],
299
+ body: { kind: "blockStatement", statements },
300
+ };
301
+ };
302
+ const buildThrowMethod = (yieldType, isAsync, throwMethodName) => {
303
+ const resultType = iteratorResultType(yieldType);
304
+ const methodReturnType = isAsync ? taskOf(resultType) : resultType;
305
+ const disposeCall = isAsync
306
+ ? invoke(member(invoke(member(invoke(member(id("_enumerator"), "DisposeAsync")), "AsTask")), "Wait"))
307
+ : invoke(member(id("_enumerator"), "Dispose"));
308
+ const exPattern = {
309
+ kind: "declarationPattern",
310
+ type: { kind: "identifierType", name: "global::System.Exception" },
311
+ designation: "ex",
312
+ };
313
+ return {
314
+ kind: "methodDeclaration",
315
+ attributes: [],
316
+ modifiers: ["public"],
317
+ returnType: methodReturnType,
318
+ name: throwMethodName,
319
+ parameters: [{ name: "e", type: objectTypeAst }],
320
+ body: {
321
+ kind: "blockStatement",
322
+ statements: [
323
+ {
324
+ kind: "expressionStatement",
325
+ expression: assign(id("_done"), literal("true")),
326
+ },
327
+ { kind: "expressionStatement", expression: disposeCall },
328
+ {
329
+ kind: "ifStatement",
330
+ condition: {
331
+ kind: "isExpression",
332
+ expression: id("e"),
333
+ pattern: exPattern,
334
+ },
335
+ thenStatement: {
336
+ kind: "blockStatement",
337
+ statements: [{ kind: "throwStatement", expression: id("ex") }],
338
+ },
339
+ },
340
+ {
341
+ kind: "throwStatement",
342
+ expression: {
343
+ kind: "objectCreationExpression",
344
+ type: {
345
+ kind: "identifierType",
346
+ name: "global::System.Exception",
347
+ },
348
+ arguments: [
349
+ {
350
+ kind: "binaryExpression",
351
+ operatorToken: "??",
352
+ left: invoke({
353
+ kind: "conditionalMemberAccessExpression",
354
+ expression: id("e"),
355
+ memberName: "ToString",
356
+ }),
357
+ right: {
358
+ kind: "literalExpression",
359
+ text: '"Unknown error"',
360
+ },
361
+ },
362
+ ],
363
+ },
364
+ },
365
+ ],
366
+ },
367
+ };
368
+ };
70
369
  /**
71
- * Generate wrapper class for a generator function
72
- *
73
- * Example for: function* accumulator(start = 0): Generator<number, void, number>
74
- *
75
- * public sealed class accumulator_Generator
76
- * {
77
- * private readonly global::System.Collections.Generic.IEnumerator<accumulator_exchange> _enumerator;
78
- * private readonly accumulator_exchange _exchange;
79
- * private bool _done = false;
80
- *
81
- * public accumulator_Generator(global::System.Collections.Generic.IEnumerable<accumulator_exchange> enumerable, accumulator_exchange exchange)
82
- * {
83
- * _enumerator = enumerable.GetEnumerator();
84
- * _exchange = exchange;
85
- * }
86
- *
87
- * public global::Tsonic.Runtime.IteratorResult<double> next(double? value = default)
88
- * {
89
- * if (_done) return new global::Tsonic.Runtime.IteratorResult<double>(default!, true);
90
- * _exchange.Input = value;
91
- * if (_enumerator.MoveNext())
92
- * {
93
- * return new global::Tsonic.Runtime.IteratorResult<double>(_exchange.Output, false);
94
- * }
95
- * _done = true;
96
- * return new global::Tsonic.Runtime.IteratorResult<double>(default!, true);
97
- * }
98
- *
99
- * public global::Tsonic.Runtime.IteratorResult<double> @return(TReturn value = default!)
100
- * {
101
- * _done = true;
102
- * _returnValue = value;
103
- * _wasExternallyTerminated = true;
104
- * _enumerator.Dispose();
105
- * return new global::Tsonic.Runtime.IteratorResult<double>(default!, true);
106
- * }
107
- *
108
- * public global::Tsonic.Runtime.IteratorResult<double> @throw(object e)
109
- * {
110
- * _done = true;
111
- * _enumerator.Dispose();
112
- * if (e is global::System.Exception ex) throw ex;
113
- * throw new global::System.Exception(e?.ToString() ?? "Unknown error");
114
- * }
115
- * }
370
+ * Generate wrapper class declaration for a generator function.
116
371
  */
117
372
  export const generateWrapperClass = (func, context) => {
118
- const ind = getIndent(context);
119
- const bodyInd = getIndent(indent(context));
120
- const innerInd = getIndent(indent(indent(context)));
121
- const parts = [];
122
373
  let currentContext = context;
123
374
  const csharpBaseName = getCSharpName(func.name, "methods", context);
124
375
  const wrapperName = `${csharpBaseName}_Generator`;
@@ -127,149 +378,78 @@ export const generateWrapperClass = (func, context) => {
127
378
  const returnMethodName = emitCSharpName("return", "methods", context);
128
379
  const throwMethodName = emitCSharpName("throw", "methods", context);
129
380
  const returnValuePropertyName = emitCSharpName("returnValue", "properties", context);
130
- // Extract type arguments
131
- const { yieldType, returnType, nextType, hasNextType, newContext } = extractGeneratorTypeArgs(func.returnType, currentContext);
132
- currentContext = newContext;
133
- // Use yieldType for IteratorResult
134
- const resultType = yieldType;
135
- parts.push(`${ind}public sealed class ${wrapperName}`);
136
- parts.push(`${ind}{`);
137
- // Private fields
138
- const enumeratorType = func.isAsync
139
- ? `global::System.Collections.Generic.IAsyncEnumerator<${exchangeName}>`
140
- : `global::System.Collections.Generic.IEnumerator<${exchangeName}>`;
141
- parts.push(`${bodyInd}private readonly ${enumeratorType} _enumerator;`);
142
- parts.push(`${bodyInd}private readonly ${exchangeName} _exchange;`);
143
- // Return value getter - captures TReturn from generator return statements (natural completion)
144
- const hasReturnType = returnType !== "void";
145
- if (hasReturnType) {
146
- parts.push(`${bodyInd}private readonly global::System.Func<${returnType}> _getReturnValue;`);
147
- // Field for external termination via @return(value)
148
- parts.push(`${bodyInd}private ${returnType} _returnValue = default!;`);
149
- parts.push(`${bodyInd}private bool _wasExternallyTerminated = false;`);
150
- }
151
- parts.push(`${bodyInd}private bool _done = false;`);
152
- parts.push("");
153
- // Constructor
154
- const enumerableType = func.isAsync
155
- ? `global::System.Collections.Generic.IAsyncEnumerable<${exchangeName}>`
156
- : `global::System.Collections.Generic.IEnumerable<${exchangeName}>`;
157
- // Constructor signature includes return value getter if TReturn is not void
158
- const constructorParams = hasReturnType
159
- ? `${enumerableType} enumerable, ${exchangeName} exchange, global::System.Func<${returnType}> getReturnValue`
160
- : `${enumerableType} enumerable, ${exchangeName} exchange`;
161
- parts.push(`${bodyInd}public ${wrapperName}(${constructorParams})`);
162
- parts.push(`${bodyInd}{`);
163
- parts.push(`${innerInd}_enumerator = enumerable.${func.isAsync ? "GetAsyncEnumerator()" : "GetEnumerator()"};`);
164
- parts.push(`${innerInd}_exchange = exchange;`);
165
- if (hasReturnType) {
166
- parts.push(`${innerInd}_getReturnValue = getReturnValue;`);
167
- }
168
- parts.push(`${bodyInd}}`);
169
- parts.push("");
170
- // next() method
171
- const nextReturnType = func.isAsync
172
- ? `global::System.Threading.Tasks.Task<global::Tsonic.Runtime.IteratorResult<${resultType}>>`
173
- : `global::Tsonic.Runtime.IteratorResult<${resultType}>`;
174
- const nextParamType = hasNextType ? `${nextType}?` : "object?";
175
- const asyncKeyword = func.isAsync ? "async " : "";
176
- const awaitKeyword = func.isAsync ? "await " : "";
177
- const moveNextMethod = func.isAsync ? "MoveNextAsync()" : "MoveNext()";
178
- parts.push(`${bodyInd}public ${asyncKeyword}${nextReturnType} ${nextMethodName}(${nextParamType} value = default)`);
179
- parts.push(`${bodyInd}{`);
180
- // When already done, return cached result (with TReturn value if available)
181
- // Note: JS IteratorResult has value: TYield | TReturn on completion
182
- // We use default! for the value since the consumer should check done first
183
- parts.push(`${innerInd}if (_done) return new global::Tsonic.Runtime.IteratorResult<${resultType}>(default!, true);`);
184
- parts.push(`${innerInd}_exchange.Input = value;`);
185
- parts.push(`${innerInd}if (${awaitKeyword}_enumerator.${moveNextMethod})`);
186
- parts.push(`${innerInd}{`);
187
- parts.push(`${innerInd} return new global::Tsonic.Runtime.IteratorResult<${resultType}>(_exchange.Output, false);`);
188
- parts.push(`${innerInd}}`);
189
- parts.push(`${innerInd}_done = true;`);
190
- // When iterator completes, return default! for the value
191
- // The return value can be accessed via the returnValue property if TReturn is not void
192
- // Note: JavaScript IteratorResult has value: TYield | TReturn, but C# can't represent this union
193
- parts.push(`${innerInd}return new global::Tsonic.Runtime.IteratorResult<${resultType}>(default!, true);`);
194
- parts.push(`${bodyInd}}`);
195
- parts.push("");
196
- // returnValue property - provides access to TReturn when generator completes
197
- if (hasReturnType) {
198
- parts.push(`${bodyInd}/// <summary>`);
199
- parts.push(`${bodyInd}/// Gets the return value of the generator after it completes.`);
200
- parts.push(`${bodyInd}/// Only valid after the generator is done (next() returned done=true).`);
201
- parts.push(`${bodyInd}/// If terminated via return(value), returns that value.`);
202
- parts.push(`${bodyInd}/// Otherwise, returns the value from the generator's return statement.`);
203
- parts.push(`${bodyInd}/// </summary>`);
204
- parts.push(`${bodyInd}public ${returnType} ${returnValuePropertyName} => _wasExternallyTerminated ? _returnValue : _getReturnValue();`);
205
- parts.push("");
206
- }
207
- // return() method - use @ prefix since 'return' is a C# keyword
208
- // Per JS spec: return(value) takes TReturn, not TYield
209
- // The returned IteratorResult still uses TYield for type consistency with next()
210
- const returnReturnType = func.isAsync
211
- ? `global::System.Threading.Tasks.Task<global::Tsonic.Runtime.IteratorResult<${resultType}>>`
212
- : `global::Tsonic.Runtime.IteratorResult<${resultType}>`;
213
- // Parameter type is TReturn (returnType), not TYield (resultType)
214
- // For void-return generators, use object? since return() can be called with no argument
215
- const returnParamType = returnType !== "void" ? returnType : "object?";
216
- parts.push(`${bodyInd}/// <summary>`);
217
- parts.push(`${bodyInd}/// Terminates the generator and sets the return value.`);
218
- parts.push(`${bodyInd}/// </summary>`);
219
- parts.push(`${bodyInd}/// <param name="value">The return value (TReturn type)</param>`);
220
- parts.push(`${bodyInd}/// <returns>IteratorResult with done=true and default TYield value</returns>`);
221
- parts.push(`${bodyInd}/// <remarks>`);
222
- parts.push(`${bodyInd}/// NOTE: The passed value does NOT appear in the returned IteratorResult.value.`);
223
- parts.push(`${bodyInd}/// C# cannot represent JavaScript's TYield | TReturn union type.`);
224
- parts.push(`${bodyInd}/// Access the return value via the 'returnValue' property after calling this method.`);
225
- parts.push(`${bodyInd}/// </remarks>`);
226
- parts.push(`${bodyInd}public ${asyncKeyword}${returnReturnType} ${returnMethodName}(${returnParamType} value = default!)`);
227
- parts.push(`${bodyInd}{`);
228
- parts.push(`${innerInd}_done = true;`);
229
- // If TReturn is not void, capture the return value for the returnValue property
230
- if (hasReturnType) {
231
- parts.push(`${innerInd}_returnValue = value;`);
232
- parts.push(`${innerInd}_wasExternallyTerminated = true;`);
233
- }
234
- if (func.isAsync) {
235
- parts.push(`${innerInd}await _enumerator.DisposeAsync();`);
236
- }
237
- else {
238
- parts.push(`${innerInd}_enumerator.Dispose();`);
239
- }
240
- // Return IteratorResult with default TYield (since we're returning TReturn via returnValue property)
241
- parts.push(`${innerInd}return new global::Tsonic.Runtime.IteratorResult<${resultType}>(default!, true);`);
242
- parts.push(`${bodyInd}}`);
243
- parts.push("");
244
- // throw() method - use @ prefix since 'throw' is a C# keyword
245
- // NOTE: Unlike JavaScript, this does NOT inject the exception at the suspended
246
- // yield point. C# iterators don't support resumption with exceptions.
247
- // This method terminates the generator and throws the exception externally.
248
- // This is a semantic limitation - JS generators can catch thrown exceptions
249
- // inside try/catch around yield, but our C# implementation cannot.
250
- const throwReturnType = func.isAsync
251
- ? `global::System.Threading.Tasks.Task<global::Tsonic.Runtime.IteratorResult<${resultType}>>`
252
- : `global::Tsonic.Runtime.IteratorResult<${resultType}>`;
253
- parts.push(`${bodyInd}/// <summary>`);
254
- parts.push(`${bodyInd}/// Terminates the generator and throws the provided exception.`);
255
- parts.push(`${bodyInd}/// NOTE: Unlike JavaScript, this does NOT inject the exception at the`);
256
- parts.push(`${bodyInd}/// suspended yield point. The exception is thrown externally after`);
257
- parts.push(`${bodyInd}/// disposing the enumerator. This is a limitation of C# iterators.`);
258
- parts.push(`${bodyInd}/// </summary>`);
259
- parts.push(`${bodyInd}public ${throwReturnType} ${throwMethodName}(object e)`);
260
- parts.push(`${bodyInd}{`);
261
- parts.push(`${innerInd}_done = true;`);
262
- if (func.isAsync) {
263
- parts.push(`${innerInd}_enumerator.DisposeAsync().AsTask().Wait();`);
381
+ const { yieldType, returnType, nextType, hasNextType, newContext: typeContext, } = extractGeneratorTypeArgs(func.returnType, currentContext);
382
+ currentContext = typeContext;
383
+ const enumeratorType = {
384
+ kind: "identifierType",
385
+ name: func.isAsync
386
+ ? "global::System.Collections.Generic.IAsyncEnumerator"
387
+ : "global::System.Collections.Generic.IEnumerator",
388
+ typeArguments: [{ kind: "identifierType", name: exchangeName }],
389
+ };
390
+ const members = [
391
+ {
392
+ kind: "fieldDeclaration",
393
+ attributes: [],
394
+ modifiers: ["private", "readonly"],
395
+ type: enumeratorType,
396
+ name: "_enumerator",
397
+ },
398
+ {
399
+ kind: "fieldDeclaration",
400
+ attributes: [],
401
+ modifiers: ["private", "readonly"],
402
+ type: { kind: "identifierType", name: exchangeName },
403
+ name: "_exchange",
404
+ },
405
+ ];
406
+ if (returnType) {
407
+ members.push({
408
+ kind: "fieldDeclaration",
409
+ attributes: [],
410
+ modifiers: ["private", "readonly"],
411
+ type: funcType(returnType),
412
+ name: "_getReturnValue",
413
+ }, {
414
+ kind: "fieldDeclaration",
415
+ attributes: [],
416
+ modifiers: ["private"],
417
+ type: returnType,
418
+ name: "_returnValue",
419
+ initializer: suppressDefault(),
420
+ }, {
421
+ kind: "fieldDeclaration",
422
+ attributes: [],
423
+ modifiers: ["private"],
424
+ type: boolTypeAst,
425
+ name: "_wasExternallyTerminated",
426
+ initializer: literal("false"),
427
+ });
264
428
  }
265
- else {
266
- parts.push(`${innerInd}_enumerator.Dispose();`);
429
+ members.push({
430
+ kind: "fieldDeclaration",
431
+ attributes: [],
432
+ modifiers: ["private"],
433
+ type: boolTypeAst,
434
+ name: "_done",
435
+ initializer: literal("false"),
436
+ });
437
+ members.push(buildConstructor(wrapperName, exchangeName, func.isAsync, returnType));
438
+ members.push(buildNextMethod(yieldType, nextType, hasNextType, func.isAsync, nextMethodName));
439
+ if (returnType) {
440
+ members.push(buildReturnValueProperty(returnType, returnValuePropertyName));
267
441
  }
268
- parts.push(`${innerInd}if (e is global::System.Exception ex) throw ex;`);
269
- parts.push(`${innerInd}throw new global::System.Exception(e?.ToString() ?? "Unknown error");`);
270
- parts.push(`${bodyInd}}`);
271
- parts.push(`${ind}}`);
272
- return [parts.join("\n"), currentContext];
442
+ members.push(buildReturnMethod(yieldType, returnType, func.isAsync, returnMethodName));
443
+ members.push(buildThrowMethod(yieldType, func.isAsync, throwMethodName));
444
+ const classAst = {
445
+ kind: "classDeclaration",
446
+ attributes: [],
447
+ modifiers: ["public", "sealed"],
448
+ name: wrapperName,
449
+ interfaces: [],
450
+ members,
451
+ };
452
+ return [classAst, currentContext];
273
453
  };
274
454
  /**
275
455
  * Check if a generator function needs bidirectional support
@@ -282,7 +462,6 @@ export const needsBidirectionalSupport = (func) => {
282
462
  const typeRef = func.returnType;
283
463
  if (typeRef.typeArguments && typeRef.typeArguments.length > 2) {
284
464
  const nextTypeArg = typeRef.typeArguments[2];
285
- // Check if TNext is not undefined
286
465
  if (nextTypeArg &&
287
466
  !(nextTypeArg.kind === "primitiveType" &&
288
467
  nextTypeArg.name === "undefined")) {
@@ -294,17 +473,14 @@ export const needsBidirectionalSupport = (func) => {
294
473
  };
295
474
  /**
296
475
  * Check if a generator function has a return type (TReturn is not void/undefined)
297
- * This determines whether we need to capture the return value via closure
298
476
  */
299
477
  export const hasGeneratorReturnType = (func) => {
300
478
  if (!func.isGenerator)
301
479
  return false;
302
480
  if (func.returnType?.kind === "referenceType") {
303
481
  const typeRef = func.returnType;
304
- // TReturn is the second type argument: Generator<Yield, Return, Next>
305
482
  if (typeRef.typeArguments && typeRef.typeArguments.length > 1) {
306
483
  const returnTypeArg = typeRef.typeArguments[1];
307
- // Check if TReturn is not void/undefined
308
484
  if (returnTypeArg &&
309
485
  returnTypeArg.kind !== "voidType" &&
310
486
  !(returnTypeArg.kind === "primitiveType" &&