redscript-mc 2.5.0 → 2.6.2

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 (1243) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +5 -75
  3. package/README.zh.md +165 -147
  4. package/ROADMAP.md +195 -0
  5. package/dist/data/linalg/function/_vec2d_len_sq_fx.mcfunction +17 -0
  6. package/dist/data/linalg/function/_vec3d_len_sq_fx.mcfunction +27 -0
  7. package/dist/data/linalg/function/load.mcfunction +1 -0
  8. package/dist/data/linalg/function/mat2d_det.mcfunction +16 -0
  9. package/dist/data/linalg/function/mat2d_mul_r0c0.mcfunction +16 -0
  10. package/dist/data/linalg/function/mat2d_mul_r0c1.mcfunction +16 -0
  11. package/dist/data/linalg/function/mat2d_mul_r1c0.mcfunction +16 -0
  12. package/dist/data/linalg/function/mat2d_mul_r1c1.mcfunction +16 -0
  13. package/dist/data/linalg/function/mat2d_vecmul_x.mcfunction +16 -0
  14. package/dist/data/linalg/function/mat2d_vecmul_y.mcfunction +16 -0
  15. package/dist/data/linalg/function/solve2d_x.mcfunction +27 -0
  16. package/dist/data/linalg/function/solve2d_y.mcfunction +27 -0
  17. package/dist/data/linalg/function/vec2d_dist.mcfunction +15 -0
  18. package/dist/data/linalg/function/vec2d_dot.mcfunction +16 -0
  19. package/dist/data/linalg/function/vec2d_length.mcfunction +21 -0
  20. package/dist/data/linalg/function/vec2d_normalize_x.mcfunction +8 -0
  21. package/dist/data/linalg/function/vec2d_normalize_x__merge_1.mcfunction +10 -0
  22. package/dist/data/linalg/function/vec2d_normalize_x__then_0.mcfunction +3 -0
  23. package/dist/data/linalg/function/vec2d_normalize_y.mcfunction +8 -0
  24. package/dist/data/linalg/function/vec2d_normalize_y__merge_1.mcfunction +10 -0
  25. package/dist/data/linalg/function/vec2d_normalize_y__then_0.mcfunction +3 -0
  26. package/dist/data/linalg/function/vec3d_cross_x.mcfunction +16 -0
  27. package/dist/data/linalg/function/vec3d_cross_y.mcfunction +16 -0
  28. package/dist/data/linalg/function/vec3d_cross_z.mcfunction +16 -0
  29. package/dist/data/linalg/function/vec3d_dist.mcfunction +21 -0
  30. package/dist/data/linalg/function/vec3d_dot.mcfunction +26 -0
  31. package/dist/data/linalg/function/vec3d_length.mcfunction +31 -0
  32. package/dist/data/linalg/function/vec3d_normalize_x.mcfunction +9 -0
  33. package/dist/data/linalg/function/vec3d_normalize_x__merge_1.mcfunction +11 -0
  34. package/dist/data/linalg/function/vec3d_normalize_x__then_0.mcfunction +3 -0
  35. package/dist/data/linalg/function/vec3d_normalize_y.mcfunction +9 -0
  36. package/dist/data/linalg/function/vec3d_normalize_y__merge_1.mcfunction +11 -0
  37. package/dist/data/linalg/function/vec3d_normalize_y__then_0.mcfunction +3 -0
  38. package/dist/data/linalg/function/vec3d_normalize_z.mcfunction +9 -0
  39. package/dist/data/linalg/function/vec3d_normalize_z__merge_1.mcfunction +11 -0
  40. package/dist/data/linalg/function/vec3d_normalize_z__then_0.mcfunction +3 -0
  41. package/dist/data/math_hp/function/cos_hp.mcfunction +8 -0
  42. package/dist/data/math_hp/function/div3_hp.mcfunction +23 -0
  43. package/dist/data/math_hp/function/div_hp.mcfunction +13 -0
  44. package/dist/data/math_hp/function/init_div.mcfunction +1 -0
  45. package/dist/data/math_hp/function/init_trig.mcfunction +1 -0
  46. package/dist/data/math_hp/function/ln_5term.mcfunction +6 -0
  47. package/dist/data/math_hp/function/ln_5term__loop_body_1.mcfunction +8 -0
  48. package/dist/data/math_hp/function/ln_5term__loop_body_4.mcfunction +8 -0
  49. package/dist/data/math_hp/function/ln_5term__loop_exit_2.mcfunction +1 -0
  50. package/dist/data/math_hp/function/ln_5term__loop_exit_5.mcfunction +61 -0
  51. package/dist/data/math_hp/function/ln_5term__loop_header_0.mcfunction +3 -0
  52. package/dist/data/math_hp/function/ln_5term__loop_header_3.mcfunction +6 -0
  53. package/dist/data/math_hp/function/load.mcfunction +1 -0
  54. package/dist/data/math_hp/function/norm3_hp.mcfunction +43 -0
  55. package/dist/data/math_hp/function/sin_hp.mcfunction +8 -0
  56. package/dist/data/math_hp/function/sqrt_hp.mcfunction +17 -0
  57. package/dist/data/math_hp/function/sqrt_hp__merge_1.mcfunction +21 -0
  58. package/dist/data/math_hp/function/sqrt_hp__then_0.mcfunction +2 -0
  59. package/dist/data/minecraft/tags/function/load.json +1 -2
  60. package/dist/data/minecraft/tags/function/tick.json +1 -1
  61. package/dist/data/readme_demo/function/_draw.mcfunction +1 -0
  62. package/dist/data/readme_demo/function/_init.mcfunction +1 -0
  63. package/dist/data/readme_demo/function/_math_init.mcfunction +4 -0
  64. package/dist/data/readme_demo/function/_wave_tick.mcfunction +1 -0
  65. package/dist/data/readme_demo/function/_wave_tick__foreach_t8.mcfunction +109 -0
  66. package/dist/data/readme_demo/function/acos_approx.mcfunction +7 -0
  67. package/dist/data/readme_demo/function/approx_eq.mcfunction +10 -0
  68. package/dist/data/readme_demo/function/approx_eq__merge_1.mcfunction +3 -0
  69. package/dist/data/readme_demo/function/approx_eq__merge_3.mcfunction +2 -0
  70. package/dist/data/readme_demo/function/approx_eq__then_0.mcfunction +4 -0
  71. package/dist/data/readme_demo/function/approx_eq__then_2.mcfunction +2 -0
  72. package/dist/data/readme_demo/function/asin_approx.mcfunction +5 -0
  73. package/dist/data/readme_demo/function/asin_approx__merge_1.mcfunction +3 -0
  74. package/dist/data/readme_demo/function/asin_approx__merge_10.mcfunction +5 -0
  75. package/dist/data/readme_demo/function/asin_approx__merge_4.mcfunction +12 -0
  76. package/dist/data/readme_demo/function/asin_approx__merge_7.mcfunction +14 -0
  77. package/dist/data/readme_demo/function/asin_approx__then_0.mcfunction +2 -0
  78. package/dist/data/readme_demo/function/asin_approx__then_3.mcfunction +2 -0
  79. package/dist/data/readme_demo/function/asin_approx__then_6.mcfunction +2 -0
  80. package/dist/data/readme_demo/function/asin_approx__then_9.mcfunction +2 -0
  81. package/dist/data/readme_demo/function/cbrt_fx.mcfunction +5 -0
  82. package/dist/data/readme_demo/function/cbrt_fx__loop_body_6.mcfunction +7 -0
  83. package/dist/data/readme_demo/function/cbrt_fx__loop_exit_7.mcfunction +1 -0
  84. package/dist/data/readme_demo/function/cbrt_fx__loop_header_5.mcfunction +4 -0
  85. package/dist/data/readme_demo/function/cbrt_fx__merge_1.mcfunction +8 -0
  86. package/dist/data/readme_demo/function/cbrt_fx__merge_11.mcfunction +5 -0
  87. package/dist/data/readme_demo/function/cbrt_fx__merge_13.mcfunction +4 -0
  88. package/dist/data/readme_demo/function/cbrt_fx__merge_4.mcfunction +2 -0
  89. package/dist/data/readme_demo/function/cbrt_fx__merge_9.mcfunction +13 -0
  90. package/dist/data/readme_demo/function/cbrt_fx__then_0.mcfunction +2 -0
  91. package/dist/data/readme_demo/function/cbrt_fx__then_10.mcfunction +2 -0
  92. package/dist/data/readme_demo/function/cbrt_fx__then_12.mcfunction +2 -0
  93. package/dist/data/readme_demo/function/cbrt_fx__then_3.mcfunction +2 -0
  94. package/dist/data/readme_demo/function/cbrt_fx__then_8.mcfunction +2 -0
  95. package/dist/data/readme_demo/function/cbrt_newton.mcfunction +5 -0
  96. package/dist/data/readme_demo/function/cbrt_newton__else_7.mcfunction +2 -0
  97. package/dist/data/readme_demo/function/cbrt_newton__merge_1.mcfunction +11 -0
  98. package/dist/data/readme_demo/function/cbrt_newton__merge_4.mcfunction +1 -0
  99. package/dist/data/readme_demo/function/cbrt_newton__merge_6.mcfunction +1 -0
  100. package/dist/data/readme_demo/function/cbrt_newton__then_0.mcfunction +2 -0
  101. package/dist/data/readme_demo/function/cbrt_newton__then_3.mcfunction +17 -0
  102. package/dist/data/readme_demo/function/cbrt_newton__then_5.mcfunction +11 -0
  103. package/dist/data/readme_demo/function/ceil_div.mcfunction +9 -0
  104. package/dist/data/readme_demo/function/combinations.mcfunction +6 -0
  105. package/dist/data/readme_demo/function/combinations__loop_body_9.mcfunction +15 -0
  106. package/dist/data/readme_demo/function/combinations__loop_exit_10.mcfunction +1 -0
  107. package/dist/data/readme_demo/function/combinations__loop_header_8.mcfunction +3 -0
  108. package/dist/data/readme_demo/function/combinations__merge_1.mcfunction +3 -0
  109. package/dist/data/readme_demo/function/combinations__merge_4.mcfunction +6 -0
  110. package/dist/data/readme_demo/function/combinations__merge_7.mcfunction +3 -0
  111. package/dist/data/readme_demo/function/combinations__then_0.mcfunction +2 -0
  112. package/dist/data/readme_demo/function/combinations__then_3.mcfunction +2 -0
  113. package/dist/data/readme_demo/function/combinations__then_6.mcfunction +4 -0
  114. package/dist/data/readme_demo/function/cos_fixed.mcfunction +7 -0
  115. package/dist/data/readme_demo/function/cubic_disc_fx.mcfunction +26 -0
  116. package/dist/data/readme_demo/function/cubic_newton.mcfunction +8 -0
  117. package/dist/data/readme_demo/function/cubic_newton__loop_body_1.mcfunction +55 -0
  118. package/dist/data/readme_demo/function/cubic_newton__loop_exit_2.mcfunction +1 -0
  119. package/dist/data/readme_demo/function/cubic_newton__loop_header_0.mcfunction +4 -0
  120. package/dist/data/readme_demo/function/cubic_newton__merge_10.mcfunction +1 -0
  121. package/dist/data/readme_demo/function/cubic_newton__merge_4.mcfunction +4 -0
  122. package/dist/data/readme_demo/function/cubic_newton__merge_6.mcfunction +4 -0
  123. package/dist/data/readme_demo/function/cubic_newton__merge_8.mcfunction +4 -0
  124. package/dist/data/readme_demo/function/cubic_newton__then_3.mcfunction +2 -0
  125. package/dist/data/readme_demo/function/cubic_newton__then_5.mcfunction +13 -0
  126. package/dist/data/readme_demo/function/cubic_newton__then_7.mcfunction +4 -0
  127. package/dist/data/readme_demo/function/cubic_newton__then_9.mcfunction +2 -0
  128. package/dist/data/readme_demo/function/divfix.mcfunction +6 -0
  129. package/dist/data/readme_demo/function/divfix__merge_1.mcfunction +6 -0
  130. package/dist/data/readme_demo/function/divfix__then_0.mcfunction +2 -0
  131. package/dist/data/readme_demo/function/exp_fx.mcfunction +16 -0
  132. package/dist/data/readme_demo/function/exp_fx__loop_body_10.mcfunction +8 -0
  133. package/dist/data/readme_demo/function/exp_fx__loop_body_5.mcfunction +8 -0
  134. package/dist/data/readme_demo/function/exp_fx__loop_exit_11.mcfunction +1 -0
  135. package/dist/data/readme_demo/function/exp_fx__loop_exit_6.mcfunction +1 -0
  136. package/dist/data/readme_demo/function/exp_fx__loop_header_4.mcfunction +3 -0
  137. package/dist/data/readme_demo/function/exp_fx__loop_header_9.mcfunction +3 -0
  138. package/dist/data/readme_demo/function/exp_fx__merge_1.mcfunction +47 -0
  139. package/dist/data/readme_demo/function/exp_fx__merge_3.mcfunction +4 -0
  140. package/dist/data/readme_demo/function/exp_fx__merge_8.mcfunction +1 -0
  141. package/dist/data/readme_demo/function/exp_fx__then_0.mcfunction +7 -0
  142. package/dist/data/readme_demo/function/exp_fx__then_2.mcfunction +2 -0
  143. package/dist/data/readme_demo/function/exp_fx__then_7.mcfunction +5 -0
  144. package/dist/data/readme_demo/function/factorial.mcfunction +5 -0
  145. package/dist/data/readme_demo/function/factorial__loop_body_4.mcfunction +7 -0
  146. package/dist/data/readme_demo/function/factorial__loop_exit_5.mcfunction +1 -0
  147. package/dist/data/readme_demo/function/factorial__loop_header_3.mcfunction +3 -0
  148. package/dist/data/readme_demo/function/factorial__merge_1.mcfunction +3 -0
  149. package/dist/data/readme_demo/function/factorial__then_0.mcfunction +2 -0
  150. package/dist/data/readme_demo/function/gamma_int.mcfunction +5 -0
  151. package/dist/data/readme_demo/function/gamma_int__merge_1.mcfunction +6 -0
  152. package/dist/data/readme_demo/function/gamma_int__then_0.mcfunction +2 -0
  153. package/dist/data/readme_demo/function/gcd.mcfunction +7 -0
  154. package/dist/data/readme_demo/function/gcd__loop_body_5.mcfunction +5 -0
  155. package/dist/data/readme_demo/function/gcd__loop_exit_6.mcfunction +1 -0
  156. package/dist/data/readme_demo/function/gcd__loop_header_4.mcfunction +4 -0
  157. package/dist/data/readme_demo/function/gcd__merge_1.mcfunction +5 -0
  158. package/dist/data/readme_demo/function/gcd__merge_3.mcfunction +1 -0
  159. package/dist/data/readme_demo/function/gcd__then_0.mcfunction +4 -0
  160. package/dist/data/readme_demo/function/gcd__then_2.mcfunction +4 -0
  161. package/dist/data/readme_demo/function/isqrt.mcfunction +5 -0
  162. package/dist/data/readme_demo/function/isqrt__loop_body_10.mcfunction +8 -0
  163. package/dist/data/readme_demo/function/isqrt__loop_body_13.mcfunction +11 -0
  164. package/dist/data/readme_demo/function/isqrt__loop_body_7.mcfunction +8 -0
  165. package/dist/data/readme_demo/function/isqrt__loop_exit_11.mcfunction +2 -0
  166. package/dist/data/readme_demo/function/isqrt__loop_exit_14.mcfunction +1 -0
  167. package/dist/data/readme_demo/function/isqrt__loop_exit_8.mcfunction +9 -0
  168. package/dist/data/readme_demo/function/isqrt__loop_header_12.mcfunction +4 -0
  169. package/dist/data/readme_demo/function/isqrt__loop_header_6.mcfunction +4 -0
  170. package/dist/data/readme_demo/function/isqrt__loop_header_9.mcfunction +3 -0
  171. package/dist/data/readme_demo/function/isqrt__merge_1.mcfunction +4 -0
  172. package/dist/data/readme_demo/function/isqrt__merge_16.mcfunction +5 -0
  173. package/dist/data/readme_demo/function/isqrt__merge_4.mcfunction +3 -0
  174. package/dist/data/readme_demo/function/isqrt__then_0.mcfunction +2 -0
  175. package/dist/data/readme_demo/function/isqrt__then_15.mcfunction +1 -0
  176. package/dist/data/readme_demo/function/isqrt__then_3.mcfunction +2 -0
  177. package/dist/data/readme_demo/function/lcm.mcfunction +11 -0
  178. package/dist/data/readme_demo/function/lcm__merge_1.mcfunction +5 -0
  179. package/dist/data/readme_demo/function/lcm__then_0.mcfunction +2 -0
  180. package/dist/data/readme_demo/function/lerp.mcfunction +13 -0
  181. package/dist/data/readme_demo/function/ln.mcfunction +9 -0
  182. package/dist/data/readme_demo/function/ln__loop_body_1.mcfunction +8 -0
  183. package/dist/data/readme_demo/function/ln__loop_body_4.mcfunction +8 -0
  184. package/dist/data/readme_demo/function/ln__loop_exit_2.mcfunction +1 -0
  185. package/dist/data/readme_demo/function/ln__loop_exit_5.mcfunction +37 -0
  186. package/dist/data/readme_demo/function/ln__loop_header_0.mcfunction +3 -0
  187. package/dist/data/readme_demo/function/ln__loop_header_3.mcfunction +6 -0
  188. package/dist/data/readme_demo/function/load.mcfunction +1 -0
  189. package/dist/data/readme_demo/function/log10_fx.mcfunction +11 -0
  190. package/dist/data/readme_demo/function/log2_fx.mcfunction +11 -0
  191. package/dist/data/readme_demo/function/log2_int.mcfunction +5 -0
  192. package/dist/data/readme_demo/function/log2_int__loop_body_4.mcfunction +8 -0
  193. package/dist/data/readme_demo/function/log2_int__loop_exit_5.mcfunction +1 -0
  194. package/dist/data/readme_demo/function/log2_int__loop_header_3.mcfunction +4 -0
  195. package/dist/data/readme_demo/function/log2_int__merge_1.mcfunction +3 -0
  196. package/dist/data/readme_demo/function/log2_int__then_0.mcfunction +2 -0
  197. package/dist/data/readme_demo/function/loga_fx.mcfunction +10 -0
  198. package/dist/data/readme_demo/function/loga_fx__merge_1.mcfunction +9 -0
  199. package/dist/data/readme_demo/function/loga_fx__then_0.mcfunction +2 -0
  200. package/dist/data/readme_demo/function/map.mcfunction +12 -0
  201. package/dist/data/readme_demo/function/map__merge_1.mcfunction +11 -0
  202. package/dist/data/readme_demo/function/map__then_0.mcfunction +1 -0
  203. package/dist/data/readme_demo/function/mulfix.mcfunction +8 -0
  204. package/dist/data/readme_demo/function/newton_step.mcfunction +7 -0
  205. package/dist/data/readme_demo/function/newton_step__merge_1.mcfunction +8 -0
  206. package/dist/data/readme_demo/function/newton_step__then_0.mcfunction +1 -0
  207. package/dist/data/readme_demo/function/pow_int.mcfunction +6 -0
  208. package/dist/data/readme_demo/function/pow_int__loop_body_4.mcfunction +7 -0
  209. package/dist/data/readme_demo/function/pow_int__loop_exit_5.mcfunction +1 -0
  210. package/dist/data/readme_demo/function/pow_int__loop_header_3.mcfunction +4 -0
  211. package/dist/data/readme_demo/function/pow_int__merge_1.mcfunction +4 -0
  212. package/dist/data/readme_demo/function/pow_int__merge_7.mcfunction +8 -0
  213. package/dist/data/readme_demo/function/pow_int__then_0.mcfunction +2 -0
  214. package/dist/data/readme_demo/function/pow_int__then_6.mcfunction +4 -0
  215. package/dist/data/readme_demo/function/quadratic_disc.mcfunction +12 -0
  216. package/dist/data/readme_demo/function/quadratic_x1.mcfunction +7 -0
  217. package/dist/data/readme_demo/function/quadratic_x1__merge_1.mcfunction +13 -0
  218. package/dist/data/readme_demo/function/quadratic_x1__merge_4.mcfunction +15 -0
  219. package/dist/data/readme_demo/function/quadratic_x1__then_0.mcfunction +2 -0
  220. package/dist/data/readme_demo/function/quadratic_x1__then_3.mcfunction +2 -0
  221. package/dist/data/readme_demo/function/quadratic_x2.mcfunction +7 -0
  222. package/dist/data/readme_demo/function/quadratic_x2__merge_1.mcfunction +13 -0
  223. package/dist/data/readme_demo/function/quadratic_x2__merge_4.mcfunction +15 -0
  224. package/dist/data/readme_demo/function/quadratic_x2__then_0.mcfunction +2 -0
  225. package/dist/data/readme_demo/function/quadratic_x2__then_3.mcfunction +2 -0
  226. package/dist/data/readme_demo/function/sign.mcfunction +5 -0
  227. package/dist/data/readme_demo/function/sign__merge_1.mcfunction +4 -0
  228. package/dist/data/readme_demo/function/sign__merge_4.mcfunction +2 -0
  229. package/dist/data/readme_demo/function/sign__then_0.mcfunction +2 -0
  230. package/dist/data/readme_demo/function/sign__then_3.mcfunction +2 -0
  231. package/dist/data/readme_demo/function/simpson_step.mcfunction +16 -0
  232. package/dist/data/readme_demo/function/sin_fixed.mcfunction +9 -0
  233. package/dist/data/readme_demo/function/sin_fixed__merge_1.mcfunction +4 -0
  234. package/dist/data/readme_demo/function/sin_fixed__merge_3.mcfunction +4 -0
  235. package/dist/data/readme_demo/function/sin_fixed__merge_6.mcfunction +4 -0
  236. package/dist/data/readme_demo/function/sin_fixed__merge_9.mcfunction +10 -0
  237. package/dist/data/readme_demo/function/sin_fixed__then_0.mcfunction +4 -0
  238. package/dist/data/readme_demo/function/sin_fixed__then_2.mcfunction +6 -0
  239. package/dist/data/readme_demo/function/sin_fixed__then_5.mcfunction +8 -0
  240. package/dist/data/readme_demo/function/sin_fixed__then_8.mcfunction +10 -0
  241. package/dist/data/readme_demo/function/smootherstep.mcfunction +10 -0
  242. package/dist/data/readme_demo/function/smootherstep__merge_1.mcfunction +12 -0
  243. package/dist/data/readme_demo/function/smootherstep__merge_4.mcfunction +4 -0
  244. package/dist/data/readme_demo/function/smootherstep__merge_6.mcfunction +27 -0
  245. package/dist/data/readme_demo/function/smootherstep__then_0.mcfunction +2 -0
  246. package/dist/data/readme_demo/function/smootherstep__then_3.mcfunction +2 -0
  247. package/dist/data/readme_demo/function/smootherstep__then_5.mcfunction +2 -0
  248. package/dist/data/readme_demo/function/smoothstep.mcfunction +10 -0
  249. package/dist/data/readme_demo/function/smoothstep__merge_1.mcfunction +12 -0
  250. package/dist/data/readme_demo/function/smoothstep__merge_4.mcfunction +4 -0
  251. package/dist/data/readme_demo/function/smoothstep__merge_6.mcfunction +15 -0
  252. package/dist/data/readme_demo/function/smoothstep__then_0.mcfunction +2 -0
  253. package/dist/data/readme_demo/function/smoothstep__then_3.mcfunction +2 -0
  254. package/dist/data/readme_demo/function/smoothstep__then_5.mcfunction +2 -0
  255. package/dist/data/readme_demo/function/solve2x2_x.mcfunction +17 -0
  256. package/dist/data/readme_demo/function/solve2x2_x__merge_1.mcfunction +12 -0
  257. package/dist/data/readme_demo/function/solve2x2_x__then_0.mcfunction +2 -0
  258. package/dist/data/readme_demo/function/solve2x2_y.mcfunction +17 -0
  259. package/dist/data/readme_demo/function/solve2x2_y__merge_1.mcfunction +12 -0
  260. package/dist/data/readme_demo/function/solve2x2_y__then_0.mcfunction +2 -0
  261. package/dist/data/readme_demo/function/sqrt_fixed.mcfunction +8 -0
  262. package/dist/data/readme_demo/function/sqrt_fx.mcfunction +8 -0
  263. package/dist/data/readme_demo/function/start.mcfunction +2 -0
  264. package/dist/data/readme_demo/function/stop.mcfunction +1 -0
  265. package/dist/data/readme_demo/function/trapezoid_step.mcfunction +11 -0
  266. package/dist/data/stdextra/function/__load.mcfunction +2 -0
  267. package/dist/data/stdextra/function/load.mcfunction +1 -0
  268. package/dist/data/stdextra/function/test_bigint.mcfunction +52 -0
  269. package/dist/data/stdextra/function/test_bits.mcfunction +33 -0
  270. package/dist/data/stdextra/function/test_list_sort.mcfunction +55 -0
  271. package/dist/data/stdextra/function/test_random.mcfunction +17 -0
  272. package/dist/data/stdextra/function/test_random__merge_1.mcfunction +4 -0
  273. package/dist/data/stdextra/function/test_random__merge_11.mcfunction +1 -0
  274. package/dist/data/stdextra/function/test_random__merge_3.mcfunction +14 -0
  275. package/dist/data/stdextra/function/test_random__merge_5.mcfunction +8 -0
  276. package/dist/data/stdextra/function/test_random__merge_7.mcfunction +1 -0
  277. package/dist/data/stdextra/function/test_random__merge_9.mcfunction +1 -0
  278. package/dist/data/stdextra/function/test_random__then_0.mcfunction +4 -0
  279. package/dist/data/stdextra/function/test_random__then_10.mcfunction +2 -0
  280. package/dist/data/stdextra/function/test_random__then_2.mcfunction +2 -0
  281. package/dist/data/stdextra/function/test_random__then_4.mcfunction +4 -0
  282. package/dist/data/stdextra/function/test_random__then_6.mcfunction +2 -0
  283. package/dist/data/stdextra/function/test_random__then_8.mcfunction +4 -0
  284. package/dist/data/test/function/__dyn_idx_test_arrays_nums.mcfunction +1 -0
  285. package/dist/data/test/function/__dyn_idx_test_arrays_parent.mcfunction +1 -0
  286. package/dist/data/test/function/__dyn_idx_test_arrays_queue.mcfunction +1 -0
  287. package/dist/data/test/function/__dyn_idx_test_arrays_rev.mcfunction +1 -0
  288. package/dist/data/test/function/__dyn_idx_test_arrays_visited.mcfunction +1 -0
  289. package/dist/data/test/function/__dyn_wrt_test_arrays_parent.mcfunction +1 -0
  290. package/dist/data/test/function/__dyn_wrt_test_arrays_visited.mcfunction +1 -0
  291. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_1.mcfunction +2 -0
  292. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_1__loop_body_1.mcfunction +17 -0
  293. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_1__loop_body_1_continue.mcfunction +1 -0
  294. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_1__loop_body_1_yield.mcfunction +1 -0
  295. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_1__loop_header_0.mcfunction +4 -0
  296. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_1__loop_header_0_exit.mcfunction +1 -0
  297. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2.mcfunction +2 -0
  298. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__else_8.mcfunction +19 -0
  299. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__loop_body_4.mcfunction +9 -0
  300. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__loop_header_3.mcfunction +3 -0
  301. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__loop_header_3_exit.mcfunction +1 -0
  302. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_10.mcfunction +11 -0
  303. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_12.mcfunction +1 -0
  304. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_14.mcfunction +11 -0
  305. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_16.mcfunction +1 -0
  306. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_18.mcfunction +11 -0
  307. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_20.mcfunction +1 -0
  308. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_22.mcfunction +1 -0
  309. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_24.mcfunction +1 -0
  310. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_7.mcfunction +6 -0
  311. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_7_continue.mcfunction +1 -0
  312. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__merge_7_yield.mcfunction +1 -0
  313. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_11.mcfunction +15 -0
  314. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_13.mcfunction +13 -0
  315. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_15.mcfunction +15 -0
  316. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_17.mcfunction +13 -0
  317. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_19.mcfunction +15 -0
  318. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_21.mcfunction +13 -0
  319. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_23.mcfunction +15 -0
  320. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_6.mcfunction +2 -0
  321. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_2__then_9.mcfunction +13 -0
  322. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3.mcfunction +2 -0
  323. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__else_32.mcfunction +4 -0
  324. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__loop_body_28.mcfunction +6 -0
  325. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__loop_header_27.mcfunction +4 -0
  326. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__loop_header_27_exit.mcfunction +1 -0
  327. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__merge_31.mcfunction +6 -0
  328. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__merge_31_continue.mcfunction +1 -0
  329. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__merge_31_yield.mcfunction +1 -0
  330. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_3__then_30.mcfunction +2 -0
  331. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_4.mcfunction +2 -0
  332. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_4__loop_body_34.mcfunction +16 -0
  333. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_4__loop_body_34_continue.mcfunction +1 -0
  334. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_4__loop_body_34_yield.mcfunction +1 -0
  335. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_4__loop_header_33.mcfunction +4 -0
  336. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_4__loop_header_33_exit.mcfunction +1 -0
  337. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_5.mcfunction +16 -0
  338. package/dist/data/test/function/_coro_pathfind_bfs_coro_cont_5__merge_26.mcfunction +1 -0
  339. package/dist/data/test/function/_coro_pathfind_bfs_coro_tick.mcfunction +4 -0
  340. package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__call_1.mcfunction +1 -0
  341. package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__call_2.mcfunction +1 -0
  342. package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__call_3.mcfunction +1 -0
  343. package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__call_4.mcfunction +1 -0
  344. package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__call_5.mcfunction +1 -0
  345. package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__check_2.mcfunction +4 -0
  346. package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__check_3.mcfunction +4 -0
  347. package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__check_4.mcfunction +4 -0
  348. package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__check_5.mcfunction +4 -0
  349. package/dist/data/test/function/_coro_pathfind_bfs_coro_tick__done.mcfunction +1 -0
  350. package/dist/data/test/function/_hsl_chroma_x.mcfunction +1 -2
  351. package/dist/data/test/function/aabb_contains.mcfunction +1 -2
  352. package/dist/data/test/function/aabb_contains__merge_1.mcfunction +1 -2
  353. package/dist/data/test/function/aabb_contains__merge_10.mcfunction +1 -2
  354. package/dist/data/test/function/aabb_contains__merge_13.mcfunction +1 -2
  355. package/dist/data/test/function/aabb_contains__merge_4.mcfunction +1 -2
  356. package/dist/data/test/function/aabb_contains__merge_7.mcfunction +1 -2
  357. package/dist/data/test/function/acos_approx.mcfunction +7 -0
  358. package/dist/data/test/function/add_to_team.mcfunction +5 -0
  359. package/dist/data/test/function/angle_diff.mcfunction +1 -2
  360. package/dist/data/test/function/angle_normalize__loop_header_0.mcfunction +1 -2
  361. package/dist/data/test/function/angle_normalize__loop_header_3.mcfunction +1 -2
  362. package/dist/data/test/function/angry_at.mcfunction +1 -0
  363. package/dist/data/test/function/apply_damage.mcfunction +12 -0
  364. package/dist/data/test/function/apply_damage__else_2.mcfunction +2 -0
  365. package/dist/data/test/function/apply_damage__merge_1.mcfunction +1 -0
  366. package/dist/data/test/function/apply_damage__then_0.mcfunction +2 -0
  367. package/dist/data/test/function/arr_test.mcfunction +4 -0
  368. package/dist/data/test/function/asin_approx.mcfunction +5 -0
  369. package/dist/data/test/function/asin_approx__merge_1.mcfunction +3 -0
  370. package/dist/data/test/function/asin_approx__merge_10.mcfunction +5 -0
  371. package/dist/data/test/function/asin_approx__merge_4.mcfunction +12 -0
  372. package/dist/data/test/function/asin_approx__merge_7.mcfunction +14 -0
  373. package/dist/data/test/function/asin_approx__then_0.mcfunction +2 -0
  374. package/dist/data/test/function/asin_approx__then_3.mcfunction +2 -0
  375. package/dist/data/test/function/asin_approx__then_6.mcfunction +2 -0
  376. package/dist/data/test/function/asin_approx__then_9.mcfunction +2 -0
  377. package/dist/data/test/function/barrier_wall.mcfunction +1 -0
  378. package/dist/data/test/function/bernoulli.mcfunction +1 -2
  379. package/dist/data/test/function/bernoulli__merge_1.mcfunction +1 -2
  380. package/dist/data/test/function/bigint_chunk.mcfunction +2 -0
  381. package/dist/data/test/function/bigint_div_small.mcfunction +6 -0
  382. package/dist/data/test/function/bigint_div_small__loop_body_1.mcfunction +12 -0
  383. package/dist/data/test/function/bigint_div_small__loop_exit_2.mcfunction +1 -0
  384. package/dist/data/test/function/bigint_div_small__loop_header_0.mcfunction +3 -0
  385. package/dist/data/test/function/bigint_mod_small.mcfunction +6 -0
  386. package/dist/data/test/function/bigint_mod_small__loop_body_1.mcfunction +12 -0
  387. package/dist/data/test/function/bigint_mod_small__loop_exit_2.mcfunction +1 -0
  388. package/dist/data/test/function/bigint_mod_small__loop_header_0.mcfunction +3 -0
  389. package/dist/data/test/function/bit_and__loop_body_1.mcfunction +1 -2
  390. package/dist/data/test/function/bit_and__loop_header_0.mcfunction +1 -2
  391. package/dist/data/test/function/bit_and__then_3.mcfunction +1 -2
  392. package/dist/data/test/function/bit_clear__loop_exit_2.mcfunction +1 -2
  393. package/dist/data/test/function/bit_clear__loop_header_0.mcfunction +1 -2
  394. package/dist/data/test/function/bit_get__loop_header_0.mcfunction +1 -2
  395. package/dist/data/test/function/bit_not__loop_body_1.mcfunction +1 -2
  396. package/dist/data/test/function/bit_not__loop_header_0.mcfunction +1 -2
  397. package/dist/data/test/function/bit_or__loop_body_1.mcfunction +1 -2
  398. package/dist/data/test/function/bit_or__loop_header_0.mcfunction +1 -2
  399. package/dist/data/test/function/bit_or__merge_4.mcfunction +1 -2
  400. package/dist/data/test/function/bit_or__then_5.mcfunction +1 -2
  401. package/dist/data/test/function/bit_set__loop_exit_2.mcfunction +1 -2
  402. package/dist/data/test/function/bit_set__loop_header_0.mcfunction +1 -2
  403. package/dist/data/test/function/bit_shl__loop_header_0.mcfunction +1 -2
  404. package/dist/data/test/function/bit_shr__loop_header_0.mcfunction +1 -2
  405. package/dist/data/test/function/bit_toggle__loop_exit_2.mcfunction +1 -2
  406. package/dist/data/test/function/bit_toggle__loop_header_0.mcfunction +1 -2
  407. package/dist/data/test/function/bit_xor__loop_body_1.mcfunction +1 -2
  408. package/dist/data/test/function/bit_xor__loop_header_0.mcfunction +1 -2
  409. package/dist/data/test/function/buff_all.mcfunction +22 -0
  410. package/dist/data/test/function/cbrt_newton.mcfunction +5 -0
  411. package/dist/data/test/function/cbrt_newton__else_7.mcfunction +2 -0
  412. package/dist/data/test/function/cbrt_newton__merge_1.mcfunction +11 -0
  413. package/dist/data/test/function/cbrt_newton__merge_4.mcfunction +1 -0
  414. package/dist/data/test/function/cbrt_newton__merge_6.mcfunction +1 -0
  415. package/dist/data/test/function/cbrt_newton__then_0.mcfunction +2 -0
  416. package/dist/data/test/function/cbrt_newton__then_3.mcfunction +17 -0
  417. package/dist/data/test/function/cbrt_newton__then_5.mcfunction +11 -0
  418. package/dist/data/test/function/check_holding_item.mcfunction +1 -0
  419. package/dist/data/test/function/check_look_down.mcfunction +1 -0
  420. package/dist/data/test/function/check_look_down__foreach_t0.mcfunction +2 -0
  421. package/dist/data/test/function/check_look_straight.mcfunction +1 -0
  422. package/dist/data/test/function/check_look_straight__foreach_t0.mcfunction +2 -0
  423. package/dist/data/test/function/check_look_up.mcfunction +1 -0
  424. package/dist/data/test/function/check_look_up__foreach_t0.mcfunction +2 -0
  425. package/dist/data/test/function/cleanup_teams.mcfunction +8 -0
  426. package/dist/data/test/function/clear_area.mcfunction +1 -0
  427. package/dist/data/test/function/clear_effect.mcfunction +1 -0
  428. package/dist/data/test/function/clear_effects.mcfunction +1 -0
  429. package/dist/data/test/function/clear_inventory.mcfunction +1 -0
  430. package/dist/data/test/function/cooldown_ready.mcfunction +7 -0
  431. package/dist/data/test/function/cooldown_ready__merge_1.mcfunction +4 -0
  432. package/dist/data/test/function/cooldown_ready__merge_4.mcfunction +2 -0
  433. package/dist/data/test/function/cooldown_ready__then_0.mcfunction +2 -0
  434. package/dist/data/test/function/cooldown_ready__then_3.mcfunction +2 -0
  435. package/dist/data/test/function/cooldown_start.mcfunction +3 -0
  436. package/dist/data/test/function/cooldown_tick.mcfunction +7 -0
  437. package/dist/data/test/function/cooldown_tick__else_5.mcfunction +2 -0
  438. package/dist/data/test/function/cooldown_tick__merge_1.mcfunction +4 -0
  439. package/dist/data/test/function/cooldown_tick__merge_4.mcfunction +1 -0
  440. package/dist/data/test/function/cooldown_tick__merge_7.mcfunction +1 -0
  441. package/dist/data/test/function/cooldown_tick__then_0.mcfunction +1 -0
  442. package/dist/data/test/function/cooldown_tick__then_3.mcfunction +7 -0
  443. package/dist/data/test/function/cooldown_tick__then_6.mcfunction +2 -0
  444. package/dist/data/test/function/cos_hp.mcfunction +4 -2
  445. package/dist/data/test/function/create_blue_team.mcfunction +10 -0
  446. package/dist/data/test/function/create_green_team.mcfunction +10 -0
  447. package/dist/data/test/function/create_health_bar.mcfunction +24 -0
  448. package/dist/data/test/function/create_progress_bar.mcfunction +24 -0
  449. package/dist/data/test/function/create_red_team.mcfunction +10 -0
  450. package/dist/data/test/function/create_team.mcfunction +8 -0
  451. package/dist/data/test/function/create_timer_bar.mcfunction +30 -0
  452. package/dist/data/test/function/create_yellow_team.mcfunction +10 -0
  453. package/dist/data/test/function/cubic_disc_fx.mcfunction +26 -0
  454. package/dist/data/test/function/cubic_newton.mcfunction +8 -0
  455. package/dist/data/test/function/cubic_newton__loop_body_1.mcfunction +55 -0
  456. package/dist/data/test/function/cubic_newton__loop_exit_2.mcfunction +1 -0
  457. package/dist/data/test/function/cubic_newton__loop_header_0.mcfunction +4 -0
  458. package/dist/data/test/function/cubic_newton__merge_10.mcfunction +1 -0
  459. package/dist/data/test/function/cubic_newton__merge_4.mcfunction +4 -0
  460. package/dist/data/test/function/cubic_newton__merge_6.mcfunction +4 -0
  461. package/dist/data/test/function/cubic_newton__merge_8.mcfunction +4 -0
  462. package/dist/data/test/function/cubic_newton__then_3.mcfunction +2 -0
  463. package/dist/data/test/function/cubic_newton__then_5.mcfunction +13 -0
  464. package/dist/data/test/function/cubic_newton__then_7.mcfunction +4 -0
  465. package/dist/data/test/function/cubic_newton__then_9.mcfunction +2 -0
  466. package/dist/data/test/function/curve_length_2d.mcfunction +6 -0
  467. package/dist/data/test/function/curve_length_2d__loop_body_1.mcfunction +32 -0
  468. package/dist/data/test/function/curve_length_2d__loop_exit_2.mcfunction +1 -0
  469. package/dist/data/test/function/curve_length_2d__loop_header_0.mcfunction +5 -0
  470. package/dist/data/test/function/cylinder_contains.mcfunction +1 -2
  471. package/dist/data/test/function/damage.mcfunction +9 -0
  472. package/dist/data/test/function/damage__else_2.mcfunction +2 -0
  473. package/dist/data/test/function/damage__merge_1.mcfunction +1 -0
  474. package/dist/data/test/function/damage__then_0.mcfunction +2 -0
  475. package/dist/data/test/function/deriv_central.mcfunction +7 -0
  476. package/dist/data/test/function/deriv_central__merge_1.mcfunction +10 -0
  477. package/dist/data/test/function/deriv_central__then_0.mcfunction +2 -0
  478. package/dist/data/test/function/deriv_forward.mcfunction +7 -0
  479. package/dist/data/test/function/deriv_forward__merge_1.mcfunction +8 -0
  480. package/dist/data/test/function/deriv_forward__then_0.mcfunction +2 -0
  481. package/dist/data/test/function/disable_fire_spread.mcfunction +1 -0
  482. package/dist/data/test/function/disable_keep_inventory.mcfunction +1 -0
  483. package/dist/data/test/function/disable_mob_griefing.mcfunction +1 -0
  484. package/dist/data/test/function/div3_hp.mcfunction +23 -0
  485. package/dist/data/test/function/div_hp.mcfunction +13 -0
  486. package/dist/data/test/function/draw_circle.mcfunction +8 -0
  487. package/dist/data/test/function/draw_circle__loop_body_1.mcfunction +34 -0
  488. package/dist/data/test/function/draw_circle__loop_exit_2.mcfunction +1 -0
  489. package/dist/data/test/function/draw_circle__loop_header_0.mcfunction +3 -0
  490. package/dist/data/test/function/draw_helix.mcfunction +10 -0
  491. package/dist/data/test/function/draw_helix__loop_body_1.mcfunction +42 -0
  492. package/dist/data/test/function/draw_helix__loop_exit_2.mcfunction +1 -0
  493. package/dist/data/test/function/draw_helix__loop_header_0.mcfunction +3 -0
  494. package/dist/data/test/function/draw_line_2d.mcfunction +9 -0
  495. package/dist/data/test/function/draw_line_2d__loop_body_1.mcfunction +34 -0
  496. package/dist/data/test/function/draw_line_2d__loop_exit_2.mcfunction +1 -0
  497. package/dist/data/test/function/draw_line_2d__loop_header_0.mcfunction +3 -0
  498. package/dist/data/test/function/ease_in_expo.mcfunction +1 -2
  499. package/dist/data/test/function/ease_in_out_back.mcfunction +1 -2
  500. package/dist/data/test/function/ease_in_out_bounce.mcfunction +1 -2
  501. package/dist/data/test/function/ease_in_out_cubic.mcfunction +1 -2
  502. package/dist/data/test/function/ease_in_out_quad.mcfunction +1 -2
  503. package/dist/data/test/function/ease_in_out_sine.mcfunction +1 -2
  504. package/dist/data/test/function/ease_out_bounce.mcfunction +1 -2
  505. package/dist/data/test/function/ease_out_bounce__merge_1.mcfunction +1 -2
  506. package/dist/data/test/function/ease_out_bounce__merge_4.mcfunction +1 -2
  507. package/dist/data/test/function/ease_out_expo.mcfunction +1 -2
  508. package/dist/data/test/function/enable_keep_inventory.mcfunction +1 -0
  509. package/dist/data/test/function/end_sparkles_at.mcfunction +1 -0
  510. package/dist/data/test/function/enemy_health.mcfunction +2 -0
  511. package/dist/data/test/function/example_right_click.mcfunction +1 -0
  512. package/dist/data/test/function/example_right_click__foreach_t0.mcfunction +5 -0
  513. package/dist/data/test/function/example_right_click__foreach_t0__merge_1.mcfunction +1 -0
  514. package/dist/data/test/function/example_right_click__foreach_t0__then_0.mcfunction +3 -0
  515. package/dist/data/test/function/exp_dist_approx.mcfunction +1 -2
  516. package/dist/data/test/function/exp_dist_approx__merge_1.mcfunction +1 -2
  517. package/dist/data/test/function/exp_dist_approx__merge_3.mcfunction +1 -2
  518. package/dist/data/test/function/explosion_effect.mcfunction +1 -0
  519. package/dist/data/test/function/fbm_1d__loop_exit_2.mcfunction +1 -2
  520. package/dist/data/test/function/fbm_1d__loop_header_0.mcfunction +1 -2
  521. package/dist/data/test/function/fbm_2d__loop_exit_2.mcfunction +1 -2
  522. package/dist/data/test/function/fbm_2d__loop_header_0.mcfunction +1 -2
  523. package/dist/data/test/function/flames.mcfunction +1 -0
  524. package/dist/data/test/function/gather_all.mcfunction +8 -0
  525. package/dist/data/test/function/give_kit_archer.mcfunction +6 -0
  526. package/dist/data/test/function/give_kit_mage.mcfunction +5 -0
  527. package/dist/data/test/function/give_kit_warrior.mcfunction +6 -0
  528. package/dist/data/test/function/glass_box.mcfunction +2 -0
  529. package/dist/data/test/function/glow.mcfunction +1 -0
  530. package/dist/data/test/function/goto_arena.mcfunction +7 -0
  531. package/dist/data/test/function/goto_lobby.mcfunction +7 -0
  532. package/dist/data/test/function/happy_at.mcfunction +1 -0
  533. package/dist/data/test/function/hash_1d_pos.mcfunction +1 -2
  534. package/dist/data/test/function/hash_2d_pos.mcfunction +1 -2
  535. package/dist/data/test/function/heal.mcfunction +5 -0
  536. package/dist/data/test/function/heap_new.mcfunction +7 -0
  537. package/dist/data/test/function/heap_new__loop_body_1.mcfunction +7 -0
  538. package/dist/data/test/function/heap_new__loop_exit_2.mcfunction +1 -0
  539. package/dist/data/test/function/heap_new__loop_header_0.mcfunction +4 -0
  540. package/dist/data/test/function/heap_peek.mcfunction +2 -0
  541. package/dist/data/test/function/heap_pop.mcfunction +4 -0
  542. package/dist/data/test/function/heap_pop__else_13.mcfunction +2 -0
  543. package/dist/data/test/function/heap_pop__loop_body_1.mcfunction +14 -0
  544. package/dist/data/test/function/heap_pop__loop_exit_2.mcfunction +1 -0
  545. package/dist/data/test/function/heap_pop__loop_header_0.mcfunction +4 -0
  546. package/dist/data/test/function/heap_pop__merge_10.mcfunction +1 -0
  547. package/dist/data/test/function/heap_pop__merge_12.mcfunction +1 -0
  548. package/dist/data/test/function/heap_pop__merge_4.mcfunction +3 -0
  549. package/dist/data/test/function/heap_pop__merge_6.mcfunction +1 -0
  550. package/dist/data/test/function/heap_pop__merge_8.mcfunction +3 -0
  551. package/dist/data/test/function/heap_pop__then_11.mcfunction +2 -0
  552. package/dist/data/test/function/heap_pop__then_3.mcfunction +3 -0
  553. package/dist/data/test/function/heap_pop__then_5.mcfunction +2 -0
  554. package/dist/data/test/function/heap_pop__then_7.mcfunction +3 -0
  555. package/dist/data/test/function/heap_pop__then_9.mcfunction +2 -0
  556. package/dist/data/test/function/heap_push.mcfunction +6 -0
  557. package/dist/data/test/function/heap_push__else_5.mcfunction +2 -0
  558. package/dist/data/test/function/heap_push__else_8.mcfunction +2 -0
  559. package/dist/data/test/function/heap_push__loop_body_1.mcfunction +4 -0
  560. package/dist/data/test/function/heap_push__loop_exit_2.mcfunction +1 -0
  561. package/dist/data/test/function/heap_push__loop_header_0.mcfunction +4 -0
  562. package/dist/data/test/function/heap_push__merge_4.mcfunction +1 -0
  563. package/dist/data/test/function/heap_push__merge_7.mcfunction +1 -0
  564. package/dist/data/test/function/heap_push__then_3.mcfunction +7 -0
  565. package/dist/data/test/function/heap_push__then_6.mcfunction +2 -0
  566. package/dist/data/test/function/heap_size.mcfunction +2 -0
  567. package/dist/data/test/function/hearts_at.mcfunction +1 -0
  568. package/dist/data/test/function/hide_bar.mcfunction +4 -0
  569. package/dist/data/test/function/hsl_to_b.mcfunction +1 -2
  570. package/dist/data/test/function/hsl_to_b__merge_1.mcfunction +1 -2
  571. package/dist/data/test/function/hsl_to_b__merge_12.mcfunction +1 -2
  572. package/dist/data/test/function/hsl_to_b__merge_3.mcfunction +1 -2
  573. package/dist/data/test/function/hsl_to_b__merge_6.mcfunction +1 -2
  574. package/dist/data/test/function/hsl_to_b__merge_9.mcfunction +1 -2
  575. package/dist/data/test/function/hsl_to_g.mcfunction +1 -2
  576. package/dist/data/test/function/hsl_to_g__merge_1.mcfunction +1 -2
  577. package/dist/data/test/function/hsl_to_g__merge_12.mcfunction +1 -2
  578. package/dist/data/test/function/hsl_to_g__merge_3.mcfunction +1 -2
  579. package/dist/data/test/function/hsl_to_g__merge_6.mcfunction +1 -2
  580. package/dist/data/test/function/hsl_to_g__merge_9.mcfunction +1 -2
  581. package/dist/data/test/function/hsl_to_r.mcfunction +1 -2
  582. package/dist/data/test/function/hsl_to_r__merge_1.mcfunction +1 -2
  583. package/dist/data/test/function/hsl_to_r__merge_12.mcfunction +1 -2
  584. package/dist/data/test/function/hsl_to_r__merge_3.mcfunction +1 -2
  585. package/dist/data/test/function/hsl_to_r__merge_6.mcfunction +1 -2
  586. package/dist/data/test/function/hsl_to_r__merge_9.mcfunction +1 -2
  587. package/dist/data/test/function/init_div.mcfunction +1 -0
  588. package/dist/data/test/function/insertion_sort.mcfunction +4 -0
  589. package/dist/data/test/function/insertion_sort__else_11.mcfunction +2 -0
  590. package/dist/data/test/function/insertion_sort__else_8.mcfunction +2 -0
  591. package/dist/data/test/function/insertion_sort__loop_body_1.mcfunction +6 -0
  592. package/dist/data/test/function/insertion_sort__loop_body_4.mcfunction +4 -0
  593. package/dist/data/test/function/insertion_sort__loop_exit_2.mcfunction +1 -0
  594. package/dist/data/test/function/insertion_sort__loop_exit_5.mcfunction +4 -0
  595. package/dist/data/test/function/insertion_sort__loop_header_0.mcfunction +3 -0
  596. package/dist/data/test/function/insertion_sort__loop_header_3.mcfunction +4 -0
  597. package/dist/data/test/function/insertion_sort__merge_10.mcfunction +1 -0
  598. package/dist/data/test/function/insertion_sort__merge_7.mcfunction +1 -0
  599. package/dist/data/test/function/insertion_sort__then_6.mcfunction +3 -0
  600. package/dist/data/test/function/insertion_sort__then_9.mcfunction +4 -0
  601. package/dist/data/test/function/insertion_sort_desc.mcfunction +4 -0
  602. package/dist/data/test/function/insertion_sort_desc__else_11.mcfunction +2 -0
  603. package/dist/data/test/function/insertion_sort_desc__else_8.mcfunction +2 -0
  604. package/dist/data/test/function/insertion_sort_desc__loop_body_1.mcfunction +6 -0
  605. package/dist/data/test/function/insertion_sort_desc__loop_body_4.mcfunction +4 -0
  606. package/dist/data/test/function/insertion_sort_desc__loop_exit_2.mcfunction +1 -0
  607. package/dist/data/test/function/insertion_sort_desc__loop_exit_5.mcfunction +4 -0
  608. package/dist/data/test/function/insertion_sort_desc__loop_header_0.mcfunction +3 -0
  609. package/dist/data/test/function/insertion_sort_desc__loop_header_3.mcfunction +4 -0
  610. package/dist/data/test/function/insertion_sort_desc__merge_10.mcfunction +1 -0
  611. package/dist/data/test/function/insertion_sort_desc__merge_7.mcfunction +1 -0
  612. package/dist/data/test/function/insertion_sort_desc__then_6.mcfunction +3 -0
  613. package/dist/data/test/function/insertion_sort_desc__then_9.mcfunction +4 -0
  614. package/dist/data/test/function/integrate_simpson.mcfunction +7 -0
  615. package/dist/data/test/function/integrate_simpson__loop_body_6.mcfunction +7 -0
  616. package/dist/data/test/function/integrate_simpson__loop_exit_7.mcfunction +6 -0
  617. package/dist/data/test/function/integrate_simpson__loop_header_5.mcfunction +5 -0
  618. package/dist/data/test/function/integrate_simpson__merge_1.mcfunction +8 -0
  619. package/dist/data/test/function/integrate_simpson__merge_11.mcfunction +4 -0
  620. package/dist/data/test/function/integrate_simpson__merge_4.mcfunction +5 -0
  621. package/dist/data/test/function/integrate_simpson__merge_9.mcfunction +7 -0
  622. package/dist/data/test/function/integrate_simpson__then_0.mcfunction +6 -0
  623. package/dist/data/test/function/integrate_simpson__then_10.mcfunction +6 -0
  624. package/dist/data/test/function/integrate_simpson__then_3.mcfunction +4 -0
  625. package/dist/data/test/function/integrate_simpson__then_8.mcfunction +6 -0
  626. package/dist/data/test/function/integrate_trapezoid.mcfunction +7 -0
  627. package/dist/data/test/function/integrate_trapezoid__loop_body_4.mcfunction +7 -0
  628. package/dist/data/test/function/integrate_trapezoid__loop_exit_5.mcfunction +6 -0
  629. package/dist/data/test/function/integrate_trapezoid__loop_header_3.mcfunction +5 -0
  630. package/dist/data/test/function/integrate_trapezoid__merge_1.mcfunction +11 -0
  631. package/dist/data/test/function/integrate_trapezoid__then_0.mcfunction +2 -0
  632. package/dist/data/test/function/interactions_init.mcfunction +9 -0
  633. package/dist/data/test/function/invisible.mcfunction +1 -0
  634. package/dist/data/test/function/is_op.mcfunction +2 -0
  635. package/dist/data/test/function/is_op__exec_t1.mcfunction +1 -0
  636. package/dist/data/test/function/is_sneaking.mcfunction +5 -0
  637. package/dist/data/test/function/is_sneaking__merge_1.mcfunction +2 -0
  638. package/dist/data/test/function/is_sneaking__then_0.mcfunction +2 -0
  639. package/dist/data/test/function/jump.mcfunction +1 -0
  640. package/dist/data/test/function/launch_up.mcfunction +6 -0
  641. package/dist/data/test/function/list_max3.mcfunction +1 -2
  642. package/dist/data/test/function/list_max3__merge_1.mcfunction +1 -2
  643. package/dist/data/test/function/list_max5.mcfunction +1 -2
  644. package/dist/data/test/function/list_max5__merge_1.mcfunction +1 -2
  645. package/dist/data/test/function/list_max5__merge_3.mcfunction +1 -2
  646. package/dist/data/test/function/list_max5__merge_5.mcfunction +1 -2
  647. package/dist/data/test/function/list_min3.mcfunction +1 -2
  648. package/dist/data/test/function/list_min3__merge_1.mcfunction +1 -2
  649. package/dist/data/test/function/list_min5.mcfunction +1 -2
  650. package/dist/data/test/function/list_min5__merge_1.mcfunction +1 -2
  651. package/dist/data/test/function/list_min5__merge_3.mcfunction +1 -2
  652. package/dist/data/test/function/list_min5__merge_5.mcfunction +1 -2
  653. package/dist/data/test/function/list_sort_asc__loop_body_4.mcfunction +1 -2
  654. package/dist/data/test/function/list_sort_asc__loop_header_0.mcfunction +1 -2
  655. package/dist/data/test/function/list_sort_asc__loop_header_3.mcfunction +1 -2
  656. package/dist/data/test/function/list_sort_desc__loop_body_4.mcfunction +1 -2
  657. package/dist/data/test/function/list_sort_desc__loop_header_0.mcfunction +1 -2
  658. package/dist/data/test/function/list_sort_desc__loop_header_3.mcfunction +1 -2
  659. package/dist/data/test/function/max_heap_pop.mcfunction +4 -0
  660. package/dist/data/test/function/max_heap_pop__else_13.mcfunction +2 -0
  661. package/dist/data/test/function/max_heap_pop__loop_body_1.mcfunction +14 -0
  662. package/dist/data/test/function/max_heap_pop__loop_exit_2.mcfunction +1 -0
  663. package/dist/data/test/function/max_heap_pop__loop_header_0.mcfunction +4 -0
  664. package/dist/data/test/function/max_heap_pop__merge_10.mcfunction +1 -0
  665. package/dist/data/test/function/max_heap_pop__merge_12.mcfunction +1 -0
  666. package/dist/data/test/function/max_heap_pop__merge_4.mcfunction +3 -0
  667. package/dist/data/test/function/max_heap_pop__merge_6.mcfunction +1 -0
  668. package/dist/data/test/function/max_heap_pop__merge_8.mcfunction +3 -0
  669. package/dist/data/test/function/max_heap_pop__then_11.mcfunction +2 -0
  670. package/dist/data/test/function/max_heap_pop__then_3.mcfunction +3 -0
  671. package/dist/data/test/function/max_heap_pop__then_5.mcfunction +2 -0
  672. package/dist/data/test/function/max_heap_pop__then_7.mcfunction +3 -0
  673. package/dist/data/test/function/max_heap_pop__then_9.mcfunction +2 -0
  674. package/dist/data/test/function/max_heap_push.mcfunction +6 -0
  675. package/dist/data/test/function/max_heap_push__else_5.mcfunction +2 -0
  676. package/dist/data/test/function/max_heap_push__else_8.mcfunction +2 -0
  677. package/dist/data/test/function/max_heap_push__loop_body_1.mcfunction +4 -0
  678. package/dist/data/test/function/max_heap_push__loop_exit_2.mcfunction +1 -0
  679. package/dist/data/test/function/max_heap_push__loop_header_0.mcfunction +4 -0
  680. package/dist/data/test/function/max_heap_push__merge_4.mcfunction +1 -0
  681. package/dist/data/test/function/max_heap_push__merge_7.mcfunction +1 -0
  682. package/dist/data/test/function/max_heap_push__then_3.mcfunction +7 -0
  683. package/dist/data/test/function/max_heap_push__then_6.mcfunction +2 -0
  684. package/dist/data/test/function/newton_step.mcfunction +7 -0
  685. package/dist/data/test/function/newton_step__merge_1.mcfunction +8 -0
  686. package/dist/data/test/function/newton_step__then_0.mcfunction +1 -0
  687. package/dist/data/test/function/night_vision.mcfunction +1 -0
  688. package/dist/data/test/function/norm3_hp.mcfunction +43 -0
  689. package/dist/data/test/function/normal_approx12.mcfunction +1 -2
  690. package/dist/data/test/function/normal_approx12__merge_1.mcfunction +1 -2
  691. package/dist/data/test/function/normal_approx12__merge_11.mcfunction +1 -2
  692. package/dist/data/test/function/normal_approx12__merge_13.mcfunction +1 -2
  693. package/dist/data/test/function/normal_approx12__merge_15.mcfunction +1 -2
  694. package/dist/data/test/function/normal_approx12__merge_17.mcfunction +1 -2
  695. package/dist/data/test/function/normal_approx12__merge_19.mcfunction +1 -2
  696. package/dist/data/test/function/normal_approx12__merge_21.mcfunction +1 -2
  697. package/dist/data/test/function/normal_approx12__merge_3.mcfunction +1 -2
  698. package/dist/data/test/function/normal_approx12__merge_5.mcfunction +1 -2
  699. package/dist/data/test/function/normal_approx12__merge_7.mcfunction +1 -2
  700. package/dist/data/test/function/normal_approx12__merge_9.mcfunction +1 -2
  701. package/dist/data/test/function/on_double_sneak.mcfunction +1 -0
  702. package/dist/data/test/function/on_double_sneak__foreach_t0.mcfunction +9 -0
  703. package/dist/data/test/function/on_double_sneak__foreach_t0__merge_1.mcfunction +1 -0
  704. package/dist/data/test/function/on_double_sneak__foreach_t0__merge_3.mcfunction +2 -0
  705. package/dist/data/test/function/on_double_sneak__foreach_t0__then_0.mcfunction +6 -0
  706. package/dist/data/test/function/on_double_sneak__foreach_t0__then_2.mcfunction +2 -0
  707. package/dist/data/test/function/on_right_click.mcfunction +1 -0
  708. package/dist/data/test/function/on_right_click__foreach_t1.mcfunction +5 -0
  709. package/dist/data/test/function/on_right_click__foreach_t1__merge_1.mcfunction +1 -0
  710. package/dist/data/test/function/on_right_click__foreach_t1__then_0.mcfunction +3 -0
  711. package/dist/data/test/function/on_sneak_click.mcfunction +1 -0
  712. package/dist/data/test/function/on_sneak_click__foreach_t0.mcfunction +7 -0
  713. package/dist/data/test/function/on_sneak_click__foreach_t0__else_4.mcfunction +3 -0
  714. package/dist/data/test/function/on_sneak_click__foreach_t0__merge_1.mcfunction +1 -0
  715. package/dist/data/test/function/on_sneak_click__foreach_t0__merge_3.mcfunction +1 -0
  716. package/dist/data/test/function/on_sneak_click__foreach_t0__then_0.mcfunction +4 -0
  717. package/dist/data/test/function/on_sneak_click__foreach_t0__then_2.mcfunction +3 -0
  718. package/dist/data/test/function/on_sneak_start.mcfunction +1 -0
  719. package/dist/data/test/function/on_sneak_start__foreach_t0.mcfunction +5 -0
  720. package/dist/data/test/function/on_sneak_start__foreach_t0__else_2.mcfunction +2 -0
  721. package/dist/data/test/function/on_sneak_start__foreach_t0__merge_1.mcfunction +1 -0
  722. package/dist/data/test/function/on_sneak_start__foreach_t0__then_0.mcfunction +2 -0
  723. package/dist/data/test/function/particle_at_fx.mcfunction +1 -0
  724. package/dist/data/test/function/particle_dot.mcfunction +1 -0
  725. package/dist/data/test/function/pathfind_bfs.mcfunction +11 -0
  726. package/dist/data/test/function/pathfind_bfs__else_33.mcfunction +4 -0
  727. package/dist/data/test/function/pathfind_bfs__else_8.mcfunction +19 -0
  728. package/dist/data/test/function/pathfind_bfs__loop_body_1.mcfunction +10 -0
  729. package/dist/data/test/function/pathfind_bfs__loop_body_29.mcfunction +6 -0
  730. package/dist/data/test/function/pathfind_bfs__loop_body_35.mcfunction +9 -0
  731. package/dist/data/test/function/pathfind_bfs__loop_body_4.mcfunction +9 -0
  732. package/dist/data/test/function/pathfind_bfs__loop_exit_2.mcfunction +24 -0
  733. package/dist/data/test/function/pathfind_bfs__loop_exit_30.mcfunction +6 -0
  734. package/dist/data/test/function/pathfind_bfs__loop_exit_36.mcfunction +1 -0
  735. package/dist/data/test/function/pathfind_bfs__loop_exit_5.mcfunction +6 -0
  736. package/dist/data/test/function/pathfind_bfs__loop_header_0.mcfunction +4 -0
  737. package/dist/data/test/function/pathfind_bfs__loop_header_28.mcfunction +4 -0
  738. package/dist/data/test/function/pathfind_bfs__loop_header_3.mcfunction +3 -0
  739. package/dist/data/test/function/pathfind_bfs__loop_header_34.mcfunction +4 -0
  740. package/dist/data/test/function/pathfind_bfs__merge_10.mcfunction +11 -0
  741. package/dist/data/test/function/pathfind_bfs__merge_12.mcfunction +1 -0
  742. package/dist/data/test/function/pathfind_bfs__merge_14.mcfunction +11 -0
  743. package/dist/data/test/function/pathfind_bfs__merge_16.mcfunction +1 -0
  744. package/dist/data/test/function/pathfind_bfs__merge_18.mcfunction +11 -0
  745. package/dist/data/test/function/pathfind_bfs__merge_20.mcfunction +1 -0
  746. package/dist/data/test/function/pathfind_bfs__merge_22.mcfunction +1 -0
  747. package/dist/data/test/function/pathfind_bfs__merge_24.mcfunction +1 -0
  748. package/dist/data/test/function/pathfind_bfs__merge_26.mcfunction +5 -0
  749. package/dist/data/test/function/pathfind_bfs__merge_32.mcfunction +1 -0
  750. package/dist/data/test/function/pathfind_bfs__merge_7.mcfunction +1 -0
  751. package/dist/data/test/function/pathfind_bfs__then_11.mcfunction +15 -0
  752. package/dist/data/test/function/pathfind_bfs__then_13.mcfunction +13 -0
  753. package/dist/data/test/function/pathfind_bfs__then_15.mcfunction +15 -0
  754. package/dist/data/test/function/pathfind_bfs__then_17.mcfunction +13 -0
  755. package/dist/data/test/function/pathfind_bfs__then_19.mcfunction +15 -0
  756. package/dist/data/test/function/pathfind_bfs__then_21.mcfunction +13 -0
  757. package/dist/data/test/function/pathfind_bfs__then_23.mcfunction +15 -0
  758. package/dist/data/test/function/pathfind_bfs__then_25.mcfunction +1 -0
  759. package/dist/data/test/function/pathfind_bfs__then_31.mcfunction +2 -0
  760. package/dist/data/test/function/pathfind_bfs__then_6.mcfunction +3 -0
  761. package/dist/data/test/function/pathfind_bfs__then_9.mcfunction +13 -0
  762. package/dist/data/test/function/pathfind_bfs_coro.mcfunction +1 -0
  763. package/dist/data/test/function/pcg_output.mcfunction +1 -2
  764. package/dist/data/test/function/pf_heuristic.mcfunction +14 -0
  765. package/dist/data/test/function/pf_heuristic__merge_1.mcfunction +4 -0
  766. package/dist/data/test/function/pf_heuristic__merge_3.mcfunction +6 -0
  767. package/dist/data/test/function/pf_heuristic__then_0.mcfunction +4 -0
  768. package/dist/data/test/function/pf_heuristic__then_2.mcfunction +4 -0
  769. package/dist/data/test/function/pf_is_blocked.mcfunction +7 -0
  770. package/dist/data/test/function/pf_is_blocked__merge_1.mcfunction +4 -0
  771. package/dist/data/test/function/pf_is_blocked__merge_10.mcfunction +4 -0
  772. package/dist/data/test/function/pf_is_blocked__merge_4.mcfunction +4 -0
  773. package/dist/data/test/function/pf_is_blocked__merge_7.mcfunction +4 -0
  774. package/dist/data/test/function/pf_is_blocked__then_0.mcfunction +2 -0
  775. package/dist/data/test/function/pf_is_blocked__then_3.mcfunction +2 -0
  776. package/dist/data/test/function/pf_is_blocked__then_6.mcfunction +2 -0
  777. package/dist/data/test/function/pf_is_blocked__then_9.mcfunction +2 -0
  778. package/dist/data/test/function/pf_new_map.mcfunction +4 -0
  779. package/dist/data/test/function/pf_new_map__loop_body_1.mcfunction +7 -0
  780. package/dist/data/test/function/pf_new_map__loop_exit_2.mcfunction +1 -0
  781. package/dist/data/test/function/pf_new_map__loop_header_0.mcfunction +4 -0
  782. package/dist/data/test/function/pf_noop.mcfunction +1 -0
  783. package/dist/data/test/function/pf_pack.mcfunction +8 -0
  784. package/dist/data/test/function/pf_set_blocked.mcfunction +5 -0
  785. package/dist/data/test/function/pf_set_open.mcfunction +5 -0
  786. package/dist/data/test/function/pf_unpack_x.mcfunction +5 -0
  787. package/dist/data/test/function/pf_unpack_z.mcfunction +5 -0
  788. package/dist/data/test/function/popcount__loop_body_1.mcfunction +1 -2
  789. package/dist/data/test/function/popcount__loop_header_0.mcfunction +1 -2
  790. package/dist/data/test/function/portal_effect.mcfunction +1 -0
  791. package/dist/data/test/function/random_bool.mcfunction +1 -2
  792. package/dist/data/test/function/random_range.mcfunction +1 -2
  793. package/dist/data/test/function/regen.mcfunction +1 -0
  794. package/dist/data/test/function/remove_bar.mcfunction +3 -0
  795. package/dist/data/test/function/remove_from_teams.mcfunction +3 -0
  796. package/dist/data/test/function/remove_item.mcfunction +1 -0
  797. package/dist/data/test/function/resistance.mcfunction +1 -0
  798. package/dist/data/test/function/rgb_to_h.mcfunction +1 -2
  799. package/dist/data/test/function/rgb_to_h__merge_1.mcfunction +1 -2
  800. package/dist/data/test/function/rgb_to_h__merge_12.mcfunction +1 -2
  801. package/dist/data/test/function/rgb_to_h__merge_3.mcfunction +1 -2
  802. package/dist/data/test/function/rgb_to_h__merge_5.mcfunction +1 -2
  803. package/dist/data/test/function/rgb_to_h__merge_7.mcfunction +1 -2
  804. package/dist/data/test/function/rgb_to_h__merge_9.mcfunction +1 -2
  805. package/dist/data/test/function/rgb_to_h__then_11.mcfunction +1 -2
  806. package/dist/data/test/function/rgb_to_l.mcfunction +1 -2
  807. package/dist/data/test/function/rgb_to_l__merge_1.mcfunction +1 -2
  808. package/dist/data/test/function/rgb_to_l__merge_3.mcfunction +1 -2
  809. package/dist/data/test/function/rgb_to_l__merge_5.mcfunction +1 -2
  810. package/dist/data/test/function/rgb_to_s.mcfunction +1 -2
  811. package/dist/data/test/function/rgb_to_s__merge_1.mcfunction +1 -2
  812. package/dist/data/test/function/rgb_to_s__merge_3.mcfunction +1 -2
  813. package/dist/data/test/function/rgb_to_s__merge_5.mcfunction +1 -2
  814. package/dist/data/test/function/rgb_to_s__merge_7.mcfunction +1 -2
  815. package/dist/data/test/function/rgb_to_s__merge_9.mcfunction +1 -2
  816. package/dist/data/test/function/riemann_left.mcfunction +6 -0
  817. package/dist/data/test/function/riemann_left__loop_body_1.mcfunction +7 -0
  818. package/dist/data/test/function/riemann_left__loop_exit_2.mcfunction +6 -0
  819. package/dist/data/test/function/riemann_left__loop_header_0.mcfunction +5 -0
  820. package/dist/data/test/function/riemann_mid.mcfunction +6 -0
  821. package/dist/data/test/function/riemann_mid__loop_body_1.mcfunction +7 -0
  822. package/dist/data/test/function/riemann_mid__loop_exit_2.mcfunction +6 -0
  823. package/dist/data/test/function/riemann_mid__loop_header_0.mcfunction +3 -0
  824. package/dist/data/test/function/riemann_right.mcfunction +6 -0
  825. package/dist/data/test/function/riemann_right__loop_body_1.mcfunction +7 -0
  826. package/dist/data/test/function/riemann_right__loop_exit_2.mcfunction +6 -0
  827. package/dist/data/test/function/riemann_right__loop_header_0.mcfunction +3 -0
  828. package/dist/data/test/function/running_m2.mcfunction +16 -0
  829. package/dist/data/test/function/running_mean.mcfunction +7 -0
  830. package/dist/data/test/function/running_mean__merge_1.mcfunction +13 -0
  831. package/dist/data/test/function/running_mean__then_0.mcfunction +1 -0
  832. package/dist/data/test/function/second_deriv.mcfunction +8 -0
  833. package/dist/data/test/function/second_deriv__merge_1.mcfunction +14 -0
  834. package/dist/data/test/function/second_deriv__then_0.mcfunction +2 -0
  835. package/dist/data/test/function/set_day.mcfunction +1 -0
  836. package/dist/data/test/function/set_easy.mcfunction +1 -0
  837. package/dist/data/test/function/set_hard.mcfunction +1 -0
  838. package/dist/data/test/function/set_midnight.mcfunction +1 -0
  839. package/dist/data/test/function/set_night.mcfunction +1 -0
  840. package/dist/data/test/function/set_noon.mcfunction +1 -0
  841. package/dist/data/test/function/set_normal.mcfunction +1 -0
  842. package/dist/data/test/function/set_peaceful.mcfunction +1 -0
  843. package/dist/data/test/function/setup_four_teams.mcfunction +4 -0
  844. package/dist/data/test/function/setup_two_teams.mcfunction +2 -0
  845. package/dist/data/test/function/show_bar.mcfunction +4 -0
  846. package/dist/data/test/function/simpson_step.mcfunction +16 -0
  847. package/dist/data/test/function/sin_hp.mcfunction +4 -2
  848. package/dist/data/test/function/slow_fall.mcfunction +1 -0
  849. package/dist/data/test/function/smoke.mcfunction +1 -0
  850. package/dist/data/test/function/sort2_max.mcfunction +1 -2
  851. package/dist/data/test/function/sort2_min.mcfunction +1 -2
  852. package/dist/data/test/function/sort3.mcfunction +1 -2
  853. package/dist/data/test/function/sort3__merge_1.mcfunction +1 -2
  854. package/dist/data/test/function/sort3__merge_3.mcfunction +1 -2
  855. package/dist/data/test/function/sort3__merge_5.mcfunction +1 -2
  856. package/dist/data/test/function/sort3__merge_7.mcfunction +1 -2
  857. package/dist/data/test/function/sort4.mcfunction +1 -2
  858. package/dist/data/test/function/sort4__merge_1.mcfunction +1 -2
  859. package/dist/data/test/function/sort4__merge_11.mcfunction +1 -2
  860. package/dist/data/test/function/sort4__merge_14.mcfunction +1 -2
  861. package/dist/data/test/function/sort4__merge_3.mcfunction +1 -2
  862. package/dist/data/test/function/sort4__merge_5.mcfunction +1 -2
  863. package/dist/data/test/function/sort4__merge_7.mcfunction +1 -2
  864. package/dist/data/test/function/sort4__merge_9.mcfunction +1 -2
  865. package/dist/data/test/function/sort5.mcfunction +1 -2
  866. package/dist/data/test/function/sort5__merge_1.mcfunction +1 -2
  867. package/dist/data/test/function/sort5__merge_11.mcfunction +1 -2
  868. package/dist/data/test/function/sort5__merge_13.mcfunction +1 -2
  869. package/dist/data/test/function/sort5__merge_15.mcfunction +1 -2
  870. package/dist/data/test/function/sort5__merge_17.mcfunction +1 -2
  871. package/dist/data/test/function/sort5__merge_19.mcfunction +1 -2
  872. package/dist/data/test/function/sort5__merge_22.mcfunction +1 -2
  873. package/dist/data/test/function/sort5__merge_25.mcfunction +1 -2
  874. package/dist/data/test/function/sort5__merge_3.mcfunction +1 -2
  875. package/dist/data/test/function/sort5__merge_5.mcfunction +1 -2
  876. package/dist/data/test/function/sort5__merge_7.mcfunction +1 -2
  877. package/dist/data/test/function/sort5__merge_9.mcfunction +1 -2
  878. package/dist/data/test/function/sort_merge.mcfunction +10 -0
  879. package/dist/data/test/function/sort_merge__else_11.mcfunction +7 -0
  880. package/dist/data/test/function/sort_merge__else_14.mcfunction +2 -0
  881. package/dist/data/test/function/sort_merge__else_5.mcfunction +3 -0
  882. package/dist/data/test/function/sort_merge__else_8.mcfunction +7 -0
  883. package/dist/data/test/function/sort_merge__loop_body_1.mcfunction +3 -0
  884. package/dist/data/test/function/sort_merge__loop_exit_2.mcfunction +1 -0
  885. package/dist/data/test/function/sort_merge__loop_header_0.mcfunction +4 -0
  886. package/dist/data/test/function/sort_merge__merge_10.mcfunction +1 -0
  887. package/dist/data/test/function/sort_merge__merge_13.mcfunction +1 -0
  888. package/dist/data/test/function/sort_merge__merge_4.mcfunction +1 -0
  889. package/dist/data/test/function/sort_merge__merge_7.mcfunction +1 -0
  890. package/dist/data/test/function/sort_merge__then_12.mcfunction +7 -0
  891. package/dist/data/test/function/sort_merge__then_3.mcfunction +3 -0
  892. package/dist/data/test/function/sort_merge__then_6.mcfunction +3 -0
  893. package/dist/data/test/function/sort_merge__then_9.mcfunction +7 -0
  894. package/dist/data/test/function/sparkles_at.mcfunction +1 -0
  895. package/dist/data/test/function/speed.mcfunction +1 -0
  896. package/dist/data/test/function/sphere_contains.mcfunction +1 -2
  897. package/dist/data/test/function/spread_players.mcfunction +1 -0
  898. package/dist/data/test/function/sqrt_fx.mcfunction +5 -8
  899. package/dist/data/test/function/sqrt_hp.mcfunction +17 -0
  900. package/dist/data/test/function/sqrt_hp__merge_1.mcfunction +21 -0
  901. package/dist/data/test/function/sqrt_hp__then_0.mcfunction +2 -0
  902. package/dist/data/test/function/std_dev_approx.mcfunction +5 -0
  903. package/dist/data/test/function/std_dev_approx__merge_1.mcfunction +13 -0
  904. package/dist/data/test/function/std_dev_approx__then_0.mcfunction +2 -0
  905. package/dist/data/test/function/str_len.mcfunction +2 -0
  906. package/dist/data/test/function/strength.mcfunction +1 -0
  907. package/dist/data/test/function/t.mcfunction +3 -0
  908. package/dist/data/test/function/teleport_to.mcfunction +9 -0
  909. package/dist/data/test/function/teleport_to_entity.mcfunction +5 -0
  910. package/dist/data/test/function/test.mcfunction +5 -0
  911. package/dist/data/test/function/test__loop_body_1.mcfunction +9 -0
  912. package/dist/data/test/function/test__loop_exit_2.mcfunction +1 -0
  913. package/dist/data/test/function/test__loop_header_0.mcfunction +3 -0
  914. package/dist/data/test/function/tile_of.mcfunction +1 -2
  915. package/dist/data/test/function/timer/done.mcfunction +1 -2
  916. package/dist/data/test/function/timer/remaining.mcfunction +1 -2
  917. package/dist/data/test/function/timer/tick.mcfunction +1 -2
  918. package/dist/data/test/function/timer/tick__then_0.mcfunction +1 -2
  919. package/dist/data/test/function/totem_at.mcfunction +1 -0
  920. package/dist/data/test/function/trapezoid_step.mcfunction +11 -0
  921. package/dist/data/test/function/uniform_frac.mcfunction +1 -2
  922. package/dist/data/test/function/uniform_int.mcfunction +1 -2
  923. package/dist/data/test/function/update_bar.mcfunction +5 -0
  924. package/dist/data/test/function/update_bar_color.mcfunction +6 -0
  925. package/dist/data/test/function/update_bar_color__else_2.mcfunction +4 -0
  926. package/dist/data/test/function/update_bar_color__else_5.mcfunction +4 -0
  927. package/dist/data/test/function/update_bar_color__merge_1.mcfunction +1 -0
  928. package/dist/data/test/function/update_bar_color__merge_4.mcfunction +1 -0
  929. package/dist/data/test/function/update_bar_color__then_0.mcfunction +4 -0
  930. package/dist/data/test/function/update_bar_color__then_3.mcfunction +4 -0
  931. package/dist/data/test/function/value_noise_1d.mcfunction +1 -2
  932. package/dist/data/test/function/value_noise_2d.mcfunction +1 -2
  933. package/dist/data/test/function/value_noise_2d__merge_1.mcfunction +1 -2
  934. package/dist/data/test/function/variance_from_m2.mcfunction +6 -0
  935. package/dist/data/test/function/variance_from_m2__merge_1.mcfunction +5 -0
  936. package/dist/data/test/function/variance_from_m2__then_0.mcfunction +2 -0
  937. package/dist/data/test/function/weapon_damage.mcfunction +5 -0
  938. package/dist/data/test/function/weather_clear.mcfunction +1 -0
  939. package/dist/data/test/function/weather_rain.mcfunction +1 -0
  940. package/dist/data/test/function/weather_thunder.mcfunction +1 -0
  941. package/dist/data/test/function/weighted2.mcfunction +1 -2
  942. package/dist/data/test/function/weighted2__merge_1.mcfunction +1 -2
  943. package/dist/data/test/function/weighted3.mcfunction +1 -2
  944. package/dist/data/test/function/weighted3__merge_1.mcfunction +1 -2
  945. package/dist/data/test/function/weighted3__merge_3.mcfunction +1 -2
  946. package/dist/data/test_dmul/function/__double_mul_macro.mcfunction +1 -0
  947. package/dist/data/test_dmul/function/double_mul_fixed.mcfunction +6 -0
  948. package/dist/data/test_dmul/function/load.mcfunction +1 -0
  949. package/dist/data/test_double_fn/function/double_test.mcfunction +2 -0
  950. package/dist/data/test_double_fn/function/load.mcfunction +1 -0
  951. package/dist/data/test_double_fn2/function/double_test.mcfunction +2 -0
  952. package/dist/data/test_double_fn2/function/load.mcfunction +1 -0
  953. package/dist/data/test_double_pass/function/caller_fn.mcfunction +4 -0
  954. package/dist/data/test_double_pass/function/consume_double.mcfunction +2 -0
  955. package/dist/data/test_double_pass/function/load.mcfunction +1 -0
  956. package/dist/data/test_macro/function/load.mcfunction +1 -0
  957. package/dist/data/test_macro/function/macro_helper.mcfunction +1 -0
  958. package/dist/data/test_macro3/function/__dmul_macro.mcfunction +1 -0
  959. package/dist/data/test_macro3/function/double_mul_test.mcfunction +7 -0
  960. package/dist/data/test_macro3/function/load.mcfunction +1 -0
  961. package/dist/data/test_ret_double/function/load.mcfunction +1 -0
  962. package/dist/data/test_ret_double/function/make_double.mcfunction +3 -0
  963. package/dist/data/test_ret_double/function/use_it.mcfunction +3 -0
  964. package/dist/pack.mcmeta +1 -1
  965. package/dist/src/__tests__/array-dynamic.test.js +42 -0
  966. package/dist/src/__tests__/builtins.test.d.ts +1 -0
  967. package/dist/src/__tests__/builtins.test.js +55 -0
  968. package/dist/src/__tests__/compile-all.test.js +1 -0
  969. package/dist/src/__tests__/diagnostics.test.js +8 -11
  970. package/dist/src/__tests__/double.test.d.ts +7 -0
  971. package/dist/src/__tests__/double.test.js +464 -0
  972. package/dist/src/__tests__/e2e/ecs-stdlib.test.d.ts +7 -0
  973. package/dist/src/__tests__/e2e/ecs-stdlib.test.js +328 -0
  974. package/dist/src/__tests__/e2e/events-stdlib.test.d.ts +1 -0
  975. package/dist/src/__tests__/e2e/events-stdlib.test.js +81 -0
  976. package/dist/src/__tests__/e2e/fft-stdlib.test.d.ts +13 -0
  977. package/dist/src/__tests__/e2e/fft-stdlib.test.js +288 -0
  978. package/dist/src/__tests__/e2e/for-in-array.test.d.ts +4 -0
  979. package/dist/src/__tests__/e2e/for-in-array.test.js +59 -0
  980. package/dist/src/__tests__/e2e/macros.test.js +7 -7
  981. package/dist/src/__tests__/e2e/ode-stdlib.test.d.ts +1 -0
  982. package/dist/src/__tests__/e2e/ode-stdlib.test.js +91 -0
  983. package/dist/src/__tests__/e2e/stdlib-e2e.test.js +1616 -0
  984. package/dist/src/__tests__/emit/compile.test.d.ts +1 -0
  985. package/dist/src/__tests__/emit/compile.test.js +95 -0
  986. package/dist/src/__tests__/emit/index.test.d.ts +1 -0
  987. package/dist/src/__tests__/emit/index.test.js +180 -0
  988. package/dist/src/__tests__/emit/modules-extra.test.d.ts +1 -0
  989. package/dist/src/__tests__/emit/modules-extra.test.js +77 -0
  990. package/dist/src/__tests__/enum.test.js +4 -6
  991. package/dist/src/__tests__/fixed.test.d.ts +7 -0
  992. package/dist/src/__tests__/fixed.test.js +148 -0
  993. package/dist/src/__tests__/float-lint.test.d.ts +7 -0
  994. package/dist/src/__tests__/float-lint.test.js +96 -0
  995. package/dist/src/__tests__/float.test.d.ts +7 -0
  996. package/dist/src/__tests__/float.test.js +148 -0
  997. package/dist/src/__tests__/for-each.test.d.ts +1 -0
  998. package/dist/src/__tests__/for-each.test.js +125 -0
  999. package/dist/src/__tests__/for-range.test.d.ts +1 -0
  1000. package/dist/src/__tests__/for-range.test.js +136 -0
  1001. package/dist/src/__tests__/generics.test.js +4 -4
  1002. package/dist/src/__tests__/impl.test.d.ts +1 -0
  1003. package/dist/src/__tests__/impl.test.js +199 -0
  1004. package/dist/src/__tests__/lsp-logic.test.d.ts +1 -0
  1005. package/dist/src/__tests__/lsp-logic.test.js +145 -0
  1006. package/dist/src/__tests__/match.test.d.ts +10 -0
  1007. package/dist/src/__tests__/match.test.js +197 -0
  1008. package/dist/src/__tests__/mc-integration/item-entity-events.test.d.ts +18 -0
  1009. package/dist/src/__tests__/mc-integration/item-entity-events.test.js +287 -0
  1010. package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.d.ts +13 -0
  1011. package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +833 -0
  1012. package/dist/src/__tests__/mc-integration/stdlib-coverage.test.d.ts +13 -0
  1013. package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +707 -0
  1014. package/dist/src/__tests__/mc-integration/syntax-coverage.test.d.ts +9 -0
  1015. package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +442 -0
  1016. package/dist/src/__tests__/mc-integration.test.js +835 -5
  1017. package/dist/src/__tests__/optimizer/constant_fold.test.js +105 -0
  1018. package/dist/src/__tests__/optimizer/coroutine.test.js +3 -2
  1019. package/dist/src/__tests__/parser.test.js +5 -5
  1020. package/dist/src/__tests__/runtime.test.js +143 -238
  1021. package/dist/src/__tests__/stdlib/arr-len.test.d.ts +13 -0
  1022. package/dist/src/__tests__/stdlib/arr-len.test.js +195 -0
  1023. package/dist/src/__tests__/stdlib/calculus.test.d.ts +5 -0
  1024. package/dist/src/__tests__/stdlib/calculus.test.js +123 -0
  1025. package/dist/src/__tests__/stdlib/dialog.test.d.ts +6 -0
  1026. package/dist/src/__tests__/stdlib/dialog.test.js +142 -0
  1027. package/dist/src/__tests__/stdlib/easing.test.d.ts +5 -0
  1028. package/dist/src/__tests__/stdlib/easing.test.js +117 -0
  1029. package/dist/src/__tests__/stdlib/geometry.test.d.ts +5 -0
  1030. package/dist/src/__tests__/stdlib/geometry.test.js +163 -0
  1031. package/dist/src/__tests__/stdlib/heap.test.d.ts +4 -0
  1032. package/dist/src/__tests__/stdlib/heap.test.js +141 -0
  1033. package/dist/src/__tests__/stdlib/list.test.d.ts +5 -0
  1034. package/dist/src/__tests__/stdlib/list.test.js +134 -0
  1035. package/dist/src/__tests__/stdlib/matrix.test.d.ts +5 -0
  1036. package/dist/src/__tests__/stdlib/matrix.test.js +148 -0
  1037. package/dist/src/__tests__/stdlib/pathfind.test.d.ts +4 -0
  1038. package/dist/src/__tests__/stdlib/pathfind.test.js +167 -0
  1039. package/dist/src/__tests__/stdlib/scheduler.test.d.ts +6 -0
  1040. package/dist/src/__tests__/stdlib/scheduler.test.js +177 -0
  1041. package/dist/src/__tests__/stdlib/sort-v2.test.d.ts +4 -0
  1042. package/dist/src/__tests__/stdlib/sort-v2.test.js +131 -0
  1043. package/dist/src/__tests__/stdlib/sort.test.d.ts +4 -0
  1044. package/dist/src/__tests__/stdlib/sort.test.js +128 -0
  1045. package/dist/src/__tests__/stdlib/state.test.d.ts +5 -0
  1046. package/dist/src/__tests__/stdlib/state.test.js +176 -0
  1047. package/dist/src/__tests__/typechecker-strict.test.js +21 -21
  1048. package/dist/src/__tests__/typechecker.test.js +5 -3
  1049. package/dist/src/ast/types.d.ts +28 -2
  1050. package/dist/src/emit/compile.js +30 -3
  1051. package/dist/src/emit/index.d.ts +2 -0
  1052. package/dist/src/emit/index.js +20 -1
  1053. package/dist/src/emit/modules.js +3 -2
  1054. package/dist/src/events/types.d.ts +1 -1
  1055. package/dist/src/events/types.js +5 -2
  1056. package/dist/src/hir/lower.js +88 -2
  1057. package/dist/src/hir/monomorphize.js +11 -5
  1058. package/dist/src/hir/types.d.ts +20 -1
  1059. package/dist/src/lexer/index.d.ts +1 -1
  1060. package/dist/src/lexer/index.js +10 -1
  1061. package/dist/src/lir/lower.js +7 -0
  1062. package/dist/src/lsp/server.js +912 -56
  1063. package/dist/src/mc-test/client.d.ts +13 -1
  1064. package/dist/src/mc-test/client.js +29 -1
  1065. package/dist/src/mir/lower.js +703 -74
  1066. package/dist/src/mir/types.d.ts +5 -0
  1067. package/dist/src/mir/verify.js +2 -0
  1068. package/dist/src/optimizer/constant_fold.js +10 -6
  1069. package/dist/src/optimizer/coroutine.js +90 -33
  1070. package/dist/src/optimizer/interprocedural.js +4 -0
  1071. package/dist/src/parser/index.d.ts +5 -0
  1072. package/dist/src/parser/index.js +171 -39
  1073. package/dist/src/runtime/index.js +24 -0
  1074. package/dist/src/typechecker/index.d.ts +8 -1
  1075. package/dist/src/typechecker/index.js +73 -14
  1076. package/docs/LANGUAGE_REFERENCE.md +302 -67
  1077. package/docs/stdlib/README.md +54 -0
  1078. package/docs/stdlib/advanced.md +276 -0
  1079. package/docs/stdlib/bigint.md +285 -0
  1080. package/docs/stdlib/bits.md +159 -0
  1081. package/docs/stdlib/bossbar.md +101 -0
  1082. package/docs/stdlib/calculus.md +141 -0
  1083. package/docs/stdlib/color.md +125 -0
  1084. package/docs/stdlib/combat.md +41 -0
  1085. package/docs/stdlib/cooldown.md +48 -0
  1086. package/docs/stdlib/easing.md +157 -0
  1087. package/docs/stdlib/effects.md +101 -0
  1088. package/docs/stdlib/expr.md +38 -0
  1089. package/docs/stdlib/geometry.md +130 -0
  1090. package/docs/stdlib/interactions.md +111 -0
  1091. package/docs/stdlib/inventory.md +53 -0
  1092. package/docs/stdlib/list.md +189 -0
  1093. package/docs/stdlib/math.md +334 -0
  1094. package/docs/stdlib/math_hp.md +185 -0
  1095. package/docs/stdlib/matrix.md +123 -0
  1096. package/docs/stdlib/mobs.md +131 -0
  1097. package/docs/stdlib/noise.md +103 -0
  1098. package/docs/stdlib/parabola.md +119 -0
  1099. package/docs/stdlib/particles.md +123 -0
  1100. package/docs/stdlib/physics.md +148 -0
  1101. package/docs/stdlib/player.md +43 -0
  1102. package/docs/stdlib/quaternion.md +159 -0
  1103. package/docs/stdlib/random.md +86 -0
  1104. package/docs/stdlib/sets.md +68 -0
  1105. package/docs/stdlib/signal.md +141 -0
  1106. package/docs/stdlib/spawn.md +65 -0
  1107. package/docs/stdlib/strings.md +17 -0
  1108. package/docs/stdlib/tags.md +117 -0
  1109. package/docs/stdlib/teams.md +87 -0
  1110. package/docs/stdlib/timer.md +126 -0
  1111. package/docs/stdlib/vec.md +193 -0
  1112. package/docs/stdlib/world.md +151 -0
  1113. package/editors/vscode/build.mjs +31 -12
  1114. package/editors/vscode/out/extension.js +3670 -200
  1115. package/editors/vscode/out/lsp-server.js +14854 -0
  1116. package/editors/vscode/package-lock.json +3 -3
  1117. package/editors/vscode/package.json +1 -1
  1118. package/editors/vscode/snippets/redscript.json +109 -30
  1119. package/editors/vscode/src/extension.ts +15 -13
  1120. package/examples/readme-demo.mcrs +4 -4
  1121. package/jest.config.js +5 -2
  1122. package/package.json +1 -1
  1123. package/scripts/postbuild.js +20 -0
  1124. package/src/__tests__/array-dynamic.test.ts +42 -0
  1125. package/src/__tests__/builtins.test.ts +66 -0
  1126. package/src/__tests__/compile-all.test.ts +3 -2
  1127. package/src/__tests__/diagnostics.test.ts +8 -10
  1128. package/src/__tests__/double.test.ts +478 -0
  1129. package/src/__tests__/e2e/ecs-stdlib.test.ts +371 -0
  1130. package/src/__tests__/e2e/events-stdlib.test.ts +50 -0
  1131. package/src/__tests__/e2e/fft-stdlib.test.ts +313 -0
  1132. package/src/__tests__/e2e/macros.test.ts +7 -7
  1133. package/src/__tests__/e2e/ode-stdlib.test.ts +68 -0
  1134. package/src/__tests__/e2e/stdlib-e2e.test.ts +1952 -0
  1135. package/src/__tests__/emit/compile.test.ts +102 -0
  1136. package/src/__tests__/emit/index.test.ts +189 -0
  1137. package/src/__tests__/emit/modules-extra.test.ts +80 -0
  1138. package/src/__tests__/enum.test.ts +4 -6
  1139. package/src/__tests__/fixed.test.ts +159 -0
  1140. package/src/__tests__/fixtures/coroutine-mc-test.mcrs +58 -0
  1141. package/src/__tests__/fixtures/for-range.mcrs +15 -0
  1142. package/src/__tests__/fixtures/heap-sort-mc-test.mcrs +87 -0
  1143. package/src/__tests__/fixtures/impl-test.mcrs +13 -44
  1144. package/src/__tests__/fixtures/stdlib-extra-test.mcrs +226 -0
  1145. package/src/__tests__/fixtures/stdlib-math-integration.mcrs +28 -0
  1146. package/src/__tests__/fixtures/stdlib-math-test.mcrs +53 -0
  1147. package/src/__tests__/float-lint.test.ts +102 -0
  1148. package/src/__tests__/float.test.ts +158 -0
  1149. package/src/__tests__/for-each.test.ts +135 -0
  1150. package/src/__tests__/for-range.test.ts +149 -0
  1151. package/src/__tests__/generics.test.ts +4 -4
  1152. package/src/__tests__/impl.test.ts +207 -0
  1153. package/src/__tests__/lsp-logic.test.ts +162 -0
  1154. package/src/__tests__/match.test.ts +212 -0
  1155. package/src/__tests__/mc-integration/item-entity-events.test.ts +298 -0
  1156. package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +817 -0
  1157. package/src/__tests__/mc-integration/stdlib-coverage.test.ts +699 -0
  1158. package/src/__tests__/mc-integration/syntax-coverage.test.ts +464 -0
  1159. package/src/__tests__/mc-integration.test.ts +889 -5
  1160. package/src/__tests__/optimizer/constant_fold.test.ts +115 -0
  1161. package/src/__tests__/optimizer/coroutine.test.ts +3 -2
  1162. package/src/__tests__/parser.test.ts +5 -5
  1163. package/src/__tests__/runtime.test.ts +194 -0
  1164. package/src/__tests__/stdlib/arr-len.test.ts +231 -0
  1165. package/src/__tests__/stdlib/calculus.test.ts +99 -0
  1166. package/src/__tests__/stdlib/dialog.test.ts +132 -0
  1167. package/src/__tests__/stdlib/easing.test.ts +97 -0
  1168. package/src/__tests__/stdlib/geometry.test.ts +171 -0
  1169. package/src/__tests__/stdlib/heap.test.ts +121 -0
  1170. package/src/__tests__/stdlib/list.test.ts +117 -0
  1171. package/src/__tests__/stdlib/matrix.test.ts +140 -0
  1172. package/src/__tests__/stdlib/pathfind.test.ts +151 -0
  1173. package/src/__tests__/stdlib/scheduler.test.ts +171 -0
  1174. package/src/__tests__/stdlib/sort-v2.test.ts +111 -0
  1175. package/src/__tests__/stdlib/sort.test.ts +106 -0
  1176. package/src/__tests__/stdlib/state.test.ts +164 -0
  1177. package/src/__tests__/typechecker-strict.test.ts +21 -21
  1178. package/src/__tests__/typechecker.test.ts +5 -3
  1179. package/src/ast/types.ts +16 -3
  1180. package/src/emit/compile.ts +32 -3
  1181. package/src/emit/index.ts +24 -1
  1182. package/src/emit/modules.ts +2 -1
  1183. package/src/events/types.ts +5 -2
  1184. package/src/examples/capture_the_flag.mcrs +2 -2
  1185. package/src/examples/hunger_games.mcrs +4 -4
  1186. package/src/examples/parkour_race.mcrs +8 -8
  1187. package/src/examples/tutorial_01_hello.mcrs +63 -0
  1188. package/src/examples/tutorial_02_variables.mcrs +157 -0
  1189. package/src/examples/tutorial_03_functions_structs.mcrs +162 -0
  1190. package/src/examples/tutorial_04_selectors.mcrs +139 -0
  1191. package/src/examples/tutorial_05_decorators.mcrs +131 -0
  1192. package/src/examples/tutorial_06_math_particles.mcrs +123 -0
  1193. package/src/examples/tutorial_07_random.mcrs +142 -0
  1194. package/src/examples/tutorial_08_coroutine.mcrs +163 -0
  1195. package/src/examples/tutorial_09_precision.mcrs +154 -0
  1196. package/src/examples/tutorial_10_kill_race.mcrs +289 -0
  1197. package/src/examples/zombie_survival.mcrs +7 -7
  1198. package/src/hir/lower.ts +101 -4
  1199. package/src/hir/monomorphize.ts +11 -6
  1200. package/src/hir/types.ts +14 -1
  1201. package/src/lexer/index.ts +11 -2
  1202. package/src/lir/lower.ts +8 -0
  1203. package/src/lsp/server.ts +894 -54
  1204. package/src/mc-test/client.ts +32 -1
  1205. package/src/mir/lower.ts +703 -74
  1206. package/src/mir/types.ts +1 -0
  1207. package/src/mir/verify.ts +2 -0
  1208. package/src/optimizer/constant_fold.ts +11 -6
  1209. package/src/optimizer/coroutine.ts +89 -29
  1210. package/src/optimizer/interprocedural.ts +4 -0
  1211. package/src/parser/index.ts +175 -41
  1212. package/src/runtime/index.ts +26 -0
  1213. package/src/stdlib/advanced.mcrs +47 -0
  1214. package/src/stdlib/bigint.mcrs +251 -0
  1215. package/src/stdlib/calculus.mcrs +150 -0
  1216. package/src/stdlib/color.mcrs +102 -82
  1217. package/src/stdlib/combat.mcrs +18 -12
  1218. package/src/stdlib/dialog.mcrs +55 -0
  1219. package/src/stdlib/ecs.mcrs +238 -0
  1220. package/src/stdlib/events.mcrs +29 -0
  1221. package/src/stdlib/expr.mcrs +117 -0
  1222. package/src/stdlib/fft.mcrs +177 -0
  1223. package/src/stdlib/geometry.mcrs +89 -0
  1224. package/src/stdlib/graph.mcrs +274 -0
  1225. package/src/stdlib/heap.mcrs +175 -0
  1226. package/src/stdlib/linalg.mcrs +260 -0
  1227. package/src/stdlib/list.mcrs +99 -0
  1228. package/src/stdlib/math.mcrs +121 -5
  1229. package/src/stdlib/math_hp.mcrs +452 -0
  1230. package/src/stdlib/matrix.mcrs +113 -0
  1231. package/src/stdlib/ode.mcrs +168 -0
  1232. package/src/stdlib/parabola.mcrs +160 -0
  1233. package/src/stdlib/particles.mcrs +69 -0
  1234. package/src/stdlib/pathfind.mcrs +321 -0
  1235. package/src/stdlib/quaternion.mcrs +192 -0
  1236. package/src/stdlib/random.mcrs +46 -1
  1237. package/src/stdlib/scheduler.mcrs +271 -0
  1238. package/src/stdlib/signal.mcrs +223 -0
  1239. package/src/stdlib/sort.mcrs +194 -0
  1240. package/src/stdlib/state.mcrs +65 -0
  1241. package/src/stdlib/world.mcrs +24 -0
  1242. package/src/typechecker/index.ts +88 -15
  1243. package/test_trig.ts +43 -0
package/src/lsp/server.ts CHANGED
@@ -26,15 +26,28 @@ import {
26
26
  Location,
27
27
  Position,
28
28
  TextDocumentPositionParams,
29
+ SignatureHelp,
30
+ SignatureInformation,
31
+ ParameterInformation,
32
+ SignatureHelpParams,
33
+ ReferenceParams,
34
+ RenameParams,
35
+ WorkspaceEdit,
36
+ InlayHint,
37
+ InlayHintKind,
29
38
  } from 'vscode-languageserver/node'
30
39
  import { TextDocument } from 'vscode-languageserver-textdocument'
40
+ import * as path from 'path'
41
+ import * as fs from 'fs'
42
+ import { fileURLToPath, pathToFileURL } from 'url'
31
43
 
32
44
  import { Lexer } from '../lexer'
33
45
  import { Parser } from '../parser'
34
46
  import { TypeChecker } from '../typechecker'
35
47
  import { DiagnosticError } from '../diagnostics'
36
- import type { Program, FnDecl, Span, TypeNode } from '../ast/types'
48
+ import type { Program, FnDecl, Span, TypeNode, Stmt, Block } from '../ast/types'
37
49
  import { BUILTIN_METADATA } from '../builtins/metadata'
50
+ import type { BuiltinDef } from '../builtins/metadata'
38
51
 
39
52
  // ---------------------------------------------------------------------------
40
53
  // Connection and document manager
@@ -43,6 +56,92 @@ import { BUILTIN_METADATA } from '../builtins/metadata'
43
56
  const connection = createConnection(ProposedFeatures.all)
44
57
  const documents = new TextDocuments(TextDocument)
45
58
 
59
+ // ---------------------------------------------------------------------------
60
+ // Builtin metadata: augment BUILTIN_METADATA from builtins.d.mcrs if present
61
+ // ---------------------------------------------------------------------------
62
+
63
+ /**
64
+ * Parse builtins.d.mcrs for `declare fn` entries and extract doc/param info.
65
+ * This ensures LSP hover covers every declared builtin even if metadata.ts
66
+ * is not yet updated.
67
+ */
68
+ function loadBuiltinsFromDeclFile(): Record<string, BuiltinDef> {
69
+ const extra: Record<string, BuiltinDef> = {}
70
+ // Candidate paths: next to server.ts (dev), or next to the package root
71
+ const candidates = [
72
+ path.resolve(__dirname, '../../builtins.d.mcrs'),
73
+ path.resolve(__dirname, '../../../builtins.d.mcrs'),
74
+ path.resolve(__dirname, '../../../../builtins.d.mcrs'),
75
+ ]
76
+ let src = ''
77
+ for (const p of candidates) {
78
+ if (fs.existsSync(p)) { src = fs.readFileSync(p, 'utf-8'); break }
79
+ }
80
+ if (!src) return extra
81
+
82
+ const lines = src.split('\n')
83
+ let docLines: string[] = []
84
+ let paramDocs: Record<string, string> = {}
85
+
86
+ for (const line of lines) {
87
+ const tripleDoc = line.match(/^\/\/\/\s?(.*)$/)
88
+ if (tripleDoc) {
89
+ const content = tripleDoc[1]
90
+ const paramMatch = content.match(/^@param\s+(\w+)\s+(.+)$/)
91
+ if (paramMatch) {
92
+ paramDocs[paramMatch[1]] = paramMatch[2]
93
+ } else if (!content.startsWith('@example')) {
94
+ docLines.push(content)
95
+ }
96
+ continue
97
+ }
98
+
99
+ const declMatch = line.match(/^declare fn (\w+)\(([^)]*)\):\s*(\w+);?$/)
100
+ if (declMatch) {
101
+ const [, fnName, paramsStr, retType] = declMatch
102
+ // Only add if not already in BUILTIN_METADATA
103
+ if (!ALL_BUILTINS[fnName]) {
104
+ const params = paramsStr.trim()
105
+ ? paramsStr.split(',').map(p => {
106
+ const [pname, ptype] = p.trim().split(':').map(s => s.trim())
107
+ return {
108
+ name: pname ?? '',
109
+ type: ptype ?? 'string',
110
+ required: true,
111
+ doc: paramDocs[pname ?? ''] ?? '',
112
+ docZh: '',
113
+ }
114
+ })
115
+ : []
116
+ extra[fnName] = {
117
+ name: fnName,
118
+ params,
119
+ returns: (retType === 'void' || retType === 'int' || retType === 'bool' || retType === 'string')
120
+ ? retType : 'void',
121
+ doc: docLines.join(' ').trim(),
122
+ docZh: '',
123
+ examples: [],
124
+ category: 'builtin',
125
+ }
126
+ }
127
+ docLines = []
128
+ paramDocs = {}
129
+ continue
130
+ }
131
+
132
+ // Non-comment, non-declare line resets doc accumulator
133
+ if (line.trim() && !line.startsWith('//')) {
134
+ docLines = []
135
+ paramDocs = {}
136
+ }
137
+ }
138
+ return extra
139
+ }
140
+
141
+ const EXTRA_BUILTINS = loadBuiltinsFromDeclFile()
142
+ /** Combined lookup: metadata.ts entries + anything declared in builtins.d.mcrs */
143
+ const ALL_BUILTINS: Record<string, BuiltinDef> = { ...EXTRA_BUILTINS, ...BUILTIN_METADATA }
144
+
46
145
  // ---------------------------------------------------------------------------
47
146
  // Per-document parse cache
48
147
  // ---------------------------------------------------------------------------
@@ -82,15 +181,21 @@ function parseDocument(uri: string, source: string): ParsedDoc {
82
181
  let program: Program | null = null
83
182
 
84
183
  try {
85
- const lexer = new Lexer(source)
184
+ // Strip path-based imports ("import "stdlib/xxx.mcrs"") before parsing,
185
+ // since the Parser only understands import module::symbol syntax.
186
+ // These are handled at compile time by pre-processing, not by the parser.
187
+ const strippedSource = source.replace(/^import\s+"[^"]*"\s*;?\s*$/gm, '// (import stripped for LSP)')
188
+ const lexer = new Lexer(strippedSource)
86
189
  const tokens = lexer.tokenize()
87
- const parser = new Parser(tokens, source, uri)
190
+ const parser = new Parser(tokens, strippedSource, uri)
88
191
  program = parser.parse('redscript')
89
192
 
90
193
  // Type-check (warn mode — collects errors but doesn't throw)
91
- const checker = new TypeChecker(source, uri)
92
- const typeErrors = checker.check(program)
93
- errors.push(...typeErrors)
194
+ try {
195
+ const checker = new TypeChecker(source, uri)
196
+ const typeErrors = checker.check(program)
197
+ errors.push(...typeErrors)
198
+ } catch { /* type errors are non-fatal; keep the parsed program */ }
94
199
  } catch (err) {
95
200
  if (err instanceof DiagnosticError) {
96
201
  errors.push(err)
@@ -129,18 +234,18 @@ function toDiagnostic(err: DiagnosticError): Diagnostic {
129
234
  // ---------------------------------------------------------------------------
130
235
 
131
236
  const DECORATOR_DOCS: Record<string, string> = {
132
- tick: 'Runs every MC game tick (~20 Hz). No arguments.',
133
- load: 'Runs on `/reload`. Use for initialization logic.',
134
- coroutine: 'Splits loops into tick-spread continuations. Arg: `batch=N` (steps per tick, default 1).',
135
- schedule: 'Schedules the function to run after N ticks. Arg: `ticks=N`.',
136
- on_trigger: 'Runs when a trigger scoreboard objective is set by a player. Arg: trigger name.',
137
- keep: 'Prevents the compiler from dead-code-eliminating this function.',
138
- on: 'Generic event handler decorator.',
139
- on_advancement: 'Runs when a player earns an advancement. Arg: advancement id.',
140
- on_craft: 'Runs when a player crafts an item. Arg: item id.',
141
- on_death: 'Runs when a player dies.',
142
- on_join_team: 'Runs when a player joins a team. Arg: team name.',
143
- on_login: 'Runs when a player logs in.',
237
+ tick: 'Runs every game tick.\n\n**Optional args:** `rate=N` (every N ticks, e.g. `@tick(rate=20)` = once per second)\n\nExample: `@tick fn every_tick() {}` or `@tick(rate=20) fn every_second() {}`',
238
+ load: 'Runs once on `/reload`. Use for initialization.\n\nExample: `@load fn init() { scoreboard_create(...) }`',
239
+ coroutine: 'Wraps a loop to spread execution across multiple ticks.\n\n**Required arg:** `batch=N` iterations per tick.\n\nExample: `@coroutine(batch=10) fn scan_blocks() { for i in 0..1000 { ... } }`',
240
+ schedule: 'Schedules the function to run after a delay.\n\n**Required arg:** `ticks=N`\n\nExample: `@schedule(ticks=100) fn delayed() {}`',
241
+ on_trigger: 'Runs when a player executes `/trigger <name>`.\n\n**Required arg:** trigger objective name.\n\nExample: `@on_trigger("shop") fn open_shop() {}`',
242
+ keep: 'Prevents dead-code elimination. Use for exported entry points not referenced in the same file.\n\nExample: `@keep fn public_api() {}`',
243
+ on: 'Generic event handler. Arg: event name.\n\nExample: `@on("custom:event") fn handler() {}`',
244
+ on_advancement: 'Runs when a player earns an advancement.\n\n**Arg:** advancement id (e.g. `"story/mine_diamond"`).\n\nExample: `@on_advancement("story/mine_diamond") fn reward() {}`',
245
+ on_craft: 'Runs when a player crafts an item.\n\n**Arg:** item id (e.g. `"minecraft:diamond_sword"`).\n\nExample: `@on_craft("minecraft:diamond_sword") fn on_craft_sword() {}`',
246
+ on_death: 'Runs when a player dies.\n\nExample: `@on_death fn on_player_death() {}`',
247
+ on_join_team: 'Runs when a player joins a team.\n\n**Arg:** team name.\n\nExample: `@on_join_team("red") fn joined_red() {}`',
248
+ on_login: 'Runs when a player logs into the server.\n\nExample: `@on_login fn welcome() { tell(@s, f"Welcome back!") }`',
144
249
  }
145
250
 
146
251
  // ---------------------------------------------------------------------------
@@ -187,6 +292,60 @@ function formatFnSignature(fn: FnDecl): string {
187
292
  // ---------------------------------------------------------------------------
188
293
 
189
294
  /** Build a mapping from identifier name → definition location. */
295
+ /**
296
+ * Extract the leading doc comment (/** ... *\/) immediately before a function
297
+ * declaration, returning it as plain text (tags stripped).
298
+ */
299
+ function extractDocComment(source: string, fn: FnDecl): string | null {
300
+ if (!fn.span) return null
301
+ const lines = source.split('\n')
302
+ // fn.span.line is 1-based; scan upward from fn declaration line
303
+ let endLine = fn.span.line - 2 // 0-based index of line before fn
304
+ if (endLine < 0) return null
305
+ // Skip blank lines
306
+ while (endLine >= 0 && lines[endLine].trim() === '') endLine--
307
+ if (endLine < 0) return null
308
+
309
+ // Case 1: /** ... */ block comment
310
+ if (lines[endLine].trim().endsWith('*/')) {
311
+ let startLine = endLine
312
+ while (startLine >= 0 && !lines[startLine].trim().startsWith('/**')) startLine--
313
+ if (startLine < 0) return null
314
+ const commentLines = lines.slice(startLine, endLine + 1)
315
+ return commentLines
316
+ .map(l => l.replace(/^\s*\/\*\*\s?/, '').replace(/^\s*\*\/\s?$/, '').replace(/^\s*\*\s?/, '').trimEnd())
317
+ .filter(l => l.length > 0)
318
+ .join('\n') || null
319
+ }
320
+
321
+ // Case 2: consecutive // or /// line comments
322
+ if (lines[endLine].trim().startsWith('//')) {
323
+ let startLine = endLine
324
+ while (startLine > 0 && lines[startLine - 1].trim().startsWith('//')) startLine--
325
+ return lines.slice(startLine, endLine + 1)
326
+ .map(l => l.replace(/^\s*\/\/\/?\/?\s?/, '').trimEnd())
327
+ .filter(l => l.length > 0)
328
+ .join('\n') || null
329
+ }
330
+
331
+ return null
332
+ }
333
+
334
+ /**
335
+ * Find which function declaration contains the given 1-based line number.
336
+ * Uses the next fn's start line as the implicit end when span.endLine is missing.
337
+ */
338
+ function findEnclosingFn(program: Program, curLine: number): import('../ast/types').FnDecl | null {
339
+ const fns = program.declarations.filter(f => f.span)
340
+ for (let i = 0; i < fns.length; i++) {
341
+ const fn = fns[i]
342
+ const startLine = fn.span!.line
343
+ const endLine = fn.span!.endLine ?? (fns[i + 1]?.span?.line ? fns[i + 1].span!.line - 1 : Infinity)
344
+ if (curLine >= startLine && curLine <= endLine) return fn
345
+ }
346
+ return null
347
+ }
348
+
190
349
  function buildDefinitionMap(program: Program, source: string): Map<string, Span> {
191
350
  const map = new Map<string, Span>()
192
351
 
@@ -227,7 +386,7 @@ const KEYWORD_COMPLETIONS: CompletionItem[] = [
227
386
  }))
228
387
 
229
388
  const TYPE_COMPLETIONS: CompletionItem[] = [
230
- 'int', 'bool', 'float', 'string', 'void', 'BlockPos', 'byte', 'short', 'long', 'double',
389
+ 'int', 'bool', 'fixed', 'float', 'string', 'void', 'BlockPos', 'byte', 'short', 'long', 'double',
231
390
  'entity', 'Player', 'Mob', 'HostileMob', 'PassiveMob',
232
391
  'Zombie', 'Skeleton', 'Creeper', 'Spider', 'Enderman',
233
392
  ].map(t => ({
@@ -235,12 +394,35 @@ const TYPE_COMPLETIONS: CompletionItem[] = [
235
394
  kind: CompletionItemKind.TypeParameter,
236
395
  }))
237
396
 
397
+ // Decorator completions — triggered when '@' is typed at line start context.
398
+ // insertText is the full token WITHOUT '@' because '@' is already on screen.
399
+ // VSCode will keep the completion open as user types more letters (filter by label).
238
400
  const DECORATOR_COMPLETIONS: CompletionItem[] = [
239
- '@tick', '@load', '@on', '@coroutine', '@keep',
240
- ].map(d => ({
241
- label: d,
242
- kind: CompletionItemKind.Event,
243
- }))
401
+ { label: '@tick', detail: 'Run every game tick (~20 Hz)', insertText: 'tick' },
402
+ { label: '@load', detail: 'Run on /reload (initialization)', insertText: 'load' },
403
+ { label: '@on_trigger', detail: 'Run when a player uses /trigger', insertText: 'on_trigger' },
404
+ { label: '@schedule', detail: 'Schedule function after N ticks', insertText: 'schedule' },
405
+ { label: '@coroutine', detail: 'Spread loop across ticks (batch=N)', insertText: 'coroutine' },
406
+ { label: '@keep', detail: 'Prevent dead-code elimination', insertText: 'keep' },
407
+ { label: '@on', detail: 'Generic event handler', insertText: 'on' },
408
+ { label: '@on_advancement', detail: 'Run on advancement earned', insertText: 'on_advancement' },
409
+ { label: '@on_craft', detail: 'Run on item craft', insertText: 'on_craft' },
410
+ { label: '@on_death', detail: 'Run on player death', insertText: 'on_death' },
411
+ { label: '@on_join_team', detail: 'Run on team join', insertText: 'on_join_team' },
412
+ { label: '@on_login', detail: 'Run on player login', insertText: 'on_login' },
413
+ { label: '@require_on_load',detail: 'Ensure a fn runs on load (stdlib)', insertText: 'require_on_load' },
414
+ ].map(d => ({ ...d, kind: CompletionItemKind.Event }))
415
+
416
+ /** Entity selector completions triggered by @ inside expressions.
417
+ * insertText is without '@' (already typed). label has '@' for display. */
418
+ const SELECTOR_COMPLETIONS: CompletionItem[] = [
419
+ { label: '@a', insertText: 'a', kind: CompletionItemKind.Value, detail: 'All players', documentation: 'Targets all online players.' },
420
+ { label: '@p', insertText: 'p', kind: CompletionItemKind.Value, detail: 'Nearest player', documentation: 'Targets the nearest player to the command source.' },
421
+ { label: '@s', insertText: 's', kind: CompletionItemKind.Value, detail: 'Executing entity', documentation: 'Targets the entity currently executing the command.' },
422
+ { label: '@e', insertText: 'e', kind: CompletionItemKind.Value, detail: 'All entities', documentation: 'Targets all entities (use [type=...] to filter).' },
423
+ { label: '@r', insertText: 'r', kind: CompletionItemKind.Value, detail: 'Random player', documentation: 'Targets a random online player.' },
424
+ { label: '@n', insertText: 'n', kind: CompletionItemKind.Value, detail: 'Nearest entity', documentation: 'Targets the nearest entity (any type).' },
425
+ ]
244
426
 
245
427
  const BUILTIN_FN_COMPLETIONS: CompletionItem[] = [
246
428
  'say', 'tell', 'give', 'kill', 'teleport', 'summon', 'setblock',
@@ -267,6 +449,12 @@ connection.onInitialize((_params: InitializeParams): InitializeResult => {
267
449
  triggerCharacters: ['.', '@'],
268
450
  resolveProvider: false,
269
451
  },
452
+ signatureHelpProvider: {
453
+ triggerCharacters: ['(', ','],
454
+ },
455
+ referencesProvider: true,
456
+ renameProvider: true,
457
+ inlayHintProvider: true,
270
458
  },
271
459
  serverInfo: {
272
460
  name: 'redscript-lsp',
@@ -306,36 +494,79 @@ connection.onHover((params: TextDocumentPositionParams): Hover | null => {
306
494
  if (!doc) return null
307
495
 
308
496
  const source = doc.getText()
309
- const cached = parsedDocs.get(params.textDocument.uri)
310
- const program = cached?.program ?? null
311
- if (!program) return null
312
497
 
313
- // Check if cursor is on a decorator (@tick, @load, etc.)
498
+ // ── Decorator hover: works even if program is null (parse errors elsewhere) ──
314
499
  const lines = source.split('\n')
315
500
  const lineText = lines[params.position.line] ?? ''
316
- const decoratorMatch = lineText.match(/@([a-zA-Z_][a-zA-Z0-9_]*)/)
317
- if (decoratorMatch) {
318
- const ch = params.position.character
319
- const atIdx = lineText.indexOf('@')
320
- const decoratorEnd = atIdx + 1 + decoratorMatch[1].length
321
- if (ch >= atIdx && ch <= decoratorEnd) {
322
- const decoratorName = decoratorMatch[1]
501
+ const ch = params.position.character
502
+ // Find all @xxx on this line and check if cursor is inside one
503
+ const decorRe = /@([a-zA-Z_][a-zA-Z0-9_]*)/g
504
+ let dm: RegExpExecArray | null
505
+ while ((dm = decorRe.exec(lineText)) !== null) {
506
+ const atIdx = dm.index
507
+ const decorEnd = atIdx + dm[0].length
508
+ if (ch >= atIdx && ch <= decorEnd) {
509
+ const decoratorName = dm[1]
323
510
  const decoratorDoc = DECORATOR_DOCS[decoratorName]
324
511
  if (decoratorDoc) {
325
- const content: MarkupContent = {
326
- kind: MarkupKind.Markdown,
327
- value: `**@${decoratorName}** — ${decoratorDoc}`,
512
+ return {
513
+ contents: {
514
+ kind: MarkupKind.Markdown,
515
+ value: `**@${decoratorName}** — ${decoratorDoc}`,
516
+ } as MarkupContent,
517
+ }
518
+ }
519
+ }
520
+ }
521
+
522
+ // ── Selector hover: @a, @p, @s etc ─────────────────────────────────────────
523
+ const SELECTOR_DOCS: Record<string, string> = {
524
+ '@a': 'All online players',
525
+ '@p': 'Nearest player to the command source',
526
+ '@s': 'The entity currently executing the command (self)',
527
+ '@e': 'All entities (use [type=...] to filter)',
528
+ '@r': 'A random online player',
529
+ '@n': 'The nearest entity of any type',
530
+ }
531
+ // Match @x or @x[...] token at cursor
532
+ const selRe = /@([a-zA-Z])/g
533
+ let sm: RegExpExecArray | null
534
+ while ((sm = selRe.exec(lineText)) !== null) {
535
+ const selStart = sm.index
536
+ const selEnd = selStart + sm[0].length
537
+ if (ch >= selStart && ch <= selEnd) {
538
+ const selKey = sm[0] // e.g. '@a'
539
+ const selDoc = SELECTOR_DOCS[selKey]
540
+ if (selDoc) {
541
+ return {
542
+ contents: {
543
+ kind: MarkupKind.Markdown,
544
+ value: `**${selKey}** — ${selDoc}`,
545
+ } as MarkupContent,
328
546
  }
329
- return { contents: content }
330
547
  }
331
548
  }
332
549
  }
333
550
 
551
+ const cached = parsedDocs.get(params.textDocument.uri)
552
+ const program = cached?.program ?? null
553
+ if (!program) return null
554
+
334
555
  const word = wordAt(source, params.position)
335
556
  if (!word) return null
336
557
 
558
+ // If cursor is on a selector like @s/@a/@p, the word is just 's'/'a'/'p'.
559
+ // Detect this by checking the character before the word start.
560
+ const hovLines = source.split('\n')
561
+ const hovLine = hovLines[params.position.line] ?? ''
562
+ const hovCh = params.position.character
563
+ // Find start of current word
564
+ let hovWordStart = hovCh
565
+ while (hovWordStart > 0 && /\w/.test(hovLine[hovWordStart - 1])) hovWordStart--
566
+ if (hovWordStart > 0 && hovLine[hovWordStart - 1] === '@') return null // It's a selector, no hover
567
+
337
568
  // Check builtins
338
- const builtin = BUILTIN_METADATA[word]
569
+ const builtin = ALL_BUILTINS[word]
339
570
  if (builtin) {
340
571
  const paramStr = builtin.params
341
572
  .map(p => `${p.name}: ${p.type}${p.required ? '' : '?'}`)
@@ -391,6 +622,75 @@ connection.onHover((params: TextDocumentPositionParams): Hover | null => {
391
622
  return { contents: content }
392
623
  }
393
624
 
625
+ // Check globals
626
+ const globalDecl = program.globals?.find(g => g.name === word)
627
+ if (globalDecl) {
628
+ const content: MarkupContent = {
629
+ kind: MarkupKind.Markdown,
630
+ value: `\`\`\`redscript\nlet ${globalDecl.name}: ${typeToString(globalDecl.type)}\n\`\`\`\n*global variable*`,
631
+ }
632
+ return { contents: content }
633
+ }
634
+
635
+ // Check locals and params in the enclosing function
636
+ {
637
+ const curLine = params.position.line + 1
638
+ const fn = findEnclosingFn(program, curLine)
639
+ if (fn) {
640
+ // Check params
641
+ const param = fn.params.find(p => p.name === word)
642
+ if (param) {
643
+ return {
644
+ contents: {
645
+ kind: MarkupKind.Markdown,
646
+ value: `\`\`\`redscript\n(param) ${param.name}: ${typeToString(param.type)}\n\`\`\``,
647
+ } as MarkupContent,
648
+ }
649
+ }
650
+ // Check locals
651
+ if (fn.body) {
652
+ const locals = collectLocals(fn.body as import('../ast/types').Block)
653
+ const localType = locals.get(word)
654
+ if (localType) {
655
+ return {
656
+ contents: {
657
+ kind: MarkupKind.Markdown,
658
+ value: `\`\`\`redscript\nlet ${word}: ${typeToString(localType)}\n\`\`\``,
659
+ } as MarkupContent,
660
+ }
661
+ }
662
+ }
663
+ }
664
+ }
665
+
666
+ // ── Check imported files (import "stdlib/xxx.mcrs" and import xxx::*) ──────
667
+ try {
668
+ const importedPrograms = getImportedPrograms(source, params.textDocument.uri)
669
+ for (const { prog, filePath } of importedPrograms) {
670
+ const importedFn = findFunction(prog, word)
671
+ if (importedFn) {
672
+ const sig = formatFnSignature(importedFn)
673
+ // Extract leading /** ... */ comment from the source file
674
+ const docComment = extractDocComment(fs.readFileSync(filePath, 'utf-8'), importedFn)
675
+ const docLine = docComment ? `\n\n${docComment}` : ''
676
+ const content: MarkupContent = {
677
+ kind: MarkupKind.Markdown,
678
+ value: `\`\`\`redscript\n${sig}\n\`\`\`${docLine}\n\n*from ${path.basename(filePath)}*`,
679
+ }
680
+ return { contents: content }
681
+ }
682
+ const importedStruct = prog.structs?.find(s => s.name === word)
683
+ if (importedStruct) {
684
+ const fields = importedStruct.fields.map(f => ` ${f.name}: ${typeToString(f.type)}`).join('\n')
685
+ const content: MarkupContent = {
686
+ kind: MarkupKind.Markdown,
687
+ value: `\`\`\`redscript\nstruct ${importedStruct.name} {\n${fields}\n}\n\`\`\`\n\n*from ${path.basename(filePath)}*`,
688
+ }
689
+ return { contents: content }
690
+ }
691
+ }
692
+ } catch { /* ignore */ }
693
+
394
694
  return null
395
695
  })
396
696
 
@@ -398,11 +698,101 @@ connection.onHover((params: TextDocumentPositionParams): Hover | null => {
398
698
  // Go-to-definition
399
699
  // ---------------------------------------------------------------------------
400
700
 
701
+ /**
702
+ * Parse all import declarations in `source` (both path-based and module::*
703
+ * forms) and return parsed Program objects for each resolved file.
704
+ */
705
+ function getImportedPrograms(source: string, fromUri: string): Array<{ prog: import('../ast/types').Program; filePath: string }> {
706
+ const result: Array<{ prog: import('../ast/types').Program; filePath: string }> = []
707
+ // 1. Path-based: import "stdlib/math.mcrs"
708
+ const FILE_IMPORT_RE = /^import\s+"([^"]+)"/gm
709
+ let m: RegExpExecArray | null
710
+ while ((m = FILE_IMPORT_RE.exec(source)) !== null) {
711
+ const resolved = resolveImportPath(m[1], fromUri)
712
+ if (!resolved || !fs.existsSync(resolved)) continue
713
+ try {
714
+ const src = fs.readFileSync(resolved, 'utf-8')
715
+ const tokens = new Lexer(src).tokenize()
716
+ const prog = new Parser(tokens).parse(path.basename(resolved, '.mcrs'))
717
+ result.push({ prog, filePath: resolved })
718
+ } catch { /* skip */ }
719
+ }
720
+ // 2. Module-star: import random::* or import random::fn_name
721
+ const MOD_IMPORT_RE = /^import\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*::/gm
722
+ while ((m = MOD_IMPORT_RE.exec(source)) !== null) {
723
+ const modName = m[1]
724
+ // Try to resolve as stdlib/modName.mcrs
725
+ const resolved = resolveImportPath(`stdlib/${modName}.mcrs`, fromUri)
726
+ if (!resolved || !fs.existsSync(resolved)) continue
727
+ // Avoid duplicates if already resolved above
728
+ if (result.some(r => r.filePath === resolved)) continue
729
+ try {
730
+ const src = fs.readFileSync(resolved, 'utf-8')
731
+ const tokens = new Lexer(src).tokenize()
732
+ const prog = new Parser(tokens).parse(modName)
733
+ result.push({ prog, filePath: resolved })
734
+ } catch { /* skip */ }
735
+ }
736
+ return result
737
+ }
738
+
739
+ /** Resolve a relative or stdlib import path to an absolute file path. */
740
+ function resolveImportPath(importStr: string, fromUri: string): string | null {
741
+ try {
742
+ const fromFile = fileURLToPath(fromUri)
743
+ const fromDir = path.dirname(fromFile)
744
+
745
+ if (importStr.startsWith('.')) {
746
+ // Relative path: import "../stdlib/math.mcrs"
747
+ const resolved = path.resolve(fromDir, importStr)
748
+ if (fs.existsSync(resolved)) return resolved
749
+ // Try adding .mcrs extension
750
+ if (!resolved.endsWith('.mcrs') && fs.existsSync(resolved + '.mcrs')) return resolved + '.mcrs'
751
+ } else {
752
+ // stdlib path: import "stdlib/math" or "stdlib/math.mcrs"
753
+ // Walk up to find package root (contains package.json)
754
+ let dir = fromDir
755
+ for (let i = 0; i < 10; i++) {
756
+ if (fs.existsSync(path.join(dir, 'package.json'))) {
757
+ const candidate = path.join(dir, 'src', importStr)
758
+ if (fs.existsSync(candidate)) return candidate
759
+ if (fs.existsSync(candidate + '.mcrs')) return candidate + '.mcrs'
760
+ // also try without 'src/'
761
+ const candidate2 = path.join(dir, importStr)
762
+ if (fs.existsSync(candidate2)) return candidate2
763
+ if (fs.existsSync(candidate2 + '.mcrs')) return candidate2 + '.mcrs'
764
+ break
765
+ }
766
+ dir = path.dirname(dir)
767
+ }
768
+ }
769
+ } catch { /* ignore */ }
770
+ return null
771
+ }
772
+
401
773
  connection.onDefinition((params: TextDocumentPositionParams): Location | null => {
402
774
  const doc = documents.get(params.textDocument.uri)
403
775
  if (!doc) return null
404
776
 
405
777
  const source = doc.getText()
778
+ const lines = source.split('\n')
779
+ const lineText = lines[params.position.line] ?? ''
780
+ const ch = params.position.character
781
+
782
+ // ── import "path/to/file.mcrs" ─────────────────────────────────────────────
783
+ // Cursor is anywhere on the line that starts with `import "..."`
784
+ const fileImportMatch = lineText.match(/^import\s+"([^"]+)"/)
785
+ if (fileImportMatch) {
786
+ const importStr = fileImportMatch[1]
787
+ const resolved = resolveImportPath(importStr, params.textDocument.uri)
788
+ if (resolved) {
789
+ return {
790
+ uri: pathToFileURL(resolved).toString(),
791
+ range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } },
792
+ }
793
+ }
794
+ }
795
+
406
796
  const cached = parsedDocs.get(params.textDocument.uri)
407
797
  const program = cached?.program ?? null
408
798
  if (!program) return null
@@ -410,27 +800,227 @@ connection.onDefinition((params: TextDocumentPositionParams): Location | null =>
410
800
  const word = wordAt(source, params.position)
411
801
  if (!word) return null
412
802
 
803
+ // If cursor is on a selector like @s/@a, the word is 's'/'a' — no F12.
804
+ let defWordStart = params.position.character
805
+ while (defWordStart > 0 && /\w/.test(lineText[defWordStart - 1])) defWordStart--
806
+ if (defWordStart > 0 && lineText[defWordStart - 1] === '@') return null
807
+
808
+ // ── Normal in-file definition (top-level fn/struct/const/global) ────────────
413
809
  const defMap = buildDefinitionMap(program, source)
414
810
  const span = defMap.get(word)
415
- if (!span) return null
811
+ if (span) {
812
+ const line = Math.max(0, span.line - 1)
813
+ const col = Math.max(0, span.col - 1)
814
+ return {
815
+ uri: params.textDocument.uri,
816
+ range: {
817
+ start: { line, character: col },
818
+ end: { line, character: col + word.length },
819
+ },
820
+ }
821
+ }
416
822
 
417
- const line = Math.max(0, span.line - 1)
418
- const col = Math.max(0, span.col - 1)
419
- return {
420
- uri: params.textDocument.uri,
421
- range: {
422
- start: { line, character: col },
423
- end: { line, character: col + word.length },
424
- },
823
+ // ── If word is a local/param in the enclosing fn, don't fall through to imports ──
824
+ const defCurLine = params.position.line + 1 // 1-based
825
+ const enclosingFn = findEnclosingFn(program, defCurLine)
826
+ if (enclosingFn) {
827
+ if (enclosingFn.params.some(p => p.name === word)) return null
828
+ if (enclosingFn.body) {
829
+ const locals = collectLocals(enclosingFn.body as import('../ast/types').Block)
830
+ if (locals.has(word)) return null
831
+ }
832
+ }
833
+ // Struct fields — clicking on .phase, .active etc. should not jump to stdlib
834
+ for (const s of program.structs ?? []) {
835
+ if (s.fields.some(f => f.name === word)) return null
836
+ }
837
+
838
+ // ── Imported symbol F12 — jump to definition inside the imported file ────────
839
+ // Only reached if word is not a local. Avoids false matches for short names like 'p', 'k'.
840
+ try {
841
+ const importedPrograms = getImportedPrograms(source, params.textDocument.uri)
842
+ for (const { prog, filePath } of importedPrograms) {
843
+ const importedDefMap = buildDefinitionMap(prog, fs.readFileSync(filePath, 'utf-8'))
844
+ const importedSpan = importedDefMap.get(word)
845
+ if (importedSpan) {
846
+ const line = Math.max(0, importedSpan.line - 1)
847
+ const col = Math.max(0, importedSpan.col - 1)
848
+ return {
849
+ uri: pathToFileURL(filePath).toString(),
850
+ range: {
851
+ start: { line, character: col },
852
+ end: { line, character: col + word.length },
853
+ },
854
+ }
855
+ }
856
+ }
857
+ } catch { /* ignore */ }
858
+
859
+ // ── import module::symbol (legacy AST imports) — open module file ONLY for explicit symbols ──
860
+ // NOTE: do NOT match im.symbol === '*' — that would cause any word to jump to the first import!
861
+ const importDecl = program.imports?.find(im => im.symbol === word)
862
+ if (importDecl) {
863
+ const resolved = resolveImportPath(`stdlib/${importDecl.moduleName}.mcrs`, params.textDocument.uri)
864
+ ?? resolveImportPath(importDecl.moduleName, params.textDocument.uri)
865
+ ?? resolveImportPath(importDecl.moduleName + '.mcrs', params.textDocument.uri)
866
+ if (resolved) {
867
+ return {
868
+ uri: pathToFileURL(resolved).toString(),
869
+ range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } },
870
+ }
871
+ }
425
872
  }
873
+
874
+ return null
426
875
  })
427
876
 
877
+ // ---------------------------------------------------------------------------
878
+ // Completion helpers
879
+ // ---------------------------------------------------------------------------
880
+
881
+ /** int[] built-in methods */
882
+ const ARRAY_METHOD_COMPLETIONS: CompletionItem[] = [
883
+ { label: 'push', kind: CompletionItemKind.Method, detail: '(value: int): void', documentation: 'Append an element to the array.' },
884
+ { label: 'pop', kind: CompletionItemKind.Method, detail: '(): int', documentation: 'Remove and return the last element.' },
885
+ { label: 'length', kind: CompletionItemKind.Property, detail: 'int', documentation: 'Number of elements in the array.' },
886
+ ]
887
+
888
+ /** Collect (name → TypeNode) for all let bindings visible in the function body at offset. */
889
+ function collectLocals(body: Block): Map<string, TypeNode> {
890
+ const map = new Map<string, TypeNode>()
891
+ // Sentinel type for variables whose type is unknown (e.g. foreach bindings)
892
+ const ENTITY_TYPE: TypeNode = { kind: 'named', name: 'int' } // placeholder for entity/selector binding
893
+ function walk(stmts: Block): void {
894
+ for (const s of stmts) {
895
+ if (s.kind === 'let' && s.type) {
896
+ map.set(s.name, s.type)
897
+ } else if (s.kind === 'foreach') {
898
+ // foreach binding is an entity/selector variable
899
+ map.set((s as any).binding, ENTITY_TYPE)
900
+ if (Array.isArray((s as any).body)) walk((s as any).body as Block)
901
+ continue
902
+ } else if (s.kind === 'for') {
903
+ // for i in range — binding is int
904
+ if ((s as any).binding) map.set((s as any).binding, { kind: 'named', name: 'int' })
905
+ }
906
+ // Recurse into sub-blocks
907
+ const sub = (s as Record<string, unknown>)
908
+ if (Array.isArray(sub['body'])) walk(sub['body'] as Block)
909
+ if (Array.isArray(sub['then'])) walk(sub['then'] as Block)
910
+ if (Array.isArray(sub['else_'])) walk(sub['else_'] as Block)
911
+ }
912
+ }
913
+ walk(body)
914
+ return map
915
+ }
916
+
917
+ /** Determine if line at cursor is a dot-access context: `<expr>.` */
918
+ function getDotReceiver(lineText: string, charPos: number): string | null {
919
+ // Check that the character just before cursor is '.'
920
+ if (lineText[charPos - 1] !== '.') return null
921
+ // Scan left to collect the identifier before '.'
922
+ let end = charPos - 2
923
+ while (end >= 0 && /\s/.test(lineText[end])) end--
924
+ if (end < 0) return null
925
+ let start = end
926
+ while (start > 0 && /[a-zA-Z0-9_]/.test(lineText[start - 1])) start--
927
+ return lineText.slice(start, end + 1) || null
928
+ }
929
+
428
930
  // ---------------------------------------------------------------------------
429
931
  // Completion
430
932
  // ---------------------------------------------------------------------------
431
933
 
432
934
  connection.onCompletion((params: TextDocumentPositionParams): CompletionItem[] => {
433
935
  const doc = documents.get(params.textDocument.uri)
936
+ if (!doc) {
937
+ return [...KEYWORD_COMPLETIONS, ...TYPE_COMPLETIONS, ...BUILTIN_FN_COMPLETIONS, ...DECORATOR_COMPLETIONS]
938
+ }
939
+
940
+ const source = doc.getText()
941
+ const lines = source.split('\n')
942
+ const lineText = lines[params.position.line] ?? ''
943
+ const charPos = params.position.character
944
+
945
+ const cached = parsedDocs.get(params.textDocument.uri)
946
+ const program = cached?.program ?? null
947
+
948
+ // ── @ trigger: selector (@a/@p/@s/@e/@r/@n) vs decorator (@tick etc) ────────
949
+ // Only fires when the character just typed is '@' (triggerCharacter).
950
+ // insertText includes the full @xxx so VSCode replaces the '@' already on screen.
951
+ const prevChar = lineText[charPos - 1]
952
+ if (prevChar === '@') {
953
+ const before = lineText.slice(0, charPos - 1).trim()
954
+ const isExprContext = before.length > 0 && !/^(fn|let|if|while|for|return|@)/.test(before.split(/\s+/).pop() ?? '')
955
+ if (isExprContext) {
956
+ return SELECTOR_COMPLETIONS
957
+ }
958
+ return DECORATOR_COMPLETIONS
959
+ }
960
+
961
+ // ── Dot-access completion ──────────────────────────────────────────────────
962
+ const dotReceiver = getDotReceiver(lineText, charPos)
963
+ if (dotReceiver !== null) {
964
+ const items: CompletionItem[] = []
965
+
966
+ if (program) {
967
+ // Find which function body contains this line (by span)
968
+ const curLine = params.position.line + 1 // spans are 1-based
969
+ const encFn = findEnclosingFn(program, curLine)
970
+ const locals: Map<string, TypeNode> | null = encFn?.body
971
+ ? collectLocals(encFn.body as Block)
972
+ : null
973
+
974
+ // Determine type of receiver
975
+ const receiverType: TypeNode | undefined = locals?.get(dotReceiver)
976
+ ?? program.consts?.find(c => c.name === dotReceiver)?.type
977
+ ?? program.globals?.find(g => g.name === dotReceiver)?.type
978
+
979
+ if (receiverType) {
980
+ if (receiverType.kind === 'array') {
981
+ // int[] → push / pop / length
982
+ items.push(...ARRAY_METHOD_COMPLETIONS)
983
+ } else if (receiverType.kind === 'named' || receiverType.kind === 'struct') {
984
+ const typeName = (receiverType as { name: string }).name
985
+ // Struct fields
986
+ const structDecl = program.structs?.find(s => s.name === typeName)
987
+ if (structDecl) {
988
+ for (const f of structDecl.fields) {
989
+ items.push({
990
+ label: f.name,
991
+ kind: CompletionItemKind.Field,
992
+ detail: typeToString(f.type),
993
+ })
994
+ }
995
+ }
996
+ // Impl methods
997
+ const implBlock = program.implBlocks?.find(ib => ib.typeName === typeName)
998
+ if (implBlock) {
999
+ for (const m of implBlock.methods) {
1000
+ const params_ = m.params.map(p => `${p.name}: ${typeToString(p.type)}`).join(', ')
1001
+ items.push({
1002
+ label: m.name,
1003
+ kind: CompletionItemKind.Method,
1004
+ detail: `(${params_}): ${typeToString(m.returnType)}`,
1005
+ })
1006
+ }
1007
+ }
1008
+ }
1009
+ } else {
1010
+ // Unknown type — offer all struct fields + impl methods as fallback
1011
+ for (const ib of program.implBlocks ?? []) {
1012
+ for (const m of ib.methods) {
1013
+ items.push({ label: m.name, kind: CompletionItemKind.Method })
1014
+ }
1015
+ }
1016
+ items.push(...ARRAY_METHOD_COMPLETIONS)
1017
+ }
1018
+ }
1019
+
1020
+ return items
1021
+ }
1022
+
1023
+ // ── Global / normal completion ─────────────────────────────────────────────
434
1024
  const items: CompletionItem[] = [
435
1025
  ...KEYWORD_COMPLETIONS,
436
1026
  ...TYPE_COMPLETIONS,
@@ -438,12 +1028,8 @@ connection.onCompletion((params: TextDocumentPositionParams): CompletionItem[] =
438
1028
  ...DECORATOR_COMPLETIONS,
439
1029
  ]
440
1030
 
441
- if (!doc) return items
442
-
443
- // Add user-defined functions from the parsed doc
444
- const cached = parsedDocs.get(params.textDocument.uri)
445
- const program = cached?.program ?? null
446
1031
  if (program) {
1032
+ // User-defined top-level symbols
447
1033
  for (const fn of program.declarations) {
448
1034
  items.push({ label: fn.name, kind: CompletionItemKind.Function })
449
1035
  }
@@ -456,11 +1042,265 @@ connection.onCompletion((params: TextDocumentPositionParams): CompletionItem[] =
456
1042
  for (const c of program.consts ?? []) {
457
1043
  items.push({ label: c.name, kind: CompletionItemKind.Constant })
458
1044
  }
1045
+ for (const g of program.globals ?? []) {
1046
+ items.push({ label: g.name, kind: CompletionItemKind.Variable })
1047
+ }
1048
+
1049
+ // Locals from the enclosing function
1050
+ const curLine2 = params.position.line + 1
1051
+ const encFn2 = findEnclosingFn(program, curLine2)
1052
+ if (encFn2?.body) {
1053
+ for (const [name, typ] of collectLocals(encFn2.body as Block)) {
1054
+ items.push({
1055
+ label: name,
1056
+ kind: CompletionItemKind.Variable,
1057
+ detail: typeToString(typ),
1058
+ })
1059
+ }
1060
+ }
459
1061
  }
460
1062
 
1063
+ // ── Functions from imported files (both "path" and module::* forms) ────────
1064
+ try {
1065
+ const importedPrograms = getImportedPrograms(source, params.textDocument.uri)
1066
+ for (const { prog, filePath } of importedPrograms) {
1067
+ for (const fn of prog.declarations) {
1068
+ const paramList = fn.params.map(p => `${p.name}: ${typeToString(p.type)}`).join(', ')
1069
+ items.push({
1070
+ label: fn.name,
1071
+ kind: CompletionItemKind.Function,
1072
+ detail: `(${paramList}) → ${typeToString(fn.returnType ?? { kind: 'named', name: 'void' })}`,
1073
+ documentation: `from ${path.basename(filePath)}`,
1074
+ })
1075
+ }
1076
+ for (const s of prog.structs ?? []) {
1077
+ items.push({ label: s.name, kind: CompletionItemKind.Struct, documentation: `from ${path.basename(filePath)}` })
1078
+ }
1079
+ }
1080
+ } catch { /* ignore import completion errors */ }
1081
+
461
1082
  return items
462
1083
  })
463
1084
 
1085
+ // ---------------------------------------------------------------------------
1086
+ // Helpers for word-at-position (used by references and rename)
1087
+ // ---------------------------------------------------------------------------
1088
+
1089
+ function getWordRangeAtPosition(
1090
+ doc: import('vscode-languageserver-textdocument').TextDocument,
1091
+ position: Position,
1092
+ ): { start: Position; end: Position } | null {
1093
+ const text = doc.getText()
1094
+ const offset = doc.offsetAt(position)
1095
+ let start = offset
1096
+ let end = offset
1097
+ while (start > 0 && /[a-zA-Z0-9_]/.test(text[start - 1])) start--
1098
+ while (end < text.length && /[a-zA-Z0-9_]/.test(text[end])) end++
1099
+ if (start === end) return null
1100
+ return { start: doc.positionAt(start), end: doc.positionAt(end) }
1101
+ }
1102
+
1103
+ // ---------------------------------------------------------------------------
1104
+ // Signature Help
1105
+ // ---------------------------------------------------------------------------
1106
+
1107
+ connection.onSignatureHelp((params: SignatureHelpParams): SignatureHelp | null => {
1108
+ const doc = documents.get(params.textDocument.uri)
1109
+ if (!doc) return null
1110
+
1111
+ const parsed = parsedDocs.get(params.textDocument.uri)
1112
+ if (!parsed?.program) return null
1113
+
1114
+ const text = doc.getText()
1115
+ const offset = doc.offsetAt(params.position)
1116
+
1117
+ // Walk backwards to find the opening '(' and count active parameter
1118
+ let depth = 0
1119
+ let i = offset - 1
1120
+ let activeParam = 0
1121
+
1122
+ while (i >= 0) {
1123
+ const ch = text[i]
1124
+ if (ch === ')') depth++
1125
+ else if (ch === '(') {
1126
+ if (depth === 0) break
1127
+ depth--
1128
+ } else if (ch === ',' && depth === 0) activeParam++
1129
+ i--
1130
+ }
1131
+
1132
+ if (i < 0) return null
1133
+
1134
+ // Extract function name before '('
1135
+ let nameEnd = i - 1
1136
+ while (nameEnd >= 0 && /\s/.test(text[nameEnd])) nameEnd--
1137
+ let nameStart = nameEnd
1138
+ while (nameStart > 0 && /[a-zA-Z0-9_]/.test(text[nameStart - 1])) nameStart--
1139
+ const fnName = text.slice(nameStart, nameEnd + 1)
1140
+
1141
+ if (!fnName) return null
1142
+
1143
+ // Find function declaration in parsed program
1144
+ const fn = parsed.program.declarations.find(s => s.name === fnName)
1145
+
1146
+ // Also check builtins (BUILTIN_METADATA is a Record<string, BuiltinDef>)
1147
+ const builtin = ALL_BUILTINS[fnName]
1148
+
1149
+ if (!fn && !builtin) return null
1150
+
1151
+ let label: string
1152
+ let paramsList: string[]
1153
+
1154
+ if (fn) {
1155
+ paramsList = fn.params.map(p => `${p.name}: ${typeToString(p.type)}`)
1156
+ label = `fn ${fn.name}(${paramsList.join(', ')}): ${typeToString(fn.returnType)}`
1157
+ } else {
1158
+ paramsList = builtin.params?.map(p => `${p.name}: ${p.type}`) ?? []
1159
+ label = `${builtin.name}(${paramsList.join(', ')}): ${builtin.returns ?? 'void'}`
1160
+ }
1161
+
1162
+ const paramInfos: ParameterInformation[] = paramsList.map(p => ({ label: p }))
1163
+
1164
+ return {
1165
+ signatures: [
1166
+ {
1167
+ label,
1168
+ parameters: paramInfos,
1169
+ activeParameter: Math.min(activeParam, Math.max(0, paramInfos.length - 1)),
1170
+ } as SignatureInformation,
1171
+ ],
1172
+ activeSignature: 0,
1173
+ activeParameter: Math.min(activeParam, Math.max(0, paramInfos.length - 1)),
1174
+ }
1175
+ })
1176
+
1177
+ // ---------------------------------------------------------------------------
1178
+ // Inlay Hints
1179
+ // ---------------------------------------------------------------------------
1180
+
1181
+ connection.onRequest(
1182
+ 'textDocument/inlayHint',
1183
+ (params: { textDocument: { uri: string }; range: unknown }): InlayHint[] => {
1184
+ const parsed = parsedDocs.get(params.textDocument.uri)
1185
+ if (!parsed?.program) return []
1186
+ const doc = documents.get(params.textDocument.uri)
1187
+ if (!doc) return []
1188
+
1189
+ const hints: InlayHint[] = []
1190
+
1191
+ // Walk all let declarations with no explicit type annotation and emit inlay hints.
1192
+ // Since TypeChecker doesn't attach inferredType to AST nodes, we use collectLocals
1193
+ // which already infers types from init expressions.
1194
+ function walkBlock(stmts: import('../ast/types').Stmt[]): void {
1195
+ // Build a locals map for this block (includes inferred types)
1196
+ const locals = collectLocals(stmts as import('../ast/types').Block)
1197
+
1198
+ for (const stmt of stmts) {
1199
+ if (stmt.kind === 'let' && !stmt.type) {
1200
+ // No explicit type annotation — show inferred type as inlay hint
1201
+ const inferredType = locals.get(stmt.name)
1202
+ if (!inferredType) continue
1203
+ const spanVal = (stmt as { span?: { line: number; col: number } }).span
1204
+ if (!spanVal) continue
1205
+ // Position hint after the variable name: line is 1-based in span, col is 1-based
1206
+ const line = Math.max(0, spanVal.line - 1)
1207
+ // Find the position after the variable name on that line
1208
+ const lineText = source.split('\n')[line] ?? ''
1209
+ const nameEnd = lineText.indexOf(stmt.name) + stmt.name.length
1210
+ hints.push({
1211
+ position: { line, character: nameEnd },
1212
+ label: `: ${typeToString(inferredType)}`,
1213
+ kind: InlayHintKind.Type,
1214
+ paddingLeft: false,
1215
+ })
1216
+ }
1217
+ // Recurse into nested blocks
1218
+ if (stmt.kind === 'if' || stmt.kind === 'while' || stmt.kind === 'for') {
1219
+ const s = stmt as Record<string, unknown>
1220
+ const then_ = s['then'] as import('../ast/types').Stmt[] | undefined
1221
+ if (Array.isArray(then_)) walkBlock(then_)
1222
+ const else_ = s['else_'] as import('../ast/types').Stmt[] | undefined
1223
+ if (Array.isArray(else_)) walkBlock(else_)
1224
+ const body = s['body'] as import('../ast/types').Stmt[] | undefined
1225
+ if (Array.isArray(body)) walkBlock(body)
1226
+ }
1227
+ if (stmt.kind === 'foreach') {
1228
+ const s = stmt as Record<string, unknown>
1229
+ const body = s['body'] as import('../ast/types').Stmt[] | undefined
1230
+ if (Array.isArray(body)) walkBlock(body)
1231
+ }
1232
+ }
1233
+ }
1234
+
1235
+ const source = doc.getText()
1236
+ parsed.program.declarations.forEach(top => {
1237
+ if (top.body) walkBlock(top.body as import('../ast/types').Stmt[])
1238
+ })
1239
+
1240
+ return hints
1241
+ },
1242
+ )
1243
+
1244
+ // ---------------------------------------------------------------------------
1245
+ // Find References
1246
+ // ---------------------------------------------------------------------------
1247
+
1248
+ connection.onReferences((params: ReferenceParams): Location[] => {
1249
+ const doc = documents.get(params.textDocument.uri)
1250
+ if (!doc) return []
1251
+
1252
+ const parsed = parsedDocs.get(params.textDocument.uri)
1253
+ if (!parsed?.program) return []
1254
+
1255
+ const wordRange = getWordRangeAtPosition(doc, params.position)
1256
+ if (!wordRange) return []
1257
+ const word = doc.getText(wordRange)
1258
+ if (!word) return []
1259
+
1260
+ const text = doc.getText()
1261
+ const locations: Location[] = []
1262
+ const regex = new RegExp(`\\b${word}\\b`, 'g')
1263
+ let match: RegExpExecArray | null
1264
+
1265
+ while ((match = regex.exec(text)) !== null) {
1266
+ const start = doc.positionAt(match.index)
1267
+ const end = doc.positionAt(match.index + word.length)
1268
+ locations.push({
1269
+ uri: params.textDocument.uri,
1270
+ range: { start, end },
1271
+ })
1272
+ }
1273
+
1274
+ return locations
1275
+ })
1276
+
1277
+ // ---------------------------------------------------------------------------
1278
+ // Rename Symbol
1279
+ // ---------------------------------------------------------------------------
1280
+
1281
+ connection.onRenameRequest((params: RenameParams): WorkspaceEdit | null => {
1282
+ const doc = documents.get(params.textDocument.uri)
1283
+ if (!doc) return null
1284
+
1285
+ const wordRange = getWordRangeAtPosition(doc, params.position)
1286
+ if (!wordRange) return null
1287
+ const word = doc.getText(wordRange)
1288
+ if (!word) return null
1289
+
1290
+ const text = doc.getText()
1291
+ const edits: import('vscode-languageserver/node').TextEdit[] = []
1292
+ const regex = new RegExp(`\\b${word}\\b`, 'g')
1293
+ let match: RegExpExecArray | null
1294
+
1295
+ while ((match = regex.exec(text)) !== null) {
1296
+ const start = doc.positionAt(match.index)
1297
+ const end = doc.positionAt(match.index + word.length)
1298
+ edits.push({ range: { start, end }, newText: params.newName })
1299
+ }
1300
+
1301
+ return { changes: { [params.textDocument.uri]: edits } }
1302
+ })
1303
+
464
1304
  // ---------------------------------------------------------------------------
465
1305
  // Start
466
1306
  // ---------------------------------------------------------------------------