From cabd5f6a20f675101ca1d89c64dad44cf67e4397 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 11 Apr 2024 19:42:25 +0100 Subject: [PATCH] Add NeoVim test runner For the queries that can't be tested with `tree-sitter` itself. --- Makefile | 2 ++ flake.nix | 28 ++++++++++++++++++++++++++ queries/indents.scm | 22 ++++++++++++++++++++ scripts/minimal_init.lua | 43 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 queries/indents.scm create mode 100644 scripts/minimal_init.lua diff --git a/Makefile b/Makefile index 4d5ad28..d60784a 100644 --- a/Makefile +++ b/Makefile @@ -5,10 +5,12 @@ all: .PHONY: test test: all tree-sitter test --apply-all-captures + nvim-test-runner .PHONY: update-tests update-tests: all tree-sitter test -u --apply-all-captures + nvim-test-runner .PHONY: playground playground: diff --git a/flake.nix b/flake.nix index 2ac4027..77fba0a 100644 --- a/flake.nix +++ b/flake.nix @@ -37,6 +37,7 @@ }: let inherit (flake-utils.lib) eachDefaultSystem; + inherit (nixpkgs) lib; in eachDefaultSystem (system: @@ -46,6 +47,25 @@ overlays = [ self.overlays.default ]; }; + nvim-test-runner = pkgs.writeShellApplication { + name = "nvim-test-runner"; + + runtimeInputs = with pkgs; [ + highlight-assertions + neovim + ]; + + text = '' + export NVIM_PLENARY='${pkgs.vimPlugins.plenary-nvim}' + export NVIM_TREESITTER='${pkgs.vimPlugins.nvim-treesitter}' + export NVIM_TREESITTER_TEXTOBJECTS='${pkgs.vimPlugins.nvim-treesitter-textobjects}' + export NVIM_TREESITTER_PARSER='${pkgs.vimPlugins.nvim-treesitter.grammarToPlugin self.packages.${system}.tree-sitter-bp}' + + nvim --headless --noplugin -u ${scripts/minimal_init.lua} \ + -c "PlenaryBustedDirectory test/ { minimal_init = '${./scripts/minimal_init.lua}' }" + ''; + }; + bump-version = pkgs.writeShellScriptBin "bump-version" '' set -eu @@ -90,6 +110,13 @@ enable = true; }; + nvim-test-runner = { + enable = true; + name = "nvim tests"; + entry = "${lib.getExe nvim-test-runner}"; + pass_filenames = false; + }; + tree-sitter = { enable = true; name = "tree-sitter tests"; @@ -112,6 +139,7 @@ nativeBuildInputs = with pkgs; [ bump-version nodejs + nvim-test-runner # FIXME: waiting on #301336 # (tree-sitter.override { webUISupport = true; }) tree-sitter diff --git a/queries/indents.scm b/queries/indents.scm new file mode 100644 index 0000000..170054f --- /dev/null +++ b/queries/indents.scm @@ -0,0 +1,22 @@ +; Expressions {{{ +(list_expression) @indent.begin + +(list_expression + "]" @indent.branch) + +(map_expression) @indent.begin + +(map_expression + "}" @indent.end) + +(assignment) @indent.begin ; FIXME: do I need it? +; }}} + +; Declarations {{{ +(module) @indent.begin + +(module + ")" @indent.end) +(module + "}" @indent.end) +; }}} diff --git a/scripts/minimal_init.lua b/scripts/minimal_init.lua new file mode 100644 index 0000000..1020089 --- /dev/null +++ b/scripts/minimal_init.lua @@ -0,0 +1,43 @@ +vim.opt.runtimepath:append(vim.env.NVIM_PLENARY) +vim.opt.runtimepath:append(vim.env.NVIM_TREESITTER) +vim.opt.runtimepath:append(vim.env.NVIM_TREESITTER_TEXTOBJECTS) +vim.opt.runtimepath:append(vim.env.NVIM_TREESITTER_PARSER) + +vim.cmd.runtime({ "plugin/plenary.vim", bang = true }) +vim.cmd.runtime({ "plugin/nvim-treesitter.lua", bang = true }) +vim.cmd.runtime({ "plugin/nvim-treesitter-textobjects.lua", bang = true }) + +local Path = require("plenary.path") + +local project_root = Path:new(".") -- FIXME: relies on current working directory + +vim.filetype.add({ + extension = { + bp = "bp", + }, +}) + +vim.o.swapfile = false +vim.bo.swapfile = false + +local parser_config = require("nvim-treesitter.parsers").get_parser_configs() +parser_config.bp = { + install_info = { + url = project_root.filename, + files = {"src/parser.c"}, + }, +} + +require("nvim-treesitter.configs").setup({ + indent = { enable = true }, + highlight = { enable = true }, +}) + +-- Add queries, overriding potential `nvim-treesitter`-provided ones +local scan_dir = require("plenary.scandir").scan_dir +local queries_dir = project_root / "queries" +for _, name in ipairs(scan_dir(queries_dir.filename)) do + local content = Path:new(name):read() + local basename = name:gsub(".*/", "") + vim.treesitter.query.set("bp", basename:gsub(".scm$", ""), content) +end