aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLewis Russell <lewis6991@gmail.com>2024-04-21 13:39:08 +0100
committerLewis Russell <me@lewisr.dev>2024-04-21 14:09:27 +0100
commit032df963bb3fb0b5652e1817e9f4da986996fa6d (patch)
treee054b828f670214b6bde1228f25233659b41df66
parent6d732ad3c9a131bf913807ee9670ca0ea98e4d8e (diff)
downloadrneovim-032df963bb3fb0b5652e1817e9f4da986996fa6d.tar.gz
rneovim-032df963bb3fb0b5652e1817e9f4da986996fa6d.tar.bz2
rneovim-032df963bb3fb0b5652e1817e9f4da986996fa6d.zip
refactor(treesitter): language loading
-rw-r--r--runtime/lua/vim/treesitter/_meta.lua8
-rw-r--r--src/nvim/lua/treesitter.c61
2 files changed, 39 insertions, 30 deletions
diff --git a/runtime/lua/vim/treesitter/_meta.lua b/runtime/lua/vim/treesitter/_meta.lua
index e2768d4b06..34a51e42f6 100644
--- a/runtime/lua/vim/treesitter/_meta.lua
+++ b/runtime/lua/vim/treesitter/_meta.lua
@@ -60,9 +60,17 @@ local TSNode = {}
---@field captures string[]
---@field patterns table<integer, (integer|string)[][]>
+--- @param lang string
+vim._ts_inspect_language = function(lang) end
+
---@return integer
vim._ts_get_language_version = function() end
+--- @param path string
+--- @param lang string
+--- @param symbol_name? string
+vim._ts_add_language = function(path, lang, symbol_name) end
+
---@return integer
vim._ts_get_minimum_language_version = function() end
diff --git a/src/nvim/lua/treesitter.c b/src/nvim/lua/treesitter.c
index f2ced71ddc..f4bc454790 100644
--- a/src/nvim/lua/treesitter.c
+++ b/src/nvim/lua/treesitter.c
@@ -62,6 +62,35 @@ int tslua_has_language(lua_State *L)
return 1;
}
+static TSLanguage *load_language(lua_State *L, const char *path, const char *lang_name,
+ const char *symbol)
+{
+ uv_lib_t lib;
+ if (uv_dlopen(path, &lib)) {
+ uv_dlclose(&lib);
+ luaL_error(L, "Failed to load parser for language '%s': uv_dlopen: %s",
+ lang_name, uv_dlerror(&lib));
+ }
+
+ char symbol_buf[128];
+ snprintf(symbol_buf, sizeof(symbol_buf), "tree_sitter_%s", symbol);
+
+ TSLanguage *(*lang_parser)(void);
+ if (uv_dlsym(&lib, symbol_buf, (void **)&lang_parser)) {
+ uv_dlclose(&lib);
+ luaL_error(L, "Failed to load parser: uv_dlsym: %s", uv_dlerror(&lib));
+ }
+
+ TSLanguage *lang = lang_parser();
+
+ if (lang == NULL) {
+ uv_dlclose(&lib);
+ luaL_error(L, "Failed to load parser %s: internal error", path);
+ }
+
+ return lang;
+}
+
// Creates the language into the internal language map.
//
// Returns true if the language is correctly loaded in the language map
@@ -80,34 +109,7 @@ int tslua_add_language(lua_State *L)
return 1;
}
-#define BUFSIZE 128
- char symbol_buf[BUFSIZE];
- snprintf(symbol_buf, BUFSIZE, "tree_sitter_%s", symbol_name);
-#undef BUFSIZE
-
- uv_lib_t lib;
- if (uv_dlopen(path, &lib)) {
- snprintf(IObuff, IOSIZE, "Failed to load parser for language '%s': uv_dlopen: %s",
- lang_name, uv_dlerror(&lib));
- uv_dlclose(&lib);
- lua_pushstring(L, IObuff);
- return lua_error(L);
- }
-
- TSLanguage *(*lang_parser)(void);
- if (uv_dlsym(&lib, symbol_buf, (void **)&lang_parser)) {
- snprintf(IObuff, IOSIZE, "Failed to load parser: uv_dlsym: %s",
- uv_dlerror(&lib));
- uv_dlclose(&lib);
- lua_pushstring(L, IObuff);
- return lua_error(L);
- }
-
- TSLanguage *lang = lang_parser();
- if (lang == NULL) {
- uv_dlclose(&lib);
- return luaL_error(L, "Failed to load parser %s: internal error", path);
- }
+ TSLanguage *lang = load_language(L, path, lang_name, symbol_name);
uint32_t lang_version = ts_language_version(lang);
if (lang_version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION
@@ -184,8 +186,7 @@ int tslua_inspect_lang(lua_State *L)
lua_setfield(L, -2, "fields"); // [retval]
- uint32_t lang_version = ts_language_version(lang);
- lua_pushinteger(L, lang_version); // [retval, version]
+ lua_pushinteger(L, ts_language_version(lang)); // [retval, version]
lua_setfield(L, -2, "_abi_version");
return 1;