Skip to content

Add the Sand language, language server, and Zed support - #507

Open
ThatOneToast wants to merge 11 commits into
mainfrom
t3/evaluate-custom-datapack-language
Open

ThatOneToast wants to merge 11 commits into
mainfrom
t3/evaluate-custom-datapack-language

Conversation

@ThatOneToast

@ThatOneToast ThatOneToast commented Nov 8, 2026 •

Copy link
Copy Markdown
Owner

.sand files express gameplay and compile through the portable backend shared with Rust and JSON packs. Language projects need neither Cargo nor sand.toml.

Language and runtime

  • Scalar types (number, fixed-point float, bool, enums), constants, modules, imports, and privacy.
  • Functions with parameters, mutable parameter bindings, return values, recursion, and caller-frame preservation for reentrant calls.
  • Locals, early returns, boolean expressions and predicate values in arguments, exhaustive statement match with constant alternatives, loops, counting ranges, .rev(), .step_by(n), and loop jumps. Range bounds and runtime command arguments evaluate once in source order.
  • Player/global/entity State, flows, timers, typed custom events, vanilla player events, entity queries, executor actions, properties, world operations, text, and basic resources.
  • Runtime item counts, damage, experience, sound volume/pitch, and teleport coordinates use canonical typed operands. Invalid runtime bounds skip the command; invalid constants produce diagnostics. Runtime teleport coordinates preserve exact positions without Minecraft's integer block-centering.
  • Constant signed division, remainder, and fixed-point arithmetic follow the runtime's floor semantics.
  • Offline Mojang-report catalogs for each verified target drive language checking, completion, and portable backend validation. A CLI built for 26.3 rejects 26.3-only vanilla content when targeting 26.2. Catalogs are refreshed through an explicit verified maintenance generator.
  • Compiler capability metadata derives operation/event vocabulary from the schema and advertises all catalog targets.

Tools

  • sand lang new|check|build|run|emit|zed; sand run recognizes language projects.
  • Package-wide sand fmt and sand lang fmt, including --check.
  • LSP diagnostics, hover, signature help, navigation, rename, completion, formatting, naming/mutability quick fixes, symbols, and inlay hints.
  • Generated tree-sitter parser and Zed extension, with boolean argument/group support.
  • CI runs a 20-assertion control-flow/arithmetic native probe and a two-player runtime operand probe on vanilla 26.2, retaining failure artifacts.

The guide, parity table, and remaining expansion checklist are in book/src/language.md and ROADMAP.md.

Remaining scope

This PR does not yet deliver every requested language extension. Records, collections, runtime strings, first-class functions, methods/generics, suspended continuations (wait), persistent entity references, broader resource/world APIs, language-authored tests/debugging, and the high-level Rust gameplay systems remain unfinished. Match currently supports statement arms rather than value expressions. Real Zed-session interaction remains unverified. Minecraft's numeric and command execution limits still apply.

Validation

  • scripts/check.sh and git diff --check pass.
  • Focused regressions cover numeric semantics, operand types/ranges, malformed portable fields/scales, target filtering and resource validation, version aliases, capabilities, and nested grouping.
  • Vanilla 26.2: all 20 arithmetic/control-flow assertions pass in repeated invocations; startup and reload also pass.
  • Vanilla 26.2 with two real passive clients: separate inventories and experience, invalid item/damage guards, custom-item macro text, sound command loading, player position/attribute properties, entity damage, and coordinate argument order pass. This verifies server behavior, not rendered client UI or active controls.
  • Tree-sitter parses the runtime-value fixture without errors.

Introduce `.sand` source files that compile through the portable program
backend, so packs need neither Cargo nor sand.toml.

- sand-lang: parser, analysis, execution-context inference, typed vanilla
  values, naming lints, and editor queries with position-aware completion
- sand-lsp and `sand lsp`: diagnostics, hover, completion, signature help,
  navigation, and rename
- `sand lang new|check|build|run|emit|zed`; `sand run` also accepts language
  projects
- Portable model: arithmetic, control flow, text, entities and entity State,
  attributes, teleport, player events, custom items, recipes, and tags
- Generated `sand::vanilla::ParticleType` and `Attribute` registries
- tree-sitter grammar and Zed extension

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown
Codex Review Summary: ❌ Failed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ❌ Failed 2026-11-08T16:51:44.207941Z
We couldn’t complete this review. Comment @codex review to try again.
526efe2 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@coderabbitai

coderabbitai Bot commented Nov 8, 2026 •

Copy link
Copy Markdown

Important

  • Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 6ce14549-91a9-4bcb-a07c-f5a6682b3a5e
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

ThatOneToast and others added 10 commits November 11, 2026 10:35
Add custom events, timers, world actions and conditions, boss bars,
single-pool loot tables, and smithing upgrades to the Sand language and
the portable program, with completion, hover, highlighting, and docs.

Portable output now runs through the same final 26.3 resource-schema pass
as Rust export, so packs targeting 26.3 emit predicates with `type` and
load instead of failing registry parsing. Player loops keep Rust's
contract of changing the executor only; event dispatch runs at the
player, as Rust's does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the Sand language

Calls that can re-enter their caller save the caller's locals, parameters,
and temporaries on a command-storage stack (PushFrame/PopFrame) and restore
them afterwards; other calls compile exactly as before. Self-calls and
arguments that call functions are computed into temporaries before any
parameter is written.

Loops gain `for i in a..b` / `a..=b`, `loop`, `break`, and `continue`
inside `while`; `while` accepts any condition. Functions returning bool
can be used directly as conditions. The portable program gains DataGet for
reading entity data such as health and food.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`Player.health`, `Player.food`, and other entity data read as typed
values; every attribute is a property that can be read and assigned, such as
`Player.max_health = 40.0;` or `zombie.scale *= 2.0;`. Loop bindings act as
handles for the entity they run as. get_attribute and set_attribute are
removed in favour of properties. Editors complete properties after a handle,
show their type and whether they are writable, and complete break, continue,
loop, and counting for.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`as` converts between number, float, bool, and enums with one rule shared
by constants and run time, and explains impossible casts. Unary minus binds
tighter than `as`, as in Rust. `emit Name(args);` replaces the emit
builtin, handlers may ignore an event's payload, and the old spelling gets a
fix-it message. Keyword hover covers loops, jumps, casts, and emit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…itter grammar

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…face

The language guide covers counting for, loop, break and continue, any while
condition, recursion and how frames are saved, the cast table, Player and
loop-handle properties, and payload-free event handlers. API surface tests
record the frame, entity-data, and EntityData method additions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant