aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/treesitter.lua
diff options
context:
space:
mode:
authorLewis Russell <lewis6991@gmail.com>2023-03-24 14:43:14 +0000
committerGitHub <noreply@github.com>2023-03-24 14:43:14 +0000
commitcbbf8bd666c8419fdab80a0887948c8a36279c19 (patch)
tree0a7e15ada9d0dd7e3cfe1ed5289707ac2b93bbed /runtime/lua/vim/treesitter.lua
parentee5008f8789f61a3b153220abb870dd49427e52c (diff)
downloadrneovim-cbbf8bd666c8419fdab80a0887948c8a36279c19.tar.gz
rneovim-cbbf8bd666c8419fdab80a0887948c8a36279c19.tar.bz2
rneovim-cbbf8bd666c8419fdab80a0887948c8a36279c19.zip
feat(treesitter)!: deprecate top level indexes to modules (#22761)
The following top level Treesitter functions have been moved: - vim.treesitter.inspect_language() -> vim.treesitter.language.inspect() - vim.treesitter.get_query_files() -> vim.treesitter.query.get_files() - vim.treesitter.set_query() -> vim.treesitter.query.set() - vim.treesitter.query.set_query() -> vim.treesitter.query.set() - vim.treesitter.get_query() -> vim.treesitter.query.get() - vim.treesitter.query.get_query() -> vim.treesitter.query.get() - vim.treesitter.parse_query() -> vim.treesitter.query.parse() - vim.treesitter.query.parse_query() -> vim.treesitter.query.parse() - vim.treesitter.add_predicate() -> vim.treesitter.query.add_predicate() - vim.treesitter.add_directive() -> vim.treesitter.query.add_directive() - vim.treesitter.list_predicates() -> vim.treesitter.query.list_predicates() - vim.treesitter.list_directives() -> vim.treesitter.query.list_directives() - vim.treesitter.query.get_range() -> vim.treesitter.get_range() - vim.treesitter.query.get_node_text() -> vim.treesitter.get_node_text()
Diffstat (limited to 'runtime/lua/vim/treesitter.lua')
-rw-r--r--runtime/lua/vim/treesitter.lua89
1 files changed, 78 insertions, 11 deletions
diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua
index 685b1d8830..4c3b17daa4 100644
--- a/runtime/lua/vim/treesitter.lua
+++ b/runtime/lua/vim/treesitter.lua
@@ -1,6 +1,4 @@
local a = vim.api
-local query = require('vim.treesitter.query')
-local language = require('vim.treesitter.language')
local LanguageTree = require('vim.treesitter.languagetree')
local Range = require('vim.treesitter._range')
@@ -9,12 +7,9 @@ local parsers = setmetatable({}, { __mode = 'v' })
---@class TreesitterModule
---@field highlighter TSHighlighter
-local M = vim.tbl_extend('error', query, language)
-
-M.language_version = vim._ts_get_language_version()
-M.minimum_language_version = vim._ts_get_minimum_language_version()
-
-setmetatable(M, {
+---@field query TSQueryModule
+---@field language TSLanguageModule
+local M = setmetatable({}, {
__index = function(t, k)
---@diagnostic disable:no-unknown
if k == 'highlighter' then
@@ -27,9 +22,26 @@ setmetatable(M, {
t[k] = require('vim.treesitter.query')
return t[k]
end
+
+ local query = require('vim.treesitter.query')
+ if query[k] then
+ vim.deprecate('vim.treesitter.' .. k .. '()', 'vim.treesitter.query.' .. k .. '()', '0.10')
+ t[k] = query[k]
+ return t[k]
+ end
+
+ local language = require('vim.treesitter.language')
+ if language[k] then
+ vim.deprecate('vim.treesitter.' .. k .. '()', 'vim.treesitter.language.' .. k .. '()', '0.10')
+ t[k] = language[k]
+ return t[k]
+ end
end,
})
+M.language_version = vim._ts_get_language_version()
+M.minimum_language_version = vim._ts_get_minimum_language_version()
+
--- Creates a new parser
---
--- It is not recommended to use this; use |get_parser()| instead.
@@ -47,7 +59,7 @@ function M._create_parser(bufnr, lang, opts)
vim.fn.bufload(bufnr)
local ft = vim.bo[bufnr].filetype
- language.add(lang, { filetype = ft ~= '' and ft or nil })
+ M.language.add(lang, { filetype = ft ~= '' and ft or nil })
local self = LanguageTree.new(bufnr, lang, opts)
@@ -101,7 +113,7 @@ function M.get_parser(bufnr, lang, opts)
if lang == nil then
local ft = vim.bo[bufnr].filetype
if ft ~= '' then
- lang = language.get_lang(ft) or ft
+ lang = M.language.get_lang(ft) or ft
-- TODO(lewis6991): we should error here and not default to ft
-- if not lang then
-- error(string.format('filetype %s of buffer %d is not associated with any lang', ft, bufnr))
@@ -152,7 +164,7 @@ function M.get_string_parser(str, lang, opts)
str = { str, 'string' },
lang = { lang, 'string' },
})
- language.add(lang)
+ M.language.add(lang)
return LanguageTree.new(str, lang, opts)
end
@@ -196,6 +208,61 @@ function M.get_node_range(node_or_range)
end
end
+---Get the range of a |TSNode|. Can also supply {source} and {metadata}
+---to get the range with directives applied.
+---@param node TSNode
+---@param source integer|string|nil Buffer or string from which the {node} is extracted
+---@param metadata TSMetadata|nil
+---@return Range6
+function M.get_range(node, source, metadata)
+ if metadata and metadata.range then
+ assert(source)
+ return Range.add_bytes(source, metadata.range)
+ end
+ return { node:range(true) }
+end
+
+---@private
+---@param buf integer
+---@param range Range
+---@returns string
+local function buf_range_get_text(buf, range)
+ local start_row, start_col, end_row, end_col = Range.unpack4(range)
+ if end_col == 0 then
+ if start_row == end_row then
+ start_col = -1
+ start_row = start_row - 1
+ end
+ end_col = -1
+ end_row = end_row - 1
+ end
+ local lines = a.nvim_buf_get_text(buf, start_row, start_col, end_row, end_col, {})
+ return table.concat(lines, '\n')
+end
+
+--- Gets the text corresponding to a given node
+---
+---@param node TSNode
+---@param source (integer|string) Buffer or string from which the {node} is extracted
+---@param opts (table|nil) Optional parameters.
+--- - metadata (table) Metadata of a specific capture. This would be
+--- set to `metadata[capture_id]` when using |vim.treesitter.query.add_directive()|.
+---@return string
+function M.get_node_text(node, source, opts)
+ opts = opts or {}
+ local metadata = opts.metadata or {}
+
+ if metadata.text then
+ return metadata.text
+ elseif type(source) == 'number' then
+ local range = vim.treesitter.get_range(node, source, metadata)
+ return buf_range_get_text(source, range)
+ end
+
+ ---@cast source string
+ return source:sub(select(3, node:start()) + 1, select(3, node:end_()))
+end
+
--- Determines whether (line, col) position is in node range
---
---@param node TSNode defining the range