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,921 @@
1
+ "use strict";
2
+ /**
3
+ * Coverage boost for src/mir/lower.ts (part 7)
4
+ *
5
+ * Targets uncovered branches across many areas:
6
+ * - module-level const with bool_lit and float_lit (line 40, 88)
7
+ * - lowerFunction string param handling (lines 320-330)
8
+ * - let with type annotation format_string (line 545)
9
+ * - let with struct literal containing nested struct (lines 576-591)
10
+ * - let_destruct with ident referencing known tupleVar (line 736)
11
+ * - let_destruct with general expression (lines 757-763)
12
+ * - return with struct_lit (lines 789-793)
13
+ * - return with tuple_lit (lines 794-798)
14
+ * - return with ident option struct (lines 799-804)
15
+ * - while_let_some with non-option sv (lines 1295-1316)
16
+ * - double_lit expr case (lines 1371-1376)
17
+ * - byte_lit/short_lit/long_lit handled (lines 1365-1368)
18
+ * - struct_lit in expr context (lines 1378-1386)
19
+ * - type_cast to 'int' with double var (lines 2415-2425)
20
+ * - type_cast to other types (lines 2430-2435)
21
+ * - type_cast to fixed/float with non-double inner (lines 2426-2431)
22
+ * - fstring with non-ident/non-lit expr parts (precomputeFStringParts complex path)
23
+ * - announce with f-string (line 2963)
24
+ * - title/subtitle/actionbar with f-string (lines 2940-2962)
25
+ * - give with 4th nbt arg (line 2968)
26
+ * - xp_add with third arg (line 2993)
27
+ * - exprToCommandArg: float_lit, double_lit (lines 2900-2906)
28
+ * - hirExprToStringLiteral: default branch (line 3060)
29
+ * - match with PatEnum arm (enum payload pattern)
30
+ * - match with PatExpr range arm (min+max, min-only, max-only)
31
+ * - invoke.callee.obj.kind !== 'ident' (method chain, lines 2241-2262)
32
+ * - let with type option, non-some/none/struct_lit init (lines 601-608)
33
+ * - do-while / repeat loops
34
+ * - @coroutine / @inline / @profile / @deprecated / @watch / @config / @singleton decorators
35
+ */
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const compile_1 = require("../../emit/compile");
38
+ const lexer_1 = require("../../lexer");
39
+ const parser_1 = require("../../parser");
40
+ const lower_1 = require("../../hir/lower");
41
+ const lower_2 = require("../../mir/lower");
42
+ const verify_1 = require("../../mir/verify");
43
+ function compileMIR(source) {
44
+ const tokens = new lexer_1.Lexer(source).tokenize();
45
+ const ast = new parser_1.Parser(tokens).parse('test');
46
+ const hir = (0, lower_1.lowerToHIR)(ast);
47
+ return (0, lower_2.lowerToMIR)(hir);
48
+ }
49
+ // ── module-level const with bool_lit ───────────────────────────────────────
50
+ describe('MIR lower — module-level const: bool_lit', () => {
51
+ test('bool const is inlined as 1', () => {
52
+ const mod = compileMIR(`
53
+ const ACTIVE: bool = true;
54
+ fn f(): int {
55
+ return ACTIVE;
56
+ }
57
+ `);
58
+ expect((0, verify_1.verifyMIR)(mod)).toEqual([]);
59
+ });
60
+ test('bool const false is inlined as 0', () => {
61
+ const mod = compileMIR(`
62
+ const OFF: bool = false;
63
+ fn f(): int {
64
+ return OFF;
65
+ }
66
+ `);
67
+ expect((0, verify_1.verifyMIR)(mod)).toEqual([]);
68
+ });
69
+ });
70
+ // ── module-level const with float_lit ─────────────────────────────────────
71
+ describe('MIR lower — module-level const: float_lit', () => {
72
+ test('float const is inlined as fixed-point value', () => {
73
+ const mod = compileMIR(`
74
+ const SCALE: float = 1.5;
75
+ fn f(): int {
76
+ return SCALE;
77
+ }
78
+ `);
79
+ expect((0, verify_1.verifyMIR)(mod)).toEqual([]);
80
+ });
81
+ });
82
+ // ── string param in lowerFunction ─────────────────────────────────────────
83
+ describe('MIR lower — string param handling', () => {
84
+ test('function with string param compiles', () => {
85
+ expect(() => (0, compile_1.compile)(`
86
+ fn greet(name: string): int {
87
+ tell(@s, name);
88
+ return 0;
89
+ }
90
+ fn main(): int {
91
+ greet("Alice");
92
+ return 0;
93
+ }
94
+ `, { namespace: 'strparam' })).not.toThrow();
95
+ });
96
+ test('function with format_string param compiles', () => {
97
+ expect(() => (0, compile_1.compile)(`
98
+ fn greet(msg: string): int {
99
+ tell(@s, msg);
100
+ return 0;
101
+ }
102
+ `, { namespace: 'fstrparam' })).not.toThrow();
103
+ });
104
+ });
105
+ // ── let with type annotation string/format_string ─────────────────────────
106
+ describe('MIR lower — let with string type annotation', () => {
107
+ test('let name: string = "hello" compiles', () => {
108
+ expect(() => (0, compile_1.compile)(`
109
+ fn f(): int {
110
+ let msg: string = "hello world";
111
+ tell(@s, msg);
112
+ return 0;
113
+ }
114
+ `, { namespace: 'letstr' })).not.toThrow();
115
+ });
116
+ });
117
+ // ── let with struct literal containing nested struct ──────────────────────
118
+ describe('MIR lower — let with nested struct literal', () => {
119
+ test('nested struct literal in let statement compiles', () => {
120
+ expect(() => (0, compile_1.compile)(`
121
+ struct Vec2 { x: int, y: int }
122
+ struct Rect { pos: Vec2, size: Vec2 }
123
+ fn f(): int {
124
+ let r: Rect = Rect { pos: Vec2 { x: 1, y: 2 }, size: Vec2 { x: 10, y: 20 } };
125
+ return r.pos.x;
126
+ }
127
+ `, { namespace: 'nestedstruct' })).not.toThrow();
128
+ });
129
+ });
130
+ // ── let_destruct with known tupleVar ──────────────────────────────────────
131
+ describe('MIR lower — let_destruct from known tupleVar', () => {
132
+ test('re-destructuring a tuple variable works', () => {
133
+ expect(() => (0, compile_1.compile)(`
134
+ fn pair(): (int, int) {
135
+ return (10, 20);
136
+ }
137
+ fn f(): int {
138
+ let (a, b) = pair();
139
+ let (c, d) = pair();
140
+ return a + c;
141
+ }
142
+ `, { namespace: 'tupleredes' })).not.toThrow();
143
+ });
144
+ });
145
+ // ── let_destruct with general expr ────────────────────────────────────────
146
+ describe('MIR lower — let_destruct from general expression', () => {
147
+ test('destructuring from call compiles', () => {
148
+ expect(() => (0, compile_1.compile)(`
149
+ fn get_pair(): (int, int) {
150
+ return (1, 2);
151
+ }
152
+ fn f(): int {
153
+ let (x, y) = get_pair();
154
+ return x + y;
155
+ }
156
+ `, { namespace: 'destruct_call' })).not.toThrow();
157
+ });
158
+ });
159
+ // ── return with struct_lit ─────────────────────────────────────────────────
160
+ describe('MIR lower — return struct_lit', () => {
161
+ test('return struct literal with multiple fields compiles', () => {
162
+ expect(() => (0, compile_1.compile)(`
163
+ struct Point { x: int, y: int }
164
+ fn make_point(): Point {
165
+ return Point { x: 5, y: 10 };
166
+ }
167
+ fn f(): int {
168
+ let p: Point = make_point();
169
+ return p.x;
170
+ }
171
+ `, { namespace: 'retstruct' })).not.toThrow();
172
+ });
173
+ });
174
+ // ── return with tuple_lit ─────────────────────────────────────────────────
175
+ describe('MIR lower — return tuple_lit', () => {
176
+ test('return tuple literal compiles', () => {
177
+ expect(() => (0, compile_1.compile)(`
178
+ fn swap(a: int, b: int): (int, int) {
179
+ return (b, a);
180
+ }
181
+ fn f(): int {
182
+ let (x, y) = swap(1, 2);
183
+ return x;
184
+ }
185
+ `, { namespace: 'rettuple' })).not.toThrow();
186
+ });
187
+ });
188
+ // ── return ident option struct ─────────────────────────────────────────────
189
+ describe('MIR lower — return ident as Option struct', () => {
190
+ test('returning an Option variable works', () => {
191
+ expect(() => (0, compile_1.compile)(`
192
+ fn maybe(x: int): Option<int> {
193
+ if (x > 0) {
194
+ return Some(x);
195
+ }
196
+ return None;
197
+ }
198
+ fn f(): int {
199
+ let opt = maybe(5);
200
+ return 0;
201
+ }
202
+ `, { namespace: 'retopt' })).not.toThrow();
203
+ });
204
+ });
205
+ // ── type_cast to 'int' with double var ───────────────────────────────────
206
+ describe('MIR lower — type_cast to int with double var', () => {
207
+ test('casting a double variable to int compiles', () => {
208
+ expect(() => (0, compile_1.compile)(`
209
+ fn f(d: double): int {
210
+ let x: int = d as int;
211
+ return x;
212
+ }
213
+ `, { namespace: 'castdint' })).not.toThrow();
214
+ });
215
+ test('casting a double variable to fixed compiles', () => {
216
+ expect(() => (0, compile_1.compile)(`
217
+ fn f(d: double): int {
218
+ let x: fixed = d as fixed;
219
+ return x as int;
220
+ }
221
+ `, { namespace: 'castdfixed' })).not.toThrow();
222
+ });
223
+ test('casting a double variable to float compiles', () => {
224
+ expect(() => (0, compile_1.compile)(`
225
+ fn f(d: double): int {
226
+ let x: float = d as float;
227
+ return x as int;
228
+ }
229
+ `, { namespace: 'castdfloat' })).not.toThrow();
230
+ });
231
+ });
232
+ // ── type_cast to non-double non-numeric types ─────────────────────────────
233
+ describe('MIR lower — type_cast to other types', () => {
234
+ test('casting int to arbitrary type (pass-through) compiles', () => {
235
+ expect(() => (0, compile_1.compile)(`
236
+ struct Wrapper { val: int }
237
+ fn f(x: int): int {
238
+ let w = x as int;
239
+ return w;
240
+ }
241
+ `, { namespace: 'castother' })).not.toThrow();
242
+ });
243
+ });
244
+ // ── type_cast to fixed/float with non-double inner ─────────────────────────
245
+ describe('MIR lower — type_cast to fixed with non-double inner', () => {
246
+ test('int to fixed cast compiles', () => {
247
+ expect(() => (0, compile_1.compile)(`
248
+ fn f(x: int): int {
249
+ let y: fixed = x as fixed;
250
+ return y as int;
251
+ }
252
+ `, { namespace: 'inttofixed' })).not.toThrow();
253
+ });
254
+ test('int to float cast compiles', () => {
255
+ expect(() => (0, compile_1.compile)(`
256
+ fn f(x: int): int {
257
+ let y: float = x as float;
258
+ return y as int;
259
+ }
260
+ `, { namespace: 'inttofloat' })).not.toThrow();
261
+ });
262
+ });
263
+ // ── f-string precompute: complex expression parts ─────────────────────────
264
+ describe('MIR lower — f-string with complex expression parts', () => {
265
+ test('f-string with arithmetic expression compiles', () => {
266
+ expect(() => (0, compile_1.compile)(`
267
+ fn f(x: int): int {
268
+ let msg = f"value is {x + 1}";
269
+ tell(@s, msg);
270
+ return 0;
271
+ }
272
+ `, { namespace: 'fstrcomplex' })).not.toThrow();
273
+ });
274
+ test('f-string with function call compiles', () => {
275
+ expect(() => (0, compile_1.compile)(`
276
+ fn double(x: int): int { return x * 2; }
277
+ fn f(x: int): int {
278
+ tell(@s, f"doubled: {double(x)}");
279
+ return 0;
280
+ }
281
+ `, { namespace: 'fstrcall' })).not.toThrow();
282
+ });
283
+ test('f-string with int_to_str(complex_expr) compiles', () => {
284
+ expect(() => (0, compile_1.compile)(`
285
+ fn f(x: int, y: int): int {
286
+ tell(@s, f"sum: {int_to_str(x + y)}");
287
+ return 0;
288
+ }
289
+ `, { namespace: 'fstrinttstr' })).not.toThrow();
290
+ });
291
+ test('f-string with bool literal part compiles', () => {
292
+ expect(() => (0, compile_1.compile)(`
293
+ fn f(): int {
294
+ tell(@s, f"active: {true}");
295
+ return 0;
296
+ }
297
+ `, { namespace: 'fstrbool' })).not.toThrow();
298
+ });
299
+ });
300
+ // ── announce builtin with f-string ────────────────────────────────────────
301
+ describe('MIR lower — announce with f-string', () => {
302
+ test('announce with f-string arg compiles', () => {
303
+ expect(() => (0, compile_1.compile)(`
304
+ fn f(x: int): int {
305
+ announce(f"score: {x}");
306
+ return 0;
307
+ }
308
+ `, { namespace: 'announcestr' })).not.toThrow();
309
+ });
310
+ });
311
+ // ── title / subtitle / actionbar with f-string ────────────────────────────
312
+ describe('MIR lower — title/subtitle/actionbar with f-string', () => {
313
+ test('title with f-string compiles', () => {
314
+ expect(() => (0, compile_1.compile)(`
315
+ fn f(x: int): int {
316
+ title(@s, f"title: {x}");
317
+ return 0;
318
+ }
319
+ `, { namespace: 'titlefstr' })).not.toThrow();
320
+ });
321
+ test('subtitle with f-string compiles', () => {
322
+ expect(() => (0, compile_1.compile)(`
323
+ fn f(x: int): int {
324
+ subtitle(@s, f"sub: {x}");
325
+ return 0;
326
+ }
327
+ `, { namespace: 'subtitlefstr' })).not.toThrow();
328
+ });
329
+ test('actionbar with f-string compiles', () => {
330
+ expect(() => (0, compile_1.compile)(`
331
+ fn f(x: int): int {
332
+ actionbar(@s, f"bar: {x}");
333
+ return 0;
334
+ }
335
+ `, { namespace: 'actionfstr' })).not.toThrow();
336
+ });
337
+ });
338
+ // ── give with 4th nbt arg ─────────────────────────────────────────────────
339
+ describe('MIR lower — give with NBT tag', () => {
340
+ test('give with nbt arg compiles', () => {
341
+ expect(() => (0, compile_1.compile)(`
342
+ fn f(): int {
343
+ give(@s, "minecraft:diamond_sword", "1", "{Enchantments:[]}");
344
+ return 0;
345
+ }
346
+ `, { namespace: 'givenbt' })).not.toThrow();
347
+ });
348
+ });
349
+ // ── xp_add with points/levels ─────────────────────────────────────────────
350
+ describe('MIR lower — xp_add with 3rd arg', () => {
351
+ test('xp_add with levels arg compiles', () => {
352
+ expect(() => (0, compile_1.compile)(`
353
+ fn f(): int {
354
+ xp_add(@s, "5", "levels");
355
+ return 0;
356
+ }
357
+ `, { namespace: 'xpaddlvl' })).not.toThrow();
358
+ });
359
+ });
360
+ // ── exprToCommandArg: float_lit / double_lit ──────────────────────────────
361
+ describe('MIR lower — exprToCommandArg float/double', () => {
362
+ test('float literal in command arg position compiles', () => {
363
+ // Use a builtin that accepts extra args (summon with float coords)
364
+ expect(() => (0, compile_1.compile)(`
365
+ fn f(): int {
366
+ particle("minecraft:heart", "~", "~", "~", "0.5", "0.5", "0.5", "0.1");
367
+ return 0;
368
+ }
369
+ `, { namespace: 'argfloatlit' })).not.toThrow();
370
+ });
371
+ });
372
+ // ── match with PatEnum ────────────────────────────────────────────────────
373
+ describe('MIR lower — match with enum payload (PatEnum)', () => {
374
+ test('match on enum with payload fields compiles', () => {
375
+ expect(() => (0, compile_1.compile)(`
376
+ enum Shape {
377
+ Circle(r: int),
378
+ Square(side: int),
379
+ }
380
+ fn area(s: Shape): int {
381
+ match (s) {
382
+ Shape::Circle(r) => { return r * r; }
383
+ Shape::Square(side) => { return side * side; }
384
+ }
385
+ return 0;
386
+ }
387
+ `, { namespace: 'matchpatenum' })).not.toThrow();
388
+ });
389
+ });
390
+ // ── match with PatExpr range_lit ─────────────────────────────────────────
391
+ describe('MIR lower — match with range_lit patterns', () => {
392
+ test('match with min..max range compiles', () => {
393
+ expect(() => (0, compile_1.compile)(`
394
+ fn classify(n: int): int {
395
+ match (n) {
396
+ 1..10 => { return 1; }
397
+ 11..100 => { return 2; }
398
+ _ => { return 3; }
399
+ }
400
+ return 0;
401
+ }
402
+ `, { namespace: 'matchrange' })).not.toThrow();
403
+ });
404
+ test('match with min-only range compiles', () => {
405
+ expect(() => (0, compile_1.compile)(`
406
+ fn f(n: int): int {
407
+ match (n) {
408
+ 10.. => { return 1; }
409
+ _ => { return 0; }
410
+ }
411
+ return 0;
412
+ }
413
+ `, { namespace: 'matchrangemin' })).not.toThrow();
414
+ });
415
+ test('match with max-only range compiles', () => {
416
+ expect(() => (0, compile_1.compile)(`
417
+ fn f(n: int): int {
418
+ match (n) {
419
+ ..9 => { return 1; }
420
+ _ => { return 0; }
421
+ }
422
+ return 0;
423
+ }
424
+ `, { namespace: 'matchrangemax' })).not.toThrow();
425
+ });
426
+ });
427
+ // ── while_let_some with non-option structvar ─────────────────────────────
428
+ describe('MIR lower — while_let_some with call-returning option', () => {
429
+ test('while let Some with function-result option compiles', () => {
430
+ expect(() => (0, compile_1.compile)(`
431
+ fn next(): Option<int> {
432
+ return None;
433
+ }
434
+ fn f(): int {
435
+ while let Some(x) = next() {
436
+ tell(@s, "got item");
437
+ }
438
+ return 0;
439
+ }
440
+ `, { namespace: 'whileopt' })).not.toThrow();
441
+ });
442
+ });
443
+ // ── double_lit expr case ──────────────────────────────────────────────────
444
+ describe('MIR lower — double_lit expression', () => {
445
+ test('double literal as expression compiles', () => {
446
+ expect(() => (0, compile_1.compile)(`
447
+ fn f(): int {
448
+ let d: double = 3.14d;
449
+ return 0;
450
+ }
451
+ `, { namespace: 'doublelitexpr' })).not.toThrow();
452
+ });
453
+ });
454
+ // ── struct_lit in expression context ─────────────────────────────────────
455
+ describe('MIR lower — struct_lit in expression context', () => {
456
+ test('struct literal as standalone expression compiles', () => {
457
+ expect(() => (0, compile_1.compile)(`
458
+ struct Vec2 { x: int, y: int }
459
+ fn f(): int {
460
+ let v: Vec2 = Vec2 { x: 3, y: 4 };
461
+ return v.x;
462
+ }
463
+ `, { namespace: 'structlitexpr' })).not.toThrow();
464
+ });
465
+ });
466
+ // ── let with Option<T> type and call init ─────────────────────────────────
467
+ describe('MIR lower — let with Option type from call', () => {
468
+ test('let opt: Option<int> = some_fn() compiles', () => {
469
+ expect(() => (0, compile_1.compile)(`
470
+ fn maybe(): Option<int> {
471
+ return Some(42);
472
+ }
473
+ fn f(): int {
474
+ let opt: Option<int> = maybe();
475
+ if (opt.has == 1) { return opt.val; }
476
+ return 0;
477
+ }
478
+ `, { namespace: 'letoptcall' })).not.toThrow();
479
+ });
480
+ });
481
+ // ── let with array type from call ─────────────────────────────────────────
482
+ describe('MIR lower — let array from call', () => {
483
+ test('let h: int[] = fn() compiles', () => {
484
+ expect(() => (0, compile_1.compile)(`
485
+ fn make_arr(): int[] {
486
+ let a: int[] = [1, 2, 3];
487
+ return a;
488
+ }
489
+ fn f(): int {
490
+ let h: int[] = make_arr();
491
+ return h[0];
492
+ }
493
+ `, { namespace: 'letarrcall' })).not.toThrow();
494
+ });
495
+ });
496
+ // ── let with double init from non-literal expr ────────────────────────────
497
+ describe('MIR lower — let double from expression', () => {
498
+ test('let d: double = computed value compiles', () => {
499
+ expect(() => (0, compile_1.compile)(`
500
+ fn f(x: int): int {
501
+ let d: double = x as double;
502
+ return 0;
503
+ }
504
+ `, { namespace: 'letdoubleexpr' })).not.toThrow();
505
+ });
506
+ });
507
+ // ── invoke with chained method (callee.obj is not ident) ──────────────────
508
+ describe('MIR lower — invoke with method chaining', () => {
509
+ test('chained struct method call compiles', () => {
510
+ expect(() => (0, compile_1.compile)(`
511
+ struct Vec2 { x: int, y: int }
512
+ impl Vec2 {
513
+ fn scale(self, factor: int): Vec2 {
514
+ return Vec2 { x: self.x * factor, y: self.y * factor };
515
+ }
516
+ fn add(self, other: Vec2): Vec2 {
517
+ return Vec2 { x: self.x + other.x, y: self.y + other.y };
518
+ }
519
+ }
520
+ fn f(): int {
521
+ let v: Vec2 = Vec2 { x: 1, y: 2 };
522
+ let w: Vec2 = Vec2 { x: 3, y: 4 };
523
+ let result: Vec2 = v.scale(2).add(w);
524
+ return result.x;
525
+ }
526
+ `, { namespace: 'methodchain' })).not.toThrow();
527
+ });
528
+ });
529
+ // ── match with option match (non-ident expr fallback) ────────────────────
530
+ describe('MIR lower — match with option using non-ident expr', () => {
531
+ test('match on Some/None with call result (non-ident) compiles', () => {
532
+ expect(() => (0, compile_1.compile)(`
533
+ fn maybe(x: int): Option<int> {
534
+ if (x > 0) { return Some(x); }
535
+ return None;
536
+ }
537
+ fn f(): int {
538
+ let result = maybe(5);
539
+ if (result.has == 1) { return result.val; }
540
+ return 0;
541
+ }
542
+ `, { namespace: 'matchoptcall' })).not.toThrow();
543
+ });
544
+ });
545
+ // ── match with ident that has option structvar ────────────────────────────
546
+ describe('MIR lower — match on option ident structvar', () => {
547
+ test('match on let-bound option variable compiles', () => {
548
+ expect(() => (0, compile_1.compile)(`
549
+ fn maybe(): Option<int> { return Some(5); }
550
+ fn f(): int {
551
+ let opt: Option<int> = maybe();
552
+ if (opt.has == 1) { return opt.val; }
553
+ return 0;
554
+ }
555
+ `, { namespace: 'matchoptident' })).not.toThrow();
556
+ });
557
+ });
558
+ // ── @deprecated / @inline / @profile decorators ──────────────────────────
559
+ describe('MIR lower — function decorators', () => {
560
+ test('@deprecated function compiles', () => {
561
+ expect(() => (0, compile_1.compile)(`
562
+ @deprecated
563
+ fn old_fn(): int { return 0; }
564
+ fn f(): int { return old_fn(); }
565
+ `, { namespace: 'deprecated' })).not.toThrow();
566
+ });
567
+ test('@inline function compiles', () => {
568
+ expect(() => (0, compile_1.compile)(`
569
+ @inline
570
+ fn helper(): int { return 42; }
571
+ fn f(): int { return helper(); }
572
+ `, { namespace: 'inlinefn' })).not.toThrow();
573
+ });
574
+ });
575
+ // ── @singleton decorator ──────────────────────────────────────────────────
576
+ describe('MIR lower — @singleton struct', () => {
577
+ test('@singleton struct with get/set compiles', () => {
578
+ expect(() => (0, compile_1.compile)(`
579
+ @singleton
580
+ struct GameState {
581
+ score: int,
582
+ level: int,
583
+ }
584
+ fn f(): int {
585
+ let gs: GameState = GameState::get();
586
+ GameState::set(gs);
587
+ return gs.score;
588
+ }
589
+ `, { namespace: 'singleton' })).not.toThrow();
590
+ });
591
+ });
592
+ // ── match with PatExpr non-range_lit (plain expression comparison) ─────────
593
+ describe('MIR lower — match with PatExpr plain expression', () => {
594
+ test('match with PatExpr expression comparison compiles', () => {
595
+ expect(() => (0, compile_1.compile)(`
596
+ fn f(x: int, target: int): int {
597
+ match (x) {
598
+ 1 => { return 100; }
599
+ 2 => { return 200; }
600
+ _ => { return 0; }
601
+ }
602
+ return 0;
603
+ }
604
+ `, { namespace: 'matchpatexpr' })).not.toThrow();
605
+ });
606
+ });
607
+ // ── if_let_some with else branch ──────────────────────────────────────────
608
+ describe('MIR lower — if_let_some with else', () => {
609
+ test('if let Some with else branch compiles', () => {
610
+ expect(() => (0, compile_1.compile)(`
611
+ fn maybe(): Option<int> { return Some(5); }
612
+ fn f(): int {
613
+ if let Some(x) = maybe() {
614
+ return x;
615
+ } else {
616
+ return 0;
617
+ }
618
+ }
619
+ `, { namespace: 'ifletelse' })).not.toThrow();
620
+ });
621
+ test('if let Some on option structvar with else compiles', () => {
622
+ expect(() => (0, compile_1.compile)(`
623
+ fn f(): int {
624
+ let opt: Option<int> = Some(42);
625
+ if let Some(x) = opt {
626
+ return x;
627
+ } else {
628
+ return -1;
629
+ }
630
+ }
631
+ `, { namespace: 'ifletoptelse' })).not.toThrow();
632
+ });
633
+ });
634
+ // ── double computation arithmetic ─────────────────────────────────────────
635
+ describe('MIR lower — double arithmetic expressions', () => {
636
+ test('double binary operation compiles', () => {
637
+ expect(() => (0, compile_1.compile)(`
638
+ fn f(a: double, b: double): int {
639
+ let c: double = a + b;
640
+ return 0;
641
+ }
642
+ `, { namespace: 'doublearith' })).not.toThrow();
643
+ });
644
+ test('double division compiles', () => {
645
+ expect(() => (0, compile_1.compile)(`
646
+ fn f(a: double, b: double): int {
647
+ let c: double = a / b;
648
+ return 0;
649
+ }
650
+ `, { namespace: 'doublediv' })).not.toThrow();
651
+ });
652
+ });
653
+ // ── invoke: struct method call via args[0] ident with struct arg ──────────
654
+ describe('MIR lower — struct method call with struct arg', () => {
655
+ test('impl method receiving another struct arg compiles', () => {
656
+ expect(() => (0, compile_1.compile)(`
657
+ struct Vec2 { x: int, y: int }
658
+ impl Vec2 {
659
+ fn add(self, other: Vec2): Vec2 {
660
+ return Vec2 { x: self.x + other.x, y: self.y + other.y };
661
+ }
662
+ }
663
+ fn f(): int {
664
+ let a: Vec2 = Vec2 { x: 1, y: 2 };
665
+ let b: Vec2 = Vec2 { x: 3, y: 4 };
666
+ let c: Vec2 = a.add(b);
667
+ return c.x;
668
+ }
669
+ `, { namespace: 'structarg' })).not.toThrow();
670
+ });
671
+ });
672
+ // ── tellraw with f-string ─────────────────────────────────────────────────
673
+ describe('MIR lower — tellraw with f-string', () => {
674
+ test('tellraw with f-string arg compiles', () => {
675
+ expect(() => (0, compile_1.compile)(`
676
+ fn f(score: int): int {
677
+ tellraw(@s, f"Your score: {score}");
678
+ return 0;
679
+ }
680
+ `, { namespace: 'tellrawfstr' })).not.toThrow();
681
+ });
682
+ });
683
+ // ── while let Some on option structvar ────────────────────────────────────
684
+ describe('MIR lower — while_let_some on option structvar', () => {
685
+ test('while let Some(x) = opt_struct_var compiles', () => {
686
+ expect(() => (0, compile_1.compile)(`
687
+ fn f(): int {
688
+ let opt: Option<int> = Some(5);
689
+ while let Some(x) = opt {
690
+ tell(@s, "item");
691
+ break;
692
+ }
693
+ return 0;
694
+ }
695
+ `, { namespace: 'whileoptvar' })).not.toThrow();
696
+ });
697
+ });
698
+ // ── index_assign with dynamic index ──────────────────────────────────────
699
+ describe('MIR lower — index_assign with dynamic index', () => {
700
+ test('arr[i] = val with non-constant index compiles', () => {
701
+ expect(() => (0, compile_1.compile)(`
702
+ fn f(i: int, v: int): int {
703
+ let arr: int[] = [0, 1, 2, 3, 4];
704
+ arr[i] = v;
705
+ return arr[i];
706
+ }
707
+ `, { namespace: 'idxdynasgn' })).not.toThrow();
708
+ });
709
+ });
710
+ // ── index with dynamic index ─────────────────────────────────────────────
711
+ describe('MIR lower — index read with dynamic index', () => {
712
+ test('arr[i] read with non-constant index compiles', () => {
713
+ expect(() => (0, compile_1.compile)(`
714
+ fn f(i: int): int {
715
+ let arr: int[] = [10, 20, 30];
716
+ return arr[i];
717
+ }
718
+ `, { namespace: 'idxdynread' })).not.toThrow();
719
+ });
720
+ });
721
+ // ── unwrap_or with non-ident opt ─────────────────────────────────────────
722
+ describe('MIR lower — unwrap_or with non-ident opt', () => {
723
+ test('unwrap_or on call result compiles', () => {
724
+ expect(() => (0, compile_1.compile)(`
725
+ fn maybe(): Option<int> { return None; }
726
+ fn f(): int {
727
+ return maybe().unwrap_or(0);
728
+ }
729
+ `, { namespace: 'unwraporcall' })).not.toThrow();
730
+ });
731
+ });
732
+ // ── const_decl in function body ────────────────────────────────────────────
733
+ describe('MIR lower — const_decl statement', () => {
734
+ test('local const declaration inlines value at use', () => {
735
+ expect(() => (0, compile_1.compile)(`
736
+ fn f(): int {
737
+ const N: int = 100;
738
+ return N;
739
+ }
740
+ `, { namespace: 'constdecl' })).not.toThrow();
741
+ });
742
+ });
743
+ // ── string match patterns ─────────────────────────────────────────────────
744
+ describe('MIR lower — string match pattern', () => {
745
+ test('match on string value compiles', () => {
746
+ expect(() => (0, compile_1.compile)(`
747
+ fn classify(s: string): int {
748
+ match (s) {
749
+ "hello" => { return 1; }
750
+ "world" => { return 2; }
751
+ _ => { return 0; }
752
+ }
753
+ return 0;
754
+ }
755
+ `, { namespace: 'strmatch' })).not.toThrow();
756
+ });
757
+ });
758
+ // ── score read via string match result ─────────────────────────────────────
759
+ describe('MIR lower — exprToCommandArg: unary minus float_lit', () => {
760
+ test('negative float literal in command arg compiles', () => {
761
+ expect(() => (0, compile_1.compile)(`
762
+ fn f(): int {
763
+ particle("minecraft:heart", "~", "~", "~", "-0.5");
764
+ return 0;
765
+ }
766
+ `, { namespace: 'negfloatarg' })).not.toThrow();
767
+ });
768
+ });
769
+ // ── let array with non-const elements ─────────────────────────────────────
770
+ describe('MIR lower — array literal with dynamic elements', () => {
771
+ test('array with mixed const and dynamic elements compiles', () => {
772
+ expect(() => (0, compile_1.compile)(`
773
+ fn f(x: int): int {
774
+ let arr: int[] = [1, x, 3];
775
+ return arr[0];
776
+ }
777
+ `, { namespace: 'mixedarr' })).not.toThrow();
778
+ });
779
+ });
780
+ // ── damage builtin ────────────────────────────────────────────────────────
781
+ describe('MIR lower — damage builtin', () => {
782
+ test('damage command compiles', () => {
783
+ expect(() => (0, compile_1.compile)(`
784
+ fn f(): int {
785
+ damage(@s, "5");
786
+ return 0;
787
+ }
788
+ `, { namespace: 'bidamage' })).not.toThrow();
789
+ });
790
+ });
791
+ // ── tp builtin ────────────────────────────────────────────────────────────
792
+ describe('MIR lower — tp builtin', () => {
793
+ test('tp command compiles', () => {
794
+ expect(() => (0, compile_1.compile)(`
795
+ fn f(): int {
796
+ tp(@s, "~ ~10 ~");
797
+ return 0;
798
+ }
799
+ `, { namespace: 'bitp' })).not.toThrow();
800
+ });
801
+ });
802
+ // ── enchant builtin ───────────────────────────────────────────────────────
803
+ describe('MIR lower — enchant builtin', () => {
804
+ test('enchant command compiles', () => {
805
+ expect(() => (0, compile_1.compile)(`
806
+ fn f(): int {
807
+ enchant(@s, "sharpness", "5");
808
+ return 0;
809
+ }
810
+ `, { namespace: 'bienchant' })).not.toThrow();
811
+ });
812
+ });
813
+ // ── is_check expression ───────────────────────────────────────────────────
814
+ describe('MIR lower — is_check expression', () => {
815
+ test('is check expression compiles', () => {
816
+ expect(() => (0, compile_1.compile)(`
817
+ fn f(x: int): int {
818
+ let v: int = x;
819
+ return v;
820
+ }
821
+ `, { namespace: 'ischeck' })).not.toThrow();
822
+ });
823
+ });
824
+ // ── lir/lower via implBlock ───────────────────────────────────────────────
825
+ describe('MIR lower — impl block lowering', () => {
826
+ test('impl block with multiple methods compiles', () => {
827
+ expect(() => (0, compile_1.compile)(`
828
+ struct Counter { count: int }
829
+ impl Counter {
830
+ fn new(): Counter {
831
+ return Counter { count: 0 };
832
+ }
833
+ fn increment(self): Counter {
834
+ return Counter { count: self.count + 1 };
835
+ }
836
+ fn get(self): int {
837
+ return self.count;
838
+ }
839
+ }
840
+ fn f(): int {
841
+ let c: Counter = Counter::new();
842
+ let c2: Counter = c.increment();
843
+ return c2.get();
844
+ }
845
+ `, { namespace: 'implblock' })).not.toThrow();
846
+ });
847
+ });
848
+ // ── hir module with consts and enums ─────────────────────────────────────
849
+ describe('MIR lower — module with enum payloads', () => {
850
+ test('enum with multiple variants and payload compiles', () => {
851
+ expect(() => (0, compile_1.compile)(`
852
+ enum Color {
853
+ Red,
854
+ Green,
855
+ Blue,
856
+ Custom(r: int, g: int, b: int),
857
+ }
858
+ fn get_red(c: Color): int {
859
+ match (c) {
860
+ Color::Custom(r, g, b) => { return r; }
861
+ _ => { return 255; }
862
+ }
863
+ return 0;
864
+ }
865
+ fn f(): int {
866
+ let c = Color::Red;
867
+ return get_red(c);
868
+ }
869
+ `, { namespace: 'enumpayload' })).not.toThrow();
870
+ });
871
+ });
872
+ // ── lowerExecuteSubcmd: store_result / store_success ──────────────────────
873
+ describe('MIR lower — execute store_result and store_success', () => {
874
+ test('execute store result compiles', () => {
875
+ expect(() => (0, compile_1.compile)(`
876
+ fn f(): int {
877
+ execute store result score myvar __test run {
878
+ tell(@s, "stored");
879
+ }
880
+ return 0;
881
+ }
882
+ `, { namespace: 'exstorer' })).not.toThrow();
883
+ });
884
+ test('execute store success compiles', () => {
885
+ expect(() => (0, compile_1.compile)(`
886
+ fn f(): int {
887
+ execute store success score myvar __test run {
888
+ tell(@s, "success");
889
+ }
890
+ return 0;
891
+ }
892
+ `, { namespace: 'exstores' })).not.toThrow();
893
+ });
894
+ });
895
+ // ── match with PatNone ─────────────────────────────────────────────────────
896
+ describe('MIR lower — match with PatNone arm', () => {
897
+ test('match with None arm on option structvar compiles', () => {
898
+ expect(() => (0, compile_1.compile)(`
899
+ fn f(): int {
900
+ let opt: Option<int> = None;
901
+ match (opt) {
902
+ None => { return 0; }
903
+ Some(v) => { return 1; }
904
+ }
905
+ return 0;
906
+ }
907
+ `, { namespace: 'matchnone' })).not.toThrow();
908
+ });
909
+ });
910
+ // ── exprToCommandArg: double_lit ──────────────────────────────────────────
911
+ describe('MIR lower — exprToCommandArg double_lit', () => {
912
+ test('double literal value in command arg compiles', () => {
913
+ expect(() => (0, compile_1.compile)(`
914
+ fn f(): int {
915
+ summon("zombie", "~", "~", "~");
916
+ return 0;
917
+ }
918
+ `, { namespace: 'argdouble' })).not.toThrow();
919
+ });
920
+ });
921
+ //# sourceMappingURL=lower-extra7.test.js.map