aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2019-06-06 12:20:07 +0200
committerBjörn Linse <bjorn.linse@gmail.com>2019-09-28 14:31:03 +0200
commit0e0beef85e4d3932e0d49528d8474794f7b69b01 (patch)
tree44be39a26948d4859afc851de277f4ea2ebf333c
parentcd100963866b2c33a286cbf6aac8e42cd16fd248 (diff)
downloadrneovim-0e0beef85e4d3932e0d49528d8474794f7b69b01.tar.gz
rneovim-0e0beef85e4d3932e0d49528d8474794f7b69b01.tar.bz2
rneovim-0e0beef85e4d3932e0d49528d8474794f7b69b01.zip
tree-sitter: load parsers as .so files
-rw-r--r--runtime/lua/treesitter_rt.lua6
-rw-r--r--src/nvim/lua/executor.c29
2 files changed, 23 insertions, 12 deletions
diff --git a/runtime/lua/treesitter_rt.lua b/runtime/lua/treesitter_rt.lua
index ba7849abd6..1dea22000a 100644
--- a/runtime/lua/treesitter_rt.lua
+++ b/runtime/lua/treesitter_rt.lua
@@ -7,10 +7,6 @@ end
local my_ns = __treesitter_rt_ns
local my_syn_ns = __treesitter_rt_syn_ns
-local path = '.deps/build/src/treesitter-javascript/src/highlights.json'
-a.nvim_set_var("_ts_path", path)
-obj = a.nvim_eval("json_decode(readfile(g:_ts_path,'b'))")
-
--luadev = require'luadev'
--i = require'inspect'
@@ -62,7 +58,7 @@ function create_parser(bufnr)
local ft = a.nvim_buf_get_option(bufnr, "filetype")
local tsstate = {}
tsstate.bufnr = bufnr
- tsstate.parser = vim.ts_parser(ft)
+ tsstate.parser = vim.ts_parser(ft.."_parser.so", ft)
parse_tree(tsstate)
attach_buf(tsstate)
return tsstate
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
index 8b0140f794..1794cee8d8 100644
--- a/src/nvim/lua/executor.c
+++ b/src/nvim/lua/executor.c
@@ -834,16 +834,31 @@ static int unsafe_ptr_to_ts_tree(lua_State *L)
static int create_tslua_parser(lua_State *L)
{
- TSLanguage *tree_sitter_c(void), *tree_sitter_javascript(void);
-
- if (!lua_gettop(L)) {
+ if (lua_gettop(L) < 2) {
return 0;
}
- char *str = lua_tostring(L,1);
+ const char *path = lua_tostring(L,1);
+ const char *lang_name = lua_tostring(L,2);
+
+ // TODO: unsafe!
+ char symbol_buf[128] = "tree_sitter_";
+ STRCAT(symbol_buf, lang_name);
+
+ // TODO: we should maybe keep the uv_lib_t around, and close them
+ // at exit, to keep LeakSanitizer happy.
+ uv_lib_t lib;
+ if (uv_dlopen(path, &lib)) {
+ return luaL_error(L, "uv_dlopen: %s", uv_dlerror(&lib));
+ }
+
+ TSLanguage *(*lang_parser)(void);
+ if (uv_dlsym(&lib, symbol_buf, (void **)&lang_parser)) {
+ return luaL_error(L, "uv_dlsym: %s", uv_dlerror(&lib));
+ }
- TSLanguage *lang = tree_sitter_c();
- if (str && striequal(str, "javascript")) {
- lang = tree_sitter_javascript();
+ TSLanguage *lang = lang_parser();
+ if (lang == NULL) {
+ return luaL_error(L, "failed to load parser");
}
tslua_push_parser(L, lang);
return 1;