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
@@ -1,203 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const entity_hierarchy_1 = require("../types/entity-hierarchy");
4
- const lexer_1 = require("../lexer");
5
- const parser_1 = require("../parser");
6
- const lowering_1 = require("../lowering");
7
- function compileWithWarnings(source, namespace = 'test') {
8
- const tokens = new lexer_1.Lexer(source).tokenize();
9
- const ast = new parser_1.Parser(tokens).parse(namespace);
10
- const lowering = new lowering_1.Lowering(namespace);
11
- return { ir: lowering.lower(ast), warnings: lowering.warnings };
12
- }
13
- // ---------------------------------------------------------------------------
14
- // Entity hierarchy utilities
15
- // ---------------------------------------------------------------------------
16
- describe('Entity type hierarchy', () => {
17
- test('isSubtype: Zombie is a subtype of Mob', () => {
18
- expect((0, entity_hierarchy_1.isSubtype)('Zombie', 'Mob')).toBe(true);
19
- });
20
- test('isSubtype: Player is NOT a subtype of Mob', () => {
21
- expect((0, entity_hierarchy_1.isSubtype)('Player', 'Mob')).toBe(false);
22
- });
23
- test('isSubtype: Zombie is a subtype of Entity (transitive)', () => {
24
- expect((0, entity_hierarchy_1.isSubtype)('Zombie', 'Entity')).toBe(true);
25
- });
26
- test('isSubtype: identity — Zombie is subtype of Zombie', () => {
27
- expect((0, entity_hierarchy_1.isSubtype)('Zombie', 'Zombie')).toBe(true);
28
- });
29
- test('areCompatibleTypes: Player and Zombie are NOT compatible', () => {
30
- expect((0, entity_hierarchy_1.areCompatibleTypes)('Player', 'Zombie')).toBe(false);
31
- });
32
- test('areCompatibleTypes: Zombie and Mob are compatible', () => {
33
- expect((0, entity_hierarchy_1.areCompatibleTypes)('Zombie', 'Mob')).toBe(true);
34
- });
35
- test('areCompatibleTypes: Mob and Zombie are compatible (reverse)', () => {
36
- expect((0, entity_hierarchy_1.areCompatibleTypes)('Mob', 'Zombie')).toBe(true);
37
- });
38
- test('getConcreteSubtypes: HostileMob includes Zombie, Skeleton, Creeper', () => {
39
- const subtypes = (0, entity_hierarchy_1.getConcreteSubtypes)('HostileMob');
40
- const names = subtypes.map(n => n.name);
41
- expect(names).toContain('Zombie');
42
- expect(names).toContain('Skeleton');
43
- expect(names).toContain('Creeper');
44
- expect(names).toContain('Blaze');
45
- expect(names).toContain('CaveSpider');
46
- // Should NOT include passive mobs
47
- expect(names).not.toContain('Pig');
48
- expect(names).not.toContain('Player');
49
- });
50
- test('getConcreteSubtypes: PassiveMob includes Pig, Cow, Villager', () => {
51
- const subtypes = (0, entity_hierarchy_1.getConcreteSubtypes)('PassiveMob');
52
- const names = subtypes.map(n => n.name);
53
- expect(names).toContain('Pig');
54
- expect(names).toContain('Cow');
55
- expect(names).toContain('Villager');
56
- expect(names).toContain('WanderingTrader');
57
- expect(names).not.toContain('Zombie');
58
- });
59
- test('getSelectorEntityType: parses type=zombie', () => {
60
- expect((0, entity_hierarchy_1.getSelectorEntityType)('@e[type=zombie]')).toBe('Zombie');
61
- });
62
- test('getSelectorEntityType: parses type=minecraft:skeleton', () => {
63
- expect((0, entity_hierarchy_1.getSelectorEntityType)('@e[type=minecraft:skeleton]')).toBe('Skeleton');
64
- });
65
- test('getBaseSelectorType: @a → Player', () => {
66
- expect((0, entity_hierarchy_1.getBaseSelectorType)('@a')).toBe('Player');
67
- });
68
- test('getBaseSelectorType: @e → Entity', () => {
69
- expect((0, entity_hierarchy_1.getBaseSelectorType)('@e')).toBe('Entity');
70
- });
71
- test('getBaseSelectorType: @e[type=zombie] → Zombie', () => {
72
- expect((0, entity_hierarchy_1.getBaseSelectorType)('@e[type=zombie]')).toBe('Zombie');
73
- });
74
- test('getBaseSelectorType: @s → null', () => {
75
- expect((0, entity_hierarchy_1.getBaseSelectorType)('@s')).toBeNull();
76
- });
77
- });
78
- // ---------------------------------------------------------------------------
79
- // W_IMPOSSIBLE_AS warning
80
- // ---------------------------------------------------------------------------
81
- describe('W_IMPOSSIBLE_AS warning', () => {
82
- test('foreach @a with as @e[type=zombie] produces warning', () => {
83
- const source = `
84
- fn main() {
85
- foreach (p in @a) {
86
- as @e[type=minecraft:zombie] {
87
- kill(@s);
88
- }
89
- }
90
- }
91
- `;
92
- const { warnings } = compileWithWarnings(source);
93
- const impossible = warnings.filter(w => w.code === 'W_IMPOSSIBLE_AS');
94
- expect(impossible.length).toBe(1);
95
- expect(impossible[0].message).toContain('Player');
96
- expect(impossible[0].message).toContain('Zombie');
97
- });
98
- test('foreach @e[type=zombie] with as @e[type=zombie] produces NO warning', () => {
99
- const source = `
100
- fn main() {
101
- foreach (z in @e[type=minecraft:zombie]) {
102
- as @e[type=minecraft:zombie] {
103
- kill(@s);
104
- }
105
- }
106
- }
107
- `;
108
- const { warnings } = compileWithWarnings(source);
109
- const impossible = warnings.filter(w => w.code === 'W_IMPOSSIBLE_AS');
110
- expect(impossible.length).toBe(0);
111
- });
112
- test('foreach @e (generic) with as @e[type=zombie] produces NO warning', () => {
113
- const source = `
114
- fn main() {
115
- foreach (e in @e) {
116
- as @e[type=minecraft:zombie] {
117
- kill(@s);
118
- }
119
- }
120
- }
121
- `;
122
- const { warnings } = compileWithWarnings(source);
123
- const impossible = warnings.filter(w => w.code === 'W_IMPOSSIBLE_AS');
124
- expect(impossible.length).toBe(0);
125
- });
126
- });
127
- // ---------------------------------------------------------------------------
128
- // is_check with abstract types
129
- // ---------------------------------------------------------------------------
130
- describe('is_check compilation', () => {
131
- test('concrete is_check emits single execute if entity', () => {
132
- const source = `
133
- fn main() {
134
- foreach (e in @e) {
135
- if (e is Zombie) {
136
- kill(@s);
137
- }
138
- }
139
- }
140
- `;
141
- const { ir } = compileWithWarnings(source);
142
- const thenFn = ir.functions.find(f => f.name.includes('then_'));
143
- expect(thenFn).toBeDefined();
144
- // The parent foreach function should contain the execute if entity command
145
- const foreachFn = ir.functions.find(f => f.name.includes('foreach_'));
146
- expect(foreachFn).toBeDefined();
147
- const rawCmds = foreachFn.blocks.flatMap(b => b.instrs)
148
- .filter((i) => i.op === 'raw')
149
- .map(i => i.cmd);
150
- expect(rawCmds.some(c => c.includes('type=minecraft:zombie'))).toBe(true);
151
- });
152
- test('abstract is_check (HostileMob) emits multiple type checks', () => {
153
- const source = `
154
- fn main() {
155
- foreach (e in @e) {
156
- if (e is HostileMob) {
157
- kill(@s);
158
- }
159
- }
160
- }
161
- `;
162
- const { ir } = compileWithWarnings(source);
163
- const foreachFn = ir.functions.find(f => f.name.includes('foreach_'));
164
- expect(foreachFn).toBeDefined();
165
- const rawCmds = foreachFn.blocks.flatMap(b => b.instrs)
166
- .filter((i) => i.op === 'raw')
167
- .map(i => i.cmd);
168
- // Should have scoreboard setup and multiple type checks
169
- expect(rawCmds.some(c => c.includes('scoreboard players set __is_result rs:temp 0'))).toBe(true);
170
- expect(rawCmds.some(c => c.includes('type=minecraft:zombie'))).toBe(true);
171
- expect(rawCmds.some(c => c.includes('type=minecraft:skeleton'))).toBe(true);
172
- expect(rawCmds.some(c => c.includes('type=minecraft:creeper'))).toBe(true);
173
- expect(rawCmds.some(c => c.includes('if score __is_result rs:temp matches 1'))).toBe(true);
174
- });
175
- });
176
- // ---------------------------------------------------------------------------
177
- // selector<T> type annotation
178
- // ---------------------------------------------------------------------------
179
- describe('selector<T> type annotation', () => {
180
- test('parses selector<Player> type', () => {
181
- const source = `
182
- fn greet(target: selector<Player>) {
183
- say("hello");
184
- }
185
- `;
186
- const tokens = new lexer_1.Lexer(source).tokenize();
187
- const ast = new parser_1.Parser(tokens).parse('test');
188
- const fn = ast.declarations[0];
189
- expect(fn.params[0].type).toEqual({ kind: 'selector', entityType: 'Player' });
190
- });
191
- test('parses plain selector type', () => {
192
- const source = `
193
- fn greet(target: selector) {
194
- say("hello");
195
- }
196
- `;
197
- const tokens = new lexer_1.Lexer(source).tokenize();
198
- const ast = new parser_1.Parser(tokens).parse('test');
199
- const fn = ast.declarations[0];
200
- expect(fn.params[0].type).toEqual({ kind: 'selector' });
201
- });
202
- });
203
- //# sourceMappingURL=entity-types.test.js.map
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const formatter_1 = require("../formatter");
4
- describe('formatter', () => {
5
- it('normalizes indentation to 4 spaces', () => {
6
- const input = 'fn main() {\n let x: int = 1;\n}';
7
- const result = (0, formatter_1.format)(input);
8
- expect(result).toBe('fn main() {\n let x: int = 1;\n}\n');
9
- });
10
- it('handles nested blocks', () => {
11
- const input = 'fn main() {\nif true {\nlet x: int = 1;\n}\n}';
12
- const result = (0, formatter_1.format)(input);
13
- expect(result).toBe('fn main() {\n if true {\n let x: int = 1;\n }\n}\n');
14
- });
15
- it('trims trailing whitespace', () => {
16
- const input = 'fn main() { \n let x: int = 1; \n} ';
17
- const result = (0, formatter_1.format)(input);
18
- expect(result).toBe('fn main() {\n let x: int = 1;\n}\n');
19
- });
20
- it('ensures single newline at end of file', () => {
21
- const input = 'fn main() {\n}\n\n\n';
22
- const result = (0, formatter_1.format)(input);
23
- expect(result).toBe('fn main() {\n}\n');
24
- });
25
- it('preserves blank lines', () => {
26
- const input = 'fn a() {\n}\n\nfn b() {\n}';
27
- const result = (0, formatter_1.format)(input);
28
- expect(result).toBe('fn a() {\n}\n\nfn b() {\n}\n');
29
- });
30
- it('handles already formatted code', () => {
31
- const input = 'fn main() {\n let x: int = 1;\n}\n';
32
- const result = (0, formatter_1.format)(input);
33
- expect(result).toBe(input);
34
- });
35
- it('handles empty input', () => {
36
- expect((0, formatter_1.format)('')).toBe('\n');
37
- expect((0, formatter_1.format)('\n\n')).toBe('\n');
38
- });
39
- });
40
- //# sourceMappingURL=formatter.test.js.map
@@ -1,343 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const lexer_1 = require("../lexer");
4
- function tokenize(source) {
5
- return new lexer_1.Lexer(source).tokenize();
6
- }
7
- function kinds(tokens) {
8
- return tokens.map(t => t.kind);
9
- }
10
- describe('Lexer', () => {
11
- describe('keywords', () => {
12
- it('recognizes all keywords', () => {
13
- const tokens = tokenize('fn let const if else while for foreach match return as at in is struct impl enum trigger namespace');
14
- expect(kinds(tokens)).toEqual([
15
- 'fn', 'let', 'const', 'if', 'else', 'while', 'for', 'foreach', 'match',
16
- 'return', 'as', 'at', 'in', 'is', 'struct', 'impl', 'enum', 'trigger', 'namespace', 'eof'
17
- ]);
18
- });
19
- it('tokenizes is-check and impl syntax with their dedicated keywords', () => {
20
- const tokens = tokenize('if (e is Player) { } impl Point { }');
21
- expect(kinds(tokens)).toEqual([
22
- 'if', '(', 'ident', 'is', 'ident', ')', '{', '}', 'impl', 'ident', '{', '}', 'eof',
23
- ]);
24
- });
25
- it('recognizes type keywords', () => {
26
- const tokens = tokenize('int bool float string void BlockPos');
27
- expect(kinds(tokens)).toEqual(['int', 'bool', 'float', 'string', 'void', 'BlockPos', 'eof']);
28
- });
29
- it('recognizes boolean literals', () => {
30
- const tokens = tokenize('true false');
31
- expect(kinds(tokens)).toEqual(['true', 'false', 'eof']);
32
- });
33
- });
34
- describe('identifiers', () => {
35
- it('tokenizes simple identifiers', () => {
36
- const tokens = tokenize('foo bar_baz _private x1');
37
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
38
- ['ident', 'foo'],
39
- ['ident', 'bar_baz'],
40
- ['ident', '_private'],
41
- ['ident', 'x1'],
42
- ['eof', ''],
43
- ]);
44
- });
45
- });
46
- describe('literals', () => {
47
- it('tokenizes integer literals', () => {
48
- const tokens = tokenize('42 0 123');
49
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
50
- ['int_lit', '42'],
51
- ['int_lit', '0'],
52
- ['int_lit', '123'],
53
- ['eof', ''],
54
- ]);
55
- });
56
- it('tokenizes float literals', () => {
57
- const tokens = tokenize('3.14 0.5 10.0');
58
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
59
- ['float_lit', '3.14'],
60
- ['float_lit', '0.5'],
61
- ['float_lit', '10.0'],
62
- ['eof', ''],
63
- ]);
64
- });
65
- it('tokenizes string literals', () => {
66
- const tokens = tokenize('"hello" "world" "with \\"quotes\\""');
67
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
68
- ['string_lit', 'hello'],
69
- ['string_lit', 'world'],
70
- ['string_lit', 'with "quotes"'],
71
- ['eof', ''],
72
- ]);
73
- });
74
- it('tokenizes interpolated strings as a single string token', () => {
75
- const tokens = tokenize('"hello ${name + 1}"');
76
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
77
- ['string_lit', 'hello ${name + 1}'],
78
- ['eof', ''],
79
- ]);
80
- });
81
- it('tokenizes f-strings as a dedicated token', () => {
82
- const tokens = tokenize('f"Hello {name}!"');
83
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
84
- ['f_string', 'Hello {name}!'],
85
- ['eof', ''],
86
- ]);
87
- });
88
- it('tokenizes byte literals (b suffix)', () => {
89
- const tokens = tokenize('20b 0B 127b');
90
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
91
- ['byte_lit', '20b'],
92
- ['byte_lit', '0B'],
93
- ['byte_lit', '127b'],
94
- ['eof', ''],
95
- ]);
96
- });
97
- it('tokenizes short literals (s suffix)', () => {
98
- const tokens = tokenize('100s 0S 32767s');
99
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
100
- ['short_lit', '100s'],
101
- ['short_lit', '0S'],
102
- ['short_lit', '32767s'],
103
- ['eof', ''],
104
- ]);
105
- });
106
- it('tokenizes long literals (L suffix)', () => {
107
- const tokens = tokenize('1000L 0l 999999L');
108
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
109
- ['long_lit', '1000L'],
110
- ['long_lit', '0l'],
111
- ['long_lit', '999999L'],
112
- ['eof', ''],
113
- ]);
114
- });
115
- it('tokenizes float literals with f suffix', () => {
116
- const tokens = tokenize('3.14f 0.5F 10.0f');
117
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
118
- ['float_lit', '3.14f'],
119
- ['float_lit', '0.5F'],
120
- ['float_lit', '10.0f'],
121
- ['eof', ''],
122
- ]);
123
- });
124
- it('tokenizes double literals (d suffix)', () => {
125
- const tokens = tokenize('3.14d 0.5D 10.0d');
126
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
127
- ['double_lit', '3.14d'],
128
- ['double_lit', '0.5D'],
129
- ['double_lit', '10.0d'],
130
- ['eof', ''],
131
- ]);
132
- });
133
- it('tokenizes integer with f/d suffix as float/double', () => {
134
- const tokens = tokenize('5f 10d');
135
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
136
- ['float_lit', '5f'],
137
- ['double_lit', '10d'],
138
- ['eof', ''],
139
- ]);
140
- });
141
- it('does not treat suffix-like letters in identifiers as NBT suffixes', () => {
142
- // 1b2 should not be byte_lit — the 'b' is followed by a digit
143
- const tokens = tokenize('1b2');
144
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
145
- ['int_lit', '1'],
146
- ['ident', 'b2'],
147
- ['eof', ''],
148
- ]);
149
- });
150
- it('tokenizes range literals', () => {
151
- const tokens = tokenize('..5 1.. 1..10');
152
- expect(tokens.map(t => [t.kind, t.value])).toEqual([
153
- ['range_lit', '..5'],
154
- ['range_lit', '1..'],
155
- ['range_lit', '1..10'],
156
- ['eof', ''],
157
- ]);
158
- });
159
- });
160
- describe('operators', () => {
161
- it('tokenizes arithmetic operators', () => {
162
- const tokens = tokenize('+ - * / %');
163
- expect(kinds(tokens)).toEqual(['+', '-', '*', '/', '%', 'eof']);
164
- });
165
- it('tokenizes relative and local coordinates', () => {
166
- const tokens = tokenize('~ ~5 ~-3 ^ ^10 ^-2');
167
- expect(kinds(tokens)).toEqual(['rel_coord', 'rel_coord', 'rel_coord', 'local_coord', 'local_coord', 'local_coord', 'eof']);
168
- expect(tokens[0].value).toBe('~');
169
- expect(tokens[1].value).toBe('~5');
170
- expect(tokens[2].value).toBe('~-3');
171
- expect(tokens[3].value).toBe('^');
172
- expect(tokens[4].value).toBe('^10');
173
- expect(tokens[5].value).toBe('^-2');
174
- });
175
- it('tokenizes comparison operators', () => {
176
- const tokens = tokenize('== != < <= > >=');
177
- expect(kinds(tokens)).toEqual(['==', '!=', '<', '<=', '>', '>=', 'eof']);
178
- });
179
- it('tokenizes logical operators', () => {
180
- const tokens = tokenize('&& || !');
181
- expect(kinds(tokens)).toEqual(['&&', '||', '!', 'eof']);
182
- });
183
- it('tokenizes assignment operators', () => {
184
- const tokens = tokenize('= += -= *= /= %=');
185
- expect(kinds(tokens)).toEqual(['=', '+=', '-=', '*=', '/=', '%=', 'eof']);
186
- });
187
- it('tokenizes arrow operator', () => {
188
- const tokens = tokenize('->');
189
- expect(kinds(tokens)).toEqual(['->', 'eof']);
190
- });
191
- it('tokenizes fat arrow operator', () => {
192
- const tokens = tokenize('=>');
193
- expect(kinds(tokens)).toEqual(['=>', 'eof']);
194
- });
195
- it('tokenizes static method separators for impl methods', () => {
196
- const tokens = tokenize('Point::new()');
197
- expect(kinds(tokens)).toEqual(['ident', '::', 'ident', '(', ')', 'eof']);
198
- });
199
- });
200
- describe('delimiters', () => {
201
- it('tokenizes all delimiters', () => {
202
- const tokens = tokenize('{ } ( ) [ ] , ; : .');
203
- expect(kinds(tokens)).toEqual(['{', '}', '(', ')', '[', ']', ',', ';', ':', '.', 'eof']);
204
- });
205
- });
206
- describe('selectors', () => {
207
- it('tokenizes simple selectors', () => {
208
- const tokens = tokenize('@a @e @s @p @r @n');
209
- expect(tokens.filter(t => t.kind !== 'eof').map(t => [t.kind, t.value])).toEqual([
210
- ['selector', '@a'],
211
- ['selector', '@e'],
212
- ['selector', '@s'],
213
- ['selector', '@p'],
214
- ['selector', '@r'],
215
- ['selector', '@n'],
216
- ]);
217
- });
218
- it('tokenizes selectors with parameters', () => {
219
- const tokens = tokenize('@e[type=zombie] @a[distance=..5]');
220
- expect(tokens.filter(t => t.kind !== 'eof').map(t => [t.kind, t.value])).toEqual([
221
- ['selector', '@e[type=zombie]'],
222
- ['selector', '@a[distance=..5]'],
223
- ]);
224
- });
225
- it('tokenizes selectors with complex NBT', () => {
226
- const tokens = tokenize('@e[type=zombie, nbt={NoAI:1b}]');
227
- expect(tokens.filter(t => t.kind !== 'eof').map(t => [t.kind, t.value])).toEqual([
228
- ['selector', '@e[type=zombie, nbt={NoAI:1b}]'],
229
- ]);
230
- });
231
- it('handles nested braces in selector NBT', () => {
232
- const tokens = tokenize('@e[nbt={Items:[{id:"stone"}]}]');
233
- expect(tokens.filter(t => t.kind !== 'eof').map(t => [t.kind, t.value])).toEqual([
234
- ['selector', '@e[nbt={Items:[{id:"stone"}]}]'],
235
- ]);
236
- });
237
- });
238
- describe('decorators', () => {
239
- it('tokenizes simple decorators', () => {
240
- const tokens = tokenize('@tick @on_trigger');
241
- expect(tokens.filter(t => t.kind !== 'eof').map(t => [t.kind, t.value])).toEqual([
242
- ['decorator', '@tick'],
243
- ['decorator', '@on_trigger'],
244
- ]);
245
- });
246
- it('tokenizes decorators with arguments', () => {
247
- const tokens = tokenize('@tick(rate=20)');
248
- expect(tokens.filter(t => t.kind !== 'eof').map(t => [t.kind, t.value])).toEqual([
249
- ['decorator', '@tick(rate=20)'],
250
- ]);
251
- });
252
- });
253
- describe('raw commands', () => {
254
- it('tokenizes raw command', () => {
255
- const tokens = tokenize('raw("say hello")');
256
- expect(tokens.filter(t => t.kind !== 'eof').map(t => [t.kind, t.value])).toEqual([
257
- ['raw_cmd', 'say hello'],
258
- ]);
259
- });
260
- });
261
- describe('comments', () => {
262
- it('skips line comments', () => {
263
- const tokens = tokenize('let x = 5 // this is a comment\nlet y = 10');
264
- expect(kinds(tokens)).toEqual(['let', 'ident', '=', 'int_lit', 'let', 'ident', '=', 'int_lit', 'eof']);
265
- });
266
- });
267
- describe('complex expressions', () => {
268
- it('tokenizes function declaration', () => {
269
- const source = 'fn add(a: int, b: int) -> int { return a + b; }';
270
- const tokens = tokenize(source);
271
- expect(kinds(tokens)).toEqual([
272
- 'fn', 'ident', '(', 'ident', ':', 'int', ',', 'ident', ':', 'int', ')',
273
- '->', 'int', '{', 'return', 'ident', '+', 'ident', ';', '}', 'eof'
274
- ]);
275
- });
276
- it('tokenizes foreach statement', () => {
277
- const source = 'foreach (z in @e[type=zombie]) { kill(z); }';
278
- const tokens = tokenize(source);
279
- expect(kinds(tokens)).toEqual([
280
- 'foreach', '(', 'ident', 'in', 'selector', ')', '{', 'ident', '(', 'ident', ')', ';', '}', 'eof'
281
- ]);
282
- });
283
- it('tokenizes decorated function', () => {
284
- const source = '@tick(rate=20)\nfn heartbeat() { say("alive"); }';
285
- const tokens = tokenize(source);
286
- expect(kinds(tokens)).toEqual([
287
- 'decorator', 'fn', 'ident', '(', ')', '{', 'ident', '(', 'string_lit', ')', ';', '}', 'eof'
288
- ]);
289
- });
290
- });
291
- describe('line/column tracking', () => {
292
- it('tracks line and column correctly', () => {
293
- const source = 'let x\nlet y';
294
- const tokens = tokenize(source);
295
- expect(tokens[0]).toMatchObject({ kind: 'let', line: 1, col: 1 });
296
- expect(tokens[1]).toMatchObject({ kind: 'ident', value: 'x', line: 1, col: 5 });
297
- expect(tokens[2]).toMatchObject({ kind: 'let', line: 2, col: 1 });
298
- expect(tokens[3]).toMatchObject({ kind: 'ident', value: 'y', line: 2, col: 5 });
299
- });
300
- });
301
- describe('edge cases', () => {
302
- it('handles empty input', () => {
303
- const tokens = tokenize('');
304
- expect(kinds(tokens)).toEqual(['eof']);
305
- });
306
- it('handles whitespace only', () => {
307
- const tokens = tokenize(' \n\t ');
308
- expect(kinds(tokens)).toEqual(['eof']);
309
- });
310
- it('distinguishes selector from decorator', () => {
311
- // @a is selector (single char followed by non-letter)
312
- // @aa would be decorator
313
- const tokens = tokenize('@a @aa');
314
- expect(tokens.filter(t => t.kind !== 'eof').map(t => [t.kind, t.value])).toEqual([
315
- ['selector', '@a'],
316
- ['decorator', '@aa'],
317
- ]);
318
- });
319
- });
320
- });
321
- describe('Block comments', () => {
322
- it('skips single-line block comment', () => {
323
- const src = `/* comment */ fn test() {}`;
324
- const tokens = tokenize(src);
325
- expect(tokens.map(t => t.kind)).not.toContain('/');
326
- expect(tokens.find(t => t.kind === 'fn')).toBeDefined();
327
- });
328
- it('skips multi-line block comment', () => {
329
- const src = `/**
330
- * JSDoc comment
331
- */
332
- fn test() {}`;
333
- const tokens = tokenize(src);
334
- expect(tokens.map(t => t.kind)).not.toContain('/');
335
- expect(tokens.find(t => t.kind === 'fn')).toBeDefined();
336
- });
337
- it('handles block comment with asterisks', () => {
338
- const src = `/*** stars ***/fn x(){}`;
339
- const tokens = tokenize(src);
340
- expect(tokens.find(t => t.kind === 'fn')).toBeDefined();
341
- });
342
- });
343
- //# sourceMappingURL=lexer.test.js.map