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
@@ -4,12 +4,15 @@
4
4
  * Pipeline: source → Lexer → Parser → TypeCheck → HIR → MIR → optimize → LIR → emit
5
5
  */
6
6
 
7
+ import * as fs from 'fs'
8
+ import * as path from 'path'
7
9
  import { Lexer } from '../lexer'
8
10
  import { Parser } from '../parser'
9
11
  import { preprocessSourceWithMetadata } from '../compile'
10
- import { DiagnosticError, parseErrorMessage } from '../diagnostics'
12
+ import { CheckFailedError, DiagnosticBundleError, DiagnosticError, parseErrorMessage } from '../diagnostics'
11
13
  import { lowerToHIR } from '../hir/lower'
12
14
  import { monomorphize } from '../hir/monomorphize'
15
+ import { checkDeprecatedCalls } from '../hir/deprecated'
13
16
  import { lowerToMIR } from '../mir/lower'
14
17
  import { optimizeModule } from '../optimizer/pipeline'
15
18
  import { lowerToLIR } from '../lir/lower'
@@ -37,6 +40,16 @@ export interface CompileOptions {
37
40
  lenient?: boolean
38
41
  /** Extra directories to search when resolving imports (in addition to relative and stdlib). */
39
42
  includeDirs?: string[]
43
+ /**
44
+ * Compile-time configuration values injected via @config decorator.
45
+ * Values provided here override the @config default values.
46
+ * e.g. { max_players: 10, difficulty: 3 }
47
+ */
48
+ config?: Record<string, number>
49
+ /** Internal: stop after parse + typecheck + HIR checks. */
50
+ stopAfterCheck?: boolean
51
+ /** When true, enable debug-only helpers such as @profile instrumentation. */
52
+ debug?: boolean
40
53
  }
41
54
 
42
55
  export interface CompileResult {
@@ -46,42 +59,174 @@ export interface CompileResult {
46
59
  readonly success: true
47
60
  }
48
61
 
62
+ function annotateFunctionSourceFiles(
63
+ program: {
64
+ declarations: Array<{ sourceFile?: string }>
65
+ implBlocks: Array<{ methods: Array<{ sourceFile?: string }> }>
66
+ },
67
+ sourceFile?: string,
68
+ ): void {
69
+ if (!sourceFile) return
70
+ for (const fn of program.declarations) fn.sourceFile = sourceFile
71
+ for (const impl of program.implBlocks) {
72
+ for (const method of impl.methods) method.sourceFile = sourceFile
73
+ }
74
+ }
75
+
76
+ function pruneLibraryFunctionFiles(
77
+ files: DatapackFile[],
78
+ libraryPaths: Set<string>,
79
+ ): DatapackFile[] {
80
+ if (libraryPaths.size === 0) return files
81
+
82
+ const fnPathToFilePath = new Map<string, string>()
83
+ for (const file of files) {
84
+ const match = file.path.match(/^data\/([^/]+)\/function\/(.+)\.mcfunction$/)
85
+ if (match) {
86
+ fnPathToFilePath.set(`${match[1]}:${match[2]}`, file.path)
87
+ }
88
+ }
89
+
90
+ const callGraph = new Map<string, Set<string>>()
91
+ const callPattern = /\bfunction\s+([\w\-]+:[\w\-./]+)/g
92
+ for (const file of files) {
93
+ if (!file.path.endsWith('.mcfunction')) continue
94
+ const called = new Set<string>()
95
+ let match: RegExpExecArray | null
96
+ callPattern.lastIndex = 0
97
+ while ((match = callPattern.exec(file.content)) !== null) {
98
+ called.add(match[1])
99
+ }
100
+ callGraph.set(file.path, called)
101
+ }
102
+
103
+ const reachableFiles = new Set<string>()
104
+ const queue: string[] = []
105
+ for (const file of files) {
106
+ if (!file.path.endsWith('.mcfunction')) continue
107
+ if (libraryPaths.has(file.path)) continue
108
+ queue.push(file.path)
109
+ reachableFiles.add(file.path)
110
+ }
111
+
112
+ while (queue.length > 0) {
113
+ const current = queue.shift()!
114
+ const called = callGraph.get(current) ?? new Set<string>()
115
+ for (const fnPath of called) {
116
+ const filePath = fnPathToFilePath.get(fnPath)
117
+ if (filePath && !reachableFiles.has(filePath)) {
118
+ reachableFiles.add(filePath)
119
+ queue.push(filePath)
120
+ }
121
+ }
122
+ }
123
+
124
+ return files.filter(file => !libraryPaths.has(file.path) || reachableFiles.has(file.path))
125
+ }
126
+
49
127
  export function compile(source: string, options: CompileOptions = {}): CompileResult {
50
- const { namespace = 'redscript', filePath, generateSourceMap = false, mcVersion = DEFAULT_MC_VERSION, lenient = false, includeDirs } = options
128
+ const {
129
+ namespace = 'redscript',
130
+ filePath,
131
+ generateSourceMap = false,
132
+ mcVersion = DEFAULT_MC_VERSION,
133
+ lenient = false,
134
+ includeDirs,
135
+ stopAfterCheck = false,
136
+ debug = false,
137
+ } = options
51
138
  const warnings: string[] = []
52
139
 
53
140
  // Preprocess: resolve import directives, merge imported sources
54
141
  const preprocessed = preprocessSourceWithMetadata(source, { filePath, includeDirs })
55
142
  const processedSource = preprocessed.source
56
143
 
57
- // Stage 1: Lex + Parse → AST
58
- const lexer = new Lexer(processedSource)
59
- const tokens = lexer.tokenize()
60
- const parser = new Parser(tokens, processedSource, filePath)
61
- const ast = parser.parse(namespace)
62
- warnings.push(...parser.warnings)
63
-
64
- // Merge library imports (files with `module library;`) into AST
65
- for (const li of preprocessed.libraryImports ?? []) {
66
- const libPreprocessed = preprocessSourceWithMetadata(li.source, { filePath: li.filePath })
67
- const libTokens = new Lexer(libPreprocessed.source, li.filePath).tokenize()
68
- const libParser = new Parser(libTokens, libPreprocessed.source, li.filePath)
69
- const libAst = libParser.parse(namespace)
70
- warnings.push(...libParser.warnings)
71
- for (const fn of libAst.declarations) fn.isLibraryFn = true
72
- ast.declarations.push(...libAst.declarations)
73
- ast.structs.push(...libAst.structs)
74
- ast.implBlocks.push(...libAst.implBlocks)
75
- ast.enums.push(...libAst.enums)
76
- ast.consts.push(...libAst.consts)
77
- ast.globals.push(...libAst.globals)
78
- }
144
+ try {
145
+ // Stage 1: Lex + Parse → AST
146
+ const lexer = new Lexer(processedSource)
147
+ const tokens = lexer.tokenize()
148
+ const parser = new Parser(tokens, processedSource, filePath)
149
+ const ast = parser.parse(namespace)
150
+ annotateFunctionSourceFiles(ast, filePath)
151
+ warnings.push(...parser.warnings)
152
+ if (parser.parseErrors.length > 0) {
153
+ throw stopAfterCheck ? new DiagnosticBundleError(parser.parseErrors) : parser.parseErrors[0]
154
+ }
79
155
 
80
- // Merge librarySources (v1 compat: inline library strings) before HIR
81
- if (options.librarySources) {
82
- for (const libSrc of options.librarySources) {
83
- const libTokens = new Lexer(libSrc).tokenize()
84
- const libAst = new Parser(libTokens, libSrc).parse(namespace)
156
+ // Resolve whole-module file imports: `import player_utils;` (no `::` symbol)
157
+ const seenModuleImports = new Set<string>()
158
+ function resolveModuleFilePath(modName: string, fromFile?: string): string | null {
159
+ const candidates = [`${modName}.mcrs`, modName]
160
+ const stdlibDir = path.resolve(__dirname, '..', 'src', 'stdlib')
161
+ for (const candidate of candidates) {
162
+ if (fromFile) {
163
+ const rel = path.resolve(path.dirname(fromFile), candidate)
164
+ if (fs.existsSync(rel)) return rel
165
+ }
166
+ const stdlib = path.resolve(stdlibDir, candidate)
167
+ if (fs.existsSync(stdlib)) return stdlib
168
+ for (const dir of includeDirs ?? []) {
169
+ const extra = path.resolve(dir, candidate)
170
+ if (fs.existsSync(extra)) return extra
171
+ }
172
+ }
173
+ return null
174
+ }
175
+
176
+ function mergeWholeModuleImport(modFilePath: string): void {
177
+ if (seenModuleImports.has(modFilePath)) return
178
+ seenModuleImports.add(modFilePath)
179
+ const modSource = fs.readFileSync(modFilePath, 'utf-8')
180
+ const modPreprocessed = preprocessSourceWithMetadata(modSource, { filePath: modFilePath, includeDirs })
181
+ const modTokens = new Lexer(modPreprocessed.source, modFilePath).tokenize()
182
+ const modParser = new Parser(modTokens, modPreprocessed.source, modFilePath)
183
+ const modAst = modParser.parse(namespace)
184
+ annotateFunctionSourceFiles(modAst, modFilePath)
185
+ warnings.push(...modParser.warnings)
186
+ if (modParser.parseErrors.length > 0) {
187
+ throw stopAfterCheck ? new DiagnosticBundleError(modParser.parseErrors) : modParser.parseErrors[0]
188
+ }
189
+ for (const fn of modAst.declarations) fn.isLibraryFn = true
190
+ for (const imp of modAst.imports) {
191
+ if (imp.symbol !== undefined) continue
192
+ const nestedPath = resolveModuleFilePath(imp.moduleName, modFilePath)
193
+ if (!nestedPath) {
194
+ warnings.push(`[ImportWarning] Module '${imp.moduleName}' not found (imported in ${modFilePath})`)
195
+ continue
196
+ }
197
+ mergeWholeModuleImport(nestedPath)
198
+ }
199
+ ast.declarations.push(...modAst.declarations)
200
+ ast.structs.push(...modAst.structs)
201
+ ast.implBlocks.push(...modAst.implBlocks)
202
+ ast.enums.push(...modAst.enums)
203
+ ast.consts.push(...modAst.consts)
204
+ ast.globals.push(...modAst.globals)
205
+ }
206
+
207
+ for (const imp of ast.imports) {
208
+ if (imp.symbol !== undefined) continue
209
+ const resolved = resolveModuleFilePath(imp.moduleName, filePath)
210
+ if (!resolved) {
211
+ throw new DiagnosticError(
212
+ 'ParseError',
213
+ `Module '${imp.moduleName}' not found. Make sure '${imp.moduleName}.mcrs' exists relative to this file or in the stdlib.`,
214
+ imp.span ?? { line: 1, col: 1 },
215
+ )
216
+ }
217
+ mergeWholeModuleImport(resolved)
218
+ }
219
+
220
+ for (const li of preprocessed.libraryImports ?? []) {
221
+ const libPreprocessed = preprocessSourceWithMetadata(li.source, { filePath: li.filePath })
222
+ const libTokens = new Lexer(libPreprocessed.source, li.filePath).tokenize()
223
+ const libParser = new Parser(libTokens, libPreprocessed.source, li.filePath)
224
+ const libAst = libParser.parse(namespace)
225
+ annotateFunctionSourceFiles(libAst, li.filePath)
226
+ warnings.push(...libParser.warnings)
227
+ if (libParser.parseErrors.length > 0) {
228
+ throw stopAfterCheck ? new DiagnosticBundleError(libParser.parseErrors) : libParser.parseErrors[0]
229
+ }
85
230
  for (const fn of libAst.declarations) fn.isLibraryFn = true
86
231
  ast.declarations.push(...libAst.declarations)
87
232
  ast.structs.push(...libAst.structs)
@@ -90,46 +235,111 @@ export function compile(source: string, options: CompileOptions = {}): CompileRe
90
235
  ast.consts.push(...libAst.consts)
91
236
  ast.globals.push(...libAst.globals)
92
237
  }
93
- }
94
238
 
95
- // Stage 1b: Type checking
96
- // Run TypeChecker on the merged AST. In error-mode (default), throw on first type error.
97
- // In lenient mode, demote type errors to warnings.
98
- {
99
- const checker = new TypeChecker(processedSource, filePath)
100
- const typeErrors = checker.check(ast)
101
- // Collect lint warnings (non-blocking always added regardless of error mode)
102
- warnings.push(...checker.getWarnings())
103
- if (typeErrors.length > 0) {
104
- if (lenient) {
105
- for (const e of typeErrors) {
106
- warnings.push(`[TypeError] line ${e.location.line}, col ${e.location.col}: ${e.message}`)
239
+ if (options.librarySources) {
240
+ for (const libSrc of options.librarySources) {
241
+ const libTokens = new Lexer(libSrc).tokenize()
242
+ const libParser = new Parser(libTokens, libSrc)
243
+ const libAst = libParser.parse(namespace)
244
+ warnings.push(...libParser.warnings)
245
+ if (libParser.parseErrors.length > 0) {
246
+ throw stopAfterCheck ? new DiagnosticBundleError(libParser.parseErrors) : libParser.parseErrors[0]
247
+ }
248
+ for (const fn of libAst.declarations) fn.isLibraryFn = true
249
+ ast.declarations.push(...libAst.declarations)
250
+ ast.structs.push(...libAst.structs)
251
+ ast.implBlocks.push(...libAst.implBlocks)
252
+ ast.enums.push(...libAst.enums)
253
+ ast.consts.push(...libAst.consts)
254
+ ast.globals.push(...libAst.globals)
255
+ }
256
+ }
257
+
258
+ {
259
+ const configValues = options.config ?? {}
260
+ const configGlobalNames = new Set<string>()
261
+ for (const g of ast.globals) {
262
+ if (g.configKey !== undefined) {
263
+ const resolvedValue = Object.prototype.hasOwnProperty.call(configValues, g.configKey)
264
+ ? configValues[g.configKey]
265
+ : (g.configDefault ?? 0)
266
+ const intValue = Math.round(resolvedValue)
267
+ ast.consts.push({
268
+ name: g.name,
269
+ type: { kind: 'named', name: 'int' },
270
+ value: { kind: 'int_lit', value: intValue },
271
+ span: g.span,
272
+ })
273
+ configGlobalNames.add(g.name)
274
+ }
275
+ }
276
+ if (configGlobalNames.size > 0) {
277
+ ast.globals = ast.globals.filter(g => !configGlobalNames.has(g.name))
278
+ }
279
+ }
280
+
281
+ {
282
+ const checker = new TypeChecker(processedSource, filePath)
283
+ const typeErrors = checker.check(ast)
284
+ warnings.push(...checker.getWarnings())
285
+ if (typeErrors.length > 0) {
286
+ if (lenient) {
287
+ for (const e of typeErrors) {
288
+ warnings.push(`[TypeError] line ${e.location.line}, col ${e.location.col}: ${e.message}`)
289
+ }
290
+ } else {
291
+ throw stopAfterCheck ? new DiagnosticBundleError(typeErrors) : typeErrors[0]
107
292
  }
108
- } else {
109
- throw typeErrors[0]
110
293
  }
111
294
  }
112
- }
113
295
 
114
- // Stage 2–7: lower, optimize, emit
115
- // Wrap non-DiagnosticError from later stages so CLI always gets structured errors.
116
- try {
117
296
  // Stage 2: AST → HIR
118
297
  const hirRaw = lowerToHIR(ast)
119
298
 
120
299
  // Stage 2b: Monomorphize generic functions
121
300
  const hir = monomorphize(hirRaw)
122
301
 
123
- // Extract @tick, @load, @coroutine, @schedule, and @on handlers from HIR (before decorator info is lost)
302
+ const libraryFilePaths = new Set(
303
+ hir.functions
304
+ .filter(fn => fn.isLibraryFn && fn.decorators.length === 0)
305
+ .map(fn => `data/${namespace}/function/${fn.name}.mcfunction`)
306
+ )
307
+
308
+ // Stage 2c: Deprecated usage check — emit warnings for calls to @deprecated functions
309
+ warnings.push(...checkDeprecatedCalls(hir))
310
+
311
+ if (stopAfterCheck) {
312
+ return { files: [], warnings, success: true as const }
313
+ }
314
+
315
+ // Extract decorator metadata before HIR lowering discards it.
124
316
  const tickFunctions: string[] = []
125
317
  const loadFunctions: string[] = []
318
+ const watchFunctions: Array<{ name: string; objective: string }> = []
319
+ const inlineFunctions = new Set<string>()
320
+ const noInlineFunctions = new Set<string>()
126
321
  const coroutineInfos: CoroutineInfo[] = []
127
322
  const scheduleFunctions: Array<{ name: string; ticks: number }> = []
323
+ const profiledFunctions: string[] = []
324
+ const throttleFunctions: Array<{ name: string; ticks: number }> = []
325
+ const retryFunctions: Array<{ name: string; max: number }> = []
326
+ const memoizeFunctions: string[] = []
128
327
  const eventHandlers = new Map<string, string[]>()
129
328
  for (const fn of hir.functions) {
329
+ if (fn.watchObjective) {
330
+ watchFunctions.push({ name: fn.name, objective: fn.watchObjective })
331
+ } else {
332
+ // Fallback: extract from decorator if watchObjective not propagated
333
+ const watchDec = fn.decorators?.find(d => d.name === 'watch' && d.args?.objective)
334
+ if (watchDec?.args?.objective) {
335
+ watchFunctions.push({ name: fn.name, objective: watchDec.args.objective })
336
+ }
337
+ }
130
338
  for (const dec of fn.decorators) {
131
339
  if (dec.name === 'tick') tickFunctions.push(fn.name)
132
340
  if (dec.name === 'load') loadFunctions.push(fn.name)
341
+ if (dec.name === 'inline') inlineFunctions.add(fn.name)
342
+ if (dec.name === 'no-inline') noInlineFunctions.add(fn.name)
133
343
  if (dec.name === 'coroutine') {
134
344
  coroutineInfos.push({
135
345
  fnName: fn.name,
@@ -140,6 +350,18 @@ export function compile(source: string, options: CompileOptions = {}): CompileRe
140
350
  if (dec.name === 'schedule') {
141
351
  scheduleFunctions.push({ name: fn.name, ticks: dec.args?.ticks ?? 1 })
142
352
  }
353
+ if (dec.name === 'profile') {
354
+ profiledFunctions.push(fn.name)
355
+ }
356
+ if (dec.name === 'throttle' && dec.args?.ticks) {
357
+ throttleFunctions.push({ name: fn.name, ticks: dec.args.ticks })
358
+ }
359
+ if (dec.name === 'retry' && dec.args?.max) {
360
+ retryFunctions.push({ name: fn.name, max: dec.args.max })
361
+ }
362
+ if (dec.name === 'memoize') {
363
+ memoizeFunctions.push(fn.name)
364
+ }
143
365
  if (dec.name === 'on' && dec.args?.eventType) {
144
366
  const evType = dec.args.eventType as string
145
367
  if (isEventTypeName(evType)) {
@@ -152,10 +374,24 @@ export function compile(source: string, options: CompileOptions = {}): CompileRe
152
374
 
153
375
  // Stage 3: HIR → MIR
154
376
  const mir = lowerToMIR(hir, filePath)
377
+ if (inlineFunctions.size > 0) {
378
+ mir.inlineFunctions = inlineFunctions
379
+ }
380
+ if (noInlineFunctions.size > 0) {
381
+ mir.noInlineFunctions = noInlineFunctions
382
+ }
155
383
 
156
384
  // Stage 4: MIR optimization
157
385
  const mirOpt = optimizeModule(mir)
158
386
 
387
+ // Remove auto-inlined functions from the library-prune set so their
388
+ // .mcfunction files are still emitted (external callers may use them).
389
+ if (mirOpt.keepInOutput && mirOpt.keepInOutput.size > 0) {
390
+ for (const fnName of mirOpt.keepInOutput) {
391
+ libraryFilePaths.delete(`data/${namespace}/function/${fnName}.mcfunction`)
392
+ }
393
+ }
394
+
159
395
  // Stage 4b: Coroutine transform (opt-in, only for @coroutine functions)
160
396
  const coroResult = coroutineTransform(mirOpt, coroutineInfos)
161
397
  const mirFinal = coroResult.module
@@ -197,13 +433,134 @@ export function compile(source: string, options: CompileOptions = {}): CompileRe
197
433
  }
198
434
  }
199
435
 
436
+ // Stage 6.9: Inject synthetic LIR functions for @singleton structs
437
+ // Each @singleton struct gets:
438
+ // - A "<StructName>_get" function that reads all fields from scoreboard
439
+ // - A "<StructName>_set" function that writes all fields back to scoreboard
440
+ // Fields are stored in scoreboard objectives named "_sng_<StructName>_<fieldName>"
441
+ // (max 16 chars for objective name — truncated with hash suffix if needed)
442
+ const singletonObjectives: string[] = []
443
+ for (const s of hir.structs) {
444
+ if (!s.isSingleton) continue
445
+ const structName = s.name
446
+ const objective = lirOpt.objective // the main ns objective for return values
447
+
448
+ // Build _get function: reads each field from its own scoreboard objective
449
+ // Return struct fields via __rf_<field> slots in the main objective
450
+ const getInstrs: import('../lir/types').LIRInstr[] = []
451
+ for (const field of s.fields) {
452
+ const fieldObj = singletonObjectiveName(structName, field.name)
453
+ if (!singletonObjectives.includes(fieldObj)) {
454
+ singletonObjectives.push(fieldObj)
455
+ }
456
+ // copy: scoreboard players operation $__rf_<field> <obj> = __sng_<S>_<f> <fieldObj>
457
+ getInstrs.push({
458
+ kind: 'score_copy',
459
+ dst: { player: `$__rf_${field.name}`, obj: objective },
460
+ src: { player: `__sng`, obj: fieldObj },
461
+ })
462
+ }
463
+ // Return value placeholder
464
+ getInstrs.push({ kind: 'score_set', dst: { player: '$ret', obj: objective }, value: 0 })
465
+
466
+ // Use `::` naming so it matches how static_call `GameState::get` is qualified
467
+ // fnNameToPath converts `GameState::get` → `data/<ns>/function/gamestate/get.mcfunction`
468
+ lirOpt.functions.push({
469
+ name: `${structName}::get`,
470
+ instructions: getInstrs,
471
+ isMacro: false,
472
+ macroParams: [],
473
+ })
474
+
475
+ // Build _set function: writes each field back to its scoreboard objective
476
+ // Parameters come in via $p0..$pN slots (one per field)
477
+ const setInstrs: import('../lir/types').LIRInstr[] = []
478
+ for (let i = 0; i < s.fields.length; i++) {
479
+ const field = s.fields[i]
480
+ const fieldObj = singletonObjectiveName(structName, field.name)
481
+ setInstrs.push({
482
+ kind: 'score_copy',
483
+ dst: { player: `__sng`, obj: fieldObj },
484
+ src: { player: `$p${i}`, obj: objective },
485
+ })
486
+ }
487
+ setInstrs.push({ kind: 'score_set', dst: { player: '$ret', obj: objective }, value: 0 })
488
+
489
+ lirOpt.functions.push({
490
+ name: `${structName}::set`,
491
+ instructions: setInstrs,
492
+ isMacro: false,
493
+ macroParams: [],
494
+ })
495
+ }
496
+
497
+ // Stage 6.95: Rename @memoize functions to <fn>_impl in LIR,
498
+ // rewriting recursive self-calls so the wrapper becomes the public entry point.
499
+ for (const fnName of memoizeFunctions) {
500
+ const lirFn = lirOpt.functions.find(f => f.name === fnName)
501
+ if (!lirFn) continue
502
+ const implName = `${fnName}_impl`
503
+ lirFn.name = implName
504
+ // Rewrite recursive calls: any call to fnName inside this function → implName
505
+ for (const instr of lirFn.instructions) {
506
+ if ('fn' in instr && instr.fn === fnName) {
507
+ ;(instr as { fn: string }).fn = implName
508
+ }
509
+ }
510
+ }
511
+
200
512
  // Stage 7: LIR → .mcfunction
201
- const files = emit(lirOpt, { namespace, tickFunctions, loadFunctions, scheduleFunctions, generateSourceMap, mcVersion, eventHandlers })
513
+ const files = emit(lirOpt, {
514
+ namespace,
515
+ tickFunctions,
516
+ loadFunctions,
517
+ watchFunctions,
518
+ scheduleFunctions,
519
+ generateSourceMap,
520
+ mcVersion,
521
+ eventHandlers,
522
+ singletonObjectives,
523
+ profiledFunctions,
524
+ enableProfiling: debug,
525
+ throttleFunctions,
526
+ retryFunctions,
527
+ memoizeFunctions,
528
+ })
529
+ const prunedFiles = pruneLibraryFunctionFiles(files, libraryFilePaths)
202
530
 
203
- return { files, warnings, success: true as const }
531
+ return { files: prunedFiles, warnings, success: true as const }
204
532
  } catch (err) {
533
+ if (stopAfterCheck) {
534
+ if (err instanceof CheckFailedError) throw err
535
+ if (err instanceof DiagnosticBundleError) {
536
+ throw new CheckFailedError(err.diagnostics, warnings)
537
+ }
538
+ if (err instanceof DiagnosticError) {
539
+ throw new CheckFailedError([err], warnings)
540
+ }
541
+ const sourceLines = processedSource.split('\n')
542
+ throw new CheckFailedError(
543
+ [parseErrorMessage('LoweringError', (err as Error).message, sourceLines, filePath)],
544
+ warnings,
545
+ )
546
+ }
205
547
  if (err instanceof DiagnosticError) throw err
206
548
  const sourceLines = processedSource.split('\n')
207
549
  throw parseErrorMessage('LoweringError', (err as Error).message, sourceLines, filePath)
208
550
  }
209
551
  }
552
+
553
+ /**
554
+ * Compute a scoreboard objective name for a @singleton struct field.
555
+ * Format: _s_<struct>_<field>, truncated so total length ≤ 16 chars.
556
+ * If struct+field combined (with _s_ and _) exceeds 16:
557
+ * use first 4 chars of struct, first 8 chars of field.
558
+ */
559
+ function singletonObjectiveName(structName: string, fieldName: string): string {
560
+ const overhead = 5 // "_s_" (3) + "_" (1) = 4, +1 for safety -- actually "_s_" + "_" = 4
561
+ // Budget: 16 - 4 = 12 chars for struct + field combined
562
+ if (structName.length + fieldName.length <= 12) {
563
+ return `_s_${structName}_${fieldName}`
564
+ }
565
+ return `_s_${structName.slice(0, 4)}_${fieldName.slice(0, 8)}`
566
+ }