Skip to content

elixir-localize/mf2_treesitter

Repository files navigation

Tree-sitter-mf2

tree-sitter grammar for ICU MessageFormat 2.0 (MF2).

Status

  • Passes the official MF2 WG syntax conformance suite: 247/247 (114 valid, 133 invalid-input tests). The runner lives at test/conformance/runner.js and is part of npm test.
  • Full set of editor queries: highlights, locals, folds, indents, injections, tags.
  • Native Node binding + WASM both ship.

Regenerating after a grammar edit

npm install            # once, pulls tree-sitter-cli into node_modules
./scripts/build.sh     # regenerate src/ + wasm/ + run tests

Needs emscripten on PATH for the WASM build, OR a running Docker / Podman (tree-sitter CLI can run emscripten inside a container as a fallback — open -a Docker on macOS if Docker Desktop is installed but not running).

After a regeneration, both the source changes AND the regenerated src/ + wasm/ artefacts need to be committed. Downstream consumers vendor the checked-in artefacts; they do not regenerate on their own builds.

Local development

npm install                                   # tree-sitter-cli into node_modules
./node_modules/.bin/tree-sitter test          # run corpus tests
./node_modules/.bin/tree-sitter parse FILE    # parse a file and print the tree

The test corpus under test/corpus/ is the same format used by the tree-sitter CLI. Add new tests by appending to the existing .txt files (see the format in any of them — ====== name ====== blocks).

What is in this repo

mf2_treesitter/
├── grammar.js              # grammar source of truth (hand-edited)
├── src/                    # generated by `tree-sitter generate`
│   ├── grammar.json
│   ├── node-types.json
│   ├── parser.c
│   └── tree_sitter/parser.h
├── wasm/
│   └── tree-sitter-mf2.wasm  # generated by `tree-sitter build --wasm`
├── queries/                # editor queries (language-agnostic)
│   ├── highlights.scm      # syntax highlighting
│   ├── locals.scm          # lexical scoping (goto-definition)
│   ├── folds.scm           # foldable regions
│   ├── indents.scm         # auto-indent rules
│   ├── injections.scm      # language injections (minimal; see below)
│   └── tags.scm            # symbol outline / ctags
├── bindings/
│   └── node/               # native Node.js binding (node-tree-sitter)
│       ├── binding.cc
│       ├── index.js
│       └── index.d.ts
├── binding.gyp             # node-gyp config for the Node binding
├── test/
│   ├── corpus/             # tree-sitter CLI test corpus (16 cases)
│   └── conformance/        # MF2 WG official suite (247 cases)
│       ├── syntax.json
│       ├── syntax-errors.json
│       └── runner.js       # Node runner, invoked by `npm test`
├── .github/workflows/      # CI: corpus tests, drift check, WASM build, pack
├── scripts/
│   └── build.sh            # regen + wasm + test, all in one
├── package.json            # npm metadata (published as `tree-sitter-mf2`)
├── tree-sitter.json        # tree-sitter CLI project metadata
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE                 # Apache-2.0
└── README.md

Licence

Apache-2.0. See LICENSE.

About

Treesitter grammar and wasm generator for MF2

Resources

Contributing

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages