diff options
Diffstat (limited to 'pkgs/development/tools/parsing/tree-sitter/default.nix')
-rw-r--r-- | pkgs/development/tools/parsing/tree-sitter/default.nix | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/pkgs/development/tools/parsing/tree-sitter/default.nix b/pkgs/development/tools/parsing/tree-sitter/default.nix new file mode 100644 index 000000000000..989107a2fbef --- /dev/null +++ b/pkgs/development/tools/parsing/tree-sitter/default.nix @@ -0,0 +1,106 @@ +{ lib, stdenv +, fetchgit, fetchFromGitHub, fetchurl +, writeShellScript, runCommand +, rustPlatform, jq, nix-prefetch-git, xe, curl +}: + +# TODO: move to carnix or https://github.com/kolloch/crate2nix +let + # to update: + # 1) change all these hashes + # 2) nix-build -A tree-sitter.updater.update-all-grammars + # 3) run the script that is output by that (it updates ./grammars) + version = "0.15.7"; + sha256 = "0q6w8wl4a4s49xlgbv531pandzrj3n12hc1cwfshzcgikx303dg0"; + sha256Js = "11ig4cc2m85siyhafh4hq9sjb5if4gfwsf9k87izkxpiyflda0wp"; + sha256Wasm = "1zm4bvjri8ivhah3sy22mx6jbvibgbn2hk67d148j3nyka3y4gc0"; + cargoSha256 = "0ls9cb2p6cgqvnrmx72n79ga7687n8mzhh7n8n1pzv11r6cah9ki"; + + + src = fetchFromGitHub { + owner = "tree-sitter"; + repo = "tree-sitter"; + rev = version; + inherit sha256; + fetchSubmodules = true; + }; + + fetchDist = {file, sha256}: fetchurl { + url = "https://github.com/tree-sitter/tree-sitter/releases/download/${version}/${file}"; + inherit sha256; + }; + + # TODO: not distributed anymore; needed for the web-ui module, + # see also the disable-web-ui patch. + # TODO: build those instead of downloading prebuilt + # js = fetchDist { + # file = "tree-sitter.js"; + # sha256 = sha256Js; + # }; + # wasm = fetchDist { + # file = "tree-sitter.wasm"; + # sha256 = sha256Wasm; + # }; + + update-all-grammars = import ./update.nix { + inherit writeShellScript nix-prefetch-git curl jq xe src; + }; + + grammars = + let fetch = + (v: fetchgit {inherit (v) url rev sha256 fetchSubmodules; }); + in runCommand "grammars" {} ('' + mkdir $out + '' + (lib.concatStrings (lib.mapAttrsToList + (name: grammar: "ln -s ${fetch grammar} $out/${name}\n") + (import ./grammars)))); + + +in rustPlatform.buildRustPackage { + pname = "tree-sitter"; + inherit version; + inherit src; + + patches = [ + # the web ui requires tree-sitter compiled to js and wasm + ./disable-web-ui.patch + ]; + + postPatch = '' + # needed for the tests + rm -rf test/fixtures/grammars + ln -s ${grammars} test/fixtures/grammars + ''; + + passthru = { + updater = { + inherit update-all-grammars; + }; + inherit grammars; + }; + + inherit cargoSha256; + + meta = { + homepage = "https://github.com/tree-sitter/tree-sitter"; + description = "A parser generator tool and an incremental parsing library"; + longDescription = '' + Tree-sitter is a parser generator tool and an incremental parsing library. + It can build a concrete syntax tree for a source file and efficiently update the syntax tree as the source file is edited. + + Tree-sitter aims to be: + + * General enough to parse any programming language + * Fast enough to parse on every keystroke in a text editor + * Robust enough to provide useful results even in the presence of syntax errors + * Dependency-free so that the runtime library (which is written in pure C) can be embedded in any application + ''; + platforms = lib.platforms.all; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ Profpatsch ]; + # Darwin needs some more work with default libraries + # Aarch has test failures with how tree-sitter compiles the generated C files + broken = stdenv.isDarwin || stdenv.isAarch64; + }; + +} |