redscript-mc 2.0.0 → 2.1.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 (629) hide show
  1. package/.claudeignore +21 -0
  2. package/README.md +12 -16
  3. package/README.zh.md +2 -2
  4. package/dist/cli.js +0 -0
  5. package/dist/src/__tests__/budget.test.js +261 -0
  6. package/dist/src/__tests__/diagnostics.test.js +2 -3
  7. package/dist/src/__tests__/e2e/coroutine.test.d.ts +7 -0
  8. package/dist/src/__tests__/e2e/coroutine.test.js +132 -0
  9. package/dist/{src2 → src}/__tests__/e2e/macros.test.js +1 -1
  10. package/dist/{src2 → src}/__tests__/e2e/migrate.test.js +1 -1
  11. package/dist/src/__tests__/e2e/stdlib-e2e.test.d.ts +10 -0
  12. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +324 -0
  13. package/dist/src/__tests__/enum.test.d.ts +10 -0
  14. package/dist/src/__tests__/enum.test.js +389 -0
  15. package/dist/src/__tests__/generics.test.d.ts +14 -0
  16. package/dist/src/__tests__/generics.test.js +367 -0
  17. package/dist/{src2 → src}/__tests__/hir/desugar.test.js +2 -2
  18. package/dist/src/__tests__/incremental.test.d.ts +5 -0
  19. package/dist/src/__tests__/incremental.test.js +308 -0
  20. package/dist/src/__tests__/lsp.test.d.ts +7 -0
  21. package/dist/src/__tests__/lsp.test.js +245 -0
  22. package/dist/src/__tests__/mc-version.test.d.ts +10 -0
  23. package/dist/src/__tests__/mc-version.test.js +154 -0
  24. package/dist/{src2 → src}/__tests__/mir/arithmetic.test.js +2 -2
  25. package/dist/{src2 → src}/__tests__/mir/control-flow.test.js +2 -2
  26. package/dist/src/__tests__/modules.test.d.ts +7 -0
  27. package/dist/src/__tests__/modules.test.js +333 -0
  28. package/dist/src/__tests__/optimizer/coroutine.test.d.ts +12 -0
  29. package/dist/src/__tests__/optimizer/coroutine.test.js +251 -0
  30. package/dist/src/__tests__/optimizer/interprocedural.test.js +145 -0
  31. package/dist/src/__tests__/optimizer/lir/const_imm.test.js +138 -0
  32. package/dist/src/__tests__/optimizer/lir/dead_slot.test.js +141 -0
  33. package/dist/src/__tests__/optimizer/lir/peephole.test.js +126 -0
  34. package/dist/src/__tests__/optimizer/lir/pipeline.test.js +84 -0
  35. package/dist/src/__tests__/optimizer/nbt-batch.test.js +110 -0
  36. package/dist/src/__tests__/optimizer/selector-cache.test.js +103 -0
  37. package/dist/src/__tests__/optimizer/unroll.test.js +206 -0
  38. package/dist/src/__tests__/option.test.d.ts +14 -0
  39. package/dist/src/__tests__/option.test.js +275 -0
  40. package/dist/src/__tests__/schedule.test.d.ts +7 -0
  41. package/dist/src/__tests__/schedule.test.js +98 -0
  42. package/dist/src/__tests__/sourcemap.test.d.ts +7 -0
  43. package/dist/src/__tests__/sourcemap.test.js +227 -0
  44. package/dist/src/__tests__/tuple.test.d.ts +11 -0
  45. package/dist/src/__tests__/tuple.test.js +202 -0
  46. package/dist/src/__tests__/typechecker-strict.test.d.ts +10 -0
  47. package/dist/src/__tests__/typechecker-strict.test.js +197 -0
  48. package/dist/src/ast/types.d.ts +56 -2
  49. package/dist/src/cache/deps.d.ts +41 -0
  50. package/dist/src/cache/deps.js +158 -0
  51. package/dist/src/cache/incremental.d.ts +35 -0
  52. package/dist/src/cache/incremental.js +165 -0
  53. package/dist/src/cache/index.d.ts +37 -0
  54. package/dist/src/cache/index.js +152 -0
  55. package/dist/src/cli.js +76 -45
  56. package/dist/src/compile.d.ts +2 -2
  57. package/dist/src/compile.js +1 -1
  58. package/dist/src/diagnostics/index.d.ts +1 -1
  59. package/dist/src/diagnostics/index.js +8 -11
  60. package/dist/src/emit/compile.d.ts +29 -0
  61. package/dist/src/emit/compile.js +143 -0
  62. package/dist/{src2 → src}/emit/index.d.ts +9 -0
  63. package/dist/{src2 → src}/emit/index.js +59 -8
  64. package/dist/src/emit/modules.d.ts +29 -0
  65. package/dist/src/emit/modules.js +492 -0
  66. package/dist/src/emit/sourcemap.d.ts +53 -0
  67. package/dist/src/emit/sourcemap.js +73 -0
  68. package/dist/{src2 → src}/hir/lower.d.ts +1 -1
  69. package/dist/{src2 → src}/hir/lower.js +22 -1
  70. package/dist/src/hir/monomorphize.d.ts +22 -0
  71. package/dist/src/hir/monomorphize.js +379 -0
  72. package/dist/{src2 → src}/hir/types.d.ts +35 -2
  73. package/dist/src/index.d.ts +19 -2
  74. package/dist/src/index.js +36 -14
  75. package/dist/src/lexer/index.d.ts +1 -1
  76. package/dist/src/lexer/index.js +1 -0
  77. package/dist/src/lir/budget.d.ts +37 -0
  78. package/dist/src/lir/budget.js +280 -0
  79. package/dist/{src2 → src}/lir/lower.js +19 -0
  80. package/dist/{src2 → src}/lir/types.d.ts +7 -4
  81. package/dist/src/lsp/main.d.ts +8 -0
  82. package/dist/src/lsp/main.js +11 -0
  83. package/dist/src/lsp/server.d.ts +11 -0
  84. package/dist/src/lsp/server.js +352 -0
  85. package/dist/{src2 → src}/mir/lower.d.ts +1 -1
  86. package/dist/{src2 → src}/mir/lower.js +244 -10
  87. package/dist/{src2 → src}/mir/types.d.ts +10 -2
  88. package/dist/src/optimizer/coroutine.d.ts +34 -0
  89. package/dist/src/optimizer/coroutine.js +789 -0
  90. package/dist/src/optimizer/dce.d.ts +8 -34
  91. package/dist/src/optimizer/dce.js +146 -629
  92. package/dist/src/optimizer/interprocedural.d.ts +14 -0
  93. package/dist/src/optimizer/interprocedural.js +186 -0
  94. package/dist/src/optimizer/lir/const_imm.d.ts +12 -0
  95. package/dist/src/optimizer/lir/const_imm.js +139 -0
  96. package/dist/src/optimizer/lir/dead_slot.d.ts +14 -0
  97. package/dist/src/optimizer/lir/dead_slot.js +130 -0
  98. package/dist/src/optimizer/lir/peephole.d.ts +21 -0
  99. package/dist/src/optimizer/lir/peephole.js +52 -0
  100. package/dist/src/optimizer/lir/pipeline.d.ts +10 -0
  101. package/dist/src/optimizer/lir/pipeline.js +34 -0
  102. package/dist/src/optimizer/nbt-batch.d.ts +11 -0
  103. package/dist/src/optimizer/nbt-batch.js +51 -0
  104. package/dist/{src2 → src}/optimizer/pipeline.d.ts +4 -0
  105. package/dist/{src2 → src}/optimizer/pipeline.js +17 -1
  106. package/dist/src/optimizer/selector-cache.d.ts +22 -0
  107. package/dist/src/optimizer/selector-cache.js +100 -0
  108. package/dist/src/optimizer/unroll.d.ts +32 -0
  109. package/dist/src/optimizer/unroll.js +348 -0
  110. package/dist/src/parser/index.d.ts +8 -0
  111. package/dist/src/parser/index.js +204 -14
  112. package/dist/src/repl.d.ts +1 -1
  113. package/dist/src/typechecker/index.d.ts +4 -0
  114. package/dist/src/typechecker/index.js +198 -13
  115. package/dist/src/types/mc-version.d.ts +24 -0
  116. package/dist/src/types/mc-version.js +49 -0
  117. package/docs/ROADMAP.md +395 -0
  118. package/docs/compiler-pipeline-redesign.md +27 -10
  119. package/editors/vscode/out/extension.js +25176 -8000
  120. package/editors/vscode/package-lock.json +90 -6
  121. package/editors/vscode/package.json +3 -2
  122. package/editors/vscode/src/extension.ts +97 -67
  123. package/examples/showcase.mcrs +3 -3
  124. package/jest.config.js +1 -1
  125. package/package.json +9 -3
  126. package/src/__tests__/budget.test.ts +297 -0
  127. package/src/__tests__/diagnostics.test.ts +2 -3
  128. package/src/__tests__/e2e/coroutine.test.ts +142 -0
  129. package/{src2 → src}/__tests__/e2e/macros.test.ts +1 -1
  130. package/{src2 → src}/__tests__/e2e/migrate.test.ts +1 -1
  131. package/src/__tests__/e2e/stdlib-e2e.test.ts +348 -0
  132. package/src/__tests__/enum.test.ts +425 -0
  133. package/src/__tests__/generics.test.ts +390 -0
  134. package/{src2 → src}/__tests__/hir/desugar.test.ts +2 -2
  135. package/src/__tests__/incremental.test.ts +337 -0
  136. package/src/__tests__/lsp.test.ts +270 -0
  137. package/src/__tests__/mc-version.test.ts +178 -0
  138. package/{src2 → src}/__tests__/mir/arithmetic.test.ts +2 -2
  139. package/{src2 → src}/__tests__/mir/control-flow.test.ts +2 -2
  140. package/src/__tests__/modules.test.ts +365 -0
  141. package/src/__tests__/optimizer/coroutine.test.ts +312 -0
  142. package/src/__tests__/optimizer/interprocedural.test.ts +174 -0
  143. package/src/__tests__/optimizer/lir/const_imm.test.ts +151 -0
  144. package/src/__tests__/optimizer/lir/dead_slot.test.ts +156 -0
  145. package/src/__tests__/optimizer/lir/peephole.test.ts +136 -0
  146. package/src/__tests__/optimizer/lir/pipeline.test.ts +113 -0
  147. package/src/__tests__/optimizer/nbt-batch.test.ts +119 -0
  148. package/src/__tests__/optimizer/selector-cache.test.ts +112 -0
  149. package/src/__tests__/optimizer/unroll.test.ts +231 -0
  150. package/src/__tests__/option.test.ts +299 -0
  151. package/src/__tests__/schedule.test.ts +105 -0
  152. package/src/__tests__/sourcemap.test.ts +254 -0
  153. package/src/__tests__/tuple.test.ts +220 -0
  154. package/src/__tests__/typechecker-strict.test.ts +216 -0
  155. package/src/ast/types.ts +33 -2
  156. package/src/cache/deps.ts +132 -0
  157. package/src/cache/incremental.ts +173 -0
  158. package/src/cache/index.ts +135 -0
  159. package/src/cli.ts +88 -45
  160. package/src/compile.ts +2 -2
  161. package/src/diagnostics/index.ts +8 -11
  162. package/src/emit/compile.ts +177 -0
  163. package/{src2 → src}/emit/index.ts +72 -8
  164. package/src/emit/modules.ts +581 -0
  165. package/src/emit/sourcemap.ts +101 -0
  166. package/{src2 → src}/hir/lower.ts +29 -2
  167. package/src/hir/monomorphize.ts +416 -0
  168. package/{src2 → src}/hir/types.ts +15 -3
  169. package/src/index.ts +29 -10
  170. package/src/lexer/index.ts +2 -1
  171. package/src/lir/budget.ts +321 -0
  172. package/{src2 → src}/lir/lower.ts +32 -1
  173. package/{src2 → src}/lir/types.ts +7 -3
  174. package/src/lsp/main.ts +9 -0
  175. package/src/lsp/server.ts +414 -0
  176. package/{src2 → src}/mir/lower.ts +251 -8
  177. package/{src2 → src}/mir/types.ts +12 -1
  178. package/src/optimizer/coroutine.ts +996 -0
  179. package/{src2 → src}/optimizer/dce.ts +2 -1
  180. package/src/optimizer/interprocedural.ts +177 -0
  181. package/src/optimizer/lir/const_imm.ts +143 -0
  182. package/src/optimizer/lir/dead_slot.ts +123 -0
  183. package/src/optimizer/lir/peephole.ts +57 -0
  184. package/src/optimizer/lir/pipeline.ts +37 -0
  185. package/src/optimizer/nbt-batch.ts +50 -0
  186. package/{src2 → src}/optimizer/pipeline.ts +16 -1
  187. package/src/optimizer/selector-cache.ts +103 -0
  188. package/src/optimizer/unroll.ts +386 -0
  189. package/src/parser/index.ts +212 -15
  190. package/src/repl.ts +1 -1
  191. package/src/stdlib/math.mcrs +4 -4
  192. package/src/templates/quest.mcrs +4 -4
  193. package/src/typechecker/index.ts +215 -15
  194. package/src/types/mc-version.ts +46 -0
  195. package/tsconfig.json +1 -1
  196. package/.claude/commands/build-test.md +0 -10
  197. package/.claude/commands/deploy-demo.md +0 -12
  198. package/.claude/commands/stage-status.md +0 -13
  199. package/.claude/settings.json +0 -12
  200. package/CLAUDE.md +0 -231
  201. package/dist/__tests__/cli.test.js +0 -278
  202. package/dist/__tests__/codegen.test.js +0 -152
  203. package/dist/__tests__/compile-all.test.d.ts +0 -10
  204. package/dist/__tests__/compile-all.test.js +0 -108
  205. package/dist/__tests__/dce.test.js +0 -138
  206. package/dist/__tests__/diagnostics.test.d.ts +0 -4
  207. package/dist/__tests__/diagnostics.test.js +0 -149
  208. package/dist/__tests__/e2e.test.d.ts +0 -6
  209. package/dist/__tests__/e2e.test.js +0 -1847
  210. package/dist/__tests__/entity-types.test.js +0 -203
  211. package/dist/__tests__/formatter.test.js +0 -40
  212. package/dist/__tests__/lexer.test.js +0 -343
  213. package/dist/__tests__/lowering.test.js +0 -1015
  214. package/dist/__tests__/macro.test.d.ts +0 -8
  215. package/dist/__tests__/macro.test.js +0 -305
  216. package/dist/__tests__/mc-integration.test.d.ts +0 -12
  217. package/dist/__tests__/mc-integration.test.js +0 -819
  218. package/dist/__tests__/mc-syntax.test.js +0 -124
  219. package/dist/__tests__/nbt.test.js +0 -82
  220. package/dist/__tests__/optimizer-advanced.test.js +0 -124
  221. package/dist/__tests__/optimizer.test.d.ts +0 -1
  222. package/dist/__tests__/optimizer.test.js +0 -149
  223. package/dist/__tests__/parser.test.d.ts +0 -1
  224. package/dist/__tests__/parser.test.js +0 -807
  225. package/dist/__tests__/repl.test.d.ts +0 -1
  226. package/dist/__tests__/repl.test.js +0 -27
  227. package/dist/__tests__/runtime.test.d.ts +0 -1
  228. package/dist/__tests__/runtime.test.js +0 -289
  229. package/dist/__tests__/stdlib-advanced.test.d.ts +0 -4
  230. package/dist/__tests__/stdlib-advanced.test.js +0 -378
  231. package/dist/__tests__/stdlib-bigint.test.d.ts +0 -7
  232. package/dist/__tests__/stdlib-bigint.test.js +0 -428
  233. package/dist/__tests__/stdlib-math.test.d.ts +0 -7
  234. package/dist/__tests__/stdlib-math.test.js +0 -352
  235. package/dist/__tests__/stdlib-vec.test.d.ts +0 -4
  236. package/dist/__tests__/stdlib-vec.test.js +0 -264
  237. package/dist/__tests__/structure-optimizer.test.d.ts +0 -1
  238. package/dist/__tests__/structure-optimizer.test.js +0 -33
  239. package/dist/__tests__/typechecker.test.d.ts +0 -1
  240. package/dist/__tests__/typechecker.test.js +0 -552
  241. package/dist/__tests__/var-allocator.test.d.ts +0 -1
  242. package/dist/__tests__/var-allocator.test.js +0 -69
  243. package/dist/ast/types.d.ts +0 -514
  244. package/dist/ast/types.js +0 -9
  245. package/dist/builtins/metadata.d.ts +0 -36
  246. package/dist/builtins/metadata.js +0 -1014
  247. package/dist/cli.d.ts +0 -11
  248. package/dist/codegen/cmdblock/index.d.ts +0 -26
  249. package/dist/codegen/cmdblock/index.js +0 -45
  250. package/dist/codegen/mcfunction/index.d.ts +0 -40
  251. package/dist/codegen/mcfunction/index.js +0 -606
  252. package/dist/codegen/structure/index.d.ts +0 -24
  253. package/dist/codegen/structure/index.js +0 -279
  254. package/dist/codegen/var-allocator.d.ts +0 -45
  255. package/dist/codegen/var-allocator.js +0 -104
  256. package/dist/compile.d.ts +0 -68
  257. package/dist/data/arena/function/__load.mcfunction +0 -6
  258. package/dist/data/arena/function/__tick.mcfunction +0 -2
  259. package/dist/data/arena/function/announce_leaders/else_1.mcfunction +0 -3
  260. package/dist/data/arena/function/announce_leaders/foreach_0/merge_2.mcfunction +0 -1
  261. package/dist/data/arena/function/announce_leaders/foreach_0/then_0.mcfunction +0 -3
  262. package/dist/data/arena/function/announce_leaders/foreach_0.mcfunction +0 -7
  263. package/dist/data/arena/function/announce_leaders/foreach_1/merge_2.mcfunction +0 -1
  264. package/dist/data/arena/function/announce_leaders/foreach_1/then_0.mcfunction +0 -4
  265. package/dist/data/arena/function/announce_leaders/foreach_1.mcfunction +0 -6
  266. package/dist/data/arena/function/announce_leaders/merge_2.mcfunction +0 -1
  267. package/dist/data/arena/function/announce_leaders/then_0.mcfunction +0 -4
  268. package/dist/data/arena/function/announce_leaders.mcfunction +0 -6
  269. package/dist/data/arena/function/arena_tick/merge_2.mcfunction +0 -1
  270. package/dist/data/arena/function/arena_tick/then_0.mcfunction +0 -4
  271. package/dist/data/arena/function/arena_tick.mcfunction +0 -11
  272. package/dist/data/counter/function/__load.mcfunction +0 -5
  273. package/dist/data/counter/function/__tick.mcfunction +0 -2
  274. package/dist/data/counter/function/counter_tick/merge_2.mcfunction +0 -1
  275. package/dist/data/counter/function/counter_tick/then_0.mcfunction +0 -3
  276. package/dist/data/counter/function/counter_tick.mcfunction +0 -11
  277. package/dist/data/gcd2/function/__load.mcfunction +0 -3
  278. package/dist/data/gcd2/function/abs/merge_2.mcfunction +0 -3
  279. package/dist/data/gcd2/function/abs/then_0.mcfunction +0 -5
  280. package/dist/data/gcd2/function/abs.mcfunction +0 -7
  281. package/dist/data/gcd2/function/gcd/loop_body_1.mcfunction +0 -7
  282. package/dist/data/gcd2/function/gcd/loop_check_0.mcfunction +0 -5
  283. package/dist/data/gcd2/function/gcd/loop_exit_2.mcfunction +0 -3
  284. package/dist/data/gcd2/function/gcd.mcfunction +0 -14
  285. package/dist/data/gcd3/function/__load.mcfunction +0 -3
  286. package/dist/data/gcd3/function/abs/merge_2.mcfunction +0 -3
  287. package/dist/data/gcd3/function/abs/then_0.mcfunction +0 -5
  288. package/dist/data/gcd3/function/abs.mcfunction +0 -7
  289. package/dist/data/gcd3/function/gcd/loop_body_1.mcfunction +0 -7
  290. package/dist/data/gcd3/function/gcd/loop_check_0.mcfunction +0 -5
  291. package/dist/data/gcd3/function/gcd/loop_exit_2.mcfunction +0 -3
  292. package/dist/data/gcd3/function/gcd.mcfunction +0 -14
  293. package/dist/data/gcd3/function/test.mcfunction +0 -7
  294. package/dist/data/gcd3nm/function/__load.mcfunction +0 -3
  295. package/dist/data/gcd3nm/function/abs/merge_2.mcfunction +0 -3
  296. package/dist/data/gcd3nm/function/abs/then_0.mcfunction +0 -5
  297. package/dist/data/gcd3nm/function/abs.mcfunction +0 -7
  298. package/dist/data/gcd3nm/function/gcd/loop_body_1.mcfunction +0 -7
  299. package/dist/data/gcd3nm/function/gcd/loop_check_0.mcfunction +0 -5
  300. package/dist/data/gcd3nm/function/gcd/loop_exit_2.mcfunction +0 -3
  301. package/dist/data/gcd3nm/function/gcd.mcfunction +0 -14
  302. package/dist/data/gcd3nm/function/test.mcfunction +0 -7
  303. package/dist/data/gcd_test/function/__load.mcfunction +0 -3
  304. package/dist/data/gcd_test/function/abs/merge_2.mcfunction +0 -3
  305. package/dist/data/gcd_test/function/abs/then_0.mcfunction +0 -5
  306. package/dist/data/gcd_test/function/abs.mcfunction +0 -7
  307. package/dist/data/gcd_test/function/gcd/loop_body_1.mcfunction +0 -7
  308. package/dist/data/gcd_test/function/gcd/loop_check_0.mcfunction +0 -5
  309. package/dist/data/gcd_test/function/gcd/loop_exit_2.mcfunction +0 -3
  310. package/dist/data/gcd_test/function/gcd.mcfunction +0 -14
  311. package/dist/data/isqrttest/function/__load.mcfunction +0 -6
  312. package/dist/data/isqrttest/function/isqrt/loop_body_4.mcfunction +0 -12
  313. package/dist/data/isqrttest/function/isqrt/loop_check_3.mcfunction +0 -5
  314. package/dist/data/isqrttest/function/isqrt/loop_exit_5.mcfunction +0 -3
  315. package/dist/data/isqrttest/function/isqrt/merge_2.mcfunction +0 -4
  316. package/dist/data/isqrttest/function/isqrt/merge_8.mcfunction +0 -6
  317. package/dist/data/isqrttest/function/isqrt/then_0.mcfunction +0 -3
  318. package/dist/data/isqrttest/function/isqrt/then_6.mcfunction +0 -3
  319. package/dist/data/isqrttest/function/isqrt.mcfunction +0 -7
  320. package/dist/data/isqrttest/function/test.mcfunction +0 -6
  321. package/dist/data/mathtest/function/__load.mcfunction +0 -3
  322. package/dist/data/mathtest/function/abs/merge_2.mcfunction +0 -3
  323. package/dist/data/mathtest/function/abs/then_0.mcfunction +0 -5
  324. package/dist/data/mathtest/function/abs.mcfunction +0 -6
  325. package/dist/data/mathtest/function/test.mcfunction +0 -5
  326. package/dist/data/minecraft/tags/function/load.json +0 -5
  327. package/dist/data/minecraft/tags/function/tick.json +0 -5
  328. package/dist/data/mypack/function/__load.mcfunction +0 -13
  329. package/dist/data/mypack/function/_atan_init.mcfunction +0 -2
  330. package/dist/data/mypack/function/abs/merge_2.mcfunction +0 -3
  331. package/dist/data/mypack/function/abs/then_0.mcfunction +0 -5
  332. package/dist/data/mypack/function/abs.mcfunction +0 -6
  333. package/dist/data/mypack/function/atan2_fixed/__sgi_1.mcfunction +0 -2
  334. package/dist/data/mypack/function/atan2_fixed/else_34.mcfunction +0 -3
  335. package/dist/data/mypack/function/atan2_fixed/loop_body_31.mcfunction +0 -19
  336. package/dist/data/mypack/function/atan2_fixed/loop_check_30.mcfunction +0 -5
  337. package/dist/data/mypack/function/atan2_fixed/loop_exit_32.mcfunction +0 -6
  338. package/dist/data/mypack/function/atan2_fixed/merge_11.mcfunction +0 -6
  339. package/dist/data/mypack/function/atan2_fixed/merge_14.mcfunction +0 -3
  340. package/dist/data/mypack/function/atan2_fixed/merge_17.mcfunction +0 -6
  341. package/dist/data/mypack/function/atan2_fixed/merge_2.mcfunction +0 -5
  342. package/dist/data/mypack/function/atan2_fixed/merge_20.mcfunction +0 -5
  343. package/dist/data/mypack/function/atan2_fixed/merge_23.mcfunction +0 -5
  344. package/dist/data/mypack/function/atan2_fixed/merge_26.mcfunction +0 -6
  345. package/dist/data/mypack/function/atan2_fixed/merge_29.mcfunction +0 -4
  346. package/dist/data/mypack/function/atan2_fixed/merge_38.mcfunction +0 -5
  347. package/dist/data/mypack/function/atan2_fixed/merge_41.mcfunction +0 -5
  348. package/dist/data/mypack/function/atan2_fixed/merge_44.mcfunction +0 -5
  349. package/dist/data/mypack/function/atan2_fixed/merge_47.mcfunction +0 -5
  350. package/dist/data/mypack/function/atan2_fixed/merge_5.mcfunction +0 -5
  351. package/dist/data/mypack/function/atan2_fixed/merge_8.mcfunction +0 -3
  352. package/dist/data/mypack/function/atan2_fixed/then_0.mcfunction +0 -5
  353. package/dist/data/mypack/function/atan2_fixed/then_12.mcfunction +0 -3
  354. package/dist/data/mypack/function/atan2_fixed/then_15.mcfunction +0 -5
  355. package/dist/data/mypack/function/atan2_fixed/then_18.mcfunction +0 -5
  356. package/dist/data/mypack/function/atan2_fixed/then_21.mcfunction +0 -3
  357. package/dist/data/mypack/function/atan2_fixed/then_24.mcfunction +0 -3
  358. package/dist/data/mypack/function/atan2_fixed/then_27.mcfunction +0 -6
  359. package/dist/data/mypack/function/atan2_fixed/then_3.mcfunction +0 -3
  360. package/dist/data/mypack/function/atan2_fixed/then_33.mcfunction +0 -5
  361. package/dist/data/mypack/function/atan2_fixed/then_36.mcfunction +0 -5
  362. package/dist/data/mypack/function/atan2_fixed/then_39.mcfunction +0 -5
  363. package/dist/data/mypack/function/atan2_fixed/then_42.mcfunction +0 -3
  364. package/dist/data/mypack/function/atan2_fixed/then_45.mcfunction +0 -5
  365. package/dist/data/mypack/function/atan2_fixed/then_6.mcfunction +0 -3
  366. package/dist/data/mypack/function/atan2_fixed/then_9.mcfunction +0 -5
  367. package/dist/data/mypack/function/atan2_fixed.mcfunction +0 -7
  368. package/dist/data/mypack/function/my_game.mcfunction +0 -10
  369. package/dist/data/quiz/function/__load.mcfunction +0 -16
  370. package/dist/data/quiz/function/__tick.mcfunction +0 -6
  371. package/dist/data/quiz/function/__trigger_quiz_a_dispatch.mcfunction +0 -4
  372. package/dist/data/quiz/function/__trigger_quiz_b_dispatch.mcfunction +0 -4
  373. package/dist/data/quiz/function/__trigger_quiz_c_dispatch.mcfunction +0 -4
  374. package/dist/data/quiz/function/__trigger_quiz_start_dispatch.mcfunction +0 -4
  375. package/dist/data/quiz/function/answer_a.mcfunction +0 -4
  376. package/dist/data/quiz/function/answer_b.mcfunction +0 -4
  377. package/dist/data/quiz/function/answer_c.mcfunction +0 -4
  378. package/dist/data/quiz/function/ask_question/else_1.mcfunction +0 -5
  379. package/dist/data/quiz/function/ask_question/else_4.mcfunction +0 -5
  380. package/dist/data/quiz/function/ask_question/else_7.mcfunction +0 -4
  381. package/dist/data/quiz/function/ask_question/merge_2.mcfunction +0 -1
  382. package/dist/data/quiz/function/ask_question/merge_5.mcfunction +0 -2
  383. package/dist/data/quiz/function/ask_question/merge_8.mcfunction +0 -2
  384. package/dist/data/quiz/function/ask_question/then_0.mcfunction +0 -4
  385. package/dist/data/quiz/function/ask_question/then_3.mcfunction +0 -4
  386. package/dist/data/quiz/function/ask_question/then_6.mcfunction +0 -4
  387. package/dist/data/quiz/function/ask_question.mcfunction +0 -7
  388. package/dist/data/quiz/function/finish_quiz.mcfunction +0 -6
  389. package/dist/data/quiz/function/handle_answer/else_1.mcfunction +0 -5
  390. package/dist/data/quiz/function/handle_answer/else_10.mcfunction +0 -3
  391. package/dist/data/quiz/function/handle_answer/else_16.mcfunction +0 -3
  392. package/dist/data/quiz/function/handle_answer/else_4.mcfunction +0 -3
  393. package/dist/data/quiz/function/handle_answer/else_7.mcfunction +0 -5
  394. package/dist/data/quiz/function/handle_answer/merge_11.mcfunction +0 -2
  395. package/dist/data/quiz/function/handle_answer/merge_14.mcfunction +0 -2
  396. package/dist/data/quiz/function/handle_answer/merge_17.mcfunction +0 -2
  397. package/dist/data/quiz/function/handle_answer/merge_2.mcfunction +0 -8
  398. package/dist/data/quiz/function/handle_answer/merge_5.mcfunction +0 -2
  399. package/dist/data/quiz/function/handle_answer/merge_8.mcfunction +0 -2
  400. package/dist/data/quiz/function/handle_answer/then_0.mcfunction +0 -5
  401. package/dist/data/quiz/function/handle_answer/then_12.mcfunction +0 -5
  402. package/dist/data/quiz/function/handle_answer/then_15.mcfunction +0 -6
  403. package/dist/data/quiz/function/handle_answer/then_3.mcfunction +0 -6
  404. package/dist/data/quiz/function/handle_answer/then_6.mcfunction +0 -5
  405. package/dist/data/quiz/function/handle_answer/then_9.mcfunction +0 -6
  406. package/dist/data/quiz/function/handle_answer.mcfunction +0 -11
  407. package/dist/data/quiz/function/start_quiz.mcfunction +0 -5
  408. package/dist/data/reqtest/function/__load.mcfunction +0 -4
  409. package/dist/data/reqtest/function/_table_init.mcfunction +0 -2
  410. package/dist/data/reqtest/function/no_trig.mcfunction +0 -3
  411. package/dist/data/reqtest/function/use_table.mcfunction +0 -4
  412. package/dist/data/reqtest2/function/__load.mcfunction +0 -3
  413. package/dist/data/reqtest2/function/no_trig.mcfunction +0 -3
  414. package/dist/data/runtime/function/__load.mcfunction +0 -5
  415. package/dist/data/runtime/function/__tick.mcfunction +0 -2
  416. package/dist/data/runtime/function/counter_tick/then_0.mcfunction +0 -3
  417. package/dist/data/runtime/function/counter_tick.mcfunction +0 -13
  418. package/dist/data/shop/function/__load.mcfunction +0 -7
  419. package/dist/data/shop/function/__tick.mcfunction +0 -3
  420. package/dist/data/shop/function/__trigger_shop_buy_dispatch.mcfunction +0 -4
  421. package/dist/data/shop/function/complete_purchase/else_1.mcfunction +0 -5
  422. package/dist/data/shop/function/complete_purchase/else_4.mcfunction +0 -5
  423. package/dist/data/shop/function/complete_purchase/else_7.mcfunction +0 -3
  424. package/dist/data/shop/function/complete_purchase/merge_2.mcfunction +0 -2
  425. package/dist/data/shop/function/complete_purchase/merge_5.mcfunction +0 -2
  426. package/dist/data/shop/function/complete_purchase/merge_8.mcfunction +0 -2
  427. package/dist/data/shop/function/complete_purchase/then_0.mcfunction +0 -4
  428. package/dist/data/shop/function/complete_purchase/then_3.mcfunction +0 -4
  429. package/dist/data/shop/function/complete_purchase/then_6.mcfunction +0 -4
  430. package/dist/data/shop/function/complete_purchase.mcfunction +0 -7
  431. package/dist/data/shop/function/handle_shop_trigger.mcfunction +0 -3
  432. package/dist/data/swap_test/function/__load.mcfunction +0 -3
  433. package/dist/data/swap_test/function/gcd_old/loop_body_1.mcfunction +0 -7
  434. package/dist/data/swap_test/function/gcd_old/loop_check_0.mcfunction +0 -5
  435. package/dist/data/swap_test/function/gcd_old/loop_exit_2.mcfunction +0 -3
  436. package/dist/data/swap_test/function/gcd_old.mcfunction +0 -8
  437. package/dist/data/turret/function/__load.mcfunction +0 -5
  438. package/dist/data/turret/function/__tick.mcfunction +0 -4
  439. package/dist/data/turret/function/__trigger_deploy_turret_dispatch.mcfunction +0 -4
  440. package/dist/data/turret/function/deploy_turret.mcfunction +0 -8
  441. package/dist/data/turret/function/turret_tick/at_1.mcfunction +0 -2
  442. package/dist/data/turret/function/turret_tick/foreach_0.mcfunction +0 -2
  443. package/dist/data/turret/function/turret_tick/foreach_2.mcfunction +0 -2
  444. package/dist/data/turret/function/turret_tick/tick_body.mcfunction +0 -3
  445. package/dist/data/turret/function/turret_tick/tick_skip.mcfunction +0 -1
  446. package/dist/data/turret/function/turret_tick.mcfunction +0 -5
  447. package/dist/diagnostics/index.d.ts +0 -44
  448. package/dist/diagnostics/index.js +0 -140
  449. package/dist/events/types.d.ts +0 -35
  450. package/dist/events/types.js +0 -59
  451. package/dist/formatter/index.d.ts +0 -1
  452. package/dist/formatter/index.js +0 -26
  453. package/dist/gcd2.map.json +0 -15
  454. package/dist/gcd3.map.json +0 -17
  455. package/dist/gcd_test.map.json +0 -15
  456. package/dist/index.d.ts +0 -62
  457. package/dist/ir/builder.d.ts +0 -33
  458. package/dist/ir/builder.js +0 -99
  459. package/dist/ir/types.d.ts +0 -132
  460. package/dist/ir/types.js +0 -15
  461. package/dist/isqrttest.map.json +0 -15
  462. package/dist/lexer/index.d.ts +0 -37
  463. package/dist/lexer/index.js +0 -569
  464. package/dist/lowering/index.d.ts +0 -188
  465. package/dist/lowering/index.js +0 -3405
  466. package/dist/mathtest.map.json +0 -6
  467. package/dist/mc-test/client.d.ts +0 -128
  468. package/dist/mc-test/client.js +0 -174
  469. package/dist/mc-test/runner.d.ts +0 -28
  470. package/dist/mc-test/runner.js +0 -150
  471. package/dist/mc-test/setup.d.ts +0 -11
  472. package/dist/mc-test/setup.js +0 -98
  473. package/dist/mc-validator/index.d.ts +0 -17
  474. package/dist/mc-validator/index.js +0 -322
  475. package/dist/mypack.map.json +0 -27
  476. package/dist/nbt/index.d.ts +0 -86
  477. package/dist/nbt/index.js +0 -250
  478. package/dist/optimizer/commands.d.ts +0 -38
  479. package/dist/optimizer/commands.js +0 -451
  480. package/dist/optimizer/dce.d.ts +0 -34
  481. package/dist/optimizer/dce.js +0 -639
  482. package/dist/optimizer/passes.d.ts +0 -34
  483. package/dist/optimizer/passes.js +0 -243
  484. package/dist/optimizer/structure.d.ts +0 -9
  485. package/dist/optimizer/structure.js +0 -356
  486. package/dist/pack.mcmeta +0 -6
  487. package/dist/parser/index.d.ts +0 -93
  488. package/dist/parser/index.js +0 -1687
  489. package/dist/repl.d.ts +0 -16
  490. package/dist/repl.js +0 -165
  491. package/dist/reqtest.map.json +0 -4
  492. package/dist/reqtest2.map.json +0 -4
  493. package/dist/runtime/index.d.ts +0 -107
  494. package/dist/runtime/index.js +0 -1409
  495. package/dist/runtime.map.json +0 -7
  496. package/dist/src/__tests__/codegen.test.d.ts +0 -1
  497. package/dist/src/__tests__/codegen.test.js +0 -152
  498. package/dist/src/__tests__/e2e.test.d.ts +0 -6
  499. package/dist/src/__tests__/e2e.test.js +0 -1789
  500. package/dist/src/__tests__/entity-types.test.d.ts +0 -1
  501. package/dist/src/__tests__/entity-types.test.js +0 -203
  502. package/dist/src/__tests__/lowering.test.d.ts +0 -1
  503. package/dist/src/__tests__/lowering.test.js +0 -1015
  504. package/dist/src/__tests__/macro.test.d.ts +0 -8
  505. package/dist/src/__tests__/macro.test.js +0 -306
  506. package/dist/src/__tests__/nbt.test.d.ts +0 -1
  507. package/dist/src/__tests__/nbt.test.js +0 -82
  508. package/dist/src/__tests__/optimizer-advanced.test.d.ts +0 -1
  509. package/dist/src/__tests__/optimizer-advanced.test.js +0 -124
  510. package/dist/src/__tests__/optimizer.test.d.ts +0 -1
  511. package/dist/src/__tests__/optimizer.test.js +0 -149
  512. package/dist/src/__tests__/runtime.test.d.ts +0 -1
  513. package/dist/src/__tests__/runtime.test.js +0 -289
  514. package/dist/src/__tests__/stdlib-advanced.test.d.ts +0 -4
  515. package/dist/src/__tests__/stdlib-advanced.test.js +0 -374
  516. package/dist/src/__tests__/stdlib-bigint.test.d.ts +0 -7
  517. package/dist/src/__tests__/stdlib-bigint.test.js +0 -426
  518. package/dist/src/__tests__/stdlib-math.test.d.ts +0 -7
  519. package/dist/src/__tests__/stdlib-math.test.js +0 -351
  520. package/dist/src/__tests__/stdlib-vec.test.d.ts +0 -4
  521. package/dist/src/__tests__/stdlib-vec.test.js +0 -263
  522. package/dist/src/__tests__/structure-optimizer.test.d.ts +0 -1
  523. package/dist/src/__tests__/structure-optimizer.test.js +0 -33
  524. package/dist/src/__tests__/var-allocator.test.d.ts +0 -1
  525. package/dist/src/__tests__/var-allocator.test.js +0 -69
  526. package/dist/src/codegen/cmdblock/index.d.ts +0 -26
  527. package/dist/src/codegen/cmdblock/index.js +0 -45
  528. package/dist/src/codegen/mcfunction/index.d.ts +0 -40
  529. package/dist/src/codegen/mcfunction/index.js +0 -606
  530. package/dist/src/codegen/structure/index.d.ts +0 -24
  531. package/dist/src/codegen/structure/index.js +0 -279
  532. package/dist/src/codegen/var-allocator.d.ts +0 -45
  533. package/dist/src/codegen/var-allocator.js +0 -104
  534. package/dist/src/ir/builder.d.ts +0 -33
  535. package/dist/src/ir/builder.js +0 -99
  536. package/dist/src/ir/types.d.ts +0 -132
  537. package/dist/src/ir/types.js +0 -15
  538. package/dist/src/lowering/index.d.ts +0 -188
  539. package/dist/src/lowering/index.js +0 -3405
  540. package/dist/src/optimizer/commands.d.ts +0 -38
  541. package/dist/src/optimizer/commands.js +0 -451
  542. package/dist/src/optimizer/passes.d.ts +0 -34
  543. package/dist/src/optimizer/passes.js +0 -243
  544. package/dist/src/optimizer/structure.d.ts +0 -9
  545. package/dist/src/optimizer/structure.js +0 -356
  546. package/dist/src2/__tests__/optimizer/dce.test.d.ts +0 -1
  547. package/dist/src2/emit/compile.d.ts +0 -19
  548. package/dist/src2/emit/compile.js +0 -80
  549. package/dist/src2/optimizer/dce.d.ts +0 -8
  550. package/dist/src2/optimizer/dce.js +0 -155
  551. package/dist/swap_test.map.json +0 -14
  552. package/dist/tsconfig.tsbuildinfo +0 -1
  553. package/dist/typechecker/index.d.ts +0 -61
  554. package/dist/typechecker/index.js +0 -1034
  555. package/dist/types/entity-hierarchy.d.ts +0 -29
  556. package/dist/types/entity-hierarchy.js +0 -107
  557. package/src2/emit/compile.ts +0 -99
  558. /package/dist/{__tests__/cli.test.d.ts → src/__tests__/budget.test.d.ts} +0 -0
  559. /package/dist/{src2 → src}/__tests__/e2e/basic.test.d.ts +0 -0
  560. /package/dist/{src2 → src}/__tests__/e2e/basic.test.js +0 -0
  561. /package/dist/{src2 → src}/__tests__/e2e/macros.test.d.ts +0 -0
  562. /package/dist/{src2 → src}/__tests__/e2e/migrate.test.d.ts +0 -0
  563. /package/dist/{src2 → src}/__tests__/hir/desugar.test.d.ts +0 -0
  564. /package/dist/{src2 → src}/__tests__/lir/lower.test.d.ts +0 -0
  565. /package/dist/{src2 → src}/__tests__/lir/lower.test.js +0 -0
  566. /package/dist/{src2 → src}/__tests__/lir/types.test.d.ts +0 -0
  567. /package/dist/{src2 → src}/__tests__/lir/types.test.js +0 -0
  568. /package/dist/{src2 → src}/__tests__/lir/verify.test.d.ts +0 -0
  569. /package/dist/{src2 → src}/__tests__/lir/verify.test.js +0 -0
  570. /package/dist/{src2 → src}/__tests__/mir/arithmetic.test.d.ts +0 -0
  571. /package/dist/{src2 → src}/__tests__/mir/control-flow.test.d.ts +0 -0
  572. /package/dist/{src2 → src}/__tests__/mir/verify.test.d.ts +0 -0
  573. /package/dist/{src2 → src}/__tests__/mir/verify.test.js +0 -0
  574. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.d.ts +0 -0
  575. /package/dist/{src2 → src}/__tests__/optimizer/block_merge.test.js +0 -0
  576. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.d.ts +0 -0
  577. /package/dist/{src2 → src}/__tests__/optimizer/branch_simplify.test.js +0 -0
  578. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.d.ts +0 -0
  579. /package/dist/{src2 → src}/__tests__/optimizer/constant_fold.test.js +0 -0
  580. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.d.ts +0 -0
  581. /package/dist/{src2 → src}/__tests__/optimizer/copy_prop.test.js +0 -0
  582. /package/dist/{__tests__ → src/__tests__/optimizer}/dce.test.d.ts +0 -0
  583. /package/dist/{src2 → src}/__tests__/optimizer/dce.test.js +0 -0
  584. /package/dist/{__tests__/codegen.test.d.ts → src/__tests__/optimizer/interprocedural.test.d.ts} +0 -0
  585. /package/dist/{__tests__/entity-types.test.d.ts → src/__tests__/optimizer/lir/const_imm.test.d.ts} +0 -0
  586. /package/dist/{__tests__/formatter.test.d.ts → src/__tests__/optimizer/lir/dead_slot.test.d.ts} +0 -0
  587. /package/dist/{__tests__/lexer.test.d.ts → src/__tests__/optimizer/lir/peephole.test.d.ts} +0 -0
  588. /package/dist/{src2/__tests__/optimizer → src/__tests__/optimizer/lir}/pipeline.test.d.ts +0 -0
  589. /package/dist/{__tests__/lowering.test.d.ts → src/__tests__/optimizer/nbt-batch.test.d.ts} +0 -0
  590. /package/dist/{__tests__/mc-syntax.test.d.ts → src/__tests__/optimizer/pipeline.test.d.ts} +0 -0
  591. /package/dist/{src2 → src}/__tests__/optimizer/pipeline.test.js +0 -0
  592. /package/dist/{__tests__/nbt.test.d.ts → src/__tests__/optimizer/selector-cache.test.d.ts} +0 -0
  593. /package/dist/{__tests__/optimizer-advanced.test.d.ts → src/__tests__/optimizer/unroll.test.d.ts} +0 -0
  594. /package/dist/{src2 → src}/hir/types.js +0 -0
  595. /package/dist/{src2 → src}/lir/lower.d.ts +0 -0
  596. /package/dist/{src2 → src}/lir/types.js +0 -0
  597. /package/dist/{src2 → src}/lir/verify.d.ts +0 -0
  598. /package/dist/{src2 → src}/lir/verify.js +0 -0
  599. /package/dist/{src2 → src}/mir/macro.d.ts +0 -0
  600. /package/dist/{src2 → src}/mir/macro.js +0 -0
  601. /package/dist/{src2 → src}/mir/types.js +0 -0
  602. /package/dist/{src2 → src}/mir/verify.d.ts +0 -0
  603. /package/dist/{src2 → src}/mir/verify.js +0 -0
  604. /package/dist/{src2 → src}/optimizer/block_merge.d.ts +0 -0
  605. /package/dist/{src2 → src}/optimizer/block_merge.js +0 -0
  606. /package/dist/{src2 → src}/optimizer/branch_simplify.d.ts +0 -0
  607. /package/dist/{src2 → src}/optimizer/branch_simplify.js +0 -0
  608. /package/dist/{src2 → src}/optimizer/constant_fold.d.ts +0 -0
  609. /package/dist/{src2 → src}/optimizer/constant_fold.js +0 -0
  610. /package/dist/{src2 → src}/optimizer/copy_prop.d.ts +0 -0
  611. /package/dist/{src2 → src}/optimizer/copy_prop.js +0 -0
  612. /package/{src2 → src}/__tests__/e2e/basic.test.ts +0 -0
  613. /package/{src2 → src}/__tests__/lir/lower.test.ts +0 -0
  614. /package/{src2 → src}/__tests__/lir/types.test.ts +0 -0
  615. /package/{src2 → src}/__tests__/lir/verify.test.ts +0 -0
  616. /package/{src2 → src}/__tests__/mir/verify.test.ts +0 -0
  617. /package/{src2 → src}/__tests__/optimizer/block_merge.test.ts +0 -0
  618. /package/{src2 → src}/__tests__/optimizer/branch_simplify.test.ts +0 -0
  619. /package/{src2 → src}/__tests__/optimizer/constant_fold.test.ts +0 -0
  620. /package/{src2 → src}/__tests__/optimizer/copy_prop.test.ts +0 -0
  621. /package/{src2 → src}/__tests__/optimizer/dce.test.ts +0 -0
  622. /package/{src2 → src}/__tests__/optimizer/pipeline.test.ts +0 -0
  623. /package/{src2 → src}/lir/verify.ts +0 -0
  624. /package/{src2 → src}/mir/macro.ts +0 -0
  625. /package/{src2 → src}/mir/verify.ts +0 -0
  626. /package/{src2 → src}/optimizer/block_merge.ts +0 -0
  627. /package/{src2 → src}/optimizer/branch_simplify.ts +0 -0
  628. /package/{src2 → src}/optimizer/constant_fold.ts +0 -0
  629. /package/{src2 → src}/optimizer/copy_prop.ts +0 -0
@@ -3,8 +3,12 @@
3
3
  *
4
4
  * Each pass is a function MIRFunction → MIRFunction.
5
5
  * The pipeline iterates until no pass changes the function (fixpoint).
6
+ *
7
+ * Module-level passes (interproceduralConstProp) run once after the
8
+ * per-function fixpoint loop.
6
9
  */
7
10
  import type { MIRFunction, MIRModule } from '../mir/types';
11
+ export { selectorCache } from './selector-cache';
8
12
  export type Pass = (fn: MIRFunction) => MIRFunction;
9
13
  export declare function optimizeFunction(fn: MIRFunction, passes?: Pass[]): MIRFunction;
10
14
  export declare function optimizeModule(mod: MIRModule, passes?: Pass[]): MIRModule;
@@ -4,8 +4,12 @@
4
4
  *
5
5
  * Each pass is a function MIRFunction → MIRFunction.
6
6
  * The pipeline iterates until no pass changes the function (fixpoint).
7
+ *
8
+ * Module-level passes (interproceduralConstProp) run once after the
9
+ * per-function fixpoint loop.
7
10
  */
8
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.selectorCache = void 0;
9
13
  exports.optimizeFunction = optimizeFunction;
10
14
  exports.optimizeModule = optimizeModule;
11
15
  const constant_fold_1 = require("./constant_fold");
@@ -13,7 +17,17 @@ const copy_prop_1 = require("./copy_prop");
13
17
  const dce_1 = require("./dce");
14
18
  const block_merge_1 = require("./block_merge");
15
19
  const branch_simplify_1 = require("./branch_simplify");
20
+ const unroll_1 = require("./unroll");
21
+ const nbt_batch_1 = require("./nbt-batch");
22
+ const interprocedural_1 = require("./interprocedural");
23
+ // selectorCache is intentionally excluded from the default pipeline:
24
+ // it emits synthetic __sel_cleanup_* / __sel_tag_* call_context instructions
25
+ // that require codegen support before being used end-to-end.
26
+ var selector_cache_1 = require("./selector-cache");
27
+ Object.defineProperty(exports, "selectorCache", { enumerable: true, get: function () { return selector_cache_1.selectorCache; } });
16
28
  const defaultPasses = [
29
+ unroll_1.loopUnroll,
30
+ nbt_batch_1.nbtBatchRead,
17
31
  constant_fold_1.constantFold,
18
32
  copy_prop_1.copyProp,
19
33
  branch_simplify_1.branchSimplify,
@@ -34,9 +48,11 @@ function optimizeFunction(fn, passes = defaultPasses) {
34
48
  return current;
35
49
  }
36
50
  function optimizeModule(mod, passes) {
37
- return {
51
+ const perFnOptimized = {
38
52
  ...mod,
39
53
  functions: mod.functions.map(fn => optimizeFunction(fn, passes)),
40
54
  };
55
+ // Module-level pass: interprocedural constant propagation
56
+ return (0, interprocedural_1.interproceduralConstProp)(perFnOptimized);
41
57
  }
42
58
  //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Selector Cache — MIR optimization pass.
3
+ *
4
+ * Within a single basic block, if the same complex selector (one containing '[')
5
+ * appears in ≥2 call_context instructions (as `as` or `at` subcommands),
6
+ * the pass replaces the 2nd and subsequent occurrences with a simpler
7
+ * tag-based selector `@e[tag=__cache_sel_N]`.
8
+ *
9
+ * Two new call_context instructions are prepended to the block:
10
+ * 1. Cleanup: execute as @e[tag=__cache_sel_N] run <fn: __sel_cleanup_<tag>>
11
+ * — signals codegen to emit: tag @e[tag=<tag>] remove <tag>
12
+ * 2. Tag-add: execute as <original_selector> run <fn: __sel_tag_<tag>>
13
+ * — signals codegen to emit: tag @s add <tag>
14
+ *
15
+ * The synthetic fn names `__sel_cleanup_*` and `__sel_tag_*` are a convention
16
+ * recognized by the codegen layer for special-case emission.
17
+ *
18
+ * This is a block-local pass (does not track selector lifetime across block
19
+ * boundaries) so it is always correct with respect to control flow.
20
+ */
21
+ import type { MIRFunction } from '../mir/types';
22
+ export declare function selectorCache(fn: MIRFunction): MIRFunction;
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /**
3
+ * Selector Cache — MIR optimization pass.
4
+ *
5
+ * Within a single basic block, if the same complex selector (one containing '[')
6
+ * appears in ≥2 call_context instructions (as `as` or `at` subcommands),
7
+ * the pass replaces the 2nd and subsequent occurrences with a simpler
8
+ * tag-based selector `@e[tag=__cache_sel_N]`.
9
+ *
10
+ * Two new call_context instructions are prepended to the block:
11
+ * 1. Cleanup: execute as @e[tag=__cache_sel_N] run <fn: __sel_cleanup_<tag>>
12
+ * — signals codegen to emit: tag @e[tag=<tag>] remove <tag>
13
+ * 2. Tag-add: execute as <original_selector> run <fn: __sel_tag_<tag>>
14
+ * — signals codegen to emit: tag @s add <tag>
15
+ *
16
+ * The synthetic fn names `__sel_cleanup_*` and `__sel_tag_*` are a convention
17
+ * recognized by the codegen layer for special-case emission.
18
+ *
19
+ * This is a block-local pass (does not track selector lifetime across block
20
+ * boundaries) so it is always correct with respect to control flow.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.selectorCache = selectorCache;
24
+ function selectorCache(fn) {
25
+ let tagId = 0;
26
+ return {
27
+ ...fn,
28
+ blocks: fn.blocks.map(block => processBlock(block, () => tagId++)),
29
+ };
30
+ }
31
+ function processBlock(block, nextId) {
32
+ // Count how many times each complex selector appears across call_context instrs
33
+ const selectorCount = new Map();
34
+ for (const instr of block.instrs) {
35
+ if (instr.kind === 'call_context') {
36
+ for (const sub of instr.subcommands) {
37
+ if ((sub.kind === 'as' || sub.kind === 'at') && isComplexSelector(sub.selector)) {
38
+ selectorCount.set(sub.selector, (selectorCount.get(sub.selector) ?? 0) + 1);
39
+ }
40
+ }
41
+ }
42
+ }
43
+ // Build a map of selectors that appear ≥2 times → assigned tag name
44
+ const repeated = new Map(); // selector → tag name
45
+ for (const [sel, count] of selectorCount) {
46
+ if (count >= 2) {
47
+ repeated.set(sel, `__cache_sel_${nextId()}`);
48
+ }
49
+ }
50
+ if (repeated.size === 0)
51
+ return block;
52
+ // Prepend cleanup + tag-add instructions for each repeated selector
53
+ const prefixInstrs = [];
54
+ for (const [sel, tag] of repeated) {
55
+ // 1. Cleanup: remove stale tags from any entities that still carry this tag
56
+ prefixInstrs.push({
57
+ kind: 'call_context',
58
+ fn: `__sel_cleanup_${tag}`,
59
+ subcommands: [{ kind: 'as', selector: `@e[tag=${tag}]` }],
60
+ });
61
+ // 2. Tag-add: tag all matching entities with the cache tag
62
+ prefixInstrs.push({
63
+ kind: 'call_context',
64
+ fn: `__sel_tag_${tag}`,
65
+ subcommands: [{ kind: 'as', selector: sel }],
66
+ });
67
+ }
68
+ // Rewrite instructions: first occurrence of each repeated selector is kept
69
+ // as-is; subsequent occurrences are replaced with the tag-based selector.
70
+ const seen = new Set();
71
+ const newInstrs = [...prefixInstrs];
72
+ for (const instr of block.instrs) {
73
+ if (instr.kind === 'call_context') {
74
+ const newSubs = instr.subcommands.map(sub => {
75
+ if ((sub.kind === 'as' || sub.kind === 'at') && repeated.has(sub.selector)) {
76
+ const tag = repeated.get(sub.selector);
77
+ if (seen.has(sub.selector)) {
78
+ // Subsequent occurrence — use the tag selector
79
+ return { ...sub, selector: `@e[tag=${tag}]` };
80
+ }
81
+ else {
82
+ // First occurrence — keep original, mark as seen
83
+ seen.add(sub.selector);
84
+ return sub;
85
+ }
86
+ }
87
+ return sub;
88
+ });
89
+ newInstrs.push({ ...instr, subcommands: newSubs });
90
+ }
91
+ else {
92
+ newInstrs.push(instr);
93
+ }
94
+ }
95
+ return { ...block, instrs: newInstrs };
96
+ }
97
+ function isComplexSelector(selector) {
98
+ return selector.includes('[');
99
+ }
100
+ //# sourceMappingURL=selector-cache.js.map
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Small Constant Loop Unrolling — MIR optimization pass.
3
+ *
4
+ * Detects `for (let i = 0; i < N; i++)` loops where N is a compile-time
5
+ * constant and N ≤ 8, then unrolls them: the loop body is duplicated N times
6
+ * with the loop variable substituted as the literal 0..N-1.
7
+ *
8
+ * Pattern recognized (after HIR→MIR lowering):
9
+ * entry block: const t_i 0 (loop var init)
10
+ * loop_header: cmp(lt, t_i, N) → branch body/exit
11
+ * loop_body: body instructions, jump → loop_latch
12
+ * loop_latch: t_i = t_i + 1, jump → loop_header
13
+ * loop_exit: ...
14
+ *
15
+ * After unrolling:
16
+ * entry block (with i=0 def removed):
17
+ * [body with t_i → 0]
18
+ * [body with t_i → 1]
19
+ * ...
20
+ * [body with t_i → N-1]
21
+ * jump → loop_exit
22
+ * loop_exit: ...
23
+ *
24
+ * Limitations:
25
+ * - Only unrolls when N ≤ 8
26
+ * - The loop variable must be initialized to exactly 0 before the loop
27
+ * - The latch must do exactly `t_i = t_i + 1` (or equivalent const add)
28
+ * - No break/continue (body must not jump directly to exit or latch)
29
+ * - N must be a compile-time constant (Operand kind='const')
30
+ */
31
+ import type { MIRFunction } from '../mir/types';
32
+ export declare function loopUnroll(fn: MIRFunction): MIRFunction;
@@ -0,0 +1,348 @@
1
+ "use strict";
2
+ /**
3
+ * Small Constant Loop Unrolling — MIR optimization pass.
4
+ *
5
+ * Detects `for (let i = 0; i < N; i++)` loops where N is a compile-time
6
+ * constant and N ≤ 8, then unrolls them: the loop body is duplicated N times
7
+ * with the loop variable substituted as the literal 0..N-1.
8
+ *
9
+ * Pattern recognized (after HIR→MIR lowering):
10
+ * entry block: const t_i 0 (loop var init)
11
+ * loop_header: cmp(lt, t_i, N) → branch body/exit
12
+ * loop_body: body instructions, jump → loop_latch
13
+ * loop_latch: t_i = t_i + 1, jump → loop_header
14
+ * loop_exit: ...
15
+ *
16
+ * After unrolling:
17
+ * entry block (with i=0 def removed):
18
+ * [body with t_i → 0]
19
+ * [body with t_i → 1]
20
+ * ...
21
+ * [body with t_i → N-1]
22
+ * jump → loop_exit
23
+ * loop_exit: ...
24
+ *
25
+ * Limitations:
26
+ * - Only unrolls when N ≤ 8
27
+ * - The loop variable must be initialized to exactly 0 before the loop
28
+ * - The latch must do exactly `t_i = t_i + 1` (or equivalent const add)
29
+ * - No break/continue (body must not jump directly to exit or latch)
30
+ * - N must be a compile-time constant (Operand kind='const')
31
+ */
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.loopUnroll = loopUnroll;
34
+ const UNROLL_LIMIT = 8;
35
+ // ---------------------------------------------------------------------------
36
+ // Public API
37
+ // ---------------------------------------------------------------------------
38
+ function loopUnroll(fn) {
39
+ let current = fn;
40
+ let changed = true;
41
+ // Iterate to fixpoint in case of multiple unrollable loops
42
+ while (changed) {
43
+ changed = false;
44
+ const result = tryUnrollOne(current);
45
+ if (result !== current) {
46
+ current = result;
47
+ changed = true;
48
+ }
49
+ }
50
+ return current;
51
+ }
52
+ function tryUnrollOne(fn) {
53
+ const blockMap = new Map(fn.blocks.map(b => [b.id, b]));
54
+ const info = findUnrollableLoop(fn, blockMap);
55
+ if (!info)
56
+ return fn;
57
+ return unroll(fn, blockMap, info);
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // Loop detection
61
+ // ---------------------------------------------------------------------------
62
+ function findUnrollableLoop(fn, blockMap) {
63
+ for (const block of fn.blocks) {
64
+ if (!block.id.startsWith('loop_header'))
65
+ continue;
66
+ const info = analyzeLoop(fn, blockMap, block);
67
+ if (info)
68
+ return info;
69
+ }
70
+ return null;
71
+ }
72
+ function analyzeLoop(fn, blockMap, header) {
73
+ // Header must branch on a cmp result
74
+ if (header.term.kind !== 'branch')
75
+ return null;
76
+ const branch = header.term;
77
+ if (branch.cond.kind !== 'temp')
78
+ return null;
79
+ const condName = branch.cond.name;
80
+ // Find the cmp instruction in the header
81
+ const cmpInstr = header.instrs.find(instr => instr.kind === 'cmp' && instr.dst === condName);
82
+ if (!cmpInstr)
83
+ return null;
84
+ // Must be a `lt` comparison: i < N
85
+ if (cmpInstr.op !== 'lt')
86
+ return null;
87
+ // Left operand must be a temp (the loop var), right must be a constant
88
+ if (cmpInstr.a.kind !== 'temp')
89
+ return null;
90
+ if (cmpInstr.b.kind !== 'const')
91
+ return null;
92
+ const loopVar = cmpInstr.a.name;
93
+ const N = cmpInstr.b.value;
94
+ // Reject if N > limit or N <= 0
95
+ if (N > UNROLL_LIMIT || N <= 0)
96
+ return null;
97
+ // then = loop_body, else = loop_exit
98
+ const bodyId = branch.then;
99
+ const exitId = branch.else;
100
+ const bodyBlock = blockMap.get(bodyId);
101
+ if (!bodyBlock)
102
+ return null;
103
+ if (!bodyBlock.id.startsWith('loop_body'))
104
+ return null;
105
+ // Body must end with jump to latch (or header if no latch)
106
+ if (bodyBlock.term.kind !== 'jump')
107
+ return null;
108
+ const afterBodyId = bodyBlock.term.target;
109
+ const afterBody = blockMap.get(afterBodyId);
110
+ if (!afterBody)
111
+ return null;
112
+ // Find the latch block
113
+ let latchId;
114
+ if (afterBody.id.startsWith('loop_latch')) {
115
+ latchId = afterBodyId;
116
+ }
117
+ else {
118
+ return null;
119
+ }
120
+ const latch = blockMap.get(latchId);
121
+ // Latch must end with jump back to header
122
+ if (latch.term.kind !== 'jump')
123
+ return null;
124
+ if (latch.term.target !== header.id)
125
+ return null;
126
+ // Latch must increment loopVar by 1
127
+ if (!latchIncrementsBy1(latch, loopVar))
128
+ return null;
129
+ // Loop var must be initialized to 0 before entering the loop
130
+ // Find the pre-header: the block that jumps to header (not the latch)
131
+ const preHeaderId = findPreHeader(fn, header.id, latchId);
132
+ if (!preHeaderId)
133
+ return null;
134
+ const preHeader = blockMap.get(preHeaderId);
135
+ if (!initializesTo0(preHeader, fn, loopVar))
136
+ return null;
137
+ // Body must not contain break (direct jump to exit) or continue to latch
138
+ // (those would require more complex handling)
139
+ if (bodyHasBreakOrContinue(bodyBlock, exitId, latchId))
140
+ return null;
141
+ return { headerId: header.id, bodyId, latchId, exitId, loopVar, N, preHeaderId };
142
+ }
143
+ /** Check that the latch increments loopVar by 1.
144
+ *
145
+ * Two common patterns:
146
+ * 1. Direct: add loopVar loopVar 1
147
+ * 2. Two-step: add t_tmp loopVar 1; copy loopVar t_tmp
148
+ */
149
+ function latchIncrementsBy1(latch, loopVar) {
150
+ // Pattern 1: add dst=loopVar, a=loopVar, b=const(1)
151
+ for (const instr of latch.instrs) {
152
+ if (instr.kind === 'add' &&
153
+ instr.dst === loopVar &&
154
+ instr.a.kind === 'temp' && instr.a.name === loopVar &&
155
+ instr.b.kind === 'const' && instr.b.value === 1) {
156
+ return true;
157
+ }
158
+ }
159
+ // Pattern 2: add t_tmp loopVar 1; copy loopVar t_tmp
160
+ // Find the copy that assigns loopVar, then check the add that produced the source
161
+ for (let i = 0; i < latch.instrs.length; i++) {
162
+ const instr = latch.instrs[i];
163
+ if (instr.kind === 'copy' &&
164
+ instr.dst === loopVar &&
165
+ instr.src.kind === 'temp') {
166
+ const srcTemp = instr.src.name;
167
+ // Find the add instruction that produced srcTemp
168
+ for (const addInstr of latch.instrs) {
169
+ if (addInstr.kind === 'add' &&
170
+ addInstr.dst === srcTemp &&
171
+ addInstr.a.kind === 'temp' && addInstr.a.name === loopVar &&
172
+ addInstr.b.kind === 'const' && addInstr.b.value === 1) {
173
+ return true;
174
+ }
175
+ }
176
+ }
177
+ }
178
+ return false;
179
+ }
180
+ /** Check if loopVar is initialized to 0 in the pre-header (or reachable const) */
181
+ function initializesTo0(preHeader, fn, loopVar) {
182
+ // Check if last definition of loopVar in preHeader is const 0
183
+ for (let i = preHeader.instrs.length - 1; i >= 0; i--) {
184
+ const instr = preHeader.instrs[i];
185
+ if (instr.kind === 'const' && instr.dst === loopVar && instr.value === 0)
186
+ return true;
187
+ if (instr.kind === 'copy' && instr.dst === loopVar) {
188
+ return instr.src.kind === 'const' && instr.src.value === 0;
189
+ }
190
+ // If something else defines loopVar, it's not 0
191
+ if (getInstrDst(instr) === loopVar)
192
+ return false;
193
+ }
194
+ // Also check entry block if preHeader is entry
195
+ if (preHeader.id === fn.entry)
196
+ return false;
197
+ return false;
198
+ }
199
+ /** Find the pre-header block: the predecessor of header that is NOT the latch */
200
+ function findPreHeader(fn, headerId, latchId) {
201
+ const preds = [];
202
+ for (const block of fn.blocks) {
203
+ const targets = getTermTargets(block.term);
204
+ if (targets.includes(headerId) && block.id !== latchId) {
205
+ preds.push(block.id);
206
+ }
207
+ }
208
+ return preds.length === 1 ? preds[0] : null;
209
+ }
210
+ /** Check if body block has break (jump to exit) or continue (jump to latch) */
211
+ function bodyHasBreakOrContinue(body, exitId, latchId) {
212
+ // The normal path is body → latch. Any direct jump to exit = break,
213
+ // any jump to latch from within body sub-blocks = continue
214
+ // For simplicity, we only unroll if the body has no sub-blocks with these patterns.
215
+ // We only check the body block itself (single-block body).
216
+ // A multi-block body would need recursive checking.
217
+ return false;
218
+ }
219
+ // ---------------------------------------------------------------------------
220
+ // Unrolling
221
+ // ---------------------------------------------------------------------------
222
+ function unroll(fn, blockMap, info) {
223
+ const { headerId, bodyId, latchId, exitId, loopVar, N, preHeaderId } = info;
224
+ const preHeader = blockMap.get(preHeaderId);
225
+ const body = blockMap.get(bodyId);
226
+ // Remove the `const loopVar 0` init from preHeader
227
+ const newPreHeaderInstrs = preHeader.instrs.filter(instr => !(instr.kind === 'const' && instr.dst === loopVar && instr.value === 0) &&
228
+ !(instr.kind === 'copy' && instr.dst === loopVar &&
229
+ instr.src.kind === 'const' && instr.src.value === 0));
230
+ // Build N copies of the body with loopVar substituted
231
+ const unrolledInstrs = [];
232
+ for (let iter = 0; iter < N; iter++) {
233
+ const substitution = new Map([[loopVar, { kind: 'const', value: iter }]]);
234
+ for (const instr of body.instrs) {
235
+ unrolledInstrs.push(substituteInstr(instr, substitution));
236
+ }
237
+ }
238
+ // New pre-header: original instrs (minus init) + all unrolled body + jump to exit
239
+ const newPreHeader = {
240
+ ...preHeader,
241
+ instrs: [...newPreHeaderInstrs, ...unrolledInstrs],
242
+ term: { kind: 'jump', target: exitId },
243
+ };
244
+ // Remove header, body, latch blocks; update preHeader; keep exit
245
+ const keepIds = new Set(fn.blocks.map(b => b.id));
246
+ keepIds.delete(headerId);
247
+ keepIds.delete(bodyId);
248
+ keepIds.delete(latchId);
249
+ const newBlocks = [];
250
+ for (const block of fn.blocks) {
251
+ if (block.id === preHeaderId) {
252
+ newBlocks.push(newPreHeader);
253
+ }
254
+ else if (keepIds.has(block.id)) {
255
+ newBlocks.push(block);
256
+ }
257
+ }
258
+ // Recompute predecessors
259
+ const newBlocksWithPreds = recomputePreds(newBlocks);
260
+ return { ...fn, blocks: newBlocksWithPreds };
261
+ }
262
+ // ---------------------------------------------------------------------------
263
+ // Instruction substitution
264
+ // ---------------------------------------------------------------------------
265
+ function substituteOp(op, sub) {
266
+ if (op.kind === 'temp') {
267
+ const replacement = sub.get(op.name);
268
+ if (replacement)
269
+ return replacement;
270
+ }
271
+ return op;
272
+ }
273
+ function substituteInstr(instr, sub) {
274
+ switch (instr.kind) {
275
+ case 'copy': return { ...instr, src: substituteOp(instr.src, sub) };
276
+ case 'neg':
277
+ case 'not': return { ...instr, src: substituteOp(instr.src, sub) };
278
+ case 'add':
279
+ case 'sub':
280
+ case 'mul':
281
+ case 'div':
282
+ case 'mod':
283
+ case 'and':
284
+ case 'or':
285
+ return { ...instr, a: substituteOp(instr.a, sub), b: substituteOp(instr.b, sub) };
286
+ case 'cmp':
287
+ return { ...instr, a: substituteOp(instr.a, sub), b: substituteOp(instr.b, sub) };
288
+ case 'nbt_write':
289
+ return { ...instr, src: substituteOp(instr.src, sub) };
290
+ case 'call':
291
+ return { ...instr, args: instr.args.map(a => substituteOp(a, sub)) };
292
+ case 'call_macro':
293
+ return { ...instr, args: instr.args.map(a => ({ ...a, value: substituteOp(a.value, sub) })) };
294
+ case 'branch':
295
+ return { ...instr, cond: substituteOp(instr.cond, sub) };
296
+ case 'return':
297
+ return { ...instr, value: instr.value ? substituteOp(instr.value, sub) : null };
298
+ default:
299
+ return instr;
300
+ }
301
+ }
302
+ // ---------------------------------------------------------------------------
303
+ // Helpers
304
+ // ---------------------------------------------------------------------------
305
+ function getInstrDst(instr) {
306
+ switch (instr.kind) {
307
+ case 'const':
308
+ case 'copy':
309
+ case 'add':
310
+ case 'sub':
311
+ case 'mul':
312
+ case 'div':
313
+ case 'mod':
314
+ case 'neg':
315
+ case 'cmp':
316
+ case 'and':
317
+ case 'or':
318
+ case 'not':
319
+ case 'nbt_read':
320
+ return instr.dst;
321
+ case 'call':
322
+ case 'call_macro':
323
+ return instr.dst;
324
+ default:
325
+ return null;
326
+ }
327
+ }
328
+ function getTermTargets(term) {
329
+ switch (term.kind) {
330
+ case 'jump': return [term.target];
331
+ case 'branch': return [term.then, term.else];
332
+ default: return [];
333
+ }
334
+ }
335
+ function recomputePreds(blocks) {
336
+ const predMap = new Map();
337
+ for (const b of blocks)
338
+ predMap.set(b.id, []);
339
+ for (const block of blocks) {
340
+ for (const target of getTermTargets(block.term)) {
341
+ const preds = predMap.get(target);
342
+ if (preds)
343
+ preds.push(block.id);
344
+ }
345
+ }
346
+ return blocks.map(b => ({ ...b, preds: predMap.get(b.id) ?? [] }));
347
+ }
348
+ //# sourceMappingURL=unroll.js.map
@@ -31,6 +31,8 @@ export declare class Parser {
31
31
  private parseImplBlock;
32
32
  private parseConstDecl;
33
33
  private parseGlobalDecl;
34
+ /** Parse `export fn name(...)` — marks the function as exported (survives DCE). */
35
+ private parseExportedFnDecl;
34
36
  private parseFnDecl;
35
37
  /** Parse a `declare fn name(params): returnType;` stub — no body, just discard. */
36
38
  private parseDeclareStub;
@@ -63,6 +65,12 @@ export declare class Parser {
63
65
  private parseUnaryExpr;
64
66
  private parseEntityTypeName;
65
67
  private isSubtraction;
68
+ /**
69
+ * Try to parse `<Type, ...>` as explicit generic type arguments.
70
+ * Returns the parsed type list if successful, null if this looks like a comparison.
71
+ * Does NOT consume any tokens if it returns null.
72
+ */
73
+ private tryParseTypeArgs;
66
74
  private parsePostfixExpr;
67
75
  private parseArgs;
68
76
  private parsePrimaryExpr;