difftastic/manual/src/upstream_parsers.md

5.2 KiB

Upstream Parsers

Difftastic uses the following tree-sitter parsers:

Language Git Repository
Bash tree-sitter/tree-sitter-bash
C tree-sitter/tree-sitter-c
C++ tree-sitter/tree-sitter-cpp
C# tree-sitter/tree-sitter-c-sharp
Clojure sogaiu/tree-sitter-clojure
Common Lisp theHamsta/tree-sitter-commonlisp
CSS tree-sitter/tree-sitter-css
Elixir elixir-lang/tree-sitter-elixir
Emacs Lisp wilfred/tree-sitter-elisp
Go tree-sitter/tree-sitter-go
Haskell tree-sitter/tree-sitter-haskell
Java tree-sitter/tree-sitter-java
JavaScript, JSX tree-sitter/tree-sitter-javascript
JSON tree-sitter/tree-sitter-json
OCaml tree-sitter/tree-sitter-ocaml
PHP tree-sitter/tree-sitter-php
Python tree-sitter/tree-sitter-python
Ruby tree-sitter/tree-sitter-ruby
Rust tree-sitter/tree-sitter-rust (forked)
Scala tree-sitter/tree-sitter-scala
TypeScript, TSX tree-sitter/tree-sitter-typescript

These parsers are included as git subtrees in vendor/.

Tree-sitter parsers are sometimes packaged on npm, sometimes packaged on crates.io, and have different release frequencies. Git subtrees allow difftastic to track the latest version of these parsers.

Adding a new parser

If you've found a reasonably complete parser implementation for your target language, add it to vendor/.

$ git subtree add --prefix=vendor/tree-sitter-java git@github.com:tree-sitter/tree-sitter-java.git master

Cargo does not allow packages to include subdirectories that contain a Cargo.toml. Add a symlink to the src/ parser subdirectory.

$ cd vendor
$ ln -s tree-sitter-java/src tree-sitter-java-src

You can now add the parser to build by including the directory in build.rs. You will also need to update guess_language.rs to configure the file extensions, and tree_sitter_parser.rs to configure atoms and delimiters.

To add syntax highlighting to the package, you'll also need a symlink to the highlights.scm, if available.

$ cd vendor/highlights
$ ln -s ../tree-sitter-java/queries/highlights.scm java.scm

Updating a parser

To update a parser, pull commits from the upstream git repository. For example, the following command will update the Java parser:

$ git subtree pull --prefix=vendor/tree-sitter-java git@github.com:tree-sitter/tree-sitter-java.git master

To see when each parser was last updated, use the following shell command:

$ for d in $(git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort); do echo "$d"; git log --pretty="  %cs" -n 1 $d; done