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
@@ -250,6 +250,15 @@ export type Expr = {
250
250
  enumName: string;
251
251
  variant: string;
252
252
  span?: Span;
253
+ } | {
254
+ kind: 'enum_construct';
255
+ enumName: string;
256
+ variant: string;
257
+ args: {
258
+ name: string;
259
+ value: Expr;
260
+ }[];
261
+ span?: Span;
253
262
  } | (LambdaExpr & {
254
263
  span?: Span;
255
264
  }) | {
@@ -263,6 +272,11 @@ export type Expr = {
263
272
  } | {
264
273
  kind: 'none_lit';
265
274
  span?: Span;
275
+ } | {
276
+ kind: 'unwrap_or';
277
+ opt: Expr;
278
+ default_: Expr;
279
+ span?: Span;
266
280
  } | {
267
281
  kind: 'type_cast';
268
282
  expr: Expr;
@@ -387,6 +401,11 @@ export type MatchPattern = {
387
401
  } | {
388
402
  kind: 'PatExpr';
389
403
  expr: Expr;
404
+ } | {
405
+ kind: 'PatEnum';
406
+ enumName: string;
407
+ variant: string;
408
+ bindings: string[];
390
409
  };
391
410
  export type Stmt = {
392
411
  kind: 'let';
@@ -400,6 +419,12 @@ export type Stmt = {
400
419
  type?: TypeNode;
401
420
  init: Expr;
402
421
  span?: Span;
422
+ } | {
423
+ kind: 'const_decl';
424
+ name: string;
425
+ type: TypeNode;
426
+ value: Expr;
427
+ span?: Span;
403
428
  } | {
404
429
  kind: 'expr';
405
430
  expr: Expr;
@@ -414,6 +439,19 @@ export type Stmt = {
414
439
  } | {
415
440
  kind: 'continue';
416
441
  span?: Span;
442
+ } | {
443
+ kind: 'break_label';
444
+ label: string;
445
+ span?: Span;
446
+ } | {
447
+ kind: 'continue_label';
448
+ label: string;
449
+ span?: Span;
450
+ } | {
451
+ kind: 'labeled_loop';
452
+ label: string;
453
+ body: Stmt;
454
+ span?: Span;
417
455
  } | {
418
456
  kind: 'if';
419
457
  cond: Expr;
@@ -425,6 +463,16 @@ export type Stmt = {
425
463
  cond: Expr;
426
464
  body: Block;
427
465
  span?: Span;
466
+ } | {
467
+ kind: 'do_while';
468
+ cond: Expr;
469
+ body: Block;
470
+ span?: Span;
471
+ } | {
472
+ kind: 'repeat';
473
+ count: number;
474
+ body: Block;
475
+ span?: Span;
428
476
  } | {
429
477
  kind: 'for';
430
478
  init?: Stmt;
@@ -475,6 +523,12 @@ export type Stmt = {
475
523
  then: Block;
476
524
  else_?: Block;
477
525
  span?: Span;
526
+ } | {
527
+ kind: 'while_let_some';
528
+ binding: string;
529
+ init: Expr;
530
+ body: Block;
531
+ span?: Span;
478
532
  } | {
479
533
  kind: 'as_block';
480
534
  selector: EntitySelector;
@@ -503,9 +557,10 @@ export type Stmt = {
503
557
  };
504
558
  export type Block = Stmt[];
505
559
  export interface Decorator {
506
- name: 'tick' | 'load' | 'on' | 'on_trigger' | 'on_advancement' | 'on_craft' | 'on_death' | 'on_login' | 'on_join_team' | 'keep' | 'require_on_load' | 'coroutine' | 'schedule';
560
+ name: 'tick' | 'load' | 'watch' | 'on' | 'on_trigger' | 'on_advancement' | 'on_craft' | 'on_death' | 'on_login' | 'on_join_team' | 'keep' | 'require_on_load' | 'coroutine' | 'schedule' | 'deprecated' | 'inline' | 'no-inline' | 'config' | 'singleton' | 'profile' | 'throttle' | 'retry' | 'memoize' | 'test';
507
561
  args?: {
508
562
  rate?: number;
563
+ objective?: string;
509
564
  eventType?: string;
510
565
  trigger?: string;
511
566
  advancement?: string;
@@ -514,6 +569,16 @@ export interface Decorator {
514
569
  batch?: number;
515
570
  onDone?: string;
516
571
  ticks?: number;
572
+ /** @deprecated decorator message */
573
+ message?: string;
574
+ /** @config decorator: config key name */
575
+ configKey?: string;
576
+ /** @config decorator: default value */
577
+ configDefault?: number;
578
+ /** @retry decorator: max retry count */
579
+ max?: number;
580
+ /** @test decorator: human-readable test label */
581
+ testLabel?: string;
517
582
  };
518
583
  /** Raw positional arguments (used by @requires and future generic decorators). */
519
584
  rawArgs?: Array<{
@@ -536,6 +601,8 @@ export interface FnDecl {
536
601
  isLibraryFn?: boolean;
537
602
  /** True when declared with `export fn` or `@keep fn` — survives DCE. */
538
603
  isExported?: boolean;
604
+ /** Scoreboard objective watched by @watch("..."), if present. */
605
+ watchObjective?: string;
539
606
  name: string;
540
607
  /** Generic type parameter names, e.g. ['T'] for fn foo<T>(...) */
541
608
  typeParams?: string[];
@@ -544,6 +611,7 @@ export interface FnDecl {
544
611
  decorators: Decorator[];
545
612
  body: Block;
546
613
  span?: Span;
614
+ sourceFile?: string;
547
615
  }
548
616
  export interface StructField {
549
617
  name: string;
@@ -551,18 +619,42 @@ export interface StructField {
551
619
  }
552
620
  export interface StructDecl {
553
621
  name: string;
622
+ extends?: string;
554
623
  fields: StructField[];
624
+ /** True when the struct was declared with `@singleton` */
625
+ isSingleton?: boolean;
555
626
  span?: Span;
556
627
  }
557
628
  export interface ImplBlock {
558
629
  kind: 'impl_block';
559
630
  typeName: string;
631
+ /** Trait name when declared as `impl TraitName for TypeName` (e.g. "Display") */
632
+ traitName?: string;
560
633
  methods: FnDecl[];
561
634
  span?: Span;
562
635
  }
636
+ /** A method signature in an interface body (no body) */
637
+ export interface InterfaceMethod {
638
+ name: string;
639
+ params: Param[];
640
+ returnType?: TypeNode;
641
+ span?: Span;
642
+ }
643
+ /** `interface Drawable { fn draw(self, x: int, y: int) ... }` */
644
+ export interface InterfaceDecl {
645
+ name: string;
646
+ methods: InterfaceMethod[];
647
+ span?: Span;
648
+ }
649
+ export interface EnumPayloadField {
650
+ name: string;
651
+ type: TypeNode;
652
+ }
563
653
  export interface EnumVariant {
564
654
  name: string;
565
655
  value?: number;
656
+ /** Payload fields for tuple-like variants, e.g. RGB(r: int, g: int, b: int) */
657
+ fields?: EnumPayloadField[];
566
658
  }
567
659
  export interface EnumDecl {
568
660
  name: string;
@@ -581,13 +673,18 @@ export interface GlobalDecl {
581
673
  type: TypeNode;
582
674
  init: Expr;
583
675
  mutable: boolean;
676
+ /** Present when the global was declared with @config("key", default: value) */
677
+ configKey?: string;
678
+ /** Default value for @config globals */
679
+ configDefault?: number;
584
680
  span?: Span;
585
681
  }
586
682
  export interface ImportDecl {
587
683
  /** The module being imported from, e.g. "math" in `import math::sin` */
588
684
  moduleName: string;
589
- /** The symbol being imported, or '*' for wildcard */
590
- symbol: string;
685
+ /** The symbol being imported, or '*' for wildcard.
686
+ * Undefined when this is a whole-module file import (`import player_utils`). */
687
+ symbol?: string;
591
688
  span?: Span;
592
689
  }
593
690
  export interface Program {
@@ -602,6 +699,8 @@ export interface Program {
602
699
  consts: ConstDecl[];
603
700
  /** Phase 5b: module imports (`import math::sin;`) */
604
701
  imports: ImportDecl[];
702
+ /** Interface / trait declarations */
703
+ interfaces: InterfaceDecl[];
605
704
  /** True when the source file declares `module library;`.
606
705
  * Library-mode: all functions are DCE-eligible by default — none are treated
607
706
  * as MC entry points unless they carry @tick / @load / @on / @keep etc. */
@@ -1,14 +1,18 @@
1
1
  /**
2
- * Incremental compilation — only recompile files whose content (or
3
- * dependencies) has changed since the last build.
2
+ * Incremental compilation — only recompile files whose content, imports,
3
+ * or reverse dependents changed since the last build.
4
4
  */
5
- import { type CompileResult } from '../emit/compile';
5
+ import { type CompileOptions, type CompileResult } from '../emit/compile';
6
6
  import { FileCache } from './index';
7
7
  import { DependencyGraph } from './deps';
8
8
  export interface IncrementalOptions {
9
9
  namespace?: string;
10
10
  /** Output directory for compiled files. */
11
11
  output: string;
12
+ generateSourceMap?: boolean;
13
+ mcVersion?: CompileOptions['mcVersion'];
14
+ lenient?: boolean;
15
+ includeDirs?: string[];
12
16
  }
13
17
  export interface IncrementalResult {
14
18
  /** Number of files that were recompiled. */
@@ -19,17 +23,12 @@ export interface IncrementalResult {
19
23
  errors: Map<string, string>;
20
24
  /** Per-file compile results (only for recompiled files). */
21
25
  results: Map<string, CompileResult>;
26
+ /** Files skipped due to cache hit. */
27
+ skippedFiles: string[];
28
+ /** Files rebuilt in this run. */
29
+ rebuiltFiles: string[];
30
+ /** Elapsed wall time for this run. */
31
+ elapsedMs: number;
22
32
  }
23
- /**
24
- * Compile a set of entry files incrementally.
25
- *
26
- * For each file:
27
- * - Compute content hash of the file and all its transitive imports
28
- * - If all hashes match the previous build → skip (cache hit)
29
- * - If any hash changed → recompile from scratch
30
- */
31
33
  export declare function compileIncremental(files: string[], cache: FileCache, depGraph: DependencyGraph, options: IncrementalOptions): IncrementalResult;
32
- /**
33
- * Reset the in-memory compile cache. Useful for testing.
34
- */
35
34
  export declare function resetCompileCache(): void;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /**
3
- * Incremental compilation — only recompile files whose content (or
4
- * dependencies) has changed since the last build.
3
+ * Incremental compilation — only recompile files whose content, imports,
4
+ * or reverse dependents changed since the last build.
5
5
  */
6
6
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
7
  if (k2 === undefined) k2 = k;
@@ -39,127 +39,144 @@ var __importStar = (this && this.__importStar) || (function () {
39
39
  Object.defineProperty(exports, "__esModule", { value: true });
40
40
  exports.compileIncremental = compileIncremental;
41
41
  exports.resetCompileCache = resetCompileCache;
42
+ const fs = __importStar(require("fs"));
42
43
  const path = __importStar(require("path"));
43
44
  const compile_1 = require("../emit/compile");
44
- const fs = __importStar(require("fs"));
45
- const compiledCache = new Map();
46
- /**
47
- * Compile a set of entry files incrementally.
48
- *
49
- * For each file:
50
- * - Compute content hash of the file and all its transitive imports
51
- * - If all hashes match the previous build → skip (cache hit)
52
- * - If any hash changed → recompile from scratch
53
- */
45
+ const deps_1 = require("./deps");
54
46
  function compileIncremental(files, cache, depGraph, options) {
47
+ const start = Date.now();
48
+ const normalizedEntries = [...new Set(files.map(file => path.resolve(file)))];
55
49
  const result = {
56
50
  recompiled: 0,
57
51
  cached: 0,
58
52
  errors: new Map(),
59
53
  results: new Map(),
54
+ skippedFiles: [],
55
+ rebuiltFiles: [],
56
+ elapsedMs: 0,
60
57
  };
61
- // Phase 1: Update dependency graph for all files
62
- for (const file of files) {
63
- const absFile = path.resolve(file);
64
- try {
65
- const source = fs.readFileSync(absFile, 'utf-8');
66
- depGraph.addFile(absFile, source);
67
- }
68
- catch {
69
- // File might have been deleted
70
- depGraph.removeFile(absFile);
71
- }
58
+ if (normalizedEntries.length === 0) {
59
+ result.elapsedMs = Date.now() - start;
60
+ return result;
72
61
  }
73
- // Phase 2: Detect all changed source files BEFORE recompiling anything.
74
- // This prevents cache.update() during one file's recompile from hiding
75
- // changes needed by another file that shares the same dependency.
76
- const changedSourceFiles = new Set();
77
- const allSourceFiles = new Set();
78
- for (const file of files) {
79
- const absFile = path.resolve(file);
80
- const allDeps = depGraph.getTransitiveDeps(absFile);
81
- allSourceFiles.add(absFile);
82
- for (const dep of allDeps)
83
- allSourceFiles.add(dep);
62
+ depGraph.clear();
63
+ const discoveredFiles = discoverDependencyGraph(normalizedEntries, depGraph);
64
+ const changedFiles = new Set();
65
+ for (const file of discoveredFiles) {
66
+ if (cache.hasChanged(file))
67
+ changedFiles.add(file);
84
68
  }
85
- for (const sourceFile of allSourceFiles) {
86
- if (cache.hasChanged(sourceFile)) {
87
- changedSourceFiles.add(sourceFile);
88
- }
69
+ const dirtyFiles = depGraph.computeDirtySet(changedFiles);
70
+ for (const entry of normalizedEntries) {
71
+ if (!discoveredFiles.has(entry))
72
+ dirtyFiles.add(entry);
89
73
  }
90
- // Phase 3: For each entry file, check if it or any dep changed → recompile
91
- for (const file of files) {
92
- const absFile = path.resolve(file);
93
- // Collect all files in this compilation unit (entry + transitive deps)
94
- const allDeps = depGraph.getTransitiveDeps(absFile);
95
- const unitFiles = [absFile, ...allDeps];
96
- // Check if any file in the unit has changed
97
- let needsRecompile = false;
98
- const prevEntry = compiledCache.get(absFile);
99
- if (!prevEntry) {
100
- needsRecompile = true;
101
- }
102
- else {
103
- for (const unitFile of unitFiles) {
104
- if (changedSourceFiles.has(unitFile)) {
105
- needsRecompile = true;
106
- break;
107
- }
108
- }
109
- // Also check if the set of dependencies changed
110
- if (!needsRecompile && prevEntry.depHashes.size !== unitFiles.length) {
111
- needsRecompile = true;
112
- }
113
- }
114
- if (!needsRecompile) {
115
- // Cache hit — write cached result to output
116
- const cached = compiledCache.get(absFile);
117
- writeBuildOutput(cached.result, options.output);
74
+ for (const entryFile of normalizedEntries) {
75
+ const entryDeps = depGraph.getTransitiveDeps(entryFile);
76
+ const entryUnit = new Set([entryFile, ...entryDeps]);
77
+ const cachedEntry = cache.get(entryFile);
78
+ const cachedDepList = new Set(cachedEntry?.dependencies ?? []);
79
+ const hasDependencyDrift = cachedDepList.size !== entryUnit.size ||
80
+ [...entryUnit].some(file => !cachedDepList.has(file));
81
+ const canUseCache = !dirtyFiles.has(entryFile) &&
82
+ !hasDependencyDrift &&
83
+ !!cachedEntry?.outputFiles &&
84
+ cachedEntry.outputFiles.length > 0;
85
+ if (canUseCache) {
86
+ writeBuildOutput(cachedEntry.outputFiles, options.output);
118
87
  result.cached++;
88
+ result.skippedFiles.push(entryFile);
119
89
  continue;
120
90
  }
121
- // Cache miss — recompile
122
91
  try {
123
- const source = fs.readFileSync(absFile, 'utf-8');
124
- const ns = options.namespace ?? deriveNamespace(absFile);
125
- const compileResult = (0, compile_1.compile)(source, { namespace: ns, filePath: absFile });
126
- // Update caches
127
- const depHashes = new Map();
128
- for (const unitFile of unitFiles) {
129
- cache.update(unitFile);
130
- const entry = cache.get(unitFile);
131
- if (entry)
132
- depHashes.set(unitFile, entry.hash);
92
+ const source = fs.readFileSync(entryFile, 'utf-8');
93
+ const ns = options.namespace ?? deriveNamespace(entryFile);
94
+ const compileResult = (0, compile_1.compile)(source, {
95
+ namespace: ns,
96
+ filePath: entryFile,
97
+ generateSourceMap: options.generateSourceMap,
98
+ mcVersion: options.mcVersion,
99
+ lenient: options.lenient,
100
+ includeDirs: options.includeDirs,
101
+ });
102
+ const outputFiles = cloneFiles(compileResult.files);
103
+ const compiledFunctions = outputFiles
104
+ .filter(file => file.path.endsWith('.mcfunction'))
105
+ .map(file => file.path);
106
+ removeStaleOutputs(cachedEntry?.outputFiles ?? [], outputFiles, options.output);
107
+ for (const file of entryUnit) {
108
+ cache.update(file);
109
+ }
110
+ const entryRecord = cache.get(entryFile);
111
+ if (entryRecord) {
112
+ entryRecord.compiledFunctions = compiledFunctions;
113
+ entryRecord.outputFiles = outputFiles;
114
+ entryRecord.dependencies = [...entryUnit].sort();
133
115
  }
134
- compiledCache.set(absFile, { result: compileResult, depHashes });
135
- writeBuildOutput(compileResult, options.output);
116
+ writeBuildOutput(outputFiles, options.output);
136
117
  result.recompiled++;
137
- result.results.set(absFile, compileResult);
118
+ result.results.set(entryFile, compileResult);
119
+ result.rebuiltFiles.push(entryFile);
138
120
  }
139
121
  catch (err) {
140
- result.errors.set(absFile, err.message);
122
+ result.errors.set(entryFile, err.message);
141
123
  }
142
124
  }
125
+ cache.save();
126
+ result.elapsedMs = Date.now() - start;
143
127
  return result;
144
128
  }
129
+ function discoverDependencyGraph(entries, depGraph) {
130
+ const visited = new Set();
131
+ const queue = [...entries];
132
+ while (queue.length > 0) {
133
+ const current = path.resolve(queue.shift());
134
+ if (visited.has(current))
135
+ continue;
136
+ visited.add(current);
137
+ try {
138
+ const source = fs.readFileSync(current, 'utf-8');
139
+ depGraph.addFile(current, source);
140
+ const imports = (0, deps_1.parseImports)(current, source);
141
+ for (const imported of imports) {
142
+ if (!visited.has(imported))
143
+ queue.push(imported);
144
+ }
145
+ }
146
+ catch {
147
+ depGraph.removeFile(current);
148
+ }
149
+ }
150
+ return visited;
151
+ }
152
+ function cloneFiles(files) {
153
+ return files.map(file => ({ path: file.path, content: file.content }));
154
+ }
145
155
  /** Write compile output files to the output directory. */
146
- function writeBuildOutput(compileResult, output) {
156
+ function writeBuildOutput(files, output) {
147
157
  fs.mkdirSync(output, { recursive: true });
148
- for (const dataFile of compileResult.files) {
158
+ for (const dataFile of files) {
149
159
  const filePath = path.join(output, dataFile.path);
150
160
  const dir = path.dirname(filePath);
151
161
  fs.mkdirSync(dir, { recursive: true });
152
162
  fs.writeFileSync(filePath, dataFile.content);
153
163
  }
154
164
  }
165
+ function removeStaleOutputs(previousFiles, nextFiles, output) {
166
+ if (previousFiles.length === 0)
167
+ return;
168
+ const nextPaths = new Set(nextFiles.map(file => file.path));
169
+ for (const oldFile of previousFiles) {
170
+ if (nextPaths.has(oldFile.path))
171
+ continue;
172
+ const targetPath = path.join(output, oldFile.path);
173
+ if (fs.existsSync(targetPath))
174
+ fs.rmSync(targetPath, { force: true });
175
+ }
176
+ }
155
177
  function deriveNamespace(filePath) {
156
178
  const basename = path.basename(filePath, path.extname(filePath));
157
179
  return basename.toLowerCase().replace(/[^a-z0-9]/g, '_');
158
180
  }
159
- /**
160
- * Reset the in-memory compile cache. Useful for testing.
161
- */
162
- function resetCompileCache() {
163
- compiledCache.clear();
164
- }
181
+ function resetCompileCache() { }
165
182
  //# sourceMappingURL=incremental.js.map
@@ -1,14 +1,20 @@
1
1
  /**
2
2
  * FileCache — content-hash-based compilation cache for incremental builds.
3
3
  *
4
- * Stores per-file content hashes and optional cached HIR modules.
5
- * Persists to `.redscript-cache/` as JSON.
4
+ * Stores per-file content hashes and optional cached output payloads.
5
+ * Persists to `.redscript-cache/cache.json`.
6
6
  */
7
7
  import type { HIRModule } from '../hir/types';
8
+ import type { DatapackFile } from '../emit';
9
+ export interface CachedOutputFile extends DatapackFile {
10
+ }
8
11
  export interface CacheEntry {
9
12
  hash: string;
10
13
  mtime: number;
11
14
  hir?: HIRModule;
15
+ compiledFunctions?: string[];
16
+ outputFiles?: CachedOutputFile[];
17
+ dependencies?: string[];
12
18
  }
13
19
  export declare class FileCache {
14
20
  private entries;
@@ -2,8 +2,8 @@
2
2
  /**
3
3
  * FileCache — content-hash-based compilation cache for incremental builds.
4
4
  *
5
- * Stores per-file content hashes and optional cached HIR modules.
6
- * Persists to `.redscript-cache/` as JSON.
5
+ * Stores per-file content hashes and optional cached output payloads.
6
+ * Persists to `.redscript-cache/cache.json`.
7
7
  */
8
8
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
9
  if (k2 === undefined) k2 = k;
@@ -117,12 +117,18 @@ class FileCache {
117
117
  save() {
118
118
  fs.mkdirSync(this.cacheDir, { recursive: true });
119
119
  const serialized = {
120
- version: 1,
120
+ version: 2,
121
121
  entries: {},
122
122
  };
123
123
  for (const [filePath, entry] of this.entries) {
124
124
  // Don't persist HIR — it contains non-serializable references
125
- serialized.entries[filePath] = { hash: entry.hash, mtime: entry.mtime };
125
+ serialized.entries[filePath] = {
126
+ hash: entry.hash,
127
+ mtime: entry.mtime,
128
+ compiledFunctions: entry.compiledFunctions,
129
+ outputFiles: entry.outputFiles,
130
+ dependencies: entry.dependencies,
131
+ };
126
132
  }
127
133
  const cachePath = path.join(this.cacheDir, 'cache.json');
128
134
  fs.writeFileSync(cachePath, JSON.stringify(serialized, null, 2));
@@ -132,10 +138,16 @@ class FileCache {
132
138
  const cachePath = path.join(this.cacheDir, 'cache.json');
133
139
  try {
134
140
  const data = JSON.parse(fs.readFileSync(cachePath, 'utf-8'));
135
- if (data.version !== 1)
141
+ if (data.version !== 2)
136
142
  return;
137
143
  for (const [filePath, entry] of Object.entries(data.entries)) {
138
- this.entries.set(filePath, { hash: entry.hash, mtime: entry.mtime });
144
+ this.entries.set(filePath, {
145
+ hash: entry.hash,
146
+ mtime: entry.mtime,
147
+ compiledFunctions: entry.compiledFunctions,
148
+ outputFiles: entry.outputFiles,
149
+ dependencies: entry.dependencies,
150
+ });
139
151
  }
140
152
  }
141
153
  catch {
package/dist/src/cli.d.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  * Usage:
6
6
  * redscript compile <file> [-o <out>] [--namespace <ns>]
7
7
  * redscript check <file>
8
+ * redscript init [project-name]
8
9
  * redscript repl
9
10
  * redscript version
10
11
  */