Commit ca846a34 authored by figsoda's avatar figsoda
Browse files

vimPlugins.nvim-treesitter: add tree sitter grammars

parent ea416616
Loading
Loading
Loading
Loading
+1374 −0

File added.

Preview size limit exceeded, changes collapsed.

+38 −0
Original line number Diff line number Diff line
{ lib, callPackage, tree-sitter, nodejs }:

self: super:

let
  builtGrammars = callPackage ./generated.nix {
    buildGrammar = callPackage ../../../../../development/tools/parsing/tree-sitter/grammar.nix { };
  };

  allGrammars = lib.filter lib.isDerivation (lib.attrValues builtGrammars);

  # Usage:
  # pkgs.vimPlugins.nvim-treesitter.withPlugins (p: [ p.c p.java ... ])
  # or for all grammars:
  # pkgs.vimPlugins.nvim-treesitter.withAllGrammars
  withPlugins =
    grammarFn: self.nvim-treesitter.overrideAttrs (_: {
      postPatch =
        let
          grammars = tree-sitter.withPlugins (ps: grammarFn (ps // builtGrammars));
        in
        ''
          rm -r parser
          ln -s ${grammars} parser
        '';
    });
in

{
  passthru = {
    inherit builtGrammars allGrammars withPlugins;

    tests.builtGrammars = lib.recurseIntoAttrs builtGrammars;

    withAllGrammars = withPlugins (_: allGrammars);
  };
}
+17 −0
Original line number Diff line number Diff line
{ pkgs ? import ../../../../../.. { } }:

with pkgs;

let
  inherit (vimPlugins) nvim-treesitter;

  neovim = pkgs.neovim.override {
    configure.packages.all.start = [ nvim-treesitter ];
  };
in

mkShell {
  packages = [ neovim nix-prefetch python3 ];

  NVIM_TREESITTER = nvim-treesitter;
}
+123 −0
Original line number Diff line number Diff line
#!/usr/bin/env nix-shell
#!nix-shell update-shell.nix -i python

import json
import re
import subprocess
from os import getenv
from os.path import dirname, join

lockfile = json.load(open(join(getenv("NVIM_TREESITTER"), "lockfile.json")))

configs = json.loads(
    subprocess.check_output(
        [
            "nvim",
            "--headless",
            "-u",
            "NONE",
            "+lua io.write(vim.json.encode(require('nvim-treesitter.parsers').get_parser_configs()))",
            "+quit!",
        ]
    )
)

regex = re.compile("^https?://(github.com|gitlab.com)/(.+?)/(.+?)(.git)?$")


def generate_grammar(item):
    lang, lock = item
    cfg = configs.get(lang)
    if not cfg:
        return ""

    info = cfg["install_info"]
    url = info["url"]
    rev = lock["revision"]

    generated = f"""  {lang} = buildGrammar {{
    language = "{lang}";
    version = "{rev[:7]}";
    source = """

    m = regex.fullmatch(url)
    cmd = ["nix-prefetch", "--rev", rev]

    match m and m.group(1, 2, 3):
        case "github.com", owner, repo:
            cmd += [
                "fetchFromGitHub",
                "--owner",
                owner,
                "--repo",
                repo,
            ]

            generated += f"""fetchFromGitHub {{
      owner = "{owner}";
      repo = "{repo}";"""

        case "gitlab.com", owner, repo:
            cmd += [
                "fetchFromGitLab",
                "--owner",
                owner,
                "--repo",
                repo,
            ]

            generated += f"""fetchFromGitLab {{
      owner = "{owner}";
      repo = "{repo}";"""

        case _:
            cmd += ["fetchgit", "url"]
            generated += f"""fetchgit {{
      url = "{url}";"""

    if info.get("requires_generate_from_grammar"):
        cmd += [
            "--arg",
            "nativeBuildInputs",
            "[ nodejs tree-sitter ]",
            "--postFetch",
            "pushd $out && tree-sitter generate && popd",
        ]

        generated += """
      nativeBuildInputs = [ nodejs tree-sitter ];
      postFetch = "pushd $out && tree-sitter generate && popd";"""

    hash = subprocess.check_output(cmd, text=True).strip()

    generated += f"""
      rev = "{rev}";
      hash = "{hash}";
    }};"""

    location = info.get("location")
    if location:
        generated += f"""
    location = "{location}";
"""

    generated += """
  };
"""

    return generated


generated_file = """# generated by pkgs/applications/editors/vim/plugins/nvim-treesitter/update.py

{ buildGrammar, fetchFromGitHub, fetchFromGitLab, fetchgit, nodejs, tree-sitter }:

{
"""

for generated in map(generate_grammar, lockfile.items()):
    generated_file += generated

generated_file += "}\n"

open(join(dirname(__file__), "generated.nix"), "w").write(generated_file)
+4 −18
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@
, CoreServices

  # nvim-treesitter dependencies
, tree-sitter
, callPackage

  # sved dependencies
, glib
@@ -652,23 +652,9 @@ self: super: {
    dependencies = with self; [ plenary-nvim ];
  });

  # Usage:
  # pkgs.vimPlugins.nvim-treesitter.withPlugins (p: [ p.tree-sitter-c p.tree-sitter-java ... ])
  # or for all grammars:
  # pkgs.vimPlugins.nvim-treesitter.withPlugins (_: tree-sitter.allGrammars)
  nvim-treesitter = super.nvim-treesitter.overrideAttrs (old: {
    passthru.withPlugins =
      grammarFn: self.nvim-treesitter.overrideAttrs (_: {
        postPatch =
          let
            grammars = tree-sitter.withPlugins grammarFn;
          in
          ''
            rm -r parser
            ln -s ${grammars} parser
          '';
      });
  });
  nvim-treesitter = super.nvim-treesitter.overrideAttrs (old:
    callPackage ./nvim-treesitter/overrides.nix { } self super
  );

  octo-nvim = super.octo-nvim.overrideAttrs (old: {
    dependencies = with self; [ telescope-nvim plenary-nvim ];