anvil-editor: init at 0.4
[NixPkgs.git] / pkgs / applications / editors / vim / plugins / nvim-treesitter / overrides.nix
blobc1e80f20d198b07353eea6fd1e2052e73a83305c
1 { lib, callPackage, tree-sitter, neovim, neovimUtils, runCommand, vimPlugins, tree-sitter-grammars }:
3 self: super:
5 let
6   inherit (neovimUtils) grammarToPlugin;
7   generatedGrammars = callPackage ./generated.nix {
8     inherit (tree-sitter) buildGrammar;
9   };
11   generatedDerivations = lib.filterAttrs (_: lib.isDerivation) generatedGrammars;
13   # add aliases so grammars from `tree-sitter` are overwritten in `withPlugins`
14   # for example, for ocaml_interface, the following aliases will be added
15   #   ocaml-interface
16   #   tree-sitter-ocaml-interface
17   #   tree-sitter-ocaml_interface
18   builtGrammars = generatedGrammars // lib.concatMapAttrs
19     (k: v:
20       let
21         replaced = lib.replaceStrings [ "_" ] [ "-" ] k;
22       in
23       {
24         "tree-sitter-${k}" = v;
25       } // lib.optionalAttrs (k != replaced) {
26         ${replaced} = v;
27         "tree-sitter-${replaced}" = v;
28       })
29     generatedDerivations;
31   allGrammars = lib.attrValues generatedDerivations;
33   # Usage:
34   # pkgs.vimPlugins.nvim-treesitter.withPlugins (p: [ p.c p.java ... ])
35   # or for all grammars:
36   # pkgs.vimPlugins.nvim-treesitter.withAllGrammars
37   withPlugins =
38     f: self.nvim-treesitter.overrideAttrs {
39       passthru.dependencies = map grammarToPlugin
40         (f (tree-sitter.builtGrammars // builtGrammars));
41     };
43   withAllGrammars = withPlugins (_: allGrammars);
47   postPatch = ''
48     rm -r parser
49   '';
51   passthru = (super.nvim-treesitter.passthru or { }) // {
52     inherit builtGrammars allGrammars grammarToPlugin withPlugins withAllGrammars;
54     grammarPlugins = lib.mapAttrs (_: grammarToPlugin) generatedDerivations;
56     tests = {
57       check-queries =
58         let
59           nvimWithAllGrammars = neovim.override {
60             configure.packages.all.start = [ withAllGrammars ];
61           };
62         in
63         runCommand "nvim-treesitter-check-queries"
64           {
65             nativeBuildInputs = [ nvimWithAllGrammars ];
66             CI = true;
67           }
68           ''
69             touch $out
70             export HOME=$(mktemp -d)
71             ln -s ${withAllGrammars}/CONTRIBUTING.md .
73             nvim --headless "+luafile ${withAllGrammars}/scripts/check-queries.lua" | tee log
75             if grep -q Warning log; then
76               echo "Error: warnings were emitted by the check"
77               exit 1
78             fi
79           '';
81       tree-sitter-queries-are-present-for-custom-grammars =
82         let
83           pluginsToCheck =
84             builtins.map
85             (grammar: grammarToPlugin grammar)
86             # true is here because there is `recurseForDerivations = true`
87             (lib.remove true
88               (lib.attrValues tree-sitter-grammars)
89             );
90         in
91         runCommand "nvim-treesitter-test-queries-are-present-for-custom-grammars"
92         { CI = true; }
93         ''
94           function check_grammar {
95             EXPECTED_FILES="$2/parser/$1.so `ls $2/queries/$1/*.scm`"
97             echo
98             echo expected files for $1:
99             echo $EXPECTED_FILES
101             # the derivation has only symlinks, and `find` doesn't count them as files
102             # so we cannot use `-type f`
103             for file in `find $2 -not -type d`; do
104               echo checking $file
105               # see https://stackoverflow.com/a/8063284
106               if ! echo "$EXPECTED_FILES" | grep -wqF "$file"; then
107                 echo $file is unexpected, exiting
108                 exit 1
109               fi
110             done
111           }
113           ${lib.concatLines
114             (lib.forEach
115               pluginsToCheck
116               (g: "check_grammar \"${g.grammarName}\" \"${g}\"")
117             )
118           }
119           touch $out
120         '';
122       no-queries-for-official-grammars =
123         let
124           pluginsToCheck =
125             # true is here because there is `recurseForDerivations = true`
126             (lib.remove true
127               (lib.attrValues vimPlugins.nvim-treesitter-parsers)
128             );
129         in
130         runCommand "nvim-treesitter-test-no-queries-for-official-grammars"
131         { CI = true; }
132         ''
133           touch $out
135           function check_grammar {
136             echo checking $1...
137             if [ -d $2/queries ]; then
138               echo Queries dir exists in $1
139               echo This is unexpected, see https://github.com/NixOS/nixpkgs/pull/344849#issuecomment-2381447839
140               exit 1
141             fi
142           }
144           ${lib.concatLines
145             (lib.forEach
146               pluginsToCheck
147               (g: "check_grammar \"${g.grammarName}\" \"${g}\"")
148             )
149           }
150         '';
151     };
152   };
154   meta = with lib; (super.nvim-treesitter.meta or { }) // {
155     license = licenses.asl20;
156     maintainers = with maintainers; [ figsoda ];
157   };
158   nvimRequireCheck = "nvim-treesitter";