mirror of
https://github.com/nvim-treesitter/nvim-treesitter.git
synced 2026-07-13 08:50:11 -04:00
feat: specify abi version for generate on newer ts cli
Check tree-sitter CLI version and if > 0.20.3 and generating a parser from grammar, use `--abi=vim.treesitter.language_version`. Besides being able to opt-in to newer ABI benefits, this is a necessary workaround for an upstream bug with 0.20.3, where `parser.h` is not generated if the (optional) `--abi` flag is omitted.
This commit is contained in:
parent
020905ff26
commit
bb319daf5f
3 changed files with 22 additions and 6 deletions
|
|
@ -5,6 +5,7 @@ local queries = require "nvim-treesitter.query"
|
||||||
local info = require "nvim-treesitter.info"
|
local info = require "nvim-treesitter.info"
|
||||||
local shell = require "nvim-treesitter.shell_command_selectors"
|
local shell = require "nvim-treesitter.shell_command_selectors"
|
||||||
local install = require "nvim-treesitter.install"
|
local install = require "nvim-treesitter.install"
|
||||||
|
local utils = require "nvim-treesitter.utils"
|
||||||
|
|
||||||
local health_start = vim.fn["health#report_start"]
|
local health_start = vim.fn["health#report_start"]
|
||||||
local health_ok = vim.fn["health#report_ok"]
|
local health_ok = vim.fn["health#report_ok"]
|
||||||
|
|
@ -24,13 +25,9 @@ local function install_health()
|
||||||
.. " not required for :TSInstall)"
|
.. " not required for :TSInstall)"
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
local handle = io.popen "tree-sitter -V"
|
|
||||||
local result = handle:read "*a"
|
|
||||||
handle:close()
|
|
||||||
local version = vim.split(result, "\n")[1]:match "[^tree%psitter].*"
|
|
||||||
health_ok(
|
health_ok(
|
||||||
"`tree-sitter` found "
|
"`tree-sitter` found "
|
||||||
.. (version or "(unknown version)")
|
.. (utils.ts_cli_version() or "(unknown version)")
|
||||||
.. " (parser generator, only needed for :TSInstallFromGrammar)"
|
.. " (parser generator, only needed for :TSInstallFromGrammar)"
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ local lockfile = {}
|
||||||
M.compilers = { vim.fn.getenv "CC", "cc", "gcc", "clang", "cl", "zig" }
|
M.compilers = { vim.fn.getenv "CC", "cc", "gcc", "clang", "cl", "zig" }
|
||||||
M.prefer_git = fn.has "win32" == 1
|
M.prefer_git = fn.has "win32" == 1
|
||||||
M.command_extra_args = {}
|
M.command_extra_args = {}
|
||||||
|
M.ts_generate_args = nil
|
||||||
|
|
||||||
local started_commands = 0
|
local started_commands = 0
|
||||||
local finished_commands = 0
|
local finished_commands = 0
|
||||||
|
|
@ -259,6 +260,15 @@ local function run_install(cache_folder, install_folder, lang, repo, with_sync,
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
return
|
return
|
||||||
|
else
|
||||||
|
if not M.ts_generate_args then
|
||||||
|
local ts_cli_version = utils.ts_cli_version()
|
||||||
|
if ts_cli_version and vim.split(ts_cli_version, " ")[1] > "0.20.2" then
|
||||||
|
M.ts_generate_args = { "generate", "--abi", vim.treesitter.language_version }
|
||||||
|
else
|
||||||
|
M.ts_generate_args = { "generate" }
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if generate_from_grammar and vim.fn.executable "node" ~= 1 then
|
if generate_from_grammar and vim.fn.executable "node" ~= 1 then
|
||||||
api.nvim_err_writeln "Node JS not found: `node` is not executable!"
|
api.nvim_err_writeln "Node JS not found: `node` is not executable!"
|
||||||
|
|
@ -308,7 +318,7 @@ local function run_install(cache_folder, install_folder, lang, repo, with_sync,
|
||||||
info = "Generating source files from grammar.js...",
|
info = "Generating source files from grammar.js...",
|
||||||
err = 'Error during "tree-sitter generate"',
|
err = 'Error during "tree-sitter generate"',
|
||||||
opts = {
|
opts = {
|
||||||
args = { "generate" },
|
args = M.ts_generate_args,
|
||||||
cwd = compile_location,
|
cwd = compile_location,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -193,4 +193,13 @@ function M.to_func(a)
|
||||||
return type(a) == "function" and a or M.constant(a)
|
return type(a) == "function" and a or M.constant(a)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function M.ts_cli_version()
|
||||||
|
if fn.executable "tree-sitter" == 1 then
|
||||||
|
local handle = io.popen "tree-sitter -V"
|
||||||
|
local result = handle:read "*a"
|
||||||
|
handle:close()
|
||||||
|
return vim.split(result, "\n")[1]:match "[^tree%psitter ].*"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue