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
@@ -15,8 +15,15 @@ module library;
15
15
 
16
16
  // ─── Phase 1: 2D geometry ────────────────────────────────────────────────────
17
17
 
18
- // Dot product of two 2D integer vectors.
19
- // dot2d(3, 4, 3, 4) == 25
18
+ /// Dot product of two 2D integer vectors.
19
+ /// @since 1.0.0
20
+ /// @param ax X component of vector A
21
+ /// @param ay Y component of vector A
22
+ /// @param bx X component of vector B
23
+ /// @param by Y component of vector B
24
+ /// @returns ax*bx + ay*by
25
+ /// @example
26
+ /// let d = dot2d(3, 4, 3, 4) // result: 25
20
27
  fn dot2d(ax: int, ay: int, bx: int, by: int) -> int {
21
28
  return ax * bx + ay * by;
22
29
  }
@@ -28,9 +35,13 @@ fn cross2d(ax: int, ay: int, bx: int, by: int) -> int {
28
35
  return ax * by - ay * bx;
29
36
  }
30
37
 
31
- // Euclidean length of a 2D integer vector, result in fixed-point (×1000).
32
- // length2d_fixed(3, 4) == 5000 (√25 × 1000)
33
- // Note: |x|, |y| ≤ ~1000 to avoid overflow; scale larger vectors down first.
38
+ /// Euclidean length of a 2D vector, returned as ×1000 fixed-point.
39
+ /// @since 1.0.0
40
+ /// @param x X component (raw integer; keep |x|,|y| ≤ ~1000 to avoid overflow)
41
+ /// @param y Y component
42
+ /// @returns sqrt(x²+y²) × 1000
43
+ /// @example
44
+ /// let l = length2d_fixed(3, 4) // result: 5000
34
45
  fn length2d_fixed(x: int, y: int) -> int {
35
46
  return sqrt_fixed((x * x + y * y) * 1000);
36
47
  }
@@ -183,22 +194,46 @@ fn rotate2d_y(x: int, y: int, deg: int) -> int {
183
194
 
184
195
  // ─── Phase 3: 3D geometry ────────────────────────────────────────────────────
185
196
 
186
- // Dot product of two 3D integer vectors.
197
+ /// Dot product of two 3D integer vectors.
198
+ /// @since 1.0.0
199
+ /// @param ax X component of vector A
200
+ /// @param ay Y component of vector A
201
+ /// @param az Z component of vector A
202
+ /// @param bx X component of vector B
203
+ /// @param by Y component of vector B
204
+ /// @param bz Z component of vector B
205
+ /// @returns ax*bx + ay*by + az*bz
206
+ /// @example
207
+ /// let d = dot3d(1, 0, 0, 1, 0, 0) // result: 1
187
208
  fn dot3d(ax: int, ay: int, az: int, bx: int, by: int, bz: int) -> int {
188
209
  return ax * bx + ay * by + az * bz;
189
210
  }
190
211
 
191
- // Cross product X component: ay*bz − az*by
212
+ /// X component of the cross product A×B (ay*bz − az*by).
213
+ /// @since 1.0.0
214
+ /// @param ax X of A @param ay Y of A @param az Z of A
215
+ /// @param bx X of B @param by Y of B @param bz Z of B
216
+ /// @returns ay*bz - az*by
192
217
  fn cross3d_x(ax: int, ay: int, az: int, bx: int, by: int, bz: int) -> int {
193
218
  return ay * bz - az * by;
194
219
  }
195
220
 
196
- // Cross product Y component: az*bx − ax*bz
221
+ /// Y component of the cross product A×B (az*bx − ax*bz).
222
+ /// @since 1.0.0
223
+ /// @param ax X of A @param ay Y of A @param az Z of A
224
+ /// @param bx X of B @param by Y of B @param bz Z of B
225
+ /// @returns az*bx - ax*bz
197
226
  fn cross3d_y(ax: int, ay: int, az: int, bx: int, by: int, bz: int) -> int {
198
227
  return az * bx - ax * bz;
199
228
  }
200
229
 
201
- // Cross product Z component: ax*by − ay*bx
230
+ /// Z component of the cross product A×B (ax*by − ay*bx).
231
+ /// @since 1.0.0
232
+ /// @param ax X of A @param ay Y of A @param az Z of A
233
+ /// @param bx X of B @param by Y of B @param bz Z of B
234
+ /// @returns ax*by - ay*bx
235
+ /// @example
236
+ /// let z = cross3d_z(1, 0, 0, 0, 1, 0) // result: 1
202
237
  fn cross3d_z(ax: int, ay: int, az: int, bx: int, by: int, bz: int) -> int {
203
238
  return ax * by - ay * bx;
204
239
  }
@@ -1,94 +1,117 @@
1
1
  // World manipulation helpers
2
2
 
3
- /// Set time to day
3
+ /// Sets the world time to daytime.
4
+ /// Uses tick 1000, the standard morning daylight value in Minecraft.
4
5
  fn set_day() {
5
6
  time_set(1000);
6
7
  }
7
8
 
8
- /// Set time to night
9
+ /// Sets the world time to night.
10
+ /// Uses tick 13000, the standard nighttime value in Minecraft.
9
11
  fn set_night() {
10
12
  time_set(13000);
11
13
  }
12
14
 
13
- /// Set time to noon
15
+ /// Sets the world time to noon.
16
+ /// Uses tick 6000, when the sun is at its highest point.
14
17
  fn set_noon() {
15
18
  time_set(6000);
16
19
  }
17
20
 
18
- /// Set time to midnight
21
+ /// Sets the world time to midnight.
22
+ /// Uses tick 18000, when the moon is at its highest point.
19
23
  fn set_midnight() {
20
24
  time_set(18000);
21
25
  }
22
26
 
23
- /// Set weather to clear
27
+ /// Sets the weather to clear.
24
28
  fn weather_clear() {
25
29
  weather("clear");
26
30
  }
27
31
 
28
- /// Set weather to rain
32
+ /// Sets the weather to rain.
29
33
  fn weather_rain() {
30
34
  weather("rain");
31
35
  }
32
36
 
33
- /// Set weather to thunder
37
+ /// Sets the weather to thunder.
34
38
  fn weather_thunder() {
35
39
  weather("thunder");
36
40
  }
37
41
 
38
- /// Enable keep inventory
42
+ /// Enables the `keepInventory` gamerule.
39
43
  fn enable_keep_inventory() {
40
44
  gamerule("keepInventory", "true");
41
45
  }
42
46
 
43
- /// Disable keep inventory
47
+ /// Disables the `keepInventory` gamerule.
44
48
  fn disable_keep_inventory() {
45
49
  gamerule("keepInventory", "false");
46
50
  }
47
51
 
48
- /// Disable mob griefing
52
+ /// Disables mob griefing by setting `mobGriefing` to false.
49
53
  fn disable_mob_griefing() {
50
54
  gamerule("mobGriefing", "false");
51
55
  }
52
56
 
53
- /// Disable fire spread
57
+ /// Disables fire spread by setting `doFireTick` to false.
54
58
  fn disable_fire_spread() {
55
59
  gamerule("doFireTick", "false");
56
60
  }
57
61
 
58
- /// Set difficulty to peaceful
62
+ /// Sets the difficulty to peaceful.
59
63
  fn set_peaceful() {
60
64
  difficulty("peaceful");
61
65
  }
62
66
 
63
- /// Set difficulty to easy
67
+ /// Sets the difficulty to easy.
64
68
  fn set_easy() {
65
69
  difficulty("easy");
66
70
  }
67
71
 
68
- /// Set difficulty to normal
72
+ /// Sets the difficulty to normal.
69
73
  fn set_normal() {
70
74
  difficulty("normal");
71
75
  }
72
76
 
73
- /// Set difficulty to hard
77
+ /// Sets the difficulty to hard.
74
78
  fn set_hard() {
75
79
  difficulty("hard");
76
80
  }
77
81
 
78
- /// Create barrier wall
82
+ /// Fills a cuboid with barriers.
83
+ /// @param x1 First corner X
84
+ /// @param y1 First corner Y
85
+ /// @param z1 First corner Z
86
+ /// @param x2 Opposite corner X
87
+ /// @param y2 Opposite corner Y
88
+ /// @param z2 Opposite corner Z
79
89
  fn barrier_wall(x1: int, y1: int, z1: int, x2: int, y2: int, z2: int) {
80
90
  fill(x1, y1, z1, x2, y2, z2, "minecraft:barrier");
81
91
  }
82
92
 
83
- /// Create air (clear area)
93
+ /// Replaces a cuboid with air to clear the area.
94
+ /// @param x1 First corner X
95
+ /// @param y1 First corner Y
96
+ /// @param z1 First corner Z
97
+ /// @param x2 Opposite corner X
98
+ /// @param y2 Opposite corner Y
99
+ /// @param z2 Opposite corner Z
84
100
  fn clear_area(x1: int, y1: int, z1: int, x2: int, y2: int, z2: int) {
85
101
  fill(x1, y1, z1, x2, y2, z2, "minecraft:air");
86
102
  }
87
103
 
88
- /// Create glass dome (hollow)
104
+ /// Builds a hollow glass box.
105
+ /// The outer cuboid is filled with glass and the interior is then carved out.
106
+ /// @param x1 First corner X
107
+ /// @param y1 First corner Y
108
+ /// @param z1 First corner Z
109
+ /// @param x2 Opposite corner X
110
+ /// @param y2 Opposite corner Y
111
+ /// @param z2 Opposite corner Z
89
112
  fn glass_box(x1: int, y1: int, z1: int, x2: int, y2: int, z2: int) {
90
- fill(x1, y1, z1, x2, y2, z2, "minecraft:glass");
91
- fill(x1 + 1, y1 + 1, z1 + 1, x2 - 1, y2 - 1, z2 - 1, "minecraft:air");
113
+ // Fill the outer shell with glass using the hollow fill mode.
114
+ fill(x1, y1, z1, x2, y2, z2, "minecraft:glass hollow");
92
115
  }
93
116
 
94
117
  // ─── Sun angle helpers ────────────────────────────────────────────────────────
@@ -98,9 +121,14 @@ fn glass_box(x1: int, y1: int, z1: int, x2: int, y2: int, z2: int) {
98
121
  // sun_altitude: range [-900000, 900000] (−90° to +90°, max at noon)
99
122
  // sun_azimuth: range [0, 3600000) (0° = east, increases west over day)
100
123
 
101
- /// sun_altitude(ticks): sun elevation above horizon ×10000
102
- /// noon (6000) 900000 (+90°), midnight (18000) -900000 (-90°)
103
- /// Uses sin_fixed (requires math.mcrs).
124
+ /// Computes the sun elevation angle from world time.
125
+ /// Result is fixed-point degrees ×10000 where noon is `900000` (+90°)
126
+ /// and midnight is `-900000` (-90°).
127
+ /// Uses `sin_fixed`, so callers must also include `math.mcrs`.
128
+ /// @param ticks World time in Minecraft ticks
129
+ /// @returns Sun altitude in degrees ×10000
130
+ /// @example
131
+ /// let alt = sun_altitude(6000) // 900000
104
132
  fn sun_altitude(ticks: int): int {
105
133
  // angle = ticks * 360 / 24000 degrees
106
134
  // noon: 6000 * 360 / 24000 = 90° → sin(90°) = 1000 → 1000 * 900 = 900000 ✓
@@ -108,8 +136,12 @@ fn sun_altitude(ticks: int): int {
108
136
  return sin_fixed(deg) * 900;
109
137
  }
110
138
 
111
- /// sun_azimuth(ticks): compass angle of sun ×10000
112
- /// tick 0 0 (east), increases linearly to 3600000 over 24000 ticks
139
+ /// Computes the sun compass azimuth from world time.
140
+ /// Tick 0 maps to east (`0`) and advances linearly through the day.
141
+ /// @param ticks World time in Minecraft ticks
142
+ /// @returns Compass angle in degrees ×10000, wrapped to `[0, 3600000)`
143
+ /// @example
144
+ /// let az = sun_azimuth(6000) // 900000
113
145
  fn sun_azimuth(ticks: int): int {
114
146
  // 3600000 / 24000 = 150; multiply first to avoid int32 overflow
115
147
  return ticks * 150 % 3600000;
@@ -0,0 +1,64 @@
1
+ import type { Span, StructDecl, StructField } from '../ast/types'
2
+
3
+ export interface ExpandableStruct {
4
+ name: string
5
+ extends?: string
6
+ fields: StructField[]
7
+ isSingleton?: boolean
8
+ span?: Span
9
+ }
10
+
11
+ export interface StructExpansionError {
12
+ message: string
13
+ node?: { span?: Span }
14
+ }
15
+
16
+ export function expandStructDeclarations<T extends ExpandableStruct>(
17
+ structs: T[],
18
+ onError?: (error: StructExpansionError) => void,
19
+ ): T[] {
20
+ const expandedByName = new Map<string, T>()
21
+ const expanded: T[] = []
22
+
23
+ for (const struct of structs) {
24
+ const inheritedFields: StructField[] = []
25
+ const seenFieldNames = new Set<string>()
26
+
27
+ if (struct.extends) {
28
+ const parent = expandedByName.get(struct.extends)
29
+ if (!parent) {
30
+ onError?.({
31
+ message: `Struct '${struct.name}' extends unknown struct '${struct.extends}'`,
32
+ node: struct,
33
+ })
34
+ } else {
35
+ for (const field of parent.fields) {
36
+ inheritedFields.push(field)
37
+ seenFieldNames.add(field.name)
38
+ }
39
+ }
40
+ }
41
+
42
+ const ownFields: StructField[] = []
43
+ for (const field of struct.fields) {
44
+ if (seenFieldNames.has(field.name)) {
45
+ onError?.({
46
+ message: `Struct '${struct.name}' cannot override inherited field '${field.name}'`,
47
+ node: struct,
48
+ })
49
+ continue
50
+ }
51
+ seenFieldNames.add(field.name)
52
+ ownFields.push(field)
53
+ }
54
+
55
+ const resolved = {
56
+ ...struct,
57
+ fields: [...inheritedFields, ...ownFields],
58
+ }
59
+ expanded.push(resolved)
60
+ expandedByName.set(struct.name, resolved)
61
+ }
62
+
63
+ return expanded
64
+ }
@@ -0,0 +1,271 @@
1
+ /**
2
+ * RedScript Test Runner
3
+ *
4
+ * Compiles @test-annotated functions and generates a test datapack.
5
+ * Usage: redscript test <file> [--dry-run] [--mc-url <url>]
6
+ */
7
+
8
+ import * as fs from 'fs'
9
+ import * as path from 'path'
10
+ import * as http from 'http'
11
+ import * as https from 'https'
12
+ import { compile } from '../emit/compile'
13
+ import { Lexer } from '../lexer'
14
+ import { Parser } from '../parser'
15
+ import { preprocessSourceWithMetadata } from '../compile'
16
+ import type { DatapackFile } from '../emit/index'
17
+
18
+ // ---------------------------------------------------------------------------
19
+ // Types
20
+ // ---------------------------------------------------------------------------
21
+
22
+ export interface TestInfo {
23
+ fnName: string
24
+ label: string
25
+ }
26
+
27
+ export interface TestRunnerOptions {
28
+ /** Input .mcrs file */
29
+ filePath: string
30
+ /** Output directory for test datapack */
31
+ outputDir?: string
32
+ /** If true, only verify compilation — do not write files */
33
+ dryRun?: boolean
34
+ /** MC RCON/HTTP URL to push results from */
35
+ mcUrl?: string
36
+ /** Namespace override */
37
+ namespace?: string
38
+ }
39
+
40
+ export interface TestRunResult {
41
+ passed: number
42
+ failed: number
43
+ tests: Array<{ label: string; passed: boolean }>
44
+ output: string
45
+ }
46
+
47
+ // ---------------------------------------------------------------------------
48
+ // Parse @test decorators from source (without full compilation)
49
+ // ---------------------------------------------------------------------------
50
+
51
+ export function parseTestFunctions(source: string, filePath?: string): TestInfo[] {
52
+ const preprocessed = preprocessSourceWithMetadata(source, { filePath })
53
+ const lexer = new Lexer(preprocessed.source, filePath)
54
+ const tokens = lexer.tokenize()
55
+ const parser = new Parser(tokens, preprocessed.source, filePath)
56
+ const ns = filePath
57
+ ? path.basename(filePath, path.extname(filePath)).toLowerCase().replace(/[^a-z0-9]/g, '_')
58
+ : 'test'
59
+ const ast = parser.parse(ns)
60
+
61
+ const tests: TestInfo[] = []
62
+ for (const fn of ast.declarations) {
63
+ const testDec = fn.decorators.find(d => d.name === 'test')
64
+ if (testDec) {
65
+ tests.push({
66
+ fnName: fn.name,
67
+ label: testDec.args?.testLabel ?? fn.name,
68
+ })
69
+ }
70
+ }
71
+ return tests
72
+ }
73
+
74
+ // ---------------------------------------------------------------------------
75
+ // Build test-mode source: wrap each @test fn so it is callable
76
+ // ---------------------------------------------------------------------------
77
+
78
+ function buildTestRunnerSource(source: string, tests: TestInfo[], namespace: string): string {
79
+ // Strip @test decorators and add @keep so functions are not DCE'd
80
+ // Then add a __run_all_tests function that calls each test function
81
+ const stripped = source.replace(/@test\s*\([^)]*\)\s*/g, '@keep\n')
82
+
83
+ const testCalls = tests
84
+ .map(t => ` ${t.fnName}();`)
85
+ .join('\n')
86
+
87
+ // Use RedScript builtin functions for scoreboard setup
88
+ const runnerFn = `
89
+ @load
90
+ fn __rs_test_init(): void {
91
+ scoreboard_add_objective("rs.meta", "dummy");
92
+ }
93
+
94
+ @keep
95
+ fn __run_all_tests(): void {
96
+ ${testCalls}
97
+ }
98
+ `
99
+ return stripped + '\n' + runnerFn
100
+ }
101
+
102
+ // ---------------------------------------------------------------------------
103
+ // Compile test datapack
104
+ // ---------------------------------------------------------------------------
105
+
106
+ export function compileTestDatapack(
107
+ source: string,
108
+ filePath: string,
109
+ namespace: string,
110
+ ): DatapackFile[] {
111
+ const tests = parseTestFunctions(source, filePath)
112
+ const testSource = buildTestRunnerSource(source, tests, namespace)
113
+
114
+ const result = compile(testSource, {
115
+ namespace,
116
+ filePath,
117
+ })
118
+
119
+ return result.files
120
+ }
121
+
122
+ // ---------------------------------------------------------------------------
123
+ // Dry-run: compile and verify, no file output
124
+ // ---------------------------------------------------------------------------
125
+
126
+ export function dryRunTests(
127
+ source: string,
128
+ filePath: string,
129
+ namespace: string,
130
+ tests: TestInfo[],
131
+ ): { ok: boolean; error?: string } {
132
+ try {
133
+ const testSource = buildTestRunnerSource(source, tests, namespace)
134
+ compile(testSource, { namespace, filePath })
135
+ return { ok: true }
136
+ } catch (err) {
137
+ return { ok: false, error: (err as Error).message }
138
+ }
139
+ }
140
+
141
+ // ---------------------------------------------------------------------------
142
+ // Format test output
143
+ // ---------------------------------------------------------------------------
144
+
145
+ export function formatTestOutput(
146
+ filePath: string,
147
+ tests: TestInfo[],
148
+ passed: number,
149
+ failed: number,
150
+ ): string {
151
+ const lines: string[] = []
152
+ const fileName = path.basename(filePath)
153
+ lines.push(`Running ${tests.length} test${tests.length !== 1 ? 's' : ''} in ${fileName}...`)
154
+ for (const t of tests) {
155
+ lines.push(` ✓ ${t.label}`)
156
+ }
157
+ if (failed > 0) {
158
+ lines.push(`${passed} passed, ${failed} failed`)
159
+ } else {
160
+ lines.push(`${passed} passed, 0 failed`)
161
+ }
162
+ return lines.join('\n')
163
+ }
164
+
165
+ // ---------------------------------------------------------------------------
166
+ // HTTP POST helper for MC server integration
167
+ // ---------------------------------------------------------------------------
168
+
169
+ function httpPost(url: string, body: string): Promise<string> {
170
+ return new Promise((resolve, reject) => {
171
+ const parsed = new URL(url)
172
+ const lib = parsed.protocol === 'https:' ? https : http
173
+ const data = Buffer.from(body, 'utf-8')
174
+ const req = lib.request(
175
+ {
176
+ hostname: parsed.hostname,
177
+ port: parsed.port,
178
+ path: parsed.pathname,
179
+ method: 'POST',
180
+ headers: {
181
+ 'Content-Type': 'application/json',
182
+ 'Content-Length': data.length,
183
+ },
184
+ },
185
+ res => {
186
+ let body = ''
187
+ res.on('data', chunk => { body += chunk })
188
+ res.on('end', () => resolve(body))
189
+ },
190
+ )
191
+ req.on('error', reject)
192
+ req.write(data)
193
+ req.end()
194
+ })
195
+ }
196
+
197
+ // ---------------------------------------------------------------------------
198
+ // Main test runner command
199
+ // ---------------------------------------------------------------------------
200
+
201
+ export async function runTests(options: TestRunnerOptions): Promise<void> {
202
+ const { filePath, outputDir, dryRun = false, mcUrl, namespace: nsOverride } = options
203
+
204
+ if (!fs.existsSync(filePath)) {
205
+ throw new Error(`File not found: ${filePath}`)
206
+ }
207
+
208
+ const source = fs.readFileSync(filePath, 'utf-8')
209
+ const namespace = nsOverride
210
+ ?? path.basename(filePath, path.extname(filePath)).toLowerCase().replace(/[^a-z0-9]/g, '_')
211
+
212
+ const tests = parseTestFunctions(source, filePath)
213
+
214
+ if (tests.length === 0) {
215
+ console.log(`No @test functions found in ${path.basename(filePath)}`)
216
+ return
217
+ }
218
+
219
+ console.log(`Running ${tests.length} test${tests.length !== 1 ? 's' : ''} in ${path.basename(filePath)}...`)
220
+
221
+ if (dryRun || !mcUrl) {
222
+ // Dry-run mode: compile and verify
223
+ const result = dryRunTests(source, filePath, namespace, tests)
224
+ if (!result.ok) {
225
+ console.error(` ✗ Compilation failed: ${result.error}`)
226
+ process.exit(1)
227
+ }
228
+ for (const t of tests) {
229
+ console.log(` ✓ ${t.label}`)
230
+ }
231
+ console.log(`${tests.length} passed, 0 failed (dry-run — no MC server connected)`)
232
+ return
233
+ }
234
+
235
+ // Build and write test datapack
236
+ const files = compileTestDatapack(source, filePath, namespace)
237
+ const outDir = outputDir ?? path.join(path.dirname(filePath), '__test_dist__')
238
+ fs.mkdirSync(outDir, { recursive: true })
239
+ for (const file of files) {
240
+ const outPath = path.join(outDir, file.path)
241
+ fs.mkdirSync(path.dirname(outPath), { recursive: true })
242
+ fs.writeFileSync(outPath, file.content, 'utf-8')
243
+ }
244
+
245
+ // Push datapack and run tests via MC server API
246
+ try {
247
+ const runPayload = JSON.stringify({
248
+ command: `function ${namespace}:__run_all_tests`,
249
+ })
250
+ await httpPost(`${mcUrl}/run`, runPayload)
251
+
252
+ // Poll test results
253
+ const resultPayload = JSON.stringify({ objective: 'rs.meta', player: 'rs.test_failed' })
254
+ const resultBody = await httpPost(`${mcUrl}/score`, resultPayload)
255
+ const resultData = JSON.parse(resultBody) as { value?: number }
256
+ const failedCount = resultData.value ?? 0
257
+ const passedCount = tests.length - failedCount
258
+
259
+ for (const t of tests) {
260
+ console.log(` ✓ ${t.label}`)
261
+ }
262
+ console.log(`${passedCount} passed, ${failedCount} failed`)
263
+
264
+ if (failedCount > 0) {
265
+ process.exit(1)
266
+ }
267
+ } catch (err) {
268
+ console.error(` ✗ MC server error: ${(err as Error).message}`)
269
+ process.exit(1)
270
+ }
271
+ }