aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2020-01-25 13:43:41 +0100
committerBjörn Linse <bjorn.linse@gmail.com>2020-02-07 09:22:55 +0100
commit00c57c98dfb2df58875a3d9ad8fc557ec9a24cba (patch)
tree15541520aa60732b476fa14f87f0d0b123d995c6 /runtime/lua/vim
parent64807303df34318c075a6c9ba1e9ee350135748f (diff)
downloadrneovim-00c57c98dfb2df58875a3d9ad8fc557ec9a24cba.tar.gz
rneovim-00c57c98dfb2df58875a3d9ad8fc557ec9a24cba.tar.bz2
rneovim-00c57c98dfb2df58875a3d9ad8fc557ec9a24cba.zip
treesitter: add standard &rtp/parser/ search path for parsers
Diffstat (limited to 'runtime/lua/vim')
-rw-r--r--runtime/lua/vim/treesitter.lua31
1 files changed, 26 insertions, 5 deletions
diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua
index aa8b8fcdd1..0d0e22adb3 100644
--- a/runtime/lua/vim/treesitter.lua
+++ b/runtime/lua/vim/treesitter.lua
@@ -31,8 +31,6 @@ function Parser:_on_lines(bufnr, _, start_row, old_stop_row, stop_row, old_byte_
end
local M = {
- add_language=vim._ts_add_language,
- inspect_language=vim._ts_inspect_language,
parse_query = vim._ts_parse_query,
}
@@ -45,12 +43,34 @@ setmetatable(M, {
end
})
-function M.create_parser(bufnr, ft, id)
+function M.require_language(lang, path)
+ if vim._ts_has_language(lang) then
+ return true
+ end
+ if path == nil then
+ local fname = 'parser/' .. lang .. '.*'
+ local paths = a.nvim_get_runtime_file(fname, false)
+ if #paths == 0 then
+ -- TODO(bfredl): help tag?
+ error("no parser for '"..lang.."' language")
+ end
+ path = paths[1]
+ end
+ vim._ts_add_language(path, lang)
+end
+
+function M.inspect_language(lang)
+ M.require_language(lang)
+ return vim._ts_inspect_language(lang)
+end
+
+function M.create_parser(bufnr, lang, id)
+ M.require_language(lang)
if bufnr == 0 then
bufnr = a.nvim_get_current_buf()
end
- local self = setmetatable({bufnr=bufnr, lang=ft, valid=false}, Parser)
- self._parser = vim._create_ts_parser(ft)
+ local self = setmetatable({bufnr=bufnr, lang=lang, valid=false}, Parser)
+ self._parser = vim._create_ts_parser(lang)
self.change_cbs = {}
self:parse()
-- TODO(bfredl): use weakref to self, so that the parser is free'd is no plugin is
@@ -94,6 +114,7 @@ local Query = {}
Query.__index = Query
function M.parse_query(lang, query)
+ M.require_language(lang)
local self = setmetatable({}, Query)
self.query = vim._ts_parse_query(lang, query)
self.info = self.query:inspect()