diff options
author | Mathias Fussenegger <f.mathias@zignar.net> | 2023-10-21 09:47:24 +0200 |
---|---|---|
committer | Mathias Fußenegger <mfussenegger@users.noreply.github.com> | 2023-10-21 13:49:05 +0200 |
commit | 1e10310f4cc70cf95a68457c2be9e7459b5bbba6 (patch) | |
tree | ba8fa01ace127ddb75554a66a1ff168bb778f8ce /runtime/lua/vim/lsp.lua | |
parent | 9971bea6f1380c15c22f5035d1d33d994f8a6ed7 (diff) | |
download | rneovim-1e10310f4cc70cf95a68457c2be9e7459b5bbba6.tar.gz rneovim-1e10310f4cc70cf95a68457c2be9e7459b5bbba6.tar.bz2 rneovim-1e10310f4cc70cf95a68457c2be9e7459b5bbba6.zip |
refactor(lsp): move completion logic into _completion module
To reduce cross-chatter between modules and for https://github.com/neovim/neovim/issues/25272
Also preparing for https://github.com/neovim/neovim/issues/25714
Diffstat (limited to 'runtime/lua/vim/lsp.lua')
-rw-r--r-- | runtime/lua/vim/lsp.lua | 95 |
1 files changed, 1 insertions, 94 deletions
diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua index 4b1da94d77..82a88772bd 100644 --- a/runtime/lua/vim/lsp.lua +++ b/runtime/lua/vim/lsp.lua @@ -2273,24 +2273,6 @@ function lsp.buf_notify(bufnr, method, params) return resp end ----@private -local function adjust_start_col(lnum, line, items, encoding) - local min_start_char = nil - for _, item in pairs(items) do - if item.textEdit and item.textEdit.range.start.line == lnum - 1 then - if min_start_char and min_start_char ~= item.textEdit.range.start.character then - return nil - end - min_start_char = item.textEdit.range.start.character - end - end - if min_start_char then - return util._str_byteindex_enc(line, min_start_char, encoding) - else - return nil - end -end - --- Implements 'omnifunc' compatible LSP completion. --- ---@see |complete-functions| @@ -2307,82 +2289,7 @@ function lsp.omnifunc(findstart, base) if log.debug() then log.debug('omnifunc.findstart', { findstart = findstart, base = base }) end - - local bufnr = resolve_bufnr() - local clients = lsp.get_clients({ bufnr = bufnr, method = ms.textDocument_completion }) - local remaining = #clients - if remaining == 0 then - return findstart == 1 and -1 or {} - end - - -- Then, perform standard completion request - if log.info() then - log.info('base ', base) - end - - local win = api.nvim_get_current_win() - local pos = api.nvim_win_get_cursor(win) - local line = api.nvim_get_current_line() - local line_to_cursor = line:sub(1, pos[2]) - local _ = log.trace() and log.trace('omnifunc.line', pos, line) - - -- Get the start position of the current keyword - local match_pos = vim.fn.match(line_to_cursor, '\\k*$') + 1 - local items = {} - - local startbyte - - local function on_done() - local mode = api.nvim_get_mode()['mode'] - if mode == 'i' or mode == 'ic' then - vim.fn.complete(startbyte or match_pos, items) - end - end - - for _, client in ipairs(clients) do - local params = util.make_position_params(win, client.offset_encoding) - client.request(ms.textDocument_completion, params, function(err, result) - if err then - log.warn(err.message) - end - if result and vim.fn.mode() == 'i' then - -- Completion response items may be relative to a position different than `textMatch`. - -- Concrete example, with sumneko/lua-language-server: - -- - -- require('plenary.asy| - -- ▲ ▲ ▲ - -- │ │ └── cursor_pos: 20 - -- │ └────── textMatch: 17 - -- └────────────── textEdit.range.start.character: 9 - -- .newText = 'plenary.async' - -- ^^^ - -- prefix (We'd remove everything not starting with `asy`, - -- so we'd eliminate the `plenary.async` result - -- - -- `adjust_start_col` is used to prefer the language server boundary. - -- - local encoding = client.offset_encoding - local candidates = util.extract_completion_items(result) - local curstartbyte = adjust_start_col(pos[1], line, candidates, encoding) - if startbyte == nil then - startbyte = curstartbyte - elseif curstartbyte ~= nil and curstartbyte ~= startbyte then - startbyte = match_pos - end - local prefix = startbyte and line:sub(startbyte + 1) or line_to_cursor:sub(match_pos) - local matches = util.text_document_completion_list_to_complete_items(result, prefix) - vim.list_extend(items, matches) - end - remaining = remaining - 1 - if remaining == 0 then - vim.schedule(on_done) - end - end, bufnr) - end - - -- Return -2 to signal that we should continue completion so that we can - -- async complete. - return -2 + return require('vim.lsp._completion').omnifunc(findstart, base) end --- Provides an interface between the built-in client and a `formatexpr` function. |