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
@@ -4,14 +4,50 @@
4
4
  *
5
5
  * Pipeline: source → Lexer → Parser → TypeCheck → HIR → MIR → optimize → LIR → emit
6
6
  */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
7
40
  Object.defineProperty(exports, "__esModule", { value: true });
8
41
  exports.compile = compile;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
9
44
  const lexer_1 = require("../lexer");
10
45
  const parser_1 = require("../parser");
11
46
  const compile_1 = require("../compile");
12
47
  const diagnostics_1 = require("../diagnostics");
13
48
  const lower_1 = require("../hir/lower");
14
49
  const monomorphize_1 = require("../hir/monomorphize");
50
+ const deprecated_1 = require("../hir/deprecated");
15
51
  const lower_2 = require("../mir/lower");
16
52
  const pipeline_1 = require("../optimizer/pipeline");
17
53
  const lower_3 = require("../lir/lower");
@@ -22,39 +58,153 @@ const budget_1 = require("../lir/budget");
22
58
  const mc_version_1 = require("../types/mc-version");
23
59
  const typechecker_1 = require("../typechecker");
24
60
  const types_1 = require("../events/types");
61
+ function annotateFunctionSourceFiles(program, sourceFile) {
62
+ if (!sourceFile)
63
+ return;
64
+ for (const fn of program.declarations)
65
+ fn.sourceFile = sourceFile;
66
+ for (const impl of program.implBlocks) {
67
+ for (const method of impl.methods)
68
+ method.sourceFile = sourceFile;
69
+ }
70
+ }
71
+ function pruneLibraryFunctionFiles(files, libraryPaths) {
72
+ if (libraryPaths.size === 0)
73
+ return files;
74
+ const fnPathToFilePath = new Map();
75
+ for (const file of files) {
76
+ const match = file.path.match(/^data\/([^/]+)\/function\/(.+)\.mcfunction$/);
77
+ if (match) {
78
+ fnPathToFilePath.set(`${match[1]}:${match[2]}`, file.path);
79
+ }
80
+ }
81
+ const callGraph = new Map();
82
+ const callPattern = /\bfunction\s+([\w\-]+:[\w\-./]+)/g;
83
+ for (const file of files) {
84
+ if (!file.path.endsWith('.mcfunction'))
85
+ continue;
86
+ const called = new Set();
87
+ let match;
88
+ callPattern.lastIndex = 0;
89
+ while ((match = callPattern.exec(file.content)) !== null) {
90
+ called.add(match[1]);
91
+ }
92
+ callGraph.set(file.path, called);
93
+ }
94
+ const reachableFiles = new Set();
95
+ const queue = [];
96
+ for (const file of files) {
97
+ if (!file.path.endsWith('.mcfunction'))
98
+ continue;
99
+ if (libraryPaths.has(file.path))
100
+ continue;
101
+ queue.push(file.path);
102
+ reachableFiles.add(file.path);
103
+ }
104
+ while (queue.length > 0) {
105
+ const current = queue.shift();
106
+ const called = callGraph.get(current) ?? new Set();
107
+ for (const fnPath of called) {
108
+ const filePath = fnPathToFilePath.get(fnPath);
109
+ if (filePath && !reachableFiles.has(filePath)) {
110
+ reachableFiles.add(filePath);
111
+ queue.push(filePath);
112
+ }
113
+ }
114
+ }
115
+ return files.filter(file => !libraryPaths.has(file.path) || reachableFiles.has(file.path));
116
+ }
25
117
  function compile(source, options = {}) {
26
- const { namespace = 'redscript', filePath, generateSourceMap = false, mcVersion = mc_version_1.DEFAULT_MC_VERSION, lenient = false, includeDirs } = options;
118
+ const { namespace = 'redscript', filePath, generateSourceMap = false, mcVersion = mc_version_1.DEFAULT_MC_VERSION, lenient = false, includeDirs, stopAfterCheck = false, debug = false, } = options;
27
119
  const warnings = [];
28
120
  // Preprocess: resolve import directives, merge imported sources
29
121
  const preprocessed = (0, compile_1.preprocessSourceWithMetadata)(source, { filePath, includeDirs });
30
122
  const processedSource = preprocessed.source;
31
- // Stage 1: Lex + Parse → AST
32
- const lexer = new lexer_1.Lexer(processedSource);
33
- const tokens = lexer.tokenize();
34
- const parser = new parser_1.Parser(tokens, processedSource, filePath);
35
- const ast = parser.parse(namespace);
36
- warnings.push(...parser.warnings);
37
- // Merge library imports (files with `module library;`) into AST
38
- for (const li of preprocessed.libraryImports ?? []) {
39
- const libPreprocessed = (0, compile_1.preprocessSourceWithMetadata)(li.source, { filePath: li.filePath });
40
- const libTokens = new lexer_1.Lexer(libPreprocessed.source, li.filePath).tokenize();
41
- const libParser = new parser_1.Parser(libTokens, libPreprocessed.source, li.filePath);
42
- const libAst = libParser.parse(namespace);
43
- warnings.push(...libParser.warnings);
44
- for (const fn of libAst.declarations)
45
- fn.isLibraryFn = true;
46
- ast.declarations.push(...libAst.declarations);
47
- ast.structs.push(...libAst.structs);
48
- ast.implBlocks.push(...libAst.implBlocks);
49
- ast.enums.push(...libAst.enums);
50
- ast.consts.push(...libAst.consts);
51
- ast.globals.push(...libAst.globals);
52
- }
53
- // Merge librarySources (v1 compat: inline library strings) before HIR
54
- if (options.librarySources) {
55
- for (const libSrc of options.librarySources) {
56
- const libTokens = new lexer_1.Lexer(libSrc).tokenize();
57
- const libAst = new parser_1.Parser(libTokens, libSrc).parse(namespace);
123
+ try {
124
+ // Stage 1: Lex + Parse → AST
125
+ const lexer = new lexer_1.Lexer(processedSource);
126
+ const tokens = lexer.tokenize();
127
+ const parser = new parser_1.Parser(tokens, processedSource, filePath);
128
+ const ast = parser.parse(namespace);
129
+ annotateFunctionSourceFiles(ast, filePath);
130
+ warnings.push(...parser.warnings);
131
+ if (parser.parseErrors.length > 0) {
132
+ throw stopAfterCheck ? new diagnostics_1.DiagnosticBundleError(parser.parseErrors) : parser.parseErrors[0];
133
+ }
134
+ // Resolve whole-module file imports: `import player_utils;` (no `::` symbol)
135
+ const seenModuleImports = new Set();
136
+ function resolveModuleFilePath(modName, fromFile) {
137
+ const candidates = [`${modName}.mcrs`, modName];
138
+ const stdlibDir = path.resolve(__dirname, '..', 'src', 'stdlib');
139
+ for (const candidate of candidates) {
140
+ if (fromFile) {
141
+ const rel = path.resolve(path.dirname(fromFile), candidate);
142
+ if (fs.existsSync(rel))
143
+ return rel;
144
+ }
145
+ const stdlib = path.resolve(stdlibDir, candidate);
146
+ if (fs.existsSync(stdlib))
147
+ return stdlib;
148
+ for (const dir of includeDirs ?? []) {
149
+ const extra = path.resolve(dir, candidate);
150
+ if (fs.existsSync(extra))
151
+ return extra;
152
+ }
153
+ }
154
+ return null;
155
+ }
156
+ function mergeWholeModuleImport(modFilePath) {
157
+ if (seenModuleImports.has(modFilePath))
158
+ return;
159
+ seenModuleImports.add(modFilePath);
160
+ const modSource = fs.readFileSync(modFilePath, 'utf-8');
161
+ const modPreprocessed = (0, compile_1.preprocessSourceWithMetadata)(modSource, { filePath: modFilePath, includeDirs });
162
+ const modTokens = new lexer_1.Lexer(modPreprocessed.source, modFilePath).tokenize();
163
+ const modParser = new parser_1.Parser(modTokens, modPreprocessed.source, modFilePath);
164
+ const modAst = modParser.parse(namespace);
165
+ annotateFunctionSourceFiles(modAst, modFilePath);
166
+ warnings.push(...modParser.warnings);
167
+ if (modParser.parseErrors.length > 0) {
168
+ throw stopAfterCheck ? new diagnostics_1.DiagnosticBundleError(modParser.parseErrors) : modParser.parseErrors[0];
169
+ }
170
+ for (const fn of modAst.declarations)
171
+ fn.isLibraryFn = true;
172
+ for (const imp of modAst.imports) {
173
+ if (imp.symbol !== undefined)
174
+ continue;
175
+ const nestedPath = resolveModuleFilePath(imp.moduleName, modFilePath);
176
+ if (!nestedPath) {
177
+ warnings.push(`[ImportWarning] Module '${imp.moduleName}' not found (imported in ${modFilePath})`);
178
+ continue;
179
+ }
180
+ mergeWholeModuleImport(nestedPath);
181
+ }
182
+ ast.declarations.push(...modAst.declarations);
183
+ ast.structs.push(...modAst.structs);
184
+ ast.implBlocks.push(...modAst.implBlocks);
185
+ ast.enums.push(...modAst.enums);
186
+ ast.consts.push(...modAst.consts);
187
+ ast.globals.push(...modAst.globals);
188
+ }
189
+ for (const imp of ast.imports) {
190
+ if (imp.symbol !== undefined)
191
+ continue;
192
+ const resolved = resolveModuleFilePath(imp.moduleName, filePath);
193
+ if (!resolved) {
194
+ throw new diagnostics_1.DiagnosticError('ParseError', `Module '${imp.moduleName}' not found. Make sure '${imp.moduleName}.mcrs' exists relative to this file or in the stdlib.`, imp.span ?? { line: 1, col: 1 });
195
+ }
196
+ mergeWholeModuleImport(resolved);
197
+ }
198
+ for (const li of preprocessed.libraryImports ?? []) {
199
+ const libPreprocessed = (0, compile_1.preprocessSourceWithMetadata)(li.source, { filePath: li.filePath });
200
+ const libTokens = new lexer_1.Lexer(libPreprocessed.source, li.filePath).tokenize();
201
+ const libParser = new parser_1.Parser(libTokens, libPreprocessed.source, li.filePath);
202
+ const libAst = libParser.parse(namespace);
203
+ annotateFunctionSourceFiles(libAst, li.filePath);
204
+ warnings.push(...libParser.warnings);
205
+ if (libParser.parseErrors.length > 0) {
206
+ throw stopAfterCheck ? new diagnostics_1.DiagnosticBundleError(libParser.parseErrors) : libParser.parseErrors[0];
207
+ }
58
208
  for (const fn of libAst.declarations)
59
209
  fn.isLibraryFn = true;
60
210
  ast.declarations.push(...libAst.declarations);
@@ -64,45 +214,107 @@ function compile(source, options = {}) {
64
214
  ast.consts.push(...libAst.consts);
65
215
  ast.globals.push(...libAst.globals);
66
216
  }
67
- }
68
- // Stage 1b: Type checking
69
- // Run TypeChecker on the merged AST. In error-mode (default), throw on first type error.
70
- // In lenient mode, demote type errors to warnings.
71
- {
72
- const checker = new typechecker_1.TypeChecker(processedSource, filePath);
73
- const typeErrors = checker.check(ast);
74
- // Collect lint warnings (non-blocking always added regardless of error mode)
75
- warnings.push(...checker.getWarnings());
76
- if (typeErrors.length > 0) {
77
- if (lenient) {
78
- for (const e of typeErrors) {
79
- warnings.push(`[TypeError] line ${e.location.line}, col ${e.location.col}: ${e.message}`);
217
+ if (options.librarySources) {
218
+ for (const libSrc of options.librarySources) {
219
+ const libTokens = new lexer_1.Lexer(libSrc).tokenize();
220
+ const libParser = new parser_1.Parser(libTokens, libSrc);
221
+ const libAst = libParser.parse(namespace);
222
+ warnings.push(...libParser.warnings);
223
+ if (libParser.parseErrors.length > 0) {
224
+ throw stopAfterCheck ? new diagnostics_1.DiagnosticBundleError(libParser.parseErrors) : libParser.parseErrors[0];
80
225
  }
226
+ for (const fn of libAst.declarations)
227
+ fn.isLibraryFn = true;
228
+ ast.declarations.push(...libAst.declarations);
229
+ ast.structs.push(...libAst.structs);
230
+ ast.implBlocks.push(...libAst.implBlocks);
231
+ ast.enums.push(...libAst.enums);
232
+ ast.consts.push(...libAst.consts);
233
+ ast.globals.push(...libAst.globals);
81
234
  }
82
- else {
83
- throw typeErrors[0];
235
+ }
236
+ {
237
+ const configValues = options.config ?? {};
238
+ const configGlobalNames = new Set();
239
+ for (const g of ast.globals) {
240
+ if (g.configKey !== undefined) {
241
+ const resolvedValue = Object.prototype.hasOwnProperty.call(configValues, g.configKey)
242
+ ? configValues[g.configKey]
243
+ : (g.configDefault ?? 0);
244
+ const intValue = Math.round(resolvedValue);
245
+ ast.consts.push({
246
+ name: g.name,
247
+ type: { kind: 'named', name: 'int' },
248
+ value: { kind: 'int_lit', value: intValue },
249
+ span: g.span,
250
+ });
251
+ configGlobalNames.add(g.name);
252
+ }
253
+ }
254
+ if (configGlobalNames.size > 0) {
255
+ ast.globals = ast.globals.filter(g => !configGlobalNames.has(g.name));
256
+ }
257
+ }
258
+ {
259
+ const checker = new typechecker_1.TypeChecker(processedSource, filePath);
260
+ const typeErrors = checker.check(ast);
261
+ warnings.push(...checker.getWarnings());
262
+ if (typeErrors.length > 0) {
263
+ if (lenient) {
264
+ for (const e of typeErrors) {
265
+ warnings.push(`[TypeError] line ${e.location.line}, col ${e.location.col}: ${e.message}`);
266
+ }
267
+ }
268
+ else {
269
+ throw stopAfterCheck ? new diagnostics_1.DiagnosticBundleError(typeErrors) : typeErrors[0];
270
+ }
84
271
  }
85
272
  }
86
- }
87
- // Stage 2–7: lower, optimize, emit
88
- // Wrap non-DiagnosticError from later stages so CLI always gets structured errors.
89
- try {
90
273
  // Stage 2: AST → HIR
91
274
  const hirRaw = (0, lower_1.lowerToHIR)(ast);
92
275
  // Stage 2b: Monomorphize generic functions
93
276
  const hir = (0, monomorphize_1.monomorphize)(hirRaw);
94
- // Extract @tick, @load, @coroutine, @schedule, and @on handlers from HIR (before decorator info is lost)
277
+ const libraryFilePaths = new Set(hir.functions
278
+ .filter(fn => fn.isLibraryFn && fn.decorators.length === 0)
279
+ .map(fn => `data/${namespace}/function/${fn.name}.mcfunction`));
280
+ // Stage 2c: Deprecated usage check — emit warnings for calls to @deprecated functions
281
+ warnings.push(...(0, deprecated_1.checkDeprecatedCalls)(hir));
282
+ if (stopAfterCheck) {
283
+ return { files: [], warnings, success: true };
284
+ }
285
+ // Extract decorator metadata before HIR lowering discards it.
95
286
  const tickFunctions = [];
96
287
  const loadFunctions = [];
288
+ const watchFunctions = [];
289
+ const inlineFunctions = new Set();
290
+ const noInlineFunctions = new Set();
97
291
  const coroutineInfos = [];
98
292
  const scheduleFunctions = [];
293
+ const profiledFunctions = [];
294
+ const throttleFunctions = [];
295
+ const retryFunctions = [];
296
+ const memoizeFunctions = [];
99
297
  const eventHandlers = new Map();
100
298
  for (const fn of hir.functions) {
299
+ if (fn.watchObjective) {
300
+ watchFunctions.push({ name: fn.name, objective: fn.watchObjective });
301
+ }
302
+ else {
303
+ // Fallback: extract from decorator if watchObjective not propagated
304
+ const watchDec = fn.decorators?.find(d => d.name === 'watch' && d.args?.objective);
305
+ if (watchDec?.args?.objective) {
306
+ watchFunctions.push({ name: fn.name, objective: watchDec.args.objective });
307
+ }
308
+ }
101
309
  for (const dec of fn.decorators) {
102
310
  if (dec.name === 'tick')
103
311
  tickFunctions.push(fn.name);
104
312
  if (dec.name === 'load')
105
313
  loadFunctions.push(fn.name);
314
+ if (dec.name === 'inline')
315
+ inlineFunctions.add(fn.name);
316
+ if (dec.name === 'no-inline')
317
+ noInlineFunctions.add(fn.name);
106
318
  if (dec.name === 'coroutine') {
107
319
  coroutineInfos.push({
108
320
  fnName: fn.name,
@@ -113,6 +325,18 @@ function compile(source, options = {}) {
113
325
  if (dec.name === 'schedule') {
114
326
  scheduleFunctions.push({ name: fn.name, ticks: dec.args?.ticks ?? 1 });
115
327
  }
328
+ if (dec.name === 'profile') {
329
+ profiledFunctions.push(fn.name);
330
+ }
331
+ if (dec.name === 'throttle' && dec.args?.ticks) {
332
+ throttleFunctions.push({ name: fn.name, ticks: dec.args.ticks });
333
+ }
334
+ if (dec.name === 'retry' && dec.args?.max) {
335
+ retryFunctions.push({ name: fn.name, max: dec.args.max });
336
+ }
337
+ if (dec.name === 'memoize') {
338
+ memoizeFunctions.push(fn.name);
339
+ }
116
340
  if (dec.name === 'on' && dec.args?.eventType) {
117
341
  const evType = dec.args.eventType;
118
342
  if ((0, types_1.isEventTypeName)(evType)) {
@@ -125,6 +349,12 @@ function compile(source, options = {}) {
125
349
  }
126
350
  // Stage 3: HIR → MIR
127
351
  const mir = (0, lower_2.lowerToMIR)(hir, filePath);
352
+ if (inlineFunctions.size > 0) {
353
+ mir.inlineFunctions = inlineFunctions;
354
+ }
355
+ if (noInlineFunctions.size > 0) {
356
+ mir.noInlineFunctions = noInlineFunctions;
357
+ }
128
358
  // Stage 4: MIR optimization
129
359
  const mirOpt = (0, pipeline_1.optimizeModule)(mir);
130
360
  // Stage 4b: Coroutine transform (opt-in, only for @coroutine functions)
@@ -157,15 +387,130 @@ function compile(source, options = {}) {
157
387
  }
158
388
  }
159
389
  }
390
+ // Stage 6.9: Inject synthetic LIR functions for @singleton structs
391
+ // Each @singleton struct gets:
392
+ // - A "<StructName>_get" function that reads all fields from scoreboard
393
+ // - A "<StructName>_set" function that writes all fields back to scoreboard
394
+ // Fields are stored in scoreboard objectives named "_sng_<StructName>_<fieldName>"
395
+ // (max 16 chars for objective name — truncated with hash suffix if needed)
396
+ const singletonObjectives = [];
397
+ for (const s of hir.structs) {
398
+ if (!s.isSingleton)
399
+ continue;
400
+ const structName = s.name;
401
+ const objective = lirOpt.objective; // the main ns objective for return values
402
+ // Build _get function: reads each field from its own scoreboard objective
403
+ // Return struct fields via __rf_<field> slots in the main objective
404
+ const getInstrs = [];
405
+ for (const field of s.fields) {
406
+ const fieldObj = singletonObjectiveName(structName, field.name);
407
+ if (!singletonObjectives.includes(fieldObj)) {
408
+ singletonObjectives.push(fieldObj);
409
+ }
410
+ // copy: scoreboard players operation $__rf_<field> <obj> = __sng_<S>_<f> <fieldObj>
411
+ getInstrs.push({
412
+ kind: 'score_copy',
413
+ dst: { player: `$__rf_${field.name}`, obj: objective },
414
+ src: { player: `__sng`, obj: fieldObj },
415
+ });
416
+ }
417
+ // Return value placeholder
418
+ getInstrs.push({ kind: 'score_set', dst: { player: '$ret', obj: objective }, value: 0 });
419
+ // Use `::` naming so it matches how static_call `GameState::get` is qualified
420
+ // fnNameToPath converts `GameState::get` → `data/<ns>/function/gamestate/get.mcfunction`
421
+ lirOpt.functions.push({
422
+ name: `${structName}::get`,
423
+ instructions: getInstrs,
424
+ isMacro: false,
425
+ macroParams: [],
426
+ });
427
+ // Build _set function: writes each field back to its scoreboard objective
428
+ // Parameters come in via $p0..$pN slots (one per field)
429
+ const setInstrs = [];
430
+ for (let i = 0; i < s.fields.length; i++) {
431
+ const field = s.fields[i];
432
+ const fieldObj = singletonObjectiveName(structName, field.name);
433
+ setInstrs.push({
434
+ kind: 'score_copy',
435
+ dst: { player: `__sng`, obj: fieldObj },
436
+ src: { player: `$p${i}`, obj: objective },
437
+ });
438
+ }
439
+ setInstrs.push({ kind: 'score_set', dst: { player: '$ret', obj: objective }, value: 0 });
440
+ lirOpt.functions.push({
441
+ name: `${structName}::set`,
442
+ instructions: setInstrs,
443
+ isMacro: false,
444
+ macroParams: [],
445
+ });
446
+ }
447
+ // Stage 6.95: Rename @memoize functions to <fn>_impl in LIR,
448
+ // rewriting recursive self-calls so the wrapper becomes the public entry point.
449
+ for (const fnName of memoizeFunctions) {
450
+ const lirFn = lirOpt.functions.find(f => f.name === fnName);
451
+ if (!lirFn)
452
+ continue;
453
+ const implName = `${fnName}_impl`;
454
+ lirFn.name = implName;
455
+ // Rewrite recursive calls: any call to fnName inside this function → implName
456
+ for (const instr of lirFn.instructions) {
457
+ if ('fn' in instr && instr.fn === fnName) {
458
+ ;
459
+ instr.fn = implName;
460
+ }
461
+ }
462
+ }
160
463
  // Stage 7: LIR → .mcfunction
161
- const files = (0, index_1.emit)(lirOpt, { namespace, tickFunctions, loadFunctions, scheduleFunctions, generateSourceMap, mcVersion, eventHandlers });
162
- return { files, warnings, success: true };
464
+ const files = (0, index_1.emit)(lirOpt, {
465
+ namespace,
466
+ tickFunctions,
467
+ loadFunctions,
468
+ watchFunctions,
469
+ scheduleFunctions,
470
+ generateSourceMap,
471
+ mcVersion,
472
+ eventHandlers,
473
+ singletonObjectives,
474
+ profiledFunctions,
475
+ enableProfiling: debug,
476
+ throttleFunctions,
477
+ retryFunctions,
478
+ memoizeFunctions,
479
+ });
480
+ const prunedFiles = pruneLibraryFunctionFiles(files, libraryFilePaths);
481
+ return { files: prunedFiles, warnings, success: true };
163
482
  }
164
483
  catch (err) {
484
+ if (stopAfterCheck) {
485
+ if (err instanceof diagnostics_1.CheckFailedError)
486
+ throw err;
487
+ if (err instanceof diagnostics_1.DiagnosticBundleError) {
488
+ throw new diagnostics_1.CheckFailedError(err.diagnostics, warnings);
489
+ }
490
+ if (err instanceof diagnostics_1.DiagnosticError) {
491
+ throw new diagnostics_1.CheckFailedError([err], warnings);
492
+ }
493
+ const sourceLines = processedSource.split('\n');
494
+ throw new diagnostics_1.CheckFailedError([(0, diagnostics_1.parseErrorMessage)('LoweringError', err.message, sourceLines, filePath)], warnings);
495
+ }
165
496
  if (err instanceof diagnostics_1.DiagnosticError)
166
497
  throw err;
167
498
  const sourceLines = processedSource.split('\n');
168
499
  throw (0, diagnostics_1.parseErrorMessage)('LoweringError', err.message, sourceLines, filePath);
169
500
  }
170
501
  }
502
+ /**
503
+ * Compute a scoreboard objective name for a @singleton struct field.
504
+ * Format: _s_<struct>_<field>, truncated so total length ≤ 16 chars.
505
+ * If struct+field combined (with _s_ and _) exceeds 16:
506
+ * use first 4 chars of struct, first 8 chars of field.
507
+ */
508
+ function singletonObjectiveName(structName, fieldName) {
509
+ const overhead = 5; // "_s_" (3) + "_" (1) = 4, +1 for safety -- actually "_s_" + "_" = 4
510
+ // Budget: 16 - 4 = 12 chars for struct + field combined
511
+ if (structName.length + fieldName.length <= 12) {
512
+ return `_s_${structName}_${fieldName}`;
513
+ }
514
+ return `_s_${structName.slice(0, 4)}_${fieldName.slice(0, 8)}`;
515
+ }
171
516
  //# sourceMappingURL=compile.js.map
@@ -10,6 +10,10 @@ export interface DatapackFile {
10
10
  path: string;
11
11
  content: string;
12
12
  }
13
+ export interface WatchFunction {
14
+ name: string;
15
+ objective: string;
16
+ }
13
17
  export interface EmitOptions {
14
18
  namespace: string;
15
19
  tickFunctions?: string[];
@@ -18,11 +22,47 @@ export interface EmitOptions {
18
22
  name: string;
19
23
  ticks: number;
20
24
  }>;
25
+ watchFunctions?: WatchFunction[];
21
26
  /** When true, generate a .sourcemap.json sidecar file for each .mcfunction */
22
27
  generateSourceMap?: boolean;
23
28
  /** Target Minecraft version; controls which MC features are used in codegen */
24
29
  mcVersion?: McVersion;
25
30
  /** Map of EventTypeName → list of fully-qualified function references for @on handlers */
26
31
  eventHandlers?: Map<string, string[]>;
32
+ /** Scoreboard objective names for @singleton struct fields — added to load.mcfunction */
33
+ singletonObjectives?: string[];
34
+ /** Functions decorated with @profile. */
35
+ profiledFunctions?: string[];
36
+ /** Emit debug-only profiling instrumentation and helpers. */
37
+ enableProfiling?: boolean;
38
+ /** Functions decorated with @throttle. */
39
+ throttleFunctions?: Array<{
40
+ name: string;
41
+ ticks: number;
42
+ }>;
43
+ /** Functions decorated with @retry. */
44
+ retryFunctions?: Array<{
45
+ name: string;
46
+ max: number;
47
+ }>;
48
+ /** Functions decorated with @memoize — single-arg int result caching (LRU-1). */
49
+ memoizeFunctions?: string[];
27
50
  }
28
51
  export declare function emit(module: LIRModule, options: EmitOptions): DatapackFile[];
52
+ /**
53
+ * Flatten nested execute-if chains into a single execute with multiple conditions.
54
+ *
55
+ * MC allows chaining conditions:
56
+ * execute if A run execute if B run X
57
+ * can be written as:
58
+ * execute if A if B run X
59
+ *
60
+ * This reduces command-parsing overhead and improves TPS.
61
+ *
62
+ * Rules:
63
+ * - Only merges when the inner `run` clause is itself `execute if ...`
64
+ * - Does NOT merge `if ... run execute unless ...` — semantics differ
65
+ * (unless negates, changing behavior in chain context)
66
+ * - Recursively flattens deeper nesting (3+ levels)
67
+ */
68
+ export declare function flattenExecute(cmd: string): string;