diff options
Diffstat (limited to 'lua/common_lsp/gopls.lua')
| -rw-r--r-- | lua/common_lsp/gopls.lua | 192 |
1 files changed, 20 insertions, 172 deletions
diff --git a/lua/common_lsp/gopls.lua b/lua/common_lsp/gopls.lua index 96e9df76..306c7f2c 100644 --- a/lua/common_lsp/gopls.lua +++ b/lua/common_lsp/gopls.lua @@ -1,178 +1,26 @@ +local skeleton = require 'common_lsp/skeleton' local util = require 'common_lsp/util' -local api, validate, lsp = vim.api, vim.validate, vim.lsp +local lsp = vim.lsp -local M = {} - -M.name = "gopls" - -local default_config -default_config = { - name = M.name; - cmd = {"gopls"}; - filetype = {"go"}; - root_dir = util.root_pattern("go.mod", ".git"); - log_level = lsp.protocol.MessageType.Warning; - settings = {}; -} - -local function setup_callbacks(config) - config.callbacks = config.callbacks or {} - - config.callbacks["window/logMessage"] = function(err, method, params, client_id) - if params and params.type <= config.log_level then - lsp.builtin_callbacks[method](err, method, params, client_id) - end - end - - config.callbacks["workspace/configuration"] = function(err, method, params, client_id) - if err then error(tostring(err)) end - if not params.items then - return {} - end - - local result = {} - for _, item in ipairs(params.items) do - if item.section then - local value = util.lookup_section(config.settings, item.section) or vim.NIL - -- Uncomment this to debug. - -- print(string.format("config[%q] = %s", item.section, inspect(value))) - table.insert(result, value) - end - end - return result - end -end - --- A function to set up `gopls` easier. --- --- Additionally, it sets up the following commands: --- - SKELETON_SPOOKY_COMMAND: This does something SPOOKY. --- --- {config} is the same as |vim.lsp.add_filetype_config()|, but with some --- additions and changes: --- --- {root_dir} --- REQUIRED function(filename, bufnr) which is called on new candidate --- buffers to attach to and returns either a root_dir or nil. --- If a root_dir is returned, then this file will also be attached. You can --- optionally use {filetype} to help pre-filter by filetype. --- If a root_dir is returned which differs from any previously returned --- root_dir, a new server will be spawned with that root_dir. --- If nil is returned, the buffer is skipped. - --- See |common_lsp.util.search_ancestors()| and the functions which use it: --- - |common_lsp.util.root_pattern(patterns...)| finds an ancestor which a --- descendent which has one of the files in `patterns...`. This is equivalent --- to coc.nvim's "rootPatterns" --- - More specific utilities: --- - |common_lsp.util.find_git_root()| --- - |common_lsp.util.find_node_modules_root()| --- - |common_lsp.util.find_package_json_root()| --- --- Defaults to common_lsp.util.root_pattern("go.mod", ".git") --- --- {name} --- Defaults to "gopls" --- --- {cmd} --- Defaults to {"gopls"} --- --- {filetype} --- Defaults to {"go"}. This is optional and only serves to reduce the scope --- of files to filter for {root_dir}. --- --- {log_level} --- controls the level of logs to show from build processes and other --- window/logMessage events. By default it is set to --- vim.lsp.protocol.MessageType.Warning instead of --- vim.lsp.protocol.MessageType.Log. --- --- {settings} --- This is a table, and the keys are case sensitive. --- Example: `settings = { }` -function M.setup(config) - validate { - root_dir = {config.root_dir, 'f'}; - filetype = {config.filetype, 't', true}; - } - - local filetype = config.filetype or default_config.filetype - - if filetype then - local filetypes - if type(filetype) == 'string' then - filetypes = { filetype } - else - filetypes = filetype - end - api.nvim_command(string.format( - "autocmd FileType %s lua require'common_lsp'[%q].manager.try_add()" - , table.concat(filetypes, ',') - , M.name - )) - else - api.nvim_command(string.format( - "autocmd BufReadPost * lua require'common_lsp'[%q].manager.try_add()" - , M.name - )) - end - - local get_root_dir = config.root_dir or default_config.root_dir - - M.manager = util.server_per_root_dir_manager(function(_root_dir) - local new_config = vim.tbl_extend("keep", config, default_config) - -- Deepcopy anything that is >1 level nested. - new_config.settings = vim.deepcopy(new_config.settings) - util.tbl_deep_extend(new_config.settings, default_config.settings) - - new_config.capabilities = new_config.capabilities or lsp.protocol.make_client_capabilities() - util.tbl_deep_extend(new_config.capabilities, { - workspace = { - configuration = true; - } - }) - - setup_callbacks(new_config) - - new_config.on_attach = util.add_hook_after(new_config.on_attach, function(client, bufnr) - if bufnr == api.nvim_get_current_buf() then - M._setup_buffer() - else - api.nvim_command(string.format( - "autocmd BufEnter <buffer=%d> ++once lua require'common_lsp/%s'._setup_buffer()", - M.name, - bufnr)) - end - end) - return new_config - end) - - function M.manager.try_add() - local root_dir = get_root_dir(api.nvim_buf_get_name(0), api.nvim_get_current_buf()) - print(api.nvim_get_current_buf(), root_dir) - local id = M.manager.add(root_dir) - lsp.buf_attach_client(0, id) - end -end +skeleton.gopls = { + default_config = { + cmd = {"gopls"}; + filetypes = {"go"}; + root_dir = util.root_pattern("go.mod", ".git"); + log_level = lsp.protocol.MessageType.Warning; + settings = {}; + }; + -- on_new_config = function(new_config) end; + -- on_attach = function(client, bufnr) end; + docs = { + description = [[ +https://github.com/golang/tools/tree/master/gopls --- Declare any commands here. You can use additional modifiers like "-range" --- which will be added as command options. All of these commands are buffer --- level by default. -M.commands = { - SKELETON_SPOOKY_COMMAND = { - function() - local bufnr = util.validate_bufnr(0) - print("SPOOKY COMMAND STUFF!", bufnr) - end; +Google's lsp server for golang. +]]; + default_config = { + root_dir = "vim's starting directory"; + }; }; } - -function M._setup_buffer() - -- Create the module commands - util.create_module_commands(M.name, M.commands) -end - -return M -- vim:et ts=2 sw=2 - - |
