diff options
| author | Christian Clason <c.clason@uni-graz.at> | 2024-04-21 00:14:12 +0200 |
|---|---|---|
| committer | Christian Clason <c.clason@uni-graz.at> | 2025-05-12 18:43:40 +0200 |
| commit | c70daa36dcc2fdae113637fba76350daaf62dba5 (patch) | |
| tree | da900b9db77fdc25d66d545c088d1c0b858a5d87 /lua | |
| parent | fix: do not use vim.iter (#6469) (diff) | |
| download | nvim-treesitter-c70daa36dcc2fdae113637fba76350daaf62dba5.tar nvim-treesitter-c70daa36dcc2fdae113637fba76350daaf62dba5.tar.gz nvim-treesitter-c70daa36dcc2fdae113637fba76350daaf62dba5.tar.bz2 nvim-treesitter-c70daa36dcc2fdae113637fba76350daaf62dba5.tar.lz nvim-treesitter-c70daa36dcc2fdae113637fba76350daaf62dba5.tar.xz nvim-treesitter-c70daa36dcc2fdae113637fba76350daaf62dba5.tar.zst nvim-treesitter-c70daa36dcc2fdae113637fba76350daaf62dba5.zip | |
feat(install)!: add explicit path field to parser info (#6476)
Problem: Using `url` for both remote repo and local path complicates the
code.
Solution: Add `path` field that overrides `url` and bypasses
git-specific manipulations, i.e., the contents of the `path` are used
as-is (no git repo needed).
This means `:TSUpdate` will skip such parsers; use `:TSInstall!` instead
after making local changes.
---------
Co-authored-by: Lewis Russell <lewis6991@gmail.com>
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/nvim-treesitter/install.lua | 98 | ||||
| -rw-r--r-- | lua/nvim-treesitter/parsers.lua | 33 |
2 files changed, 54 insertions, 77 deletions
diff --git a/lua/nvim-treesitter/install.lua b/lua/nvim-treesitter/install.lua index 1bb7d6fea..57671d7d3 100644 --- a/lua/nvim-treesitter/install.lua +++ b/lua/nvim-treesitter/install.lua @@ -123,28 +123,6 @@ end --- PARSER MANAGEMENT FUNCTIONS --- ---- @param repo InstallInfo ---- @param project_name string ---- @param cache_dir string ---- @param from_local_path boolean ---- @return string -local function get_compile_location(repo, cache_dir, project_name, from_local_path) - ---@type string compile_location only needed for typescript installs. - if from_local_path then - local compile_location = repo.url - if repo.location then - compile_location = fs.joinpath(compile_location, repo.location) - end - return compile_location - end - - local repo_location = project_name - if repo.location then - repo_location = fs.joinpath(repo_location, repo.location) - end - return fs.joinpath(cache_dir, repo_location) -end - local function istring(c) return type(c) == 'string' end @@ -168,6 +146,10 @@ end --- @param compile_location string --- @return string? err local function do_generate_from_grammar(logger, repo, compile_location) + if not executable('tree-sitter') then + return logger:error('tree-sitter CLI not found: `tree-sitter` is not executable') + end + if repo.generate_requires_npm then if not executable('npm') then return logger:error('NPM requires to be installed from grammar.js') @@ -400,23 +382,29 @@ local function can_download_tar(repo) end -- Returns the compile command based on the OS and user options +---@param logger Logger ---@param repo InstallInfo ---@param cc string ---@param compile_location string ----@return vim.SystemCompleted -local function do_compile(repo, cc, compile_location) +--- @return string? err +local function do_compile(logger, repo, cc, compile_location) local args = vim.tbl_flatten(select_compiler_args(repo, cc)) local cmd = vim.list_extend({ cc }, args) - return system(cmd, { cwd = compile_location }) + logger:info('Compiling parser') + + local r = system(cmd, { cwd = compile_location }) + if r.code > 0 then + return logger:error('Error during compilation: %s', r.stderr) + end end ---@param lang string ---@param cache_dir string ---@param install_dir string ----@param generate_from_grammar? boolean +---@param generate? boolean ---@return string? err -local function install_lang0(lang, cache_dir, install_dir, generate_from_grammar) +local function install_lang0(lang, cache_dir, install_dir, generate) local logger = log.new('install/' .. lang) local repo = get_parser_install_info(lang) @@ -429,50 +417,43 @@ local function install_lang0(lang, cache_dir, install_dir, generate_from_grammar local project_name = 'tree-sitter-' .. lang - generate_from_grammar = repo.requires_generate_from_grammar or generate_from_grammar - - if generate_from_grammar and not executable('tree-sitter') then - return logger:error('tree-sitter CLI not found: `tree-sitter` is not executable') - end - - if generate_from_grammar and not executable('node') then - return logger:error('Node JS not found: `node` is not executable') - end - local revision = get_target_revision(lang) - local maybe_local_path = fs.normalize(repo.url) - local from_local_path = fn.isdirectory(maybe_local_path) == 1 - if from_local_path then - repo.url = maybe_local_path - end - - if not from_local_path then - util.delete(fs.joinpath(cache_dir, project_name)) + local compile_location ---@type string + if repo.path then + compile_location = fs.normalize(repo.path) + else local project_dir = fs.joinpath(cache_dir, project_name) + util.delete(project_dir) - revision = revision or repo.branch or 'master' + revision = revision or repo.branch or 'main' local do_download = can_download_tar(repo) and do_download_tar or do_download_git local err = do_download(logger, repo, project_name, cache_dir, revision, project_dir) if err then return err end + compile_location = fs.joinpath(cache_dir, project_name) end - local compile_location = get_compile_location(repo, cache_dir, project_name, from_local_path) + if repo.location then + compile_location = fs.joinpath(compile_location, repo.location) + end - if generate_from_grammar then - local err = do_generate_from_grammar(logger, repo, compile_location) - if err then - return err + do + if repo.generate or generate then + local err = do_generate_from_grammar(logger, repo, compile_location) + if err then + return err + end end end - logger:info('Compiling parser') - local r = do_compile(repo, cc, compile_location) - if r.code > 0 then - return logger:error('Error during compilation: %s', r.stderr) + do + local err = do_compile(logger, repo, cc, compile_location) + if err then + return err + end end local parser_lib_name = fs.joinpath(install_dir, lang) .. '.so' @@ -486,7 +467,7 @@ local function install_lang0(lang, cache_dir, install_dir, generate_from_grammar local revfile = fs.joinpath(config.get_install_dir('parser-info') or '', lang .. '.revision') util.write_file(revfile, revision or '') - if not from_local_path then + if not repo.path then util.delete(fs.joinpath(cache_dir, project_name)) end end @@ -561,11 +542,6 @@ local function install(languages, options, _callback) local generate_from_grammar = options.generate_from_grammar local skip = options.skip - if not executable('git') then - log.error('Git is required on your system to run this command') - return - end - local cache_dir = vim.fs.normalize(fn.stdpath('cache')) local install_dir = config.get_install_dir('parser') diff --git a/lua/nvim-treesitter/parsers.lua b/lua/nvim-treesitter/parsers.lua index 538f2336c..6f5915da1 100644 --- a/lua/nvim-treesitter/parsers.lua +++ b/lua/nvim-treesitter/parsers.lua @@ -1,18 +1,19 @@ ---@class InstallInfo +---@field path? string ---@field url string ----@field branch string|nil ----@field revision string|nil Used to override lockfile revision +---@field branch? string +---@field revision? string ---@field files string[] ----@field generate_requires_npm boolean|nil ----@field requires_generate_from_grammar boolean|nil ----@field location string|nil +---@field generate_requires_npm? boolean +---@field generate? boolean +---@field location? string ---@class ParserInfo ----@field install_info InstallInfo? ----@field maintainers string[]? ----@field requires string[]? +---@field install_info? InstallInfo +---@field maintainers? string[] +---@field requires? string[] ---@field tier integer ----@field readme_note string|nil? +---@field readme_note? string local M = {} @@ -1413,7 +1414,7 @@ M.configs = { install_info = { url = 'https://github.com/latex-lsp/tree-sitter-latex', files = { 'src/parser.c', 'src/scanner.c' }, - requires_generate_from_grammar = true, + generate = true, }, maintainers = { '@theHamsta', '@clason' }, tier = 2, @@ -1591,7 +1592,7 @@ M.configs = { install_info = { url = 'https://github.com/artagnon/tree-sitter-mlir', files = { 'src/parser.c' }, - requires_generate_from_grammar = true, + generate = true, }, maintainers = { '@artagnon' }, tier = 4, @@ -1731,7 +1732,7 @@ M.configs = { install_info = { url = 'https://github.com/atom-ocaml/tree-sitter-ocamllex', files = { 'src/parser.c', 'src/scanner.c' }, - requires_generate_from_grammar = true, + generate = true, }, maintainers = { '@undu' }, tier = 3, @@ -2246,7 +2247,7 @@ M.configs = { install_info = { url = 'https://github.com/rockorager/tree-sitter-scfg', files = { 'src/parser.c' }, - requires_generate_from_grammar = true, + generate = true, }, maintainers = { '@WhyNotHugo' }, tier = 3, @@ -2489,7 +2490,7 @@ M.configs = { install_info = { url = 'https://github.com/alex-pinkus/tree-sitter-swift', files = { 'src/parser.c', 'src/scanner.c' }, - requires_generate_from_grammar = true, + generate = true, }, maintainers = { '@alex-pinkus' }, tier = 3, @@ -2544,7 +2545,7 @@ M.configs = { install_info = { url = 'https://github.com/euclidianAce/tree-sitter-teal', files = { 'src/parser.c', 'src/scanner.c' }, - requires_generate_from_grammar = true, + generate = true, }, maintainers = { '@euclidianAce' }, tier = 3, @@ -2753,7 +2754,7 @@ M.configs = { install_info = { url = 'https://github.com/kylegoetz/tree-sitter-unison', files = { 'src/parser.c', 'src/scanner.c' }, - requires_generate_from_grammar = true, + generate = true, }, maintainers = { '@tapegram' }, tier = 4, |
