-- 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' } }, }, }, }, }