redscript-mc 2.6.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/.github/workflows/ci.yml +11 -0
  2. package/CHANGELOG.md +18 -9
  3. package/README-benchmarks.md +48 -0
  4. package/README-vscode-test.md +251 -0
  5. package/RELEASE_NOTES.md +74 -0
  6. package/ROADMAP.md +131 -167
  7. package/benchmarks/_shared.ts +468 -0
  8. package/benchmarks/baseline.json +2816 -0
  9. package/benchmarks/baseline.md +13 -0
  10. package/benchmarks/compiler-perf.report.json +207 -0
  11. package/benchmarks/compiler-perf.ts +76 -0
  12. package/benchmarks/results.md +13 -0
  13. package/benchmarks/stdlib-complexity.report.json +2606 -0
  14. package/benchmarks/stdlib-complexity.ts +54 -0
  15. package/benchmarks/stdlib-size.md +57 -0
  16. package/benchmarks/stdlib-size.ts +91 -0
  17. package/coverage-report.md +177 -0
  18. package/dist/src/__tests__/budget.test.js +4 -0
  19. package/dist/src/__tests__/cache/cache-behavior.test.d.ts +10 -0
  20. package/dist/src/__tests__/cache/cache-behavior.test.js +425 -0
  21. package/dist/src/__tests__/cache-extra.test.d.ts +5 -0
  22. package/dist/src/__tests__/cache-extra.test.js +211 -0
  23. package/dist/src/__tests__/cli-init.test.d.ts +1 -0
  24. package/dist/src/__tests__/cli-init.test.js +97 -0
  25. package/dist/src/__tests__/cli-publish.test.d.ts +9 -0
  26. package/dist/src/__tests__/cli-publish.test.js +189 -0
  27. package/dist/src/__tests__/cli.test.js +76 -0
  28. package/dist/src/__tests__/compile-preprocess.test.d.ts +11 -0
  29. package/dist/src/__tests__/compile-preprocess.test.js +328 -0
  30. package/dist/src/__tests__/compiler/break-stmt.test.d.ts +1 -0
  31. package/dist/src/__tests__/compiler/break-stmt.test.js +58 -0
  32. package/dist/src/__tests__/compiler/const-decl.test.d.ts +1 -0
  33. package/dist/src/__tests__/compiler/const-decl.test.js +123 -0
  34. package/dist/src/__tests__/compiler/continue-stmt.test.d.ts +1 -0
  35. package/dist/src/__tests__/compiler/continue-stmt.test.js +67 -0
  36. package/dist/src/__tests__/compiler/coroutine-extended.test.d.ts +17 -0
  37. package/dist/src/__tests__/compiler/coroutine-extended.test.js +565 -0
  38. package/dist/src/__tests__/compiler/deprecated.test.d.ts +4 -0
  39. package/dist/src/__tests__/compiler/deprecated.test.js +285 -0
  40. package/dist/src/__tests__/compiler/do-while.test.d.ts +1 -0
  41. package/dist/src/__tests__/compiler/do-while.test.js +120 -0
  42. package/dist/src/__tests__/compiler/enum-payload.test.d.ts +9 -0
  43. package/dist/src/__tests__/compiler/enum-payload.test.js +272 -0
  44. package/dist/src/__tests__/compiler/interface.test.d.ts +10 -0
  45. package/dist/src/__tests__/compiler/interface.test.js +258 -0
  46. package/dist/src/__tests__/compiler/labeled-loops.test.d.ts +1 -0
  47. package/dist/src/__tests__/compiler/labeled-loops.test.js +263 -0
  48. package/dist/src/__tests__/compiler/match-string.test.d.ts +1 -0
  49. package/dist/src/__tests__/compiler/match-string.test.js +43 -0
  50. package/dist/src/__tests__/compiler/memoize.test.d.ts +1 -0
  51. package/dist/src/__tests__/compiler/memoize.test.js +113 -0
  52. package/dist/src/__tests__/compiler/method-chain.test.d.ts +5 -0
  53. package/dist/src/__tests__/compiler/method-chain.test.js +115 -0
  54. package/dist/src/__tests__/compiler/module-import.test.d.ts +12 -0
  55. package/dist/src/__tests__/compiler/module-import.test.js +261 -0
  56. package/dist/src/__tests__/compiler/option-extensions.test.d.ts +6 -0
  57. package/dist/src/__tests__/compiler/option-extensions.test.js +191 -0
  58. package/dist/src/__tests__/compiler/profile-decorator.test.d.ts +1 -0
  59. package/dist/src/__tests__/compiler/profile-decorator.test.js +69 -0
  60. package/dist/src/__tests__/compiler/string-advanced.test.d.ts +7 -0
  61. package/dist/src/__tests__/compiler/string-advanced.test.js +281 -0
  62. package/dist/src/__tests__/compiler/struct-extends.test.d.ts +1 -0
  63. package/dist/src/__tests__/compiler/struct-extends.test.js +95 -0
  64. package/dist/src/__tests__/compiler/throttle-retry.test.d.ts +1 -0
  65. package/dist/src/__tests__/compiler/throttle-retry.test.js +166 -0
  66. package/dist/src/__tests__/compiler/tuple-type.test.d.ts +10 -0
  67. package/dist/src/__tests__/compiler/tuple-type.test.js +229 -0
  68. package/dist/src/__tests__/compiler/watch-decorator.test.d.ts +1 -0
  69. package/dist/src/__tests__/compiler/watch-decorator.test.js +65 -0
  70. package/dist/src/__tests__/config/project-config.test.d.ts +1 -0
  71. package/dist/src/__tests__/config/project-config.test.js +199 -0
  72. package/dist/src/__tests__/config-decorator.test.d.ts +8 -0
  73. package/dist/src/__tests__/config-decorator.test.js +142 -0
  74. package/dist/src/__tests__/diagnostics-extra.test.d.ts +6 -0
  75. package/dist/src/__tests__/diagnostics-extra.test.js +132 -0
  76. package/dist/src/__tests__/emit/compile-branches.test.d.ts +1 -0
  77. package/dist/src/__tests__/emit/compile-branches.test.js +123 -0
  78. package/dist/src/__tests__/emit/compile-coverage.test.d.ts +25 -0
  79. package/dist/src/__tests__/emit/compile-coverage.test.js +617 -0
  80. package/dist/src/__tests__/emit/compile-extra-branches.test.d.ts +12 -0
  81. package/dist/src/__tests__/emit/compile-extra-branches.test.js +225 -0
  82. package/dist/src/__tests__/emit/compile-mocked-branches.test.d.ts +0 -0
  83. package/dist/src/__tests__/emit/compile-mocked-branches.test.js +238 -0
  84. package/dist/src/__tests__/emit/execute-chain.test.d.ts +10 -0
  85. package/dist/src/__tests__/emit/execute-chain.test.js +94 -0
  86. package/dist/src/__tests__/emit/index.test.js +2 -1
  87. package/dist/src/__tests__/emit/modules-branches.test.d.ts +1 -0
  88. package/dist/src/__tests__/emit/modules-branches.test.js +88 -0
  89. package/dist/src/__tests__/emit/modules-coverage.test.d.ts +15 -0
  90. package/dist/src/__tests__/emit/modules-coverage.test.js +221 -0
  91. package/dist/src/__tests__/emit/modules-errors.test.d.ts +12 -0
  92. package/dist/src/__tests__/emit/modules-errors.test.js +169 -0
  93. package/dist/src/__tests__/emit/modules-rewrite.test.d.ts +17 -0
  94. package/dist/src/__tests__/emit/modules-rewrite.test.js +204 -0
  95. package/dist/src/__tests__/emit/source-map.test.d.ts +1 -0
  96. package/dist/src/__tests__/emit/source-map.test.js +167 -0
  97. package/dist/src/__tests__/enum.test.js +9 -4
  98. package/dist/src/__tests__/error-recovery.test.d.ts +7 -0
  99. package/dist/src/__tests__/error-recovery.test.js +217 -0
  100. package/dist/src/__tests__/events-types-extra.test.d.ts +10 -0
  101. package/dist/src/__tests__/events-types-extra.test.js +91 -0
  102. package/dist/src/__tests__/events-types.test.d.ts +4 -0
  103. package/dist/src/__tests__/events-types.test.js +56 -0
  104. package/dist/src/__tests__/formatter.test.js +13 -5
  105. package/dist/src/__tests__/hir/lower-extra.test.d.ts +9 -0
  106. package/dist/src/__tests__/hir/lower-extra.test.js +140 -0
  107. package/dist/src/__tests__/hir/monomorphize-extra.test.d.ts +15 -0
  108. package/dist/src/__tests__/hir/monomorphize-extra.test.js +200 -0
  109. package/dist/src/__tests__/hir/monomorphize-extra2.test.d.ts +16 -0
  110. package/dist/src/__tests__/hir/monomorphize-extra2.test.js +316 -0
  111. package/dist/src/__tests__/incremental.test.js +10 -2
  112. package/dist/src/__tests__/index-extra.test.d.ts +10 -0
  113. package/dist/src/__tests__/index-extra.test.js +71 -0
  114. package/dist/src/__tests__/lexer.test.js +2 -2
  115. package/dist/src/__tests__/lint/rules.test.d.ts +5 -0
  116. package/dist/src/__tests__/lint/rules.test.js +208 -0
  117. package/dist/src/__tests__/lir/lower.test.js +29 -0
  118. package/dist/src/__tests__/lir/verify.test.js +30 -0
  119. package/dist/src/__tests__/lsp/completion.test.d.ts +7 -0
  120. package/dist/src/__tests__/lsp/completion.test.js +583 -0
  121. package/dist/src/__tests__/lsp/definition.test.d.ts +7 -0
  122. package/dist/src/__tests__/lsp/definition.test.js +454 -0
  123. package/dist/src/__tests__/lsp/diagnostics.test.d.ts +10 -0
  124. package/dist/src/__tests__/lsp/diagnostics.test.js +98 -0
  125. package/dist/src/__tests__/lsp/hover-docs.test.d.ts +10 -0
  126. package/dist/src/__tests__/lsp/hover-docs.test.js +210 -0
  127. package/dist/src/__tests__/lsp.test.js +4 -1
  128. package/dist/src/__tests__/mc-integration/item-entity-events.test.js +4 -0
  129. package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +4 -0
  130. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.d.ts +13 -0
  131. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1227 -0
  132. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.d.ts +13 -0
  133. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1509 -0
  134. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.d.ts +14 -0
  135. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1374 -0
  136. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.d.ts +10 -0
  137. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +759 -0
  138. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.d.ts +13 -0
  139. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +855 -0
  140. package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +4 -0
  141. package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +4 -0
  142. package/dist/src/__tests__/mc-validator-coverage.test.d.ts +13 -0
  143. package/dist/src/__tests__/mc-validator-coverage.test.js +296 -0
  144. package/dist/src/__tests__/mc-validator-extra.test.d.ts +13 -0
  145. package/dist/src/__tests__/mc-validator-extra.test.js +245 -0
  146. package/dist/src/__tests__/mir/lower-extra.test.d.ts +20 -0
  147. package/dist/src/__tests__/mir/lower-extra.test.js +361 -0
  148. package/dist/src/__tests__/mir/lower-extra2.test.d.ts +17 -0
  149. package/dist/src/__tests__/mir/lower-extra2.test.js +317 -0
  150. package/dist/src/__tests__/mir/lower-extra3.test.d.ts +19 -0
  151. package/dist/src/__tests__/mir/lower-extra3.test.js +249 -0
  152. package/dist/src/__tests__/mir/lower-extra4.test.d.ts +23 -0
  153. package/dist/src/__tests__/mir/lower-extra4.test.js +606 -0
  154. package/dist/src/__tests__/mir/lower-extra5.test.d.ts +25 -0
  155. package/dist/src/__tests__/mir/lower-extra5.test.js +543 -0
  156. package/dist/src/__tests__/mir/lower-extra6.test.d.ts +16 -0
  157. package/dist/src/__tests__/mir/lower-extra6.test.js +471 -0
  158. package/dist/src/__tests__/mir/lower-extra7.test.d.ts +35 -0
  159. package/dist/src/__tests__/mir/lower-extra7.test.js +921 -0
  160. package/dist/src/__tests__/mir/lower-extra8.test.d.ts +19 -0
  161. package/dist/src/__tests__/mir/lower-extra8.test.js +626 -0
  162. package/dist/src/__tests__/mir/lower-extra9.test.d.ts +14 -0
  163. package/dist/src/__tests__/mir/lower-extra9.test.js +717 -0
  164. package/dist/src/__tests__/optimizer/auto-inline.test.d.ts +1 -0
  165. package/dist/src/__tests__/optimizer/auto-inline.test.js +176 -0
  166. package/dist/src/__tests__/optimizer/cse.test.d.ts +4 -0
  167. package/dist/src/__tests__/optimizer/cse.test.js +178 -0
  168. package/dist/src/__tests__/optimizer/inline_fn.test.d.ts +1 -0
  169. package/dist/src/__tests__/optimizer/inline_fn.test.js +221 -0
  170. package/dist/src/__tests__/optimizer/licm.test.d.ts +1 -0
  171. package/dist/src/__tests__/optimizer/licm.test.js +244 -0
  172. package/dist/src/__tests__/optimizer/optimizer-extended.test.d.ts +12 -0
  173. package/dist/src/__tests__/optimizer/optimizer-extended.test.js +993 -0
  174. package/dist/src/__tests__/optimizer/strength-reduction.test.d.ts +1 -0
  175. package/dist/src/__tests__/optimizer/strength-reduction.test.js +86 -0
  176. package/dist/src/__tests__/optimizer/tco.test.d.ts +14 -0
  177. package/dist/src/__tests__/optimizer/tco.test.js +203 -0
  178. package/dist/src/__tests__/parser-coverage.test.d.ts +25 -0
  179. package/dist/src/__tests__/parser-coverage.test.js +491 -0
  180. package/dist/src/__tests__/parser-extra.test.d.ts +6 -0
  181. package/dist/src/__tests__/parser-extra.test.js +451 -0
  182. package/dist/src/__tests__/parser.test.js +12 -0
  183. package/dist/src/__tests__/repl-extra.test.d.ts +13 -0
  184. package/dist/src/__tests__/repl-extra.test.js +174 -0
  185. package/dist/src/__tests__/repl-server-extra.test.d.ts +10 -0
  186. package/dist/src/__tests__/repl-server-extra.test.js +161 -0
  187. package/dist/src/__tests__/repl-server.test.d.ts +6 -0
  188. package/dist/src/__tests__/repl-server.test.js +146 -0
  189. package/dist/src/__tests__/runtime-extra.test.d.ts +15 -0
  190. package/dist/src/__tests__/runtime-extra.test.js +732 -0
  191. package/dist/src/__tests__/singleton-decorator.test.d.ts +11 -0
  192. package/dist/src/__tests__/singleton-decorator.test.js +260 -0
  193. package/dist/src/__tests__/sourcemap.test.js +1 -1
  194. package/dist/src/__tests__/stdlib/advanced.test.d.ts +5 -0
  195. package/dist/src/__tests__/stdlib/advanced.test.js +301 -0
  196. package/dist/src/__tests__/stdlib/bigint.test.d.ts +4 -0
  197. package/dist/src/__tests__/stdlib/bigint.test.js +83 -0
  198. package/dist/src/__tests__/stdlib/bits.test.d.ts +4 -0
  199. package/dist/src/__tests__/stdlib/bits.test.js +96 -0
  200. package/dist/src/__tests__/stdlib/bossbar.test.d.ts +4 -0
  201. package/dist/src/__tests__/stdlib/bossbar.test.js +72 -0
  202. package/dist/src/__tests__/stdlib/color.test.d.ts +4 -0
  203. package/dist/src/__tests__/stdlib/color.test.js +84 -0
  204. package/dist/src/__tests__/stdlib/combat.test.d.ts +4 -0
  205. package/dist/src/__tests__/stdlib/combat.test.js +64 -0
  206. package/dist/src/__tests__/stdlib/cooldown.test.d.ts +4 -0
  207. package/dist/src/__tests__/stdlib/cooldown.test.js +64 -0
  208. package/dist/src/__tests__/stdlib/dialog.test.js +15 -7
  209. package/dist/src/__tests__/stdlib/ecs.test.d.ts +4 -0
  210. package/dist/src/__tests__/stdlib/ecs.test.js +81 -0
  211. package/dist/src/__tests__/stdlib/effects.test.d.ts +4 -0
  212. package/dist/src/__tests__/stdlib/effects.test.js +72 -0
  213. package/dist/src/__tests__/stdlib/events.test.d.ts +4 -0
  214. package/dist/src/__tests__/stdlib/events.test.js +55 -0
  215. package/dist/src/__tests__/stdlib/expr.test.d.ts +4 -0
  216. package/dist/src/__tests__/stdlib/expr.test.js +77 -0
  217. package/dist/src/__tests__/stdlib/fft.test.d.ts +4 -0
  218. package/dist/src/__tests__/stdlib/fft.test.js +82 -0
  219. package/dist/src/__tests__/stdlib/graph.test.d.ts +4 -0
  220. package/dist/src/__tests__/stdlib/graph.test.js +102 -0
  221. package/dist/src/__tests__/stdlib/interactions.test.d.ts +4 -0
  222. package/dist/src/__tests__/stdlib/interactions.test.js +60 -0
  223. package/dist/src/__tests__/stdlib/inventory.test.d.ts +4 -0
  224. package/dist/src/__tests__/stdlib/inventory.test.js +68 -0
  225. package/dist/src/__tests__/stdlib/linalg.test.d.ts +5 -0
  226. package/dist/src/__tests__/stdlib/linalg.test.js +78 -0
  227. package/dist/src/__tests__/stdlib/map.test.d.ts +1 -0
  228. package/dist/src/__tests__/stdlib/map.test.js +84 -0
  229. package/dist/src/__tests__/stdlib/math.test.js +19 -6
  230. package/dist/src/__tests__/stdlib/math_hp.test.d.ts +4 -0
  231. package/dist/src/__tests__/stdlib/math_hp.test.js +80 -0
  232. package/dist/src/__tests__/stdlib/mobs.test.d.ts +4 -0
  233. package/dist/src/__tests__/stdlib/mobs.test.js +61 -0
  234. package/dist/src/__tests__/stdlib/noise.test.d.ts +4 -0
  235. package/dist/src/__tests__/stdlib/noise.test.js +73 -0
  236. package/dist/src/__tests__/stdlib/ode.test.d.ts +4 -0
  237. package/dist/src/__tests__/stdlib/ode.test.js +68 -0
  238. package/dist/src/__tests__/stdlib/parabola.test.d.ts +4 -0
  239. package/dist/src/__tests__/stdlib/parabola.test.js +77 -0
  240. package/dist/src/__tests__/stdlib/particles.test.d.ts +4 -0
  241. package/dist/src/__tests__/stdlib/particles.test.js +68 -0
  242. package/dist/src/__tests__/stdlib/physics.test.d.ts +4 -0
  243. package/dist/src/__tests__/stdlib/physics.test.js +76 -0
  244. package/dist/src/__tests__/stdlib/player.test.d.ts +4 -0
  245. package/dist/src/__tests__/stdlib/player.test.js +64 -0
  246. package/dist/src/__tests__/stdlib/quaternion.test.d.ts +4 -0
  247. package/dist/src/__tests__/stdlib/quaternion.test.js +73 -0
  248. package/dist/src/__tests__/stdlib/queue.test.d.ts +1 -0
  249. package/dist/src/__tests__/stdlib/queue.test.js +97 -0
  250. package/dist/src/__tests__/stdlib/random.test.d.ts +4 -0
  251. package/dist/src/__tests__/stdlib/random.test.js +76 -0
  252. package/dist/src/__tests__/stdlib/result.test.d.ts +12 -0
  253. package/dist/src/__tests__/stdlib/result.test.js +329 -0
  254. package/dist/src/__tests__/stdlib/scheduler.test.js +19 -8
  255. package/dist/src/__tests__/stdlib/set_int.test.d.ts +1 -0
  256. package/dist/src/__tests__/stdlib/set_int.test.js +88 -0
  257. package/dist/src/__tests__/stdlib/sets.test.d.ts +6 -0
  258. package/dist/src/__tests__/stdlib/sets.test.js +60 -0
  259. package/dist/src/__tests__/stdlib/signal.test.d.ts +4 -0
  260. package/dist/src/__tests__/stdlib/signal.test.js +84 -0
  261. package/dist/src/__tests__/stdlib/spawn.test.d.ts +4 -0
  262. package/dist/src/__tests__/stdlib/spawn.test.js +68 -0
  263. package/dist/src/__tests__/stdlib/string.test.d.ts +12 -0
  264. package/dist/src/__tests__/stdlib/string.test.js +231 -0
  265. package/dist/src/__tests__/stdlib/strings.test.d.ts +4 -0
  266. package/dist/src/__tests__/stdlib/strings.test.js +83 -0
  267. package/dist/src/__tests__/stdlib/tags.test.d.ts +4 -0
  268. package/dist/src/__tests__/stdlib/tags.test.js +57 -0
  269. package/dist/src/__tests__/stdlib/teams.test.d.ts +4 -0
  270. package/dist/src/__tests__/stdlib/teams.test.js +72 -0
  271. package/dist/src/__tests__/stdlib/timer.test.d.ts +4 -0
  272. package/dist/src/__tests__/stdlib/timer.test.js +79 -0
  273. package/dist/src/__tests__/stdlib/vec.test.d.ts +5 -0
  274. package/dist/src/__tests__/stdlib/vec.test.js +94 -0
  275. package/dist/src/__tests__/stdlib/world.test.d.ts +4 -0
  276. package/dist/src/__tests__/stdlib/world.test.js +72 -0
  277. package/dist/src/__tests__/struct-display.test.d.ts +1 -0
  278. package/dist/src/__tests__/struct-display.test.js +64 -0
  279. package/dist/src/__tests__/test-framework/runner.test.d.ts +10 -0
  280. package/dist/src/__tests__/test-framework/runner.test.js +193 -0
  281. package/dist/src/__tests__/tuner/adapters.test.d.ts +14 -0
  282. package/dist/src/__tests__/tuner/adapters.test.js +194 -0
  283. package/dist/src/__tests__/tuner/simulator-extra.test.d.ts +4 -0
  284. package/dist/src/__tests__/tuner/simulator-extra.test.js +193 -0
  285. package/dist/src/__tests__/typechecker-coverage.test.d.ts +30 -0
  286. package/dist/src/__tests__/typechecker-coverage.test.js +627 -0
  287. package/dist/src/__tests__/typechecker.test.js +3 -3
  288. package/dist/src/__tests__/watch-decorator.test.d.ts +1 -0
  289. package/dist/src/__tests__/watch-decorator.test.js +54 -0
  290. package/dist/src/ast/types.d.ts +102 -3
  291. package/dist/src/cache/incremental.d.ts +13 -14
  292. package/dist/src/cache/incremental.js +106 -89
  293. package/dist/src/cache/index.d.ts +8 -2
  294. package/dist/src/cache/index.js +18 -6
  295. package/dist/src/cli.d.ts +1 -0
  296. package/dist/src/cli.js +466 -17
  297. package/dist/src/config/project-config.d.ts +29 -0
  298. package/dist/src/config/project-config.js +180 -0
  299. package/dist/src/diagnostics/index.d.ts +9 -0
  300. package/dist/src/diagnostics/index.js +18 -1
  301. package/dist/src/emit/compile.d.ts +10 -0
  302. package/dist/src/emit/compile.js +395 -50
  303. package/dist/src/emit/index.d.ts +40 -0
  304. package/dist/src/emit/index.js +307 -14
  305. package/dist/src/emit/modules.js +21 -3
  306. package/dist/src/emit/sourcemap.d.ts +23 -27
  307. package/dist/src/emit/sourcemap.js +52 -30
  308. package/dist/src/formatter/index.js +33 -8
  309. package/dist/src/hir/deprecated.d.ts +13 -0
  310. package/dist/src/hir/deprecated.js +218 -0
  311. package/dist/src/hir/lower.js +114 -8
  312. package/dist/src/hir/monomorphize.js +22 -2
  313. package/dist/src/hir/types.d.ts +65 -1
  314. package/dist/src/index.d.ts +6 -0
  315. package/dist/src/index.js +18 -3
  316. package/dist/src/lexer/index.d.ts +2 -1
  317. package/dist/src/lexer/index.js +39 -3
  318. package/dist/src/lint/index.d.ts +45 -0
  319. package/dist/src/lint/index.js +930 -0
  320. package/dist/src/lir/lower.js +29 -2
  321. package/dist/src/lir/types.d.ts +2 -0
  322. package/dist/src/lsp/server.js +92 -5
  323. package/dist/src/mir/lower.js +775 -34
  324. package/dist/src/mir/macro.js +36 -2
  325. package/dist/src/mir/types.d.ts +12 -0
  326. package/dist/src/mir/verify.js +9 -0
  327. package/dist/src/optimizer/auto-inline.d.ts +2 -0
  328. package/dist/src/optimizer/auto-inline.js +67 -0
  329. package/dist/src/optimizer/cse.d.ts +20 -0
  330. package/dist/src/optimizer/cse.js +234 -0
  331. package/dist/src/optimizer/inline.d.ts +26 -0
  332. package/dist/src/optimizer/inline.js +286 -0
  333. package/dist/src/optimizer/interprocedural.js +4 -0
  334. package/dist/src/optimizer/licm.d.ts +32 -0
  335. package/dist/src/optimizer/licm.js +371 -0
  336. package/dist/src/optimizer/pipeline.js +12 -2
  337. package/dist/src/optimizer/strength_reduction.d.ts +15 -0
  338. package/dist/src/optimizer/strength_reduction.js +90 -0
  339. package/dist/src/optimizer/tco.d.ts +53 -0
  340. package/dist/src/optimizer/tco.js +238 -0
  341. package/dist/src/parser/index.d.ts +32 -0
  342. package/dist/src/parser/index.js +421 -59
  343. package/dist/src/repl-server.d.ts +13 -0
  344. package/dist/src/repl-server.js +127 -0
  345. package/dist/src/structs/expand.d.ts +15 -0
  346. package/dist/src/structs/expand.js +46 -0
  347. package/dist/src/testing/runner.d.ts +40 -0
  348. package/dist/src/testing/runner.js +237 -0
  349. package/dist/src/typechecker/index.d.ts +3 -0
  350. package/dist/src/typechecker/index.js +254 -9
  351. package/dist/tsconfig.tsbuildinfo +1 -1
  352. package/doc-drafts/redscript-docs/docs/en/stdlib/graph.md +104 -0
  353. package/doc-drafts/redscript-docs/docs/en/stdlib/parabola.md +113 -0
  354. package/doc-drafts/redscript-docs/docs/en/stdlib/pathfind.md +104 -0
  355. package/doc-drafts/redscript-docs/docs/en/stdlib/physics.md +134 -0
  356. package/doc-drafts/redscript-docs/docs/en/stdlib/quaternion.md +135 -0
  357. package/doc-drafts/redscript-docs/docs/zh/stdlib/graph.md +104 -0
  358. package/doc-drafts/redscript-docs/docs/zh/stdlib/parabola.md +113 -0
  359. package/doc-drafts/redscript-docs/docs/zh/stdlib/pathfind.md +104 -0
  360. package/doc-drafts/redscript-docs/docs/zh/stdlib/physics.md +134 -0
  361. package/doc-drafts/redscript-docs/docs/zh/stdlib/quaternion.md +135 -0
  362. package/docs/stdlib/result.md +156 -0
  363. package/docs/stdlib/result.zh.md +156 -0
  364. package/editors/vscode/fixtures/test.mcrs +7 -0
  365. package/editors/vscode/out/extension.js +2095 -225
  366. package/editors/vscode/out/lsp-server.js +519 -51
  367. package/editors/vscode/package-lock.json +9 -4
  368. package/editors/vscode/package.json +1 -1
  369. package/examples/display-demo.mcrs +64 -0
  370. package/examples/game/racing.mcrs +301 -0
  371. package/examples/game/tower_defense.mcrs +311 -0
  372. package/examples/math/physics_sim.mcrs +322 -0
  373. package/examples/rpg/boss_fight.mcrs +313 -0
  374. package/examples/rpg/health_system.mcrs +237 -0
  375. package/examples/rpg/inventory.mcrs +265 -0
  376. package/examples/util/debug_hud.mcrs +279 -0
  377. package/jest.config.js +10 -0
  378. package/package.json +12 -3
  379. package/playground/index.html +823 -0
  380. package/scripts/gen-docs.ts +533 -0
  381. package/scripts/update-redscript-docs-stdlib.sh +770 -0
  382. package/src/__tests__/budget.test.ts +5 -0
  383. package/src/__tests__/cache/cache-behavior.test.ts +480 -0
  384. package/src/__tests__/cache-extra.test.ts +199 -0
  385. package/src/__tests__/cli-docs.test.ts +77 -0
  386. package/src/__tests__/cli-init.test.ts +91 -0
  387. package/src/__tests__/cli-publish.test.ts +190 -0
  388. package/src/__tests__/cli.test.ts +117 -1
  389. package/src/__tests__/compile-preprocess.test.ts +366 -0
  390. package/src/__tests__/compiler/break-stmt.test.ts +66 -0
  391. package/src/__tests__/compiler/const-decl.test.ts +141 -0
  392. package/src/__tests__/compiler/continue-stmt.test.ts +81 -0
  393. package/src/__tests__/compiler/coroutine-extended.test.ts +723 -0
  394. package/src/__tests__/compiler/deprecated.test.ts +305 -0
  395. package/src/__tests__/compiler/do-while.test.ts +130 -0
  396. package/src/__tests__/compiler/enum-payload.test.ts +299 -0
  397. package/src/__tests__/compiler/interface.test.ts +287 -0
  398. package/src/__tests__/compiler/labeled-loops.test.ts +279 -0
  399. package/src/__tests__/compiler/match-string.test.ts +45 -0
  400. package/src/__tests__/compiler/memoize.test.ts +126 -0
  401. package/src/__tests__/compiler/method-chain.test.ts +121 -0
  402. package/src/__tests__/compiler/module-import.test.ts +240 -0
  403. package/src/__tests__/compiler/option-extensions.test.ts +207 -0
  404. package/src/__tests__/compiler/profile-decorator.test.ts +79 -0
  405. package/src/__tests__/compiler/string-advanced.test.ts +310 -0
  406. package/src/__tests__/compiler/struct-extends.test.ts +109 -0
  407. package/src/__tests__/compiler/throttle-retry.test.ts +191 -0
  408. package/src/__tests__/compiler/tuple-type.test.ts +263 -0
  409. package/src/__tests__/compiler/watch-decorator.test.ts +72 -0
  410. package/src/__tests__/config/project-config.test.ts +181 -0
  411. package/src/__tests__/config-decorator.test.ts +157 -0
  412. package/src/__tests__/diagnostics-extra.test.ts +155 -0
  413. package/src/__tests__/emit/compile-branches.test.ts +135 -0
  414. package/src/__tests__/emit/compile-coverage.test.ts +696 -0
  415. package/src/__tests__/emit/compile-extra-branches.test.ts +228 -0
  416. package/src/__tests__/emit/compile-mocked-branches.test.ts +249 -0
  417. package/src/__tests__/emit/compile.test.ts +6 -1
  418. package/src/__tests__/emit/execute-chain.test.ts +114 -0
  419. package/src/__tests__/emit/index.test.ts +2 -1
  420. package/src/__tests__/emit/modules-branches.test.ts +90 -0
  421. package/src/__tests__/emit/modules-coverage.test.ts +241 -0
  422. package/src/__tests__/emit/modules-errors.test.ts +192 -0
  423. package/src/__tests__/emit/modules-rewrite.test.ts +232 -0
  424. package/src/__tests__/emit/source-map.test.ts +152 -0
  425. package/src/__tests__/enum.test.ts +9 -4
  426. package/src/__tests__/error-recovery.test.ts +226 -0
  427. package/src/__tests__/events-types-extra.test.ts +110 -0
  428. package/src/__tests__/events-types.test.ts +66 -0
  429. package/src/__tests__/formatter.test.ts +15 -5
  430. package/src/__tests__/generics.test.ts +16 -9
  431. package/src/__tests__/hir/lower-extra.test.ts +151 -0
  432. package/src/__tests__/hir/monomorphize-coverage.test.ts +432 -0
  433. package/src/__tests__/hir/monomorphize-extra.test.ts +220 -0
  434. package/src/__tests__/hir/monomorphize-extra2.test.ts +350 -0
  435. package/src/__tests__/impl.test.ts +12 -8
  436. package/src/__tests__/incremental.test.ts +10 -2
  437. package/src/__tests__/index-extra.test.ts +79 -0
  438. package/src/__tests__/lexer.test.ts +2 -2
  439. package/src/__tests__/lint/hir-coverage.test.ts +1716 -0
  440. package/src/__tests__/lint/rules-coverage.test.ts +598 -0
  441. package/src/__tests__/lint/rules.test.ts +230 -0
  442. package/src/__tests__/lir/lower.test.ts +33 -0
  443. package/src/__tests__/lir/verify.test.ts +33 -0
  444. package/src/__tests__/lsp/completion.test.ts +687 -0
  445. package/src/__tests__/lsp/definition.test.ts +499 -0
  446. package/src/__tests__/lsp/diagnostics.test.ts +108 -0
  447. package/src/__tests__/lsp/hover-docs.test.ts +222 -0
  448. package/src/__tests__/lsp.test.ts +4 -1
  449. package/src/__tests__/mc-integration/item-entity-events.test.ts +5 -0
  450. package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +5 -0
  451. package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1105 -0
  452. package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1366 -0
  453. package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1245 -0
  454. package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +755 -0
  455. package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +771 -0
  456. package/src/__tests__/mc-integration/stdlib-coverage.test.ts +5 -0
  457. package/src/__tests__/mc-integration/syntax-coverage.test.ts +5 -0
  458. package/src/__tests__/mc-validator-coverage.test.ts +325 -0
  459. package/src/__tests__/mc-validator-extra.test.ts +252 -0
  460. package/src/__tests__/mir/lower-extra.test.ts +402 -0
  461. package/src/__tests__/mir/lower-extra2.test.ts +348 -0
  462. package/src/__tests__/mir/lower-extra3.test.ts +277 -0
  463. package/src/__tests__/mir/lower-extra4.test.ts +636 -0
  464. package/src/__tests__/mir/lower-extra5.test.ts +612 -0
  465. package/src/__tests__/mir/lower-extra6.test.ts +520 -0
  466. package/src/__tests__/mir/lower-extra7.test.ts +1045 -0
  467. package/src/__tests__/mir/lower-extra8.test.ts +704 -0
  468. package/src/__tests__/mir/lower-extra9.test.ts +821 -0
  469. package/src/__tests__/optimizer/auto-inline.test.ts +206 -0
  470. package/src/__tests__/optimizer/cse.test.ts +195 -0
  471. package/src/__tests__/optimizer/inline_fn.test.ts +263 -0
  472. package/src/__tests__/optimizer/licm.test.ts +358 -0
  473. package/src/__tests__/optimizer/nbt-coalesce.test.ts +147 -0
  474. package/src/__tests__/optimizer/optimizer-extended.test.ts +1081 -0
  475. package/src/__tests__/optimizer/scoreboard-batch.test.ts +141 -0
  476. package/src/__tests__/optimizer/strength-reduction.test.ts +111 -0
  477. package/src/__tests__/optimizer/tco-coverage.test.ts +309 -0
  478. package/src/__tests__/optimizer/tco.test.ts +238 -0
  479. package/src/__tests__/option.test.ts +14 -7
  480. package/src/__tests__/parser-coverage.test.ts +576 -0
  481. package/src/__tests__/parser-extra.test.ts +531 -0
  482. package/src/__tests__/parser.test.ts +14 -0
  483. package/src/__tests__/repl-extra.test.ts +195 -0
  484. package/src/__tests__/repl-server-extra.test.ts +150 -0
  485. package/src/__tests__/repl-server.test.ts +122 -0
  486. package/src/__tests__/runtime-extra.test.ts +862 -0
  487. package/src/__tests__/singleton-decorator.test.ts +285 -0
  488. package/src/__tests__/sourcemap.test.ts +1 -1
  489. package/src/__tests__/stdlib/advanced.test.ts +312 -0
  490. package/src/__tests__/stdlib/bigint.test.ts +57 -0
  491. package/src/__tests__/stdlib/bits.test.ts +75 -0
  492. package/src/__tests__/stdlib/bossbar.test.ts +45 -0
  493. package/src/__tests__/stdlib/color.test.ts +60 -0
  494. package/src/__tests__/stdlib/combat.test.ts +35 -0
  495. package/src/__tests__/stdlib/cooldown.test.ts +35 -0
  496. package/src/__tests__/stdlib/dialog.test.ts +14 -6
  497. package/src/__tests__/stdlib/ecs.test.ts +54 -0
  498. package/src/__tests__/stdlib/effects.test.ts +45 -0
  499. package/src/__tests__/stdlib/events.test.ts +23 -0
  500. package/src/__tests__/stdlib/expr.test.ts +48 -0
  501. package/src/__tests__/stdlib/fft.test.ts +54 -0
  502. package/src/__tests__/stdlib/graph.test.ts +77 -0
  503. package/src/__tests__/stdlib/interactions.test.ts +30 -0
  504. package/src/__tests__/stdlib/inventory.test.ts +40 -0
  505. package/src/__tests__/stdlib/linalg.test.ts +52 -0
  506. package/src/__tests__/stdlib/map.test.ts +55 -0
  507. package/src/__tests__/stdlib/math.test.ts +19 -5
  508. package/src/__tests__/stdlib/math_hp.test.ts +55 -0
  509. package/src/__tests__/stdlib/mobs.test.ts +40 -0
  510. package/src/__tests__/stdlib/noise.test.ts +46 -0
  511. package/src/__tests__/stdlib/ode.test.ts +40 -0
  512. package/src/__tests__/stdlib/parabola.test.ts +51 -0
  513. package/src/__tests__/stdlib/particles.test.ts +40 -0
  514. package/src/__tests__/stdlib/physics.test.ts +50 -0
  515. package/src/__tests__/stdlib/player.test.ts +35 -0
  516. package/src/__tests__/stdlib/quaternion.test.ts +46 -0
  517. package/src/__tests__/stdlib/queue.test.ts +73 -0
  518. package/src/__tests__/stdlib/random.test.ts +50 -0
  519. package/src/__tests__/stdlib/result.test.ts +326 -0
  520. package/src/__tests__/stdlib/scheduler.test.ts +18 -7
  521. package/src/__tests__/stdlib/set_int.test.ts +62 -0
  522. package/src/__tests__/stdlib/sets.test.ts +28 -0
  523. package/src/__tests__/stdlib/signal.test.ts +60 -0
  524. package/src/__tests__/stdlib/spawn.test.ts +40 -0
  525. package/src/__tests__/stdlib/string.test.ts +224 -0
  526. package/src/__tests__/stdlib/strings.test.ts +55 -0
  527. package/src/__tests__/stdlib/tags.test.ts +32 -0
  528. package/src/__tests__/stdlib/teams.test.ts +45 -0
  529. package/src/__tests__/stdlib/timer.test.ts +53 -0
  530. package/src/__tests__/stdlib/vec.test.ts +72 -0
  531. package/src/__tests__/stdlib/world.test.ts +45 -0
  532. package/src/__tests__/struct-display.test.ts +69 -0
  533. package/src/__tests__/test-framework/runner.test.ts +208 -0
  534. package/src/__tests__/tuner/adapters.test.ts +232 -0
  535. package/src/__tests__/tuner/simulator-extra.test.ts +222 -0
  536. package/src/__tests__/tuple.test.ts +11 -4
  537. package/src/__tests__/typechecker-coverage.test.ts +671 -0
  538. package/src/__tests__/typechecker.test.ts +4 -3
  539. package/src/__tests__/watch-decorator.test.ts +59 -0
  540. package/src/ast/types.ts +65 -3
  541. package/src/cache/incremental.ts +128 -99
  542. package/src/cache/index.ts +35 -8
  543. package/src/cli.ts +538 -29
  544. package/src/config/project-config.ts +176 -0
  545. package/src/diagnostics/index.ts +22 -0
  546. package/src/docs.ts +98 -0
  547. package/src/emit/compile.ts +408 -51
  548. package/src/emit/index.ts +366 -18
  549. package/src/emit/modules.ts +19 -3
  550. package/src/emit/sourcemap.ts +64 -43
  551. package/src/formatter/index.ts +35 -8
  552. package/src/hir/deprecated.ts +212 -0
  553. package/src/hir/lower.ts +128 -8
  554. package/src/hir/monomorphize.ts +24 -2
  555. package/src/hir/types.ts +26 -1
  556. package/src/index.ts +23 -3
  557. package/src/lexer/index.ts +45 -6
  558. package/src/lint/index.ts +922 -0
  559. package/src/lir/lower.ts +30 -2
  560. package/src/lir/types.ts +4 -0
  561. package/src/lsp/server.ts +100 -1
  562. package/src/mir/lower.ts +785 -40
  563. package/src/mir/macro.ts +30 -2
  564. package/src/mir/types.ts +13 -0
  565. package/src/mir/verify.ts +10 -2
  566. package/src/optimizer/auto-inline.ts +86 -0
  567. package/src/optimizer/copy_prop.ts +2 -2
  568. package/src/optimizer/coroutine.ts +3 -3
  569. package/src/optimizer/cse.ts +205 -0
  570. package/src/optimizer/dce.ts +2 -2
  571. package/src/optimizer/inline.ts +335 -0
  572. package/src/optimizer/interprocedural.ts +5 -1
  573. package/src/optimizer/licm.ts +454 -0
  574. package/src/optimizer/nbt-coalesce.ts +109 -0
  575. package/src/optimizer/pipeline.ts +16 -2
  576. package/src/optimizer/scoreboard-batch.ts +52 -0
  577. package/src/optimizer/strength_reduction.ts +95 -0
  578. package/src/optimizer/tco.ts +267 -0
  579. package/src/optimizer/unroll.ts +2 -2
  580. package/src/parser/index.ts +426 -53
  581. package/src/repl-server.ts +102 -0
  582. package/src/stdlib/advanced.mcrs +271 -101
  583. package/src/stdlib/bigint.mcrs +97 -11
  584. package/src/stdlib/bits.mcrs +75 -12
  585. package/src/stdlib/bossbar.mcrs +37 -8
  586. package/src/stdlib/calculus.mcrs +82 -26
  587. package/src/stdlib/color.mcrs +98 -16
  588. package/src/stdlib/combat.mcrs +23 -5
  589. package/src/stdlib/cooldown.mcrs +19 -0
  590. package/src/stdlib/dialog.mcrs +45 -7
  591. package/src/stdlib/easing.mcrs +132 -12
  592. package/src/stdlib/ecs.mcrs +142 -25
  593. package/src/stdlib/effects.mcrs +88 -12
  594. package/src/stdlib/events.mcrs +21 -2
  595. package/src/stdlib/expr.mcrs +18 -3
  596. package/src/stdlib/fft.mcrs +66 -56
  597. package/src/stdlib/geometry.mcrs +137 -39
  598. package/src/stdlib/graph.mcrs +73 -0
  599. package/src/stdlib/heap.mcrs +49 -8
  600. package/src/stdlib/i18n/zh.yaml +2891 -0
  601. package/src/stdlib/interactions.mcrs +43 -20
  602. package/src/stdlib/inventory.mcrs +14 -3
  603. package/src/stdlib/linalg.mcrs +185 -30
  604. package/src/stdlib/list.mcrs +168 -18
  605. package/src/stdlib/map.mcrs +112 -0
  606. package/src/stdlib/math.mcrs +68 -18
  607. package/src/stdlib/math_hp.mcrs +124 -33
  608. package/src/stdlib/matrix.mcrs +133 -20
  609. package/src/stdlib/mobs.mcrs +87 -0
  610. package/src/stdlib/noise.mcrs +65 -21
  611. package/src/stdlib/ode.mcrs +96 -0
  612. package/src/stdlib/parabola.mcrs +104 -29
  613. package/src/stdlib/particles.mcrs +78 -21
  614. package/src/stdlib/pathfind.mcrs +89 -35
  615. package/src/stdlib/physics.mcrs +134 -26
  616. package/src/stdlib/player.mcrs +18 -0
  617. package/src/stdlib/quaternion.mcrs +213 -9
  618. package/src/stdlib/queue.mcrs +123 -0
  619. package/src/stdlib/random.mcrs +63 -18
  620. package/src/stdlib/result.mcrs +111 -0
  621. package/src/stdlib/scheduler.mcrs +59 -10
  622. package/src/stdlib/set_int.mcrs +240 -0
  623. package/src/stdlib/sets.mcrs +49 -19
  624. package/src/stdlib/signal.mcrs +151 -79
  625. package/src/stdlib/sort.mcrs +44 -24
  626. package/src/stdlib/spawn.mcrs +30 -7
  627. package/src/stdlib/state.mcrs +40 -5
  628. package/src/stdlib/strings.mcrs +131 -3
  629. package/src/stdlib/tags.mcrs +2 -2
  630. package/src/stdlib/teams.mcrs +22 -10
  631. package/src/stdlib/timer.mcrs +36 -6
  632. package/src/stdlib/vec.mcrs +44 -9
  633. package/src/stdlib/world.mcrs +57 -25
  634. package/src/structs/expand.ts +64 -0
  635. package/src/testing/runner.ts +271 -0
  636. package/src/typechecker/index.ts +273 -9
package/src/mir/macro.ts CHANGED
@@ -21,6 +21,19 @@ export const BUILTIN_SET = new Set([
21
21
  'summon', 'particle', 'playsound', 'clear', 'weather',
22
22
  'time_set', 'time_add', 'gamerule', 'tag_add', 'tag_remove',
23
23
  'kick', 'setblock', 'fill', 'clone', 'difficulty', 'xp_add', 'xp_set',
24
+ // Entity movement / teleport
25
+ 'tp', 'tp_to',
26
+ // Scoreboard management
27
+ 'scoreboard_add_objective', 'scoreboard_remove_objective',
28
+ 'scoreboard_display', 'scoreboard_hide',
29
+ // Team management
30
+ 'team_add', 'team_remove', 'team_join', 'team_leave', 'team_option',
31
+ // Bossbar management
32
+ 'bossbar_add', 'bossbar_remove', 'bossbar_set_value', 'bossbar_get_value',
33
+ 'bossbar_set_max', 'bossbar_set_color', 'bossbar_set_style',
34
+ 'bossbar_set_visible', 'bossbar_set_players',
35
+ // Data / NBT
36
+ 'data_get', 'data_merge',
24
37
  ])
25
38
 
26
39
  // ---------------------------------------------------------------------------
@@ -47,7 +60,14 @@ export function detectMacroFunctions(hir: HIRModule): Map<string, MacroFunctionI
47
60
  if (macroParams.size > 0) {
48
61
  const paramTypes = new Map<string, string>()
49
62
  for (const p of fn.params) {
50
- const typeName = p.type?.kind === 'named' ? (p.type as any).name : 'int'
63
+ let typeName: string
64
+ if (p.type?.kind === 'named') {
65
+ typeName = (p.type as any).name
66
+ } else if (p.type?.kind === 'selector' || p.type?.kind === 'entity') {
67
+ typeName = 'selector'
68
+ } else {
69
+ typeName = 'int'
70
+ }
51
71
  paramTypes.set(p.name, typeName)
52
72
  }
53
73
  result.set(fn.name, { macroParams, paramTypes })
@@ -62,7 +82,14 @@ export function detectMacroFunctions(hir: HIRModule): Map<string, MacroFunctionI
62
82
  if (macroParams.size > 0) {
63
83
  const paramTypes = new Map<string, string>()
64
84
  for (const p of m.params) {
65
- const typeName = p.type?.kind === 'named' ? (p.type as any).name : 'int'
85
+ let typeName: string
86
+ if (p.type?.kind === 'named') {
87
+ typeName = (p.type as any).name
88
+ } else if (p.type?.kind === 'selector' || p.type?.kind === 'entity') {
89
+ typeName = 'selector'
90
+ } else {
91
+ typeName = 'int'
92
+ }
66
93
  paramTypes.set(p.name, typeName)
67
94
  }
68
95
  result.set(`${ib.typeName}::${m.name}`, { macroParams, paramTypes })
@@ -102,6 +129,7 @@ function scanStmt(stmt: HIRStmt, paramNames: Set<string>, macroParams: Set<strin
102
129
  for (const arm of stmt.arms) scanBlock(arm.body, paramNames, macroParams)
103
130
  break
104
131
  case 'execute': scanBlock(stmt.body, paramNames, macroParams); break
132
+ case 'labeled_loop': scanStmt(stmt.body, paramNames, macroParams); break
105
133
  case 'raw': break
106
134
  }
107
135
  }
package/src/mir/types.ts CHANGED
@@ -66,10 +66,12 @@ export type MIRInstr = MIRInstrBase & (
66
66
  | { kind: 'mul'; dst: Temp; a: Operand; b: Operand }
67
67
  | { kind: 'div'; dst: Temp; a: Operand; b: Operand }
68
68
  | { kind: 'mod'; dst: Temp; a: Operand; b: Operand }
69
+ | { kind: 'pow'; dst: Temp; a: Operand; b: Operand }
69
70
  | { kind: 'neg'; dst: Temp; src: Operand }
70
71
 
71
72
  // ── Comparison (result is 0 or 1) ────────────────────────────────────────
72
73
  | { kind: 'cmp'; dst: Temp; op: CmpOp; a: Operand; b: Operand }
74
+ | { kind: 'string_match'; dst: Temp; ns: string; path: string; value: string }
73
75
 
74
76
  // ── Boolean logic ────────────────────────────────────────────────────────
75
77
  | { kind: 'and'; dst: Temp; a: Operand; b: Operand }
@@ -115,10 +117,21 @@ export interface MIRFunction {
115
117
  blocks: MIRBlock[]
116
118
  entry: BlockId // entry block id (always 'entry')
117
119
  isMacro: boolean // true if any param is a macro param
120
+ sourceLoc?: SourceLoc
121
+ sourceSnippet?: string
118
122
  }
119
123
 
120
124
  export interface MIRModule {
121
125
  functions: MIRFunction[]
122
126
  namespace: string
123
127
  objective: string // scoreboard objective (default: __<namespace>)
128
+ /** Set of fully-qualified function names marked @inline. */
129
+ inlineFunctions?: Set<string>
130
+ /** Set of fully-qualified function names marked @no-inline. */
131
+ noInlineFunctions?: Set<string>
132
+ /**
133
+ * Set of function names that were auto-inlined and whose definitions should
134
+ * still be emitted as separate .mcfunction files (so library callers work).
135
+ */
136
+ keepInOutput?: Set<string>
124
137
  }
package/src/mir/verify.ts CHANGED
@@ -106,6 +106,11 @@ function verifyFunction(fn: MIRFunction): VerifyError[] {
106
106
  // Collect all defined temps: params + all dst fields in instructions
107
107
  const allDefs = new Set<Temp>()
108
108
  for (const p of fn.params) allDefs.add(p.name)
109
+ // __rf_* temps are "return frame" slots set by the callee at runtime.
110
+ // Pre-seed them so the verifier doesn't false-positive on caller reads.
111
+ for (let i = 0; i < 16; i++) allDefs.add(`__rf_${i}`)
112
+ allDefs.add('__rf_has')
113
+ allDefs.add('__rf_val')
109
114
  for (const block of fn.blocks) {
110
115
  for (const instr of block.instrs) {
111
116
  const dst = getDst(instr)
@@ -159,9 +164,10 @@ function getDst(instr: MIRInstr): Temp | null {
159
164
  switch (instr.kind) {
160
165
  case 'const':
161
166
  case 'copy':
162
- case 'add': case 'sub': case 'mul': case 'div': case 'mod':
167
+ case 'add': case 'sub': case 'mul': case 'div': case 'mod': case 'pow':
163
168
  case 'neg':
164
169
  case 'cmp':
170
+ case 'string_match':
165
171
  case 'and': case 'or': case 'not':
166
172
  case 'nbt_read':
167
173
  case 'nbt_read_dynamic':
@@ -189,11 +195,13 @@ function getUsedTemps(instr: MIRInstr): Temp[] {
189
195
  case 'not':
190
196
  temps.push(...getOperandTemps(instr.src))
191
197
  break
192
- case 'add': case 'sub': case 'mul': case 'div': case 'mod':
198
+ case 'add': case 'sub': case 'mul': case 'div': case 'mod': case 'pow':
193
199
  case 'cmp':
194
200
  case 'and': case 'or':
195
201
  temps.push(...getOperandTemps(instr.a), ...getOperandTemps(instr.b))
196
202
  break
203
+ case 'string_match':
204
+ break
197
205
  case 'nbt_read':
198
206
  case 'nbt_list_len':
199
207
  break
@@ -0,0 +1,86 @@
1
+ import type { MIRFunction, MIRModule } from '../mir/types'
2
+ import { inlinePass } from './inline'
3
+
4
+ const SMALL_FUNCTION_INSTR_LIMIT = 5
5
+
6
+ export function autoInlineSmallFunctions(mod: MIRModule): MIRModule {
7
+ const recursiveFns = findRecursiveFunctions(mod.functions)
8
+ const noInlineFns = mod.noInlineFunctions ?? new Set<string>()
9
+ const autoInlineFns = new Set<string>()
10
+
11
+ for (const fn of mod.functions) {
12
+ if (fn.isMacro) continue
13
+ if (noInlineFns.has(fn.name)) continue
14
+ if (recursiveFns.has(fn.name)) continue
15
+ if (countFunctionInstrs(fn) > SMALL_FUNCTION_INSTR_LIMIT) continue
16
+ // Don't auto-inline functions with raw() calls — these reference
17
+ // MC calling-convention registers ($p0, etc.) that become invalid when inlined.
18
+ if (containsRawCall(fn)) continue
19
+ autoInlineFns.add(fn.name)
20
+ }
21
+
22
+ const inlineFunctions = new Set(mod.inlineFunctions ?? [])
23
+ for (const fnName of autoInlineFns) inlineFunctions.add(fnName)
24
+
25
+ // Track auto-inlined functions so compile pipeline can keep their output files
26
+ const keepInOutput = new Set(mod.keepInOutput ?? [])
27
+ for (const fnName of autoInlineFns) keepInOutput.add(fnName)
28
+
29
+ return inlinePass({ ...mod, inlineFunctions, keepInOutput })
30
+ }
31
+
32
+ function containsRawCall(fn: MIRFunction): boolean {
33
+ for (const block of fn.blocks) {
34
+ for (const instr of block.instrs) {
35
+ if (instr.kind === 'call' && instr.fn.startsWith('__raw:')) return true
36
+ }
37
+ }
38
+ return false
39
+ }
40
+
41
+ function countFunctionInstrs(fn: MIRFunction): number {
42
+ let count = 0
43
+ for (const block of fn.blocks) {
44
+ count += block.instrs.length + 1
45
+ }
46
+ return count
47
+ }
48
+
49
+ function findRecursiveFunctions(functions: MIRFunction[]): Set<string> {
50
+ const fnNames = new Set(functions.map(fn => fn.name))
51
+ const edges = new Map<string, Set<string>>()
52
+
53
+ for (const fn of functions) {
54
+ const callees = new Set<string>()
55
+ for (const block of fn.blocks) {
56
+ for (const instr of block.instrs) {
57
+ if ((instr.kind === 'call' || instr.kind === 'call_macro') && fnNames.has(instr.fn)) {
58
+ callees.add(instr.fn)
59
+ }
60
+ }
61
+ }
62
+ edges.set(fn.name, callees)
63
+ }
64
+
65
+ const recursive = new Set<string>()
66
+
67
+ for (const fn of functions) {
68
+ const seen = new Set<string>()
69
+ const stack = [...(edges.get(fn.name) ?? [])]
70
+
71
+ while (stack.length > 0) {
72
+ const current = stack.pop()!
73
+ if (current === fn.name) {
74
+ recursive.add(fn.name)
75
+ break
76
+ }
77
+ if (seen.has(current)) continue
78
+ seen.add(current)
79
+ for (const next of edges.get(current) ?? []) {
80
+ stack.push(next)
81
+ }
82
+ }
83
+ }
84
+
85
+ return recursive
86
+ }
@@ -70,7 +70,7 @@ function rewriteUses(instr: MIRInstr, copies: Map<Temp, Operand>): MIRInstr {
70
70
  case 'neg':
71
71
  case 'not':
72
72
  return { ...instr, src: resolve(instr.src, copies) }
73
- case 'add': case 'sub': case 'mul': case 'div': case 'mod':
73
+ case 'add': case 'sub': case 'mul': case 'div': case 'mod': case 'pow':
74
74
  case 'and': case 'or':
75
75
  return { ...instr, a: resolve(instr.a, copies), b: resolve(instr.b, copies) }
76
76
  case 'cmp':
@@ -99,7 +99,7 @@ function rewriteUses(instr: MIRInstr, copies: Map<Temp, Operand>): MIRInstr {
99
99
  function getDst(instr: MIRInstr): Temp | null {
100
100
  switch (instr.kind) {
101
101
  case 'const': case 'copy':
102
- case 'add': case 'sub': case 'mul': case 'div': case 'mod':
102
+ case 'add': case 'sub': case 'mul': case 'div': case 'mod': case 'pow':
103
103
  case 'neg': case 'cmp':
104
104
  case 'and': case 'or': case 'not':
105
105
  case 'nbt_read':
@@ -988,7 +988,7 @@ function rewriteInstr(instr: MIRInstr, promoted: Map<Temp, Temp>): MIRInstr {
988
988
  return { ...instr, dst: rTemp(instr.dst) }
989
989
  case 'copy':
990
990
  return { ...instr, dst: rTemp(instr.dst), src: rOp(instr.src) }
991
- case 'add': case 'sub': case 'mul': case 'div': case 'mod':
991
+ case 'add': case 'sub': case 'mul': case 'div': case 'mod': case 'pow':
992
992
  return { ...instr, dst: rTemp(instr.dst), a: rOp(instr.a), b: rOp(instr.b) }
993
993
  case 'neg':
994
994
  return { ...instr, dst: rTemp(instr.dst), src: rOp(instr.src) }
@@ -1057,7 +1057,7 @@ function getSuccessors(term: MIRInstr): BlockId[] {
1057
1057
  function getDst(instr: MIRInstr): Temp | null {
1058
1058
  switch (instr.kind) {
1059
1059
  case 'const': case 'copy':
1060
- case 'add': case 'sub': case 'mul': case 'div': case 'mod':
1060
+ case 'add': case 'sub': case 'mul': case 'div': case 'mod': case 'pow':
1061
1061
  case 'neg': case 'cmp':
1062
1062
  case 'and': case 'or': case 'not':
1063
1063
  case 'nbt_read':
@@ -1077,7 +1077,7 @@ function getUsedTemps(instr: MIRInstr): Temp[] {
1077
1077
  switch (instr.kind) {
1078
1078
  case 'copy': case 'neg': case 'not':
1079
1079
  addOp(instr.src); break
1080
- case 'add': case 'sub': case 'mul': case 'div': case 'mod':
1080
+ case 'add': case 'sub': case 'mul': case 'div': case 'mod': case 'pow':
1081
1081
  case 'cmp': case 'and': case 'or':
1082
1082
  addOp(instr.a); addOp(instr.b); break
1083
1083
  case 'nbt_write':
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Common Subexpression Elimination (CSE) — MIR optimization pass.
3
+ *
4
+ * Performs local (intra-block) CSE: within each BasicBlock, if a pure
5
+ * computation has already been computed and its operands haven't been
6
+ * overwritten since, reuse the previous result via a `copy` instead of
7
+ * recomputing.
8
+ *
9
+ * Pure instructions considered:
10
+ * add, sub, mul, div, mod, neg, cmp, and, or, not
11
+ *
12
+ * Side-effect instructions that invalidate expressions when their
13
+ * destination (or any operand) is overwritten:
14
+ * score_write, nbt_write, nbt_write_dynamic, call, call_macro,
15
+ * call_context, and any instruction that redefines a temp.
16
+ *
17
+ * Global (cross-block) CSE is not performed — only per-block.
18
+ */
19
+
20
+ import type { MIRFunction, MIRBlock, MIRInstr, Operand, Temp } from '../mir/types'
21
+
22
+ // ---------------------------------------------------------------------------
23
+ // Expression key helpers
24
+ // ---------------------------------------------------------------------------
25
+
26
+ function operandKey(op: Operand): string {
27
+ return op.kind === 'const' ? `c:${op.value}` : `t:${op.name}`
28
+ }
29
+
30
+ /** Commutative ops — operand order doesn't matter. */
31
+ const COMMUTATIVE = new Set(['add', 'mul', 'and', 'or'])
32
+
33
+ function exprKey(instr: MIRInstr): string | null {
34
+ switch (instr.kind) {
35
+ case 'add':
36
+ case 'sub':
37
+ case 'mul':
38
+ case 'div':
39
+ case 'mod':
40
+ case 'pow':
41
+ case 'and':
42
+ case 'or': {
43
+ const ka = operandKey(instr.a)
44
+ const kb = operandKey(instr.b)
45
+ const [l, r] = COMMUTATIVE.has(instr.kind) && ka > kb ? [kb, ka] : [ka, kb]
46
+ return `${instr.kind}:${l}:${r}`
47
+ }
48
+ case 'neg':
49
+ case 'not':
50
+ return `${instr.kind}:${operandKey(instr.src)}`
51
+ case 'cmp': {
52
+ const ka = operandKey(instr.a)
53
+ const kb = operandKey(instr.b)
54
+ return `cmp:${instr.op}:${ka}:${kb}`
55
+ }
56
+ default:
57
+ return null
58
+ }
59
+ }
60
+
61
+ // ---------------------------------------------------------------------------
62
+ // Temp defined by an instruction
63
+ // ---------------------------------------------------------------------------
64
+
65
+ function getDst(instr: MIRInstr): Temp | null {
66
+ switch (instr.kind) {
67
+ case 'const': case 'copy': case 'add': case 'sub': case 'mul':
68
+ case 'div': case 'mod': case 'pow': case 'neg': case 'not': case 'and':
69
+ case 'or': case 'cmp': case 'string_match': case 'nbt_read':
70
+ case 'nbt_read_dynamic': case 'nbt_list_len': case 'score_read':
71
+ return instr.dst
72
+ case 'call': case 'call_macro':
73
+ return instr.dst
74
+ default:
75
+ return null
76
+ }
77
+ }
78
+
79
+ /** Temps used as operands in an instruction (for invalidation). */
80
+ function getUsedTemps(instr: MIRInstr): Temp[] {
81
+ const temps: Temp[] = []
82
+ const add = (op: Operand) => { if (op.kind === 'temp') temps.push(op.name) }
83
+ switch (instr.kind) {
84
+ case 'copy': add(instr.src); break
85
+ case 'neg': case 'not': add(instr.src); break
86
+ case 'add': case 'sub': case 'mul': case 'div': case 'mod': case 'pow':
87
+ case 'and': case 'or': add(instr.a); add(instr.b); break
88
+ case 'cmp': add(instr.a); add(instr.b); break
89
+ case 'nbt_write': add(instr.src); break
90
+ case 'nbt_write_dynamic': add(instr.indexSrc); add(instr.valueSrc); break
91
+ case 'nbt_read_dynamic': add(instr.indexSrc); break
92
+ case 'score_write': add(instr.src); break
93
+ case 'call': instr.args.forEach(add); break
94
+ case 'call_macro': instr.args.forEach(a => add(a.value)); break
95
+ case 'branch': add(instr.cond); break
96
+ case 'return': if (instr.value) add(instr.value); break
97
+ case 'jump': break
98
+ }
99
+ return temps
100
+ }
101
+
102
+ // ---------------------------------------------------------------------------
103
+ // Block-level CSE
104
+ // ---------------------------------------------------------------------------
105
+
106
+ function cseBlock(block: MIRBlock): MIRBlock {
107
+ // Map: expression key → temp holding the already-computed result
108
+ const available = new Map<string, Temp>()
109
+ // Map: temp → set of expression keys that depend on it (for invalidation)
110
+ const tempDeps = new Map<Temp, Set<string>>()
111
+
112
+ function recordDep(key: string, deps: Temp[]) {
113
+ for (const dep of deps) {
114
+ if (!tempDeps.has(dep)) tempDeps.set(dep, new Set())
115
+ tempDeps.get(dep)!.add(key)
116
+ }
117
+ }
118
+
119
+ function invalidate(temp: Temp) {
120
+ // Remove all expressions that depend on this temp
121
+ const keys = tempDeps.get(temp)
122
+ if (keys) {
123
+ for (const key of keys) {
124
+ available.delete(key)
125
+ }
126
+ tempDeps.delete(temp)
127
+ }
128
+ // Also remove any expression whose result was stored in this temp
129
+ for (const [key, resultTemp] of available) {
130
+ if (resultTemp === temp) {
131
+ available.delete(key)
132
+ }
133
+ }
134
+ }
135
+
136
+ const instrs: MIRInstr[] = []
137
+
138
+ for (const instr of block.instrs) {
139
+ const key = exprKey(instr)
140
+
141
+ if (key !== null) {
142
+ const existing = available.get(key)
143
+ if (existing !== undefined) {
144
+ const dst = getDst(instr)!
145
+ // Don't CSE self-modifying instructions (dst is one of the source temps).
146
+ // e.g. t5 = t5 + 1: each occurrence uses a different value of t5.
147
+ const selfModifying = getUsedTemps(instr).includes(dst)
148
+ if (!selfModifying) {
149
+ // Replace with a copy from the already-computed temp
150
+ instrs.push({ kind: 'copy', dst, src: { kind: 'temp', name: existing } })
151
+ // But do invalidate any previous mapping for dst if it existed
152
+ invalidate(dst)
153
+ continue
154
+ }
155
+ }
156
+ }
157
+
158
+ // Process instruction normally
159
+ const dst = getDst(instr)
160
+ if (dst !== null) {
161
+ // Invalidate expressions that used the old value of dst
162
+ invalidate(dst)
163
+ }
164
+
165
+ if (key !== null && dst !== null) {
166
+ // Record this new expression
167
+ available.set(key, dst)
168
+ // Track which temps this expression depends on
169
+ const deps = getUsedTemps(instr)
170
+ recordDep(key, deps)
171
+ } else if (
172
+ // Side-effect instructions that may alias-write through external state:
173
+ // call, call_macro, call_context, score_write, nbt_write, nbt_write_dynamic
174
+ // These don't define a Temp dst we can track, but they invalidate expressions
175
+ // that read from the same external state. For safety, clear all non-temp
176
+ // expressions (conservative approach for local CSE).
177
+ instr.kind === 'call' ||
178
+ instr.kind === 'call_macro' ||
179
+ instr.kind === 'call_context' ||
180
+ instr.kind === 'score_write' ||
181
+ instr.kind === 'nbt_write' ||
182
+ instr.kind === 'nbt_write_dynamic'
183
+ ) {
184
+ // For calls and writes, we conservatively clear ALL available expressions
185
+ // since they may have side effects or alias effects we can't track locally.
186
+ available.clear()
187
+ tempDeps.clear()
188
+ }
189
+
190
+ instrs.push(instr)
191
+ }
192
+
193
+ return { ...block, instrs }
194
+ }
195
+
196
+ // ---------------------------------------------------------------------------
197
+ // Public pass entry point
198
+ // ---------------------------------------------------------------------------
199
+
200
+ export function cse(fn: MIRFunction): MIRFunction {
201
+ return {
202
+ ...fn,
203
+ blocks: fn.blocks.map(cseBlock),
204
+ }
205
+ }
@@ -99,7 +99,7 @@ function getTermTargets(term: MIRInstr): BlockId[] {
99
99
  function getDst(instr: MIRInstr): Temp | null {
100
100
  switch (instr.kind) {
101
101
  case 'const': case 'copy':
102
- case 'add': case 'sub': case 'mul': case 'div': case 'mod':
102
+ case 'add': case 'sub': case 'mul': case 'div': case 'mod': case 'pow':
103
103
  case 'neg': case 'cmp':
104
104
  case 'and': case 'or': case 'not':
105
105
  case 'nbt_read':
@@ -121,7 +121,7 @@ function getUsedTemps(instr: MIRInstr): Temp[] {
121
121
  switch (instr.kind) {
122
122
  case 'copy': case 'neg': case 'not':
123
123
  addOp(instr.src); break
124
- case 'add': case 'sub': case 'mul': case 'div': case 'mod':
124
+ case 'add': case 'sub': case 'mul': case 'div': case 'mod': case 'pow':
125
125
  case 'cmp': case 'and': case 'or':
126
126
  addOp(instr.a); addOp(instr.b); break
127
127
  case 'nbt_write':