redscript-mc 2.0.0 → 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 (629) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +12 -16
  3. package/README.zh.md +2 -2
  4. package/dist/cli.js +0 -0
  5. package/dist/src/__tests__/budget.test.js +261 -0
  6. package/dist/src/__tests__/diagnostics.test.js +2 -3
  7. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  8. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  9. package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
  10. package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
  11. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  12. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  13. package/dist/src/__tests__/enum.test.d.ts +10 -0
  14. package/dist/src/__tests__/enum.test.js +389 -0
  15. package/dist/src/__tests__/generics.test.d.ts +14 -0
  16. package/dist/src/__tests__/generics.test.js +367 -0
  17. package/dist/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
  18. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  19. package/dist/src/__tests__/incremental.test.js +308 -0
  20. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  21. package/dist/src/__tests__/lsp.test.js +245 -0
  22. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  23. package/dist/src/__tests__/mc-version.test.js +154 -0
  24. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  25. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  26. package/dist/src/__tests__/modules.test.d.ts +7 -0
  27. package/dist/src/__tests__/modules.test.js +333 -0
  28. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  30. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  31. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  32. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  33. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  34. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  35. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  36. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  37. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  38. package/dist/src/__tests__/option.test.d.ts +14 -0
  39. package/dist/src/__tests__/option.test.js +275 -0
  40. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  41. package/dist/src/__tests__/schedule.test.js +98 -0
  42. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  43. package/dist/src/__tests__/sourcemap.test.js +227 -0
  44. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  45. package/dist/src/__tests__/tuple.test.js +202 -0
  46. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  47. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  48. package/dist/src/ast/types.d.ts +56 -2
  49. package/dist/src/cache/deps.d.ts +41 -0
  50. package/dist/src/cache/deps.js +158 -0
  51. package/dist/src/cache/incremental.d.ts +35 -0
  52. package/dist/src/cache/incremental.js +165 -0
  53. package/dist/src/cache/index.d.ts +37 -0
  54. package/dist/src/cache/index.js +152 -0
  55. package/dist/src/cli.js +76 -45
  56. package/dist/src/compile.d.ts +2 -2
  57. package/dist/src/compile.js +1 -1
  58. package/dist/src/diagnostics/index.d.ts +1 -1
  59. package/dist/src/diagnostics/index.js +8 -11
  60. package/dist/src/emit/compile.d.ts +29 -0
  61. package/dist/src/emit/compile.js +143 -0
  62. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  63. package/dist/{src2 → src}/emit/index.js +59 -8
  64. package/dist/src/emit/modules.d.ts +29 -0
  65. package/dist/src/emit/modules.js +492 -0
  66. package/dist/src/emit/sourcemap.d.ts +53 -0
  67. package/dist/src/emit/sourcemap.js +73 -0
  68. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  69. package/dist/{src2 → src}/hir/lower.js +22 -1
  70. package/dist/src/hir/monomorphize.d.ts +22 -0
  71. package/dist/src/hir/monomorphize.js +379 -0
  72. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  73. package/dist/src/index.d.ts +19 -2
  74. package/dist/src/index.js +36 -14
  75. package/dist/src/lexer/index.d.ts +1 -1
  76. package/dist/src/lexer/index.js +1 -0
  77. package/dist/src/lir/budget.d.ts +37 -0
  78. package/dist/src/lir/budget.js +280 -0
  79. package/dist/{src2 → src}/lir/lower.js +19 -0
  80. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  81. package/dist/src/lsp/main.d.ts +8 -0
  82. package/dist/src/lsp/main.js +11 -0
  83. package/dist/src/lsp/server.d.ts +11 -0
  84. package/dist/src/lsp/server.js +352 -0
  85. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  86. package/dist/{src2 → src}/mir/lower.js +244 -10
  87. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  88. package/dist/src/optimizer/coroutine.d.ts +34 -0
  89. package/dist/src/optimizer/coroutine.js +789 -0
  90. package/dist/src/optimizer/dce.d.ts +8 -34
  91. package/dist/src/optimizer/dce.js +146 -629
  92. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  93. package/dist/src/optimizer/interprocedural.js +186 -0
  94. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  95. package/dist/src/optimizer/lir/const_imm.js +139 -0
  96. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  97. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  98. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  99. package/dist/src/optimizer/lir/peephole.js +52 -0
  100. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  101. package/dist/src/optimizer/lir/pipeline.js +34 -0
  102. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  103. package/dist/src/optimizer/nbt-batch.js +51 -0
  104. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  105. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  106. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  107. package/dist/src/optimizer/selector-cache.js +100 -0
  108. package/dist/src/optimizer/unroll.d.ts +32 -0
  109. package/dist/src/optimizer/unroll.js +348 -0
  110. package/dist/src/parser/index.d.ts +8 -0
  111. package/dist/src/parser/index.js +204 -14
  112. package/dist/src/repl.d.ts +1 -1
  113. package/dist/src/typechecker/index.d.ts +4 -0
  114. package/dist/src/typechecker/index.js +198 -13
  115. package/dist/src/types/mc-version.d.ts +24 -0
  116. package/dist/src/types/mc-version.js +49 -0
  117. package/docs/ROADMAP.md +395 -0
  118. package/docs/compiler-pipeline-redesign.md +27 -10
  119. package/editors/vscode/out/extension.js +25176 -8000
  120. package/editors/vscode/package-lock.json +90 -6
  121. package/editors/vscode/package.json +3 -2
  122. package/editors/vscode/src/extension.ts +97 -67
  123. package/examples/showcase.mcrs +3 -3
  124. package/jest.config.js +1 -1
  125. package/package.json +9 -3
  126. package/src/__tests__/budget.test.ts +297 -0
  127. package/src/__tests__/diagnostics.test.ts +2 -3
  128. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  129. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  130. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  131. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  132. package/src/__tests__/enum.test.ts +425 -0
  133. package/src/__tests__/generics.test.ts +390 -0
  134. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  135. package/src/__tests__/incremental.test.ts +337 -0
  136. package/src/__tests__/lsp.test.ts +270 -0
  137. package/src/__tests__/mc-version.test.ts +178 -0
  138. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  139. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  140. package/src/__tests__/modules.test.ts +365 -0
  141. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  142. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  143. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  144. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  145. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  146. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  147. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  148. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  149. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  150. package/src/__tests__/option.test.ts +299 -0
  151. package/src/__tests__/schedule.test.ts +105 -0
  152. package/src/__tests__/sourcemap.test.ts +254 -0
  153. package/src/__tests__/tuple.test.ts +220 -0
  154. package/src/__tests__/typechecker-strict.test.ts +216 -0
  155. package/src/ast/types.ts +33 -2
  156. package/src/cache/deps.ts +132 -0
  157. package/src/cache/incremental.ts +173 -0
  158. package/src/cache/index.ts +135 -0
  159. package/src/cli.ts +88 -45
  160. package/src/compile.ts +2 -2
  161. package/src/diagnostics/index.ts +8 -11
  162. package/src/emit/compile.ts +177 -0
  163. package/{src2 → src}/emit/index.ts +72 -8
  164. package/src/emit/modules.ts +581 -0
  165. package/src/emit/sourcemap.ts +101 -0
  166. package/{src2 → src}/hir/lower.ts +29 -2
  167. package/src/hir/monomorphize.ts +416 -0
  168. package/{src2 → src}/hir/types.ts +15 -3
  169. package/src/index.ts +29 -10
  170. package/src/lexer/index.ts +2 -1
  171. package/src/lir/budget.ts +321 -0
  172. package/{src2 → src}/lir/lower.ts +32 -1
  173. package/{src2 → src}/lir/types.ts +7 -3
  174. package/src/lsp/main.ts +9 -0
  175. package/src/lsp/server.ts +414 -0
  176. package/{src2 → src}/mir/lower.ts +251 -8
  177. package/{src2 → src}/mir/types.ts +12 -1
  178. package/src/optimizer/coroutine.ts +996 -0
  179. package/{src2 → src}/optimizer/dce.ts +2 -1
  180. package/src/optimizer/interprocedural.ts +177 -0
  181. package/src/optimizer/lir/const_imm.ts +143 -0
  182. package/src/optimizer/lir/dead_slot.ts +123 -0
  183. package/src/optimizer/lir/peephole.ts +57 -0
  184. package/src/optimizer/lir/pipeline.ts +37 -0
  185. package/src/optimizer/nbt-batch.ts +50 -0
  186. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  187. package/src/optimizer/selector-cache.ts +103 -0
  188. package/src/optimizer/unroll.ts +386 -0
  189. package/src/parser/index.ts +212 -15
  190. package/src/repl.ts +1 -1
  191. package/src/stdlib/math.mcrs +4 -4
  192. package/src/templates/quest.mcrs +4 -4
  193. package/src/typechecker/index.ts +215 -15
  194. package/src/types/mc-version.ts +46 -0
  195. package/tsconfig.json +1 -1
  196. package/.claude/commands/build-test.md +0 -10
  197. package/.claude/commands/deploy-demo.md +0 -12
  198. package/.claude/commands/stage-status.md +0 -13
  199. package/.claude/settings.json +0 -12
  200. package/CLAUDE.md +0 -231
  201. package/dist/__tests__/cli.test.js +0 -278
  202. package/dist/__tests__/codegen.test.js +0 -152
  203. package/dist/__tests__/compile-all.test.d.ts +0 -10
  204. package/dist/__tests__/compile-all.test.js +0 -108
  205. package/dist/__tests__/dce.test.js +0 -138
  206. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  207. package/dist/__tests__/diagnostics.test.js +0 -149
  208. package/dist/__tests__/e2e.test.d.ts +0 -6
  209. package/dist/__tests__/e2e.test.js +0 -1847
  210. package/dist/__tests__/entity-types.test.js +0 -203
  211. package/dist/__tests__/formatter.test.js +0 -40
  212. package/dist/__tests__/lexer.test.js +0 -343
  213. package/dist/__tests__/lowering.test.js +0 -1015
  214. package/dist/__tests__/macro.test.d.ts +0 -8
  215. package/dist/__tests__/macro.test.js +0 -305
  216. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  217. package/dist/__tests__/mc-integration.test.js +0 -819
  218. package/dist/__tests__/mc-syntax.test.js +0 -124
  219. package/dist/__tests__/nbt.test.js +0 -82
  220. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  221. package/dist/__tests__/optimizer.test.d.ts +0 -1
  222. package/dist/__tests__/optimizer.test.js +0 -149
  223. package/dist/__tests__/parser.test.d.ts +0 -1
  224. package/dist/__tests__/parser.test.js +0 -807
  225. package/dist/__tests__/repl.test.d.ts +0 -1
  226. package/dist/__tests__/repl.test.js +0 -27
  227. package/dist/__tests__/runtime.test.d.ts +0 -1
  228. package/dist/__tests__/runtime.test.js +0 -289
  229. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  230. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  231. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  232. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  233. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  234. package/dist/__tests__/stdlib-math.test.js +0 -352
  235. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  236. package/dist/__tests__/stdlib-vec.test.js +0 -264
  237. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  238. package/dist/__tests__/structure-optimizer.test.js +0 -33
  239. package/dist/__tests__/typechecker.test.d.ts +0 -1
  240. package/dist/__tests__/typechecker.test.js +0 -552
  241. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  242. package/dist/__tests__/var-allocator.test.js +0 -69
  243. package/dist/ast/types.d.ts +0 -514
  244. package/dist/ast/types.js +0 -9
  245. package/dist/builtins/metadata.d.ts +0 -36
  246. package/dist/builtins/metadata.js +0 -1014
  247. package/dist/cli.d.ts +0 -11
  248. package/dist/codegen/cmdblock/index.d.ts +0 -26
  249. package/dist/codegen/cmdblock/index.js +0 -45
  250. package/dist/codegen/mcfunction/index.d.ts +0 -40
  251. package/dist/codegen/mcfunction/index.js +0 -606
  252. package/dist/codegen/structure/index.d.ts +0 -24
  253. package/dist/codegen/structure/index.js +0 -279
  254. package/dist/codegen/var-allocator.d.ts +0 -45
  255. package/dist/codegen/var-allocator.js +0 -104
  256. package/dist/compile.d.ts +0 -68
  257. package/dist/data/arena/function/__load.mcfunction +0 -6
  258. package/dist/data/arena/function/__tick.mcfunction +0 -2
  259. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  260. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  261. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  262. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  263. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  264. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  265. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  266. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  267. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  268. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  269. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  270. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  271. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  272. package/dist/data/counter/function/__load.mcfunction +0 -5
  273. package/dist/data/counter/function/__tick.mcfunction +0 -2
  274. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  275. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  276. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  277. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  278. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  279. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  280. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  281. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  282. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  283. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  284. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  285. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  286. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  287. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  288. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  289. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  290. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  291. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  292. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  293. package/dist/data/gcd3/function/test.mcfunction +0 -7
  294. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  295. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  296. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  297. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  298. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  299. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  300. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  301. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  302. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  303. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  304. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  305. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  306. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  307. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  308. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  309. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  310. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  311. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  312. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  313. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  314. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  315. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  316. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  317. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  318. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  319. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  320. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  321. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  322. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  323. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  324. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  325. package/dist/data/mathtest/function/test.mcfunction +0 -5
  326. package/dist/data/minecraft/tags/function/load.json +0 -5
  327. package/dist/data/minecraft/tags/function/tick.json +0 -5
  328. package/dist/data/mypack/function/__load.mcfunction +0 -13
  329. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  330. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  331. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  332. package/dist/data/mypack/function/abs.mcfunction +0 -6
  333. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  334. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  335. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  336. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  337. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  338. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  339. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  340. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  341. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  342. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  343. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  346. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  347. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  348. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  352. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  353. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  354. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  357. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  358. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  359. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  360. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  361. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  365. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  366. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  367. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  368. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  369. package/dist/data/quiz/function/__load.mcfunction +0 -16
  370. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  371. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  372. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  373. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  374. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  375. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  376. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  377. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  378. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  379. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  380. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  381. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  382. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  383. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  384. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  386. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  387. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  388. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  389. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  390. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  391. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  392. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  393. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  394. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  395. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  396. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  397. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  398. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  399. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  400. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  402. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  403. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  404. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  405. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  406. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  407. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  408. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  409. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  410. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  411. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  412. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  413. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  414. package/dist/data/runtime/function/__load.mcfunction +0 -5
  415. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  416. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  417. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  418. package/dist/data/shop/function/__load.mcfunction +0 -7
  419. package/dist/data/shop/function/__tick.mcfunction +0 -3
  420. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  421. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  422. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  423. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  424. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  425. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  426. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  427. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  429. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  430. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  431. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  432. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  433. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  434. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  435. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  436. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  437. package/dist/data/turret/function/__load.mcfunction +0 -5
  438. package/dist/data/turret/function/__tick.mcfunction +0 -4
  439. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  440. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  441. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  442. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  443. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  444. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  445. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  446. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  447. package/dist/diagnostics/index.d.ts +0 -44
  448. package/dist/diagnostics/index.js +0 -140
  449. package/dist/events/types.d.ts +0 -35
  450. package/dist/events/types.js +0 -59
  451. package/dist/formatter/index.d.ts +0 -1
  452. package/dist/formatter/index.js +0 -26
  453. package/dist/gcd2.map.json +0 -15
  454. package/dist/gcd3.map.json +0 -17
  455. package/dist/gcd_test.map.json +0 -15
  456. package/dist/index.d.ts +0 -62
  457. package/dist/ir/builder.d.ts +0 -33
  458. package/dist/ir/builder.js +0 -99
  459. package/dist/ir/types.d.ts +0 -132
  460. package/dist/ir/types.js +0 -15
  461. package/dist/isqrttest.map.json +0 -15
  462. package/dist/lexer/index.d.ts +0 -37
  463. package/dist/lexer/index.js +0 -569
  464. package/dist/lowering/index.d.ts +0 -188
  465. package/dist/lowering/index.js +0 -3405
  466. package/dist/mathtest.map.json +0 -6
  467. package/dist/mc-test/client.d.ts +0 -128
  468. package/dist/mc-test/client.js +0 -174
  469. package/dist/mc-test/runner.d.ts +0 -28
  470. package/dist/mc-test/runner.js +0 -150
  471. package/dist/mc-test/setup.d.ts +0 -11
  472. package/dist/mc-test/setup.js +0 -98
  473. package/dist/mc-validator/index.d.ts +0 -17
  474. package/dist/mc-validator/index.js +0 -322
  475. package/dist/mypack.map.json +0 -27
  476. package/dist/nbt/index.d.ts +0 -86
  477. package/dist/nbt/index.js +0 -250
  478. package/dist/optimizer/commands.d.ts +0 -38
  479. package/dist/optimizer/commands.js +0 -451
  480. package/dist/optimizer/dce.d.ts +0 -34
  481. package/dist/optimizer/dce.js +0 -639
  482. package/dist/optimizer/passes.d.ts +0 -34
  483. package/dist/optimizer/passes.js +0 -243
  484. package/dist/optimizer/structure.d.ts +0 -9
  485. package/dist/optimizer/structure.js +0 -356
  486. package/dist/pack.mcmeta +0 -6
  487. package/dist/parser/index.d.ts +0 -93
  488. package/dist/parser/index.js +0 -1687
  489. package/dist/repl.d.ts +0 -16
  490. package/dist/repl.js +0 -165
  491. package/dist/reqtest.map.json +0 -4
  492. package/dist/reqtest2.map.json +0 -4
  493. package/dist/runtime/index.d.ts +0 -107
  494. package/dist/runtime/index.js +0 -1409
  495. package/dist/runtime.map.json +0 -7
  496. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  497. package/dist/src/__tests__/codegen.test.js +0 -152
  498. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  499. package/dist/src/__tests__/e2e.test.js +0 -1789
  500. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  501. package/dist/src/__tests__/entity-types.test.js +0 -203
  502. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  503. package/dist/src/__tests__/lowering.test.js +0 -1015
  504. package/dist/src/__tests__/macro.test.d.ts +0 -8
  505. package/dist/src/__tests__/macro.test.js +0 -306
  506. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  507. package/dist/src/__tests__/nbt.test.js +0 -82
  508. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  509. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  510. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  511. package/dist/src/__tests__/optimizer.test.js +0 -149
  512. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  513. package/dist/src/__tests__/runtime.test.js +0 -289
  514. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  515. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  516. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  517. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  518. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  519. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  520. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  521. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  522. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  523. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  524. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  525. package/dist/src/__tests__/var-allocator.test.js +0 -69
  526. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  527. package/dist/src/codegen/cmdblock/index.js +0 -45
  528. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  529. package/dist/src/codegen/mcfunction/index.js +0 -606
  530. package/dist/src/codegen/structure/index.d.ts +0 -24
  531. package/dist/src/codegen/structure/index.js +0 -279
  532. package/dist/src/codegen/var-allocator.d.ts +0 -45
  533. package/dist/src/codegen/var-allocator.js +0 -104
  534. package/dist/src/ir/builder.d.ts +0 -33
  535. package/dist/src/ir/builder.js +0 -99
  536. package/dist/src/ir/types.d.ts +0 -132
  537. package/dist/src/ir/types.js +0 -15
  538. package/dist/src/lowering/index.d.ts +0 -188
  539. package/dist/src/lowering/index.js +0 -3405
  540. package/dist/src/optimizer/commands.d.ts +0 -38
  541. package/dist/src/optimizer/commands.js +0 -451
  542. package/dist/src/optimizer/passes.d.ts +0 -34
  543. package/dist/src/optimizer/passes.js +0 -243
  544. package/dist/src/optimizer/structure.d.ts +0 -9
  545. package/dist/src/optimizer/structure.js +0 -356
  546. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  547. package/dist/src2/emit/compile.d.ts +0 -19
  548. package/dist/src2/emit/compile.js +0 -80
  549. package/dist/src2/optimizer/dce.d.ts +0 -8
  550. package/dist/src2/optimizer/dce.js +0 -155
  551. package/dist/swap_test.map.json +0 -14
  552. package/dist/tsconfig.tsbuildinfo +0 -1
  553. package/dist/typechecker/index.d.ts +0 -61
  554. package/dist/typechecker/index.js +0 -1034
  555. package/dist/types/entity-hierarchy.d.ts +0 -29
  556. package/dist/types/entity-hierarchy.js +0 -107
  557. package/src2/emit/compile.ts +0 -99
  558. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  559. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  560. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  561. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  562. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  563. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  564. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  565. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  566. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  567. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  568. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  569. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  570. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  571. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  572. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  576. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  578. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  579. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  580. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  581. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  582. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  583. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  584. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  585. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  586. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  587. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  588. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  589. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  590. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  592. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  593. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  594. /package/dist/{src2 → src}/hir/types.js +0 -0
  595. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  596. /package/dist/{src2 → src}/lir/types.js +0 -0
  597. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  598. /package/dist/{src2 → src}/lir/verify.js +0 -0
  599. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  600. /package/dist/{src2 → src}/mir/macro.js +0 -0
  601. /package/dist/{src2 → src}/mir/types.js +0 -0
  602. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  603. /package/dist/{src2 → src}/mir/verify.js +0 -0
  604. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  605. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  606. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  607. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  608. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  609. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  610. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  611. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  612. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  613. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  614. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  615. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  616. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  617. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  618. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  619. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  620. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  621. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  622. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  623. /package/{src2 → src}/lir/verify.ts +0 -0
  624. /package/{src2 → src}/mir/macro.ts +0 -0
  625. /package/{src2 → src}/mir/verify.ts +0 -0
  626. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  627. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  628. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  629. /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
@@ -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 {};
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for Phase 2b: Multi-return values / Tuple types
4
+ *
5
+ * Covers:
6
+ * - Tuple type parsing: (int, int)
7
+ * - Tuple literal parsing: (a, b)
8
+ * - Destructuring let: let (q, r) = ...
9
+ * - Function return type: fn f(): (int, int)
10
+ * - Full compilation to scoreboard commands
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ const lexer_1 = require("../lexer");
14
+ const parser_1 = require("../parser");
15
+ const compile_1 = require("../emit/compile");
16
+ function parse(source, namespace = 'test') {
17
+ const tokens = new lexer_1.Lexer(source).tokenize();
18
+ return new parser_1.Parser(tokens).parse(namespace);
19
+ }
20
+ function parseStmt(source) {
21
+ const program = parse(`fn _test() { ${source} }`);
22
+ return program.declarations[0].body[0];
23
+ }
24
+ function getFile(files, pathSubstr) {
25
+ const f = files.find(f => f.path.includes(pathSubstr));
26
+ return f?.content;
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // Parser tests
30
+ // ---------------------------------------------------------------------------
31
+ describe('Tuple: Parser', () => {
32
+ it('parses tuple type (int, int) as return type', () => {
33
+ const program = parse('fn f(a: int, b: int): (int, int) {}');
34
+ const fn = program.declarations[0];
35
+ expect(fn.returnType).toEqual({ kind: 'tuple', elements: [
36
+ { kind: 'named', name: 'int' },
37
+ { kind: 'named', name: 'int' },
38
+ ] });
39
+ });
40
+ it('parses tuple type with 3 elements', () => {
41
+ const program = parse('fn f(): (int, bool, int) {}');
42
+ expect(program.declarations[0].returnType).toEqual({ kind: 'tuple', elements: [
43
+ { kind: 'named', name: 'int' },
44
+ { kind: 'named', name: 'bool' },
45
+ { kind: 'named', name: 'int' },
46
+ ] });
47
+ });
48
+ it('parses tuple literal expression (a, b)', () => {
49
+ const program = parse(`fn _test(a: int, b: int): (int, int) { return (a, b); }`);
50
+ const ret = program.declarations[0].body[0];
51
+ expect(ret.kind).toBe('return');
52
+ if (ret.kind === 'return' && ret.value) {
53
+ expect(ret.value.kind).toBe('tuple_lit');
54
+ if (ret.value.kind === 'tuple_lit') {
55
+ expect(ret.value.elements).toHaveLength(2);
56
+ expect(ret.value.elements[0]).toMatchObject({ kind: 'ident', name: 'a' });
57
+ expect(ret.value.elements[1]).toMatchObject({ kind: 'ident', name: 'b' });
58
+ }
59
+ }
60
+ });
61
+ it('parses destructuring let statement', () => {
62
+ const stmt = parseStmt('let (q, r) = divmod(10, 3);');
63
+ expect(stmt.kind).toBe('let_destruct');
64
+ if (stmt.kind === 'let_destruct') {
65
+ expect(stmt.names).toEqual(['q', 'r']);
66
+ expect(stmt.init).toMatchObject({ kind: 'call', fn: 'divmod' });
67
+ }
68
+ });
69
+ it('parses destructuring with 3 bindings', () => {
70
+ const stmt = parseStmt('let (a, b, c) = get_triple(1);');
71
+ expect(stmt.kind).toBe('let_destruct');
72
+ if (stmt.kind === 'let_destruct') {
73
+ expect(stmt.names).toEqual(['a', 'b', 'c']);
74
+ }
75
+ });
76
+ it('does not confuse (expr) grouped expression with tuple literal', () => {
77
+ const program = parse(`fn _test(): int { return (1 + 2); }`);
78
+ const ret = program.declarations[0].body[0];
79
+ expect(ret.kind).toBe('return');
80
+ if (ret.kind === 'return' && ret.value) {
81
+ expect(ret.value.kind).toBe('binary');
82
+ }
83
+ });
84
+ it('still parses function type (int) -> int correctly', () => {
85
+ const program = parse('fn apply(f: (int) -> int, x: int): int {}');
86
+ const param = program.declarations[0].params[0];
87
+ expect(param.type).toEqual({ kind: 'function_type', params: [{ kind: 'named', name: 'int' }], return: { kind: 'named', name: 'int' } });
88
+ });
89
+ });
90
+ // ---------------------------------------------------------------------------
91
+ // E2E compilation tests
92
+ // ---------------------------------------------------------------------------
93
+ describe('Tuple: E2E compilation', () => {
94
+ test('basic divmod function compiles and writes $ret_0 and $ret_1', () => {
95
+ const source = `
96
+ fn divmod(a: int, b: int): (int, int) {
97
+ return (a / b, a % b);
98
+ }
99
+ `;
100
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
101
+ const fn = getFile(result.files, 'divmod.mcfunction');
102
+ expect(fn).toBeDefined();
103
+ // MIR __rf_0 → LIR $ret_0 (see lir/lower.ts slot() method)
104
+ expect(fn).toContain('$ret_0');
105
+ expect(fn).toContain('$ret_1');
106
+ });
107
+ test('destructuring let reads from $ret_ slots after call', () => {
108
+ const source = `
109
+ fn divmod(a: int, b: int): (int, int) {
110
+ return (a / b, a % b);
111
+ }
112
+ fn use_divmod(): int {
113
+ let (q, r) = divmod(10, 3);
114
+ return q + r;
115
+ }
116
+ `;
117
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
118
+ const fn = getFile(result.files, 'use_divmod.mcfunction');
119
+ expect(fn).toBeDefined();
120
+ // Should call divmod and then read from $ret_ slots
121
+ expect(fn).toContain('divmod');
122
+ expect(fn).toContain('$ret_0');
123
+ expect(fn).toContain('$ret_1');
124
+ });
125
+ test('tuple literal assigned directly via destructuring', () => {
126
+ const source = `
127
+ fn make_sum(a: int, b: int): int {
128
+ let (x, y) = (a + 1, b + 2);
129
+ return x + y;
130
+ }
131
+ `;
132
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
133
+ const fn = getFile(result.files, 'make_sum.mcfunction');
134
+ expect(fn).toBeDefined();
135
+ expect(fn).toContain('scoreboard players operation');
136
+ });
137
+ test('tuple values used in subsequent computation', () => {
138
+ const source = `
139
+ fn divmod(a: int, b: int): (int, int) {
140
+ return (a / b, a % b);
141
+ }
142
+ fn compute(): int {
143
+ let (q, r) = divmod(10, 3);
144
+ return q + r;
145
+ }
146
+ `;
147
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
148
+ const fn = getFile(result.files, 'compute.mcfunction');
149
+ expect(fn).toBeDefined();
150
+ expect(fn).toContain('scoreboard players operation');
151
+ });
152
+ test('3-tuple return and destructuring', () => {
153
+ const source = `
154
+ fn triple(a: int): (int, int, int) {
155
+ return (a, a + 1, a + 2);
156
+ }
157
+ fn use_triple(): int {
158
+ let (x, y, z) = triple(5);
159
+ return x + y + z;
160
+ }
161
+ `;
162
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
163
+ const tripleFn = getFile(result.files, 'triple.mcfunction');
164
+ expect(tripleFn).toBeDefined();
165
+ expect(tripleFn).toContain('$ret_0');
166
+ expect(tripleFn).toContain('$ret_1');
167
+ expect(tripleFn).toContain('$ret_2');
168
+ });
169
+ test('enum and tuple combined: return (int, Phase)', () => {
170
+ const source = `
171
+ enum Phase { Idle, Running, Done }
172
+ fn get_state(): (int, int) {
173
+ return (42, Phase::Running);
174
+ }
175
+ fn use_state(): int {
176
+ let (count, phase) = get_state();
177
+ return count + phase;
178
+ }
179
+ `;
180
+ const result = (0, compile_1.compile)(source, { namespace: 'test' });
181
+ const fn = getFile(result.files, 'get_state.mcfunction');
182
+ expect(fn).toBeDefined();
183
+ expect(fn).toContain('$ret_0');
184
+ expect(fn).toContain('$ret_1');
185
+ // Phase::Running = 1
186
+ expect(fn).toContain('1');
187
+ });
188
+ test('tuple return type appears in generated mcfunction with correct objective', () => {
189
+ const source = `
190
+ fn minmax(a: int, b: int): (int, int) {
191
+ return (a, b);
192
+ }
193
+ `;
194
+ const result = (0, compile_1.compile)(source, { namespace: 'ns' });
195
+ const fn = getFile(result.files, 'minmax.mcfunction');
196
+ expect(fn).toBeDefined();
197
+ // MIR __rf_0 → LIR $ret_0
198
+ expect(fn).toContain('$ret_0');
199
+ expect(fn).toContain('__ns');
200
+ });
201
+ });
202
+ //# sourceMappingURL=tuple.test.js.map
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Phase 6b: TypeChecker strict (error-mode) tests
3
+ *
4
+ * Covers:
5
+ * - Type errors now block compilation (error-mode default)
6
+ * - --lenient flag demotes type errors to warnings
7
+ * - int/float implicit conversion detection
8
+ * - redscript check command correctly reports type errors
9
+ */
10
+ export {};
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 6b: TypeChecker strict (error-mode) tests
4
+ *
5
+ * Covers:
6
+ * - Type errors now block compilation (error-mode default)
7
+ * - --lenient flag demotes type errors to warnings
8
+ * - int/float implicit conversion detection
9
+ * - redscript check command correctly reports type errors
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const compile_1 = require("../emit/compile");
13
+ const lexer_1 = require("../lexer");
14
+ const parser_1 = require("../parser");
15
+ const typechecker_1 = require("../typechecker");
16
+ // Helper: run TypeChecker directly
17
+ function typeCheck(source) {
18
+ const tokens = new lexer_1.Lexer(source).tokenize();
19
+ const ast = new parser_1.Parser(tokens).parse('test');
20
+ const checker = new typechecker_1.TypeChecker(source);
21
+ return checker.check(ast);
22
+ }
23
+ // Helper: compile in strict mode (default)
24
+ function compileStrict(source) {
25
+ (0, compile_1.compile)(source, { namespace: 'test' });
26
+ }
27
+ // Helper: compile in lenient mode
28
+ function compileLenient(source) {
29
+ return (0, compile_1.compile)(source, { namespace: 'test', lenient: true });
30
+ }
31
+ describe('TypeChecker error-mode (Phase 6b)', () => {
32
+ describe('type errors block compilation', () => {
33
+ it('throws on undeclared variable usage', () => {
34
+ expect(() => compileStrict(`
35
+ fn test() {
36
+ let x: int = undeclared;
37
+ }
38
+ `)).toThrow();
39
+ });
40
+ it('throws on return type mismatch', () => {
41
+ expect(() => compileStrict(`
42
+ fn get_bool() -> bool {
43
+ return 5;
44
+ }
45
+ `)).toThrow();
46
+ });
47
+ it('throws on wrong argument count', () => {
48
+ expect(() => compileStrict(`
49
+ fn add(a: int, b: int) -> int {
50
+ return a + b;
51
+ }
52
+ fn test() {
53
+ let x: int = add(1);
54
+ }
55
+ `)).toThrow();
56
+ });
57
+ it('does not throw for valid programs', () => {
58
+ expect(() => compileStrict(`
59
+ fn add(a: int, b: int) -> int {
60
+ return a + b;
61
+ }
62
+ fn test() {
63
+ let x: int = add(1, 2);
64
+ }
65
+ `)).not.toThrow();
66
+ });
67
+ });
68
+ describe('--lenient mode', () => {
69
+ it('does not throw on type errors in lenient mode', () => {
70
+ expect(() => compileLenient(`
71
+ fn test() {
72
+ let x: int = undeclared;
73
+ }
74
+ `)).not.toThrow();
75
+ });
76
+ it('returns type errors as warnings in lenient mode', () => {
77
+ const result = compileLenient(`
78
+ fn test() {
79
+ let x: int = undeclared;
80
+ }
81
+ `);
82
+ expect(result.warnings.length).toBeGreaterThan(0);
83
+ expect(result.warnings[0]).toContain('TypeError');
84
+ });
85
+ it('emits no warnings for valid programs in lenient mode', () => {
86
+ const result = compileLenient(`
87
+ fn test() {
88
+ let x: int = 5;
89
+ }
90
+ `);
91
+ expect(result.warnings).toHaveLength(0);
92
+ });
93
+ });
94
+ describe('int/float implicit conversion checks', () => {
95
+ it('detects int assigned to float variable', () => {
96
+ // int literal assigned to float — different types
97
+ const errors = typeCheck(`
98
+ fn test() {
99
+ let x: float = 5;
100
+ }
101
+ `);
102
+ expect(errors.length).toBeGreaterThan(0);
103
+ expect(errors[0].message).toContain('cannot implicitly convert int to float');
104
+ expect(errors[0].message).toContain('as float');
105
+ });
106
+ it('detects float assigned to int variable', () => {
107
+ const errors = typeCheck(`
108
+ fn get_f() -> float {
109
+ return 3.14;
110
+ }
111
+ fn test() {
112
+ let x: int = get_f();
113
+ }
114
+ `);
115
+ expect(errors.length).toBeGreaterThan(0);
116
+ expect(errors[0].message).toContain('cannot implicitly convert');
117
+ });
118
+ it('detects int/float return type mismatch', () => {
119
+ const errors = typeCheck(`
120
+ fn get_float() -> float {
121
+ return 5;
122
+ }
123
+ `);
124
+ expect(errors.length).toBeGreaterThan(0);
125
+ expect(errors[0].message).toContain('cannot implicitly convert int to float');
126
+ expect(errors[0].message).toContain('as float');
127
+ });
128
+ it('detects float/int return type mismatch', () => {
129
+ const errors = typeCheck(`
130
+ fn get_int() -> int {
131
+ return 3.14;
132
+ }
133
+ `);
134
+ expect(errors.length).toBeGreaterThan(0);
135
+ expect(errors[0].message).toContain('cannot implicitly convert float to int');
136
+ expect(errors[0].message).toContain('as int');
137
+ });
138
+ it('allows int assigned to int variable', () => {
139
+ const errors = typeCheck(`
140
+ fn test() {
141
+ let x: int = 5;
142
+ }
143
+ `);
144
+ expect(errors).toHaveLength(0);
145
+ });
146
+ it('allows float assigned to float variable', () => {
147
+ const errors = typeCheck(`
148
+ fn get_f() -> float {
149
+ return 3.14;
150
+ }
151
+ fn test() {
152
+ let x: float = get_f();
153
+ }
154
+ `);
155
+ expect(errors).toHaveLength(0);
156
+ });
157
+ it('blocks compilation on int→float mismatch', () => {
158
+ expect(() => compileStrict(`
159
+ fn get_float() -> float {
160
+ return 5;
161
+ }
162
+ `)).toThrow();
163
+ });
164
+ it('int→float mismatch demoted to warning in lenient mode', () => {
165
+ const result = compileLenient(`
166
+ fn get_float() -> float {
167
+ return 5;
168
+ }
169
+ `);
170
+ expect(result.warnings.length).toBeGreaterThan(0);
171
+ expect(result.warnings[0]).toContain('TypeError');
172
+ });
173
+ });
174
+ describe('redscript check command behavior', () => {
175
+ it('TypeChecker check() returns errors for type mismatches', () => {
176
+ const errors = typeCheck(`
177
+ fn test() {
178
+ let x: int = undeclared;
179
+ let y: bool = 1;
180
+ }
181
+ `);
182
+ expect(errors.length).toBeGreaterThanOrEqual(1);
183
+ });
184
+ it('TypeChecker check() returns empty array for valid programs', () => {
185
+ const errors = typeCheck(`
186
+ struct Point { x: int, y: int }
187
+
188
+ fn test() {
189
+ let p: Point = { x: 10, y: 20 };
190
+ let val: int = p.x;
191
+ }
192
+ `);
193
+ expect(errors).toHaveLength(0);
194
+ });
195
+ });
196
+ });
197
+ //# sourceMappingURL=typechecker-strict.test.js.map