neovim-confs/lua/plex/plugins/extras/lang/go.lua

200 lines
4.8 KiB
Lua

-- This is part of LazyVim's code, with my modifications.
-- See: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/plugins/extras/lang/go.lua
return {
{
'nvim-treesitter/nvim-treesitter',
opts = function(_, opts)
if type(opts.ensure_installed) == 'table' then
vim.list_extend(opts.ensure_installed, {
'go',
'gomod',
'gosum',
'gowork',
})
end
-- Convert a JSON string to a Go struct.
vim.api.nvim_buf_create_user_command(
0,
'JsonToStruct',
---@param args table
function(args)
local range = args.line1 .. ',' .. args.line2
local fname = vim.api.nvim_buf_get_name(0)
local cmd = { '!json-to-struct' }
table.insert(cmd, '-name ' .. vim.fn.fnamemodify(fname, ':t:r'))
table.insert(cmd, '-pkg ' .. vim.fn.fnamemodify(fname, ':h:t:r'))
vim.cmd(range .. ' ' .. table.concat(cmd, ' '))
end,
{ bar = true, nargs = 0, range = true }
)
end,
},
{
'neovim/nvim-lspconfig',
opts = {
servers = {
-- gopls = {
-- settings = {
-- -- https://github.com/golang/tools/blob/master/gopls/doc/settings.md
-- gopls = {
-- gofumpt = true,
-- usePlaceholders = true,
-- completeUnimported = true,
-- staticcheck = true,
-- directoryFilters = {
-- '-.git',
-- '-.vscode',
-- '-.idea',
-- '-.vscode-test',
-- '-node_modules',
-- },
-- semanticTokens = true,
-- codelenses = {
-- gc_details = false,
-- generate = true,
-- regenerate_cgo = true,
-- run_govulncheck = true,
-- test = true,
-- tidy = true,
-- upgrade_dependency = true,
-- vendor = true,
-- },
-- hints = {
-- assignVariableTypes = true,
-- compositeLiteralFields = true,
-- compositeLiteralTypes = true,
-- constantValues = true,
-- functionTypeParameters = true,
-- parameterNames = true,
-- rangeVariableTypes = true,
-- },
-- -- https://github.com/golang/tools/blob/master/gopls/doc/analyzers.md
-- analyses = {
-- fieldalignment = true,
-- nilness = true,
-- unusedparams = true,
-- unusedwrite = true,
-- useany = true,
-- -- fillreturns = true,
-- -- nonewvars = true,
-- -- shadow = true,
-- -- undeclaredname = true,
-- -- unusedvariable = true,
-- -- ST1000 = false,
-- -- ST1005 = false,
-- },
-- },
-- },
-- },
},
setup = {
gopls = function(_, _)
-- workaround for gopls not supporting semanticTokensProvider
-- https://github.com/golang/go/issues/54531#issuecomment-1464982242
require('plex.lib.utils').on_attach(function(client, _)
if client.name == 'gopls' then
if not client.server_capabilities.semanticTokensProvider then
local semantic =
client.config.capabilities.textDocument.semanticTokens
if semantic ~= nil then
client.server_capabilities.semanticTokensProvider = {
full = true,
legend = {
tokenTypes = semantic.tokenTypes,
tokenModifiers = semantic.tokenModifiers,
},
range = true,
}
end
end
end
end)
-- end workaround
end,
},
},
},
{
'mason.nvim',
opts = function(_, opts)
opts.ensure_installed = opts.ensure_installed or {}
vim.list_extend(opts.ensure_installed, {
'gofumpt',
'goimports-reviser',
'gomodifytags',
'impl',
'json-to-struct',
})
end,
},
{
'mhartington/formatter.nvim',
optional = true,
opts = function(_, opts)
opts = opts or {}
local filetypes = {
go = {
require('formatter.filetypes.go').gofumpt,
},
}
opts.filetype = vim.tbl_extend('keep', opts.filetype or {}, filetypes)
end,
},
{
'jose-elias-alvarez/null-ls.nvim',
optional = true,
opts = function(_, opts)
local nls = require('null-ls')
local sources = {
nls.builtins.code_actions.gomodifytags,
nls.builtins.code_actions.impl,
nls.builtins.formatting.gofumpt,
-- nls.builtins.formatting.goimports_reviser,
}
opts.sources = opts.sources or {}
for _, source in ipairs(sources) do
table.insert(opts.sources, source)
end
end,
},
{
'mfussenegger/nvim-dap',
optional = true,
dependencies = {
{
'mason.nvim',
opts = function(_, opts)
opts.ensure_installed = opts.ensure_installed or {}
vim.list_extend(opts.ensure_installed, { 'delve' })
end,
},
{
'leoluz/nvim-dap-go',
config = true,
},
},
},
{
'nvim-neotest/neotest',
optional = true,
dependencies = { 'nvim-neotest/neotest-go' },
opts = {
adapters = {
['neotest-go'] = {
-- Here we can set options for neotest-go, e.g.
-- args = { '-tags=integration' }
},
},
},
},
}