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
@@ -0,0 +1,576 @@
1
+ /**
2
+ * Parser branch coverage — targets uncovered branches in src/parser/index.ts.
3
+ *
4
+ * Focus areas derived from coverage analysis:
5
+ * • NBT suffix literals: byte_lit, short_lit, long_lit, double_lit
6
+ * • Coordinate literals: rel_coord, local_coord in expressions
7
+ * • mc_name literal (#health)
8
+ * • isTypeCastAs variants (cast to double, byte, short, long, selector, Option)
9
+ * • match pattern: enum with multi-binding, no-binding, negative int
10
+ * • execute subcommands: rotated <yaw> <pitch>, anchored, align, on, summon,
11
+ * store success, in dimension, unless score range
12
+ * • facing entity with 'feet' anchor
13
+ * • Function default parameter values
14
+ * • const with inferred type (bool, float/fixed, string)
15
+ * • module library declaration
16
+ * • named module declaration
17
+ * • enum variant with explicit value
18
+ * • import wildcard (import math::*)
19
+ * • negative integer match pattern
20
+ * • PatEnum with no bindings
21
+ * • member/index compound assignment operators (+=, -=, *=, /=, %=)
22
+ * • Generic call: fn<Type>(args)
23
+ * • invoke expression (callee is not ident)
24
+ */
25
+
26
+ import { Lexer } from '../lexer'
27
+ import { Parser } from '../parser'
28
+ import type { Program, FnDecl, Stmt, Expr } from '../ast/types'
29
+
30
+ function parse(source: string): Program {
31
+ const tokens = new Lexer(source).tokenize()
32
+ return new Parser(tokens).parse('test')
33
+ }
34
+
35
+ function parseStmt(source: string): Stmt {
36
+ const prog = parse(`fn _t() { ${source} }`)
37
+ return prog.declarations[0].body[0]
38
+ }
39
+
40
+ function parseExpr(source: string): Expr {
41
+ const prog = parse(`fn _t(): int { return ${source}; }`)
42
+ const ret = prog.declarations[0].body[0]
43
+ return (ret as any).value
44
+ }
45
+
46
+ // ── NBT suffix literals ────────────────────────────────────────────────────
47
+
48
+ describe('Parser — NBT suffix literals', () => {
49
+ test('byte literal 1b', () => {
50
+ const expr = parseExpr('1b')
51
+ expect(expr.kind).toBe('byte_lit')
52
+ expect((expr as any).value).toBe(1)
53
+ })
54
+
55
+ test('byte literal 0b', () => {
56
+ const expr = parseExpr('0b')
57
+ expect(expr.kind).toBe('byte_lit')
58
+ })
59
+
60
+ test('short literal 100s', () => {
61
+ const expr = parseExpr('100s')
62
+ expect(expr.kind).toBe('short_lit')
63
+ expect((expr as any).value).toBe(100)
64
+ })
65
+
66
+ test('long literal 999l', () => {
67
+ const expr = parseExpr('999l')
68
+ expect(expr.kind).toBe('long_lit')
69
+ expect((expr as any).value).toBe(999)
70
+ })
71
+
72
+ test('double literal 3.14d', () => {
73
+ const expr = parseExpr('3.14d')
74
+ expect(expr.kind).toBe('double_lit')
75
+ expect((expr as any).value).toBeCloseTo(3.14)
76
+ })
77
+
78
+ test('byte literal in function body', () => {
79
+ const prog = parse(`fn f() { let x: int = 5b as int; }`)
80
+ expect(prog.declarations.length).toBe(1)
81
+ })
82
+ })
83
+
84
+ // ── mc_name literal ────────────────────────────────────────────────────────
85
+
86
+ describe('Parser — mc_name literal', () => {
87
+ test('#health parses as mc_name expr', () => {
88
+ const expr = parseExpr('#health')
89
+ expect(expr.kind).toBe('mc_name')
90
+ expect((expr as any).value).toBe('health')
91
+ })
92
+
93
+ test('#my_score parses as mc_name', () => {
94
+ const expr = parseExpr('#my_score')
95
+ expect(expr.kind).toBe('mc_name')
96
+ expect((expr as any).value).toBe('my_score')
97
+ })
98
+ })
99
+
100
+ // ── Type cast to NBT/special types ────────────────────────────────────────
101
+
102
+ describe('Parser — type cast to special types', () => {
103
+ test('cast to double', () => {
104
+ const expr = parseExpr('x as double')
105
+ expect(expr.kind).toBe('type_cast')
106
+ expect((expr as any).targetType).toMatchObject({ kind: 'named', name: 'double' })
107
+ })
108
+
109
+ test('cast to byte', () => {
110
+ const expr = parseExpr('x as byte')
111
+ expect(expr.kind).toBe('type_cast')
112
+ expect((expr as any).targetType).toMatchObject({ kind: 'named', name: 'byte' })
113
+ })
114
+
115
+ test('cast to short', () => {
116
+ const expr = parseExpr('x as short')
117
+ expect(expr.kind).toBe('type_cast')
118
+ expect((expr as any).targetType).toMatchObject({ kind: 'named', name: 'short' })
119
+ })
120
+
121
+ test('cast to long', () => {
122
+ const expr = parseExpr('x as long')
123
+ expect(expr.kind).toBe('type_cast')
124
+ expect((expr as any).targetType).toMatchObject({ kind: 'named', name: 'long' })
125
+ })
126
+
127
+ test('cast to selector (bare)', () => {
128
+ const expr = parseExpr('x as selector')
129
+ expect(expr.kind).toBe('type_cast')
130
+ const t = (expr as any).targetType
131
+ expect(t.kind).toBe('selector')
132
+ })
133
+
134
+ test('cast to fixed', () => {
135
+ const expr = parseExpr('x as fixed')
136
+ expect(expr.kind).toBe('type_cast')
137
+ expect((expr as any).targetType).toMatchObject({ kind: 'named', name: 'fixed' })
138
+ })
139
+
140
+ test('cast to bool', () => {
141
+ const expr = parseExpr('x as bool')
142
+ expect(expr.kind).toBe('type_cast')
143
+ })
144
+
145
+ test('cast to BlockPos', () => {
146
+ const expr = parseExpr('x as BlockPos')
147
+ expect(expr.kind).toBe('type_cast')
148
+ })
149
+ })
150
+
151
+ // ── Default parameter values ────────────────────────────────────────────────
152
+
153
+ describe('Parser — default parameter values', () => {
154
+ test('fn with default int param', () => {
155
+ const prog = parse(`fn greet(n: int = 5): int { return n; }`)
156
+ const fn = prog.declarations[0]
157
+ expect(fn.params[0].default).toBeDefined()
158
+ })
159
+
160
+ test('fn with default string param', () => {
161
+ const prog = parse(`fn greet(msg: string = "hello"): string { return msg; }`)
162
+ const fn = prog.declarations[0]
163
+ expect(fn.params[0].default).toBeDefined()
164
+ })
165
+
166
+ test('fn with two params, second has default', () => {
167
+ const prog = parse(`fn add(a: int, b: int = 0): int { return a + b; }`)
168
+ const fn = prog.declarations[0]
169
+ expect(fn.params[0].default).toBeUndefined()
170
+ expect(fn.params[1].default).toBeDefined()
171
+ })
172
+ })
173
+
174
+ // ── const with inferred types ──────────────────────────────────────────────
175
+
176
+ describe('Parser — const with inferred types', () => {
177
+ test('const inferred as string', () => {
178
+ const prog = parse(`const MSG = "hello";`)
179
+ const c = prog.consts[0]
180
+ expect(c.type.kind).toBe('named')
181
+ expect((c.type as any).name).toBe('string')
182
+ })
183
+
184
+ test('const inferred as bool from true', () => {
185
+ const prog = parse(`const FLAG = true;`)
186
+ const c = prog.consts[0]
187
+ expect((c.type as any).name).toBe('bool')
188
+ })
189
+
190
+ test('const inferred as bool from false', () => {
191
+ const prog = parse(`const OFF = false;`)
192
+ const c = prog.consts[0]
193
+ expect((c.type as any).name).toBe('bool')
194
+ })
195
+
196
+ test('const inferred as int', () => {
197
+ const prog = parse(`const N = 42;`)
198
+ const c = prog.consts[0]
199
+ expect((c.type as any).name).toBe('int')
200
+ })
201
+
202
+ test('const with explicit type', () => {
203
+ const prog = parse(`const N: int = 42;`)
204
+ const c = prog.consts[0]
205
+ expect((c.type as any).name).toBe('int')
206
+ })
207
+ })
208
+
209
+ // ── Module declarations ────────────────────────────────────────────────────
210
+
211
+ describe('Parser — module declarations', () => {
212
+ test('module library sets isLibrary', () => {
213
+ const prog = parse(`module library;\nfn f(): int { return 0; }`)
214
+ expect(prog.isLibrary).toBe(true)
215
+ })
216
+
217
+ test('named module declaration', () => {
218
+ const prog = parse(`module math;\nfn f(): int { return 0; }`)
219
+ expect(prog.moduleName).toBe('math')
220
+ expect(prog.isLibrary).toBeFalsy()
221
+ })
222
+ })
223
+
224
+ // ── Enum variants with explicit values ─────────────────────────────────────
225
+
226
+ describe('Parser — enum explicit values', () => {
227
+ test('enum variant with = value', () => {
228
+ const prog = parse(`
229
+ enum Status {
230
+ Ok = 0,
231
+ NotFound = 404,
232
+ ServerError = 500,
233
+ }
234
+ `)
235
+ const e = prog.enums[0]
236
+ const nf = e.variants.find(v => v.name === 'NotFound')
237
+ expect(nf?.value).toBe(404)
238
+ })
239
+
240
+ test('enum mixed explicit and auto values', () => {
241
+ const prog = parse(`
242
+ enum Dir { North = 10, East, South, West }
243
+ `)
244
+ const e = prog.enums[0]
245
+ expect(e.variants.find(v => v.name === 'North')?.value).toBe(10)
246
+ expect(e.variants.find(v => v.name === 'East')?.value).toBe(11)
247
+ expect(e.variants.find(v => v.name === 'South')?.value).toBe(12)
248
+ })
249
+ })
250
+
251
+ // ── Import wildcard ────────────────────────────────────────────────────────
252
+
253
+ describe('Parser — import declarations', () => {
254
+ test('import wildcard: import math::*', () => {
255
+ const prog = parse(`import math::*;\nfn f(): int { return 0; }`)
256
+ expect(prog.imports.length).toBe(1)
257
+ expect(prog.imports[0].symbol).toBe('*')
258
+ expect(prog.imports[0].moduleName).toBe('math')
259
+ })
260
+
261
+ test('import specific symbol: import math::sin', () => {
262
+ const prog = parse(`import math::sin;\nfn f(): int { return 0; }`)
263
+ expect(prog.imports[0].symbol).toBe('sin')
264
+ })
265
+
266
+ test('whole-module import: import player_utils', () => {
267
+ const prog = parse(`import player_utils;\nfn f(): int { return 0; }`)
268
+ expect(prog.imports.length).toBe(1)
269
+ expect(prog.imports[0].moduleName).toBe('player_utils')
270
+ })
271
+ })
272
+
273
+ // ── Match patterns ──────────────────────────────────────────────────────────
274
+
275
+ describe('Parser — match patterns', () => {
276
+ test('PatEnum with no bindings', () => {
277
+ const stmt = parseStmt(`
278
+ match x {
279
+ Color::Red => { }
280
+ Color::Blue => { }
281
+ }
282
+ `)
283
+ const m = stmt as any
284
+ const arm = m.arms[0]
285
+ expect(arm.pattern.kind).toBe('PatEnum')
286
+ expect(arm.pattern.bindings).toHaveLength(0)
287
+ })
288
+
289
+ test('PatEnum with one binding', () => {
290
+ const stmt = parseStmt(`
291
+ match r {
292
+ Result::Ok(v) => { }
293
+ Result::Err(e) => { }
294
+ }
295
+ `)
296
+ const m = stmt as any
297
+ expect(m.arms[0].pattern.bindings).toHaveLength(1)
298
+ expect(m.arms[0].pattern.bindings[0]).toBe('v')
299
+ })
300
+
301
+ test('PatEnum with two bindings', () => {
302
+ const stmt = parseStmt(`
303
+ match p {
304
+ Pair::Both(a, b) => { }
305
+ }
306
+ `)
307
+ const m = stmt as any
308
+ expect(m.arms[0].pattern.bindings).toHaveLength(2)
309
+ })
310
+
311
+ test('negative integer match pattern', () => {
312
+ const stmt = parseStmt(`
313
+ match x {
314
+ -1 => { }
315
+ 0 => { }
316
+ 1 => { }
317
+ }
318
+ `)
319
+ const m = stmt as any
320
+ expect(m.arms[0].pattern.kind).toBe('PatInt')
321
+ expect(m.arms[0].pattern.value).toBe(-1)
322
+ })
323
+
324
+ test('match (legacy parenthesised syntax)', () => {
325
+ const stmt = parseStmt(`
326
+ match (x) {
327
+ 0 => { }
328
+ 1 => { }
329
+ }
330
+ `)
331
+ expect(stmt.kind).toBe('match')
332
+ })
333
+ })
334
+
335
+ // ── Execute advanced subcommands ────────────────────────────────────────────
336
+
337
+ describe('Parser — execute advanced subcommands', () => {
338
+ test('execute rotated <yaw> <pitch> run', () => {
339
+ const stmt = parseStmt('execute rotated 0 0 run { raw("x"); }')
340
+ const ex = stmt as any
341
+ const subs = ex.subcommands ?? ex.clauses
342
+ expect(subs.some((c: any) => c.kind === 'rotated')).toBe(true)
343
+ })
344
+
345
+ test('execute anchored eyes run', () => {
346
+ const stmt = parseStmt('execute anchored eyes run { raw("x"); }')
347
+ const ex = stmt as any
348
+ const subs = ex.subcommands ?? ex.clauses
349
+ expect(subs.some((c: any) => c.kind === 'anchored')).toBe(true)
350
+ })
351
+
352
+ test('execute anchored feet run', () => {
353
+ const stmt = parseStmt('execute anchored feet run { raw("x"); }')
354
+ const ex = stmt as any
355
+ const subs = ex.subcommands ?? ex.clauses
356
+ expect(subs.some((c: any) => c.kind === 'anchored' && c.anchor === 'feet')).toBe(true)
357
+ })
358
+
359
+ test('execute align xyz run', () => {
360
+ const stmt = parseStmt('execute align xyz run { raw("x"); }')
361
+ const ex = stmt as any
362
+ const subs = ex.subcommands ?? ex.clauses
363
+ expect(subs.some((c: any) => c.kind === 'align')).toBe(true)
364
+ })
365
+
366
+ test('execute on attacker run', () => {
367
+ const stmt = parseStmt('execute on attacker run { raw("x"); }')
368
+ const ex = stmt as any
369
+ const subs = ex.subcommands ?? ex.clauses
370
+ expect(subs.some((c: any) => c.kind === 'on')).toBe(true)
371
+ })
372
+
373
+ test('execute summon zombie run', () => {
374
+ const stmt = parseStmt('execute summon zombie run { raw("x"); }')
375
+ const ex = stmt as any
376
+ const subs = ex.subcommands ?? ex.clauses
377
+ expect(subs.some((c: any) => c.kind === 'summon')).toBe(true)
378
+ })
379
+
380
+ test('execute store success score #r rs run', () => {
381
+ const stmt = parseStmt('execute store success score #r rs run { raw("x"); }')
382
+ const ex = stmt as any
383
+ const subs = ex.subcommands ?? ex.clauses
384
+ expect(subs.some((c: any) => c.kind === 'store_success')).toBe(true)
385
+ })
386
+
387
+ test('execute in minecraft:the_nether run', () => {
388
+ const stmt = parseStmt('execute in minecraft:the_nether run { raw("x"); }')
389
+ const ex = stmt as any
390
+ const subs = ex.subcommands ?? ex.clauses
391
+ const inSub = subs.find((c: any) => c.kind === 'in')
392
+ expect(inSub).toBeDefined()
393
+ expect(inSub.dimension).toBe('minecraft:the_nether')
394
+ })
395
+
396
+ test('execute in overworld (no namespace) run', () => {
397
+ const stmt = parseStmt('execute in overworld run { raw("x"); }')
398
+ const ex = stmt as any
399
+ const subs = ex.subcommands ?? ex.clauses
400
+ expect(subs.some((c: any) => c.kind === 'in')).toBe(true)
401
+ })
402
+
403
+ test('execute unless score matches range run', () => {
404
+ const stmt = parseStmt('execute unless score x rs matches 1..10 run { raw("x"); }')
405
+ const ex = stmt as any
406
+ const subs = ex.subcommands ?? ex.clauses
407
+ expect(subs.some((c: any) => c.kind === 'unless_score_range')).toBe(true)
408
+ })
409
+
410
+ test('execute if score matches range run', () => {
411
+ const stmt = parseStmt('execute if score x rs matches 0 run { raw("x"); }')
412
+ const ex = stmt as any
413
+ const subs = ex.subcommands ?? ex.clauses
414
+ expect(subs.some((c: any) => c.kind === 'if_score_range')).toBe(true)
415
+ })
416
+
417
+ test('execute unless entity selector run', () => {
418
+ const stmt = parseStmt('execute unless entity @e[tag=dead] run { raw("x"); }')
419
+ const ex = stmt as any
420
+ const subs = ex.subcommands ?? ex.clauses
421
+ expect(subs.some((c: any) => c.kind === 'unless_entity')).toBe(true)
422
+ })
423
+
424
+ test('execute unless block run', () => {
425
+ const stmt = parseStmt('execute unless block 0 64 0 minecraft:air run { raw("x"); }')
426
+ const ex = stmt as any
427
+ const subs = ex.subcommands ?? ex.clauses
428
+ expect(subs.some((c: any) => c.kind === 'unless_block')).toBe(true)
429
+ })
430
+
431
+ test('execute facing entity @s feet run', () => {
432
+ const stmt = parseStmt('execute facing entity @s feet run { raw("x"); }')
433
+ const ex = stmt as any
434
+ const subs = ex.subcommands ?? ex.clauses
435
+ const fe = subs.find((c: any) => c.kind === 'facing_entity')
436
+ expect(fe).toBeDefined()
437
+ expect(fe.anchor).toBe('feet')
438
+ })
439
+
440
+ test('execute if block without namespace (bare id)', () => {
441
+ const stmt = parseStmt('execute if block 0 64 0 stone run { raw("x"); }')
442
+ const ex = stmt as any
443
+ const subs = ex.subcommands ?? ex.clauses
444
+ expect(subs.some((c: any) => c.kind === 'if_block')).toBe(true)
445
+ })
446
+ })
447
+
448
+ // ── Compound assignment on member and index ──────────────────────────────────
449
+
450
+ describe('Parser — compound assignment', () => {
451
+ test('member += assignment', () => {
452
+ const stmt = parseStmt('p.x += 5;')
453
+ expect(stmt.kind).toBe('expr')
454
+ const e = (stmt as any).expr
455
+ expect(e.kind).toBe('member_assign')
456
+ expect(e.op).toBe('+=')
457
+ })
458
+
459
+ test('member -= assignment', () => {
460
+ const stmt = parseStmt('p.y -= 3;')
461
+ const e = (stmt as any).expr
462
+ expect(e.kind).toBe('member_assign')
463
+ expect(e.op).toBe('-=')
464
+ })
465
+
466
+ test('index += assignment', () => {
467
+ const stmt = parseStmt('arr[0] += 1;')
468
+ const e = (stmt as any).expr
469
+ expect(e.kind).toBe('index_assign')
470
+ expect(e.op).toBe('+=')
471
+ })
472
+
473
+ test('index *= assignment', () => {
474
+ const stmt = parseStmt('arr[i] *= 2;')
475
+ const e = (stmt as any).expr
476
+ expect(e.kind).toBe('index_assign')
477
+ expect(e.op).toBe('*=')
478
+ })
479
+
480
+ test('variable /= assignment', () => {
481
+ const stmt = parseStmt('x /= 4;')
482
+ const e = (stmt as any).expr
483
+ expect(e.kind).toBe('assign')
484
+ expect(e.op).toBe('/=')
485
+ })
486
+
487
+ test('variable %= assignment', () => {
488
+ const stmt = parseStmt('x %= 7;')
489
+ const e = (stmt as any).expr
490
+ expect(e.kind).toBe('assign')
491
+ expect(e.op).toBe('%=')
492
+ })
493
+ })
494
+
495
+ // ── Generic call syntax ────────────────────────────────────────────────────
496
+
497
+ describe('Parser — generic call', () => {
498
+ test('generic call fn<int>(arg)', () => {
499
+ const expr = parseExpr('identity<int>(42)')
500
+ // Should parse as a call with typeArgs
501
+ expect(expr.kind).toBe('call')
502
+ expect((expr as any).typeArgs).toBeDefined()
503
+ expect((expr as any).typeArgs.length).toBeGreaterThan(0)
504
+ })
505
+
506
+ test('non-generic comparison not mistaken for type args', () => {
507
+ // a < b should remain a binary expression, not a generic call
508
+ const expr = parseExpr('a < b')
509
+ expect(expr.kind).toBe('binary')
510
+ })
511
+ })
512
+
513
+ // ── Type parsing edge cases ────────────────────────────────────────────────
514
+
515
+ describe('Parser — type parsing', () => {
516
+ test('selector<Player> type', () => {
517
+ const prog = parse(`fn f(s: selector<Player>): void { }`)
518
+ const param = prog.declarations[0].params[0]
519
+ expect(param.type.kind).toBe('selector')
520
+ expect((param.type as any).entityType).toBe('Player')
521
+ })
522
+
523
+ test('Option<int> type', () => {
524
+ const prog = parse(`fn f(x: Option<int>): void { }`)
525
+ const param = prog.declarations[0].params[0]
526
+ expect(param.type.kind).toBe('option')
527
+ expect((param.type as any).inner).toMatchObject({ kind: 'named', name: 'int' })
528
+ })
529
+
530
+ test('function type (int) -> int', () => {
531
+ const prog = parse(`fn apply(f: (int) -> int, x: int): int { return f(x); }`)
532
+ const param = prog.declarations[0].params[0]
533
+ expect(param.type.kind).toBe('function_type')
534
+ })
535
+
536
+ test('array of arrays int[][]', () => {
537
+ const prog = parse(`fn f(m: int[][]): void { }`)
538
+ const param = prog.declarations[0].params[0]
539
+ expect(param.type.kind).toBe('array')
540
+ expect((param.type as any).elem.kind).toBe('array')
541
+ })
542
+ })
543
+
544
+ // ── Export fn declaration ──────────────────────────────────────────────────
545
+
546
+ describe('Parser — export fn', () => {
547
+ test('export fn sets isExported', () => {
548
+ const prog = parse(`export fn api_call(): int { return 0; }`)
549
+ expect(prog.declarations[0].isExported).toBe(true)
550
+ })
551
+ })
552
+
553
+ // ── Declare stub ──────────────────────────────────────────────────────────
554
+
555
+ describe('Parser — declare stub', () => {
556
+ test('declare fn with return type', () => {
557
+ const prog = parse(`declare fn sin(x: int): int;\nfn f(): int { return 0; }`)
558
+ // declare stubs are parsed and discarded; no crash
559
+ expect(prog.declarations.length).toBe(1)
560
+ })
561
+
562
+ test('declare fn with -> return type', () => {
563
+ const prog = parse(`declare fn cos(x: int) -> int;\nfn f(): int { return 0; }`)
564
+ expect(prog.declarations.length).toBe(1)
565
+ })
566
+ })
567
+
568
+ // ── Global let declaration ─────────────────────────────────────────────────
569
+
570
+ describe('Parser — global let', () => {
571
+ test('global mutable let', () => {
572
+ const prog = parse(`let COUNTER: int = 0;\nfn f(): int { return 0; }`)
573
+ expect(prog.globals.length).toBe(1)
574
+ expect(prog.globals[0].name).toBe('COUNTER')
575
+ })
576
+ })