Contributing
Code of Conduct
Contributors to Tree-sitter should abide by the Contributor Covenant.
Developing Tree-sitter
Prerequisites
To make changes to Tree-sitter, you should have:
- A C compiler, for compiling the core library and the generated parsers.
- A Rust toolchain, for compiling the Rust bindings, the highlighting library, and the CLI.
- Node.js and NPM, for generating parsers from
grammar.js
files. - Either Emscripten, Docker, or podman for compiling the library to WASM.
Building
Clone the repository:
git clone https://github.com/tree-sitter/tree-sitter
cd tree-sitter
Optionally, build the WASM library. If you skip this step, then the tree-sitter playground
command will require an internet
connection. If you have Emscripten installed, this will use your emcc
compiler. Otherwise, it will use Docker or Podman:
cargo xtask build-wasm
Build the Rust libraries and the CLI:
cargo build --release
This will create the tree-sitter
CLI executable in the target/release
folder.
If you want to automatically install the tree-sitter
CLI in your system, you can run:
cargo install --path cli
If you're going to be in a fast iteration cycle and would like the CLI to build faster, you can use the release-dev
profile:
cargo build --release --profile release-dev
# or
cargo install --path cli --profile release-dev
Testing
Before you can run the tests, you need to fetch some upstream grammars that are used for testing:
cargo xtask fetch-fixtures
To test any changes you've made to the CLI, you can regenerate these parsers using your current CLI code:
cargo xtask generate-fixtures
Then you can run the tests:
cargo xtask test
Similarly, to test the WASM binding, you need to compile these parsers to WASM:
cargo xtask generate-fixtures --wasm
cargo xtask test-wasm
Debugging
The test script has a number of useful flags. You can list them all by running cargo xtask test -h
.
Here are some of the main flags:
If you want to run a specific unit test, pass its name (or part of its name) as an argument:
cargo xtask test test_does_something
You can run the tests under the debugger (either lldb
or gdb
) using the -g
flag:
cargo xtask test -g test_does_something
Part of the Tree-sitter test suite involves parsing the corpus tests for several languages and performing randomized edits
to each example in the corpus. If you just want to run the tests for a particular language, you can pass the -l
flag.
Additionally, if you want to run a particular example from the corpus, you can pass the -e
flag:
cargo xtask test -l javascript -e Arrays
Published Packages
The main tree-sitter/tree-sitter
repository contains the source code for
several packages that are published to package registries for different languages:
-
Rust crates on crates.io:
tree-sitter
— A Rust binding to the core librarytree-sitter-highlight
— The syntax-highlighting librarytree-sitter-cli
— The command-line tool
-
JavaScript modules on npmjs.com:
web-tree-sitter
— A WASM-based JavaScript binding to the core librarytree-sitter-cli
— The command-line tool
There are also several other dependent repositories that contain other published packages:
tree-sitter/node-tree-sitter
— Node.js bindings to the core library, published astree-sitter
on npmjs.comtree-sitter/py-tree-sitter
— Python bindings to the core library, published astree-sitter
on PyPI.org.tree-sitter/go-tree-sitter
— Go bindings to the core library, published astree_sitter
on pkg.go.dev.
Publishing New Releases (Maintainers Only)
Publishing a new release of the CLI and lib requires these steps:
-
Commit and push all outstanding changes and verify that CI passes:
git commit -m "Fix things" git push
-
Upgrade manifest files and create a new tag:
cargo xtask bump-version --version <NEXT_VERSION>
This will determine the current version, increment the version to the one specified, and update the relevant files for Rust, Node, Zig, CMake, and Make. It will then create a commit and a tag for the new version. For more information about the arguments that are allowed, see the documentation for the
npm version
command. -
Push the commit and the tag:
git push git push --tags
-
CI will build the binaries and upload them to the GitHub release and the NPM registry. It will also publish the Rust crates to crates.io.
Developing Documentation
Our current static site generator for documentation is mdBook
, with a little bit of custom JavaScript to handle
the playground page. Most of the documentation is written in Markdown, including this file! You can find these files
at docs/src
. The playground code can be found in docs/assets/js/playground.js
, and its corresponding
css at docs/assets/css/playground.css
. To run and iterate on the docs locally, the
mdbook
CLI tool is required, which can be installed with cargo install mdbook
. Once you've installed it,
you can run the following command to start a local server:
cd docs
mdbook serve --open
mdbook
has a live-reload feature, so any changes you make to the markdown files will be reflected in the browser after
a short delay. Once you've made a change that you're happy with, you can submit a PR with your changes.
The playground page is a little more complicated, but if you know some basic JavaScript and CSS you should be able to make changes. The editor of choice we use for the playground is CodeMirror, and the tree-sitter module is fetched from here. This, along with the wasm module and wasm parsers, live in the .github.io repo.