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,285 @@
1
+ /**
2
+ * Tests for the @singleton decorator — global state singleton structs.
3
+ *
4
+ * Covers:
5
+ * 1. Parser: @singleton recognized before struct
6
+ * 2. AST: isSingleton flag set on StructDecl
7
+ * 3. HIR: isSingleton propagated to HIRStruct
8
+ * 4. TypeChecker: synthetic get/set methods registered; no type errors
9
+ * 5. Emit (end-to-end): load.mcfunction includes objective adds, get/set .mcfunction files generated
10
+ */
11
+
12
+ import { Lexer } from '../lexer'
13
+ import { Parser } from '../parser'
14
+ import { compile } from '../emit/compile'
15
+ import { TypeChecker } from '../typechecker'
16
+ import { lowerToHIR } from '../hir/lower'
17
+
18
+ // ---------------------------------------------------------------------------
19
+ // Helpers
20
+ // ---------------------------------------------------------------------------
21
+
22
+ function parse(source: string) {
23
+ const tokens = new Lexer(source).tokenize()
24
+ return new Parser(tokens, source).parse()
25
+ }
26
+
27
+ function typeCheck(source: string) {
28
+ const program = parse(source)
29
+ const checker = new TypeChecker(source)
30
+ return checker.check(program)
31
+ }
32
+
33
+ function compileAndGetFiles(source: string, namespace = 'test') {
34
+ const result = compile(source, { namespace })
35
+ expect(result.success).toBe(true)
36
+ return result.files
37
+ }
38
+
39
+ function getFile(files: { path: string; content: string }[], pathSubstr: string): string | undefined {
40
+ return files.find(f => f.path.includes(pathSubstr))?.content
41
+ }
42
+
43
+ // ---------------------------------------------------------------------------
44
+ // Test 1: Parser recognizes @singleton before struct
45
+ // ---------------------------------------------------------------------------
46
+
47
+ describe('@singleton: parser', () => {
48
+ test('parses @singleton struct with isSingleton=true', () => {
49
+ const program = parse(`
50
+ @singleton
51
+ struct GameState {
52
+ phase: int,
53
+ tick_count: int,
54
+ }
55
+ `)
56
+ expect(program.structs).toHaveLength(1)
57
+ expect(program.structs[0].name).toBe('GameState')
58
+ expect(program.structs[0].isSingleton).toBe(true)
59
+ expect(program.structs[0].fields).toHaveLength(2)
60
+ })
61
+
62
+ test('plain struct without @singleton has isSingleton=undefined', () => {
63
+ const program = parse(`
64
+ struct Vec2 { x: int, y: int }
65
+ `)
66
+ expect(program.structs[0].isSingleton).toBeUndefined()
67
+ })
68
+
69
+ test('@singleton struct fields are correctly parsed', () => {
70
+ const program = parse(`
71
+ @singleton
72
+ struct Config {
73
+ difficulty: int,
74
+ player_count: int,
75
+ game_running: int,
76
+ }
77
+ `)
78
+ const s = program.structs[0]
79
+ expect(s.isSingleton).toBe(true)
80
+ expect(s.fields.map(f => f.name)).toEqual(['difficulty', 'player_count', 'game_running'])
81
+ expect(s.fields.every(f => f.type.kind === 'named' && f.type.name === 'int')).toBe(true)
82
+ })
83
+ })
84
+
85
+ // ---------------------------------------------------------------------------
86
+ // Test 2: HIR lowering propagates isSingleton
87
+ // ---------------------------------------------------------------------------
88
+
89
+ describe('@singleton: HIR lowering', () => {
90
+ test('lowerToHIR preserves isSingleton flag', () => {
91
+ const program = parse(`
92
+ @singleton
93
+ struct Counter { value: int }
94
+ `)
95
+ const hir = lowerToHIR(program)
96
+ expect(hir.structs).toHaveLength(1)
97
+ expect(hir.structs[0].name).toBe('Counter')
98
+ expect(hir.structs[0].isSingleton).toBe(true)
99
+ })
100
+
101
+ test('plain struct isSingleton stays undefined in HIR', () => {
102
+ const program = parse(`
103
+ struct Plain { x: int }
104
+ `)
105
+ const hir = lowerToHIR(program)
106
+ expect(hir.structs[0].isSingleton).toBeUndefined()
107
+ })
108
+ })
109
+
110
+ // ---------------------------------------------------------------------------
111
+ // Test 3: TypeChecker — no errors for GameState::get() / GameState::set(gs)
112
+ // ---------------------------------------------------------------------------
113
+
114
+ describe('@singleton: typechecker', () => {
115
+ test('GameState::get() and GameState::set(gs) pass type-checking', () => {
116
+ const errors = typeCheck(`
117
+ @singleton
118
+ struct GameState {
119
+ phase: int,
120
+ tick_count: int,
121
+ }
122
+ @keep fn update(): void {
123
+ let gs = GameState::get()
124
+ GameState::set(gs)
125
+ }
126
+ `)
127
+ expect(errors).toHaveLength(0)
128
+ })
129
+
130
+ test('calling unknown method on singleton struct is a type error', () => {
131
+ const errors = typeCheck(`
132
+ @singleton
133
+ struct Counter { value: int }
134
+ @keep fn test(): void {
135
+ Counter::reset()
136
+ }
137
+ `)
138
+ expect(errors.length).toBeGreaterThan(0)
139
+ })
140
+ })
141
+
142
+ // ---------------------------------------------------------------------------
143
+ // Test 4: End-to-end — load.mcfunction has scoreboard objectives
144
+ // ---------------------------------------------------------------------------
145
+
146
+ describe('@singleton: emit — load.mcfunction', () => {
147
+ test('load.mcfunction includes scoreboard objective add for each field', () => {
148
+ const files = compileAndGetFiles(`
149
+ @singleton
150
+ struct GameState {
151
+ phase: int,
152
+ tick_count: int,
153
+ player_count: int,
154
+ }
155
+ @keep fn dummy(): void {}
156
+ `)
157
+ const load = getFile(files, 'load.mcfunction') ?? ''
158
+ expect(load).toContain('scoreboard objectives add')
159
+ // Each field gets its own objective (truncated to ≤16 chars: _s_<4ofStruct>_<field>)
160
+ // GameState → prefix "_s_Game_" (8 chars), then field name up to 8 chars
161
+ expect(load).toContain('_s_Game_phase')
162
+ expect(load).toContain('_s_Game_tick_cou')
163
+ expect(load).toContain('_s_Game_player_c')
164
+ })
165
+ })
166
+
167
+ // ---------------------------------------------------------------------------
168
+ // Test 5: End-to-end — GameState::get mcfunction reads from scoreboard
169
+ // ---------------------------------------------------------------------------
170
+
171
+ describe('@singleton: emit — get/set functions', () => {
172
+ test('GameState/get.mcfunction is generated', () => {
173
+ const files = compileAndGetFiles(`
174
+ @singleton
175
+ struct GameState {
176
+ phase: int,
177
+ tick_count: int,
178
+ }
179
+ @keep fn dummy(): void {}
180
+ `)
181
+ const getPaths = files.filter(f => f.path.includes('gamestate/get'))
182
+ expect(getPaths.length).toBeGreaterThan(0)
183
+ })
184
+
185
+ test('GameState/set.mcfunction is generated', () => {
186
+ const files = compileAndGetFiles(`
187
+ @singleton
188
+ struct GameState {
189
+ phase: int,
190
+ tick_count: int,
191
+ }
192
+ @keep fn dummy(): void {}
193
+ `)
194
+ const setPaths = files.filter(f => f.path.includes('gamestate/set'))
195
+ expect(setPaths.length).toBeGreaterThan(0)
196
+ })
197
+
198
+ test('GameState/get reads fields from their scoreboard objectives', () => {
199
+ const files = compileAndGetFiles(`
200
+ @singleton
201
+ struct GameState {
202
+ phase: int,
203
+ }
204
+ @keep fn dummy(): void {}
205
+ `)
206
+ const getContent = getFile(files, 'gamestate/get') ?? ''
207
+ // Should copy from __sng in the field objective to $__rf_phase
208
+ // (objective name is truncated: _s_Game_phase for GameState/phase)
209
+ expect(getContent).toContain('_s_Game_phase')
210
+ expect(getContent).toContain('__sng')
211
+ })
212
+
213
+ test('GameState/set writes fields to their scoreboard objectives', () => {
214
+ const files = compileAndGetFiles(`
215
+ @singleton
216
+ struct GameState {
217
+ phase: int,
218
+ }
219
+ @keep fn dummy(): void {}
220
+ `)
221
+ const setContent = getFile(files, 'gamestate/set') ?? ''
222
+ // Should copy from $p0 to __sng in the field objective
223
+ expect(setContent).toContain('_s_Game_phase')
224
+ })
225
+
226
+ test('full update_state pattern compiles without errors', () => {
227
+ expect(() => compile(`
228
+ @singleton
229
+ struct GameState {
230
+ phase: int,
231
+ tick_count: int,
232
+ player_count: int,
233
+ }
234
+ @keep fn update_state(): void {
235
+ let gs = GameState::get()
236
+ gs.phase = 1
237
+ gs.tick_count = gs.tick_count + 1
238
+ GameState::set(gs)
239
+ }
240
+ `, { namespace: 'test' })).not.toThrow()
241
+ })
242
+ })
243
+
244
+ // ---------------------------------------------------------------------------
245
+ // Test 6: Multiple singletons coexist
246
+ // ---------------------------------------------------------------------------
247
+
248
+ describe('@singleton: multiple singletons', () => {
249
+ test('two singleton structs both get objectives in load.mcfunction', () => {
250
+ const files = compileAndGetFiles(`
251
+ @singleton
252
+ struct GameState { phase: int }
253
+ @singleton
254
+ struct Config { difficulty: int }
255
+ @keep fn dummy(): void {}
256
+ `)
257
+ const load = getFile(files, 'load.mcfunction') ?? ''
258
+ // GameState → _s_Game_phase, Config → _s_Conf_difficul (both truncated to ≤16 chars)
259
+ expect(load).toContain('_s_Game_phase')
260
+ expect(load).toContain('_s_Conf_difficul')
261
+ })
262
+ })
263
+
264
+ // ---------------------------------------------------------------------------
265
+ // Test 7: Singleton with non-singleton struct — no interference
266
+ // ---------------------------------------------------------------------------
267
+
268
+ describe('@singleton: no interference with plain structs', () => {
269
+ test('plain struct is not treated as singleton', () => {
270
+ const files = compileAndGetFiles(`
271
+ struct Vec2 { x: int, y: int }
272
+ @singleton
273
+ struct Counter { value: int }
274
+ @keep fn dummy(): void {}
275
+ `)
276
+ const load = getFile(files, 'load.mcfunction') ?? ''
277
+ // Counter fields get objectives (_s_Counter_value is exactly 16 chars, fits)
278
+ expect(load).toContain('_s_Counter_value')
279
+ // Vec2 fields do NOT
280
+ expect(load).not.toContain('Vec2')
281
+ // No get/set for Vec2
282
+ const vec2GetPath = files.filter(f => f.path.includes('vec2/get'))
283
+ expect(vec2GetPath).toHaveLength(0)
284
+ })
285
+ })
@@ -242,7 +242,7 @@ describe('source map — file path convention', () => {
242
242
  generateSourceMap: true,
243
243
  filePath: 'src/test.mcrs',
244
244
  })
245
- const smFiles = result.files.filter(f => f.path.endsWith('.sourcemap.json'))
245
+ const smFiles = result.files.filter(f => f.path.startsWith('data/') && f.path.endsWith('.sourcemap.json'))
246
246
  expect(smFiles.length).toBeGreaterThan(0)
247
247
  for (const sf of smFiles) {
248
248
  expect(sf.path).toMatch(/\.sourcemap\.json$/)
@@ -0,0 +1,312 @@
1
+ /**
2
+ * Tests for stdlib/advanced.mcrs.
3
+ * Verifies compilation succeeds and all key functions are emitted.
4
+ */
5
+
6
+ import { compile } from '../../emit/compile'
7
+ import * as fs from 'fs'
8
+ import * as path from 'path'
9
+
10
+ const ADVANCED_STDLIB = path.join(__dirname, '../../stdlib/advanced.mcrs')
11
+ const advancedSrc = fs.readFileSync(ADVANCED_STDLIB, 'utf-8')
12
+
13
+ function compileWith(extra: string): { path: string; content: string }[] {
14
+ const result = compile(advancedSrc + '\n' + extra, { namespace: 'test' })
15
+ if (!result.success) {
16
+ const errors = (result as any).errors ?? []
17
+ throw new Error(`Compilation failed:\n${errors.map((e: any) => e.message ?? e).join('\n')}`)
18
+ }
19
+ return result.files ?? []
20
+ }
21
+
22
+ function hasFn(files: { path: string; content: string }[], fnName: string): boolean {
23
+ // Match exact name or any sub-files (e.g. fn__then_0, fn__loop_body_1, fn__const_0_0)
24
+ return files.some(f => {
25
+ const base = f.path.split('/').pop()!
26
+ return base === `${fnName}.mcfunction` || base.startsWith(`${fnName}__`)
27
+ })
28
+ }
29
+
30
+ function getFn(files: { path: string; content: string }[], fnName: string): string {
31
+ // Match exact name or specialized variants (e.g. fn__const_0_0)
32
+ const f = files.find(f => f.path.endsWith(`/${fnName}.mcfunction`))
33
+ ?? files.find(f => {
34
+ const base = f.path.split('/').pop()!
35
+ return base.startsWith(`${fnName}__`)
36
+ })
37
+ if (!f) {
38
+ const paths = files.map(f => f.path).join('\n')
39
+ throw new Error(`Function '${fnName}' not found. Files:\n${paths}`)
40
+ }
41
+ return f.content
42
+ }
43
+
44
+ // ── Compilation ──────────────────────────────────────────────────────────────
45
+
46
+ describe('stdlib/advanced.mcrs: compilation', () => {
47
+ test('compiles the full stdlib file without errors', () => {
48
+ const result = compile(advancedSrc, { namespace: 'test' })
49
+ expect(result.success).toBe(true)
50
+ // library module: no files unless something is referenced
51
+ })
52
+ })
53
+
54
+ // ── Number Theory ─────────────────────────────────────────────────────────────
55
+
56
+ describe('stdlib/advanced.mcrs: number theory', () => {
57
+ test('fib is emitted', () => {
58
+ const files = compileWith(`@keep fn t(): int { return fib(10); }`)
59
+ expect(hasFn(files, 'fib')).toBe(true)
60
+ })
61
+
62
+ test('is_prime is emitted', () => {
63
+ const files = compileWith(`@keep fn t(): int { return is_prime(7); }`)
64
+ expect(hasFn(files, 'is_prime')).toBe(true)
65
+ })
66
+
67
+ test('collatz_steps is emitted', () => {
68
+ const files = compileWith(`@keep fn t(): int { return collatz_steps(6); }`)
69
+ expect(hasFn(files, 'collatz_steps')).toBe(true)
70
+ })
71
+
72
+ test('digit_sum is emitted', () => {
73
+ const files = compileWith(`@keep fn t(): int { return digit_sum(123); }`)
74
+ expect(hasFn(files, 'digit_sum')).toBe(true)
75
+ })
76
+
77
+ test('count_digits is emitted', () => {
78
+ const files = compileWith(`@keep fn t(): int { return count_digits(1000); }`)
79
+ expect(hasFn(files, 'count_digits')).toBe(true)
80
+ })
81
+
82
+ test('reverse_int is emitted', () => {
83
+ const files = compileWith(`@keep fn t(): int { return reverse_int(123); }`)
84
+ expect(hasFn(files, 'reverse_int')).toBe(true)
85
+ })
86
+
87
+ test('mod_pow is emitted', () => {
88
+ const files = compileWith(`@keep fn t(): int { return mod_pow(2, 10, 1000); }`)
89
+ expect(hasFn(files, 'mod_pow')).toBe(true)
90
+ })
91
+
92
+ test('digital_root is emitted', () => {
93
+ const files = compileWith(`@keep fn t(): int { return digital_root(493); }`)
94
+ expect(hasFn(files, 'digital_root')).toBe(true)
95
+ })
96
+
97
+ test('spiral_ring is emitted', () => {
98
+ const files = compileWith(`@keep fn t(): int { return spiral_ring(9); }`)
99
+ expect(hasFn(files, 'spiral_ring')).toBe(true)
100
+ })
101
+ })
102
+
103
+ // ── Hashing / Noise ───────────────────────────────────────────────────────────
104
+
105
+ describe('stdlib/advanced.mcrs: hashing and noise', () => {
106
+ test('hash_int is emitted', () => {
107
+ const files = compileWith(`@keep fn t(): int { return hash_int(42); }`)
108
+ expect(hasFn(files, 'hash_int')).toBe(true)
109
+ })
110
+
111
+ test('noise1d is emitted', () => {
112
+ const files = compileWith(`@keep fn t(): int { return noise1d(500); }`)
113
+ expect(hasFn(files, 'noise1d')).toBe(true)
114
+ })
115
+
116
+ test('noise1d body references hash_int', () => {
117
+ const files = compileWith(`@keep fn t(): int { return noise1d(500); }`)
118
+ // noise1d should call hash_int internally
119
+ expect(hasFn(files, 'hash_int')).toBe(true)
120
+ })
121
+ })
122
+
123
+ // ── Curves / Bezier ───────────────────────────────────────────────────────────
124
+
125
+ describe('stdlib/advanced.mcrs: bezier curves', () => {
126
+ test('bezier_quad is emitted', () => {
127
+ const files = compileWith(`@keep fn t(): int { return bezier_quad(0, 500, 1000, 500); }`)
128
+ expect(hasFn(files, 'bezier_quad')).toBe(true)
129
+ })
130
+
131
+ test('bezier_cubic is emitted', () => {
132
+ const files = compileWith(`@keep fn t(): int { return bezier_cubic(0, 0, 1000, 1000, 500); }`)
133
+ expect(hasFn(files, 'bezier_cubic')).toBe(true)
134
+ })
135
+
136
+ test('bezier_quartic is emitted', () => {
137
+ const files = compileWith(`@keep fn t(): int { return bezier_quartic(0, 0, 500, 1000, 1000, 500); }`)
138
+ expect(hasFn(files, 'bezier_quartic')).toBe(true)
139
+ })
140
+
141
+ test('bezier_n is emitted with array input', () => {
142
+ const files = compileWith(`
143
+ @keep fn t(): int {
144
+ let pts: int[] = [0, 500, 1000];
145
+ return bezier_n(pts, 3, 500);
146
+ }
147
+ `)
148
+ expect(hasFn(files, 'bezier_n')).toBe(true)
149
+ })
150
+ })
151
+
152
+ // ── Fractals ──────────────────────────────────────────────────────────────────
153
+
154
+ describe('stdlib/advanced.mcrs: fractals', () => {
155
+ test('mandelbrot_iter is emitted', () => {
156
+ const files = compileWith(`@keep fn t(): int { return mandelbrot_iter(0, 0, 20); }`)
157
+ expect(hasFn(files, 'mandelbrot_iter')).toBe(true)
158
+ })
159
+
160
+ test('julia_iter is emitted', () => {
161
+ const files = compileWith(`@keep fn t(): int { return julia_iter(0, 0, -300, 0, 20); }`)
162
+ expect(hasFn(files, 'julia_iter')).toBe(true)
163
+ })
164
+ })
165
+
166
+ // ── Geometry helpers ──────────────────────────────────────────────────────────
167
+
168
+ describe('stdlib/advanced.mcrs: geometry helpers', () => {
169
+ test('angle_between is emitted', () => {
170
+ const files = compileWith(`@keep fn t(): int { return angle_between(1000, 0, 0, 1000); }`)
171
+ expect(hasFn(files, 'angle_between')).toBe(true)
172
+ })
173
+
174
+ test('clamp_circle_x is emitted', () => {
175
+ const files = compileWith(`@keep fn t(): int { return clamp_circle_x(500, 500, 1); }`)
176
+ expect(hasFn(files, 'clamp_circle_x')).toBe(true)
177
+ })
178
+
179
+ test('clamp_circle_y is emitted', () => {
180
+ const files = compileWith(`@keep fn t(): int { return clamp_circle_y(500, 500, 1); }`)
181
+ expect(hasFn(files, 'clamp_circle_y')).toBe(true)
182
+ })
183
+
184
+ test('newton_sqrt is emitted', () => {
185
+ const files = compileWith(`@keep fn t(): int { return newton_sqrt(100); }`)
186
+ expect(hasFn(files, 'newton_sqrt')).toBe(true)
187
+ })
188
+ })
189
+
190
+ // ── Statistics ────────────────────────────────────────────────────────────────
191
+
192
+ describe('stdlib/advanced.mcrs: statistics', () => {
193
+ test('mean_fx is emitted', () => {
194
+ const files = compileWith(`
195
+ @keep fn t(): int {
196
+ let a: int[] = [1, 2, 3, 4, 5];
197
+ return mean_fx(a, 5);
198
+ }
199
+ `)
200
+ expect(hasFn(files, 'mean_fx')).toBe(true)
201
+ })
202
+
203
+ test('median is emitted', () => {
204
+ const files = compileWith(`
205
+ @keep fn t(): int {
206
+ let a: int[] = [3, 1, 2];
207
+ let w: int[] = [0, 0, 0];
208
+ return median(a, w, 3);
209
+ }
210
+ `)
211
+ expect(hasFn(files, 'median')).toBe(true)
212
+ })
213
+
214
+ test('median emits comparison/branch commands (sorting logic)', () => {
215
+ const files = compileWith(`
216
+ @keep fn t(): int {
217
+ let a: int[] = [3, 1, 2];
218
+ let w: int[] = [0, 0, 0];
219
+ return median(a, w, 3);
220
+ }
221
+ `)
222
+ // median depends on sorting — median fn itself must be emitted
223
+ expect(hasFn(files, 'median')).toBe(true)
224
+ // and bigint_copy should be pulled in for the work-array copy
225
+ const allPaths = files.map(f => f.path).join('\n')
226
+ expect(allPaths).toContain('median')
227
+ })
228
+
229
+ test('mode is emitted', () => {
230
+ const files = compileWith(`
231
+ @keep fn t(): int {
232
+ let a: int[] = [1, 2, 2, 3];
233
+ let w: int[] = [0, 0, 0, 0];
234
+ return mode(a, w, 4);
235
+ }
236
+ `)
237
+ expect(hasFn(files, 'mode')).toBe(true)
238
+ })
239
+
240
+ test('std_dev_fx is emitted', () => {
241
+ const files = compileWith(`
242
+ @keep fn t(): int {
243
+ let a: int[] = [2, 4, 4, 4, 5, 5, 7, 9];
244
+ return std_dev_fx(a, 8);
245
+ }
246
+ `)
247
+ expect(hasFn(files, 'std_dev_fx')).toBe(true)
248
+ })
249
+
250
+ test('std_dev_fx body uses newton_sqrt for the square root step', () => {
251
+ const files = compileWith(`
252
+ @keep fn t(): int {
253
+ let a: int[] = [2, 4, 4, 4, 5, 5, 7, 9];
254
+ return std_dev_fx(a, 8);
255
+ }
256
+ `)
257
+ expect(hasFn(files, 'newton_sqrt')).toBe(true)
258
+ })
259
+ })
260
+
261
+ // ── Interpolation ─────────────────────────────────────────────────────────────
262
+
263
+ describe('stdlib/advanced.mcrs: interpolation', () => {
264
+ test('hermite_spline is emitted', () => {
265
+ const files = compileWith(`
266
+ @keep fn t(): int {
267
+ return hermite_spline(0, 1000, 0, 0, 500);
268
+ }
269
+ `)
270
+ expect(hasFn(files, 'hermite_spline')).toBe(true)
271
+ })
272
+
273
+ test('hermite_spline at t=0 evaluates to p0 region', () => {
274
+ const files = compileWith(`
275
+ @keep fn t(): int {
276
+ return hermite_spline(0, 1000, 0, 0, 0);
277
+ }
278
+ `)
279
+ // Entry point may be inlined (constant args → specialised function); check any content emitted
280
+ const allContent = files.map(f => f.content).join('\n')
281
+ expect(allContent.length).toBeGreaterThan(0)
282
+ })
283
+
284
+ test('hermite_spline at t=1000 evaluates to p1 region', () => {
285
+ const files = compileWith(`
286
+ @keep fn t(): int {
287
+ return hermite_spline(0, 1000, 0, 0, 1000);
288
+ }
289
+ `)
290
+ // Entry point may be inlined; check any content emitted
291
+ const allContent = files.map(f => f.content).join('\n')
292
+ expect(allContent.length).toBeGreaterThan(0)
293
+ })
294
+
295
+ test('catmull_rom is emitted', () => {
296
+ const files = compileWith(`
297
+ @keep fn t(): int {
298
+ return catmull_rom(0, 100, 200, 300, 500);
299
+ }
300
+ `)
301
+ expect(hasFn(files, 'catmull_rom')).toBe(true)
302
+ })
303
+
304
+ test('catmull_rom internally calls hermite_spline', () => {
305
+ const files = compileWith(`
306
+ @keep fn t(): int {
307
+ return catmull_rom(0, 100, 200, 300, 500);
308
+ }
309
+ `)
310
+ expect(hasFn(files, 'hermite_spline')).toBe(true)
311
+ })
312
+ })
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Tests for stdlib/bigint.mcrs — multi-precision integer arithmetic.
3
+ */
4
+
5
+ import { compile } from '../../emit/compile'
6
+ import * as fs from 'fs'
7
+ import * as path from 'path'
8
+
9
+ const SRC = fs.readFileSync(path.join(__dirname, '../../stdlib/bigint.mcrs'), 'utf-8')
10
+
11
+ function compileWith(extra: string) {
12
+ return compile(SRC + '\n' + extra, { namespace: 'test' })
13
+ }
14
+
15
+ describe('stdlib/bigint.mcrs', () => {
16
+ test('compiles without errors', () => {
17
+ const r = compileWith('')
18
+ expect(r.files.length).toBeGreaterThan(0)
19
+ })
20
+
21
+ test('bigint_base is emitted or constant-folded', () => {
22
+ // bigint_base() returns 10000 — compiler may constant-fold it instead of emitting a function
23
+ const r = compileWith(`@keep fn t(): int { return bigint_base(); }`)
24
+ // Either a dedicated function file is emitted, or the value 10000 appears inlined
25
+ const emittedFile = r.files.some(f => f.path.includes('bigint_base'))
26
+ const inlined = r.files.some(f => f.content.includes('10000'))
27
+ expect(emittedFile || inlined).toBe(true)
28
+ })
29
+
30
+ test('bigint3_add_lo is emitted', () => {
31
+ const r = compileWith(`@keep fn t(): int { return bigint3_add_lo(7000, 5000); }`)
32
+ expect(r.files.some(f => f.path.includes('bigint3_add_lo'))).toBe(true)
33
+ })
34
+
35
+ test('bigint3_cmp is emitted', () => {
36
+ const r = compileWith(`@keep fn t(): int { return bigint3_cmp(0, 0, 1, 0, 0, 2); }`)
37
+ expect(r.files.some(f => f.path.includes('bigint3_cmp'))).toBe(true)
38
+ })
39
+
40
+ test('int32_to_bigint3_lo is emitted', () => {
41
+ const r = compileWith(`@keep fn t(): int { return int32_to_bigint3_lo(123456789); }`)
42
+ expect(r.files.some(f => f.path.includes('int32_to_bigint3'))).toBe(true)
43
+ })
44
+
45
+ test('bigint3_to_int32 is emitted', () => {
46
+ const r = compileWith(`@keep fn t(): int { return bigint3_to_int32(0, 1, 2345); }`)
47
+ expect(r.files.some(f => f.path.includes('bigint3_to_int32'))).toBe(true)
48
+ })
49
+
50
+ test('bigint_zero is emitted', () => {
51
+ const r = compileWith(`@keep fn t() {
52
+ let a: int[] = [0, 0, 0];
53
+ bigint_zero(a, 3);
54
+ }`)
55
+ expect(r.files.some(f => f.path.includes('bigint_zero'))).toBe(true)
56
+ })
57
+ })