local M = {} -- Get diagnostics for a specific line range function M.get_range_diagnostics(bufnr, start_line, end_line) local all_diagnostics = vim.diagnostic.get(bufnr or 0) local range_diagnostics = {} for _, diagnostic in ipairs(all_diagnostics) do -- Convert from 0-indexed to 1-indexed for user-facing line numbers local diag_line = diagnostic.lnum + 1 if diag_line >= start_line and diag_line <= end_line then table.insert(range_diagnostics, diagnostic) end end return range_diagnostics end -- Format diagnostics for Claude prompt function M.format_diagnostics_for_prompt(diagnostics) if #diagnostics == 0 then return "No diagnostics found in the selected range." end local severity_names = { [vim.diagnostic.severity.ERROR] = "ERROR", [vim.diagnostic.severity.WARN] = "WARNING", [vim.diagnostic.severity.INFO] = "INFO", [vim.diagnostic.severity.HINT] = "HINT" } local formatted_lines = {} table.insert(formatted_lines, "Diagnostic Issues:") for _, diagnostic in ipairs(diagnostics) do local line_num = diagnostic.lnum + 1 -- Convert to 1-indexed local severity = severity_names[diagnostic.severity] or "UNKNOWN" local message = diagnostic.message:gsub("\n", " ") -- Remove newlines from message table.insert(formatted_lines, string.format("Line %d: [%s] %s", line_num, severity, message)) end return table.concat(formatted_lines, "\n") end -- Quick check if any diagnostics exist in range function M.has_diagnostics(bufnr, start_line, end_line) local diagnostics = M.get_range_diagnostics(bufnr, start_line, end_line) return #diagnostics > 0 end return M