neovim/runtime/lua/vim/lsp/buf.lua

137 lines
3.7 KiB
Lua
Raw Normal View History

local vim = vim
2019-11-20 15:21:57 -07:00
local validate = vim.validate
local api = vim.api
local vfn = vim.fn
2019-11-20 15:21:57 -07:00
local util = require 'vim.lsp.util'
local list_extend = vim.list_extend
2019-11-20 15:21:57 -07:00
local M = {}
local function ok_or_nil(status, ...)
2019-11-20 17:16:36 -07:00
if not status then return end
return ...
2019-11-20 15:21:57 -07:00
end
local function npcall(fn, ...)
2019-11-20 17:16:36 -07:00
return ok_or_nil(pcall(fn, ...))
2019-11-20 15:21:57 -07:00
end
local function request(method, params, callback)
2019-11-20 17:16:36 -07:00
validate {
method = {method, 's'};
callback = {callback, 'f', true};
2019-11-20 17:16:36 -07:00
}
return vim.lsp.buf_request(0, method, params, callback)
end
function M.hover()
2019-11-21 16:41:32 -07:00
local params = util.make_position_params()
request('textDocument/hover', params)
2019-11-20 15:21:57 -07:00
end
function M.peek_definition()
2019-11-21 16:41:32 -07:00
local params = util.make_position_params()
request('textDocument/peekDefinition', params)
end
2019-11-20 15:21:57 -07:00
function M.declaration()
2019-11-21 16:41:32 -07:00
local params = util.make_position_params()
request('textDocument/declaration', params)
end
function M.definition()
2019-11-21 16:41:32 -07:00
local params = util.make_position_params()
request('textDocument/definition', params)
2019-11-20 15:21:57 -07:00
end
function M.type_definition()
2019-11-21 16:41:32 -07:00
local params = util.make_position_params()
request('textDocument/typeDefinition', params)
2019-11-20 15:21:57 -07:00
end
function M.implementation()
2019-11-21 16:41:32 -07:00
local params = util.make_position_params()
request('textDocument/implementation', params)
end
function M.signature_help()
2019-11-21 16:41:32 -07:00
local params = util.make_position_params()
request('textDocument/signatureHelp', params)
2019-11-20 15:21:57 -07:00
end
-- TODO(ashkan) ?
function M.completion(context)
2019-11-21 16:41:32 -07:00
local params = util.make_position_params()
2019-11-20 17:16:36 -07:00
params.context = context
return request('textDocument/completion', params)
2019-11-20 15:21:57 -07:00
end
function M.formatting(options)
validate { options = {options, 't', true} }
options = vim.tbl_extend('keep', options or {}, {
tabSize = vim.bo.tabstop;
insertSpaces = vim.bo.expandtab;
})
local params = {
textDocument = { uri = vim.uri_from_bufnr(0) };
options = options;
}
return request('textDocument/formatting', params)
end
function M.range_formatting(options, start_pos, end_pos)
validate {
options = {options, 't', true};
start_pos = {start_pos, 't', true};
end_pos = {end_pos, 't', true};
}
options = vim.tbl_extend('keep', options or {}, {
tabSize = vim.bo.tabstop;
insertSpaces = vim.bo.expandtab;
})
local A = list_extend({}, start_pos or api.nvim_buf_get_mark(0, '<'))
local B = list_extend({}, end_pos or api.nvim_buf_get_mark(0, '>'))
-- convert to 0-index
A[1] = A[1] - 1
B[1] = B[1] - 1
-- account for encoding.
if A[2] > 0 then
A = {A[1], util.character_offset(0, A[1], A[2])}
end
if B[2] > 0 then
B = {B[1], util.character_offset(0, B[1], B[2])}
end
local params = {
textDocument = { uri = vim.uri_from_bufnr(0) };
range = {
start = { line = A[1]; character = A[2]; };
["end"] = { line = B[1]; character = B[2]; };
};
options = options;
}
return request('textDocument/rangeFormatting', params)
2019-11-20 15:21:57 -07:00
end
function M.rename(new_name)
2019-11-20 17:16:36 -07:00
-- TODO(ashkan) use prepareRename
-- * result: [`Range`](#range) \| `{ range: Range, placeholder: string }` \| `null` describing the range of the string to rename and optionally a placeholder text of the string content to be renamed. If `null` is returned then it is deemed that a 'textDocument/rename' request is not valid at the given position.
2019-11-21 16:41:32 -07:00
local params = util.make_position_params()
2019-11-20 17:16:36 -07:00
new_name = new_name or npcall(vfn.input, "New Name: ")
if not (new_name and #new_name > 0) then return end
params.newName = new_name
request('textDocument/rename', params)
end
function M.references(context)
validate { context = { context, 't', true } }
local params = util.make_position_params()
params.context = context or {
includeDeclaration = true;
}
params[vim.type_idx] = vim.types.dictionary
request('textDocument/references', params)
end
2019-11-20 15:21:57 -07:00
return M
2019-11-20 17:16:36 -07:00
-- vim:sw=2 ts=2 et