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