diff options
-rw-r--r-- | runtime/lua/treesitter_rt.lua | 6 | ||||
-rw-r--r-- | src/nvim/lua/executor.c | 29 |
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; |