about summary refs log tree commit diff
path: root/pkgs/development/tools/parsing/tree-sitter/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/tools/parsing/tree-sitter/default.nix')
-rw-r--r--pkgs/development/tools/parsing/tree-sitter/default.nix106
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;
+  };
+
+}