nixpkgs/pkgs/development/tools/parsing/tree-sitter/default.nix
2020-11-09 18:41:51 +00:00

114 lines
3.6 KiB
Nix

{ lib, stdenv
, fetchgit, fetchFromGitHub, fetchurl
, writeShellScript, runCommand, which
, rustPlatform, jq, nix-prefetch-git, xe, curl, emscripten
, callPackage
, enableShared ? true
, enableStatic ? false
, Security
}:
# 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 ./result script that is output by that (it updates ./grammars)
version = "0.17.3";
sha256 = "sha256-uQs80r9cPX8Q46irJYv2FfvuppwonSS5HVClFujaP+U=";
cargoSha256 = "sha256-fonlxLNh9KyEwCj7G5vxa7cM/DlcHNFbQpp0SwVQ3j4=";
src = fetchFromGitHub {
owner = "tree-sitter";
repo = "tree-sitter";
rev = version;
inherit sha256;
fetchSubmodules = true;
};
update-all-grammars = import ./update.nix {
inherit writeShellScript nix-prefetch-git curl jq xe src;
};
fetchGrammar = (v: fetchgit {inherit (v) url rev sha256 fetchSubmodules; });
grammars =
runCommand "grammars" {} (''
mkdir $out
'' + (lib.concatStrings (lib.mapAttrsToList
(name: grammar: "ln -s ${fetchGrammar grammar} $out/${name}\n")
(import ./grammars))));
builtGrammars = let
change = name: grammar:
callPackage ./library.nix {
language = name; inherit version; source = fetchGrammar grammar;
};
in
# typescript doesn't have parser.c in the same place as others
lib.mapAttrs change (removeAttrs (import ./grammars) ["typescript"]);
in rustPlatform.buildRustPackage {
pname = "tree-sitter";
inherit src version cargoSha256;
buildInputs = lib.optionals stdenv.isDarwin [ Security ];
nativeBuildInputs = [ emscripten which ];
postPatch = ''
# needed for the tests
rm -rf test/fixtures/grammars
ln -s ${grammars} test/fixtures/grammars
# These functions do not appear in the source code
sed -i /_ts_query_context/d lib/binding_web/exports.json
sed -i /___assert_fail/d lib/binding_web/exports.json
'';
# Compile web assembly with emscripten. The --debug flag prevents us from
# minifying the JavaScript; passing it allows us to side-step more Node
# JS dependencies for installation.
preBuild = ''
bash ./script/build-wasm --debug
'';
postInstall = ''
PREFIX=$out make install
${lib.optionalString (!enableShared) "rm $out/lib/*.so{,.*}"}
${lib.optionalString (!enableStatic) "rm $out/lib/*.a"}
'';
# test result: FAILED. 120 passed; 13 failed; 0 ignored; 0 measured; 0 filtered out
doCheck = false;
passthru = {
updater = {
inherit update-all-grammars;
};
inherit grammars;
inherit builtGrammars;
};
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
'';
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ Profpatsch ];
# Aarch has test failures with how tree-sitter compiles the generated C files
broken = stdenv.isAarch64;
};
}