Compare commits

...

2 commits

Author SHA1 Message Date
Bruno BELANYI 54c2b4c5a7 Fix indentation in test files 2024-04-13 15:12:25 +01:00
Bruno BELANYI cabd5f6a20 Add NeoVim test runner
For the queries that can't be tested with `tree-sitter` itself.
2024-04-13 15:12:25 +01:00
6 changed files with 106 additions and 12 deletions

View file

@ -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:

View file

@ -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

22
queries/indents.scm Normal file
View file

@ -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)
; }}}

43
scripts/minimal_init.lua Normal file
View file

@ -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

View file

@ -1,10 +1,9 @@
/* This is a comment */
/* <- comment
^ comment
^ comment
*/
// <- comment
// ^ comment
// ^ comment
// And another comment
/* <- comment
^ comment
^ comment
*/
// <- comment
// ^ comment
// ^ comment

View file

@ -4,16 +4,16 @@ foo {}
foo ()
// <- function.call
foo {
// <- function.call
some_module {
// ^ function.call
field: 12,
// <- variable.parameter
another_field: 27,
// <- variable.parameter
}
foo (
// <- function.call
some_module (
// ^ function.call
field = 42,
// <- variable.parameter
done = false,