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
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.TypeChecker = void 0;
10
10
  const diagnostics_1 = require("../diagnostics");
11
11
  const types_1 = require("../events/types");
12
+ const expand_1 = require("../structs/expand");
12
13
  // Entity type hierarchy for subtype checking
13
14
  const ENTITY_HIERARCHY = {
14
15
  'entity': null,
@@ -94,6 +95,10 @@ const INT_TYPE = { kind: 'named', name: 'int' };
94
95
  const STRING_TYPE = { kind: 'named', name: 'string' };
95
96
  const FORMAT_STRING_TYPE = { kind: 'named', name: 'format_string' };
96
97
  const BUILTIN_SIGNATURES = {
98
+ assert: {
99
+ params: [{ kind: 'named', name: 'bool' }],
100
+ return: VOID_TYPE,
101
+ },
97
102
  setTimeout: {
98
103
  params: [INT_TYPE, { kind: 'function_type', params: [], return: VOID_TYPE }],
99
104
  return: VOID_TYPE,
@@ -106,6 +111,14 @@ const BUILTIN_SIGNATURES = {
106
111
  params: [INT_TYPE],
107
112
  return: VOID_TYPE,
108
113
  },
114
+ int_to_str: {
115
+ params: [INT_TYPE],
116
+ return: STRING_TYPE,
117
+ },
118
+ bool_to_str: {
119
+ params: [{ kind: 'named', name: 'bool' }],
120
+ return: STRING_TYPE,
121
+ },
109
122
  };
110
123
  // ---------------------------------------------------------------------------
111
124
  // Type Checker
@@ -117,6 +130,8 @@ class TypeChecker {
117
130
  this.implMethods = new Map();
118
131
  this.structs = new Map();
119
132
  this.enums = new Map();
133
+ // enumName → variantName → field list (for payload variants)
134
+ this.enumPayloads = new Map();
120
135
  this.consts = new Map();
121
136
  this.globals = new Map();
122
137
  this.currentFn = null;
@@ -127,6 +142,8 @@ class TypeChecker {
127
142
  // Depth of loop/conditional nesting (for static-allocation enforcement)
128
143
  this.loopDepth = 0;
129
144
  this.condDepth = 0;
145
+ // interface name → InterfaceDecl
146
+ this.interfaces = new Map();
130
147
  this.richTextBuiltins = new Map([
131
148
  ['say', { messageIndex: 0 }],
132
149
  ['announce', { messageIndex: 0 }],
@@ -167,6 +184,10 @@ class TypeChecker {
167
184
  for (const fn of program.declarations) {
168
185
  this.functions.set(fn.name, fn);
169
186
  }
187
+ // Register interface declarations
188
+ for (const iface of program.interfaces ?? []) {
189
+ this.interfaces.set(iface.name, iface);
190
+ }
170
191
  // Register global variables (mutable) so functions can reference and assign them
171
192
  for (const global of program.globals ?? []) {
172
193
  this.globals.set(global.name, this.normalizeType(global.type));
@@ -191,19 +212,59 @@ class TypeChecker {
191
212
  methods.set(method.name, method);
192
213
  }
193
214
  }
194
- for (const struct of program.structs ?? []) {
215
+ const expandedStructs = (0, expand_1.expandStructDeclarations)(program.structs ?? [], ({ message, node }) => {
216
+ this.report(message, node);
217
+ });
218
+ for (const struct of expandedStructs) {
195
219
  const fields = new Map();
196
220
  for (const field of struct.fields) {
197
221
  fields.set(field.name, field.type);
198
222
  }
199
223
  this.structs.set(struct.name, fields);
224
+ // @singleton structs get synthetic static get() and set(gs) methods
225
+ if (struct.isSingleton) {
226
+ const structType = { kind: 'struct', name: struct.name };
227
+ let singletonMethods = this.implMethods.get(struct.name);
228
+ if (!singletonMethods) {
229
+ singletonMethods = new Map();
230
+ this.implMethods.set(struct.name, singletonMethods);
231
+ }
232
+ const voidType = { kind: 'named', name: 'void' };
233
+ // Synthetic get() — no params, returns struct
234
+ singletonMethods.set('get', {
235
+ name: 'get',
236
+ params: [],
237
+ returnType: structType,
238
+ decorators: [],
239
+ body: [],
240
+ typeParams: undefined,
241
+ isLibraryFn: true,
242
+ });
243
+ // Synthetic set(gs: StructName) — takes struct, returns void
244
+ singletonMethods.set('set', {
245
+ name: 'set',
246
+ params: [{ name: 'gs', type: structType }],
247
+ returnType: voidType,
248
+ decorators: [],
249
+ body: [],
250
+ typeParams: undefined,
251
+ isLibraryFn: true,
252
+ });
253
+ }
200
254
  }
201
255
  for (const enumDecl of program.enums ?? []) {
202
256
  const variants = new Map();
257
+ const payloads = new Map();
203
258
  for (const variant of enumDecl.variants) {
204
259
  variants.set(variant.name, variant.value ?? 0);
260
+ if (variant.fields && variant.fields.length > 0) {
261
+ payloads.set(variant.name, variant.fields);
262
+ }
205
263
  }
206
264
  this.enums.set(enumDecl.name, variants);
265
+ if (payloads.size > 0) {
266
+ this.enumPayloads.set(enumDecl.name, payloads);
267
+ }
207
268
  }
208
269
  for (const constDecl of program.consts ?? []) {
209
270
  const constType = this.normalizeType(constDecl.type);
@@ -213,6 +274,21 @@ class TypeChecker {
213
274
  }
214
275
  this.consts.set(constDecl.name, constType);
215
276
  }
277
+ // Verify that each `impl <Interface> for <Struct>` satisfies all interface methods
278
+ for (const implBlock of program.implBlocks ?? []) {
279
+ if (!implBlock.traitName)
280
+ continue;
281
+ const iface = this.interfaces.get(implBlock.traitName);
282
+ if (!iface)
283
+ continue; // Unknown trait — not our concern here (could be built-in like Display)
284
+ const implementedMethods = new Set(implBlock.methods.map(m => m.name));
285
+ for (const required of iface.methods) {
286
+ if (!implementedMethods.has(required.name)) {
287
+ const span = implBlock.span ?? required.span;
288
+ this.report(`Struct '${implBlock.typeName}' does not implement required method '${required.name}' from interface '${implBlock.traitName}'`, span ?? { line: 1, col: 1 });
289
+ }
290
+ }
291
+ }
216
292
  // Second pass: type check function bodies
217
293
  for (const fn of program.declarations) {
218
294
  this.checkFunction(fn);
@@ -262,6 +338,69 @@ class TypeChecker {
262
338
  this.currentReturnType = null;
263
339
  }
264
340
  checkFunctionDecorators(fn) {
341
+ const watchDecorators = fn.decorators.filter(decorator => decorator.name === 'watch');
342
+ if (watchDecorators.length > 1) {
343
+ this.report(`Function '${fn.name}' cannot have multiple @watch decorators`, fn);
344
+ return;
345
+ }
346
+ if (watchDecorators.length === 1) {
347
+ const objective = watchDecorators[0].args?.objective;
348
+ if (!objective) {
349
+ this.report(`Function '${fn.name}' is missing a scoreboard objective in @watch("...")`, fn);
350
+ return;
351
+ }
352
+ if (fn.params.length > 0) {
353
+ this.report(`@watch handler '${fn.name}' cannot declare parameters`, fn);
354
+ }
355
+ }
356
+ const throttleDecorators = fn.decorators.filter(decorator => decorator.name === 'throttle');
357
+ if (throttleDecorators.length > 1) {
358
+ this.report(`Function '${fn.name}' cannot have multiple @throttle decorators`, fn);
359
+ return;
360
+ }
361
+ if (throttleDecorators.length === 1) {
362
+ const ticks = throttleDecorators[0].args?.ticks;
363
+ if (ticks === undefined || ticks <= 0) {
364
+ this.report(`@throttle on '${fn.name}' requires ticks=N (positive integer)`, fn);
365
+ }
366
+ }
367
+ const retryDecorators = fn.decorators.filter(decorator => decorator.name === 'retry');
368
+ if (retryDecorators.length > 1) {
369
+ this.report(`Function '${fn.name}' cannot have multiple @retry decorators`, fn);
370
+ return;
371
+ }
372
+ if (retryDecorators.length === 1) {
373
+ const max = retryDecorators[0].args?.max;
374
+ if (max === undefined || max <= 0) {
375
+ this.report(`@retry on '${fn.name}' requires max=N (positive integer)`, fn);
376
+ }
377
+ }
378
+ const profileDecorators = fn.decorators.filter(decorator => decorator.name === 'profile');
379
+ if (profileDecorators.length > 1) {
380
+ this.report(`Function '${fn.name}' cannot have multiple @profile decorators`, fn);
381
+ return;
382
+ }
383
+ if (profileDecorators.length === 1 && (profileDecorators[0].rawArgs?.length || profileDecorators[0].args && Object.keys(profileDecorators[0].args).length > 0)) {
384
+ this.report(`@profile decorator on '${fn.name}' does not accept arguments`, fn);
385
+ return;
386
+ }
387
+ const memoizeDecorators = fn.decorators.filter(decorator => decorator.name === 'memoize');
388
+ if (memoizeDecorators.length > 1) {
389
+ this.report(`Function '${fn.name}' cannot have multiple @memoize decorators`, fn);
390
+ return;
391
+ }
392
+ if (memoizeDecorators.length === 1) {
393
+ if (fn.params.length !== 1) {
394
+ this.report(`@memoize on '${fn.name}' requires exactly one parameter`, fn);
395
+ }
396
+ else {
397
+ const paramType = fn.params[0].type;
398
+ const isInt = paramType.kind === 'named' && paramType.name === 'int';
399
+ if (!isInt) {
400
+ this.report(`@memoize on '${fn.name}' only supports int parameters (got '${paramType.kind === 'named' ? paramType.name : paramType.kind}')`, fn);
401
+ }
402
+ }
403
+ }
265
404
  const eventDecorators = fn.decorators.filter(decorator => decorator.name === 'on');
266
405
  if (eventDecorators.length === 0) {
267
406
  return;
@@ -372,9 +511,25 @@ class TypeChecker {
372
511
  !this.typesMatch(subjectType, patternType)) {
373
512
  this.report('Match arm pattern type must match subject type', arm.pattern.expr);
374
513
  }
514
+ this.checkBlock(arm.body);
515
+ }
516
+ else if (arm.pattern.kind === 'PatEnum') {
517
+ const pat = arm.pattern;
518
+ const variantPayloads = this.enumPayloads.get(pat.enumName)?.get(pat.variant) ?? [];
519
+ // Bind pattern variables to their declared field types in arm scope
520
+ const savedScope = new Map(this.scope);
521
+ for (let i = 0; i < pat.bindings.length; i++) {
522
+ const fieldDef = variantPayloads[i];
523
+ const bindingType = fieldDef ? fieldDef.type : { kind: 'named', name: 'int' };
524
+ this.scope.set(pat.bindings[i], { type: bindingType, mutable: false });
525
+ }
526
+ this.checkBlock(arm.body);
527
+ this.scope = savedScope;
528
+ }
529
+ else {
530
+ // PatSome / PatNone / PatInt / PatWild are structurally typed — no extra scope needed
531
+ this.checkBlock(arm.body);
375
532
  }
376
- // PatSome / PatNone / PatInt / PatWild are structurally typed — no expr to check
377
- this.checkBlock(arm.body);
378
533
  }
379
534
  break;
380
535
  case 'as_block': {
@@ -419,6 +574,22 @@ class TypeChecker {
419
574
  case 'raw':
420
575
  // Raw commands are not type checked
421
576
  break;
577
+ case 'break':
578
+ case 'continue':
579
+ case 'break_label':
580
+ case 'continue_label':
581
+ // Control flow — no sub-expressions to check
582
+ break;
583
+ case 'labeled_loop':
584
+ // Recurse into the labeled loop body
585
+ this.loopDepth++;
586
+ this.checkStmt(stmt.body);
587
+ this.loopDepth--;
588
+ break;
589
+ case 'const_decl':
590
+ // Local const: register in scope as immutable with its declared type
591
+ this.scope.set(stmt.name, { type: stmt.type, mutable: false });
592
+ break;
422
593
  }
423
594
  }
424
595
  checkLetDestructStmt(stmt) {
@@ -536,8 +707,8 @@ class TypeChecker {
536
707
  if (arithmeticOps.includes(expr.op)) {
537
708
  const leftType = this.inferType(expr.left);
538
709
  const rightType = this.inferType(expr.right);
539
- const leftIsString = leftType.kind === 'named' && (leftType.name === 'string' || leftType.name === 'format_string');
540
- const rightIsString = rightType.kind === 'named' && (rightType.name === 'string' || rightType.name === 'format_string');
710
+ const leftIsString = leftType.kind === 'named' && (leftType.name === 'string' || leftType.name === 'format_string'); // format_string kept for legacy type annotations
711
+ const rightIsString = rightType.kind === 'named' && (rightType.name === 'string' || rightType.name === 'format_string'); // format_string kept for legacy type annotations
541
712
  if (leftIsString || rightIsString) {
542
713
  // String concatenation with + is not supported. Use f-strings instead.
543
714
  this.report(`[StringConcat] String concatenation with '+' is not supported. Use f-strings instead: f"text{variable}" — e.g. f"Score: {score}"`, expr);
@@ -590,7 +761,29 @@ class TypeChecker {
590
761
  break;
591
762
  case 'struct_lit':
592
763
  for (const field of expr.fields) {
593
- this.checkExpr(field.value);
764
+ let fieldType;
765
+ if (expectedType) {
766
+ const normalized = this.normalizeType(expectedType);
767
+ if (normalized.kind === 'struct') {
768
+ const structFields = this.structs.get(normalized.name);
769
+ if (structFields && !structFields.has(field.name)) {
770
+ this.report(`Struct '${normalized.name}' has no field '${field.name}'`, expr);
771
+ }
772
+ else {
773
+ fieldType = structFields?.get(field.name);
774
+ }
775
+ }
776
+ }
777
+ this.checkExpr(field.value, fieldType);
778
+ if (fieldType) {
779
+ const actualType = this.inferType(field.value, fieldType);
780
+ if (this.isNumericMismatch(fieldType, actualType)) {
781
+ this.report(`Field '${field.name}' of struct expects ${this.typeToString(fieldType)}, got ${this.typeToString(actualType)}`, field.value);
782
+ }
783
+ else if (!this.typesMatch(fieldType, actualType)) {
784
+ this.report(`Field '${field.name}' of struct expects ${this.typeToString(fieldType)}, got ${this.typeToString(actualType)}`, field.value);
785
+ }
786
+ }
594
787
  }
595
788
  break;
596
789
  case 'str_interp':
@@ -642,6 +835,32 @@ class TypeChecker {
642
835
  }
643
836
  }
644
837
  break;
838
+ case 'enum_construct': {
839
+ if (!this.enums.has(expr.enumName)) {
840
+ this.report(`Unknown enum '${expr.enumName}'`, expr);
841
+ break;
842
+ }
843
+ const variants = this.enums.get(expr.enumName);
844
+ if (!variants.has(expr.variant)) {
845
+ this.report(`Enum '${expr.enumName}' has no variant '${expr.variant}'`, expr);
846
+ break;
847
+ }
848
+ const variantPayloads = this.enumPayloads.get(expr.enumName)?.get(expr.variant) ?? [];
849
+ if (variantPayloads.length === 0 && expr.args.length > 0) {
850
+ this.report(`Enum variant '${expr.enumName}::${expr.variant}' has no payload fields`, expr);
851
+ break;
852
+ }
853
+ for (const arg of expr.args) {
854
+ const fieldDef = variantPayloads.find(f => f.name === arg.name);
855
+ if (!fieldDef) {
856
+ this.report(`Unknown field '${arg.name}' for enum variant '${expr.enumName}::${expr.variant}'`, expr);
857
+ }
858
+ else {
859
+ this.checkExpr(arg.value, fieldDef.type);
860
+ }
861
+ }
862
+ break;
863
+ }
645
864
  case 'blockpos':
646
865
  break;
647
866
  // Literals don't need checking
@@ -741,7 +960,7 @@ class TypeChecker {
741
960
  }
742
961
  const messageType = this.inferType(message);
743
962
  if (messageType.kind !== 'named' ||
744
- (messageType.name !== 'string' && messageType.name !== 'format_string')) {
963
+ messageType.name !== 'string') {
745
964
  this.report(`Argument ${messageIndex + 1} of '${expr.fn}' expects string or format_string, got ${this.typeToString(messageType)}`, message);
746
965
  }
747
966
  }
@@ -948,7 +1167,7 @@ class TypeChecker {
948
1167
  this.checkExpr(part.expr);
949
1168
  }
950
1169
  }
951
- return FORMAT_STRING_TYPE;
1170
+ return STRING_TYPE;
952
1171
  case 'blockpos':
953
1172
  return { kind: 'named', name: 'BlockPos' };
954
1173
  case 'ident':
@@ -1011,6 +1230,11 @@ class TypeChecker {
1011
1230
  return { kind: 'enum', name: expr.enumName };
1012
1231
  }
1013
1232
  return { kind: 'named', name: 'void' };
1233
+ case 'enum_construct':
1234
+ if (this.enums.has(expr.enumName)) {
1235
+ return { kind: 'enum', name: expr.enumName };
1236
+ }
1237
+ return { kind: 'named', name: 'void' };
1014
1238
  case 'member':
1015
1239
  if (expr.obj.kind === 'ident' && this.enums.has(expr.obj.name)) {
1016
1240
  return { kind: 'enum', name: expr.obj.name };
@@ -1134,7 +1358,10 @@ class TypeChecker {
1134
1358
  if (receiverType.kind !== 'struct') {
1135
1359
  return null;
1136
1360
  }
1137
- const method = this.implMethods.get(receiverType.name)?.get(expr.fn);
1361
+ // Try the method name as-is first, then try the original (pre-remap) name
1362
+ const methodName = TypeChecker.PARSER_METHOD_REMAP[expr.fn] ?? expr.fn;
1363
+ const method = this.implMethods.get(receiverType.name)?.get(expr.fn)
1364
+ ?? this.implMethods.get(receiverType.name)?.get(methodName);
1138
1365
  if (!method || method.params[0]?.name !== 'self') {
1139
1366
  return null;
1140
1367
  }
@@ -1203,6 +1430,11 @@ class TypeChecker {
1203
1430
  if (expected.kind === 'selector' && actual.kind === 'selector') {
1204
1431
  return true; // any entity subtype is compatible
1205
1432
  }
1433
+ // Fake player names (#name) are mc_name tokens typed as string — allow them
1434
+ // where a selector is expected, since MC scoreboards accept fake player names.
1435
+ if (expected.kind === 'selector' && actual.kind === 'named' && actual.name === 'string') {
1436
+ return true;
1437
+ }
1206
1438
  if (expected.kind !== actual.kind)
1207
1439
  return false;
1208
1440
  if (expected.kind === 'named' && actual.kind === 'named') {
@@ -1309,4 +1541,17 @@ class TypeChecker {
1309
1541
  }
1310
1542
  }
1311
1543
  exports.TypeChecker = TypeChecker;
1544
+ // Reverse map: parser sometimes remaps method names (e.g. add→set_add) for builtins.
1545
+ // When the receiver is a struct with an impl method matching the original name, use that.
1546
+ TypeChecker.PARSER_METHOD_REMAP = {
1547
+ 'set_add': 'add',
1548
+ 'set_contains': 'contains',
1549
+ 'set_remove': 'remove',
1550
+ 'set_clear': 'clear',
1551
+ '__array_push': 'push',
1552
+ '__array_pop': 'pop',
1553
+ '__entity_tag': 'tag',
1554
+ '__entity_untag': 'untag',
1555
+ '__entity_has_tag': 'has_tag',
1556
+ };
1312
1557
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"root":["../src/cli.ts","../src/compile.ts","../src/index.ts","../src/repl.ts","../src/__tests__/cli.test.ts","../src/__tests__/codegen.test.ts","../src/__tests__/compile-all.test.ts","../src/__tests__/dce.test.ts","../src/__tests__/diagnostics.test.ts","../src/__tests__/e2e.test.ts","../src/__tests__/entity-types.test.ts","../src/__tests__/formatter.test.ts","../src/__tests__/lexer.test.ts","../src/__tests__/lowering.test.ts","../src/__tests__/macro.test.ts","../src/__tests__/mc-integration.test.ts","../src/__tests__/mc-syntax.test.ts","../src/__tests__/nbt.test.ts","../src/__tests__/optimizer-advanced.test.ts","../src/__tests__/optimizer.test.ts","../src/__tests__/parser.test.ts","../src/__tests__/repl.test.ts","../src/__tests__/runtime.test.ts","../src/__tests__/stdlib-advanced.test.ts","../src/__tests__/stdlib-bigint.test.ts","../src/__tests__/stdlib-math.test.ts","../src/__tests__/stdlib-vec.test.ts","../src/__tests__/structure-optimizer.test.ts","../src/__tests__/typechecker.test.ts","../src/__tests__/var-allocator.test.ts","../src/ast/types.ts","../src/builtins/metadata.ts","../src/codegen/var-allocator.ts","../src/codegen/cmdblock/index.ts","../src/codegen/mcfunction/index.ts","../src/codegen/structure/index.ts","../src/diagnostics/index.ts","../src/events/types.ts","../src/formatter/index.ts","../src/ir/builder.ts","../src/ir/types.ts","../src/lexer/index.ts","../src/lowering/index.ts","../src/mc-test/client.ts","../src/mc-test/runner.ts","../src/mc-test/setup.ts","../src/mc-validator/index.ts","../src/nbt/index.ts","../src/optimizer/commands.ts","../src/optimizer/dce.ts","../src/optimizer/passes.ts","../src/optimizer/structure.ts","../src/parser/index.ts","../src/runtime/index.ts","../src/typechecker/index.ts","../src/types/entity-hierarchy.ts","../src2/__tests__/e2e/basic.test.ts","../src2/__tests__/e2e/macros.test.ts","../src2/__tests__/e2e/migrate.test.ts","../src2/__tests__/hir/desugar.test.ts","../src2/__tests__/lir/lower.test.ts","../src2/__tests__/lir/types.test.ts","../src2/__tests__/lir/verify.test.ts","../src2/__tests__/mir/arithmetic.test.ts","../src2/__tests__/mir/control-flow.test.ts","../src2/__tests__/mir/verify.test.ts","../src2/__tests__/optimizer/block_merge.test.ts","../src2/__tests__/optimizer/branch_simplify.test.ts","../src2/__tests__/optimizer/constant_fold.test.ts","../src2/__tests__/optimizer/copy_prop.test.ts","../src2/__tests__/optimizer/dce.test.ts","../src2/__tests__/optimizer/pipeline.test.ts","../src2/emit/compile.ts","../src2/emit/index.ts","../src2/hir/lower.ts","../src2/hir/types.ts","../src2/lir/lower.ts","../src2/lir/types.ts","../src2/lir/verify.ts","../src2/mir/lower.ts","../src2/mir/macro.ts","../src2/mir/types.ts","../src2/mir/verify.ts","../src2/optimizer/block_merge.ts","../src2/optimizer/branch_simplify.ts","../src2/optimizer/constant_fold.ts","../src2/optimizer/copy_prop.ts","../src2/optimizer/dce.ts","../src2/optimizer/pipeline.ts"],"version":"5.9.3"}
1
+ {"root":["../src/cli.ts","../src/compile.ts","../src/index.ts","../src/repl-server.ts","../src/repl.ts","../src/__tests__/array-dynamic.test.ts","../src/__tests__/array-param.test.ts","../src/__tests__/array-write.test.ts","../src/__tests__/budget.test.ts","../src/__tests__/builtins.test.ts","../src/__tests__/cache-extra.test.ts","../src/__tests__/cli-init.test.ts","../src/__tests__/cli-publish.test.ts","../src/__tests__/cli.test.ts","../src/__tests__/compile-all.test.ts","../src/__tests__/compile-preprocess.test.ts","../src/__tests__/config-decorator.test.ts","../src/__tests__/dce.test.ts","../src/__tests__/diagnostics-extra.test.ts","../src/__tests__/diagnostics.test.ts","../src/__tests__/double.test.ts","../src/__tests__/enum.test.ts","../src/__tests__/error-recovery.test.ts","../src/__tests__/events-types-extra.test.ts","../src/__tests__/events-types.test.ts","../src/__tests__/fixed.test.ts","../src/__tests__/float-lint.test.ts","../src/__tests__/float.test.ts","../src/__tests__/for-each.test.ts","../src/__tests__/for-range.test.ts","../src/__tests__/formatter.test.ts","../src/__tests__/generics.test.ts","../src/__tests__/impl.test.ts","../src/__tests__/incremental.test.ts","../src/__tests__/index-extra.test.ts","../src/__tests__/lexer.test.ts","../src/__tests__/lsp-logic.test.ts","../src/__tests__/lsp.test.ts","../src/__tests__/match.test.ts","../src/__tests__/mc-integration.test.ts","../src/__tests__/mc-syntax.test.ts","../src/__tests__/mc-validator-coverage.test.ts","../src/__tests__/mc-validator-extra.test.ts","../src/__tests__/mc-version.test.ts","../src/__tests__/modules.test.ts","../src/__tests__/option.test.ts","../src/__tests__/parser-coverage.test.ts","../src/__tests__/parser-extra.test.ts","../src/__tests__/parser.test.ts","../src/__tests__/repl-extra.test.ts","../src/__tests__/repl-server-extra.test.ts","../src/__tests__/repl-server.test.ts","../src/__tests__/repl.test.ts","../src/__tests__/runtime-extra.test.ts","../src/__tests__/runtime.test.ts","../src/__tests__/schedule.test.ts","../src/__tests__/singleton-decorator.test.ts","../src/__tests__/sourcemap.test.ts","../src/__tests__/stdlib-include.test.ts","../src/__tests__/struct-display.test.ts","../src/__tests__/tuple.test.ts","../src/__tests__/typechecker-coverage.test.ts","../src/__tests__/typechecker-strict.test.ts","../src/__tests__/typechecker.test.ts","../src/__tests__/watch-decorator.test.ts","../src/__tests__/cache/cache-behavior.test.ts","../src/__tests__/compiler/break-stmt.test.ts","../src/__tests__/compiler/const-decl.test.ts","../src/__tests__/compiler/continue-stmt.test.ts","../src/__tests__/compiler/coroutine-extended.test.ts","../src/__tests__/compiler/deprecated.test.ts","../src/__tests__/compiler/do-while.test.ts","../src/__tests__/compiler/enum-payload.test.ts","../src/__tests__/compiler/interface.test.ts","../src/__tests__/compiler/match-string.test.ts","../src/__tests__/compiler/method-chain.test.ts","../src/__tests__/compiler/module-import.test.ts","../src/__tests__/compiler/option-extensions.test.ts","../src/__tests__/compiler/profile-decorator.test.ts","../src/__tests__/compiler/string-advanced.test.ts","../src/__tests__/compiler/tuple-type.test.ts","../src/__tests__/compiler/watch-decorator.test.ts","../src/__tests__/e2e/basic.test.ts","../src/__tests__/e2e/coroutine.test.ts","../src/__tests__/e2e/ecs-stdlib.test.ts","../src/__tests__/e2e/events-stdlib.test.ts","../src/__tests__/e2e/fft-stdlib.test.ts","../src/__tests__/e2e/for-in-array.test.ts","../src/__tests__/e2e/macros.test.ts","../src/__tests__/e2e/migrate.test.ts","../src/__tests__/e2e/ode-stdlib.test.ts","../src/__tests__/e2e/stdlib-e2e.test.ts","../src/__tests__/emit/compile-branches.test.ts","../src/__tests__/emit/compile-coverage.test.ts","../src/__tests__/emit/compile-extra-branches.test.ts","../src/__tests__/emit/compile-mocked-branches.test.ts","../src/__tests__/emit/compile.test.ts","../src/__tests__/emit/index.test.ts","../src/__tests__/emit/modules-branches.test.ts","../src/__tests__/emit/modules-coverage.test.ts","../src/__tests__/emit/modules-errors.test.ts","../src/__tests__/emit/modules-extra.test.ts","../src/__tests__/emit/modules-rewrite.test.ts","../src/__tests__/hir/desugar.test.ts","../src/__tests__/hir/lower-extra.test.ts","../src/__tests__/hir/monomorphize-extra.test.ts","../src/__tests__/hir/monomorphize-extra2.test.ts","../src/__tests__/lint/rules.test.ts","../src/__tests__/lir/lower.test.ts","../src/__tests__/lir/types.test.ts","../src/__tests__/lir/verify.test.ts","../src/__tests__/lsp/completion.test.ts","../src/__tests__/lsp/definition.test.ts","../src/__tests__/mc-integration/item-entity-events.test.ts","../src/__tests__/mc-integration/stdlib-coverage-2.test.ts","../src/__tests__/mc-integration/stdlib-coverage-3.test.ts","../src/__tests__/mc-integration/stdlib-coverage-4.test.ts","../src/__tests__/mc-integration/stdlib-coverage-5.test.ts","../src/__tests__/mc-integration/stdlib-coverage-6.test.ts","../src/__tests__/mc-integration/stdlib-coverage-7.test.ts","../src/__tests__/mc-integration/stdlib-coverage.test.ts","../src/__tests__/mc-integration/syntax-coverage.test.ts","../src/__tests__/mir/arithmetic.test.ts","../src/__tests__/mir/control-flow.test.ts","../src/__tests__/mir/lower-extra.test.ts","../src/__tests__/mir/lower-extra2.test.ts","../src/__tests__/mir/lower-extra3.test.ts","../src/__tests__/mir/lower-extra4.test.ts","../src/__tests__/mir/lower-extra5.test.ts","../src/__tests__/mir/lower-extra6.test.ts","../src/__tests__/mir/lower-extra7.test.ts","../src/__tests__/mir/lower-extra8.test.ts","../src/__tests__/mir/lower-extra9.test.ts","../src/__tests__/mir/verify.test.ts","../src/__tests__/optimizer/block_merge.test.ts","../src/__tests__/optimizer/branch_simplify.test.ts","../src/__tests__/optimizer/constant_fold.test.ts","../src/__tests__/optimizer/copy_prop.test.ts","../src/__tests__/optimizer/coroutine.test.ts","../src/__tests__/optimizer/dce.test.ts","../src/__tests__/optimizer/inline_fn.test.ts","../src/__tests__/optimizer/interprocedural.test.ts","../src/__tests__/optimizer/nbt-batch.test.ts","../src/__tests__/optimizer/optimizer-extended.test.ts","../src/__tests__/optimizer/pipeline.test.ts","../src/__tests__/optimizer/selector-cache.test.ts","../src/__tests__/optimizer/unroll.test.ts","../src/__tests__/optimizer/lir/const_imm.test.ts","../src/__tests__/optimizer/lir/dead_slot.test.ts","../src/__tests__/optimizer/lir/peephole.test.ts","../src/__tests__/optimizer/lir/pipeline.test.ts","../src/__tests__/stdlib/advanced.test.ts","../src/__tests__/stdlib/arr-len.test.ts","../src/__tests__/stdlib/bigint.test.ts","../src/__tests__/stdlib/bits.test.ts","../src/__tests__/stdlib/bossbar.test.ts","../src/__tests__/stdlib/calculus.test.ts","../src/__tests__/stdlib/color.test.ts","../src/__tests__/stdlib/combat.test.ts","../src/__tests__/stdlib/cooldown.test.ts","../src/__tests__/stdlib/dialog.test.ts","../src/__tests__/stdlib/easing.test.ts","../src/__tests__/stdlib/ecs.test.ts","../src/__tests__/stdlib/effects.test.ts","../src/__tests__/stdlib/events.test.ts","../src/__tests__/stdlib/expr.test.ts","../src/__tests__/stdlib/fft.test.ts","../src/__tests__/stdlib/geometry.test.ts","../src/__tests__/stdlib/graph.test.ts","../src/__tests__/stdlib/heap.test.ts","../src/__tests__/stdlib/interactions.test.ts","../src/__tests__/stdlib/inventory.test.ts","../src/__tests__/stdlib/linalg.test.ts","../src/__tests__/stdlib/list.test.ts","../src/__tests__/stdlib/map.test.ts","../src/__tests__/stdlib/math.test.ts","../src/__tests__/stdlib/math_hp.test.ts","../src/__tests__/stdlib/matrix.test.ts","../src/__tests__/stdlib/mobs.test.ts","../src/__tests__/stdlib/noise.test.ts","../src/__tests__/stdlib/ode.test.ts","../src/__tests__/stdlib/parabola.test.ts","../src/__tests__/stdlib/particles.test.ts","../src/__tests__/stdlib/pathfind.test.ts","../src/__tests__/stdlib/physics.test.ts","../src/__tests__/stdlib/player.test.ts","../src/__tests__/stdlib/quaternion.test.ts","../src/__tests__/stdlib/random.test.ts","../src/__tests__/stdlib/result.test.ts","../src/__tests__/stdlib/scheduler.test.ts","../src/__tests__/stdlib/set_int.test.ts","../src/__tests__/stdlib/sets.test.ts","../src/__tests__/stdlib/signal.test.ts","../src/__tests__/stdlib/sort-v2.test.ts","../src/__tests__/stdlib/sort.test.ts","../src/__tests__/stdlib/spawn.test.ts","../src/__tests__/stdlib/state.test.ts","../src/__tests__/stdlib/string.test.ts","../src/__tests__/stdlib/strings.test.ts","../src/__tests__/stdlib/tags.test.ts","../src/__tests__/stdlib/teams.test.ts","../src/__tests__/stdlib/timer.test.ts","../src/__tests__/stdlib/vec.test.ts","../src/__tests__/stdlib/world.test.ts","../src/__tests__/tuner/adapters.test.ts","../src/__tests__/tuner/engine.test.ts","../src/__tests__/tuner/simulator-extra.test.ts","../src/ast/types.ts","../src/builtins/metadata.ts","../src/cache/deps.ts","../src/cache/incremental.ts","../src/cache/index.ts","../src/diagnostics/index.ts","../src/emit/compile.ts","../src/emit/index.ts","../src/emit/modules.ts","../src/emit/sourcemap.ts","../src/events/types.ts","../src/formatter/index.ts","../src/hir/deprecated.ts","../src/hir/lower.ts","../src/hir/monomorphize.ts","../src/hir/types.ts","../src/lexer/index.ts","../src/lint/index.ts","../src/lir/budget.ts","../src/lir/lower.ts","../src/lir/types.ts","../src/lir/verify.ts","../src/lsp/main.ts","../src/lsp/server.ts","../src/mc-test/client.ts","../src/mc-test/runner.ts","../src/mc-test/setup.ts","../src/mc-validator/index.ts","../src/mir/lower.ts","../src/mir/macro.ts","../src/mir/types.ts","../src/mir/verify.ts","../src/nbt/index.ts","../src/optimizer/block_merge.ts","../src/optimizer/branch_simplify.ts","../src/optimizer/constant_fold.ts","../src/optimizer/copy_prop.ts","../src/optimizer/coroutine.ts","../src/optimizer/dce.ts","../src/optimizer/inline.ts","../src/optimizer/interprocedural.ts","../src/optimizer/nbt-batch.ts","../src/optimizer/pipeline.ts","../src/optimizer/selector-cache.ts","../src/optimizer/unroll.ts","../src/optimizer/lir/const_imm.ts","../src/optimizer/lir/dead_slot.ts","../src/optimizer/lir/peephole.ts","../src/optimizer/lir/pipeline.ts","../src/parser/index.ts","../src/runtime/index.ts","../src/tuner/cli.ts","../src/tuner/engine.ts","../src/tuner/metrics.ts","../src/tuner/simulator.ts","../src/tuner/types.ts","../src/tuner/adapters/ln-polynomial.ts","../src/tuner/adapters/sqrt-newton.ts","../src/typechecker/index.ts","../src/types/entity-hierarchy.ts","../src/types/mc-version.ts"],"version":"5.9.3"}
@@ -0,0 +1,104 @@
1
+ # `graph` — Directed and Undirected Weighted Graphs
2
+
3
+ Import: `import "stdlib/graph.mcrs"`
4
+
5
+ Fixed-capacity graph utilities for RedScript datapacks. The graph is stored in a single flat `int[]`, supports up to **64 nodes** and **256 directed edges**, and provides traversal plus shortest-path helpers without any dynamic graph object type.
6
+
7
+ ## Data Layout
8
+
9
+ `graph_new()` allocates a 770-element `int[]` with this layout:
10
+
11
+ | Index | Meaning |
12
+ |------|------|
13
+ | `g[0]` | Current directed edge count |
14
+ | `g[1]` | Node count |
15
+ | `g[2 + i * 3]` | Edge `i` source |
16
+ | `g[2 + i * 3 + 1]` | Edge `i` destination |
17
+ | `g[2 + i * 3 + 2]` | Edge `i` weight |
18
+
19
+ Nodes are zero-based integers in `[0, graph_node_count(g))`.
20
+
21
+ ## Quick Example
22
+
23
+ ```rs
24
+ import "stdlib/graph.mcrs";
25
+
26
+ let g: int[] = graph_new(5);
27
+ g = graph_add_edge(g, 0, 1, 1);
28
+ g = graph_add_edge(g, 0, 2, 4);
29
+ g = graph_add_undirected(g, 2, 3, 2);
30
+ g = graph_add_edge(g, 1, 3, 2);
31
+ g = graph_add_edge(g, 3, 4, 1);
32
+
33
+ let vis: int[] = [0, 0, 0, 0, 0];
34
+ let bfs_order: int[] = graph_bfs(g, 0, vis);
35
+
36
+ let dist: int[] = [0, 0, 0, 0, 0];
37
+ let shortest: int = graph_shortest_path(g, 0, 4, dist);
38
+ // shortest = 4 via 0 -> 1 -> 3 -> 4
39
+ ```
40
+
41
+ ## Functions
42
+
43
+ ### `graph_new(n: int): int[]`
44
+
45
+ Allocate a new graph with `n` nodes and no edges. `n` is clamped to `[0, 64]`.
46
+
47
+ ### `graph_add_edge(g: int[], src: int, dst: int, weight: int): int[]`
48
+
49
+ Append one directed edge `src -> dst`. If `src` or `dst` is invalid, or the graph already holds 256 directed edges, the input graph is returned unchanged.
50
+
51
+ ### `graph_add_undirected(g: int[], a: int, b: int, weight: int): int[]`
52
+
53
+ Append `a -> b` and `b -> a` with the same weight. This consumes two directed-edge slots.
54
+
55
+ ### `graph_node_count(g: int[]): int`
56
+
57
+ Return the configured node count.
58
+
59
+ ### `graph_edge_count(g: int[]): int`
60
+
61
+ Return the current directed edge count.
62
+
63
+ ### `graph_bfs(g: int[], start: int, out_visited: int[]): int[]`
64
+
65
+ Breadth-first search from `start`.
66
+
67
+ - Returns node indices in BFS visit order.
68
+ - Writes `1` into `out_visited[i]` for each reachable node.
69
+ - Returns `[]` if `start` is invalid.
70
+
71
+ `out_visited` must have at least `graph_node_count(g)` slots and should be zero-initialized by the caller.
72
+
73
+ ### `graph_dfs(g: int[], start: int, out_visited: int[]): int[]`
74
+
75
+ Depth-first search from `start`.
76
+
77
+ - Returns node indices in DFS visit order.
78
+ - Writes `1` into `out_visited[i]` for each reachable node.
79
+ - Returns `[]` if `start` is invalid.
80
+
81
+ Like `graph_bfs()`, the caller owns the output array sizing.
82
+
83
+ ### `graph_has_path(g: int[], src: int, dst: int): int`
84
+
85
+ Return `1` if a directed path exists from `src` to `dst`, otherwise `0`.
86
+
87
+ - Invalid endpoints also return `0`.
88
+ - The implementation uses BFS over the stored directed edges.
89
+
90
+ ### `graph_shortest_path(g: int[], src: int, dst: int, out_dist: int[]): int`
91
+
92
+ Run Dijkstra from `src` and fill `out_dist` with shortest distances.
93
+
94
+ - `out_dist[i]` becomes the shortest distance from `src` to node `i`.
95
+ - Unreachable nodes are written as `-1`.
96
+ - The function returns `out_dist[dst]`.
97
+ - Invalid `src` or `dst` returns `-1`.
98
+
99
+ ## Notes
100
+
101
+ - Edge weights are plain integers.
102
+ - Negative weights are not supported safely because the algorithm is Dijkstra.
103
+ - `graph_bfs()` and `graph_dfs()` use fixed-size internal arrays sized for 64 nodes.
104
+ - `graph_shortest_path()` uses `999999` as its internal infinity sentinel.
@@ -0,0 +1,113 @@
1
+ # `parabola` — Projectile Aiming and Trajectory Helpers
2
+
3
+ Import: `import "stdlib/parabola.mcrs"`
4
+
5
+ Projectile helpers for Minecraft-style trajectories. This module is aimed at launch planning and simple tick-by-tick simulation. It uses **×10000 fixed-point velocities** and a gravity constant tuned to Minecraft projectile motion.
6
+
7
+ ## Units
8
+
9
+ - Position offsets: blocks
10
+ - Velocity: blocks/tick ×10000
11
+ - Time: ticks
12
+ - Gravity: `800` means `0.08 blocks/tick^2`
13
+ - Drag: ×10000
14
+
15
+ Requires `stdlib/math` for `mulfix()` and `isqrt()`.
16
+
17
+ ## Quick Example
18
+
19
+ ```rs
20
+ import "stdlib/parabola.mcrs";
21
+
22
+ let ticks: int = 20;
23
+ let vx: int = parabola_vx(16, ticks);
24
+ let vy: int = parabola_vy(4, ticks);
25
+ let vz: int = parabola_vz(0, ticks);
26
+
27
+ let y_at_10: int = parabola_y(vy, 10);
28
+ let flight: int = parabola_flight_time(vy);
29
+ ```
30
+
31
+ ## Constants
32
+
33
+ ### `parabola_gravity(): int`
34
+
35
+ Returns `800`, the per-tick gravity constant in ×10000 scale.
36
+
37
+ ### `parabola_gravity_half(): int`
38
+
39
+ Returns `400`, used by the displacement formulas.
40
+
41
+ ## Velocity Solvers
42
+
43
+ ### `parabola_vx(dx: int, ticks: int): int`
44
+
45
+ Initial X velocity needed to travel `dx` blocks in `ticks` ticks. Returns `0` if `ticks <= 0`.
46
+
47
+ ### `parabola_vy(dy: int, ticks: int): int`
48
+
49
+ Initial Y velocity needed to reach vertical offset `dy` in `ticks` ticks under constant gravity. Returns `0` if `ticks <= 0`.
50
+
51
+ ### `parabola_vz(dz: int, ticks: int): int`
52
+
53
+ Initial Z velocity needed to travel `dz` blocks in `ticks` ticks. Returns `0` if `ticks <= 0`.
54
+
55
+ ### `parabola_speed_xz(dx: int, dz: int, ticks: int): int`
56
+
57
+ Horizontal speed magnitude from the solved `vx` and `vz`, returned in ×10000 scale.
58
+
59
+ ## Position at Tick `t`
60
+
61
+ ### `parabola_x(vx0: int, t: int): int`
62
+
63
+ Horizontal X displacement after `t` ticks.
64
+
65
+ ### `parabola_y(vy0: int, t: int): int`
66
+
67
+ Vertical displacement after `t` ticks under constant gravity.
68
+
69
+ ### `parabola_z(vz0: int, t: int): int`
70
+
71
+ Horizontal Z displacement after `t` ticks.
72
+
73
+ ## Flight Estimates
74
+
75
+ ### `parabola_flight_time(vy0: int): int`
76
+
77
+ Approximate number of ticks until a projectile returns to launch height. Returns `0` if `vy0 <= 0`.
78
+
79
+ ### `parabola_max_height(vy0: int): int`
80
+
81
+ Approximate maximum height above launch point, in blocks.
82
+
83
+ ## Tick-Step Drag Helpers
84
+
85
+ These functions are for per-tick simulation, not closed-form aiming.
86
+
87
+ ### `parabola_step_vx(vx: int, drag: int): int`
88
+
89
+ Apply drag to X velocity.
90
+
91
+ ### `parabola_step_vy(vy: int, drag: int): int`
92
+
93
+ Apply gravity first, then drag, to Y velocity.
94
+
95
+ ### `parabola_step_vz(vz: int, drag: int): int`
96
+
97
+ Apply drag to Z velocity.
98
+
99
+ ## Targeting Helpers
100
+
101
+ ### `parabola_ticks_for_range(range: int): int`
102
+
103
+ Estimate a practical flight time for a horizontal range, using a simple average-speed heuristic. Returns at least `1`.
104
+
105
+ ### `parabola_in_range(dx: int, dz: int, max_range: int): int`
106
+
107
+ Return `1` if the horizontal target lies within `max_range`, otherwise `0`.
108
+
109
+ ## Notes
110
+
111
+ - Closed-form position helpers here assume no drag.
112
+ - Drag-aware helpers only advance velocity one tick at a time.
113
+ - `parabola_y()` and `parabola_max_height()` return integer block values, so truncation is expected.