From 8aae70026da3769bf16530aa513ffedeb95dd84c Mon Sep 17 00:00:00 2001 From: Snoweuph Date: Sun, 1 Feb 2026 04:11:10 +0100 Subject: [PATCH] language/go: add `golangci-lint` for extra diagnostics (#1376) --- docs/manual/release-notes/rl-0.9.md | 2 + modules/plugins/languages/go.nix | 105 +++++++++++++++++++++++++++- 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/docs/manual/release-notes/rl-0.9.md b/docs/manual/release-notes/rl-0.9.md index 08a5cc63..e31a07e8 100644 --- a/docs/manual/release-notes/rl-0.9.md +++ b/docs/manual/release-notes/rl-0.9.md @@ -164,6 +164,8 @@ - Added [tera](https://keats.github.io/tera/) language support (syntax highlighting only). +- Added [`golangci-lint`](https://golangci-lint.run/) for more diagnostics. + [vagahbond](https://github.com/vagahbond): [codewindow.nvim]: https://github.com/gorbit99/codewindow.nvim diff --git a/modules/plugins/languages/go.nix b/modules/plugins/languages/go.nix index c51077f9..bfaafd0d 100644 --- a/modules/plugins/languages/go.nix +++ b/modules/plugins/languages/go.nix @@ -10,7 +10,7 @@ inherit (lib.meta) getExe; inherit (lib.generators) mkLuaInline; inherit (lib.types) bool enum package; - inherit (lib.nvim.types) mkGrammarOption deprecatedSingleOrListOf; + inherit (lib.nvim.types) mkGrammarOption diagnostics deprecatedSingleOrListOf; inherit (lib.nvim.dag) entryAfter; inherit (lib.nvim.attrsets) mapListToAttrs; @@ -78,6 +78,91 @@ package = pkgs.delve; }; }; + + defaultDiagnosticsProvider = ["golangci-lint"]; + diagnosticsProviders = { + golangci-lint = let + pkg = pkgs.golangci-lint; + in { + package = pkg; + config = { + cmd = getExe pkg; + args = [ + "run" + "--output.json.path=stdout" + "--issues-exit-code=0" + "--show-stats=false" + "--fix=false" + "--path-mode=abs" + # Overwrite values that could be configured and result in unwanted writes + "--output.text.path=" + "--output.tab.path=" + "--output.html.path=" + "--output.checkstyle.path=" + "--output.code-climate.path=" + "--output.junit-xml.path=" + "--output.teamcity.path=" + "--output.sarif.path=" + ]; + parser = mkLuaInline '' + function(output, bufnr) + local SOURCE = "golangci-lint"; + + local function display_tool_error(msg) + return{ + { + bufnr = bufnr, + lnum = 0, + col = 0, + message = string.format("[%s] %s", SOURCE, msg), + severity = vim.diagnostic.severity.ERROR, + source = SOURCE, + }, + } + end + + if output == "" then + return display_tool_error("no output provided") + end + + local ok, decoded = pcall(vim.json.decode, output) + if not ok then + return display_tool_error("failed to parse JSON output") + end + + if not decoded or not decoded.Issues then + return display_tool_error("unexpected output format") + end + + local severity_map = { + error = vim.diagnostic.severity.ERROR, + warning = vim.diagnostic.severity.WARN, + info = vim.diagnostic.severity.INFO, + hint = vim.diagnostic.severity.HINT, + } + local diagnostics = {} + for _, issue in ipairs(decoded.Issues) do + local sev = vim.diagnostic.severity.ERROR + if issue.Severity and issue.Severity ~= "" then + local normalized = issue.Severity:lower() + sev = severity_map[normalized] or vim.diagnostic.severity.ERROR + end + table.insert(diagnostics, { + bufnr = bufnr, + lnum = issue.Pos.Line - 1, + col = issue.Pos.Column - 1, + message = issue.Text, + code = issue.FromLinter, + severity = sev, + source = SOURCE, + }) + end + return diagnostics + end + ''; + }; + }; + }; in { options.vim.languages.go = { enable = mkEnableOption "Go language support"; @@ -134,6 +219,14 @@ in { default = debuggers.${cfg.dap.debugger}.package; }; }; + extraDiagnostics = { + enable = mkEnableOption "extra Go diagnostics" // {default = config.vim.languages.enableExtraDiagnostics;}; + types = diagnostics { + langDesc = "Go"; + inherit diagnosticsProviders; + inherit defaultDiagnosticsProvider; + }; + }; }; config = mkIf cfg.enable (mkMerge [ @@ -179,5 +272,15 @@ in { debugger.nvim-dap.enable = true; }; }) + + (mkIf cfg.extraDiagnostics.enable { + vim.diagnostics.nvim-lint = { + enable = true; + linters_by_ft.go = cfg.extraDiagnostics.types; + linters = + mkMerge (map (name: {${name} = diagnosticsProviders.${name}.config;}) + cfg.extraDiagnostics.types); + }; + }) ]); }