aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
authorThomas Vigouroux <39092278+vigoux@users.noreply.github.com>2020-04-19 20:38:51 +0200
committerGitHub <noreply@github.com>2020-04-19 20:38:51 +0200
commit05be31024adc868af782c51dd63c6ccdfbfeb2a9 (patch)
tree45970745e65c16d52bcb93db4a4a466c6f9f105c /lua
parentMerge pull request #2 from kyazdani42/install-parser (diff)
parentperf: don't compute locals on buffer updates (diff)
downloadnvim-treesitter-05be31024adc868af782c51dd63c6ccdfbfeb2a9.tar
nvim-treesitter-05be31024adc868af782c51dd63c6ccdfbfeb2a9.tar.gz
nvim-treesitter-05be31024adc868af782c51dd63c6ccdfbfeb2a9.tar.bz2
nvim-treesitter-05be31024adc868af782c51dd63c6ccdfbfeb2a9.tar.lz
nvim-treesitter-05be31024adc868af782c51dd63c6ccdfbfeb2a9.tar.xz
nvim-treesitter-05be31024adc868af782c51dd63c6ccdfbfeb2a9.tar.zst
nvim-treesitter-05be31024adc868af782c51dd63c6ccdfbfeb2a9.zip
Merge pull request #3 from vigoux/feature/locals
Add locals handling
Diffstat (limited to 'lua')
-rw-r--r--lua/nvim-treesitter.lua1
-rw-r--r--lua/nvim-treesitter/locals.lua91
-rw-r--r--lua/nvim-treesitter/parsers.lua10
-rw-r--r--lua/nvim-treesitter/query.lua2
4 files changed, 100 insertions, 4 deletions
diff --git a/lua/nvim-treesitter.lua b/lua/nvim-treesitter.lua
index abb3b6d91..8dae7c33b 100644
--- a/lua/nvim-treesitter.lua
+++ b/lua/nvim-treesitter.lua
@@ -1,6 +1,7 @@
local api = vim.api
local parsers = require'nvim-treesitter.parsers'
local install = require'nvim-treesitter.install'
+local locals = require'nvim-treesitter.locals'
local M = {}
diff --git a/lua/nvim-treesitter/locals.lua b/lua/nvim-treesitter/locals.lua
new file mode 100644
index 000000000..808b0f3ff
--- /dev/null
+++ b/lua/nvim-treesitter/locals.lua
@@ -0,0 +1,91 @@
+-- Functions to handle locals
+-- Locals are a generalization of definition and scopes
+-- its the way nvim-treesitter uses to "understand" the code
+local api = vim.api
+local ts = vim.treesitter
+local queries = require'nvim-treesitter.query'
+local parsers = require'nvim-treesitter.parsers'
+
+local M = {
+ locals={}
+}
+
+function M.collect_locals(bufnr)
+ local ft = api.nvim_buf_get_option(bufnr, "ft")
+ if not ft then return end
+
+ local query = queries.get_query(ft, 'locals')
+ if not query then return end
+
+ local parser = parsers.get_parser(bufnr, ft)
+ if not parser then return end
+
+ local root = parser:parse():root()
+ local start_row, _, end_row, _ = root:range()
+
+ local locals = {}
+
+ for prepared_match in queries.iter_prepared_matches(query, root, bufnr, start_row, end_row) do
+ table.insert(locals, prepared_match)
+ end
+
+ return locals
+end
+
+local function update_cached_locals(bufnr, changed_tick)
+ M.locals[bufnr] = {tick=changed_tick, cache=( M.collect_locals(bufnr) or {} )}
+end
+
+function M.get_locals(bufnr)
+ local bufnr = bufnr or api.nvim_get_current_buf()
+ local cached_local = M.locals[bufnr]
+ if not cached_local or api.nvim_buf_get_changedtick(bufnr) < cached_local.tick then
+ update_cached_locals(bufnr,api.nvim_buf_get_changedtick(bufnr))
+ end
+
+ return M.locals[bufnr].cache
+end
+
+function M.get_definitions(bufnr)
+ local locals = M.get_locals(bufnr)
+
+ local defs = {}
+
+ for _, loc in ipairs(locals) do
+ if loc.definition then
+ table.insert(defs, {definition=loc.definition, kind=loc.kind})
+ end
+ end
+
+ return defs
+end
+
+function M.get_scopes(bufnr)
+ local locals = M.get_locals(bufnr)
+
+ local scopes = {}
+
+ for _, loc in ipairs(locals) do
+ if loc.scope then
+ table.insert(scopes, loc.scope)
+ end
+ end
+
+ return scopes
+end
+
+function M.get_references(bufnr)
+ local locals = M.get_locals(bufnr)
+
+ local refs = {}
+
+ for _, loc in ipairs(locals) do
+ if loc.reference then
+ table.insert(refs, loc.reference)
+ end
+ end
+
+ return refs
+end
+
+return M
diff --git a/lua/nvim-treesitter/parsers.lua b/lua/nvim-treesitter/parsers.lua
index c85177733..e046ca45c 100644
--- a/lua/nvim-treesitter/parsers.lua
+++ b/lua/nvim-treesitter/parsers.lua
@@ -8,13 +8,17 @@ function M.has_parser(lang)
return #api.nvim_get_runtime_file('parser/' .. lang .. '.*', false) > 0
end
-function M.get_parser(bufnr)
+function M.get_parser(bufnr, lang)
if M.has_parser() then
local buf = bufnr or api.nvim_get_current_buf()
+ local lang = lang or api.nvim_buf_get_option(buf, 'ft')
if not M[buf] then
- M[buf] = ts.get_parser(buf)
+ M[buf] = {}
end
- return M[buf]
+ if not M[buf][lang] then
+ M[buf][lang] = ts.get_parser(buf, lang)
+ end
+ return M[buf][lang]
end
end
diff --git a/lua/nvim-treesitter/query.lua b/lua/nvim-treesitter/query.lua
index be650c795..e9f671f93 100644
--- a/lua/nvim-treesitter/query.lua
+++ b/lua/nvim-treesitter/query.lua
@@ -54,7 +54,7 @@ function M.iter_prepared_matches(query, qnode, bufnr, start_row, end_row)
local name = query.captures[id] -- name of the capture in the query
if name ~= nil then
local path = split(name)
- insert_to_path(prepared_match, path, node)
+ insert_to_path(prepared_match, path, { node=node })
end
end