diff options
author | Thomas Vigouroux <tomvig38@gmail.com> | 2020-10-12 20:28:04 +0200 |
---|---|---|
committer | Thomas Vigouroux <tomvig38@gmail.com> | 2020-11-01 12:40:31 +0100 |
commit | d3a63a1f71eceac68cb25ff8eb4e45037fbc0ee2 (patch) | |
tree | 2b508c845af1df5846f84ed8e7f56021d2b644b4 | |
parent | ca7449db46062098cc9b0c84401655cba7d3a53f (diff) | |
download | rneovim-d3a63a1f71eceac68cb25ff8eb4e45037fbc0ee2.tar.gz rneovim-d3a63a1f71eceac68cb25ff8eb4e45037fbc0ee2.tar.bz2 rneovim-d3a63a1f71eceac68cb25ff8eb4e45037fbc0ee2.zip |
tree-sitter: error out when parsing fails
This can happen when there is ABI mismatches, and removes the assumption
parsing alwasy succeeds (which is wrong).
-rw-r--r-- | src/nvim/lua/treesitter.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/nvim/lua/treesitter.c b/src/nvim/lua/treesitter.c index 5258352e72..55ffe7a898 100644 --- a/src/nvim/lua/treesitter.c +++ b/src/nvim/lua/treesitter.c @@ -176,7 +176,8 @@ int tslua_add_language(lua_State *L) } uint32_t lang_version = ts_language_version(lang); - if (lang_version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION) { + if (lang_version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION + || lang_version > TREE_SITTER_LANGUAGE_VERSION) { return luaL_error( L, "ABI version mismatch : expected %" PRIu32 ", found %" PRIu32, @@ -246,7 +247,12 @@ int tslua_push_parser(lua_State *L) } TSParser *parser = ts_parser_new(); - ts_parser_set_language(parser, lang); + + if (!ts_parser_set_language(parser, lang)) { + ts_parser_delete(parser); + return luaL_error(L, "Failed to load language : %s", lang_name); + } + TSLua_parser *p = lua_newuserdata(L, sizeof(TSLua_parser)); // [udata] p->parser = parser; p->tree = NULL; @@ -342,7 +348,7 @@ static int parser_parse(lua_State *L) return 0; } - TSTree *new_tree; + TSTree *new_tree = NULL; size_t len; const char *str; long bufnr; @@ -374,6 +380,12 @@ static int parser_parse(lua_State *L) return luaL_error(L, "invalid argument to parser:parse()"); } + // Sometimes parsing fails (timeout, or wrong parser ABI) + // In those case, just return an error. + if (!new_tree) { + return luaL_error(L, "An error occured when parsing."); + } + uint32_t n_ranges = 0; TSRange *changed = p->tree ? ts_tree_get_changed_ranges(p->tree, new_tree, &n_ranges) : NULL; |