2021-03-16 09:55:35 +00:00
|
|
|
{ lib
|
|
|
|
, stdenv
|
|
|
|
, fetchgit
|
|
|
|
, fetchFromGitHub
|
|
|
|
, fetchurl
|
|
|
|
, writeShellScript
|
|
|
|
, runCommand
|
|
|
|
, which
|
|
|
|
, formats
|
|
|
|
, rustPlatform
|
|
|
|
, jq
|
|
|
|
, nix-prefetch-git
|
|
|
|
, xe
|
|
|
|
, curl
|
|
|
|
, emscripten
|
2020-12-25 13:55:36 +00:00
|
|
|
, Security
|
2020-04-24 23:36:52 +00:00
|
|
|
, callPackage
|
2021-03-16 09:55:35 +00:00
|
|
|
, linkFarm
|
2020-12-25 13:55:36 +00:00
|
|
|
|
2021-01-05 17:05:55 +00:00
|
|
|
, enableShared ? !stdenv.hostPlatform.isStatic
|
|
|
|
, enableStatic ? stdenv.hostPlatform.isStatic
|
2020-12-25 13:55:36 +00:00
|
|
|
, webUISupport ? false
|
2020-04-24 23:36:52 +00:00
|
|
|
}:
|
|
|
|
|
|
|
|
# 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)
|
2021-03-16 09:55:35 +00:00
|
|
|
version = "0.19.3";
|
|
|
|
sha256 = "0zd1p9x32bwdc5cdqr0x8i9fpcykk1zczb8zdjawrrr92465d26y";
|
|
|
|
cargoSha256 = "0mlrbl85x1x2ynwrps94mxn95rjj1r7gb3vdivfaxqv1xvp25m41";
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
src = fetchFromGitHub {
|
|
|
|
owner = "tree-sitter";
|
|
|
|
repo = "tree-sitter";
|
2021-03-09 03:18:52 +00:00
|
|
|
rev = "v${version}";
|
2020-04-24 23:36:52 +00:00
|
|
|
inherit sha256;
|
|
|
|
fetchSubmodules = true;
|
|
|
|
};
|
|
|
|
|
|
|
|
update-all-grammars = import ./update.nix {
|
2021-01-05 17:05:55 +00:00
|
|
|
inherit writeShellScript nix-prefetch-git curl jq xe src formats lib;
|
2020-04-24 23:36:52 +00:00
|
|
|
};
|
|
|
|
|
2021-03-16 09:55:35 +00:00
|
|
|
fetchGrammar = (v: fetchgit { inherit (v) url rev sha256 fetchSubmodules; });
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
grammars =
|
2021-03-16 09:55:35 +00:00
|
|
|
runCommand "grammars" { } (''
|
|
|
|
mkdir $out
|
|
|
|
'' + (lib.concatStrings (lib.mapAttrsToList
|
|
|
|
(name: grammar: "ln -s ${fetchGrammar grammar} $out/${name}\n")
|
|
|
|
(import ./grammars))));
|
2020-04-24 23:36:52 +00:00
|
|
|
|
2021-03-16 09:55:35 +00:00
|
|
|
builtGrammars =
|
|
|
|
let
|
|
|
|
change = name: grammar:
|
|
|
|
callPackage ./grammar.nix { } {
|
|
|
|
language = name;
|
|
|
|
inherit version;
|
|
|
|
source = fetchGrammar grammar;
|
|
|
|
location = if grammar ? location then grammar.location else null;
|
|
|
|
};
|
|
|
|
grammars' = (import ./grammars);
|
|
|
|
grammars = grammars' //
|
|
|
|
{ tree-sitter-ocaml = grammars'.tree-sitter-ocaml // { location = "ocaml"; }; } //
|
|
|
|
{ tree-sitter-ocaml-interface = grammars'.tree-sitter-ocaml // { location = "interface"; }; } //
|
|
|
|
{ tree-sitter-typescript = grammars'.tree-sitter-typescript // { location = "typescript"; }; } //
|
|
|
|
{ tree-sitter-tsx = grammars'.tree-sitter-typescript // { location = "tsx"; }; };
|
|
|
|
in
|
|
|
|
lib.mapAttrs change grammars;
|
2020-04-24 23:36:52 +00:00
|
|
|
|
2021-03-16 09:55:35 +00:00
|
|
|
in
|
|
|
|
rustPlatform.buildRustPackage {
|
2020-04-24 23:36:52 +00:00
|
|
|
pname = "tree-sitter";
|
|
|
|
inherit src version cargoSha256;
|
|
|
|
|
2020-12-25 13:55:36 +00:00
|
|
|
buildInputs =
|
|
|
|
lib.optionals stdenv.isDarwin [ Security ];
|
|
|
|
nativeBuildInputs =
|
|
|
|
[ which ]
|
|
|
|
++ lib.optionals webUISupport [ emscripten ];
|
2020-09-25 04:45:31 +00:00
|
|
|
|
2020-12-25 13:55:36 +00:00
|
|
|
postPatch = lib.optionalString (!webUISupport) ''
|
|
|
|
# remove web interface
|
|
|
|
sed -e '/pub mod web_ui/d' \
|
|
|
|
-i cli/src/lib.rs
|
|
|
|
sed -e 's/web_ui,//' \
|
|
|
|
-e 's/web_ui::serve(¤t_dir.*$/println!("ERROR: web-ui is not available in this nixpkgs build; enable the webUISupport"); std::process::exit(1);/' \
|
|
|
|
-i cli/src/main.rs
|
2020-04-24 23:36:52 +00:00
|
|
|
'';
|
|
|
|
|
|
|
|
# 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.
|
2020-12-25 13:55:36 +00:00
|
|
|
preBuild = lib.optionalString webUISupport ''
|
2020-04-24 23:36:52 +00:00
|
|
|
bash ./script/build-wasm --debug
|
|
|
|
'';
|
|
|
|
|
2020-11-12 09:05:59 +00:00
|
|
|
postInstall = ''
|
|
|
|
PREFIX=$out make install
|
|
|
|
${lib.optionalString (!enableShared) "rm $out/lib/*.so{,.*}"}
|
|
|
|
${lib.optionalString (!enableStatic) "rm $out/lib/*.a"}
|
|
|
|
'';
|
|
|
|
|
2020-04-24 23:36:52 +00:00
|
|
|
# test result: FAILED. 120 passed; 13 failed; 0 ignored; 0 measured; 0 filtered out
|
|
|
|
doCheck = false;
|
|
|
|
|
|
|
|
passthru = {
|
|
|
|
updater = {
|
|
|
|
inherit update-all-grammars;
|
|
|
|
};
|
2021-03-16 09:55:35 +00:00
|
|
|
inherit grammars builtGrammars;
|
2021-01-05 17:05:55 +00:00
|
|
|
|
|
|
|
tests = {
|
|
|
|
# make sure all grammars build
|
|
|
|
builtGrammars = lib.recurseIntoAttrs builtGrammars;
|
|
|
|
};
|
2020-04-24 23:36:52 +00:00
|
|
|
};
|
|
|
|
|
2021-03-09 03:18:52 +00:00
|
|
|
meta = with lib; {
|
2020-04-24 23:36:52 +00:00
|
|
|
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
|
|
|
|
'';
|
2021-03-09 03:18:52 +00:00
|
|
|
license = licenses.mit;
|
|
|
|
maintainers = with maintainers; [ Profpatsch ];
|
2020-04-24 23:36:52 +00:00
|
|
|
};
|
|
|
|
}
|