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
@@ -7,6 +7,7 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.emit = emit;
10
+ exports.flattenExecute = flattenExecute;
10
11
  const sourcemap_1 = require("./sourcemap");
11
12
  const mc_version_1 = require("../types/mc-version");
12
13
  // ---------------------------------------------------------------------------
@@ -17,10 +18,17 @@ function emit(module, options) {
17
18
  const tickFns = options.tickFunctions ?? [];
18
19
  const loadFns = options.loadFunctions ?? [];
19
20
  const scheduleFns = options.scheduleFunctions ?? [];
21
+ const watchFns = options.watchFunctions ?? [];
22
+ const profiledFns = options.profiledFunctions ?? [];
23
+ const enableProfiling = options.enableProfiling ?? false;
24
+ const throttleFns = options.throttleFunctions ?? [];
25
+ const retryFns = options.retryFunctions ?? [];
26
+ const memoizeFns = options.memoizeFunctions ?? [];
20
27
  const objective = module.objective;
21
28
  const genSourceMap = options.generateSourceMap ?? false;
22
29
  const mcVersion = options.mcVersion ?? mc_version_1.DEFAULT_MC_VERSION;
23
30
  const files = [];
31
+ const namespaceMapBuilder = genSourceMap ? new sourcemap_1.NamespaceSourceMapBuilder() : null;
24
32
  // pack.mcmeta
25
33
  files.push({
26
34
  path: 'pack.mcmeta',
@@ -28,8 +36,22 @@ function emit(module, options) {
28
36
  pack: { pack_format: 26, description: `RedScript datapack: ${namespace}` },
29
37
  }, null, 2) + '\n',
30
38
  });
39
+ const singletonObjectives = options.singletonObjectives ?? [];
31
40
  // load.mcfunction — creates the scoreboard objective
32
- const loadCmds = [`scoreboard objectives add ${objective} dummy`];
41
+ const loadCmds = [
42
+ `scoreboard objectives add ${objective} dummy`,
43
+ ...watchFns.map(watch => `scoreboard objectives add ${watchPrevObjective(watch.name)} dummy`),
44
+ ...singletonObjectives.map(obj => `scoreboard objectives add ${obj} dummy`),
45
+ ...(enableProfiling && profiledFns.length > 0
46
+ ? [
47
+ 'scoreboard objectives add __time dummy',
48
+ 'scoreboard objectives add __profile dummy',
49
+ ]
50
+ : []),
51
+ ...throttleFns.map(t => `scoreboard objectives add ${throttleObjective(t.name)} dummy`),
52
+ ...retryFns.map(r => `scoreboard objectives add ${retryObjective(r.name)} dummy`),
53
+ ...(memoizeFns.length > 0 ? [`scoreboard objectives add __memo dummy`] : []),
54
+ ];
33
55
  files.push({
34
56
  path: `data/${namespace}/function/load.mcfunction`,
35
57
  content: loadCmds.join('\n') + '\n',
@@ -37,9 +59,10 @@ function emit(module, options) {
37
59
  // Each LIR function → .mcfunction file
38
60
  for (const fn of module.functions) {
39
61
  const fnPath = fnNameToPath(fn.name, namespace);
62
+ namespaceMapBuilder?.addFunctionMapping(qualifiedFunctionRef(fn.name, namespace), fn.sourceLoc, humanFunctionName(fn));
40
63
  if (genSourceMap) {
41
64
  const builder = new sourcemap_1.SourceMapBuilder(fnPath);
42
- const lines = emitFunctionWithSourceMap(fn, namespace, objective, builder, mcVersion);
65
+ const lines = emitFunction(fn, namespace, objective, mcVersion, enableProfiling && profiledFns.includes(fn.name), builder);
43
66
  files.push({ path: fnPath, content: lines.join('\n') + '\n' });
44
67
  const map = builder.build();
45
68
  if (map) {
@@ -47,10 +70,27 @@ function emit(module, options) {
47
70
  }
48
71
  }
49
72
  else {
50
- const lines = emitFunction(fn, namespace, objective, mcVersion);
73
+ const lines = emitFunction(fn, namespace, objective, mcVersion, enableProfiling && profiledFns.includes(fn.name));
51
74
  files.push({ path: fnPath, content: lines.join('\n') + '\n' });
52
75
  }
53
76
  }
77
+ const namespaceMap = namespaceMapBuilder?.build();
78
+ if (namespaceMap) {
79
+ files.push({
80
+ path: (0, sourcemap_1.namespaceSourceMapPath)(namespace),
81
+ content: (0, sourcemap_1.serializeSourceMap)(namespaceMap),
82
+ });
83
+ }
84
+ if (enableProfiling && profiledFns.length > 0) {
85
+ files.push({
86
+ path: `data/${namespace}/function/__profiler_reset.mcfunction`,
87
+ content: emitProfilerReset(profiledFns).join('\n') + '\n',
88
+ });
89
+ files.push({
90
+ path: `data/${namespace}/function/__profiler_report.mcfunction`,
91
+ content: emitProfilerReport(profiledFns).join('\n') + '\n',
92
+ });
93
+ }
54
94
  // @schedule wrapper functions: _schedule_xxx → schedule function ns:xxx Nt
55
95
  for (const { name, ticks } of scheduleFns) {
56
96
  files.push({
@@ -58,6 +98,118 @@ function emit(module, options) {
58
98
  content: `schedule function ${namespace}:${name} ${ticks}t\n`,
59
99
  });
60
100
  }
101
+ for (const watch of watchFns) {
102
+ const dispatcher = watchDispatcherName(watch.name);
103
+ const prevObjective = watchPrevObjective(watch.name);
104
+ const changedCondition = `unless score @s ${watch.objective} = @s ${prevObjective}`;
105
+ files.push({
106
+ path: fnNameToPath(dispatcher, namespace),
107
+ content: [
108
+ `execute as @a unless score @s ${prevObjective} = @s ${prevObjective} run scoreboard players operation @s ${prevObjective} = @s ${watch.objective}`,
109
+ `execute as @a ${changedCondition} run function ${namespace}:${watch.name}`,
110
+ `execute as @a ${changedCondition} run scoreboard players operation @s ${prevObjective} = @s ${watch.objective}`,
111
+ ].join('\n') + '\n',
112
+ });
113
+ }
114
+ // @throttle wrapper functions
115
+ for (const { name, ticks } of throttleFns) {
116
+ const obj = throttleObjective(name);
117
+ const inner = `${name}_inner`;
118
+ files.push({
119
+ path: fnNameToPath(throttleDispatcherName(name), namespace),
120
+ content: [
121
+ `scoreboard players add __throttle_${name} ${obj} 1`,
122
+ `execute if score __throttle_${name} ${obj} matches ${ticks}.. run function ${namespace}:${inner}`,
123
+ `execute if score __throttle_${name} ${obj} matches ${ticks}.. run scoreboard players set __throttle_${name} ${obj} 0`,
124
+ ].join('\n') + '\n',
125
+ });
126
+ // Rename the original function to _inner by emitting a redirect wrapper:
127
+ // The original LIR function keeps its original name; the dispatcher wraps it.
128
+ // We just need the dispatcher to call the real function as <name>_inner.
129
+ // Actually: the original compiled function stays as <name>. We generate
130
+ // a wrapper at <name>_inner that simply calls <name>.
131
+ files.push({
132
+ path: fnNameToPath(inner, namespace),
133
+ content: `function ${namespace}:${name}\n`,
134
+ });
135
+ }
136
+ // @retry wrapper functions
137
+ for (const { name, max } of retryFns) {
138
+ const obj = retryObjective(name);
139
+ const dispatcherName = retryDispatcherName(name);
140
+ // Dispatcher: if retries remaining > 0, call the function; if it returns 0, decrement counter
141
+ // We use a two-file approach:
142
+ // __retry_<name>: decrements counter then calls the real function
143
+ // __retry_<name>_init: sets the counter to max and schedules the first attempt
144
+ // Runtime logic:
145
+ // - On success (fn returns nonzero): reset counter to 0
146
+ // - On failure (fn returns 0): counter -= 1, schedule next tick
147
+ // Since we can't read a function return value in mcfunction directly,
148
+ // we use a storage-based approach: the function itself sets a "success" flag.
149
+ // Simpler scoreboard approach (matching task spec):
150
+ // __retry_<name> obj tracks remaining attempts
151
+ // Each tick, if counter > 0: call fn, if fn "failed" (set counter to 0 from outside) schedule retry
152
+ // Simplest correct approach:
153
+ // generate a tick-registered dispatcher that:
154
+ // 1. if counter > 0, call the function
155
+ // 2. function sets __retry_<name>_result to 1 on success (convention)
156
+ // 3. if result == 0, decrement counter; else reset counter
157
+ // For simplicity, use the same pattern as @throttle but inverted:
158
+ // The user's function sets a score $ret to signal success/failure.
159
+ // We wrap it: if counter > 0, run the function.
160
+ // After running, check $ret: if 0, keep counter; else reset to 0.
161
+ // Next tick the dispatcher will retry if counter > 0.
162
+ //
163
+ // Minimal correct implementation (matching task spec — fn returns 0 = failure):
164
+ // __retry_<name>_tick: registered as @tick
165
+ // execute if score __retry_<name> <obj> matches 1.. run function ns:<name>
166
+ // execute if score __retry_<name> <obj> matches 1.. if score $ret <obj> matches 0 run scoreboard players remove __retry_<name> <obj> 1
167
+ // execute if score __retry_<name> <obj> matches 1.. unless score $ret <obj> matches 0 run scoreboard players set __retry_<name> <obj> 0
168
+ // To start a retry sequence, something must set __retry_<name> <obj> to max.
169
+ // We generate __retry_<name>_start: scoreboard players set __retry_<name> <obj> <max>
170
+ files.push({
171
+ path: fnNameToPath(dispatcherName, namespace),
172
+ content: [
173
+ `execute if score __retry_${name} ${obj} matches 1.. run function ${namespace}:${name}`,
174
+ `execute if score __retry_${name} ${obj} matches 1.. if score $ret ${obj} matches 0 run scoreboard players remove __retry_${name} ${obj} 1`,
175
+ `execute if score __retry_${name} ${obj} matches 1.. unless score $ret ${obj} matches 0 run scoreboard players set __retry_${name} ${obj} 0`,
176
+ ].join('\n') + '\n',
177
+ });
178
+ files.push({
179
+ path: fnNameToPath(`${name}_start`, namespace),
180
+ content: `scoreboard players set __retry_${name} ${obj} ${max}\n`,
181
+ });
182
+ }
183
+ // @memoize wrapper functions (LRU-1 cache: last call arg/result)
184
+ // The original compiled function has been renamed to <name>_impl.
185
+ // We generate <name>.mcfunction as the public entry point with cache logic:
186
+ // Players in __memo objective:
187
+ // __memo_<name>_key — cached argument value
188
+ // __memo_<name>_val — cached return value
189
+ // __memo_<name>_hit — 1 if a cached result is available
190
+ // On call ($p0 = argument):
191
+ // 1. If __memo_<name>_hit == 1 AND __memo_<name>_key == $p0 → copy cached val to $ret, return
192
+ // 2. Otherwise: call <name>_impl, store $p0 → key, $ret → val, set hit=1
193
+ for (const name of memoizeFns) {
194
+ const keyPlayer = `__memo_${name}_key`;
195
+ const valPlayer = `__memo_${name}_val`;
196
+ const hitPlayer = `__memo_${name}_hit`;
197
+ const implName = `${name}_impl`;
198
+ files.push({
199
+ path: fnNameToPath(name, namespace),
200
+ content: [
201
+ `# @memoize wrapper for ${name} (LRU-1 cache)`,
202
+ `# Cache hit: valid flag set AND key matches current arg`,
203
+ `execute if score ${hitPlayer} __memo matches 1 if score ${keyPlayer} __memo = $p0 ${objective} run scoreboard players operation $ret ${objective} = ${valPlayer} __memo`,
204
+ `execute if score ${hitPlayer} __memo matches 1 if score ${keyPlayer} __memo = $p0 ${objective} run return 0`,
205
+ `# Cache miss: call implementation, store result`,
206
+ `function ${namespace}:${implName}`,
207
+ `scoreboard players operation ${keyPlayer} __memo = $p0 ${objective}`,
208
+ `scoreboard players operation ${valPlayer} __memo = $ret ${objective}`,
209
+ `scoreboard players set ${hitPlayer} __memo 1`,
210
+ ].join('\n') + '\n',
211
+ });
212
+ }
61
213
  // Tag files for tick/load
62
214
  if (loadFns.length > 0 || true) {
63
215
  // Always include load.json — it must reference the load.mcfunction
@@ -67,8 +219,14 @@ function emit(module, options) {
67
219
  content: JSON.stringify({ values: loadValues }, null, 2) + '\n',
68
220
  });
69
221
  }
70
- if (tickFns.length > 0) {
71
- const tickValues = tickFns.map(fn => `${namespace}:${fn}`);
222
+ const allTickFns = [
223
+ ...tickFns,
224
+ ...watchFns.map(watch => watchDispatcherName(watch.name)),
225
+ ...throttleFns.map(t => throttleDispatcherName(t.name)),
226
+ ...retryFns.map(r => retryDispatcherName(r.name)),
227
+ ];
228
+ if (allTickFns.length > 0) {
229
+ const tickValues = allTickFns.map(fn => `${namespace}:${fn}`);
72
230
  files.push({
73
231
  path: 'data/minecraft/tags/function/tick.json',
74
232
  content: JSON.stringify({ values: tickValues }, null, 2) + '\n',
@@ -98,18 +256,30 @@ function emit(module, options) {
98
256
  // ---------------------------------------------------------------------------
99
257
  // Function emission
100
258
  // ---------------------------------------------------------------------------
101
- function emitFunction(fn, namespace, objective, mcVersion) {
259
+ function emitFunction(fn, namespace, objective, mcVersion, isProfiled = false, builder) {
102
260
  const lines = [];
103
- for (const instr of fn.instructions) {
104
- lines.push(emitInstr(instr, namespace, objective, mcVersion));
261
+ const pushLine = (line, sourceLoc) => {
262
+ lines.push(line);
263
+ builder?.addLine(sourceLoc);
264
+ };
265
+ for (const line of emitFunctionHeader(fn))
266
+ pushLine(line);
267
+ if (isProfiled) {
268
+ for (const line of profilerStartLines(fn.name))
269
+ pushLine(line);
105
270
  }
106
- return lines;
107
- }
108
- function emitFunctionWithSourceMap(fn, namespace, objective, builder, mcVersion) {
109
- const lines = [];
271
+ let lastSourceMarker;
110
272
  for (const instr of fn.instructions) {
111
- lines.push(emitInstr(instr, namespace, objective, mcVersion));
112
- builder.addLine(instr.sourceLoc);
273
+ const marker = instr.sourceLoc ? formatSourceMarker(instr.sourceLoc) : undefined;
274
+ if (marker && marker !== lastSourceMarker) {
275
+ pushLine(`# src: ${marker}`);
276
+ lastSourceMarker = marker;
277
+ }
278
+ pushLine(flattenExecute(emitInstr(instr, namespace, objective, mcVersion)), instr.sourceLoc);
279
+ }
280
+ if (isProfiled) {
281
+ for (const line of profilerEndLines(fn.name))
282
+ pushLine(line);
113
283
  }
114
284
  return lines;
115
285
  }
@@ -118,6 +288,85 @@ function fnNameToPath(name, namespace) {
118
288
  const mcName = name.replace(/::/g, '/').toLowerCase();
119
289
  return `data/${namespace}/function/${mcName}.mcfunction`;
120
290
  }
291
+ function qualifiedFunctionRef(name, namespace) {
292
+ return `${namespace}:${name.replace(/::/g, '/').toLowerCase()}`;
293
+ }
294
+ function humanFunctionName(fn) {
295
+ const match = fn.sourceSnippet?.match(/^fn\s+([^(]+)/);
296
+ return match?.[1] ?? fn.name.split('::').pop() ?? fn.name;
297
+ }
298
+ function emitFunctionHeader(fn) {
299
+ if (!fn.sourceLoc)
300
+ return [];
301
+ const lines = [];
302
+ lines.push(`# Generated from: ${fn.sourceLoc.file}:${fn.sourceLoc.line} (fn ${humanFunctionName(fn)})`);
303
+ if (fn.sourceSnippet) {
304
+ lines.push(`# Source: ${fn.sourceSnippet}`);
305
+ }
306
+ return lines;
307
+ }
308
+ function formatSourceMarker(sourceLoc) {
309
+ return `${sourceLoc.file}:${sourceLoc.line}`;
310
+ }
311
+ function watchDispatcherName(name) {
312
+ return `__watch_${name}`;
313
+ }
314
+ function watchPrevObjective(name) {
315
+ return `__watch_${name}_prev`;
316
+ }
317
+ function throttleDispatcherName(name) {
318
+ return `__throttle_${name}`;
319
+ }
320
+ function throttleObjective(name) {
321
+ return `__throttle`;
322
+ }
323
+ function retryDispatcherName(name) {
324
+ return `__retry_${name}`;
325
+ }
326
+ function retryObjective(name) {
327
+ return `__retry`;
328
+ }
329
+ function profilerSafeName(name) {
330
+ return name.replace(/[^A-Za-z0-9_]/g, '_');
331
+ }
332
+ function profilerStartPlayer(name) {
333
+ return `#prof_start_${profilerSafeName(name)}`;
334
+ }
335
+ function profilerDeltaPlayer(name) {
336
+ return `#prof_delta_${profilerSafeName(name)}`;
337
+ }
338
+ function profilerTotalPlayer(name) {
339
+ return `#prof_total_${profilerSafeName(name)}`;
340
+ }
341
+ function profilerCountPlayer(name) {
342
+ return `#prof_count_${profilerSafeName(name)}`;
343
+ }
344
+ function profilerStartLines(name) {
345
+ return [
346
+ `# __profiler_start_${name}`,
347
+ `scoreboard players set ${profilerStartPlayer(name)} __time 0`,
348
+ `execute store result score ${profilerStartPlayer(name)} __time run time query gametime`,
349
+ ];
350
+ }
351
+ function profilerEndLines(name) {
352
+ return [
353
+ `# __profiler_end_${name}`,
354
+ `scoreboard players set ${profilerDeltaPlayer(name)} __time 0`,
355
+ `execute store result score ${profilerDeltaPlayer(name)} __time run time query gametime`,
356
+ `scoreboard players operation ${profilerDeltaPlayer(name)} __time -= ${profilerStartPlayer(name)} __time`,
357
+ `scoreboard players operation ${profilerTotalPlayer(name)} __profile += ${profilerDeltaPlayer(name)} __time`,
358
+ `scoreboard players add ${profilerCountPlayer(name)} __profile 1`,
359
+ ];
360
+ }
361
+ function emitProfilerReset(profiledFns) {
362
+ return profiledFns.flatMap(name => [
363
+ `scoreboard players set ${profilerTotalPlayer(name)} __profile 0`,
364
+ `scoreboard players set ${profilerCountPlayer(name)} __profile 0`,
365
+ ]);
366
+ }
367
+ function emitProfilerReport(profiledFns) {
368
+ return profiledFns.map(name => (`tellraw @a [{"text":"[profile] ${name}: total="},{"score":{"name":"${profilerTotalPlayer(name)}","objective":"__profile"}},{"text":" ticks count="},{"score":{"name":"${profilerCountPlayer(name)}","objective":"__profile"}}]`));
369
+ }
121
370
  // ---------------------------------------------------------------------------
122
371
  // Instruction emission
123
372
  // ---------------------------------------------------------------------------
@@ -215,6 +464,50 @@ function macroLineCompat(template) {
215
464
  // Replace $(param) with data-get-style substitution marker
216
465
  return template.replace(/\$\((\w+)\)/g, (_m, p) => `{storage:rs:macro_args,path:${p}}`);
217
466
  }
467
+ // ---------------------------------------------------------------------------
468
+ // Execute Chain Optimization
469
+ // ---------------------------------------------------------------------------
470
+ /**
471
+ * Flatten nested execute-if chains into a single execute with multiple conditions.
472
+ *
473
+ * MC allows chaining conditions:
474
+ * execute if A run execute if B run X
475
+ * can be written as:
476
+ * execute if A if B run X
477
+ *
478
+ * This reduces command-parsing overhead and improves TPS.
479
+ *
480
+ * Rules:
481
+ * - Only merges when the inner `run` clause is itself `execute if ...`
482
+ * - Does NOT merge `if ... run execute unless ...` — semantics differ
483
+ * (unless negates, changing behavior in chain context)
484
+ * - Recursively flattens deeper nesting (3+ levels)
485
+ */
486
+ function flattenExecute(cmd) {
487
+ // Match: execute <conditions> run execute if <rest>
488
+ // We only flatten when the inner execute starts with "if" (not "unless", "as", "at", etc.)
489
+ // Pattern: "execute <prefix> run execute if <suffix>"
490
+ const RUN_EXECUTE_IF = / run execute if /;
491
+ if (!RUN_EXECUTE_IF.test(cmd)) {
492
+ return cmd;
493
+ }
494
+ // Find the " run execute if " boundary
495
+ const idx = cmd.indexOf(' run execute if ');
496
+ if (idx === -1)
497
+ return cmd;
498
+ const outer = cmd.slice(0, idx); // "execute if A"
499
+ const inner = cmd.slice(idx + ' run '.length); // "execute if B run X"
500
+ // The outer must start with "execute"
501
+ if (!outer.startsWith('execute '))
502
+ return cmd;
503
+ // Inner starts with "execute if ..."
504
+ // Strip the "execute" prefix from inner to get the conditions + run tail
505
+ // Result: outer + " " + inner_conditions_and_tail
506
+ const innerWithoutExecute = inner.slice('execute '.length); // "if B run X"
507
+ const merged = `${outer} ${innerWithoutExecute}`;
508
+ // Recurse to handle 3+ levels
509
+ return flattenExecute(merged);
510
+ }
218
511
  function emitSubcmd(sub) {
219
512
  switch (sub.kind) {
220
513
  case 'as':
@@ -40,6 +40,9 @@ function compileModules(modules, options = {}) {
40
40
  const tokens = lexer.tokenize();
41
41
  const parser = new parser_1.Parser(tokens, mod.source, mod.filePath);
42
42
  const ast = parser.parse(namespace);
43
+ if (parser.parseErrors.length > 0) {
44
+ throw parser.parseErrors[0];
45
+ }
43
46
  // Verify declared module name matches provided name
44
47
  const declaredName = ast.moduleName;
45
48
  if (declaredName && declaredName !== mod.name) {
@@ -76,7 +79,13 @@ function compileModules(modules, options = {}) {
76
79
  if (!sourceExports) {
77
80
  throw new diagnostics_1.DiagnosticError('LoweringError', `Module '${imp.moduleName}' not found (imported in '${modName}')`, { file: ast.namespace, line: 1, col: 1 });
78
81
  }
79
- if (imp.symbol === '*') {
82
+ if (imp.symbol === undefined) {
83
+ // Whole-module file import (`import player_utils;`) — not a symbol import;
84
+ // this is resolved by the file-level compile() function, not compileModules.
85
+ // Skip here to avoid treating it as a cross-module symbol reference.
86
+ continue;
87
+ }
88
+ else if (imp.symbol === '*') {
80
89
  // Wildcard: import all exports
81
90
  for (const sym of sourceExports) {
82
91
  resolved.set(sym, `${imp.moduleName}/${sym}`);
@@ -101,6 +110,8 @@ function compileModules(modules, options = {}) {
101
110
  }
102
111
  for (const ast of parsedModules.values()) {
103
112
  for (const imp of ast.imports) {
113
+ if (imp.symbol === undefined)
114
+ continue; // whole-module file import, skip
104
115
  const used = usedExports.get(imp.moduleName);
105
116
  if (!used)
106
117
  continue;
@@ -261,6 +272,7 @@ function compileSingleModule(ast, namespace, objective, moduleName, filePath) {
261
272
  // Extract decorator metadata
262
273
  const tickFunctions = [];
263
274
  const loadFunctions = [];
275
+ const watchFunctions = [];
264
276
  const coroutineInfos = [];
265
277
  const scheduleFunctions = [];
266
278
  for (const fn of hir.functions) {
@@ -269,6 +281,9 @@ function compileSingleModule(ast, namespace, objective, moduleName, filePath) {
269
281
  tickFunctions.push(fn.name);
270
282
  if (dec.name === 'load')
271
283
  loadFunctions.push(fn.name);
284
+ if (dec.name === 'watch' && dec.args?.objective) {
285
+ watchFunctions.push({ name: fn.name, objective: dec.args.objective });
286
+ }
272
287
  if (dec.name === 'coroutine') {
273
288
  coroutineInfos.push({ fnName: fn.name, batch: dec.args?.batch ?? 10, onDone: dec.args?.onDone });
274
289
  }
@@ -287,7 +302,7 @@ function compileSingleModule(ast, namespace, objective, moduleName, filePath) {
287
302
  const lir = (0, lower_3.lowerToLIR)(mirFinal);
288
303
  lir.objective = objective;
289
304
  const lirOpt = (0, pipeline_2.lirOptimizeModule)(lir);
290
- const files = (0, index_1.emit)(lirOpt, { namespace, tickFunctions, loadFunctions, scheduleFunctions });
305
+ const files = (0, index_1.emit)(lirOpt, { namespace, tickFunctions, loadFunctions, watchFunctions, scheduleFunctions });
291
306
  // For named modules: rename the load.mcfunction to avoid path collision.
292
307
  // Rename `data/${ns}/function/load.mcfunction` → `data/${ns}/function/${modName}/_load.mcfunction`
293
308
  // and update the load tag reference accordingly.
@@ -429,7 +444,10 @@ function rewriteStmt(stmt, symbolMap) {
429
444
  case 'let_destruct':
430
445
  rewriteExpr(stmt.init, symbolMap);
431
446
  break;
432
- // break, continue, raw: nothing to rewrite
447
+ case 'labeled_loop':
448
+ rewriteStmt(stmt.body, symbolMap);
449
+ break;
450
+ // break, continue, break_label, continue_label, raw: nothing to rewrite
433
451
  }
434
452
  }
435
453
  function rewriteExpr(expr, symbolMap) {
@@ -1,40 +1,30 @@
1
1
  /**
2
- * Source Map Generation Stage 7 auxiliary output.
3
- *
4
- * For each generated .mcfunction file, produces a parallel sourcemap.json
5
- * that maps output line numbers back to .mcrs source locations.
6
- *
7
- * Format:
8
- * {
9
- * "version": 1,
10
- * "generatedFile": "data/ns/function/main.mcfunction",
11
- * "sources": ["src/main.mcrs"],
12
- * "mappings": [
13
- * { "line": 1, "source": 0, "sourceLine": 5, "sourceCol": 2 },
14
- * ...
15
- * ]
16
- * }
2
+ * Source map helpers for emitted `.mcfunction` files.
17
3
  */
18
4
  import type { SourceLoc } from '../lir/types';
19
5
  export interface SourceMapEntry {
20
- /** 1-based output line number in the .mcfunction file */
21
6
  line: number;
22
- /** Index into the `sources` array */
23
7
  source: number;
24
- /** 1-based line in the source .mcrs file */
25
8
  sourceLine: number;
26
- /** 1-based column in the source .mcrs file */
27
9
  sourceCol: number;
28
10
  }
29
11
  export interface SourceMap {
30
12
  version: 1;
31
- /** Relative path to the generated .mcfunction file */
32
13
  generatedFile: string;
33
- /** List of source file paths referenced by mappings */
34
14
  sources: string[];
35
- /** One entry per mapped output line */
36
15
  mappings: SourceMapEntry[];
37
16
  }
17
+ export interface NamespaceSourceMapEntry {
18
+ source: number;
19
+ line: number;
20
+ col?: number;
21
+ name?: string;
22
+ }
23
+ export interface NamespaceSourceMap {
24
+ version: 1;
25
+ sources: string[];
26
+ mappings: Record<string, NamespaceSourceMapEntry>;
27
+ }
38
28
  export declare class SourceMapBuilder {
39
29
  private readonly generatedFile;
40
30
  private readonly sourceIndex;
@@ -42,12 +32,18 @@ export declare class SourceMapBuilder {
42
32
  private readonly mappings;
43
33
  private lineNumber;
44
34
  constructor(generatedFile: string);
45
- /** Record the source location for the next output line. */
46
35
  addLine(sourceLoc: SourceLoc | undefined): void;
47
- /** Return the completed SourceMap, or null if there are no mappings. */
48
36
  build(): SourceMap | null;
37
+ private getSourceIndex;
38
+ }
39
+ export declare class NamespaceSourceMapBuilder {
40
+ private readonly sourceIndex;
41
+ private readonly sources;
42
+ private readonly mappings;
43
+ addFunctionMapping(functionName: string, sourceLoc: SourceLoc | undefined, name?: string): void;
44
+ build(): NamespaceSourceMap | null;
45
+ private getSourceIndex;
49
46
  }
50
- /** Serialize a SourceMap to JSON string (pretty-printed). */
51
- export declare function serializeSourceMap(map: SourceMap): string;
52
- /** Given a .mcfunction path, return the path for the sidecar sourcemap.json. */
47
+ export declare function serializeSourceMap(map: SourceMap | NamespaceSourceMap): string;
53
48
  export declare function sourceMapPath(mcfunctionPath: string): string;
49
+ export declare function namespaceSourceMapPath(namespace: string): string;
@@ -1,28 +1,12 @@
1
1
  "use strict";
2
2
  /**
3
- * Source Map Generation Stage 7 auxiliary output.
4
- *
5
- * For each generated .mcfunction file, produces a parallel sourcemap.json
6
- * that maps output line numbers back to .mcrs source locations.
7
- *
8
- * Format:
9
- * {
10
- * "version": 1,
11
- * "generatedFile": "data/ns/function/main.mcfunction",
12
- * "sources": ["src/main.mcrs"],
13
- * "mappings": [
14
- * { "line": 1, "source": 0, "sourceLine": 5, "sourceCol": 2 },
15
- * ...
16
- * ]
17
- * }
3
+ * Source map helpers for emitted `.mcfunction` files.
18
4
  */
19
5
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.SourceMapBuilder = void 0;
6
+ exports.NamespaceSourceMapBuilder = exports.SourceMapBuilder = void 0;
21
7
  exports.serializeSourceMap = serializeSourceMap;
22
8
  exports.sourceMapPath = sourceMapPath;
23
- // ---------------------------------------------------------------------------
24
- // Builder — accumulates mappings as lines are emitted
25
- // ---------------------------------------------------------------------------
9
+ exports.namespaceSourceMapPath = namespaceSourceMapPath;
26
10
  class SourceMapBuilder {
27
11
  constructor(generatedFile) {
28
12
  this.sourceIndex = new Map();
@@ -31,25 +15,17 @@ class SourceMapBuilder {
31
15
  this.lineNumber = 0;
32
16
  this.generatedFile = generatedFile;
33
17
  }
34
- /** Record the source location for the next output line. */
35
18
  addLine(sourceLoc) {
36
19
  this.lineNumber++;
37
20
  if (!sourceLoc)
38
21
  return;
39
- let idx = this.sourceIndex.get(sourceLoc.file);
40
- if (idx === undefined) {
41
- idx = this.sources.length;
42
- this.sources.push(sourceLoc.file);
43
- this.sourceIndex.set(sourceLoc.file, idx);
44
- }
45
22
  this.mappings.push({
46
23
  line: this.lineNumber,
47
- source: idx,
24
+ source: this.getSourceIndex(sourceLoc.file),
48
25
  sourceLine: sourceLoc.line,
49
26
  sourceCol: sourceLoc.col,
50
27
  });
51
28
  }
52
- /** Return the completed SourceMap, or null if there are no mappings. */
53
29
  build() {
54
30
  if (this.mappings.length === 0)
55
31
  return null;
@@ -60,14 +36,60 @@ class SourceMapBuilder {
60
36
  mappings: [...this.mappings],
61
37
  };
62
38
  }
39
+ getSourceIndex(file) {
40
+ let idx = this.sourceIndex.get(file);
41
+ if (idx === undefined) {
42
+ idx = this.sources.length;
43
+ this.sources.push(file);
44
+ this.sourceIndex.set(file, idx);
45
+ }
46
+ return idx;
47
+ }
63
48
  }
64
49
  exports.SourceMapBuilder = SourceMapBuilder;
65
- /** Serialize a SourceMap to JSON string (pretty-printed). */
50
+ class NamespaceSourceMapBuilder {
51
+ constructor() {
52
+ this.sourceIndex = new Map();
53
+ this.sources = [];
54
+ this.mappings = {};
55
+ }
56
+ addFunctionMapping(functionName, sourceLoc, name) {
57
+ if (!sourceLoc)
58
+ return;
59
+ this.mappings[functionName] = {
60
+ source: this.getSourceIndex(sourceLoc.file),
61
+ line: sourceLoc.line,
62
+ col: sourceLoc.col,
63
+ ...(name ? { name } : {}),
64
+ };
65
+ }
66
+ build() {
67
+ if (Object.keys(this.mappings).length === 0)
68
+ return null;
69
+ return {
70
+ version: 1,
71
+ sources: [...this.sources],
72
+ mappings: { ...this.mappings },
73
+ };
74
+ }
75
+ getSourceIndex(file) {
76
+ let idx = this.sourceIndex.get(file);
77
+ if (idx === undefined) {
78
+ idx = this.sources.length;
79
+ this.sources.push(file);
80
+ this.sourceIndex.set(file, idx);
81
+ }
82
+ return idx;
83
+ }
84
+ }
85
+ exports.NamespaceSourceMapBuilder = NamespaceSourceMapBuilder;
66
86
  function serializeSourceMap(map) {
67
87
  return JSON.stringify(map, null, 2) + '\n';
68
88
  }
69
- /** Given a .mcfunction path, return the path for the sidecar sourcemap.json. */
70
89
  function sourceMapPath(mcfunctionPath) {
71
90
  return mcfunctionPath.replace(/\.mcfunction$/, '.sourcemap.json');
72
91
  }
92
+ function namespaceSourceMapPath(namespace) {
93
+ return `${namespace}.sourcemap.json`;
94
+ }
73
95
  //# sourceMappingURL=sourcemap.js.map