minecraft-datapack-language 15.4.41__tar.gz → 15.4.42__tar.gz
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.
- {minecraft_datapack_language-15.4.41/minecraft_datapack_language.egg-info → minecraft_datapack_language-15.4.42}/PKG-INFO +1 -1
- minecraft_datapack_language-15.4.42/docs/_data/version.yml +3 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_docs/examples.md +26 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_docs/language-reference.md +14 -0
- minecraft_datapack_language-15.4.42/examples/macros_example.mdl +20 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language/_version.py +3 -3
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language/ast_nodes.py +9 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language/mdl_compiler.py +13 -4
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language/mdl_lexer.py +36 -8
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language/mdl_parser.py +36 -4
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42/minecraft_datapack_language.egg-info}/PKG-INFO +1 -1
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language.egg-info/SOURCES.txt +3 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tests/test_cli.py +3 -0
- minecraft_datapack_language-15.4.42/tests/test_examples.py +43 -0
- minecraft_datapack_language-15.4.42/tests/test_macros.py +58 -0
- minecraft_datapack_language-15.4.41/docs/_data/version.yml +0 -3
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.cursor/rules/aispec.mdc +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.github/actions/mdl-compile/action.yml +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.github/workflows/ci.yml +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.github/workflows/docs.yml +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.github/workflows/pypi.yml +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.github/workflows/release.yml +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.github/workflows/update-website-version.yml +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.gitignore +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1/data/minecraft/tags/function/load.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1/data/test1/function/load.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1/data/test1/function/load1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1/data/test1/function/main.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1/data/test1/function/main__else_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1/data/test1/function/main__if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1/data/test1/function/testfunc.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1/data/test1/function/testfunc__while_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1/pack.mcmeta +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1-confirm/data/minecraft/tags/function/load.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1-confirm/data/test1/function/load.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1-confirm/data/test1/function/load1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1-confirm/data/test1/function/main.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1-confirm/data/test1/function/main__else_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1-confirm/data/test1/function/main__if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1-confirm/data/test1/function/testfunc.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1-confirm/data/test1/function/testfunc__while_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.mdl-out-test1-confirm/pack.mcmeta +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/COMPILER_FIXES_SUMMARY.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/CONDITIONALS_IMPLEMENTATION.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/LICENSE +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/Makefile +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/README.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/advancements/diamond_sword.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/advancements/first_spell.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/advancements/other_advancement.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/advancements/test_advancement.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/comprehensive_error_test.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/complex_scopes/function/main_else_8.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/complex_scopes/function/main_if_8.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_basic_if_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_basic_if_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_basic_if_if_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_complex_if_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_complex_if_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_complex_if_if_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_complex_if_if_5.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_control_complex_expressions_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_control_complex_expressions_if_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_control_variable_substitution_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_control_with_raw_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_control_with_scopes_if_5.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_control_with_tellraw_else_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_control_with_tellraw_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_control_with_tellraw_if_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_if_else_else_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_if_else_else_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_if_else_else_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_if_else_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_if_else_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_if_else_if_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_nested_if_else_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_nested_if_else_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_nested_if_else_3_else_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_nested_if_else_3_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_nested_if_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_nested_if_if_2_else_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_nested_if_if_2_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_nested_if_if_2_if_0_else_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_nested_if_if_2_if_0_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_nested_if_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_nested_if_if_3_else_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/comprehensive_control_test/function/test_nested_if_if_3_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/control_test/function/main_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/control_test/function/main_while_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/control_test/function/main_while_body_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/if_test/function/main_else_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/if_test/function/main_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/conditional_demo_else_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/conditional_demo_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/conditional_demo_if_3_else_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/conditional_demo_if_3_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/conditional_demo_if_3_if_0_else_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/conditional_demo_if_3_if_0_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/countdown_while_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/countdown_while_body_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/increase_tick_per_player_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/increase_tick_per_player_if_1_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/loop_demo_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/loop_demo_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/loop_demo_while_body_2_else_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/loop_demo_while_body_2_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/loop_demo_while_body_2_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_else_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_else_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_else_5.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_if_5.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_while_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_while_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_while_6.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_while_7.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_while_body_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_while_body_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_while_body_6.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/main_while_body_7.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/scoreboard_demo_while_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/scoreboard_demo_while_body_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/scoreboard_demo_while_body_3_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/start_game_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/start_game_if_5.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/start_game_while_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/start_game_while_body_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_basic_if_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_basic_if_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_basic_if_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_basic_while_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_basic_while_while_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_basic_while_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_basic_while_while_body_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_if_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_if_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_if_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_if_if_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_nested_control_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_nested_control_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_nested_control_while_body_2_else_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_nested_control_while_body_2_else_1_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_nested_control_while_body_2_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_nested_control_while_body_2_if_1_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_nested_control_while_body_2_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_scope_scenarios_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_scope_scenarios_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_scope_scenarios_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_scope_scenarios_if_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_while_while_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_while_while_6.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_while_while_body_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_complex_while_while_body_6.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_complex_expressions_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_complex_expressions_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_complex_expressions_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_complex_expressions_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_error_handling_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_error_handling_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_error_handling_while_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_error_handling_while_body_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_performance_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_performance_while_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_performance_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_performance_while_body_2_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_performance_while_body_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_performance_while_body_4_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_performance_while_body_4_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_scoped_functions_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_scoped_functions_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_scoped_functions_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_scoped_functions_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_variable_substitution_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_variable_substitution_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_variable_substitution_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_variable_substitution_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_assignments_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_assignments_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_assignments_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_assignments_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_functions_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_functions_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_functions_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_functions_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_raw_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_raw_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_raw_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_scopes_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_scopes_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_scopes_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_scopes_if_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_tellraw_else_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_tellraw_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_tellraw_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_tellraw_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_control_with_tellraw_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_if_else_else_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_if_else_else_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_if_else_else_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_if_else_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_if_else_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_if_else_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_main_while_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_main_while_body_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_nested_if_else_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_nested_if_else_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_nested_if_else_2_else_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_nested_if_else_2_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_nested_if_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_nested_if_if_1_else_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_nested_if_if_1_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_nested_if_if_1_if_0_else_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_nested_if_if_1_if_0_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_nested_if_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_nested_if_if_2_else_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_nested_if_if_2_if_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_scope_conditionals_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_scope_conditionals_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_scope_conditionals_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_scope_conditionals_while_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_scope_conditionals_while_5.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_scope_conditionals_while_body_4.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_scope_conditionals_while_body_5.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_scope_interactions_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_scope_interactions_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_scope_interactions_if_3.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_while_break_while_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_while_break_while_body_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_while_break_while_body_2_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/test_while_break_while_body_2_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/tick_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/tick_if_2.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/tick_if_2_while_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/tick_if_2_while_body_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/weapon_effects_else_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test/function/weapon_effects_if_1.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test_final_template_fixed/function/main_else_8.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/test_final_template_fixed/function/main_if_8.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/while_test/function/main_while_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/data/while_test/function/main_while_body_0.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/dist.zip +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/.env +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/404.html +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/Gemfile +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/README.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_config.yml +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_docs/cli-reference.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_docs/contributing.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_docs/docs-hub.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_docs/documentation.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_docs/getting-started.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_docs/multi-file-projects.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_docs/python-bindings.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_docs/vscode-extension.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_includes/head-custom.html +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_includes/navigation.html +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_layouts/default.html +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_layouts/page.html +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_plugins/test_version.rb +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_plugins/version_reader.rb +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/assets/css/style.css +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/docs.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/downloads.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/icons/favicon-16.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/icons/favicon-32.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/icons/favicon-48.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/icons/favicon-64.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/icons/icon-1024.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/icons/icon-128.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/icons/icon-256.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/icons/icon-512.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/icons/icon-64.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/index.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/examples/hello_world.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/examples/scope_examples.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/examples/simple_counter.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/icons/favicon-16.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/icons/favicon-32.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/icons/favicon-48.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/icons/favicon-64.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/icons/icon-1024.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/icons/icon-128.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/icons/icon-256.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/icons/icon-512.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/icons/icon-64.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/item_modifiers/diamond_sword.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/item_modifiers/enchant_tool.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/item_modifiers/test_item_modifier.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/loot_tables/diamond_sword.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/loot_tables/epic_loot.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/loot_tables/main_loot.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/loot_tables/test_loot.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/mdllocal.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language/__init__.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language/cli.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language/dir_map.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language/mdl_errors.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language/mdl_linter.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language/python_api.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language/utils.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language.egg-info/dependency_links.txt +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language.egg-info/entry_points.txt +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language.egg-info/requires.txt +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/minecraft_datapack_language.egg-info/top_level.txt +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/multi_scope_example.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/my_awesome_pack/README.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/my_awesome_pack/minecraft_datapack_language.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/predicates/diamond_sword.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/predicates/has_mana.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/predicates/other_predicate.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/predicates/test_predicate.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/pyproject.toml +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/pytest.ini +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/recipes/custom_pickaxe.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/recipes/diamond_sword.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/recipes/first.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/recipes/inlet.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/recipes/main_recipe.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/recipes/outlet.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/recipes/pipe.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/recipes/second.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/recipes/test_recipe.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/recipes/wrench.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scope_demo.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scoreboard_test.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/UpdateMDL.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/bootstrap.ps1 +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/bootstrap.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/build_pkg.ps1 +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/build_pkg.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/dev_build.ps1 +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/dev_build.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/dev_setup.ps1 +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/dev_setup.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/git-bash/bootstrap-gitbash.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/git-bash/build_pkg-gitbash.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/git-bash/test_cli-gitbash.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/release.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/test_cli.ps1 +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/test_cli.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/test_dev.ps1 +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/test_dev.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/update_docs.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/scripts/update_version_info.sh +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/setup.cfg +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/structures/diamond_sword.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/structures/test_structure.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/structures/workshop.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tellraw_variables_test.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/temp_output/data/minecraft/tags/function/load.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/temp_output/data/test/function/helper.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/temp_output/data/test/function/load.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/temp_output/data/test/function/main.mcfunction +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/temp_output/pack.mcmeta +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/test_all_registry.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/test_complex_scenarios.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/test_comprehensive_fixes.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/test_if_else_while.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/test_project/complex_test.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/test_simple.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tests/__init__.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tests/run_all_tests.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tests/test_codegen_naming_and_logic.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tests/test_compiler_fixes.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tests/test_complex_scenarios.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tests/test_comprehensive_end_to_end.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tests/test_python_api.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tests/test_python_bindings.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tests/test_user_regression_test1.py +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tmp_local_cli_out.zip +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tmp_test1.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tmp_test1.mdl~ +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tmp_test1_confirm.mdl +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/README.md +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/icons/favicon-16.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/icons/favicon-32.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/icons/favicon-48.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/icons/favicon-64.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/icons/icon-1024.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/icons/icon-128.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/icons/icon-256.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/icons/icon-512.png +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/language-configuration.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/package-lock.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/package.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/snippets/mdl.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/src/extension.ts +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/syntaxes/mdl.tmLanguage.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/themes/mdl-color-theme.json +0 -0
- {minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/vscode-extension/tsconfig.json +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: minecraft-datapack-language
|
3
|
-
Version: 15.4.
|
3
|
+
Version: 15.4.42
|
4
4
|
Summary: Compile MDL language with explicit scoping into a Minecraft datapack (1.21+ ready). Features variables, control flow, error handling, and VS Code extension.
|
5
5
|
Project-URL: Homepage, https://www.mcmdl.com
|
6
6
|
Project-URL: Documentation, https://www.mcmdl.com/docs
|
{minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/docs/_docs/examples.md
RENAMED
@@ -86,6 +86,32 @@ function raw:custom {
|
|
86
86
|
on_load raw:custom;
|
87
87
|
```
|
88
88
|
|
89
|
+
## Function Macros
|
90
|
+
|
91
|
+
Demonstrates macro lines and passing macro data to functions:
|
92
|
+
|
93
|
+
```mdl
|
94
|
+
pack "macros" "Function macro examples" 82;
|
95
|
+
namespace "macros";
|
96
|
+
|
97
|
+
// Target function using a macro line with $(name)
|
98
|
+
function macros:greeter {
|
99
|
+
$say "Hello $(name)"
|
100
|
+
say "Done";
|
101
|
+
}
|
102
|
+
|
103
|
+
// Callers using inline JSON and with-clause
|
104
|
+
function macros:callers {
|
105
|
+
// Inline JSON compound (prefer single quotes outside)
|
106
|
+
exec macros:greeter '{name:"Alex"}';
|
107
|
+
|
108
|
+
// Pull compound from a data source via with-clause
|
109
|
+
exec macros:greeter with storage macros:ctx player.info;
|
110
|
+
}
|
111
|
+
|
112
|
+
on_load macros:callers;
|
113
|
+
```
|
114
|
+
|
89
115
|
## Complete Game Example
|
90
116
|
|
91
117
|
A complete game with scoring, levels, and timers:
|
@@ -131,6 +131,12 @@ exec game:start_game; // Execute any function
|
|
131
131
|
exec utils:calculator; // Execute from different namespace
|
132
132
|
exec game:reset_player<@s>; // Execute function with scope
|
133
133
|
exec game:reset_player<@a>; // Execute function with different scope
|
134
|
+
|
135
|
+
// Function Macros (Minecraft snapshot): pass macro arguments
|
136
|
+
// Inline JSON compound as a single-quoted string to minimize escapes
|
137
|
+
exec game:spawn_mob '{id:"minecraft:cow",name:"Betsy"}';
|
138
|
+
// With-clause to pull a compound from a data source
|
139
|
+
exec game:spawn_mob with storage mymod:ctx path.to.compound;
|
134
140
|
```
|
135
141
|
|
136
142
|
### Control Structures
|
@@ -200,6 +206,14 @@ execute as @a[team=blue] at @s run playsound minecraft:entity.player.levelup pla
|
|
200
206
|
raw!$
|
201
207
|
```
|
202
208
|
|
209
|
+
### Macro Lines
|
210
|
+
```mdl
|
211
|
+
// Lines starting with $ are emitted as-is into the generated .mcfunction and
|
212
|
+
// can contain $(variable) placeholders that Minecraft will substitute when the
|
213
|
+
// function is called with a macro compound.
|
214
|
+
$summon minecraft:cow ~ ~ ~ {CustomName:'{"text":"$(name)"}'}
|
215
|
+
```
|
216
|
+
|
203
217
|
**Important:** Raw blocks are completely ignored by the MDL parser. They get copied directly to the output `.mcfunction` files without any processing. This means you can use any valid Minecraft command syntax inside raw blocks.
|
204
218
|
|
205
219
|
## Scope System
|
@@ -0,0 +1,20 @@
|
|
1
|
+
// MDL Macros Example - macro lines and exec macro arguments
|
2
|
+
pack "macros_example" "Function macro demo" 82;
|
3
|
+
namespace "macros_ex";
|
4
|
+
|
5
|
+
function macros_ex:greeter {
|
6
|
+
$say "Hello $(name)"
|
7
|
+
say "Greeting complete.";
|
8
|
+
}
|
9
|
+
|
10
|
+
function macros_ex:runner {
|
11
|
+
// Inline JSON compound (prefer single quotes around the JSON)
|
12
|
+
exec macros_ex:greeter '{name:"Casey"}';
|
13
|
+
|
14
|
+
// With-clause using a storage data source
|
15
|
+
exec macros_ex:greeter with storage macros_ex:ctx player.profile;
|
16
|
+
}
|
17
|
+
|
18
|
+
on_load macros_ex:runner;
|
19
|
+
|
20
|
+
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
28
28
|
commit_id: COMMIT_ID
|
29
29
|
__commit_id__: COMMIT_ID
|
30
30
|
|
31
|
-
__version__ = version = '15.4.
|
32
|
-
__version_tuple__ = version_tuple = (15, 4,
|
31
|
+
__version__ = version = '15.4.42'
|
32
|
+
__version_tuple__ = version_tuple = (15, 4, 42)
|
33
33
|
|
34
|
-
__commit_id__ = commit_id = '
|
34
|
+
__commit_id__ = commit_id = 'g00d85a082'
|
@@ -74,6 +74,9 @@ class FunctionCall(ASTNode):
|
|
74
74
|
namespace: str
|
75
75
|
name: str
|
76
76
|
scope: Optional[str] # Optional scope for the function call
|
77
|
+
# Macro invocation support (Minecraft function macros)
|
78
|
+
macro_json: Optional[str] = None # Inline compound JSON string (including braces)
|
79
|
+
with_clause: Optional[str] = None # Raw "with <data source> [path]" clause (without leading 'with')
|
77
80
|
|
78
81
|
|
79
82
|
@dataclass
|
@@ -132,6 +135,12 @@ class ScoreboardCommand(ASTNode):
|
|
132
135
|
command: str
|
133
136
|
|
134
137
|
|
138
|
+
@dataclass
|
139
|
+
class MacroLine(ASTNode):
|
140
|
+
"""A raw macro line for mcfunction starting with '$' and containing $(vars)."""
|
141
|
+
content: str
|
142
|
+
|
143
|
+
|
135
144
|
# Expression nodes
|
136
145
|
@dataclass
|
137
146
|
class BinaryExpression(ASTNode):
|
@@ -11,7 +11,7 @@ from typing import Dict, List, Any, Optional
|
|
11
11
|
from .ast_nodes import (
|
12
12
|
Program, PackDeclaration, NamespaceDeclaration, TagDeclaration,
|
13
13
|
VariableDeclaration, VariableAssignment, VariableSubstitution, FunctionDeclaration,
|
14
|
-
FunctionCall, IfStatement, WhileLoop, HookDeclaration, RawBlock,
|
14
|
+
FunctionCall, IfStatement, WhileLoop, HookDeclaration, RawBlock, MacroLine,
|
15
15
|
SayCommand, BinaryExpression, LiteralExpression, ParenthesizedExpression
|
16
16
|
)
|
17
17
|
from .dir_map import get_dir_map, DirMap
|
@@ -325,6 +325,8 @@ class MDLCompiler:
|
|
325
325
|
return self._say_command_to_command(statement)
|
326
326
|
elif isinstance(statement, RawBlock):
|
327
327
|
return statement.content
|
328
|
+
elif isinstance(statement, MacroLine):
|
329
|
+
return statement.content
|
328
330
|
elif isinstance(statement, IfStatement):
|
329
331
|
return self._if_statement_to_command(statement)
|
330
332
|
elif isinstance(statement, WhileLoop):
|
@@ -616,10 +618,17 @@ class MDLCompiler:
|
|
616
618
|
|
617
619
|
def _function_call_to_command(self, func_call: FunctionCall) -> str:
|
618
620
|
"""Convert function call to execute command."""
|
621
|
+
# Build base function invocation, possibly with macro args
|
622
|
+
suffix = ""
|
623
|
+
if func_call.macro_json:
|
624
|
+
suffix = f" {func_call.macro_json}"
|
625
|
+
elif func_call.with_clause:
|
626
|
+
suffix = f" with {func_call.with_clause}"
|
627
|
+
|
628
|
+
base = f"function {func_call.namespace}:{func_call.name}{suffix}"
|
619
629
|
if func_call.scope:
|
620
|
-
return f"execute as {func_call.scope.strip('<>')} run
|
621
|
-
|
622
|
-
return f"function {func_call.namespace}:{func_call.name}"
|
630
|
+
return f"execute as {func_call.scope.strip('<>')} run {base}"
|
631
|
+
return base
|
623
632
|
|
624
633
|
def _expression_to_value(self, expression: Any) -> str:
|
625
634
|
"""Convert expression to a value string."""
|
@@ -79,6 +79,7 @@ class TokenType:
|
|
79
79
|
QUOTE = "QUOTE" # " (string literal delimiter)
|
80
80
|
EXCLAMATION = "EXCLAMATION" # ! (for raw blocks)
|
81
81
|
RANGE = "RANGE" # .. (range operator)
|
82
|
+
DOT = "DOT" # . (for paths in with-clause)
|
82
83
|
|
83
84
|
# Literals
|
84
85
|
IDENTIFIER = "IDENTIFIER" # Variable names, function names, etc.
|
@@ -89,6 +90,7 @@ class TokenType:
|
|
89
90
|
EOF = "EOF"
|
90
91
|
COMMENT = "COMMENT" # Comments (ignored during parsing)
|
91
92
|
RAW_CONTENT = "RAW_CONTENT" # Raw content inside raw blocks
|
93
|
+
MACRO_LINE = "MACRO_LINE" # Entire macro line starting with '$' at line-begin
|
92
94
|
|
93
95
|
|
94
96
|
class MDLLexer:
|
@@ -167,9 +169,9 @@ class MDLLexer:
|
|
167
169
|
self._scan_multi_line_comment()
|
168
170
|
return
|
169
171
|
|
170
|
-
# Handle strings (quotes)
|
171
|
-
if char == '"':
|
172
|
-
self._scan_string()
|
172
|
+
# Handle strings (quotes) - support both ' and "
|
173
|
+
if char == '"' or char == "'":
|
174
|
+
self._scan_string(quote_char=char)
|
173
175
|
return
|
174
176
|
|
175
177
|
# Handle raw block markers
|
@@ -180,6 +182,11 @@ class MDLLexer:
|
|
180
182
|
|
181
183
|
|
182
184
|
|
185
|
+
# Handle macro line: '$' as first non-space on the line (not $!raw)
|
186
|
+
if char == '$' and self._is_line_start_nonspace():
|
187
|
+
self._scan_macro_line()
|
188
|
+
return
|
189
|
+
|
183
190
|
# Handle variable substitution
|
184
191
|
if char == '$':
|
185
192
|
self._scan_variable_substitution()
|
@@ -264,7 +271,7 @@ class MDLLexer:
|
|
264
271
|
# Unterminated comment
|
265
272
|
self._error("Unterminated multi-line comment", "Add */ to close the comment")
|
266
273
|
|
267
|
-
def _scan_string(self):
|
274
|
+
def _scan_string(self, quote_char='"'):
|
268
275
|
"""Scan a string literal (quoted text)."""
|
269
276
|
# Skip opening quote
|
270
277
|
self.current += 1
|
@@ -275,7 +282,7 @@ class MDLLexer:
|
|
275
282
|
|
276
283
|
# Scan until closing quote
|
277
284
|
while (self.current < len(self.source) and
|
278
|
-
self.source[self.current] !=
|
285
|
+
self.source[self.current] != quote_char):
|
279
286
|
if self.source[self.current] == '\n':
|
280
287
|
self._error("Unterminated string literal", "Add a closing quote")
|
281
288
|
|
@@ -295,14 +302,34 @@ class MDLLexer:
|
|
295
302
|
self.column += 1
|
296
303
|
|
297
304
|
# Generate QUOTE token for the opening quote
|
298
|
-
self.tokens.append(Token(TokenType.QUOTE,
|
305
|
+
self.tokens.append(Token(TokenType.QUOTE, quote_char, start_line, start_column))
|
299
306
|
|
300
307
|
# Generate IDENTIFIER token for the string content
|
301
308
|
string_content = self.source[self.start + 1:self.current - 1]
|
302
309
|
self.tokens.append(Token(TokenType.IDENTIFIER, string_content, start_line, start_column + 1))
|
303
310
|
|
304
311
|
# Generate QUOTE token for the closing quote
|
305
|
-
self.tokens.append(Token(TokenType.QUOTE,
|
312
|
+
self.tokens.append(Token(TokenType.QUOTE, quote_char, self.line, self.column - 1))
|
313
|
+
|
314
|
+
def _is_line_start_nonspace(self) -> bool:
|
315
|
+
"""Return True if current position is at the first non-space character in the line."""
|
316
|
+
# Find beginning of current line
|
317
|
+
idx = self.current - 1
|
318
|
+
while idx >= 0 and self.source[idx] != '\n':
|
319
|
+
if not self.source[idx].isspace():
|
320
|
+
return False
|
321
|
+
idx -= 1
|
322
|
+
return True
|
323
|
+
|
324
|
+
def _scan_macro_line(self):
|
325
|
+
"""Scan a full macro line starting with '$' as first non-space char."""
|
326
|
+
# Capture from current to end of line (excluding trailing newline)
|
327
|
+
line_start = self.current
|
328
|
+
while self.current < len(self.source) and self.source[self.current] != '\n':
|
329
|
+
self.current += 1
|
330
|
+
self.column += 1
|
331
|
+
content = self.source[line_start:self.current]
|
332
|
+
self.tokens.append(Token(TokenType.MACRO_LINE, content, self.line, 1))
|
306
333
|
|
307
334
|
def _scan_raw_block_start(self):
|
308
335
|
"""Scan the start of a raw block ($!raw)."""
|
@@ -548,7 +575,8 @@ class MDLLexer:
|
|
548
575
|
'{': TokenType.LBRACE,
|
549
576
|
'}': TokenType.RBRACE,
|
550
577
|
'[': TokenType.LBRACKET,
|
551
|
-
']': TokenType.RBRACKET
|
578
|
+
']': TokenType.RBRACKET,
|
579
|
+
'.': TokenType.DOT
|
552
580
|
}
|
553
581
|
|
554
582
|
if char in token_map:
|
@@ -9,7 +9,7 @@ from .mdl_errors import MDLParserError
|
|
9
9
|
from .ast_nodes import (
|
10
10
|
ASTNode, Program, PackDeclaration, NamespaceDeclaration, TagDeclaration,
|
11
11
|
VariableDeclaration, VariableAssignment, VariableSubstitution, FunctionDeclaration,
|
12
|
-
FunctionCall, IfStatement, WhileLoop, HookDeclaration, RawBlock,
|
12
|
+
FunctionCall, IfStatement, WhileLoop, HookDeclaration, RawBlock, MacroLine,
|
13
13
|
SayCommand, TellrawCommand, ExecuteCommand, ScoreboardCommand,
|
14
14
|
BinaryExpression, UnaryExpression, ParenthesizedExpression, LiteralExpression,
|
15
15
|
ScopeSelector
|
@@ -257,7 +257,7 @@ class MDLParser:
|
|
257
257
|
)
|
258
258
|
|
259
259
|
def _parse_function_call(self) -> FunctionCall:
|
260
|
-
"""Parse function call: exec namespace:name<scope
|
260
|
+
"""Parse function call: exec namespace:name<scope>? [ '{json}' | with <data source> [path] ] ;"""
|
261
261
|
self._expect(TokenType.EXEC, "Expected 'exec' keyword")
|
262
262
|
|
263
263
|
# Parse namespace:name
|
@@ -269,13 +269,41 @@ class MDLParser:
|
|
269
269
|
scope = None
|
270
270
|
if self._peek().type == TokenType.LANGLE:
|
271
271
|
scope = self._parse_scope_selector()
|
272
|
-
|
272
|
+
|
273
|
+
# Optional macro arguments (inline JSON in a quoted string)
|
274
|
+
macro_json = None
|
275
|
+
with_clause = None
|
276
|
+
if self._peek().type == TokenType.QUOTE:
|
277
|
+
self._advance() # opening quote
|
278
|
+
if self._peek().type == TokenType.IDENTIFIER:
|
279
|
+
macro_json = self._peek().value
|
280
|
+
self._advance()
|
281
|
+
self._expect(TokenType.QUOTE, "Expected closing quote for macro JSON")
|
282
|
+
elif self._peek().type == TokenType.IDENTIFIER and self._peek().value == 'with':
|
283
|
+
# Capture everything after 'with' up to the semicolon as raw clause
|
284
|
+
self._advance() # consume 'with'
|
285
|
+
# Expect a data source spec like: storage <identifier> <path-with-dots>
|
286
|
+
# Accumulate tokens until semicolon, inserting spaces only between identifiers/numbers
|
287
|
+
built: List[str] = []
|
288
|
+
prev_type = None
|
289
|
+
while not self._is_at_end() and self._peek().type != TokenType.SEMICOLON:
|
290
|
+
t = self._advance()
|
291
|
+
# Insert a space between adjacent identifiers/numbers
|
292
|
+
if built and (prev_type in (TokenType.IDENTIFIER, TokenType.NUMBER, TokenType.RBRACE, TokenType.RBRACKET)
|
293
|
+
and t.type in (TokenType.IDENTIFIER, TokenType.NUMBER)):
|
294
|
+
built.append(" ")
|
295
|
+
built.append(t.value)
|
296
|
+
prev_type = t.type
|
297
|
+
with_clause = "".join(built).strip()
|
298
|
+
|
273
299
|
self._expect(TokenType.SEMICOLON, "Expected semicolon after function call")
|
274
300
|
|
275
301
|
return FunctionCall(
|
276
302
|
namespace=namespace,
|
277
303
|
name=name,
|
278
|
-
scope=scope
|
304
|
+
scope=scope,
|
305
|
+
macro_json=macro_json,
|
306
|
+
with_clause=with_clause
|
279
307
|
)
|
280
308
|
|
281
309
|
def _parse_if_statement(self) -> IfStatement:
|
@@ -498,6 +526,10 @@ class MDLParser:
|
|
498
526
|
statements.append(self._parse_while_loop())
|
499
527
|
elif self._peek().type == TokenType.EXEC:
|
500
528
|
statements.append(self._parse_function_call())
|
529
|
+
elif self._peek().type == TokenType.MACRO_LINE:
|
530
|
+
# Preserve macro line exactly as-is
|
531
|
+
statements.append(MacroLine(content=self._peek().value))
|
532
|
+
self._advance()
|
501
533
|
elif self._peek().type == TokenType.DOLLAR and self._peek(1).type == TokenType.EXCLAMATION:
|
502
534
|
statements.append(self._parse_raw_block())
|
503
535
|
elif self._peek().type == TokenType.IDENTIFIER:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: minecraft-datapack-language
|
3
|
-
Version: 15.4.
|
3
|
+
Version: 15.4.42
|
4
4
|
Summary: Compile MDL language with explicit scoping into a Minecraft datapack (1.21+ ready). Features variables, control flow, error handling, and VS Code extension.
|
5
5
|
Project-URL: Homepage, https://www.mcmdl.com
|
6
6
|
Project-URL: Documentation, https://www.mcmdl.com/docs
|
@@ -290,6 +290,7 @@ docs/icons/icon-256.png
|
|
290
290
|
docs/icons/icon-512.png
|
291
291
|
docs/icons/icon-64.png
|
292
292
|
examples/hello_world.mdl
|
293
|
+
examples/macros_example.mdl
|
293
294
|
examples/scope_examples.mdl
|
294
295
|
examples/simple_counter.mdl
|
295
296
|
icons/favicon-16.png
|
@@ -376,6 +377,8 @@ tests/test_codegen_naming_and_logic.py
|
|
376
377
|
tests/test_compiler_fixes.py
|
377
378
|
tests/test_complex_scenarios.py
|
378
379
|
tests/test_comprehensive_end_to_end.py
|
380
|
+
tests/test_examples.py
|
381
|
+
tests/test_macros.py
|
379
382
|
tests/test_python_api.py
|
380
383
|
tests/test_python_bindings.py
|
381
384
|
tests/test_user_regression_test1.py
|
{minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/tests/test_cli.py
RENAMED
@@ -292,6 +292,9 @@ class TestCLIComplexFeatures:
|
|
292
292
|
function test:main<@s> {
|
293
293
|
exec test:helper;
|
294
294
|
exec test:helper<@s>;
|
295
|
+
// Macro calls (inline JSON and with-clause)
|
296
|
+
exec test:helper '{foo:"bar"}';
|
297
|
+
exec test:helper with storage test:ctx args;
|
295
298
|
}
|
296
299
|
''')
|
297
300
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import subprocess
|
2
|
+
import sys
|
3
|
+
from pathlib import Path
|
4
|
+
|
5
|
+
|
6
|
+
def test_build_macros_example(tmp_path: Path):
|
7
|
+
# Build the macros example shipped in the repo
|
8
|
+
proj_root = Path(__file__).resolve().parents[1]
|
9
|
+
example = proj_root / "examples" / "macros_example.mdl"
|
10
|
+
assert example.exists()
|
11
|
+
|
12
|
+
out_dir = tmp_path / "out"
|
13
|
+
result = subprocess.run(
|
14
|
+
[
|
15
|
+
sys.executable,
|
16
|
+
"-m",
|
17
|
+
"minecraft_datapack_language.cli",
|
18
|
+
"build",
|
19
|
+
"--mdl",
|
20
|
+
str(example),
|
21
|
+
"-o",
|
22
|
+
str(out_dir),
|
23
|
+
],
|
24
|
+
capture_output=True,
|
25
|
+
text=True,
|
26
|
+
)
|
27
|
+
assert result.returncode == 0, result.stderr
|
28
|
+
|
29
|
+
target_files = list(out_dir.glob("data/macros_ex/**/greeter.mcfunction"))
|
30
|
+
runner_files = list(out_dir.glob("data/macros_ex/**/runner.mcfunction"))
|
31
|
+
assert target_files, "greeter.mcfunction not found"
|
32
|
+
assert runner_files, "runner.mcfunction not found"
|
33
|
+
|
34
|
+
greeter = target_files[0].read_text()
|
35
|
+
runner = runner_files[0].read_text()
|
36
|
+
|
37
|
+
# Macro line should be present as raw
|
38
|
+
assert '$say "Hello $(name)"' in greeter
|
39
|
+
# Both exec forms should be emitted
|
40
|
+
assert 'function macros_ex:greeter {name:"Casey"}' in runner
|
41
|
+
assert 'function macros_ex:greeter with storage macros_ex:ctx player.profile' in runner
|
42
|
+
|
43
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
import subprocess
|
2
|
+
import sys
|
3
|
+
import tempfile
|
4
|
+
from pathlib import Path
|
5
|
+
|
6
|
+
|
7
|
+
def test_function_macros_exec_and_macro_lines():
|
8
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
9
|
+
mdl = Path(temp_dir) / "macro_test.mdl"
|
10
|
+
mdl.write_text(
|
11
|
+
(
|
12
|
+
'pack "macrotest" "Macro test" 82;\n'
|
13
|
+
'namespace "macro";\n\n'
|
14
|
+
'function macro:target {\n'
|
15
|
+
' $say "Hello $(name)"\n'
|
16
|
+
' say "Done";\n'
|
17
|
+
'}\n\n'
|
18
|
+
'function macro:caller {\n'
|
19
|
+
" exec macro:target '{name:\"purple elephant\"}';\n"
|
20
|
+
' exec macro:target with storage macro:ctx data.args;\n'
|
21
|
+
'}\n'
|
22
|
+
)
|
23
|
+
)
|
24
|
+
|
25
|
+
out_dir = Path(temp_dir) / "out"
|
26
|
+
result = subprocess.run(
|
27
|
+
[
|
28
|
+
sys.executable,
|
29
|
+
"-m",
|
30
|
+
"minecraft_datapack_language.cli",
|
31
|
+
"build",
|
32
|
+
"--mdl",
|
33
|
+
str(mdl),
|
34
|
+
"-o",
|
35
|
+
str(out_dir),
|
36
|
+
],
|
37
|
+
capture_output=True,
|
38
|
+
text=True,
|
39
|
+
)
|
40
|
+
assert result.returncode == 0, result.stderr
|
41
|
+
|
42
|
+
# Find target and caller mcfunction files regardless of singular/plural folder name
|
43
|
+
target_files = list(out_dir.glob("data/macro/**/target.mcfunction"))
|
44
|
+
caller_files = list(out_dir.glob("data/macro/**/caller.mcfunction"))
|
45
|
+
assert target_files, f"target.mcfunction not found in {out_dir!s}"
|
46
|
+
assert caller_files, f"caller.mcfunction not found in {out_dir!s}"
|
47
|
+
|
48
|
+
target_content = target_files[0].read_text()
|
49
|
+
caller_content = caller_files[0].read_text()
|
50
|
+
|
51
|
+
# Macro line should be preserved verbatim
|
52
|
+
assert "$say \"Hello $(name)\"" in target_content
|
53
|
+
# Exec with inline JSON compound
|
54
|
+
assert "function macro:target {name:\"purple elephant\"}" in caller_content
|
55
|
+
# Exec with data source 'with' clause
|
56
|
+
assert "function macro:target with storage macro:ctx data.args" in caller_content
|
57
|
+
|
58
|
+
|
{minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.cursor/rules/aispec.mdc
RENAMED
File without changes
|
File without changes
|
{minecraft_datapack_language-15.4.41 → minecraft_datapack_language-15.4.42}/.github/workflows/ci.yml
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|