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,228 @@
1
+ /**
2
+ * Extra targeted tests to push compile.ts branch coverage above 85%.
3
+ *
4
+ * Targets remaining uncovered branches:
5
+ * - B9: default-arg (options = {} when called with no second arg)
6
+ * - B10: default-arg (namespace = 'redscript' when not provided)
7
+ * - B24/B25: mergeWholeModuleImport parse error (file import with bad syntax)
8
+ * - B32/B33: libraryImports parse error (library import with bad syntax)
9
+ * - B63: budget diagnostic level === 'error'
10
+ * - B69: stopAfterCheck + caught CheckFailedError → re-throw as-is
11
+ */
12
+
13
+ import * as fs from 'fs'
14
+ import * as os from 'os'
15
+ import * as path from 'path'
16
+ import { compile } from '../../emit/compile'
17
+ import { CheckFailedError } from '../../diagnostics'
18
+
19
+ // ---------------------------------------------------------------------------
20
+ // B9 + B10: call compile() with no second arg / without namespace
21
+ // ---------------------------------------------------------------------------
22
+
23
+ describe('compile.ts default arg branches', () => {
24
+ test('B9: compile called with no options arg uses default {} → succeeds', () => {
25
+ // Branch 9: the default `options = {}` is used (i.e. no second arg)
26
+ const result = compile('fn f(): int { return 1; }')
27
+ expect(result.success).toBe(true)
28
+ expect(result.files.length).toBeGreaterThan(0)
29
+ // default namespace is 'redscript'
30
+ expect(result.files.some(f => f.path.includes('redscript'))).toBe(true)
31
+ })
32
+
33
+ test('B10: compile called without namespace uses default "redscript"', () => {
34
+ // Branch 10: namespace defaults to 'redscript' when not provided
35
+ // We provide options but omit namespace
36
+ const result = compile('fn f(): int { return 2; }', { stopAfterCheck: false })
37
+ expect(result.success).toBe(true)
38
+ expect(result.files.some(f => f.path.includes('redscript'))).toBe(true)
39
+ })
40
+ })
41
+
42
+ // ---------------------------------------------------------------------------
43
+ // B24/B25: mergeWholeModuleImport parse error
44
+ // When a whole-module import file has invalid syntax, the parse error is thrown
45
+ // Branch 24: if (modParser.parseErrors.length > 0) → true
46
+ // Branch 25: throw stopAfterCheck ? DiagnosticBundleError : parseErrors[0]
47
+ // - B25 arm 0 (stopAfterCheck=true): throws DiagnosticBundleError → wrapped in CheckFailedError
48
+ // - B25 arm 1 (stopAfterCheck=false): throws parseErrors[0]
49
+ // ---------------------------------------------------------------------------
50
+
51
+ describe('compile.ts mergeWholeModuleImport parse error (B24/B25)', () => {
52
+ let tempDir: string
53
+ let mainPath: string
54
+ let badModPath: string
55
+
56
+ beforeEach(() => {
57
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'redscript-b24-'))
58
+ mainPath = path.join(tempDir, 'main.mcrs')
59
+ badModPath = path.join(tempDir, 'bad_mod.mcrs')
60
+
61
+ // Write a bad module (invalid syntax)
62
+ fs.writeFileSync(badModPath, 'fn broken_syntax( { return 1; }\n')
63
+
64
+ // Write main that imports the bad module with whole-module import
65
+ // `import bad_mod;` (no ::) → symbol=undefined → mergeWholeModuleImport
66
+ fs.writeFileSync(mainPath, 'import bad_mod;\nfn main(): int { return 0; }\n')
67
+ })
68
+
69
+ afterEach(() => {
70
+ fs.rmSync(tempDir, { recursive: true, force: true })
71
+ })
72
+
73
+ test('B24+B25 arm1: whole-module import parse error (no stopAfterCheck) → throws raw parse error', () => {
74
+ // Branch 24: true path (parse errors > 0)
75
+ // Branch 25: arm 1 (stopAfterCheck=false) → throws parseErrors[0]
76
+ expect(() =>
77
+ compile(fs.readFileSync(mainPath, 'utf-8'), {
78
+ namespace: 'b24_nosac',
79
+ filePath: mainPath,
80
+ })
81
+ ).toThrow()
82
+ })
83
+
84
+ test('B24+B25 arm0: whole-module import parse error (stopAfterCheck=true) → throws CheckFailedError', () => {
85
+ // Branch 24: true path (parse errors > 0)
86
+ // Branch 25: arm 0 (stopAfterCheck=true) → throws DiagnosticBundleError → wrapped in CheckFailedError
87
+ expect(() =>
88
+ compile(fs.readFileSync(mainPath, 'utf-8'), {
89
+ namespace: 'b24_sac',
90
+ filePath: mainPath,
91
+ stopAfterCheck: true,
92
+ })
93
+ ).toThrow(CheckFailedError)
94
+ })
95
+ })
96
+
97
+ // ---------------------------------------------------------------------------
98
+ // B32/B33: libraryImports parse error
99
+ // When a file referenced via file-system `import "file.mcrs";` has:
100
+ // `module library;` declaration → goes to libraryImports array
101
+ // Then if that library file has parse errors → Branch 32/33 fires
102
+ // Branch 32: if (libParser.parseErrors.length > 0)
103
+ // Branch 33: throw stopAfterCheck ? DiagnosticBundleError : parseErrors[0]
104
+ // ---------------------------------------------------------------------------
105
+
106
+ describe('compile.ts libraryImports parse error (B32/B33)', () => {
107
+ let tempDir: string
108
+ let mainPath: string
109
+ let badLibPath: string
110
+
111
+ beforeEach(() => {
112
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'redscript-b32-'))
113
+ mainPath = path.join(tempDir, 'main.mcrs')
114
+ badLibPath = path.join(tempDir, 'mylib.mcrs')
115
+
116
+ // Write a library file with module library; but broken syntax
117
+ fs.writeFileSync(badLibPath, 'module library;\nfn broken( { return 1; }\n')
118
+
119
+ // Write main that imports the library file (file-path import triggers libraryImports path)
120
+ // The preprocessor finds `module library;` in the imported file → puts it in libraryImports
121
+ fs.writeFileSync(mainPath, 'import "mylib";\nfn main(): int { return 0; }\n')
122
+ })
123
+
124
+ afterEach(() => {
125
+ fs.rmSync(tempDir, { recursive: true, force: true })
126
+ })
127
+
128
+ test('B32+B33 arm1: library import parse error (no stopAfterCheck) → throws raw parse error', () => {
129
+ expect(() =>
130
+ compile(fs.readFileSync(mainPath, 'utf-8'), {
131
+ namespace: 'b32_nosac',
132
+ filePath: mainPath,
133
+ })
134
+ ).toThrow()
135
+ })
136
+
137
+ test('B32+B33 arm0: library import parse error (stopAfterCheck=true) → throws CheckFailedError', () => {
138
+ expect(() =>
139
+ compile(fs.readFileSync(mainPath, 'utf-8'), {
140
+ namespace: 'b32_sac',
141
+ filePath: mainPath,
142
+ stopAfterCheck: true,
143
+ })
144
+ ).toThrow(CheckFailedError)
145
+ })
146
+ })
147
+
148
+ // ---------------------------------------------------------------------------
149
+ // B63: budget diagnostic with level 'error' → throws DiagnosticError
150
+ // ---------------------------------------------------------------------------
151
+
152
+ describe('compile.ts budget error level (B63) via mock', () => {
153
+ beforeEach(() => {
154
+ jest.resetModules()
155
+ })
156
+
157
+ afterEach(() => {
158
+ jest.resetModules()
159
+ })
160
+
161
+ test('B63: analyzeBudget returning error level throws DiagnosticError', () => {
162
+ jest.isolateModules(() => {
163
+ jest.doMock('../../lir/budget', () => ({
164
+ analyzeBudget: jest.fn(() => [
165
+ { level: 'error', message: 'tick budget exceeded' },
166
+ ]),
167
+ }))
168
+
169
+ const { compile: compileFresh } = require('../../emit/compile')
170
+ let thrown: unknown
171
+ try {
172
+ compileFresh('fn f(): int { return 0; }', { namespace: 'b63_budget' })
173
+ } catch (e) {
174
+ thrown = e
175
+ }
176
+ expect(thrown).toBeDefined()
177
+ expect((thrown as Error).name).toBe('DiagnosticError')
178
+ })
179
+ })
180
+ })
181
+
182
+ // ---------------------------------------------------------------------------
183
+ // B69: stopAfterCheck + CheckFailedError in catch → re-throw as-is
184
+ // This fires when err instanceof CheckFailedError in the catch block AND stopAfterCheck=true
185
+ // A CheckFailedError can only arrive here if something inside the try block throws it.
186
+ // lowerToHIR, lowerToMIR, etc. can throw one if mocked to do so.
187
+ // ---------------------------------------------------------------------------
188
+
189
+ describe('compile.ts catch block: B69 stopAfterCheck + CheckFailedError re-throw', () => {
190
+ beforeEach(() => {
191
+ jest.resetModules()
192
+ })
193
+
194
+ afterEach(() => {
195
+ jest.resetModules()
196
+ })
197
+
198
+ test('B69: stopAfterCheck + CheckFailedError thrown inside → re-throw unchanged', () => {
199
+ jest.isolateModules(() => {
200
+ jest.doMock('../../hir/lower', () => ({
201
+ lowerToHIR: jest.fn(() => {
202
+ const { CheckFailedError: CFE, DiagnosticError: DE } = require('../../diagnostics')
203
+ throw new CFE(
204
+ [new DE('LoweringError', 'injected check-failed error', { line: 1, col: 1 })],
205
+ ['prior warning'],
206
+ )
207
+ }),
208
+ }))
209
+
210
+ const { compile: compileFresh } = require('../../emit/compile')
211
+ let thrown: unknown
212
+ try {
213
+ compileFresh('fn f(): int { return 0; }', {
214
+ namespace: 'b69_cfe',
215
+ stopAfterCheck: true,
216
+ })
217
+ } catch (e) {
218
+ thrown = e
219
+ }
220
+ expect(thrown).toBeDefined()
221
+ expect((thrown as Error).name).toBe('CheckFailedError')
222
+ // The original CheckFailedError is re-thrown unchanged (B69 path)
223
+ // vs. a new CheckFailedError being created (B70/B71 paths)
224
+ // We can verify it has the original warnings
225
+ expect((thrown as CheckFailedError).warnings).toEqual(['prior warning'])
226
+ })
227
+ })
228
+ })
@@ -0,0 +1,249 @@
1
+ describe('emit/compile mocked branch coverage', () => {
2
+ afterEach(() => {
3
+ jest.resetModules()
4
+ jest.clearAllMocks()
5
+ jest.unmock('../../compile')
6
+ jest.unmock('../../lexer')
7
+ jest.unmock('../../parser')
8
+ jest.unmock('../../typechecker')
9
+ jest.unmock('../../hir/lower')
10
+ jest.unmock('../../hir/monomorphize')
11
+ jest.unmock('../../hir/deprecated')
12
+ jest.unmock('../../mir/lower')
13
+ jest.unmock('../../optimizer/pipeline')
14
+ jest.unmock('../../optimizer/coroutine')
15
+ jest.unmock('../../lir/lower')
16
+ jest.unmock('../../optimizer/lir/pipeline')
17
+ jest.unmock('../../lir/budget')
18
+ jest.unmock('../../events/types')
19
+ jest.unmock('../../emit/index')
20
+ jest.unmock('fs')
21
+ })
22
+
23
+ test('whole-module import paths resolve, recurse, skip symbol imports, and warn on missing nested modules', () => {
24
+ jest.isolateModules(() => {
25
+ const parseQueue = [
26
+ {
27
+ imports: [
28
+ { moduleName: 'mod', symbol: undefined, span: { line: 1, col: 1 } },
29
+ { moduleName: 'sym', symbol: 'named', span: { line: 2, col: 1 } },
30
+ ],
31
+ declarations: [],
32
+ structs: [],
33
+ implBlocks: [],
34
+ enums: [],
35
+ consts: [],
36
+ globals: [],
37
+ },
38
+ {
39
+ imports: [
40
+ { moduleName: 'nested', symbol: undefined },
41
+ { moduleName: 'skip_nested', symbol: 'named' },
42
+ { moduleName: 'missing_nested', symbol: undefined },
43
+ ],
44
+ declarations: [{ name: 'helper', decorators: [] }],
45
+ structs: [],
46
+ implBlocks: [],
47
+ enums: [],
48
+ consts: [],
49
+ globals: [],
50
+ },
51
+ {
52
+ imports: [],
53
+ declarations: [{ name: 'nested_helper', decorators: [] }],
54
+ structs: [],
55
+ implBlocks: [],
56
+ enums: [],
57
+ consts: [],
58
+ globals: [],
59
+ },
60
+ ]
61
+
62
+ jest.doMock('../../compile', () => ({
63
+ preprocessSourceWithMetadata: jest.fn((source: string) => ({ source })),
64
+ }))
65
+ jest.doMock('fs', () => ({
66
+ existsSync: jest.fn((file: string) => (
67
+ file === '/root/mod.mcrs' ||
68
+ file === '/root/nested.mcrs'
69
+ )),
70
+ readFileSync: jest.fn((file: string) => {
71
+ if (file === '/root/mod.mcrs') return 'mod-source'
72
+ if (file === '/root/nested.mcrs') return 'nested-source'
73
+ return ''
74
+ }),
75
+ }))
76
+ jest.doMock('../../lexer', () => ({
77
+ Lexer: jest.fn().mockImplementation(() => ({
78
+ tokenize: () => [],
79
+ })),
80
+ }))
81
+ jest.doMock('../../parser', () => ({
82
+ Parser: jest.fn().mockImplementation(() => ({
83
+ warnings: [],
84
+ parseErrors: [],
85
+ parse: () => parseQueue.shift(),
86
+ })),
87
+ }))
88
+ jest.doMock('../../typechecker', () => ({
89
+ TypeChecker: jest.fn().mockImplementation(() => ({
90
+ check: () => [],
91
+ getWarnings: () => [],
92
+ })),
93
+ }))
94
+ jest.doMock('../../hir/lower', () => ({ lowerToHIR: jest.fn(() => ({ functions: [], structs: [] })) }))
95
+ jest.doMock('../../hir/monomorphize', () => ({ monomorphize: jest.fn(x => x) }))
96
+ jest.doMock('../../hir/deprecated', () => ({ checkDeprecatedCalls: jest.fn(() => []) }))
97
+ jest.doMock('../../mir/lower', () => ({ lowerToMIR: jest.fn(() => ({ functions: [] })) }))
98
+ jest.doMock('../../optimizer/pipeline', () => ({ optimizeModule: jest.fn(x => x) }))
99
+ jest.doMock('../../optimizer/coroutine', () => ({
100
+ coroutineTransform: jest.fn(module => ({ module, generatedTickFunctions: [], warnings: [] })),
101
+ }))
102
+ jest.doMock('../../lir/lower', () => ({ lowerToLIR: jest.fn(() => ({ functions: [] })) }))
103
+ jest.doMock('../../optimizer/lir/pipeline', () => ({ lirOptimizeModule: jest.fn(x => x) }))
104
+ jest.doMock('../../lir/budget', () => ({ analyzeBudget: jest.fn(() => []) }))
105
+ jest.doMock('../../events/types', () => ({ isEventTypeName: jest.fn(() => false) }))
106
+ jest.doMock('../../emit/index', () => ({ emit: jest.fn(() => []) }))
107
+
108
+ const { compile } = require('../../emit/compile')
109
+ const result = compile('source', { namespace: 'mocked', filePath: '/root/main.mcrs' })
110
+
111
+ expect(result.warnings).toContain(
112
+ "[ImportWarning] Module 'missing_nested' not found (imported in /root/mod.mcrs)"
113
+ )
114
+ })
115
+ })
116
+
117
+ test('library imports, librarySources, lenient type errors, and decorator extraction flow into emit options', () => {
118
+ jest.isolateModules(() => {
119
+ const emit = jest.fn(() => [])
120
+ const parseQueue = [
121
+ {
122
+ imports: [],
123
+ declarations: [],
124
+ structs: [],
125
+ implBlocks: [],
126
+ enums: [],
127
+ consts: [],
128
+ globals: [],
129
+ },
130
+ {
131
+ imports: [],
132
+ declarations: [{ name: 'lib_fn', decorators: [] }],
133
+ structs: [],
134
+ implBlocks: [],
135
+ enums: [],
136
+ consts: [],
137
+ globals: [],
138
+ },
139
+ {
140
+ declarations: [{ name: 'inline_fn', decorators: [] }],
141
+ structs: [],
142
+ implBlocks: [],
143
+ enums: [],
144
+ consts: [],
145
+ globals: [],
146
+ },
147
+ ]
148
+
149
+ jest.doMock('../../compile', () => ({
150
+ preprocessSourceWithMetadata: jest.fn((source: string, options?: { filePath?: string }) => {
151
+ if (options?.filePath === '/root/main.mcrs') {
152
+ return {
153
+ source,
154
+ libraryImports: [{ source: 'module library;\nfn lib_fn(): int { return 1; }', filePath: '/root/lib.mcrs' }],
155
+ }
156
+ }
157
+ return { source }
158
+ }),
159
+ }))
160
+ jest.doMock('fs', () => ({
161
+ existsSync: jest.fn(() => false),
162
+ readFileSync: jest.fn(() => ''),
163
+ }))
164
+ jest.doMock('../../lexer', () => ({
165
+ Lexer: jest.fn().mockImplementation(() => ({
166
+ tokenize: () => [],
167
+ })),
168
+ }))
169
+ jest.doMock('../../parser', () => ({
170
+ Parser: jest.fn().mockImplementation(() => ({
171
+ warnings: [],
172
+ parseErrors: [],
173
+ parse: () => parseQueue.shift(),
174
+ })),
175
+ }))
176
+ jest.doMock('../../typechecker', () => ({
177
+ TypeChecker: jest.fn().mockImplementation(() => ({
178
+ check: () => [{ location: { line: 3, col: 5 }, message: 'bad types' }],
179
+ getWarnings: () => ['lint warning'],
180
+ })),
181
+ }))
182
+ jest.doMock('../../hir/lower', () => ({
183
+ lowerToHIR: jest.fn(() => ({
184
+ functions: [
185
+ {
186
+ name: 'tick_fn',
187
+ decorators: [
188
+ { name: 'tick' },
189
+ { name: 'load' },
190
+ { name: 'coroutine', args: { batch: 4, onDone: 'after' } },
191
+ { name: 'schedule', args: { ticks: 5 } },
192
+ { name: 'on', args: { eventType: 'PlayerJoin' } },
193
+ ],
194
+ },
195
+ {
196
+ name: 'ignored_event',
197
+ decorators: [{ name: 'on', args: { eventType: 'NotReal' } }],
198
+ },
199
+ ],
200
+ structs: [],
201
+ })),
202
+ }))
203
+ jest.doMock('../../hir/monomorphize', () => ({ monomorphize: jest.fn(x => x) }))
204
+ jest.doMock('../../hir/deprecated', () => ({ checkDeprecatedCalls: jest.fn(() => ['deprecated warning']) }))
205
+ jest.doMock('../../mir/lower', () => ({ lowerToMIR: jest.fn(() => ({ functions: [] })) }))
206
+ jest.doMock('../../optimizer/pipeline', () => ({ optimizeModule: jest.fn(x => x) }))
207
+ jest.doMock('../../optimizer/coroutine', () => ({
208
+ coroutineTransform: jest.fn(module => ({
209
+ module,
210
+ generatedTickFunctions: ['generated_tick'],
211
+ warnings: ['coro warning'],
212
+ })),
213
+ }))
214
+ jest.doMock('../../lir/lower', () => ({ lowerToLIR: jest.fn(() => ({ functions: [] })) }))
215
+ jest.doMock('../../optimizer/lir/pipeline', () => ({ lirOptimizeModule: jest.fn(x => x) }))
216
+ jest.doMock('../../lir/budget', () => ({ analyzeBudget: jest.fn(() => [{ level: 'warning', message: 'budget warning' }]) }))
217
+ jest.doMock('../../events/types', () => ({
218
+ isEventTypeName: jest.fn((name: string) => name === 'PlayerJoin'),
219
+ }))
220
+ jest.doMock('../../emit/index', () => ({ emit }))
221
+
222
+ const { compile } = require('../../emit/compile')
223
+ const result = compile('source', {
224
+ namespace: 'mocked',
225
+ filePath: '/root/main.mcrs',
226
+ lenient: true,
227
+ librarySources: ['module library;\nfn inline_fn(): int { return 2; }'],
228
+ })
229
+
230
+ expect(result.warnings).toEqual(expect.arrayContaining([
231
+ 'lint warning',
232
+ '[TypeError] line 3, col 5: bad types',
233
+ 'deprecated warning',
234
+ 'coro warning',
235
+ 'budget warning',
236
+ ]))
237
+ expect(emit).toHaveBeenCalledWith(
238
+ { functions: [] },
239
+ expect.objectContaining({
240
+ namespace: 'mocked',
241
+ tickFunctions: ['tick_fn', 'generated_tick'],
242
+ loadFunctions: ['tick_fn'],
243
+ scheduleFunctions: [{ name: 'tick_fn', ticks: 5 }],
244
+ eventHandlers: new Map([['PlayerJoin', ['mocked:tick_fn']]]),
245
+ })
246
+ )
247
+ })
248
+ })
249
+ })
@@ -72,7 +72,12 @@ describe('emit: compile coverage', () => {
72
72
 
73
73
  expect(empty).toBe('\n')
74
74
  expect(single).toContain('scoreboard players set')
75
- expect(nested).toContain('function emit_edge:single')
75
+ // After auto-inline, single() may be inlined into nested — check either case
76
+ const allContent = result.files.map(f => f.content).join('\n')
77
+ expect(
78
+ (nested ?? '').includes('function emit_edge:single') ||
79
+ allContent.includes('scoreboard players set $__const_1')
80
+ ).toBe(true)
76
81
  })
77
82
 
78
83
  test('special builtins raw, scoreboard interop, tell, and setblock emit expected commands', () => {
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Tests for Execute Chain Optimization
3
+ *
4
+ * MC allows chaining execute conditions:
5
+ * execute if A run execute if B run X
6
+ * → execute if A if B run X
7
+ *
8
+ * This reduces command parsing overhead and improves TPS.
9
+ */
10
+
11
+ import { flattenExecute } from '../../emit'
12
+ import { emit } from '../../emit'
13
+ import type { LIRModule, LIRFunction, LIRInstr } from '../../lir/types'
14
+ import { McVersion } from '../../types/mc-version'
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Unit tests: flattenExecute()
18
+ // ---------------------------------------------------------------------------
19
+
20
+ describe('flattenExecute()', () => {
21
+ test('double-level if: merges nested execute if into single execute', () => {
22
+ const input = 'execute if score A rs.vars matches 1 run execute if score B rs.vars matches 1 run function rs:foo'
23
+ const expected = 'execute if score A rs.vars matches 1 if score B rs.vars matches 1 run function rs:foo'
24
+ expect(flattenExecute(input)).toBe(expected)
25
+ })
26
+
27
+ test('triple-level if: recursively merges three levels into one execute', () => {
28
+ const input =
29
+ 'execute if score A rs.vars matches 1 run execute if score B rs.vars matches 1 run execute if score C rs.vars matches 1 run function rs:bar'
30
+ const expected =
31
+ 'execute if score A rs.vars matches 1 if score B rs.vars matches 1 if score C rs.vars matches 1 run function rs:bar'
32
+ expect(flattenExecute(input)).toBe(expected)
33
+ })
34
+
35
+ test('if + unless mix: does NOT merge (semantics differ)', () => {
36
+ const input = 'execute if score A rs.vars matches 1 run execute unless score B rs.vars matches 1 run function rs:baz'
37
+ // Should remain unchanged — "unless" is not the same as another "if"
38
+ expect(flattenExecute(input)).toBe(input)
39
+ })
40
+
41
+ test('non-execute command is returned unchanged', () => {
42
+ const input = 'scoreboard players set $x rs.vars 42'
43
+ expect(flattenExecute(input)).toBe(input)
44
+ })
45
+
46
+ test('plain execute without nested run execute is returned unchanged', () => {
47
+ const input = 'execute if score A rs.vars matches 1 run function rs:simple'
48
+ expect(flattenExecute(input)).toBe(input)
49
+ })
50
+
51
+ test('execute run execute with "as" subcmd is NOT merged (not an if clause)', () => {
52
+ const input = 'execute if score A rs.vars matches 1 run execute as @a run function rs:ctx'
53
+ // Inner starts with "as", not "if" — should not be merged
54
+ expect(flattenExecute(input)).toBe(input)
55
+ })
56
+
57
+ test('execute if score using score comparison: merges correctly', () => {
58
+ const input = 'execute if score $a rs.vars = $b rs.vars run execute if score $c rs.vars = $d rs.vars run function rs:check'
59
+ const expected = 'execute if score $a rs.vars = $b rs.vars if score $c rs.vars = $d rs.vars run function rs:check'
60
+ expect(flattenExecute(input)).toBe(expected)
61
+ })
62
+
63
+ test('four-level nesting: recursively flattens all levels', () => {
64
+ const input =
65
+ 'execute if score A o matches 1 run execute if score B o matches 2 run execute if score C o matches 3 run execute if score D o matches 4 run function ns:deep'
66
+ const expected =
67
+ 'execute if score A o matches 1 if score B o matches 2 if score C o matches 3 if score D o matches 4 run function ns:deep'
68
+ expect(flattenExecute(input)).toBe(expected)
69
+ })
70
+ })
71
+
72
+ // ---------------------------------------------------------------------------
73
+ // Integration tests: actual compilation output
74
+ // ---------------------------------------------------------------------------
75
+
76
+ describe('execute chain optimization: compilation output', () => {
77
+ function buildModule(instructions: LIRInstr[]): LIRModule {
78
+ const fn: LIRFunction = {
79
+ name: 'test_fn',
80
+ instructions,
81
+ isMacro: false,
82
+ macroParams: [],
83
+ params: [],
84
+ returnType: 'void',
85
+ }
86
+ return {
87
+ functions: [fn],
88
+ objective: 'rs.vars',
89
+ namespace: 'rs',
90
+ }
91
+ }
92
+
93
+ function getFile(files: { path: string; content: string }[], pathSubstr: string): string {
94
+ const f = files.find(f => f.path.includes(pathSubstr))
95
+ if (!f) throw new Error(`Missing file matching: ${pathSubstr}\nFiles: ${files.map(f => f.path).join(', ')}`)
96
+ return f.content
97
+ }
98
+
99
+ test('call_if_matches + nested raw execute if: flattened in emitted output', () => {
100
+ // Emit a raw execute that already contains a nested execute if to verify post-processing
101
+ const instructions: LIRInstr[] = [
102
+ {
103
+ kind: 'raw',
104
+ cmd: 'execute if score $cond rs.vars matches 1 run execute if score $cond2 rs.vars matches 2 run function rs:target',
105
+ },
106
+ ]
107
+ const files = emit(buildModule(instructions), { namespace: 'rs' })
108
+ const content = getFile(files, 'test_fn.mcfunction')
109
+ expect(content).toContain(
110
+ 'execute if score $cond rs.vars matches 1 if score $cond2 rs.vars matches 2 run function rs:target',
111
+ )
112
+ expect(content).not.toContain('run execute if')
113
+ })
114
+ })
@@ -114,6 +114,7 @@ describe('emit: direct LIR emission', () => {
114
114
  expect(getFile(files, 'data/emitns/function/load.mcfunction')).toBe('scoreboard objectives add __emit dummy\n')
115
115
 
116
116
  const main = getFile(files, 'data/emitns/function/main/run.mcfunction')
117
+ expect(main).toContain('# src: src/test.mcrs:3')
117
118
  expect(main).toContain('scoreboard players set $a __emit 7')
118
119
  expect(main).toContain('scoreboard players operation $b __emit = $a __emit')
119
120
  expect(main).toContain('scoreboard players operation $a __emit += $b __emit')
@@ -150,7 +151,7 @@ describe('emit: direct LIR emission', () => {
150
151
  const map = JSON.parse(getFile(files, 'data/emitns/function/main/run.sourcemap.json'))
151
152
  expect(map.generatedFile).toBe('data/emitns/function/main/run.mcfunction')
152
153
  expect(map.sources).toEqual(['src/test.mcrs'])
153
- expect(map.mappings[0]).toMatchObject({ line: 1, sourceLine: 3, sourceCol: 5 })
154
+ expect(map.mappings[0]).toMatchObject({ line: 2, sourceLine: 3, sourceCol: 5 })
154
155
  expect(files.find(f => f.path === 'data/emitns/function/empty.sourcemap.json')).toBeUndefined()
155
156
  })
156
157