redscript-mc 2.0.0 → 2.1.1

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 (643) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +48 -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 +321 -0
  22. package/dist/src/__tests__/mc-syntax.test.js +1 -6
  23. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  24. package/dist/src/__tests__/mc-version.test.js +154 -0
  25. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  26. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  27. package/dist/src/__tests__/modules.test.d.ts +7 -0
  28. package/dist/src/__tests__/modules.test.js +333 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  30. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  31. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  32. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  33. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  34. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  35. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  36. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  37. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  38. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  39. package/dist/src/__tests__/option.test.d.ts +14 -0
  40. package/dist/src/__tests__/option.test.js +275 -0
  41. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  42. package/dist/src/__tests__/schedule.test.js +98 -0
  43. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  44. package/dist/src/__tests__/sourcemap.test.js +227 -0
  45. package/dist/src/__tests__/stdlib-include.test.js +86 -0
  46. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  47. package/dist/src/__tests__/tuple.test.js +202 -0
  48. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  49. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  50. package/dist/src/ast/types.d.ts +56 -2
  51. package/dist/src/cache/deps.d.ts +41 -0
  52. package/dist/src/cache/deps.js +158 -0
  53. package/dist/src/cache/incremental.d.ts +35 -0
  54. package/dist/src/cache/incremental.js +165 -0
  55. package/dist/src/cache/index.d.ts +37 -0
  56. package/dist/src/cache/index.js +152 -0
  57. package/dist/src/cli.js +83 -45
  58. package/dist/src/compile.d.ts +3 -2
  59. package/dist/src/compile.js +34 -11
  60. package/dist/src/diagnostics/index.d.ts +1 -1
  61. package/dist/src/diagnostics/index.js +8 -11
  62. package/dist/src/emit/compile.d.ts +31 -0
  63. package/dist/src/emit/compile.js +143 -0
  64. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  65. package/dist/{src2 → src}/emit/index.js +59 -8
  66. package/dist/src/emit/modules.d.ts +29 -0
  67. package/dist/src/emit/modules.js +492 -0
  68. package/dist/src/emit/sourcemap.d.ts +53 -0
  69. package/dist/src/emit/sourcemap.js +73 -0
  70. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  71. package/dist/{src2 → src}/hir/lower.js +22 -1
  72. package/dist/src/hir/monomorphize.d.ts +22 -0
  73. package/dist/src/hir/monomorphize.js +379 -0
  74. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  75. package/dist/src/index.d.ts +19 -2
  76. package/dist/src/index.js +36 -14
  77. package/dist/src/lexer/index.d.ts +1 -1
  78. package/dist/src/lexer/index.js +1 -0
  79. package/dist/src/lir/budget.d.ts +37 -0
  80. package/dist/src/lir/budget.js +280 -0
  81. package/dist/{src2 → src}/lir/lower.js +19 -0
  82. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  83. package/dist/src/lsp/main.d.ts +8 -0
  84. package/dist/src/lsp/main.js +11 -0
  85. package/dist/src/lsp/server.d.ts +11 -0
  86. package/dist/src/lsp/server.js +403 -0
  87. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  88. package/dist/{src2 → src}/mir/lower.js +244 -10
  89. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  90. package/dist/src/optimizer/coroutine.d.ts +34 -0
  91. package/dist/src/optimizer/coroutine.js +789 -0
  92. package/dist/src/optimizer/dce.d.ts +8 -34
  93. package/dist/src/optimizer/dce.js +146 -629
  94. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  95. package/dist/src/optimizer/interprocedural.js +186 -0
  96. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  97. package/dist/src/optimizer/lir/const_imm.js +139 -0
  98. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  99. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  100. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  101. package/dist/src/optimizer/lir/peephole.js +52 -0
  102. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  103. package/dist/src/optimizer/lir/pipeline.js +34 -0
  104. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  105. package/dist/src/optimizer/nbt-batch.js +51 -0
  106. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  107. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  108. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  109. package/dist/src/optimizer/selector-cache.js +100 -0
  110. package/dist/src/optimizer/unroll.d.ts +32 -0
  111. package/dist/src/optimizer/unroll.js +348 -0
  112. package/dist/src/parser/index.d.ts +8 -0
  113. package/dist/src/parser/index.js +204 -14
  114. package/dist/src/repl.d.ts +1 -1
  115. package/dist/src/typechecker/index.d.ts +4 -0
  116. package/dist/src/typechecker/index.js +198 -13
  117. package/dist/src/types/mc-version.d.ts +24 -0
  118. package/dist/src/types/mc-version.js +49 -0
  119. package/docs/ROADMAP.md +395 -0
  120. package/docs/compiler-pipeline-redesign.md +27 -10
  121. package/editors/vscode/out/extension.js +25176 -8000
  122. package/editors/vscode/package-lock.json +90 -6
  123. package/editors/vscode/package.json +3 -2
  124. package/editors/vscode/src/extension.ts +97 -67
  125. package/editors/vscode/syntaxes/redscript.tmLanguage.json +34 -0
  126. package/examples/coroutine-demo.mcrs +50 -0
  127. package/examples/enum-demo.mcrs +95 -0
  128. package/examples/scheduler-demo.mcrs +59 -0
  129. package/examples/showcase.mcrs +3 -3
  130. package/jest.config.js +1 -1
  131. package/package.json +9 -3
  132. package/src/__tests__/budget.test.ts +297 -0
  133. package/src/__tests__/diagnostics.test.ts +2 -3
  134. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  135. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  136. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  137. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  138. package/src/__tests__/enum.test.ts +425 -0
  139. package/src/__tests__/generics.test.ts +390 -0
  140. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  141. package/src/__tests__/incremental.test.ts +337 -0
  142. package/src/__tests__/lsp.test.ts +359 -0
  143. package/src/__tests__/mc-syntax.test.ts +1 -7
  144. package/src/__tests__/mc-version.test.ts +178 -0
  145. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  146. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  147. package/src/__tests__/modules.test.ts +365 -0
  148. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  149. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  150. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  151. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  152. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  153. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  154. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  155. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  156. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  157. package/src/__tests__/option.test.ts +299 -0
  158. package/src/__tests__/schedule.test.ts +105 -0
  159. package/src/__tests__/sourcemap.test.ts +254 -0
  160. package/src/__tests__/stdlib-include.test.ts +61 -0
  161. package/src/__tests__/tuple.test.ts +220 -0
  162. package/src/__tests__/typechecker-strict.test.ts +216 -0
  163. package/src/ast/types.ts +33 -2
  164. package/src/cache/deps.ts +132 -0
  165. package/src/cache/incremental.ts +173 -0
  166. package/src/cache/index.ts +135 -0
  167. package/src/cli.ts +96 -45
  168. package/src/compile.ts +46 -17
  169. package/src/diagnostics/index.ts +8 -11
  170. package/src/emit/compile.ts +179 -0
  171. package/{src2 → src}/emit/index.ts +72 -8
  172. package/src/emit/modules.ts +581 -0
  173. package/src/emit/sourcemap.ts +101 -0
  174. package/{src2 → src}/hir/lower.ts +29 -2
  175. package/src/hir/monomorphize.ts +416 -0
  176. package/{src2 → src}/hir/types.ts +15 -3
  177. package/src/index.ts +29 -10
  178. package/src/lexer/index.ts +2 -1
  179. package/src/lir/budget.ts +321 -0
  180. package/{src2 → src}/lir/lower.ts +32 -1
  181. package/{src2 → src}/lir/types.ts +7 -3
  182. package/src/lsp/main.ts +9 -0
  183. package/src/lsp/server.ts +469 -0
  184. package/{src2 → src}/mir/lower.ts +251 -8
  185. package/{src2 → src}/mir/types.ts +12 -1
  186. package/src/optimizer/coroutine.ts +996 -0
  187. package/{src2 → src}/optimizer/dce.ts +2 -1
  188. package/src/optimizer/interprocedural.ts +177 -0
  189. package/src/optimizer/lir/const_imm.ts +143 -0
  190. package/src/optimizer/lir/dead_slot.ts +123 -0
  191. package/src/optimizer/lir/peephole.ts +57 -0
  192. package/src/optimizer/lir/pipeline.ts +37 -0
  193. package/src/optimizer/nbt-batch.ts +50 -0
  194. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  195. package/src/optimizer/selector-cache.ts +103 -0
  196. package/src/optimizer/unroll.ts +386 -0
  197. package/src/parser/index.ts +212 -15
  198. package/src/repl.ts +1 -1
  199. package/src/stdlib/math.mcrs +4 -4
  200. package/src/templates/quest.mcrs +4 -4
  201. package/src/typechecker/index.ts +215 -15
  202. package/src/types/mc-version.ts +46 -0
  203. package/tsconfig.json +1 -1
  204. package/.claude/commands/build-test.md +0 -10
  205. package/.claude/commands/deploy-demo.md +0 -12
  206. package/.claude/commands/stage-status.md +0 -13
  207. package/.claude/settings.json +0 -12
  208. package/CLAUDE.md +0 -231
  209. package/dist/__tests__/cli.test.js +0 -278
  210. package/dist/__tests__/codegen.test.js +0 -152
  211. package/dist/__tests__/compile-all.test.d.ts +0 -10
  212. package/dist/__tests__/compile-all.test.js +0 -108
  213. package/dist/__tests__/dce.test.js +0 -138
  214. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  215. package/dist/__tests__/diagnostics.test.js +0 -149
  216. package/dist/__tests__/e2e.test.d.ts +0 -6
  217. package/dist/__tests__/e2e.test.js +0 -1847
  218. package/dist/__tests__/entity-types.test.js +0 -203
  219. package/dist/__tests__/formatter.test.js +0 -40
  220. package/dist/__tests__/lexer.test.js +0 -343
  221. package/dist/__tests__/lowering.test.js +0 -1015
  222. package/dist/__tests__/macro.test.d.ts +0 -8
  223. package/dist/__tests__/macro.test.js +0 -305
  224. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  225. package/dist/__tests__/mc-integration.test.js +0 -819
  226. package/dist/__tests__/mc-syntax.test.js +0 -124
  227. package/dist/__tests__/nbt.test.js +0 -82
  228. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  229. package/dist/__tests__/optimizer.test.js +0 -149
  230. package/dist/__tests__/parser.test.d.ts +0 -1
  231. package/dist/__tests__/parser.test.js +0 -807
  232. package/dist/__tests__/repl.test.d.ts +0 -1
  233. package/dist/__tests__/repl.test.js +0 -27
  234. package/dist/__tests__/runtime.test.d.ts +0 -1
  235. package/dist/__tests__/runtime.test.js +0 -289
  236. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  237. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  238. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  239. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  240. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  241. package/dist/__tests__/stdlib-math.test.js +0 -352
  242. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  243. package/dist/__tests__/stdlib-vec.test.js +0 -264
  244. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  245. package/dist/__tests__/structure-optimizer.test.js +0 -33
  246. package/dist/__tests__/typechecker.test.d.ts +0 -1
  247. package/dist/__tests__/typechecker.test.js +0 -552
  248. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  249. package/dist/__tests__/var-allocator.test.js +0 -69
  250. package/dist/ast/types.d.ts +0 -514
  251. package/dist/ast/types.js +0 -9
  252. package/dist/builtins/metadata.d.ts +0 -36
  253. package/dist/builtins/metadata.js +0 -1014
  254. package/dist/cli.d.ts +0 -11
  255. package/dist/codegen/cmdblock/index.d.ts +0 -26
  256. package/dist/codegen/cmdblock/index.js +0 -45
  257. package/dist/codegen/mcfunction/index.d.ts +0 -40
  258. package/dist/codegen/mcfunction/index.js +0 -606
  259. package/dist/codegen/structure/index.d.ts +0 -24
  260. package/dist/codegen/structure/index.js +0 -279
  261. package/dist/codegen/var-allocator.d.ts +0 -45
  262. package/dist/codegen/var-allocator.js +0 -104
  263. package/dist/compile.d.ts +0 -68
  264. package/dist/data/arena/function/__load.mcfunction +0 -6
  265. package/dist/data/arena/function/__tick.mcfunction +0 -2
  266. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  267. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  268. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  269. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  270. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  271. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  272. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  273. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  274. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  275. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  276. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  277. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  278. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  279. package/dist/data/counter/function/__load.mcfunction +0 -5
  280. package/dist/data/counter/function/__tick.mcfunction +0 -2
  281. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  282. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  283. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  284. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  285. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  286. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  287. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  288. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  289. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  290. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  291. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  292. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  293. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  294. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  295. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  296. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  297. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  298. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  299. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  300. package/dist/data/gcd3/function/test.mcfunction +0 -7
  301. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  302. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  303. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  304. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  305. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  306. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  307. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  308. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  309. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  310. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  311. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  312. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  313. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  314. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  315. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  316. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  317. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  318. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  319. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  320. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  321. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  322. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  323. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  324. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  325. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  326. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  327. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  328. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  329. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  330. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  331. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  332. package/dist/data/mathtest/function/test.mcfunction +0 -5
  333. package/dist/data/minecraft/tags/function/load.json +0 -5
  334. package/dist/data/minecraft/tags/function/tick.json +0 -5
  335. package/dist/data/mypack/function/__load.mcfunction +0 -13
  336. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  337. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  338. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  339. package/dist/data/mypack/function/abs.mcfunction +0 -6
  340. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  341. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  342. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  343. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  346. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  347. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  348. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  352. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  353. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  354. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  357. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  358. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  359. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  360. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  361. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  365. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  366. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  367. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  368. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  369. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  370. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  371. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  372. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  373. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  374. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  375. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  376. package/dist/data/quiz/function/__load.mcfunction +0 -16
  377. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  378. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  379. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  380. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  381. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  382. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  383. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  384. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  386. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  387. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  388. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  389. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  390. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  391. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  392. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  393. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  394. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  395. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  396. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  397. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  398. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  399. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  400. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  402. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  403. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  404. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  405. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  406. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  407. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  408. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  409. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  410. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  411. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  412. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  413. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  414. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  415. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  416. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  417. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  418. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  419. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  420. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  421. package/dist/data/runtime/function/__load.mcfunction +0 -5
  422. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  423. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  424. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  425. package/dist/data/shop/function/__load.mcfunction +0 -7
  426. package/dist/data/shop/function/__tick.mcfunction +0 -3
  427. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  429. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  430. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  431. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  432. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  433. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  434. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  435. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  436. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  437. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  438. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  439. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  440. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  441. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  442. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  443. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  444. package/dist/data/turret/function/__load.mcfunction +0 -5
  445. package/dist/data/turret/function/__tick.mcfunction +0 -4
  446. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  447. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  448. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  449. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  450. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  451. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  452. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  453. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  454. package/dist/diagnostics/index.d.ts +0 -44
  455. package/dist/diagnostics/index.js +0 -140
  456. package/dist/events/types.d.ts +0 -35
  457. package/dist/events/types.js +0 -59
  458. package/dist/formatter/index.d.ts +0 -1
  459. package/dist/formatter/index.js +0 -26
  460. package/dist/gcd2.map.json +0 -15
  461. package/dist/gcd3.map.json +0 -17
  462. package/dist/gcd_test.map.json +0 -15
  463. package/dist/index.d.ts +0 -62
  464. package/dist/ir/builder.d.ts +0 -33
  465. package/dist/ir/builder.js +0 -99
  466. package/dist/ir/types.d.ts +0 -132
  467. package/dist/ir/types.js +0 -15
  468. package/dist/isqrttest.map.json +0 -15
  469. package/dist/lexer/index.d.ts +0 -37
  470. package/dist/lexer/index.js +0 -569
  471. package/dist/lowering/index.d.ts +0 -188
  472. package/dist/lowering/index.js +0 -3405
  473. package/dist/mathtest.map.json +0 -6
  474. package/dist/mc-test/client.d.ts +0 -128
  475. package/dist/mc-test/client.js +0 -174
  476. package/dist/mc-test/runner.d.ts +0 -28
  477. package/dist/mc-test/runner.js +0 -150
  478. package/dist/mc-test/setup.d.ts +0 -11
  479. package/dist/mc-test/setup.js +0 -98
  480. package/dist/mc-validator/index.d.ts +0 -17
  481. package/dist/mc-validator/index.js +0 -322
  482. package/dist/mypack.map.json +0 -27
  483. package/dist/nbt/index.d.ts +0 -86
  484. package/dist/nbt/index.js +0 -250
  485. package/dist/optimizer/commands.d.ts +0 -38
  486. package/dist/optimizer/commands.js +0 -451
  487. package/dist/optimizer/dce.d.ts +0 -34
  488. package/dist/optimizer/dce.js +0 -639
  489. package/dist/optimizer/passes.d.ts +0 -34
  490. package/dist/optimizer/passes.js +0 -243
  491. package/dist/optimizer/structure.d.ts +0 -9
  492. package/dist/optimizer/structure.js +0 -356
  493. package/dist/pack.mcmeta +0 -6
  494. package/dist/parser/index.d.ts +0 -93
  495. package/dist/parser/index.js +0 -1687
  496. package/dist/repl.d.ts +0 -16
  497. package/dist/repl.js +0 -165
  498. package/dist/reqtest.map.json +0 -4
  499. package/dist/reqtest2.map.json +0 -4
  500. package/dist/runtime/index.d.ts +0 -107
  501. package/dist/runtime/index.js +0 -1409
  502. package/dist/runtime.map.json +0 -7
  503. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  504. package/dist/src/__tests__/codegen.test.js +0 -152
  505. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  506. package/dist/src/__tests__/e2e.test.js +0 -1789
  507. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  508. package/dist/src/__tests__/entity-types.test.js +0 -203
  509. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  510. package/dist/src/__tests__/lowering.test.js +0 -1015
  511. package/dist/src/__tests__/macro.test.d.ts +0 -8
  512. package/dist/src/__tests__/macro.test.js +0 -306
  513. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  514. package/dist/src/__tests__/nbt.test.js +0 -82
  515. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  516. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  517. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  518. package/dist/src/__tests__/optimizer.test.js +0 -149
  519. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  520. package/dist/src/__tests__/runtime.test.js +0 -289
  521. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  522. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  523. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  524. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  525. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  526. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  527. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  528. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  529. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  530. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  531. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  532. package/dist/src/__tests__/var-allocator.test.js +0 -69
  533. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  534. package/dist/src/codegen/cmdblock/index.js +0 -45
  535. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  536. package/dist/src/codegen/mcfunction/index.js +0 -606
  537. package/dist/src/codegen/structure/index.d.ts +0 -24
  538. package/dist/src/codegen/structure/index.js +0 -279
  539. package/dist/src/codegen/var-allocator.d.ts +0 -45
  540. package/dist/src/codegen/var-allocator.js +0 -104
  541. package/dist/src/ir/builder.d.ts +0 -33
  542. package/dist/src/ir/builder.js +0 -99
  543. package/dist/src/ir/types.d.ts +0 -132
  544. package/dist/src/ir/types.js +0 -15
  545. package/dist/src/lowering/index.d.ts +0 -188
  546. package/dist/src/lowering/index.js +0 -3405
  547. package/dist/src/optimizer/commands.d.ts +0 -38
  548. package/dist/src/optimizer/commands.js +0 -451
  549. package/dist/src/optimizer/passes.d.ts +0 -34
  550. package/dist/src/optimizer/passes.js +0 -243
  551. package/dist/src/optimizer/structure.d.ts +0 -9
  552. package/dist/src/optimizer/structure.js +0 -356
  553. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  554. package/dist/src2/emit/compile.d.ts +0 -19
  555. package/dist/src2/emit/compile.js +0 -80
  556. package/dist/src2/optimizer/dce.d.ts +0 -8
  557. package/dist/src2/optimizer/dce.js +0 -155
  558. package/dist/swap_test.map.json +0 -14
  559. package/dist/tsconfig.tsbuildinfo +0 -1
  560. package/dist/typechecker/index.d.ts +0 -61
  561. package/dist/typechecker/index.js +0 -1034
  562. package/dist/types/entity-hierarchy.d.ts +0 -29
  563. package/dist/types/entity-hierarchy.js +0 -107
  564. package/examples/spiral.mcrs +0 -43
  565. package/src/examples/arena.mcrs +0 -44
  566. package/src/examples/counter.mcrs +0 -12
  567. package/src/examples/new_features_demo.mcrs +0 -193
  568. package/src/examples/rpg.mcrs +0 -13
  569. package/src/examples/stdlib_demo.mcrs +0 -181
  570. package/src2/emit/compile.ts +0 -99
  571. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  572. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  576. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  578. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  579. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  580. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  581. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  582. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  583. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  584. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  585. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  586. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  587. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  588. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  589. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  590. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  592. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  593. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  594. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  595. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  596. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  597. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  598. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  599. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  600. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  601. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  602. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  603. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  604. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  605. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  606. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  607. /package/dist/{__tests__/optimizer.test.d.ts → src/__tests__/stdlib-include.test.d.ts} +0 -0
  608. /package/dist/{src2 → src}/hir/types.js +0 -0
  609. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  610. /package/dist/{src2 → src}/lir/types.js +0 -0
  611. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  612. /package/dist/{src2 → src}/lir/verify.js +0 -0
  613. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  614. /package/dist/{src2 → src}/mir/macro.js +0 -0
  615. /package/dist/{src2 → src}/mir/types.js +0 -0
  616. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  617. /package/dist/{src2 → src}/mir/verify.js +0 -0
  618. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  619. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  620. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  621. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  622. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  623. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  624. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  625. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  626. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  627. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  628. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  629. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  630. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  631. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  632. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  633. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  634. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  635. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  636. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  637. /package/{src2 → src}/lir/verify.ts +0 -0
  638. /package/{src2 → src}/mir/macro.ts +0 -0
  639. /package/{src2 → src}/mir/verify.ts +0 -0
  640. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  641. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  642. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  643. /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
@@ -0,0 +1,308 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for incremental compilation: FileCache, DependencyGraph, and
4
+ * compileIncremental.
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const os = __importStar(require("os"));
43
+ const index_1 = require("../cache/index");
44
+ const deps_1 = require("../cache/deps");
45
+ const incremental_1 = require("../cache/incremental");
46
+ /** Create a temp directory for test files. */
47
+ function makeTmpDir() {
48
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'redscript-test-'));
49
+ }
50
+ /** Write a .mcrs file and return its absolute path. */
51
+ function writeFile(dir, name, content) {
52
+ const filePath = path.join(dir, name);
53
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
54
+ fs.writeFileSync(filePath, content);
55
+ return filePath;
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // FileCache
59
+ // ---------------------------------------------------------------------------
60
+ describe('FileCache', () => {
61
+ let tmpDir;
62
+ let cacheDir;
63
+ beforeEach(() => {
64
+ tmpDir = makeTmpDir();
65
+ cacheDir = path.join(tmpDir, '.redscript-cache');
66
+ });
67
+ afterEach(() => {
68
+ fs.rmSync(tmpDir, { recursive: true, force: true });
69
+ });
70
+ test('hashFile returns consistent SHA-256 hex', () => {
71
+ const f = writeFile(tmpDir, 'a.mcrs', 'fn main() {}');
72
+ const h1 = (0, index_1.hashFile)(f);
73
+ const h2 = (0, index_1.hashFile)(f);
74
+ expect(h1).toBe(h2);
75
+ expect(h1).toMatch(/^[0-9a-f]{64}$/);
76
+ });
77
+ test('hashFile changes when file content changes', () => {
78
+ const f = writeFile(tmpDir, 'a.mcrs', 'fn main() {}');
79
+ const h1 = (0, index_1.hashFile)(f);
80
+ fs.writeFileSync(f, 'fn main() { let x: int = 1; }');
81
+ const h2 = (0, index_1.hashFile)(f);
82
+ expect(h1).not.toBe(h2);
83
+ });
84
+ test('hasChanged returns true for unknown file', () => {
85
+ const cache = new index_1.FileCache(cacheDir);
86
+ const f = writeFile(tmpDir, 'a.mcrs', 'fn main() {}');
87
+ expect(cache.hasChanged(f)).toBe(true);
88
+ });
89
+ test('hasChanged returns false after update', () => {
90
+ const cache = new index_1.FileCache(cacheDir);
91
+ const f = writeFile(tmpDir, 'a.mcrs', 'fn main() {}');
92
+ cache.update(f);
93
+ expect(cache.hasChanged(f)).toBe(false);
94
+ });
95
+ test('hasChanged returns true after file modification', () => {
96
+ const cache = new index_1.FileCache(cacheDir);
97
+ const f = writeFile(tmpDir, 'a.mcrs', 'fn main() {}');
98
+ cache.update(f);
99
+ // Modify file (need to change mtime)
100
+ const now = Date.now();
101
+ fs.utimesSync(f, new Date(now + 2000), new Date(now + 2000));
102
+ fs.writeFileSync(f, 'fn main() { let x: int = 42; }');
103
+ expect(cache.hasChanged(f)).toBe(true);
104
+ });
105
+ test('save and load persists hashes', () => {
106
+ const cache = new index_1.FileCache(cacheDir);
107
+ const f = writeFile(tmpDir, 'a.mcrs', 'fn main() {}');
108
+ cache.update(f);
109
+ cache.save();
110
+ const cache2 = new index_1.FileCache(cacheDir);
111
+ cache2.load();
112
+ // File hasn't changed — should still be cached
113
+ expect(cache2.hasChanged(f)).toBe(false);
114
+ });
115
+ test('load handles missing cache gracefully', () => {
116
+ const cache = new index_1.FileCache(cacheDir);
117
+ cache.load(); // no file — should not throw
118
+ expect(cache.size).toBe(0);
119
+ });
120
+ });
121
+ // ---------------------------------------------------------------------------
122
+ // DependencyGraph
123
+ // ---------------------------------------------------------------------------
124
+ describe('DependencyGraph', () => {
125
+ let tmpDir;
126
+ beforeEach(() => {
127
+ tmpDir = makeTmpDir();
128
+ });
129
+ afterEach(() => {
130
+ fs.rmSync(tmpDir, { recursive: true, force: true });
131
+ });
132
+ test('parseImports extracts import paths', () => {
133
+ const f = writeFile(tmpDir, 'main.mcrs', [
134
+ 'import "lib.mcrs";',
135
+ 'import "util.mcrs";',
136
+ '',
137
+ 'fn main() {}',
138
+ ].join('\n'));
139
+ const imports = (0, deps_1.parseImports)(f);
140
+ expect(imports).toHaveLength(2);
141
+ expect(imports[0]).toBe(path.resolve(tmpDir, 'lib.mcrs'));
142
+ expect(imports[1]).toBe(path.resolve(tmpDir, 'util.mcrs'));
143
+ });
144
+ test('parseImports stops at non-import line', () => {
145
+ const f = writeFile(tmpDir, 'main.mcrs', [
146
+ 'import "lib.mcrs";',
147
+ 'fn main() {}',
148
+ 'import "late.mcrs";', // should NOT be parsed
149
+ ].join('\n'));
150
+ const imports = (0, deps_1.parseImports)(f);
151
+ expect(imports).toHaveLength(1);
152
+ });
153
+ test('parseImports skips comments and blank lines in header', () => {
154
+ const f = writeFile(tmpDir, 'main.mcrs', [
155
+ '// Main file',
156
+ '',
157
+ 'import "lib.mcrs";',
158
+ '',
159
+ 'fn main() {}',
160
+ ].join('\n'));
161
+ const imports = (0, deps_1.parseImports)(f);
162
+ expect(imports).toHaveLength(1);
163
+ });
164
+ test('getDirectDeps returns direct imports', () => {
165
+ writeFile(tmpDir, 'lib.mcrs', 'fn helper() {}');
166
+ const main = writeFile(tmpDir, 'main.mcrs', 'import "lib.mcrs";\nfn main() {}');
167
+ const graph = new deps_1.DependencyGraph();
168
+ graph.addFile(main);
169
+ const deps = graph.getDirectDeps(main);
170
+ expect(deps.size).toBe(1);
171
+ expect(deps.has(path.resolve(tmpDir, 'lib.mcrs'))).toBe(true);
172
+ });
173
+ test('getTransitiveDeps follows transitive imports', () => {
174
+ const c = writeFile(tmpDir, 'c.mcrs', 'fn c() {}');
175
+ const b = writeFile(tmpDir, 'b.mcrs', 'import "c.mcrs";\nfn b() {}');
176
+ const a = writeFile(tmpDir, 'a.mcrs', 'import "b.mcrs";\nfn a() {}');
177
+ const graph = new deps_1.DependencyGraph();
178
+ graph.addFile(a);
179
+ graph.addFile(b);
180
+ graph.addFile(c);
181
+ const deps = graph.getTransitiveDeps(a);
182
+ expect(deps.has(path.resolve(tmpDir, 'b.mcrs'))).toBe(true);
183
+ expect(deps.has(path.resolve(tmpDir, 'c.mcrs'))).toBe(true);
184
+ });
185
+ test('getDependents returns reverse dependents', () => {
186
+ writeFile(tmpDir, 'lib.mcrs', 'fn helper() {}');
187
+ const main1 = writeFile(tmpDir, 'main1.mcrs', 'import "lib.mcrs";\nfn main1() {}');
188
+ const main2 = writeFile(tmpDir, 'main2.mcrs', 'import "lib.mcrs";\nfn main2() {}');
189
+ const graph = new deps_1.DependencyGraph();
190
+ graph.addFile(main1);
191
+ graph.addFile(main2);
192
+ const dependents = graph.getDependents(path.resolve(tmpDir, 'lib.mcrs'));
193
+ expect(dependents.has(path.resolve(tmpDir, 'main1.mcrs'))).toBe(true);
194
+ expect(dependents.has(path.resolve(tmpDir, 'main2.mcrs'))).toBe(true);
195
+ });
196
+ test('computeDirtySet includes changed files and their dependents', () => {
197
+ const lib = writeFile(tmpDir, 'lib.mcrs', 'fn helper() {}');
198
+ const main = writeFile(tmpDir, 'main.mcrs', 'import "lib.mcrs";\nfn main() {}');
199
+ const other = writeFile(tmpDir, 'other.mcrs', 'fn other() {}');
200
+ const graph = new deps_1.DependencyGraph();
201
+ graph.addFile(main);
202
+ graph.addFile(other);
203
+ const dirty = graph.computeDirtySet(new Set([lib]));
204
+ expect(dirty.has(path.resolve(tmpDir, 'lib.mcrs'))).toBe(true);
205
+ expect(dirty.has(path.resolve(tmpDir, 'main.mcrs'))).toBe(true);
206
+ expect(dirty.has(path.resolve(tmpDir, 'other.mcrs'))).toBe(false);
207
+ });
208
+ });
209
+ // ---------------------------------------------------------------------------
210
+ // compileIncremental (end-to-end)
211
+ // ---------------------------------------------------------------------------
212
+ describe('compileIncremental', () => {
213
+ let tmpDir;
214
+ let cacheDir;
215
+ let outDir;
216
+ beforeEach(() => {
217
+ tmpDir = makeTmpDir();
218
+ cacheDir = path.join(tmpDir, '.redscript-cache');
219
+ outDir = path.join(tmpDir, 'out');
220
+ (0, incremental_1.resetCompileCache)();
221
+ });
222
+ afterEach(() => {
223
+ fs.rmSync(tmpDir, { recursive: true, force: true });
224
+ });
225
+ test('first compile: all files compiled (cache miss)', () => {
226
+ const a = writeFile(tmpDir, 'a.mcrs', 'fn a_func() { let x: int = 1; }');
227
+ const b = writeFile(tmpDir, 'b.mcrs', 'fn b_func() { let y: int = 2; }');
228
+ const cache = new index_1.FileCache(cacheDir);
229
+ const depGraph = new deps_1.DependencyGraph();
230
+ const result = (0, incremental_1.compileIncremental)([a, b], cache, depGraph, {
231
+ output: outDir,
232
+ });
233
+ expect(result.recompiled).toBe(2);
234
+ expect(result.cached).toBe(0);
235
+ expect(result.errors.size).toBe(0);
236
+ });
237
+ test('second compile (no changes): all files cached', () => {
238
+ const a = writeFile(tmpDir, 'a.mcrs', 'fn a_func() { let x: int = 1; }');
239
+ const b = writeFile(tmpDir, 'b.mcrs', 'fn b_func() { let y: int = 2; }');
240
+ const cache = new index_1.FileCache(cacheDir);
241
+ const depGraph = new deps_1.DependencyGraph();
242
+ // First compile
243
+ (0, incremental_1.compileIncremental)([a, b], cache, depGraph, { output: outDir });
244
+ // Second compile — no changes
245
+ const result = (0, incremental_1.compileIncremental)([a, b], cache, depGraph, { output: outDir });
246
+ expect(result.recompiled).toBe(0);
247
+ expect(result.cached).toBe(2);
248
+ expect(result.errors.size).toBe(0);
249
+ });
250
+ test('modify one file: only that file recompiled', () => {
251
+ const a = writeFile(tmpDir, 'a.mcrs', 'fn a_func() { let x: int = 1; }');
252
+ const b = writeFile(tmpDir, 'b.mcrs', 'fn b_func() { let y: int = 2; }');
253
+ const cache = new index_1.FileCache(cacheDir);
254
+ const depGraph = new deps_1.DependencyGraph();
255
+ // First compile
256
+ (0, incremental_1.compileIncremental)([a, b], cache, depGraph, { output: outDir });
257
+ // Modify file a
258
+ fs.writeFileSync(a, 'fn a_func() { let x: int = 42; }');
259
+ // Ensure mtime changes
260
+ const now = Date.now();
261
+ fs.utimesSync(a, new Date(now + 2000), new Date(now + 2000));
262
+ const result = (0, incremental_1.compileIncremental)([a, b], cache, depGraph, { output: outDir });
263
+ expect(result.recompiled).toBe(1);
264
+ expect(result.cached).toBe(1);
265
+ expect(result.errors.size).toBe(0);
266
+ });
267
+ test('modify dependency: all dependent files recompiled', () => {
268
+ const lib = writeFile(tmpDir, 'lib.mcrs', 'fn helper() { let h: int = 0; }');
269
+ const main1 = writeFile(tmpDir, 'main1.mcrs', 'import "lib.mcrs";\nfn main1() { helper(); }');
270
+ const main2 = writeFile(tmpDir, 'main2.mcrs', 'import "lib.mcrs";\nfn main2() { helper(); }');
271
+ const other = writeFile(tmpDir, 'other.mcrs', 'fn other() { let o: int = 0; }');
272
+ const cache = new index_1.FileCache(cacheDir);
273
+ const depGraph = new deps_1.DependencyGraph();
274
+ // First compile
275
+ (0, incremental_1.compileIncremental)([main1, main2, other], cache, depGraph, { output: outDir });
276
+ expect(cache.get(path.resolve(main1))).toBeDefined();
277
+ // Modify lib (a dependency, not an entry file itself)
278
+ fs.writeFileSync(lib, 'fn helper() { let h: int = 99; }');
279
+ const now = Date.now();
280
+ fs.utimesSync(lib, new Date(now + 2000), new Date(now + 2000));
281
+ const result = (0, incremental_1.compileIncremental)([main1, main2, other], cache, depGraph, { output: outDir });
282
+ // main1 and main2 depend on lib → recompiled; other is unrelated → cached
283
+ expect(result.recompiled).toBe(2);
284
+ expect(result.cached).toBe(1);
285
+ expect(result.errors.size).toBe(0);
286
+ });
287
+ test('output files are written to disk', () => {
288
+ writeFile(tmpDir, 'a.mcrs', 'fn a_func() { let x: int = 1; }');
289
+ const a = path.join(tmpDir, 'a.mcrs');
290
+ const cache = new index_1.FileCache(cacheDir);
291
+ const depGraph = new deps_1.DependencyGraph();
292
+ (0, incremental_1.compileIncremental)([a], cache, depGraph, { output: outDir });
293
+ // Output directory should exist with generated files
294
+ expect(fs.existsSync(outDir)).toBe(true);
295
+ const files = fs.readdirSync(outDir, { recursive: true });
296
+ expect(files.length).toBeGreaterThan(0);
297
+ });
298
+ test('compile errors are captured without crashing', () => {
299
+ // Invalid syntax
300
+ const bad = writeFile(tmpDir, 'bad.mcrs', 'fn { broken syntax !!!!');
301
+ const cache = new index_1.FileCache(cacheDir);
302
+ const depGraph = new deps_1.DependencyGraph();
303
+ const result = (0, incremental_1.compileIncremental)([bad], cache, depGraph, { output: outDir });
304
+ expect(result.errors.size).toBe(1);
305
+ expect(result.recompiled).toBe(0);
306
+ });
307
+ });
308
+ //# sourceMappingURL=incremental.test.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * LSP Server Tests
3
+ *
4
+ * Tests the internal logic of the LSP server without starting an actual
5
+ * stdio process. We test the helper functions and document parsing logic.
6
+ */
7
+ export {};
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ /**
3
+ * LSP Server Tests
4
+ *
5
+ * Tests the internal logic of the LSP server without starting an actual
6
+ * stdio process. We test the helper functions and document parsing logic.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const lexer_1 = require("../lexer");
10
+ const parser_1 = require("../parser");
11
+ const typechecker_1 = require("../typechecker");
12
+ const diagnostics_1 = require("../diagnostics");
13
+ const metadata_1 = require("../builtins/metadata");
14
+ // ---------------------------------------------------------------------------
15
+ // Helpers mirrored from lsp/server.ts (tested independently)
16
+ // ---------------------------------------------------------------------------
17
+ function typeToString(t) {
18
+ switch (t.kind) {
19
+ case 'named': return t.name;
20
+ case 'array': return `${typeToString(t.elem)}[]`;
21
+ case 'struct': return t.name;
22
+ case 'enum': return t.name;
23
+ case 'entity': return t.entityType;
24
+ case 'selector': return t.entityType ? `selector<${t.entityType}>` : 'selector';
25
+ case 'tuple': return `(${t.elements.map(typeToString).join(', ')})`;
26
+ case 'function_type':
27
+ return `(${t.params.map(typeToString).join(', ')}) => ${typeToString(t.return)}`;
28
+ default:
29
+ return 'unknown';
30
+ }
31
+ }
32
+ function formatFnSignature(fn) {
33
+ const params = fn.params.map(p => `${p.name}: ${typeToString(p.type)}`).join(', ');
34
+ const ret = typeToString(fn.returnType);
35
+ const typeParams = fn.typeParams?.length ? `<${fn.typeParams.join(', ')}>` : '';
36
+ return `fn ${fn.name}${typeParams}(${params}): ${ret}`;
37
+ }
38
+ function parseSource(source) {
39
+ const errors = [];
40
+ let program = null;
41
+ try {
42
+ const tokens = new lexer_1.Lexer(source).tokenize();
43
+ program = new parser_1.Parser(tokens, source).parse('test');
44
+ }
45
+ catch (err) {
46
+ if (err instanceof diagnostics_1.DiagnosticError)
47
+ errors.push(err);
48
+ else
49
+ errors.push(new diagnostics_1.DiagnosticError('ParseError', err.message, { line: 1, col: 1 }));
50
+ return { program: null, errors };
51
+ }
52
+ try {
53
+ const checker = new typechecker_1.TypeChecker(source);
54
+ errors.push(...checker.check(program));
55
+ }
56
+ catch {
57
+ // TypeChecker errors are collected, not thrown
58
+ }
59
+ return { program, errors };
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // Diagnostics
63
+ // ---------------------------------------------------------------------------
64
+ describe('LSP diagnostics', () => {
65
+ it('parses valid source without errors', () => {
66
+ const source = `fn greet(): void {}`;
67
+ const { errors } = parseSource(source);
68
+ expect(errors).toHaveLength(0);
69
+ });
70
+ it('reports a parse error for invalid syntax', () => {
71
+ const source = `fn broken( {`;
72
+ const { errors } = parseSource(source);
73
+ expect(errors.length).toBeGreaterThan(0);
74
+ expect(errors[0]).toBeInstanceOf(diagnostics_1.DiagnosticError);
75
+ });
76
+ it('collects type errors for wrong argument count', () => {
77
+ const source = `
78
+ fn add(a: int, b: int): int {
79
+ return a + b;
80
+ }
81
+
82
+ fn main(): void {
83
+ add(1);
84
+ }
85
+ `;
86
+ const { errors } = parseSource(source);
87
+ // Type checker may or may not catch arity; at minimum we get a parsed program
88
+ // The important thing is no crash
89
+ expect(errors).toBeDefined();
90
+ });
91
+ });
92
+ // ---------------------------------------------------------------------------
93
+ // Hover / type display
94
+ // ---------------------------------------------------------------------------
95
+ describe('LSP hover — typeToString', () => {
96
+ it('formats named types', () => {
97
+ expect(typeToString({ kind: 'named', name: 'int' })).toBe('int');
98
+ expect(typeToString({ kind: 'named', name: 'bool' })).toBe('bool');
99
+ expect(typeToString({ kind: 'named', name: 'void' })).toBe('void');
100
+ });
101
+ it('formats array types', () => {
102
+ expect(typeToString({ kind: 'array', elem: { kind: 'named', name: 'int' } })).toBe('int[]');
103
+ });
104
+ it('formats function types', () => {
105
+ const t = {
106
+ kind: 'function_type',
107
+ params: [{ kind: 'named', name: 'int' }, { kind: 'named', name: 'int' }],
108
+ return: { kind: 'named', name: 'bool' },
109
+ };
110
+ expect(typeToString(t)).toBe('(int, int) => bool');
111
+ });
112
+ it('formats tuple types', () => {
113
+ const t = {
114
+ kind: 'tuple',
115
+ elements: [{ kind: 'named', name: 'int' }, { kind: 'named', name: 'bool' }],
116
+ };
117
+ expect(typeToString(t)).toBe('(int, bool)');
118
+ });
119
+ it('formats entity types', () => {
120
+ expect(typeToString({ kind: 'entity', entityType: 'Player' })).toBe('Player');
121
+ expect(typeToString({ kind: 'entity', entityType: 'Zombie' })).toBe('Zombie');
122
+ });
123
+ it('formats selector types', () => {
124
+ expect(typeToString({ kind: 'selector' })).toBe('selector');
125
+ expect(typeToString({ kind: 'selector', entityType: 'Player' })).toBe('selector<Player>');
126
+ });
127
+ });
128
+ describe('LSP hover — formatFnSignature', () => {
129
+ it('formats a simple function', () => {
130
+ const source = `fn add(a: int, b: int): int { return a + b; }`;
131
+ const { program } = parseSource(source);
132
+ expect(program).toBeTruthy();
133
+ const fn = program.declarations.find(f => f.name === 'add');
134
+ expect(fn).toBeTruthy();
135
+ expect(formatFnSignature(fn)).toBe('fn add(a: int, b: int): int');
136
+ });
137
+ it('formats a void function with no params', () => {
138
+ const source = `fn start(): void {}`;
139
+ const { program } = parseSource(source);
140
+ expect(program).toBeTruthy();
141
+ const fn = program.declarations[0];
142
+ expect(formatFnSignature(fn)).toBe('fn start(): void');
143
+ });
144
+ it('formats a generic function', () => {
145
+ const source = `fn identity<T>(x: T): T { return x; }`;
146
+ const { program } = parseSource(source);
147
+ expect(program).toBeTruthy();
148
+ const fn = program.declarations[0];
149
+ expect(formatFnSignature(fn)).toBe('fn identity<T>(x: T): T');
150
+ });
151
+ });
152
+ // ---------------------------------------------------------------------------
153
+ // Go-to-definition map
154
+ // ---------------------------------------------------------------------------
155
+ describe('LSP go-to-definition', () => {
156
+ it('finds function spans in parsed program', () => {
157
+ const source = `
158
+ fn helper(): void {}
159
+
160
+ fn main(): void {
161
+ helper();
162
+ }
163
+ `;
164
+ const { program } = parseSource(source);
165
+ expect(program).toBeTruthy();
166
+ const helperFn = program.declarations.find(f => f.name === 'helper');
167
+ expect(helperFn).toBeTruthy();
168
+ // Span should have line info
169
+ expect(helperFn.span).toBeDefined();
170
+ expect(helperFn.span.line).toBeGreaterThan(0);
171
+ });
172
+ it('finds struct spans', () => {
173
+ const source = `
174
+ struct Point {
175
+ x: int,
176
+ y: int,
177
+ }
178
+ `;
179
+ const { program } = parseSource(source);
180
+ expect(program).toBeTruthy();
181
+ const s = program.structs.find(s => s.name === 'Point');
182
+ expect(s).toBeTruthy();
183
+ expect(s.span).toBeDefined();
184
+ });
185
+ it('finds enum spans', () => {
186
+ const source = `
187
+ enum Color {
188
+ Red,
189
+ Green,
190
+ Blue,
191
+ }
192
+ `;
193
+ const { program } = parseSource(source);
194
+ expect(program).toBeTruthy();
195
+ const e = program.enums.find(e => e.name === 'Color');
196
+ expect(e).toBeTruthy();
197
+ expect(e.span).toBeDefined();
198
+ });
199
+ });
200
+ // ---------------------------------------------------------------------------
201
+ // Completion items (static list sanity check)
202
+ // ---------------------------------------------------------------------------
203
+ describe('LSP completion', () => {
204
+ const KEYWORDS = ['fn', 'let', 'if', 'else', 'while', 'return', 'struct', 'enum'];
205
+ const TYPES = ['int', 'bool', 'float', 'string', 'void', 'Player'];
206
+ const BUILTINS = ['say', 'tell', 'give', 'kill', 'summon', 'setTimeout'];
207
+ it('contains expected keywords', () => {
208
+ for (const kw of KEYWORDS) {
209
+ expect(kw).toBeTruthy();
210
+ }
211
+ });
212
+ it('contains expected builtin types', () => {
213
+ for (const t of TYPES) {
214
+ expect(t).toBeTruthy();
215
+ }
216
+ });
217
+ it('contains expected builtin functions', () => {
218
+ for (const fn of BUILTINS) {
219
+ expect(fn).toBeTruthy();
220
+ }
221
+ });
222
+ it('parses user functions and they can be listed', () => {
223
+ const source = `
224
+ fn myCustomFn(): void {}
225
+ fn anotherFn(x: int): int { return x; }
226
+ `;
227
+ const { program } = parseSource(source);
228
+ expect(program).toBeTruthy();
229
+ const names = program.declarations.map(f => f.name);
230
+ expect(names).toContain('myCustomFn');
231
+ expect(names).toContain('anotherFn');
232
+ });
233
+ });
234
+ // ---------------------------------------------------------------------------
235
+ // Hover — builtin functions
236
+ // ---------------------------------------------------------------------------
237
+ const DECORATOR_DOCS = {
238
+ tick: 'Runs every MC game tick (~20 Hz). No arguments.',
239
+ load: 'Runs on `/reload`. Use for initialization logic.',
240
+ coroutine: 'Splits loops into tick-spread continuations. Arg: `batch=N` (steps per tick, default 1).',
241
+ schedule: 'Schedules the function to run after N ticks. Arg: `ticks=N`.',
242
+ on_trigger: 'Runs when a trigger scoreboard objective is set by a player. Arg: trigger name.',
243
+ keep: 'Prevents the compiler from dead-code-eliminating this function.',
244
+ on: 'Generic event handler decorator.',
245
+ on_advancement: 'Runs when a player earns an advancement. Arg: advancement id.',
246
+ on_craft: 'Runs when a player crafts an item. Arg: item id.',
247
+ on_death: 'Runs when a player dies.',
248
+ on_join_team: 'Runs when a player joins a team. Arg: team name.',
249
+ on_login: 'Runs when a player logs in.',
250
+ };
251
+ describe('LSP hover — builtin functions', () => {
252
+ it('has metadata for say', () => {
253
+ const b = metadata_1.BUILTIN_METADATA['say'];
254
+ expect(b).toBeDefined();
255
+ expect(b.params.length).toBeGreaterThan(0);
256
+ expect(b.returns).toBe('void');
257
+ expect(b.doc).toBeTruthy();
258
+ });
259
+ it('has metadata for kill', () => {
260
+ const b = metadata_1.BUILTIN_METADATA['kill'];
261
+ expect(b).toBeDefined();
262
+ expect(b.returns).toBe('void');
263
+ });
264
+ it('has metadata for tellraw', () => {
265
+ const b = metadata_1.BUILTIN_METADATA['tellraw'];
266
+ expect(b).toBeDefined();
267
+ const paramStr = b.params.map(p => `${p.name}: ${p.type}${p.required ? '' : '?'}`).join(', ');
268
+ const sig = `fn ${b.name}(${paramStr}): ${b.returns}`;
269
+ expect(sig).toMatch(/^fn tellraw/);
270
+ expect(sig).toContain('target');
271
+ });
272
+ it('formats builtin hover markdown', () => {
273
+ const b = metadata_1.BUILTIN_METADATA['particle'];
274
+ expect(b).toBeDefined();
275
+ const paramStr = b.params.map(p => `${p.name}: ${p.type}${p.required ? '' : '?'}`).join(', ');
276
+ const sig = `fn ${b.name}(${paramStr}): ${b.returns}`;
277
+ const markdown = `\`\`\`redscript\n${sig}\n\`\`\`\n${b.doc}`;
278
+ expect(markdown).toContain('```redscript');
279
+ expect(markdown).toContain('fn particle');
280
+ expect(markdown).toContain(b.doc);
281
+ });
282
+ });
283
+ // ---------------------------------------------------------------------------
284
+ // Hover — decorators
285
+ // ---------------------------------------------------------------------------
286
+ describe('LSP hover — decorators', () => {
287
+ it('has docs for @tick', () => {
288
+ expect(DECORATOR_DOCS['tick']).toContain('tick');
289
+ });
290
+ it('has docs for @load', () => {
291
+ expect(DECORATOR_DOCS['load']).toContain('reload');
292
+ });
293
+ it('has docs for @coroutine', () => {
294
+ expect(DECORATOR_DOCS['coroutine']).toContain('batch');
295
+ });
296
+ it('has docs for @schedule', () => {
297
+ expect(DECORATOR_DOCS['schedule']).toContain('ticks');
298
+ });
299
+ it('has docs for @on_trigger', () => {
300
+ expect(DECORATOR_DOCS['on_trigger']).toContain('trigger');
301
+ });
302
+ it('formats decorator hover markdown', () => {
303
+ const name = 'tick';
304
+ const doc = DECORATOR_DOCS[name];
305
+ const markdown = `**@${name}** — ${doc}`;
306
+ expect(markdown).toBe(`**@tick** — ${DECORATOR_DOCS['tick']}`);
307
+ });
308
+ });
309
+ // ---------------------------------------------------------------------------
310
+ // Server module import (smoke test — does not start stdio)
311
+ // ---------------------------------------------------------------------------
312
+ describe('LSP server module', () => {
313
+ it('can be required without crashing', () => {
314
+ // The server module calls createConnection() which requires stdio;
315
+ // we test only that the module-level imports and helper functions work.
316
+ expect(() => {
317
+ typeToString({ kind: 'named', name: 'int' });
318
+ }).not.toThrow();
319
+ });
320
+ });
321
+ //# sourceMappingURL=lsp.test.js.map
@@ -38,7 +38,7 @@ const path = __importStar(require("path"));
38
38
  const compile_1 = require("../compile");
39
39
  const mc_validator_1 = require("../mc-validator");
40
40
  const FIXTURE_PATH = path.join(__dirname, 'fixtures', 'mc-commands-1.21.4.json');
41
- const EXAMPLES = ['counter', 'arena', 'shop', 'quiz', 'turret'];
41
+ const EXAMPLES = ['shop', 'quiz', 'turret'];
42
42
  function getCommands(source, namespace = 'test') {
43
43
  const result = (0, compile_1.compile)(source, { namespace });
44
44
  expect(result.success).toBe(true);
@@ -56,11 +56,6 @@ function validateSource(validator, source, namespace) {
56
56
  }
57
57
  describe('MC Command Syntax Validation', () => {
58
58
  const validator = new mc_validator_1.MCCommandValidator(FIXTURE_PATH);
59
- test('counter example generates valid MC commands', () => {
60
- const src = fs.readFileSync(path.join(__dirname, '..', 'examples', 'counter.mcrs'), 'utf-8');
61
- const errors = validateSource(validator, src, 'counter');
62
- expect(errors).toHaveLength(0);
63
- });
64
59
  EXAMPLES.forEach(name => {
65
60
  test(`${name}.mcrs generates valid MC commands`, () => {
66
61
  const src = fs.readFileSync(path.join(__dirname, '..', 'examples', `${name}.mcrs`), 'utf-8');
@@ -0,0 +1,10 @@
1
+ /**
2
+ * MC Version Tests — Phase 5a
3
+ *
4
+ * Verifies:
5
+ * - parseMcVersion() parses version strings correctly
6
+ * - compareMcVersion() returns the right ordering
7
+ * - Codegen emits macro syntax ($ prefix, `with storage`) for >= 1.20.2
8
+ * - Codegen emits compat syntax for < 1.20.2
9
+ */
10
+ export {};