redscript-mc 1.2.30 → 2.1.0

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 (593) hide show
  1. package/.claudeignore +21 -0
  2. package/.github/workflows/ci.yml +1 -0
  3. package/README.md +12 -16
  4. package/README.zh.md +2 -2
  5. package/demo.gif +0 -0
  6. package/dist/cli.js +2 -554
  7. package/dist/compile.js +2 -266
  8. package/dist/index.js +2 -159
  9. package/dist/src/__tests__/budget.test.js +261 -0
  10. package/dist/src/__tests__/cli.test.js +104 -0
  11. package/dist/{__tests__ → src/__tests__}/dce.test.js +11 -47
  12. package/dist/{__tests__ → src/__tests__}/diagnostics.test.js +67 -40
  13. package/dist/src/__tests__/e2e/basic.test.d.ts +8 -0
  14. package/dist/src/__tests__/e2e/basic.test.js +140 -0
  15. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  16. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  17. package/dist/src/__tests__/e2e/macros.test.d.ts +9 -0
  18. package/dist/src/__tests__/e2e/macros.test.js +182 -0
  19. package/dist/src/__tests__/e2e/migrate.test.d.ts +13 -0
  20. package/dist/src/__tests__/e2e/migrate.test.js +2739 -0
  21. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  22. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  23. package/dist/src/__tests__/enum.test.d.ts +10 -0
  24. package/dist/src/__tests__/enum.test.js +389 -0
  25. package/dist/src/__tests__/generics.test.d.ts +14 -0
  26. package/dist/src/__tests__/generics.test.js +367 -0
  27. package/dist/src/__tests__/hir/desugar.test.js +234 -0
  28. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  29. package/dist/src/__tests__/incremental.test.js +308 -0
  30. package/dist/src/__tests__/lir/lower.test.js +559 -0
  31. package/dist/src/__tests__/lir/types.test.js +185 -0
  32. package/dist/src/__tests__/lir/verify.test.js +221 -0
  33. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  34. package/dist/src/__tests__/lsp.test.js +245 -0
  35. package/dist/{__tests__ → src/__tests__}/mc-integration.test.js +1 -3
  36. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  37. package/dist/src/__tests__/mc-version.test.js +154 -0
  38. package/dist/src/__tests__/mir/arithmetic.test.js +130 -0
  39. package/dist/src/__tests__/mir/control-flow.test.js +205 -0
  40. package/dist/src/__tests__/mir/verify.test.js +223 -0
  41. package/dist/src/__tests__/modules.test.d.ts +7 -0
  42. package/dist/src/__tests__/modules.test.js +333 -0
  43. package/dist/src/__tests__/optimizer/block_merge.test.js +78 -0
  44. package/dist/src/__tests__/optimizer/branch_simplify.test.js +58 -0
  45. package/dist/src/__tests__/optimizer/constant_fold.test.js +131 -0
  46. package/dist/src/__tests__/optimizer/copy_prop.test.js +91 -0
  47. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  48. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  49. package/dist/src/__tests__/optimizer/dce.test.d.ts +1 -0
  50. package/dist/src/__tests__/optimizer/dce.test.js +76 -0
  51. package/dist/src/__tests__/optimizer/interprocedural.test.d.ts +1 -0
  52. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  53. package/dist/src/__tests__/optimizer/lir/const_imm.test.d.ts +1 -0
  54. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  55. package/dist/src/__tests__/optimizer/lir/dead_slot.test.d.ts +1 -0
  56. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  57. package/dist/src/__tests__/optimizer/lir/peephole.test.d.ts +1 -0
  58. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  59. package/dist/src/__tests__/optimizer/lir/pipeline.test.d.ts +1 -0
  60. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  61. package/dist/src/__tests__/optimizer/nbt-batch.test.d.ts +1 -0
  62. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  63. package/dist/src/__tests__/optimizer/pipeline.test.d.ts +1 -0
  64. package/dist/src/__tests__/optimizer/pipeline.test.js +102 -0
  65. package/dist/src/__tests__/optimizer/selector-cache.test.d.ts +1 -0
  66. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  67. package/dist/src/__tests__/optimizer/unroll.test.d.ts +1 -0
  68. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  69. package/dist/src/__tests__/option.test.d.ts +14 -0
  70. package/dist/src/__tests__/option.test.js +275 -0
  71. package/dist/src/__tests__/parser.test.d.ts +1 -0
  72. package/dist/src/__tests__/repl.test.d.ts +1 -0
  73. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  74. package/dist/src/__tests__/schedule.test.js +98 -0
  75. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  76. package/dist/src/__tests__/sourcemap.test.js +227 -0
  77. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  78. package/dist/src/__tests__/tuple.test.js +202 -0
  79. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  80. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  81. package/dist/src/__tests__/typechecker.test.d.ts +1 -0
  82. package/dist/{ast → src/ast}/types.d.ts +58 -3
  83. package/dist/src/cache/deps.d.ts +41 -0
  84. package/dist/src/cache/deps.js +158 -0
  85. package/dist/src/cache/incremental.d.ts +35 -0
  86. package/dist/src/cache/incremental.js +165 -0
  87. package/dist/src/cache/index.d.ts +37 -0
  88. package/dist/src/cache/index.js +152 -0
  89. package/dist/{cli.d.ts → src/cli.d.ts} +1 -1
  90. package/dist/src/cli.js +474 -0
  91. package/dist/src/compile.d.ts +37 -0
  92. package/dist/src/compile.js +165 -0
  93. package/dist/{diagnostics → src/diagnostics}/index.d.ts +1 -1
  94. package/dist/{diagnostics → src/diagnostics}/index.js +8 -11
  95. package/dist/src/emit/compile.d.ts +29 -0
  96. package/dist/src/emit/compile.js +143 -0
  97. package/dist/src/emit/index.d.ts +26 -0
  98. package/dist/src/emit/index.js +223 -0
  99. package/dist/src/emit/modules.d.ts +29 -0
  100. package/dist/src/emit/modules.js +492 -0
  101. package/dist/src/emit/sourcemap.d.ts +53 -0
  102. package/dist/src/emit/sourcemap.js +73 -0
  103. package/dist/src/hir/lower.d.ts +15 -0
  104. package/dist/src/hir/lower.js +399 -0
  105. package/dist/src/hir/monomorphize.d.ts +22 -0
  106. package/dist/src/hir/monomorphize.js +379 -0
  107. package/dist/src/hir/types.d.ts +406 -0
  108. package/dist/src/hir/types.js +16 -0
  109. package/dist/src/index.d.ts +39 -0
  110. package/dist/src/index.js +67 -0
  111. package/dist/{lexer → src/lexer}/index.d.ts +1 -1
  112. package/dist/{lexer → src/lexer}/index.js +1 -0
  113. package/dist/src/lir/budget.d.ts +37 -0
  114. package/dist/src/lir/budget.js +280 -0
  115. package/dist/src/lir/lower.d.ts +15 -0
  116. package/dist/src/lir/lower.js +472 -0
  117. package/dist/src/lir/types.d.ts +139 -0
  118. package/dist/src/lir/types.js +11 -0
  119. package/dist/src/lir/verify.d.ts +14 -0
  120. package/dist/src/lir/verify.js +113 -0
  121. package/dist/src/lsp/main.d.ts +8 -0
  122. package/dist/src/lsp/main.js +11 -0
  123. package/dist/src/lsp/server.d.ts +11 -0
  124. package/dist/src/lsp/server.js +352 -0
  125. package/dist/{mc-test → src/mc-test}/runner.js +4 -3
  126. package/dist/src/mir/lower.d.ts +9 -0
  127. package/dist/src/mir/lower.js +1264 -0
  128. package/dist/src/mir/macro.d.ts +22 -0
  129. package/dist/src/mir/macro.js +168 -0
  130. package/dist/src/mir/types.d.ts +191 -0
  131. package/dist/src/mir/types.js +11 -0
  132. package/dist/src/mir/verify.d.ts +16 -0
  133. package/dist/src/mir/verify.js +216 -0
  134. package/dist/src/optimizer/block_merge.d.ts +12 -0
  135. package/dist/src/optimizer/block_merge.js +84 -0
  136. package/dist/src/optimizer/branch_simplify.d.ts +9 -0
  137. package/dist/src/optimizer/branch_simplify.js +28 -0
  138. package/dist/src/optimizer/constant_fold.d.ts +10 -0
  139. package/dist/src/optimizer/constant_fold.js +85 -0
  140. package/dist/src/optimizer/copy_prop.d.ts +9 -0
  141. package/dist/src/optimizer/copy_prop.js +113 -0
  142. package/dist/src/optimizer/coroutine.d.ts +34 -0
  143. package/dist/src/optimizer/coroutine.js +789 -0
  144. package/dist/src/optimizer/dce.d.ts +8 -0
  145. package/dist/src/optimizer/dce.js +156 -0
  146. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  147. package/dist/src/optimizer/interprocedural.js +186 -0
  148. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  149. package/dist/src/optimizer/lir/const_imm.js +139 -0
  150. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  151. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  152. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  153. package/dist/src/optimizer/lir/peephole.js +52 -0
  154. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  155. package/dist/src/optimizer/lir/pipeline.js +34 -0
  156. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  157. package/dist/src/optimizer/nbt-batch.js +51 -0
  158. package/dist/src/optimizer/pipeline.d.ts +14 -0
  159. package/dist/src/optimizer/pipeline.js +58 -0
  160. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  161. package/dist/src/optimizer/selector-cache.js +100 -0
  162. package/dist/src/optimizer/unroll.d.ts +32 -0
  163. package/dist/src/optimizer/unroll.js +348 -0
  164. package/dist/{parser → src/parser}/index.d.ts +8 -0
  165. package/dist/{parser → src/parser}/index.js +204 -14
  166. package/dist/{repl.d.ts → src/repl.d.ts} +1 -1
  167. package/dist/{runtime → src/runtime}/index.js +1 -1
  168. package/dist/{typechecker → src/typechecker}/index.d.ts +4 -0
  169. package/dist/{typechecker → src/typechecker}/index.js +198 -13
  170. package/dist/src/types/mc-version.d.ts +24 -0
  171. package/dist/src/types/mc-version.js +49 -0
  172. package/docs/ROADMAP.md +395 -0
  173. package/docs/compiler-pipeline-redesign.md +2260 -0
  174. package/docs/optimization-ideas.md +1076 -0
  175. package/editors/vscode/out/extension.js +25176 -8000
  176. package/editors/vscode/package-lock.json +90 -6
  177. package/editors/vscode/package.json +3 -2
  178. package/editors/vscode/src/extension.ts +97 -67
  179. package/examples/showcase.mcrs +3 -3
  180. package/package.json +13 -6
  181. package/scripts/postbuild.js +15 -0
  182. package/src/__tests__/budget.test.ts +297 -0
  183. package/src/__tests__/cli.test.ts +8 -220
  184. package/src/__tests__/dce.test.ts +11 -56
  185. package/src/__tests__/diagnostics.test.ts +61 -41
  186. package/src/__tests__/e2e/basic.test.ts +154 -0
  187. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  188. package/src/__tests__/e2e/macros.test.ts +199 -0
  189. package/src/__tests__/e2e/migrate.test.ts +3008 -0
  190. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  191. package/src/__tests__/enum.test.ts +425 -0
  192. package/src/__tests__/generics.test.ts +390 -0
  193. package/src/__tests__/hir/desugar.test.ts +263 -0
  194. package/src/__tests__/incremental.test.ts +337 -0
  195. package/src/__tests__/lir/lower.test.ts +619 -0
  196. package/src/__tests__/lir/types.test.ts +207 -0
  197. package/src/__tests__/lir/verify.test.ts +249 -0
  198. package/src/__tests__/lsp.test.ts +270 -0
  199. package/src/__tests__/mc-integration.test.ts +1 -2
  200. package/src/__tests__/mc-version.test.ts +178 -0
  201. package/src/__tests__/mir/arithmetic.test.ts +156 -0
  202. package/src/__tests__/mir/control-flow.test.ts +242 -0
  203. package/src/__tests__/mir/verify.test.ts +254 -0
  204. package/src/__tests__/modules.test.ts +365 -0
  205. package/src/__tests__/optimizer/block_merge.test.ts +84 -0
  206. package/src/__tests__/optimizer/branch_simplify.test.ts +64 -0
  207. package/src/__tests__/optimizer/constant_fold.test.ts +145 -0
  208. package/src/__tests__/optimizer/copy_prop.test.ts +99 -0
  209. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  210. package/src/__tests__/optimizer/dce.test.ts +83 -0
  211. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  212. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  213. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  214. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  215. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  216. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  217. package/src/__tests__/optimizer/pipeline.test.ts +116 -0
  218. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  219. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  220. package/src/__tests__/option.test.ts +299 -0
  221. package/src/__tests__/schedule.test.ts +105 -0
  222. package/src/__tests__/sourcemap.test.ts +254 -0
  223. package/src/__tests__/tuple.test.ts +220 -0
  224. package/src/__tests__/typechecker-strict.test.ts +216 -0
  225. package/src/ast/types.ts +39 -3
  226. package/src/cache/deps.ts +132 -0
  227. package/src/cache/incremental.ts +173 -0
  228. package/src/cache/index.ts +135 -0
  229. package/src/cli.ts +111 -195
  230. package/src/compile.ts +6 -162
  231. package/src/diagnostics/index.ts +8 -11
  232. package/src/emit/compile.ts +177 -0
  233. package/src/emit/index.ts +286 -0
  234. package/src/emit/modules.ts +581 -0
  235. package/src/emit/sourcemap.ts +101 -0
  236. package/src/hir/lower.ts +455 -0
  237. package/src/hir/monomorphize.ts +416 -0
  238. package/src/hir/types.ts +228 -0
  239. package/src/index.ts +37 -182
  240. package/src/lexer/index.ts +2 -1
  241. package/src/lir/budget.ts +321 -0
  242. package/src/lir/lower.ts +587 -0
  243. package/src/lir/types.ts +113 -0
  244. package/src/lir/verify.ts +129 -0
  245. package/src/lsp/main.ts +9 -0
  246. package/src/lsp/server.ts +414 -0
  247. package/src/mc-test/runner.ts +4 -3
  248. package/src/mir/lower.ts +1403 -0
  249. package/src/mir/macro.ts +167 -0
  250. package/src/mir/types.ts +117 -0
  251. package/src/mir/verify.ts +218 -0
  252. package/src/optimizer/block_merge.ts +93 -0
  253. package/src/optimizer/branch_simplify.ts +27 -0
  254. package/src/optimizer/constant_fold.ts +88 -0
  255. package/src/optimizer/copy_prop.ts +106 -0
  256. package/src/optimizer/coroutine.ts +996 -0
  257. package/src/optimizer/dce.ts +108 -653
  258. package/src/optimizer/interprocedural.ts +177 -0
  259. package/src/optimizer/lir/const_imm.ts +143 -0
  260. package/src/optimizer/lir/dead_slot.ts +123 -0
  261. package/src/optimizer/lir/peephole.ts +57 -0
  262. package/src/optimizer/lir/pipeline.ts +37 -0
  263. package/src/optimizer/nbt-batch.ts +50 -0
  264. package/src/optimizer/pipeline.ts +59 -0
  265. package/src/optimizer/selector-cache.ts +103 -0
  266. package/src/optimizer/unroll.ts +386 -0
  267. package/src/parser/index.ts +213 -16
  268. package/src/repl.ts +1 -1
  269. package/src/runtime/index.ts +1 -1
  270. package/src/stdlib/math.mcrs +4 -4
  271. package/src/templates/quest.mcrs +4 -4
  272. package/src/typechecker/index.ts +215 -15
  273. package/src/types/mc-version.ts +46 -0
  274. package/tsconfig.json +1 -1
  275. package/dist/__tests__/cli.test.js +0 -278
  276. package/dist/__tests__/codegen.test.js +0 -152
  277. package/dist/__tests__/e2e.test.d.ts +0 -6
  278. package/dist/__tests__/e2e.test.js +0 -1847
  279. package/dist/__tests__/entity-types.test.js +0 -203
  280. package/dist/__tests__/lowering.test.js +0 -1015
  281. package/dist/__tests__/macro.test.d.ts +0 -8
  282. package/dist/__tests__/macro.test.js +0 -305
  283. package/dist/__tests__/nbt.test.js +0 -82
  284. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  285. package/dist/__tests__/optimizer.test.js +0 -149
  286. package/dist/__tests__/runtime.test.js +0 -289
  287. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  288. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  289. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  290. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  291. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  292. package/dist/__tests__/stdlib-math.test.js +0 -352
  293. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  294. package/dist/__tests__/stdlib-vec.test.js +0 -264
  295. package/dist/__tests__/structure-optimizer.test.js +0 -33
  296. package/dist/__tests__/var-allocator.test.js +0 -69
  297. package/dist/codegen/cmdblock/index.d.ts +0 -26
  298. package/dist/codegen/cmdblock/index.js +0 -45
  299. package/dist/codegen/mcfunction/index.d.ts +0 -40
  300. package/dist/codegen/mcfunction/index.js +0 -606
  301. package/dist/codegen/structure/index.d.ts +0 -24
  302. package/dist/codegen/structure/index.js +0 -279
  303. package/dist/codegen/var-allocator.d.ts +0 -45
  304. package/dist/codegen/var-allocator.js +0 -104
  305. package/dist/compile.d.ts +0 -68
  306. package/dist/data/arena/function/__load.mcfunction +0 -6
  307. package/dist/data/arena/function/__tick.mcfunction +0 -2
  308. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  309. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  310. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  311. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  312. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  313. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  314. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  315. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  316. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  317. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  318. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  319. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  320. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  321. package/dist/data/counter/function/__load.mcfunction +0 -5
  322. package/dist/data/counter/function/__tick.mcfunction +0 -2
  323. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  324. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  325. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  326. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  327. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  328. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  329. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  330. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  331. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  332. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  333. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  334. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  335. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  336. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  337. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  338. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  339. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  340. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  341. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  342. package/dist/data/gcd3/function/test.mcfunction +0 -7
  343. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  344. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  345. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  346. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  347. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  348. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  349. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  350. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  351. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  352. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  353. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  354. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  355. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  356. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  357. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  358. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  359. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  360. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  361. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  362. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  363. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  364. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  365. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  366. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  367. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  368. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  369. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  370. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  371. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  372. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  373. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  374. package/dist/data/mathtest/function/test.mcfunction +0 -5
  375. package/dist/data/minecraft/tags/function/load.json +0 -5
  376. package/dist/data/minecraft/tags/function/tick.json +0 -5
  377. package/dist/data/mypack/function/__load.mcfunction +0 -13
  378. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  379. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  380. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  381. package/dist/data/mypack/function/abs.mcfunction +0 -6
  382. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  383. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  384. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  385. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  386. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  387. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  388. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  389. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  390. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  391. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  392. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  393. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  394. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  395. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  396. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  397. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  398. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  399. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  400. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  401. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  402. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  403. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  404. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  405. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  406. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  407. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  408. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  409. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  410. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  411. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  412. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  413. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  414. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  415. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  416. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  417. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  418. package/dist/data/quiz/function/__load.mcfunction +0 -16
  419. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  420. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  421. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  422. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  423. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  424. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  425. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  426. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  427. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  428. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  429. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  430. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  431. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  432. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  433. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  434. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  435. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  436. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  437. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  438. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  439. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  440. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  441. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  442. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  443. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  444. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  445. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  446. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  447. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  448. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  449. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  450. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  451. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  452. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  453. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  454. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  455. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  456. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  457. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  458. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  459. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  460. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  461. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  462. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  463. package/dist/data/runtime/function/__load.mcfunction +0 -5
  464. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  465. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  466. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  467. package/dist/data/shop/function/__load.mcfunction +0 -7
  468. package/dist/data/shop/function/__tick.mcfunction +0 -3
  469. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  470. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  471. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  472. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  473. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  474. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  475. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  476. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  477. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  478. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  479. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  480. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  481. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  482. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  483. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  484. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  485. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  486. package/dist/data/turret/function/__load.mcfunction +0 -5
  487. package/dist/data/turret/function/__tick.mcfunction +0 -4
  488. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  489. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  490. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  491. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  492. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  493. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  494. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  495. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  496. package/dist/gcd2.map.json +0 -15
  497. package/dist/gcd3.map.json +0 -17
  498. package/dist/gcd_test.map.json +0 -15
  499. package/dist/index.d.ts +0 -62
  500. package/dist/ir/builder.d.ts +0 -33
  501. package/dist/ir/builder.js +0 -99
  502. package/dist/ir/types.d.ts +0 -132
  503. package/dist/ir/types.js +0 -15
  504. package/dist/isqrttest.map.json +0 -15
  505. package/dist/lowering/index.d.ts +0 -188
  506. package/dist/lowering/index.js +0 -3403
  507. package/dist/mathtest.map.json +0 -6
  508. package/dist/mypack.map.json +0 -27
  509. package/dist/optimizer/commands.d.ts +0 -38
  510. package/dist/optimizer/commands.js +0 -451
  511. package/dist/optimizer/dce.d.ts +0 -34
  512. package/dist/optimizer/dce.js +0 -639
  513. package/dist/optimizer/passes.d.ts +0 -34
  514. package/dist/optimizer/passes.js +0 -243
  515. package/dist/optimizer/structure.d.ts +0 -9
  516. package/dist/optimizer/structure.js +0 -356
  517. package/dist/pack.mcmeta +0 -6
  518. package/dist/reqtest.map.json +0 -4
  519. package/dist/reqtest2.map.json +0 -4
  520. package/dist/runtime.map.json +0 -7
  521. package/dist/swap_test.map.json +0 -14
  522. package/src/__tests__/codegen.test.ts +0 -161
  523. package/src/__tests__/e2e.test.ts +0 -2039
  524. package/src/__tests__/entity-types.test.ts +0 -236
  525. package/src/__tests__/lowering.test.ts +0 -1185
  526. package/src/__tests__/macro.test.ts +0 -343
  527. package/src/__tests__/nbt.test.ts +0 -58
  528. package/src/__tests__/optimizer-advanced.test.ts +0 -144
  529. package/src/__tests__/optimizer.test.ts +0 -162
  530. package/src/__tests__/runtime.test.ts +0 -305
  531. package/src/__tests__/stdlib-advanced.test.ts +0 -379
  532. package/src/__tests__/stdlib-bigint.test.ts +0 -427
  533. package/src/__tests__/stdlib-math.test.ts +0 -374
  534. package/src/__tests__/stdlib-vec.test.ts +0 -259
  535. package/src/__tests__/structure-optimizer.test.ts +0 -38
  536. package/src/__tests__/var-allocator.test.ts +0 -75
  537. package/src/codegen/cmdblock/index.ts +0 -63
  538. package/src/codegen/mcfunction/index.ts +0 -662
  539. package/src/codegen/structure/index.ts +0 -346
  540. package/src/codegen/var-allocator.ts +0 -104
  541. package/src/ir/builder.ts +0 -116
  542. package/src/ir/types.ts +0 -134
  543. package/src/lowering/index.ts +0 -3876
  544. package/src/optimizer/commands.ts +0 -534
  545. package/src/optimizer/passes.ts +0 -250
  546. package/src/optimizer/structure.ts +0 -450
  547. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  548. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/cli.test.d.ts} +0 -0
  549. /package/dist/{__tests__ → src/__tests__}/compile-all.test.d.ts +0 -0
  550. /package/dist/{__tests__ → src/__tests__}/compile-all.test.js +0 -0
  551. /package/dist/{__tests__ → src/__tests__}/dce.test.d.ts +0 -0
  552. /package/dist/{__tests__ → src/__tests__}/diagnostics.test.d.ts +0 -0
  553. /package/dist/{__tests__ → src/__tests__}/formatter.test.d.ts +0 -0
  554. /package/dist/{__tests__ → src/__tests__}/formatter.test.js +0 -0
  555. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/hir/desugar.test.d.ts} +0 -0
  556. /package/dist/{__tests__ → src/__tests__}/lexer.test.d.ts +0 -0
  557. /package/dist/{__tests__ → src/__tests__}/lexer.test.js +0 -0
  558. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/lir/lower.test.d.ts} +0 -0
  559. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/lir/types.test.d.ts} +0 -0
  560. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/lir/verify.test.d.ts} +0 -0
  561. /package/dist/{__tests__ → src/__tests__}/mc-integration.test.d.ts +0 -0
  562. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/mc-syntax.test.d.ts} +0 -0
  563. /package/dist/{__tests__ → src/__tests__}/mc-syntax.test.js +0 -0
  564. /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/mir/arithmetic.test.d.ts} +0 -0
  565. /package/dist/{__tests__/parser.test.d.ts → src/__tests__/mir/control-flow.test.d.ts} +0 -0
  566. /package/dist/{__tests__/repl.test.d.ts → src/__tests__/mir/verify.test.d.ts} +0 -0
  567. /package/dist/{__tests__/runtime.test.d.ts → src/__tests__/optimizer/block_merge.test.d.ts} +0 -0
  568. /package/dist/{__tests__/structure-optimizer.test.d.ts → src/__tests__/optimizer/branch_simplify.test.d.ts} +0 -0
  569. /package/dist/{__tests__/typechecker.test.d.ts → src/__tests__/optimizer/constant_fold.test.d.ts} +0 -0
  570. /package/dist/{__tests__/var-allocator.test.d.ts → src/__tests__/optimizer/copy_prop.test.d.ts} +0 -0
  571. /package/dist/{__tests__ → src/__tests__}/parser.test.js +0 -0
  572. /package/dist/{__tests__ → src/__tests__}/repl.test.js +0 -0
  573. /package/dist/{__tests__ → src/__tests__}/typechecker.test.js +0 -0
  574. /package/dist/{ast → src/ast}/types.js +0 -0
  575. /package/dist/{builtins → src/builtins}/metadata.d.ts +0 -0
  576. /package/dist/{builtins → src/builtins}/metadata.js +0 -0
  577. /package/dist/{events → src/events}/types.d.ts +0 -0
  578. /package/dist/{events → src/events}/types.js +0 -0
  579. /package/dist/{formatter → src/formatter}/index.d.ts +0 -0
  580. /package/dist/{formatter → src/formatter}/index.js +0 -0
  581. /package/dist/{mc-test → src/mc-test}/client.d.ts +0 -0
  582. /package/dist/{mc-test → src/mc-test}/client.js +0 -0
  583. /package/dist/{mc-test → src/mc-test}/runner.d.ts +0 -0
  584. /package/dist/{mc-test → src/mc-test}/setup.d.ts +0 -0
  585. /package/dist/{mc-test → src/mc-test}/setup.js +0 -0
  586. /package/dist/{mc-validator → src/mc-validator}/index.d.ts +0 -0
  587. /package/dist/{mc-validator → src/mc-validator}/index.js +0 -0
  588. /package/dist/{nbt → src/nbt}/index.d.ts +0 -0
  589. /package/dist/{nbt → src/nbt}/index.js +0 -0
  590. /package/dist/{repl.js → src/repl.js} +0 -0
  591. /package/dist/{runtime → src/runtime}/index.d.ts +0 -0
  592. /package/dist/{types → src/types}/entity-hierarchy.d.ts +0 -0
  593. /package/dist/{types → src/types}/entity-hierarchy.js +0 -0
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for Phase 6a: Option<T> — null safety
4
+ *
5
+ * Covers:
6
+ * - Parsing Option<T> type annotation
7
+ * - Parsing Some(expr) and None expressions
8
+ * - Parsing if let Some(x) = opt { ... }
9
+ * - HIR lowering of Option nodes
10
+ * - MIR lowering: Option compiles to two slots (has + val)
11
+ * - if let Some(x) = opt → checks has slot, binds val slot
12
+ * - Function returning Option<int>
13
+ * - Correct scoreboard commands generated
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ const lexer_1 = require("../lexer");
17
+ const parser_1 = require("../parser");
18
+ const compile_1 = require("../emit/compile");
19
+ const lower_1 = require("../hir/lower");
20
+ function parse(source, namespace = 'test') {
21
+ const tokens = new lexer_1.Lexer(source).tokenize();
22
+ return new parser_1.Parser(tokens).parse(namespace);
23
+ }
24
+ function getFile(files, pathSubstr) {
25
+ // Prefer exact function file match: look for function/<name>.mcfunction
26
+ const exact = files.find(f => f.path.endsWith(`function/${pathSubstr}.mcfunction`));
27
+ if (exact)
28
+ return exact.content;
29
+ const f = files.find(f => f.path.includes(pathSubstr));
30
+ return f?.content;
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // Parser tests
34
+ // ---------------------------------------------------------------------------
35
+ describe('Option: Parser', () => {
36
+ it('parses Option<int> type annotation', () => {
37
+ const prog = parse('fn f(): Option<int> {}');
38
+ expect(prog.declarations[0].returnType).toEqual({ kind: 'option', inner: { kind: 'named', name: 'int' } });
39
+ });
40
+ it('parses Option<bool> parameter type', () => {
41
+ const prog = parse('fn f(x: Option<bool>): void {}');
42
+ expect(prog.declarations[0].params[0].type).toEqual({ kind: 'option', inner: { kind: 'named', name: 'bool' } });
43
+ });
44
+ it('parses Some(42) expression', () => {
45
+ const prog = parse('fn f(): void { let x: Option<int> = Some(42); }');
46
+ const letStmt = prog.declarations[0].body[0];
47
+ expect(letStmt.kind).toBe('let');
48
+ if (letStmt.kind === 'let') {
49
+ expect(letStmt.init.kind).toBe('some_lit');
50
+ if (letStmt.init.kind === 'some_lit') {
51
+ expect(letStmt.init.value).toEqual({ kind: 'int_lit', value: 42 });
52
+ }
53
+ }
54
+ });
55
+ it('parses None expression', () => {
56
+ const prog = parse('fn f(): void { let x: Option<int> = None; }');
57
+ const letStmt = prog.declarations[0].body[0];
58
+ expect(letStmt.kind).toBe('let');
59
+ if (letStmt.kind === 'let') {
60
+ expect(letStmt.init.kind).toBe('none_lit');
61
+ }
62
+ });
63
+ it('parses if let Some(x) = opt { ... }', () => {
64
+ const prog = parse('fn f(p: Option<int>): void { if let Some(x) = p { let y: int = x; } }');
65
+ const stmt = prog.declarations[0].body[0];
66
+ expect(stmt.kind).toBe('if_let_some');
67
+ if (stmt.kind === 'if_let_some') {
68
+ expect(stmt.binding).toBe('x');
69
+ expect(stmt.init).toEqual({ kind: 'ident', name: 'p' });
70
+ expect(stmt.then.length).toBe(1);
71
+ }
72
+ });
73
+ it('parses if let Some(x) = opt { } else { }', () => {
74
+ const prog = parse(`
75
+ fn f(p: Option<int>): void {
76
+ if let Some(x) = p {
77
+ let a: int = x;
78
+ } else {
79
+ let b: int = 0;
80
+ }
81
+ }
82
+ `);
83
+ const stmt = prog.declarations[0].body[0];
84
+ expect(stmt.kind).toBe('if_let_some');
85
+ if (stmt.kind === 'if_let_some') {
86
+ expect(stmt.else_).toBeDefined();
87
+ expect(stmt.else_.length).toBe(1);
88
+ }
89
+ });
90
+ it('does not treat Some as identifier', () => {
91
+ const prog = parse('fn f(): void { let x: Option<int> = Some(1); }');
92
+ if (prog.declarations[0].body[0].kind === 'let') {
93
+ const init = prog.declarations[0].body[0].init;
94
+ expect(init.kind).toBe('some_lit');
95
+ }
96
+ });
97
+ it('does not treat None as identifier', () => {
98
+ const prog = parse('fn f(): void { let x: Option<int> = None; }');
99
+ if (prog.declarations[0].body[0].kind === 'let') {
100
+ const init = prog.declarations[0].body[0].init;
101
+ expect(init.kind).toBe('none_lit');
102
+ }
103
+ });
104
+ });
105
+ // ---------------------------------------------------------------------------
106
+ // HIR lowering tests
107
+ // ---------------------------------------------------------------------------
108
+ describe('Option: HIR lowering', () => {
109
+ function hirOf(source) {
110
+ const tokens = new lexer_1.Lexer(source).tokenize();
111
+ const ast = new parser_1.Parser(tokens).parse('test');
112
+ return (0, lower_1.lowerToHIR)(ast);
113
+ }
114
+ it('lowers some_lit through HIR unchanged', () => {
115
+ const hir = hirOf('fn f(): void { let x: Option<int> = Some(42); }');
116
+ const fn0 = hir.functions[0];
117
+ const letStmt = fn0.body[0];
118
+ expect(letStmt.kind).toBe('let');
119
+ if (letStmt.kind === 'let') {
120
+ expect(letStmt.init.kind).toBe('some_lit');
121
+ }
122
+ });
123
+ it('lowers none_lit through HIR unchanged', () => {
124
+ const hir = hirOf('fn f(): void { let x: Option<int> = None; }');
125
+ const fn0 = hir.functions[0];
126
+ const letStmt = fn0.body[0];
127
+ expect(letStmt.kind).toBe('let');
128
+ if (letStmt.kind === 'let') {
129
+ expect(letStmt.init.kind).toBe('none_lit');
130
+ }
131
+ });
132
+ it('lowers if_let_some through HIR unchanged', () => {
133
+ const hir = hirOf('fn f(p: Option<int>): void { if let Some(x) = p {} }');
134
+ const fn0 = hir.functions[0];
135
+ const stmt = fn0.body[0];
136
+ expect(stmt.kind).toBe('if_let_some');
137
+ if (stmt.kind === 'if_let_some') {
138
+ expect(stmt.binding).toBe('x');
139
+ }
140
+ });
141
+ });
142
+ // ---------------------------------------------------------------------------
143
+ // Compilation (E2E) tests
144
+ // ---------------------------------------------------------------------------
145
+ describe('Option: E2E compilation', () => {
146
+ it('compiles Some(42) assignment — sets has=1, val=42', () => {
147
+ const source = `
148
+ fn test(): void {
149
+ let p: Option<int> = Some(42);
150
+ }
151
+ `;
152
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
153
+ const fn = getFile(result.files, 'test');
154
+ expect(fn).toBeDefined();
155
+ expect(fn).toContain('scoreboard players set');
156
+ // has slot should be set to 1, val slot should be set to 42
157
+ expect(fn).toContain('1');
158
+ expect(fn).toContain('42');
159
+ });
160
+ it('compiles None assignment — sets has=0', () => {
161
+ const source = `
162
+ fn test(): void {
163
+ let p: Option<int> = None;
164
+ }
165
+ `;
166
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
167
+ const fn = getFile(result.files, 'test');
168
+ expect(fn).toBeDefined();
169
+ expect(fn).toContain('scoreboard players set');
170
+ expect(fn).toContain('0');
171
+ });
172
+ it('compiles if let Some(x) = p — conditional on has slot', () => {
173
+ const source = `
174
+ fn test(p: Option<int>): void {
175
+ if let Some(x) = p {
176
+ let y: int = x;
177
+ }
178
+ }
179
+ `;
180
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
181
+ // Should generate a conditional call checking has slot
182
+ expect(result.files.length).toBeGreaterThan(0);
183
+ });
184
+ it('compiles function returning Option<int> Some value', () => {
185
+ const source = `
186
+ fn make_some(): Option<int> {
187
+ return Some(99);
188
+ }
189
+ fn test(): void {
190
+ let p: Option<int> = make_some();
191
+ }
192
+ `;
193
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
194
+ const fn = getFile(result.files, 'make_some');
195
+ expect(fn).toBeDefined();
196
+ // Should set ret_has=1 and ret_val=99
197
+ expect(fn).toContain('$ret_has');
198
+ expect(fn).toContain('99');
199
+ });
200
+ it('compiles function returning Option<int> None value', () => {
201
+ const source = `
202
+ fn make_none(): Option<int> {
203
+ return None;
204
+ }
205
+ `;
206
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
207
+ const fn = getFile(result.files, 'make_none');
208
+ expect(fn).toBeDefined();
209
+ expect(fn).toContain('$ret_has');
210
+ // has=0
211
+ expect(fn).toContain('0');
212
+ });
213
+ it('compiles full if-let Some pattern with body using bound variable', () => {
214
+ // Use a function that returns Option<int> so the condition is not constant-folded
215
+ const source = `
216
+ fn maybe_val(): Option<int> {
217
+ return Some(10);
218
+ }
219
+ @tick
220
+ fn tick(): void {
221
+ let p: Option<int> = maybe_val();
222
+ if let Some(n) = p {
223
+ let doubled: int = n + n;
224
+ }
225
+ }
226
+ `;
227
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
228
+ expect(result.files.length).toBeGreaterThan(0);
229
+ // Verify a conditional function split was created
230
+ const hasConditional = result.files.some(f => f.content.includes('execute if score'));
231
+ expect(hasConditional).toBe(true);
232
+ });
233
+ it('compiles if-let with else branch', () => {
234
+ const source = `
235
+ @tick
236
+ fn tick(): void {
237
+ let q: Option<int> = None;
238
+ if let Some(v) = q {
239
+ let a: int = v;
240
+ } else {
241
+ let b: int = 0;
242
+ }
243
+ }
244
+ `;
245
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
246
+ expect(result.files.length).toBeGreaterThan(0);
247
+ });
248
+ it('compiles nested if-let inside if-let', () => {
249
+ const source = `
250
+ fn test(): void {
251
+ let a: Option<int> = Some(1);
252
+ let b: Option<int> = Some(2);
253
+ if let Some(x) = a {
254
+ if let Some(y) = b {
255
+ let sum: int = x + y;
256
+ }
257
+ }
258
+ }
259
+ `;
260
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
261
+ expect(result.files.length).toBeGreaterThan(0);
262
+ });
263
+ it('generated scoreboard slots are unique per function and variable', () => {
264
+ const source = `
265
+ fn test(): void {
266
+ let p: Option<int> = Some(5);
267
+ let q: Option<int> = None;
268
+ }
269
+ `;
270
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
271
+ const fn = getFile(result.files, 'test');
272
+ expect(fn).toBeDefined();
273
+ });
274
+ });
275
+ //# sourceMappingURL=option.test.js.map
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tests for @schedule decorator (Phase 5c)
3
+ *
4
+ * @schedule(ticks=N) generates a _schedule_xxx.mcfunction wrapper that
5
+ * emits `schedule function ns:xxx Nt`.
6
+ */
7
+ export {};
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for @schedule decorator (Phase 5c)
4
+ *
5
+ * @schedule(ticks=N) generates a _schedule_xxx.mcfunction wrapper that
6
+ * emits `schedule function ns:xxx Nt`.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const compile_1 = require("../emit/compile");
10
+ function getFile(files, pathSubstr) {
11
+ const f = files.find(f => f.path.includes(pathSubstr));
12
+ return f?.content;
13
+ }
14
+ describe('@schedule decorator', () => {
15
+ test('@schedule(ticks=20) generates _schedule wrapper with 20t', () => {
16
+ const source = `
17
+ @schedule(ticks=20)
18
+ fn after_one_second(): void {
19
+ say("One second passed!");
20
+ }
21
+ `;
22
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
23
+ const wrapper = getFile(result.files, '_schedule_after_one_second.mcfunction');
24
+ expect(wrapper).toBeDefined();
25
+ expect(wrapper).toBe('schedule function test:after_one_second 20t\n');
26
+ });
27
+ test('@schedule(ticks=1) generates _schedule wrapper with 1t', () => {
28
+ const source = `
29
+ @schedule(ticks=1)
30
+ fn next_tick(): void {
31
+ say("next tick!");
32
+ }
33
+ `;
34
+ const result = (0, compile_1.compile)(source, { namespace: 'ns' });
35
+ const wrapper = getFile(result.files, '_schedule_next_tick.mcfunction');
36
+ expect(wrapper).toBeDefined();
37
+ expect(wrapper).toBe('schedule function ns:next_tick 1t\n');
38
+ });
39
+ test('@schedule does not affect tick.json', () => {
40
+ const source = `
41
+ @schedule(ticks=20)
42
+ fn deferred(): void {
43
+ say("deferred");
44
+ }
45
+ `;
46
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
47
+ const tickJson = getFile(result.files, 'tick.json');
48
+ expect(tickJson).toBeUndefined();
49
+ });
50
+ test('@schedule coexists with @tick and @load', () => {
51
+ const source = `
52
+ @tick
53
+ fn game_tick(): void {
54
+ let x: int = 1;
55
+ }
56
+
57
+ @load
58
+ fn init(): void {
59
+ let y: int = 0;
60
+ }
61
+
62
+ @schedule(ticks=40)
63
+ fn two_seconds(): void {
64
+ say("two seconds!");
65
+ }
66
+ `;
67
+ const result = (0, compile_1.compile)(source, { namespace: 'combo' });
68
+ // @tick still works
69
+ const tickJson = getFile(result.files, 'tick.json');
70
+ expect(tickJson).toBeDefined();
71
+ expect(JSON.parse(tickJson).values).toContain('combo:game_tick');
72
+ // @load still works
73
+ const loadJson = getFile(result.files, 'load.json');
74
+ expect(loadJson).toBeDefined();
75
+ expect(JSON.parse(loadJson).values).toContain('combo:init');
76
+ // @schedule generates wrapper
77
+ const wrapper = getFile(result.files, '_schedule_two_seconds.mcfunction');
78
+ expect(wrapper).toBeDefined();
79
+ expect(wrapper).toBe('schedule function combo:two_seconds 40t\n');
80
+ });
81
+ test('calling _schedule_xxx() invokes the schedule wrapper', () => {
82
+ const source = `
83
+ @schedule(ticks=20)
84
+ fn after_one_second(): void {
85
+ say("delayed");
86
+ }
87
+
88
+ fn start(): void {
89
+ _schedule_after_one_second();
90
+ }
91
+ `;
92
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
93
+ const startFn = getFile(result.files, 'start.mcfunction');
94
+ expect(startFn).toBeDefined();
95
+ expect(startFn).toContain('function test:_schedule_after_one_second');
96
+ });
97
+ });
98
+ //# sourceMappingURL=schedule.test.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Source Map Tests — Phase 4a
3
+ *
4
+ * Verifies that generated .sourcemap.json files correctly map output lines
5
+ * back to source .mcrs locations.
6
+ */
7
+ export {};
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+ /**
3
+ * Source Map Tests — Phase 4a
4
+ *
5
+ * Verifies that generated .sourcemap.json files correctly map output lines
6
+ * back to source .mcrs locations.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const index_1 = require("../index");
10
+ function getSourceMap(files, fnSuffix) {
11
+ const smPath = `data/test/function/${fnSuffix}.sourcemap.json`;
12
+ const file = files.find(f => f.path === smPath);
13
+ if (!file) {
14
+ const paths = files.map(f => f.path).join(', ');
15
+ throw new Error(`Missing sourcemap: ${smPath}\nAvailable: ${paths}`);
16
+ }
17
+ return JSON.parse(file.content);
18
+ }
19
+ function getMcFunction(files, fnSuffix) {
20
+ const mcPath = `data/test/function/${fnSuffix}.mcfunction`;
21
+ const file = files.find(f => f.path === mcPath);
22
+ if (!file)
23
+ throw new Error(`Missing mcfunction: ${mcPath}`);
24
+ return file.content;
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // Basic structure
28
+ // ---------------------------------------------------------------------------
29
+ describe('source map — basic structure', () => {
30
+ it('generates sourcemap.json only when generateSourceMap=true', () => {
31
+ const source = `fn add(a: int, b: int): int { return a + b; }`;
32
+ const without = (0, index_1.compile)(source, { namespace: 'test', filePath: 'src/add.mcrs' });
33
+ expect(without.files.some(f => f.path.endsWith('.sourcemap.json'))).toBe(false);
34
+ const with_ = (0, index_1.compile)(source, { namespace: 'test', generateSourceMap: true, filePath: 'src/add.mcrs' });
35
+ expect(with_.files.some(f => f.path.endsWith('.sourcemap.json'))).toBe(true);
36
+ });
37
+ it('sourcemap has version=1', () => {
38
+ const source = `fn greet() { say("hello"); }`;
39
+ const result = (0, index_1.compile)(source, {
40
+ namespace: 'test',
41
+ generateSourceMap: true,
42
+ filePath: 'src/greet.mcrs',
43
+ });
44
+ const sm = getSourceMap(result.files, 'greet');
45
+ expect(sm.version).toBe(1);
46
+ });
47
+ it('sourcemap generatedFile matches the mcfunction path', () => {
48
+ const source = `fn foo() { say("x"); }`;
49
+ const result = (0, index_1.compile)(source, {
50
+ namespace: 'test',
51
+ generateSourceMap: true,
52
+ filePath: 'src/foo.mcrs',
53
+ });
54
+ const sm = getSourceMap(result.files, 'foo');
55
+ expect(sm.generatedFile).toBe('data/test/function/foo.mcfunction');
56
+ });
57
+ it('sources array contains the source file path', () => {
58
+ const source = `fn bar() { say("y"); }`;
59
+ const result = (0, index_1.compile)(source, {
60
+ namespace: 'test',
61
+ generateSourceMap: true,
62
+ filePath: 'src/bar.mcrs',
63
+ });
64
+ const sm = getSourceMap(result.files, 'bar');
65
+ expect(sm.sources).toContain('src/bar.mcrs');
66
+ });
67
+ });
68
+ // ---------------------------------------------------------------------------
69
+ // Mapping correctness
70
+ // ---------------------------------------------------------------------------
71
+ describe('source map — mapping correctness', () => {
72
+ it('each mapping line references a valid output line', () => {
73
+ const source = `
74
+ fn simple(x: int): int {
75
+ let y = x + 1;
76
+ return y;
77
+ }
78
+ `;
79
+ const result = (0, index_1.compile)(source, {
80
+ namespace: 'test',
81
+ generateSourceMap: true,
82
+ filePath: 'src/simple.mcrs',
83
+ });
84
+ const sm = getSourceMap(result.files, 'simple');
85
+ const mcfn = getMcFunction(result.files, 'simple');
86
+ const outputLines = mcfn.split('\n').filter(l => l.length > 0);
87
+ for (const mapping of sm.mappings) {
88
+ expect(mapping.line).toBeGreaterThanOrEqual(1);
89
+ expect(mapping.line).toBeLessThanOrEqual(outputLines.length);
90
+ expect(mapping.sourceLine).toBeGreaterThanOrEqual(1);
91
+ expect(mapping.sourceCol).toBeGreaterThanOrEqual(1);
92
+ }
93
+ });
94
+ it('source index in mappings refers to valid sources entry', () => {
95
+ const source = `fn calc(a: int, b: int): int { return a * b; }`;
96
+ const result = (0, index_1.compile)(source, {
97
+ namespace: 'test',
98
+ generateSourceMap: true,
99
+ filePath: 'src/calc.mcrs',
100
+ });
101
+ const sm = getSourceMap(result.files, 'calc');
102
+ for (const m of sm.mappings) {
103
+ expect(m.source).toBeGreaterThanOrEqual(0);
104
+ expect(m.source).toBeLessThan(sm.sources.length);
105
+ }
106
+ });
107
+ it('mappings cover the output lines from a simple function body', () => {
108
+ const source = `
109
+ fn add(a: int, b: int): int {
110
+ return a + b;
111
+ }
112
+ `;
113
+ const result = (0, index_1.compile)(source, {
114
+ namespace: 'test',
115
+ generateSourceMap: true,
116
+ filePath: 'src/add.mcrs',
117
+ });
118
+ const sm = getSourceMap(result.files, 'add');
119
+ // There should be at least one mapping
120
+ expect(sm.mappings.length).toBeGreaterThan(0);
121
+ // All mappings should point at non-zero source lines
122
+ for (const m of sm.mappings) {
123
+ expect(m.sourceLine).toBeGreaterThan(0);
124
+ }
125
+ });
126
+ it('sourceLine values are ordered and correspond to source line numbers', () => {
127
+ const source = `
128
+ fn multi() {
129
+ let a = 1;
130
+ let b = 2;
131
+ let c = a + b;
132
+ say("hello");
133
+ }
134
+ `;
135
+ const result = (0, index_1.compile)(source, {
136
+ namespace: 'test',
137
+ generateSourceMap: true,
138
+ filePath: 'src/multi.mcrs',
139
+ });
140
+ const sm = getSourceMap(result.files, 'multi');
141
+ // All mapped source lines should be in the range of the function body
142
+ for (const m of sm.mappings) {
143
+ expect(m.sourceLine).toBeGreaterThanOrEqual(2); // fn starts at line 2
144
+ expect(m.sourceLine).toBeLessThanOrEqual(8); // fn ends at line 8
145
+ }
146
+ });
147
+ });
148
+ // ---------------------------------------------------------------------------
149
+ // No sourcemap when no filePath
150
+ // ---------------------------------------------------------------------------
151
+ describe('source map — no filePath', () => {
152
+ it('generates sourcemap with empty sources when no filePath is provided', () => {
153
+ const source = `fn noloc() { say("no file"); }`;
154
+ const result = (0, index_1.compile)(source, {
155
+ namespace: 'test',
156
+ generateSourceMap: true,
157
+ // no filePath
158
+ });
159
+ // Source map should not be generated (no sourceLoc info to record)
160
+ const hasSm = result.files.some(f => f.path.endsWith('.sourcemap.json'));
161
+ // Either no sourcemap generated, or it has empty mappings
162
+ if (hasSm) {
163
+ const sm = getSourceMap(result.files, 'noloc');
164
+ expect(sm.mappings.length).toBe(0);
165
+ }
166
+ // This is acceptable either way — just verify it doesn't crash
167
+ });
168
+ });
169
+ // ---------------------------------------------------------------------------
170
+ // Nested function calls
171
+ // ---------------------------------------------------------------------------
172
+ describe('source map — nested function calls', () => {
173
+ it('each function gets its own sourcemap', () => {
174
+ const source = `
175
+ fn helper(x: int): int {
176
+ return x * 2;
177
+ }
178
+
179
+ fn caller() {
180
+ let r = helper(5);
181
+ say("done");
182
+ }
183
+ `;
184
+ const result = (0, index_1.compile)(source, {
185
+ namespace: 'test',
186
+ generateSourceMap: true,
187
+ filePath: 'src/nested.mcrs',
188
+ });
189
+ // Both functions should have sourcemaps
190
+ const helperSm = getSourceMap(result.files, 'helper');
191
+ const callerSm = getSourceMap(result.files, 'caller');
192
+ expect(helperSm.mappings.length).toBeGreaterThan(0);
193
+ expect(callerSm.mappings.length).toBeGreaterThan(0);
194
+ // helper's mappings should reference lines 2-4
195
+ for (const m of helperSm.mappings) {
196
+ expect(m.sourceLine).toBeGreaterThanOrEqual(2);
197
+ expect(m.sourceLine).toBeLessThanOrEqual(4);
198
+ }
199
+ // caller's mappings should reference lines 7-9
200
+ for (const m of callerSm.mappings) {
201
+ expect(m.sourceLine).toBeGreaterThanOrEqual(7);
202
+ expect(m.sourceLine).toBeLessThanOrEqual(9);
203
+ }
204
+ });
205
+ });
206
+ // ---------------------------------------------------------------------------
207
+ // sourcemap.json sidecar path
208
+ // ---------------------------------------------------------------------------
209
+ describe('source map — file path convention', () => {
210
+ it('sourcemap path replaces .mcfunction with .sourcemap.json', () => {
211
+ const source = `fn test_fn() { say("test"); }`;
212
+ const result = (0, index_1.compile)(source, {
213
+ namespace: 'test',
214
+ generateSourceMap: true,
215
+ filePath: 'src/test.mcrs',
216
+ });
217
+ const smFiles = result.files.filter(f => f.path.endsWith('.sourcemap.json'));
218
+ expect(smFiles.length).toBeGreaterThan(0);
219
+ for (const sf of smFiles) {
220
+ expect(sf.path).toMatch(/\.sourcemap\.json$/);
221
+ // Corresponding .mcfunction should also exist
222
+ const mcPath = sf.path.replace('.sourcemap.json', '.mcfunction');
223
+ expect(result.files.some(f => f.path === mcPath)).toBe(true);
224
+ }
225
+ });
226
+ });
227
+ //# sourceMappingURL=sourcemap.test.js.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Tests for Phase 2b: Multi-return values / Tuple types
3
+ *
4
+ * Covers:
5
+ * - Tuple type parsing: (int, int)
6
+ * - Tuple literal parsing: (a, b)
7
+ * - Destructuring let: let (q, r) = ...
8
+ * - Function return type: fn f(): (int, int)
9
+ * - Full compilation to scoreboard commands
10
+ */
11
+ export {};