summaryrefslogtreecommitdiff
path: root/lua/blink/cmp/completion/brackets/utils.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/blink/cmp/completion/brackets/utils.lua')
-rw-r--r--lua/blink/cmp/completion/brackets/utils.lua61
1 files changed, 61 insertions, 0 deletions
diff --git a/lua/blink/cmp/completion/brackets/utils.lua b/lua/blink/cmp/completion/brackets/utils.lua
new file mode 100644
index 0000000..cf84f11
--- /dev/null
+++ b/lua/blink/cmp/completion/brackets/utils.lua
@@ -0,0 +1,61 @@
+local config = require('blink.cmp.config').completion.accept.auto_brackets
+local CompletionItemKind = require('blink.cmp.types').CompletionItemKind
+local brackets = require('blink.cmp.completion.brackets.config')
+local utils = {}
+
+--- @param snippet string
+function utils.snippets_extract_placeholders(snippet)
+ local placeholders = {}
+ local pattern = [=[(\$\{(\d+)(:([^}\\]|\\.)*?)?\})]=]
+
+ for _, number, _, _ in snippet:gmatch(pattern) do
+ table.insert(placeholders, tonumber(number))
+ end
+
+ return placeholders
+end
+
+--- @param filetype string
+--- @param item blink.cmp.CompletionItem
+--- @return string[]
+function utils.get_for_filetype(filetype, item)
+ local default = config.default_brackets
+ local per_filetype = config.override_brackets_for_filetypes[filetype] or brackets.per_filetype[filetype]
+
+ if type(per_filetype) == 'function' then return per_filetype(item) or default end
+ return per_filetype or default
+end
+
+--- @param filetype string
+--- @param resolution_method 'kind' | 'semantic_token'
+--- @return boolean
+function utils.should_run_resolution(filetype, resolution_method)
+ -- resolution method specific
+ if not config[resolution_method .. '_resolution'].enabled then return false end
+ local resolution_blocked_filetypes = config[resolution_method .. '_resolution'].blocked_filetypes
+ if vim.tbl_contains(resolution_blocked_filetypes, filetype) then return false end
+
+ -- global
+ if not config.enabled then return false end
+ if vim.tbl_contains(config.force_allow_filetypes, filetype) then return true end
+ return not vim.tbl_contains(config.blocked_filetypes, filetype)
+ and not vim.tbl_contains(brackets.blocked_filetypes, filetype)
+end
+
+--- @param text_edit lsp.TextEdit | lsp.InsertReplaceEdit
+--- @param bracket string
+--- @return boolean
+function utils.has_brackets_in_front(text_edit, bracket)
+ local line = vim.api.nvim_get_current_line()
+ local col = text_edit.range['end'].character + 1
+ return line:sub(col, col) == bracket
+end
+
+--- @param item blink.cmp.CompletionItem
+--- @param _ string[]
+-- TODO: for edge cases, we should probably also take brackets themselves into consideration
+function utils.can_have_brackets(item, _)
+ return item.kind == CompletionItemKind.Function or item.kind == CompletionItemKind.Method
+end
+
+return utils