mirror of
https://github.com/neovim/neovim.git
synced 2024-12-19 18:55:14 -07:00
fix(treesitter): run predicates more often in iter_matches
Superseedes #15126, and fixes the issue.
This commit is contained in:
parent
9337fff8aa
commit
458f2aad5c
@ -30,6 +30,7 @@
|
||||
typedef struct {
|
||||
TSQueryCursor *cursor;
|
||||
int predicated_match;
|
||||
int max_match_id;
|
||||
} TSLua_cursor;
|
||||
|
||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||
@ -1055,6 +1056,8 @@ static int query_next_match(lua_State *L)
|
||||
|
||||
static int query_next_capture(lua_State *L)
|
||||
{
|
||||
// Upvalues are:
|
||||
// [ cursor, node, query, current_match ]
|
||||
TSLua_cursor *ud = lua_touserdata(L, lua_upvalueindex(1));
|
||||
TSQueryCursor *cursor = ud->cursor;
|
||||
|
||||
@ -1078,9 +1081,13 @@ static int query_next_capture(lua_State *L)
|
||||
lua_pushinteger(L, capture.index+1); // [index]
|
||||
push_node(L, capture.node, lua_upvalueindex(2)); // [index, node]
|
||||
|
||||
// Now check if we need to run the predicates
|
||||
uint32_t n_pred;
|
||||
ts_query_predicates_for_pattern(query, match.pattern_index, &n_pred);
|
||||
if (n_pred > 0 && capture_index == 0) {
|
||||
|
||||
if (n_pred > 0 && (ud->max_match_id < (int)match.id)) {
|
||||
ud->max_match_id = match.id;
|
||||
|
||||
lua_pushvalue(L, lua_upvalueindex(4)); // [index, node, match]
|
||||
set_match(L, &match, lua_upvalueindex(2));
|
||||
lua_pushinteger(L, match.pattern_index+1);
|
||||
@ -1127,6 +1134,7 @@ static int node_rawquery(lua_State *L)
|
||||
TSLua_cursor *ud = lua_newuserdata(L, sizeof(*ud)); // [udata]
|
||||
ud->cursor = cursor;
|
||||
ud->predicated_match = -1;
|
||||
ud->max_match_id = -1;
|
||||
|
||||
lua_getfield(L, LUA_REGISTRYINDEX, TS_META_QUERYCURSOR);
|
||||
lua_setmetatable(L, -2); // [udata]
|
||||
|
4
third-party/CMakeLists.txt
vendored
4
third-party/CMakeLists.txt
vendored
@ -209,8 +209,8 @@ set(LIBICONV_SHA256 ccf536620a45458d26ba83887a983b96827001e92a13847b45e4925cc891
|
||||
set(TREESITTER_C_URL https://github.com/tree-sitter/tree-sitter-c/archive/5aa0bbb.tar.gz)
|
||||
set(TREESITTER_C_SHA256 a5dcb37460d83002dfae7f9a208170ddbc9a047f231b9d6b75da7d36d707db2f)
|
||||
|
||||
set(TREESITTER_URL https://github.com/tree-sitter/tree-sitter/archive/v0.20.0.tar.gz)
|
||||
set(TREESITTER_SHA256 4a8070b9de17c3b8096181fe8530320ab3e8cca685d8bee6a3e8d164b5fb47da)
|
||||
set(TREESITTER_URL https://github.com/tree-sitter/tree-sitter/archive/7890a29db0b186b7b21a0a95d99fa6c562b8316b.tar.gz)
|
||||
set(TREESITTER_SHA256 634006b0336a5eef1b07d2f80a4d4f8ac1522bf15759ec3e5dda0032a734fb19)
|
||||
|
||||
if(USE_BUNDLED_UNIBILIUM)
|
||||
include(BuildUnibilium)
|
||||
|
Loading…
Reference in New Issue
Block a user