diff options
author | Thomas Vigouroux <tomvig38@gmail.com> | 2020-09-01 13:15:37 +0200 |
---|---|---|
committer | Björn Linse <bjorn.linse@gmail.com> | 2020-09-06 10:30:39 +0200 |
commit | 20c1526552f4f402e4acb24486da9f05d9344741 (patch) | |
tree | 86608809f7b9a33d2e0fc0d342dad939677a78ab /runtime/lua/vim/treesitter/query.lua | |
parent | 2d6437f5fbe162dbe5d177854382d12118682ecc (diff) | |
download | rneovim-20c1526552f4f402e4acb24486da9f05d9344741.tar.gz rneovim-20c1526552f4f402e4acb24486da9f05d9344741.tar.bz2 rneovim-20c1526552f4f402e4acb24486da9f05d9344741.zip |
treesitter: simplify match_preds
Diffstat (limited to 'runtime/lua/vim/treesitter/query.lua')
-rw-r--r-- | runtime/lua/vim/treesitter/query.lua | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/runtime/lua/vim/treesitter/query.lua b/runtime/lua/vim/treesitter/query.lua index 46b54ad079..95057facc0 100644 --- a/runtime/lua/vim/treesitter/query.lua +++ b/runtime/lua/vim/treesitter/query.lua @@ -135,25 +135,38 @@ function M.list_predicates() return vim.tbl_keys(predicate_handlers) end +local function xor(a, b) + return (a or b) and not (a and b) +end + function Query:match_preds(match, pattern, bufnr) local preds = self.info.patterns[pattern] - if not preds then - return true - end - for _, pred in pairs(preds) do + + for _, pred in pairs(preds or {}) do -- Here we only want to return if a predicate DOES NOT match, and -- continue on the other case. This way unknown predicates will not be considered, -- which allows some testing and easier user extensibility (#12173). -- Also, tree-sitter strips the leading # from predicates for us. + local pred_name + local is_not if string.sub(pred[1], 1, 4) == "not-" then - local pred_name = string.sub(pred[1], 5) - if predicate_handlers[pred_name] and - predicate_handlers[pred_name](match, pattern, bufnr, pred) then - return false - end + pred_name = string.sub(pred[1], 5) + is_not = true + else + pred_name = pred[1] + is_not = false + end + + local handler = predicate_handlers[pred_name] + + if not handler then + a.nvim_err_writeln(string.format("No handler for %s", pred[1])) + return false + end + + local pred_matches = handler(match, pattern, bufnr, pred) - elseif predicate_handlers[pred[1]] and - not predicate_handlers[pred[1]](match, pattern, bufnr, pred) then + if not xor(is_not, pred_matches) then return false end end |