return { { "nvim-treesitter/nvim-treesitter", opts = function(_, opts) vim.list_extend(opts.ensure_installed, { "go", "gomod", "gowork", "gosum", }) end, }, { "neovim/nvim-lspconfig", opts = { servers = { gopls = { keys = { -- Workaround for the lack of a DAP strategy in neotest-go: https://github.com/nvim-neotest/neotest-go/issues/12 { "td", "lua require('dap-go').debug_test()", desc = "Debug Nearest (Go)" }, }, settings = { gopls = { gofumpt = 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, }, analyses = { fieldalignment = true, nilness = true, unusedparams = true, unusedwrite = true, useany = true, }, usePlaceholders = true, completeUnimported = true, staticcheck = true, directoryFilters = { "-.git", "-.vscode", "-.idea", "-.vscode-test", "-node_modules" }, semanticTokens = true, }, }, }, }, setup = { gopls = function(_, opts) -- workaround for gopls not supporting semanticTokensProvider -- https://github.com/golang/go/issues/54531#issuecomment-1464982242 require("lazyvim.util").lsp.on_attach(function(client, _) if client.name == "gopls" then if not client.server_capabilities.semanticTokensProvider then local semantic = client.config.capabilities.textDocument.semanticTokens client.server_capabilities.semanticTokensProvider = { full = true, legend = { tokenTypes = semantic.tokenTypes, tokenModifiers = semantic.tokenModifiers, }, range = true, } end end end) -- end workaround end, }, }, }, -- Ensure Go tools are installed { "williamboman/mason.nvim", opts = function(_, opts) opts.ensure_installed = opts.ensure_installed or {} vim.list_extend(opts.ensure_installed, { "goimports", "gofumpt" }) end, }, { "nvimtools/none-ls.nvim", optional = true, dependencies = { { "williamboman/mason.nvim", opts = function(_, opts) opts.ensure_installed = opts.ensure_installed or {} vim.list_extend(opts.ensure_installed, { "gomodifytags", "impl" }) end, }, }, opts = function(_, opts) local nls = require("null-ls") opts.sources = vim.list_extend(opts.sources or {}, { nls.builtins.code_actions.gomodifytags, nls.builtins.code_actions.impl, nls.builtins.formatting.goimports, nls.builtins.formatting.gofumpt, }) end, }, { "stevearc/conform.nvim", optional = true, opts = { formatters_by_ft = { go = { "goimports", "gofumpt" }, }, }, }, { "mfussenegger/nvim-dap", optional = true, dependencies = { { "williamboman/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" } }, }, }, }, }