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
@@ -1,279 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateStructure = generateStructure;
4
- exports.compileToStructure = compileToStructure;
5
- const lexer_1 = require("../../lexer");
6
- const parser_1 = require("../../parser");
7
- const lowering_1 = require("../../lowering");
8
- const nbt_1 = require("../../nbt");
9
- const commands_1 = require("../../optimizer/commands");
10
- const passes_1 = require("../../optimizer/passes");
11
- const structure_1 = require("../../optimizer/structure");
12
- const dce_1 = require("../../optimizer/dce");
13
- const compile_1 = require("../../compile");
14
- const types_1 = require("../../events/types");
15
- const var_allocator_1 = require("../var-allocator");
16
- const DATA_VERSION = 3953;
17
- const MAX_WIDTH = 16;
18
- const OBJ = 'rs';
19
- const PALETTE_IMPULSE = 0;
20
- const PALETTE_CHAIN_UNCONDITIONAL = 1;
21
- const PALETTE_CHAIN_CONDITIONAL = 2;
22
- const PALETTE_REPEAT = 3;
23
- const palette = [
24
- { Name: 'minecraft:command_block', Properties: { conditional: 'false', facing: 'east' } },
25
- { Name: 'minecraft:chain_command_block', Properties: { conditional: 'false', facing: 'east' } },
26
- { Name: 'minecraft:chain_command_block', Properties: { conditional: 'true', facing: 'east' } },
27
- { Name: 'minecraft:repeating_command_block', Properties: { conditional: 'false', facing: 'east' } },
28
- { Name: 'minecraft:air', Properties: {} },
29
- ];
30
- function escapeJsonString(value) {
31
- return JSON.stringify(value).slice(1, -1);
32
- }
33
- function collectConsts(fn) {
34
- const consts = new Set();
35
- for (const block of fn.blocks) {
36
- for (const instr of block.instrs) {
37
- if (instr.op === 'assign' && instr.src.kind === 'const')
38
- consts.add(instr.src.value);
39
- if (instr.op === 'binop') {
40
- if (instr.lhs.kind === 'const')
41
- consts.add(instr.lhs.value);
42
- if (instr.rhs.kind === 'const')
43
- consts.add(instr.rhs.value);
44
- }
45
- if (instr.op === 'cmp') {
46
- if (instr.lhs.kind === 'const')
47
- consts.add(instr.lhs.value);
48
- if (instr.rhs.kind === 'const')
49
- consts.add(instr.rhs.value);
50
- }
51
- }
52
- if (block.term.op === 'return' && block.term.value?.kind === 'const') {
53
- consts.add(block.term.value.value);
54
- }
55
- }
56
- return consts;
57
- }
58
- function collectCommandEntriesFromModule(module, mangle = false) {
59
- const alloc = new var_allocator_1.VarAllocator(mangle);
60
- const entries = [];
61
- const triggerHandlers = module.functions.filter(fn => fn.isTriggerHandler && fn.triggerName);
62
- const triggerNames = new Set(triggerHandlers.map(fn => fn.triggerName));
63
- const eventHandlers = module.functions.filter((fn) => !!fn.eventHandler && (0, types_1.isEventTypeName)(fn.eventHandler.eventType));
64
- const eventTypes = new Set(eventHandlers.map(fn => fn.eventHandler.eventType));
65
- const loadCommands = [
66
- `scoreboard objectives add ${OBJ} dummy`,
67
- ...module.globals.map(g => `scoreboard players set ${alloc.alloc(g.name)} ${OBJ} ${g.init}`),
68
- ...Array.from(triggerNames).flatMap(triggerName => [
69
- `scoreboard objectives add ${triggerName} trigger`,
70
- `scoreboard players enable @a ${triggerName}`,
71
- ]),
72
- ...Array.from(new Set(module.functions.flatMap(fn => Array.from(collectConsts(fn))))).map(value => `scoreboard players set ${alloc.constant(value)} ${OBJ} ${value}`),
73
- ];
74
- for (const eventType of eventTypes) {
75
- if (eventType === 'PlayerDeath') {
76
- loadCommands.push('scoreboard objectives add rs.deaths deathCount');
77
- }
78
- else if (eventType === 'EntityKill') {
79
- loadCommands.push('scoreboard objectives add rs.kills totalKillCount');
80
- }
81
- }
82
- // Call @load functions from __load
83
- for (const fn of module.functions) {
84
- if (fn.isLoadInit) {
85
- loadCommands.push(`function ${module.namespace}:${fn.name}`);
86
- }
87
- }
88
- const sections = [];
89
- if (loadCommands.length > 0) {
90
- sections.push({
91
- name: '__load',
92
- commands: loadCommands.map(cmd => ({ cmd })),
93
- });
94
- }
95
- for (const triggerName of triggerNames) {
96
- const handlers = triggerHandlers.filter(fn => fn.triggerName === triggerName);
97
- sections.push({
98
- name: `__trigger_${triggerName}_dispatch`,
99
- commands: [
100
- ...handlers.map(handler => ({ cmd: `function ${module.namespace}:${handler.name}` })),
101
- { cmd: `scoreboard players set @s ${triggerName} 0` },
102
- { cmd: `scoreboard players enable @s ${triggerName}` },
103
- ],
104
- });
105
- }
106
- for (const fn of module.functions) {
107
- if (!fn.commands || fn.commands.length === 0)
108
- continue;
109
- sections.push({
110
- name: fn.name,
111
- commands: fn.commands,
112
- });
113
- }
114
- const tickCommands = [];
115
- for (const fn of module.functions.filter(candidate => candidate.isTickLoop)) {
116
- tickCommands.push({ cmd: `function ${module.namespace}:${fn.name}` });
117
- }
118
- if (triggerNames.size > 0) {
119
- for (const triggerName of triggerNames) {
120
- tickCommands.push({
121
- cmd: `execute as @a[scores={${triggerName}=1..}] run function ${module.namespace}:__trigger_${triggerName}_dispatch`,
122
- });
123
- }
124
- }
125
- if (eventHandlers.length > 0) {
126
- for (const eventType of eventTypes) {
127
- const tag = types_1.EVENT_TYPES[eventType].tag;
128
- const handlers = eventHandlers.filter(fn => fn.eventHandler?.eventType === eventType);
129
- for (const handler of handlers) {
130
- tickCommands.push({
131
- cmd: `execute as @a[tag=${tag}] run function ${module.namespace}:${handler.name}`,
132
- });
133
- }
134
- tickCommands.push({
135
- cmd: `tag @a[tag=${tag}] remove ${tag}`,
136
- });
137
- }
138
- }
139
- if (tickCommands.length > 0) {
140
- sections.push({
141
- name: '__tick',
142
- commands: tickCommands,
143
- repeat: true,
144
- });
145
- }
146
- for (const section of sections) {
147
- for (let i = 0; i < section.commands.length; i++) {
148
- const command = section.commands[i];
149
- const state = i === 0
150
- ? (section.repeat ? PALETTE_REPEAT : PALETTE_IMPULSE)
151
- : (command.conditional ? PALETTE_CHAIN_CONDITIONAL : PALETTE_CHAIN_UNCONDITIONAL);
152
- entries.push({
153
- functionName: section.name,
154
- lineNumber: i + 1,
155
- command: command.cmd,
156
- conditional: Boolean(command.conditional),
157
- state,
158
- isRepeat: Boolean(section.repeat && i === 0),
159
- });
160
- }
161
- }
162
- return entries;
163
- }
164
- function toFunctionName(file) {
165
- const match = file.path.match(/^data\/[^/]+\/function\/(.+)\.mcfunction$/);
166
- return match?.[1] ?? null;
167
- }
168
- function collectCommandEntriesFromFiles(files) {
169
- const entries = [];
170
- for (const file of files) {
171
- const functionName = toFunctionName(file);
172
- if (!functionName)
173
- continue;
174
- const lines = file.content.split('\n');
175
- let isFirstCommand = true;
176
- const isTickFunction = functionName === '__tick';
177
- for (let i = 0; i < lines.length; i++) {
178
- const command = lines[i].trim();
179
- if (command === '' || command.startsWith('#'))
180
- continue;
181
- const state = isFirstCommand
182
- ? (isTickFunction ? PALETTE_REPEAT : PALETTE_IMPULSE)
183
- : PALETTE_CHAIN_UNCONDITIONAL;
184
- entries.push({
185
- functionName,
186
- lineNumber: i + 1,
187
- command,
188
- conditional: false,
189
- state,
190
- isRepeat: isTickFunction && isFirstCommand,
191
- });
192
- isFirstCommand = false;
193
- }
194
- }
195
- return entries;
196
- }
197
- function createPaletteTag() {
198
- return palette.map(entry => nbt_1.nbt.compound({
199
- Name: nbt_1.nbt.string(entry.Name),
200
- Properties: nbt_1.nbt.compound(Object.fromEntries(Object.entries(entry.Properties).map(([key, value]) => [key, nbt_1.nbt.string(value)]))),
201
- }));
202
- }
203
- function createBlockEntityTag(entry) {
204
- return nbt_1.nbt.compound({
205
- id: nbt_1.nbt.string('minecraft:command_block'),
206
- Command: nbt_1.nbt.string(entry.command),
207
- auto: nbt_1.nbt.byte(entry.isRepeat ? 1 : 0),
208
- powered: nbt_1.nbt.byte(0),
209
- conditionMet: nbt_1.nbt.byte(0),
210
- UpdateLastExecution: nbt_1.nbt.byte(1),
211
- LastExecution: nbt_1.nbt.long(0n),
212
- TrackOutput: nbt_1.nbt.byte(1),
213
- SuccessCount: nbt_1.nbt.int(0),
214
- LastOutput: nbt_1.nbt.string(''),
215
- CustomName: nbt_1.nbt.string(`{"text":"${escapeJsonString(`${entry.functionName}:${entry.lineNumber}`)}"}`),
216
- });
217
- }
218
- function createBlockTag(entry, index) {
219
- const x = index % MAX_WIDTH;
220
- const z = Math.floor(index / MAX_WIDTH) % MAX_WIDTH;
221
- const y = Math.floor(index / (MAX_WIDTH * MAX_WIDTH));
222
- return nbt_1.nbt.compound({
223
- pos: nbt_1.nbt.list(3 /* TagType.Int */, [nbt_1.nbt.int(x), nbt_1.nbt.int(y), nbt_1.nbt.int(z)]),
224
- state: nbt_1.nbt.int(entry.state),
225
- nbt: createBlockEntityTag(entry),
226
- });
227
- }
228
- function generateStructure(input, options) {
229
- const entries = Array.isArray(input)
230
- ? collectCommandEntriesFromFiles(input)
231
- : collectCommandEntriesFromModule(input, options?.mangle);
232
- const blockTags = entries.map(createBlockTag);
233
- const sizeX = Math.max(1, Math.min(MAX_WIDTH, entries.length || 1));
234
- const sizeZ = Math.max(1, Math.min(MAX_WIDTH, Math.ceil(entries.length / MAX_WIDTH) || 1));
235
- const sizeY = Math.max(1, Math.ceil(entries.length / (MAX_WIDTH * MAX_WIDTH)) || 1);
236
- const root = nbt_1.nbt.compound({
237
- DataVersion: nbt_1.nbt.int(DATA_VERSION),
238
- size: nbt_1.nbt.list(3 /* TagType.Int */, [nbt_1.nbt.int(sizeX), nbt_1.nbt.int(sizeY), nbt_1.nbt.int(sizeZ)]),
239
- palette: nbt_1.nbt.list(10 /* TagType.Compound */, createPaletteTag()),
240
- blocks: nbt_1.nbt.list(10 /* TagType.Compound */, blockTags),
241
- entities: nbt_1.nbt.list(10 /* TagType.Compound */, []),
242
- });
243
- return {
244
- buffer: (0, nbt_1.writeNbt)(root, ''),
245
- blockCount: entries.length,
246
- blocks: entries.map(entry => ({
247
- command: entry.command,
248
- conditional: entry.conditional,
249
- state: entry.state,
250
- functionName: entry.functionName,
251
- lineNumber: entry.lineNumber,
252
- })),
253
- };
254
- }
255
- function compileToStructure(source, namespace, filePath, options = {}) {
256
- const preprocessedSource = (0, compile_1.preprocessSource)(source, { filePath });
257
- const tokens = new lexer_1.Lexer(preprocessedSource, filePath).tokenize();
258
- const parsedAst = new parser_1.Parser(tokens, preprocessedSource, filePath).parse(namespace);
259
- const dceResult = options.dce ?? true ? (0, dce_1.eliminateDeadCode)(parsedAst) : { program: parsedAst, warnings: [] };
260
- const ast = dceResult.program;
261
- const ir = new lowering_1.Lowering(namespace).lower(ast);
262
- const stats = (0, commands_1.createEmptyOptimizationStats)();
263
- const optimizedIRFunctions = ir.functions.map(fn => {
264
- const optimized = (0, passes_1.optimizeWithStats)(fn);
265
- (0, commands_1.mergeOptimizationStats)(stats, optimized.stats);
266
- return optimized.fn;
267
- });
268
- const structureOptimized = (0, structure_1.optimizeForStructureWithStats)(optimizedIRFunctions, namespace);
269
- (0, commands_1.mergeOptimizationStats)(stats, structureOptimized.stats);
270
- const optimizedModule = {
271
- ...ir,
272
- functions: structureOptimized.functions,
273
- };
274
- return {
275
- ...generateStructure(optimizedModule, { mangle: options.mangle }),
276
- stats,
277
- };
278
- }
279
- //# sourceMappingURL=index.js.map
@@ -1,45 +0,0 @@
1
- /**
2
- * VarAllocator — assigns scoreboard fake-player names to variables.
3
- *
4
- * mangle=true: sequential short names ($a, $b, ..., $z, $aa, $ab, ...)
5
- * mangle=false: legacy names ($<name> for vars, $const_<v> for consts, $p0/$ret for internals)
6
- */
7
- export declare class VarAllocator {
8
- private readonly mangle;
9
- private seq;
10
- private readonly varCache;
11
- private readonly constCache;
12
- private readonly internalCache;
13
- constructor(mangle?: boolean);
14
- /** Allocate a name for a user variable. Strips leading '$' if present. */
15
- alloc(originalName: string): string;
16
- /** Allocate a name for a constant value (content-addressed). */
17
- constant(value: number): string;
18
- /**
19
- * Look up the allocated name for a raw scoreboard fake-player name such as
20
- * "$_2", "$x", "$p0", or "$ret". Returns the mangled name when mangle=true,
21
- * or the original name when mangle=false or the name is not yet known.
22
- *
23
- * Unlike alloc/internal/constant this does NOT create a new slot — it only
24
- * resolves names that were already registered. Used by the codegen to
25
- * rewrite variable references inside `raw` IR instructions.
26
- */
27
- resolve(rawName: string): string;
28
- /**
29
- * Rewrite all $varname tokens in a raw mcfunction command string so that
30
- * IR variable names are replaced by their allocated (possibly mangled) names.
31
- * Tokens that are not registered in the allocator are left untouched (they
32
- * are literal scoreboard fake-player names like "out" or "#rs").
33
- */
34
- resolveRaw(cmd: string): string;
35
- /** Allocate a name for a compiler internal (e.g. "ret", "p0"). */
36
- internal(suffix: string): string;
37
- /** Generate the next sequential name: a, b, ..., z, aa, ab, ..., az, ba, ... */
38
- private nextSeqName;
39
- /**
40
- * Returns a sourcemap object mapping allocated name → original name.
41
- * Useful for debugging: write to <output>.map.json alongside the datapack.
42
- * Only meaningful when mangle=true.
43
- */
44
- toSourceMap(): Record<string, string>;
45
- }
@@ -1,104 +0,0 @@
1
- "use strict";
2
- /**
3
- * VarAllocator — assigns scoreboard fake-player names to variables.
4
- *
5
- * mangle=true: sequential short names ($a, $b, ..., $z, $aa, $ab, ...)
6
- * mangle=false: legacy names ($<name> for vars, $const_<v> for consts, $p0/$ret for internals)
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.VarAllocator = void 0;
10
- class VarAllocator {
11
- constructor(mangle = true) {
12
- this.seq = 0;
13
- this.varCache = new Map();
14
- this.constCache = new Map();
15
- this.internalCache = new Map();
16
- this.mangle = mangle;
17
- }
18
- /** Allocate a name for a user variable. Strips leading '$' if present. */
19
- alloc(originalName) {
20
- const clean = originalName.startsWith('$') ? originalName.slice(1) : originalName;
21
- const cached = this.varCache.get(clean);
22
- if (cached)
23
- return cached;
24
- const name = this.mangle ? `$${this.nextSeqName()}` : `$${clean}`;
25
- this.varCache.set(clean, name);
26
- return name;
27
- }
28
- /** Allocate a name for a constant value (content-addressed). */
29
- constant(value) {
30
- const cached = this.constCache.get(value);
31
- if (cached)
32
- return cached;
33
- const name = this.mangle ? `$${this.nextSeqName()}` : `$const_${value}`;
34
- this.constCache.set(value, name);
35
- return name;
36
- }
37
- /**
38
- * Look up the allocated name for a raw scoreboard fake-player name such as
39
- * "$_2", "$x", "$p0", or "$ret". Returns the mangled name when mangle=true,
40
- * or the original name when mangle=false or the name is not yet known.
41
- *
42
- * Unlike alloc/internal/constant this does NOT create a new slot — it only
43
- * resolves names that were already registered. Used by the codegen to
44
- * rewrite variable references inside `raw` IR instructions.
45
- */
46
- resolve(rawName) {
47
- const clean = rawName.startsWith('$') ? rawName.slice(1) : rawName;
48
- // Check every cache in priority order: vars, internals, consts
49
- return (this.varCache.get(clean) ??
50
- this.internalCache.get(clean) ??
51
- rawName // not registered → return as-is (literal fake player, not a var)
52
- );
53
- }
54
- /**
55
- * Rewrite all $varname tokens in a raw mcfunction command string so that
56
- * IR variable names are replaced by their allocated (possibly mangled) names.
57
- * Tokens that are not registered in the allocator are left untouched (they
58
- * are literal scoreboard fake-player names like "out" or "#rs").
59
- */
60
- resolveRaw(cmd) {
61
- return cmd.replace(/\$[A-Za-z_][A-Za-z0-9_]*/g, (tok) => this.resolve(tok));
62
- }
63
- /** Allocate a name for a compiler internal (e.g. "ret", "p0"). */
64
- internal(suffix) {
65
- const cached = this.internalCache.get(suffix);
66
- if (cached)
67
- return cached;
68
- const name = this.mangle ? `$${this.nextSeqName()}` : `$${suffix}`;
69
- this.internalCache.set(suffix, name);
70
- return name;
71
- }
72
- /** Generate the next sequential name: a, b, ..., z, aa, ab, ..., az, ba, ... */
73
- nextSeqName() {
74
- const n = this.seq++;
75
- let result = '';
76
- let remaining = n;
77
- do {
78
- result = String.fromCharCode(97 + (remaining % 26)) + result;
79
- remaining = Math.floor(remaining / 26) - 1;
80
- } while (remaining >= 0);
81
- return result;
82
- }
83
- /**
84
- * Returns a sourcemap object mapping allocated name → original name.
85
- * Useful for debugging: write to <output>.map.json alongside the datapack.
86
- * Only meaningful when mangle=true.
87
- */
88
- toSourceMap() {
89
- const map = {};
90
- for (const [orig, alloc] of this.varCache) {
91
- // Skip compiler-generated temporaries (start with _ followed by digits)
92
- if (/^_\d+$/.test(orig))
93
- continue;
94
- map[alloc] = orig;
95
- }
96
- for (const [val, alloc] of this.constCache)
97
- map[alloc] = `const:${val}`;
98
- for (const [suf, alloc] of this.internalCache)
99
- map[alloc] = `internal:${suf}`;
100
- return map;
101
- }
102
- }
103
- exports.VarAllocator = VarAllocator;
104
- //# sourceMappingURL=var-allocator.js.map
@@ -1,33 +0,0 @@
1
- /**
2
- * IRBuilder — helper for constructing IR programmatically.
3
- * AST → IR lowering uses this.
4
- */
5
- import type { IRFunction, IRInstr, IRModule, Operand } from './types';
6
- export declare class IRBuilder {
7
- private tempCount;
8
- private labelCount;
9
- private currentBlock;
10
- private blocks;
11
- private locals;
12
- freshTemp(): string;
13
- freshLabel(hint?: string): string;
14
- startBlock(label: string): void;
15
- private get block();
16
- private sealBlock;
17
- emitAssign(dst: string, src: Operand): void;
18
- emitBinop(dst: string, lhs: Operand, bop: IRInstr & {
19
- op: 'binop';
20
- } extends {
21
- bop: infer B;
22
- } ? B : never, rhs: Operand): void;
23
- emitCmp(dst: string, lhs: Operand, cop: '==' | '!=' | '<' | '<=' | '>' | '>=', rhs: Operand): void;
24
- emitCall(fn: string, args: Operand[], dst?: string): void;
25
- emitRaw(cmd: string): void;
26
- emitJump(target: string): void;
27
- emitJumpIf(cond: string, then: string, else_: string): void;
28
- emitReturn(value?: Operand): void;
29
- emitTickYield(continuation: string): void;
30
- build(name: string, params: string[], isTickLoop?: boolean): IRFunction;
31
- }
32
- import type { GlobalVar } from './types';
33
- export declare function buildModule(namespace: string, fns: IRFunction[], globals?: GlobalVar[]): IRModule;
@@ -1,99 +0,0 @@
1
- "use strict";
2
- /**
3
- * IRBuilder — helper for constructing IR programmatically.
4
- * AST → IR lowering uses this.
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.IRBuilder = void 0;
8
- exports.buildModule = buildModule;
9
- class IRBuilder {
10
- constructor() {
11
- this.tempCount = 0;
12
- this.labelCount = 0;
13
- this.currentBlock = null;
14
- this.blocks = [];
15
- this.locals = new Set();
16
- }
17
- // -------------------------------------------------------------------------
18
- // Names
19
- // -------------------------------------------------------------------------
20
- freshTemp() {
21
- const name = `$t${this.tempCount++}`;
22
- this.locals.add(name);
23
- return name;
24
- }
25
- freshLabel(hint = 'L') {
26
- return `${hint}_${this.labelCount++}`;
27
- }
28
- // -------------------------------------------------------------------------
29
- // Block management
30
- // -------------------------------------------------------------------------
31
- startBlock(label) {
32
- this.currentBlock = { label, instrs: [], term: { op: 'return' } };
33
- }
34
- get block() {
35
- if (!this.currentBlock)
36
- throw new Error('No active block');
37
- return this.currentBlock;
38
- }
39
- sealBlock(term) {
40
- this.block.term = term;
41
- this.blocks.push(this.block);
42
- this.currentBlock = null;
43
- }
44
- // -------------------------------------------------------------------------
45
- // Emit instructions
46
- // -------------------------------------------------------------------------
47
- emitAssign(dst, src) {
48
- this.locals.add(dst);
49
- this.block.instrs.push({ op: 'assign', dst, src });
50
- }
51
- emitBinop(dst, lhs, bop, rhs) {
52
- this.locals.add(dst);
53
- this.block.instrs.push({ op: 'binop', dst, lhs, bop, rhs });
54
- }
55
- emitCmp(dst, lhs, cop, rhs) {
56
- this.locals.add(dst);
57
- this.block.instrs.push({ op: 'cmp', dst, lhs, cop, rhs });
58
- }
59
- emitCall(fn, args, dst) {
60
- if (dst)
61
- this.locals.add(dst);
62
- this.block.instrs.push({ op: 'call', fn, args, dst });
63
- }
64
- emitRaw(cmd) {
65
- this.block.instrs.push({ op: 'raw', cmd });
66
- }
67
- // -------------------------------------------------------------------------
68
- // Terminators
69
- // -------------------------------------------------------------------------
70
- emitJump(target) {
71
- this.sealBlock({ op: 'jump', target });
72
- }
73
- emitJumpIf(cond, then, else_) {
74
- this.sealBlock({ op: 'jump_if', cond, then, else_ });
75
- }
76
- emitReturn(value) {
77
- this.sealBlock({ op: 'return', value });
78
- }
79
- emitTickYield(continuation) {
80
- this.sealBlock({ op: 'tick_yield', continuation });
81
- }
82
- // -------------------------------------------------------------------------
83
- // Build
84
- // -------------------------------------------------------------------------
85
- build(name, params, isTickLoop = false) {
86
- return {
87
- name,
88
- params,
89
- locals: Array.from(this.locals),
90
- blocks: this.blocks,
91
- isTickLoop,
92
- };
93
- }
94
- }
95
- exports.IRBuilder = IRBuilder;
96
- function buildModule(namespace, fns, globals = []) {
97
- return { namespace, functions: fns, globals };
98
- }
99
- //# sourceMappingURL=builder.js.map
@@ -1,132 +0,0 @@
1
- /**
2
- * RedScript IR — Three-Address Code (TAC)
3
- *
4
- * Compilation pipeline:
5
- * Source → AST → IR → (optimize) → CodeGen → mcfunction / cmdblock
6
- *
7
- * Variable storage in MC Java Edition:
8
- * - Integer vars → scoreboard fake player ($name on objective "rs_vars")
9
- * - Complex data → NBT storage (redscript:stack / redscript:heap)
10
- * - Return value → fake player $ret
11
- * - Temporaries → $_0, $_1, ...
12
- */
13
- export type Operand = {
14
- kind: 'var';
15
- name: string;
16
- } | {
17
- kind: 'const';
18
- value: number;
19
- } | {
20
- kind: 'storage';
21
- path: string;
22
- } | {
23
- kind: 'param';
24
- index: number;
25
- };
26
- export type BinOp = '+' | '-' | '*' | '/' | '%';
27
- export type CmpOp = '==' | '!=' | '<' | '<=' | '>' | '>=';
28
- export type IRInstr = {
29
- op: 'assign';
30
- dst: string;
31
- src: Operand;
32
- } | {
33
- op: 'binop';
34
- dst: string;
35
- lhs: Operand;
36
- bop: BinOp;
37
- rhs: Operand;
38
- } | {
39
- op: 'cmp';
40
- dst: string;
41
- lhs: Operand;
42
- cop: CmpOp;
43
- rhs: Operand;
44
- } | {
45
- op: 'jump';
46
- target: string;
47
- } | {
48
- op: 'jump_if';
49
- cond: string;
50
- target: string;
51
- } | {
52
- op: 'jump_unless';
53
- cond: string;
54
- target: string;
55
- } | {
56
- op: 'call';
57
- fn: string;
58
- args: Operand[];
59
- dst?: string;
60
- } | {
61
- op: 'return';
62
- value?: Operand;
63
- } | {
64
- op: 'label';
65
- id: string;
66
- } | {
67
- op: 'raw';
68
- cmd: string;
69
- } | {
70
- op: 'tick_yield';
71
- };
72
- export type Terminator = {
73
- op: 'jump';
74
- target: string;
75
- } | {
76
- op: 'jump_if';
77
- cond: string;
78
- then: string;
79
- else_: string;
80
- } | {
81
- op: 'jump_unless';
82
- cond: string;
83
- then: string;
84
- else_: string;
85
- } | {
86
- op: 'return';
87
- value?: Operand;
88
- } | {
89
- op: 'tick_yield';
90
- continuation: string;
91
- };
92
- export interface IRBlock {
93
- label: string;
94
- instrs: IRInstr[];
95
- term: Terminator;
96
- }
97
- export interface IRCommand {
98
- cmd: string;
99
- conditional?: boolean;
100
- label?: string;
101
- }
102
- export interface IRFunction {
103
- name: string;
104
- params: string[];
105
- locals: string[];
106
- blocks: IRBlock[];
107
- commands?: IRCommand[];
108
- isTickLoop?: boolean;
109
- isLoadInit?: boolean;
110
- requiredLoads?: string[];
111
- isTriggerHandler?: boolean;
112
- triggerName?: string;
113
- eventTrigger?: {
114
- kind: 'advancement' | 'craft' | 'death' | 'login' | 'join_team';
115
- value?: string;
116
- };
117
- eventHandler?: {
118
- eventType: string;
119
- tag: string;
120
- };
121
- isMacroFunction?: boolean;
122
- macroParamNames?: string[];
123
- }
124
- export interface GlobalVar {
125
- name: string;
126
- init: number;
127
- }
128
- export interface IRModule {
129
- namespace: string;
130
- functions: IRFunction[];
131
- globals: GlobalVar[];
132
- }