diff options
author | Lewis Russell <lewis6991@gmail.com> | 2024-04-21 13:39:08 +0100 |
---|---|---|
committer | Lewis Russell <me@lewisr.dev> | 2024-04-21 14:09:27 +0100 |
commit | 032df963bb3fb0b5652e1817e9f4da986996fa6d (patch) | |
tree | e054b828f670214b6bde1228f25233659b41df66 /src | |
parent | 6d732ad3c9a131bf913807ee9670ca0ea98e4d8e (diff) | |
download | rneovim-032df963bb3fb0b5652e1817e9f4da986996fa6d.tar.gz rneovim-032df963bb3fb0b5652e1817e9f4da986996fa6d.tar.bz2 rneovim-032df963bb3fb0b5652e1817e9f4da986996fa6d.zip |
refactor(treesitter): language loading
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/lua/treesitter.c | 61 |
1 files changed, 31 insertions, 30 deletions
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; |