feat(tests)!: new infrastructure based on makefile

Problem: Not easy to run all checks and tests locally. Redundant CI
workflows.

Solution: Separate CI into two workflows:
 * lint: Lua files (stylua, luals), query files (valid captures,
   predicates, directives using tsqueryls), docs
   (SUPPORTED_LANGUAGES.md) -- does not need parser installation
 * tests: parsers (ABI compatibility), query files (tsqueryls on
   Linux/macOS; nvim on Windows), highlight and indent tests (separated
   for better readability) -- needs parser installation (but only once)

Switch to https://github.com/nvim-treesitter/highlight-assertions fork
with ABI 15 support.

Run all tests (on Linux and macOS) through `make` (`formatlua`,
`checklua`, `lintquery`, `formatquery`, `checkquery`, `docs`, `tests`),
which downloads and caches all necessary dependencies.

Remove `update-readme` workflow (replaced by lint job on PRs).
This commit is contained in:
Christian Clason 2025-04-29 19:40:18 +02:00
parent 4e906caca3
commit 53dccb3a77
19 changed files with 269 additions and 272 deletions

View file

@ -6,29 +6,6 @@ local configs = require('nvim-treesitter.parsers')
local parsers = #_G.arg > 0 and { unpack(_G.arg) }
or require('nvim-treesitter.config').installed_parsers()
-- Extract captures from documentation for validation
local captures = {} ---@type table[]
do
local current_query ---@type string
for line in io.lines('CONTRIBUTING.md') do
if vim.startswith(line, '### ') then
current_query = line:sub(5):lower() ---@type string
elseif vim.startswith(line, '@') and current_query then
if not captures[current_query] then
captures[current_query] = {}
end
table.insert(captures[current_query], vim.split(line:sub(2), ' ')[1])
end
end
-- Complete captures for injections.
for lang, _ in pairs(configs) do
table.insert(captures['injections'], lang)
end
end
-- Check queries for each installed parser in parsers
local errors = {} ---@type string[]
local timings = {} ---@type { duration: number, lang: string, query_type: string }[]
@ -46,19 +23,6 @@ do
print(string.format('Checking %s %s (%.02fms)', lang, query_type, duration * 1e-6))
if not ok then
errors[#errors + 1] = string.format('%s (%s): %s', lang, query_type, query)
else
if query then
for _, capture in ipairs(query.captures) do
local is_valid = (
vim.startswith(capture, '_') -- Helpers.
or vim.list_contains(captures[query_type], capture)
)
if not is_valid then
errors[#errors + 1] =
string.format('%s (%s): invalid capture "@%s"', lang, query_type, capture)
end
end
end
end
end
end