diff options
| author | Thomas Vigouroux <tomvig38@gmail.com> | 2020-11-23 19:46:27 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-23 12:46:27 -0600 |
| commit | 808765a6c8cde93621f656fa61b0c6223928f51e (patch) | |
| tree | cbbe64a1649317e870297f86d89f222238a51c0a | |
| parent | javascript: : in pairs as punctuation.delimiter (#684) (diff) | |
| download | nvim-treesitter-808765a6c8cde93621f656fa61b0c6223928f51e.tar nvim-treesitter-808765a6c8cde93621f656fa61b0c6223928f51e.tar.gz nvim-treesitter-808765a6c8cde93621f656fa61b0c6223928f51e.tar.bz2 nvim-treesitter-808765a6c8cde93621f656fa61b0c6223928f51e.tar.lz nvim-treesitter-808765a6c8cde93621f656fa61b0c6223928f51e.tar.xz nvim-treesitter-808765a6c8cde93621f656fa61b0c6223928f51e.tar.zst nvim-treesitter-808765a6c8cde93621f656fa61b0c6223928f51e.zip | |
fix: update interface following languagetree merge (#687)
| -rw-r--r-- | README.md | 1 | ||||
| -rw-r--r-- | lua/nvim-treesitter.lua | 3 | ||||
| -rw-r--r-- | lua/nvim-treesitter/highlight.lua | 17 | ||||
| -rw-r--r-- | lua/nvim-treesitter/incremental_selection.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-treesitter/indent.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-treesitter/languagetree.lua | 183 | ||||
| -rw-r--r-- | lua/nvim-treesitter/locals.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-treesitter/parsers.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-treesitter/query.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-treesitter/ts_utils.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-treesitter/tsrange.lua | 2 |
11 files changed, 15 insertions, 203 deletions
@@ -130,7 +130,6 @@ lua <<EOF require'nvim-treesitter.configs'.setup { highlight = { enable = true, - use_languagetree = false, -- Use this to enable language injection (this is very unstable) custom_captures = { -- Highlight the @foo.bar capture group with the "Identifier" highlight group. ["foo.bar"] = "Identifier", diff --git a/lua/nvim-treesitter.lua b/lua/nvim-treesitter.lua index cd1b68509..aeee269d2 100644 --- a/lua/nvim-treesitter.lua +++ b/lua/nvim-treesitter.lua @@ -1,5 +1,6 @@ --TODO(theHamsta): remove once stabilized! -if not pcall(require,"vim.treesitter.query") then +if not pcall(require,"vim.treesitter.languagetree") + and vim.fn.getenv('CI') == 0 then -- TODO(vigoux): remove once new nightlies are built error("nvim-treesitter requires a more recent Neovim nightly version!") end diff --git a/lua/nvim-treesitter/highlight.lua b/lua/nvim-treesitter/highlight.lua index 7d21bed6b..ee68a4ad4 100644 --- a/lua/nvim-treesitter/highlight.lua +++ b/lua/nvim-treesitter/highlight.lua @@ -81,19 +81,14 @@ function M.attach(bufnr, lang) local parser = parsers.get_parser(bufnr, lang) local config = configs.get_module('highlight') - if config.use_languagetree then - local ltree = require'nvim-treesitter.languagetree' - ltree.new(bufnr, lang) - else - for k, v in pairs(config.custom_captures) do - hlmap[k] = v - end + for k, v in pairs(config.custom_captures) do + hlmap[k] = v + end - local query = queries.get_query(lang, "highlights") - if not query then return end + local query = queries.get_query(lang, "highlights") + if not query then return end - M.highlighters[bufnr] = ts.highlighter.new(parser, query) - end + M.highlighters[bufnr] = ts.highlighter.new(parser, query) end function M.detach(bufnr) diff --git a/lua/nvim-treesitter/incremental_selection.lua b/lua/nvim-treesitter/incremental_selection.lua index 8f59fe4ae..fa833f90a 100644 --- a/lua/nvim-treesitter/incremental_selection.lua +++ b/lua/nvim-treesitter/incremental_selection.lua @@ -43,7 +43,7 @@ local function select_incremental(get_parent) local csrow, cscol, cerow, cecol = visual_selection_range() -- Initialize incremental selection with current selection if not nodes or #nodes == 0 or not range_matches(nodes[#nodes]) then - local root = parsers.get_parser():parse():root() + local root = parsers.get_parser():parse()[1]:root() local node = root:named_descendant_for_range(csrow, cscol, cerow, cecol) ts_utils.update_selection(buf, node) if nodes and #nodes > 0 then diff --git a/lua/nvim-treesitter/indent.lua b/lua/nvim-treesitter/indent.lua index b747156af..cfc3f8a94 100644 --- a/lua/nvim-treesitter/indent.lua +++ b/lua/nvim-treesitter/indent.lua @@ -40,7 +40,7 @@ function M.get_indent(lnum) local parser = parsers.get_parser() if not parser or not lnum then return -1 end - local node = get_node_at_line(parser:parse():root(), lnum-1) + local node = get_node_at_line(parser:parse()[1]:root(), lnum-1) local indent_queries = get_indents(vim.api.nvim_get_current_buf()) local indents = indent_queries.indents local branches = indent_queries.branches diff --git a/lua/nvim-treesitter/languagetree.lua b/lua/nvim-treesitter/languagetree.lua deleted file mode 100644 index 446c7e44a..000000000 --- a/lua/nvim-treesitter/languagetree.lua +++ /dev/null @@ -1,183 +0,0 @@ -local parsers = require'nvim-treesitter.parsers' -local queries = require'nvim-treesitter.query' -local tsutils = require'nvim-treesitter.ts_utils' -local TSHighlighter = require'vim.treesitter.highlighter' - -local ns = vim.api.nvim_create_namespace("treesitter/highlighter") - -local LanguageTree = {} -LanguageTree.__index = LanguageTree - -local trees = { } - -function LanguageTree.new(bufnr, lang, not_root) - local buf - if not bufnr or bufnr == 0 then - buf = vim.api.nvim_get_current_buf() - else - buf = bufnr - end - - local parser = parsers.get_parser(buf, parsers.ft_to_lang(lang)) - if not parser then return end - - local query = queries.get_query(lang, "highlights") - if not query then return end - - local self = setmetatable( - { - highlighter = TSHighlighter.new(parser, query), - parser = parser, - children = {} - }, - LanguageTree) - - if not not_root then - trees[buf] = self - self.parser:register_cbs{ - on_bytes = function() self:update() end - } - end - - -- First setup - self:update() - - return self -end - -function LanguageTree:add_child(lang, child) - if not vim.tbl_contains(self.children, child) then - table.insert(self.children, child) - end -end - -function LanguageTree:remove_child(lang) - self.children[lang] = nil -end - -function LanguageTree:node_for_range(range) - for _, child in pairs(self.children) do - if child:contains(range) then - return child:node_for_range(range) - end - end -end - -function LanguageTree:nodes_for_line(range, result) - result = result or {} - - if self:contains(range, true) then - table.insert(result, self) - end - - for _, child in pairs(self.children) do - if child:contains(range, true) then - child:nodes_for_line(range, result) - end - end - - return result -end - -local function range_contains_line(source, dest) - return source[1] <= dest[1] and source[3] >= dest[3] -end - -local function range_contains(source, dest) - local start_fits = source[1] < dest[1] or (source[1] == dest[1] and source[2] <= dest[2]) - local end_fits = source[3] > dest[3] or (source[3] == dest[3] and source[4] >= dest[4]) - - return start_fits and end_fits -end - -function LanguageTree:contains(range, line_only) - for _, source in pairs(self.parser:included_ranges()) do - local contains_fn = line_only and range_contains_line or range_contains - - if contains_fn(source, range) then - return true - end - end - - return false -end - -function LanguageTree:update() - local query = queries.get_query(self.parser.lang, "injections") - if not query then return end - - local root = self.parser:parse():root() - local startl, _, stopl, _ = root:range() - - local injections = {} - - -- Find injections - for inj in queries.iter_prepared_matches(query, root, self.parser.bufnr, startl, stopl+1) do - local lang = inj.lang - - if type(lang) ~= "string" then - lang = tsutils.get_node_text(lang.node, self.parser.bufnr)[1] - end - - if not lang or not inj.injection.node then - vim.api.nvim_err_writeln("Invalid match encountered") - return nil - end - - if not injections[lang] then - injections[lang] = {} - end - - table.insert(injections[lang], inj.injection.node) - end - - local seen = {} - - -- Update each child accordingly - -- TODO(vigoux): for now avoid languages that include themselves, will - -- be fixed when managing our own parsers - for lang, ranges in pairs(injections) do - - if lang ~= self.parser.lang then - - if not self.children[lang] then - self.children[lang] = LanguageTree.new(self.parser.bufnr, lang, true) - end - - if self.children[lang] then - self.children[lang].parser:set_included_ranges(ranges) - self.children[lang]:update() - seen[lang] = true - end - end - end - - -- Clean up unused parsers - for lang, _ in pairs(self.children) do - if not seen[lang] then - self:remove_child(lang) - end - end -end - -function LanguageTree._on_line(_, _win, buf, line) - local tree = trees[buf] - if not tree then return end - - local line_len = #(vim.api.nvim_buf_get_lines(buf, line, line + 1, false)[1]) - - local matches = tree:nodes_for_line { line, 0, line, line_len } -- TODO proper search here - - -- Matches are from least specific to most specific range (parent -> child) - for _, match in ipairs(matches) do - TSHighlighter._on_line("line", _win, buf, line, match.highlighter) - end -end - -vim.api.nvim_set_decoration_provider(ns, { - on_buf = TSHighlighter._on_buf; - on_win = TSHighlighter._on_win; - on_line = LanguageTree._on_line; -}) - -return LanguageTree diff --git a/lua/nvim-treesitter/locals.lua b/lua/nvim-treesitter/locals.lua index 4535fa600..e42de404a 100644 --- a/lua/nvim-treesitter/locals.lua +++ b/lua/nvim-treesitter/locals.lua @@ -235,7 +235,7 @@ function M.find_usages(node, scope_node, bufnr) if not node_text or #node_text < 1 then return {} end - local scope_node = scope_node or parsers.get_parser(bufnr):parse():root() + local scope_node = scope_node or parsers.get_parser(bufnr):parse()[1]:root() local usages = {} for match in M.iter_locals(bufnr, scope_node) do diff --git a/lua/nvim-treesitter/parsers.lua b/lua/nvim-treesitter/parsers.lua index ef6ecfdf8..6a443712e 100644 --- a/lua/nvim-treesitter/parsers.lua +++ b/lua/nvim-treesitter/parsers.lua @@ -406,7 +406,7 @@ end function M.get_tree_root(bufnr) local bufnr = bufnr or api.nvim_get_current_buf() - return M.get_parser(bufnr):parse():root() + return M.get_parser(bufnr):parse()[1]:root() end -- get language of given buffer diff --git a/lua/nvim-treesitter/query.lua b/lua/nvim-treesitter/query.lua index 4cb5993b4..11e5ce97b 100644 --- a/lua/nvim-treesitter/query.lua +++ b/lua/nvim-treesitter/query.lua @@ -179,7 +179,7 @@ function M.iter_group_results(bufnr, query_group, root) local parser = parsers.get_parser(bufnr, lang) if not parser then return function() end end - local root = root or parser:parse():root() + local root = root or parser:parse()[1]:root() local start_row, _, end_row, _ = root:range() -- The end row is exclusive so we need to add 1 to it. diff --git a/lua/nvim-treesitter/ts_utils.lua b/lua/nvim-treesitter/ts_utils.lua index b235c0139..a7c38feb6 100644 --- a/lua/nvim-treesitter/ts_utils.lua +++ b/lua/nvim-treesitter/ts_utils.lua @@ -116,7 +116,7 @@ end function M.get_node_at_cursor(winnr) if not parsers.has_parser() then return end local cursor = api.nvim_win_get_cursor(winnr or 0) - local root = parsers.get_parser():parse():root() + local root = parsers.get_parser():parse()[1]:root() return root:named_descendant_for_range(cursor[1]-1,cursor[2],cursor[1]-1,cursor[2]) end diff --git a/lua/nvim-treesitter/tsrange.lua b/lua/nvim-treesitter/tsrange.lua index b8205c4b6..051f90c48 100644 --- a/lua/nvim-treesitter/tsrange.lua +++ b/lua/nvim-treesitter/tsrange.lua @@ -57,7 +57,7 @@ end function TSRange:parent(range) local parser = parsers.get_parser(self.buf, parsers.get_buf_lang(range)) - local root = parser:parse():root() + local root = parser:parse()[1]:root() return root:named_descendant_for_range(self.start_pos[1], self.start_pos[2], self.end_pos[1], self.end_pos[2]) end |
