Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add global error/warning count statusline element #4569

Merged
merged 10 commits into from
Nov 15, 2022
1 change: 1 addition & 0 deletions book/src/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ The following statusline elements can be configured:
| `total-line-numbers` | The total line numbers of the opened file |
| `file-type` | The type of the opened file |
| `diagnostics` | The number of warnings and/or errors |
| `workspace-diagnostics` | The number of warnings and/or errors on workspace |
| `selections` | The number of active selections |
| `position` | The cursor position |
| `position-percentage` | The cursor position as a percentage of the total number of lines |
Expand Down
72 changes: 60 additions & 12 deletions helix-term/src/ui/statusline.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use helix_core::{coords_at_pos, encoding, Position};
use helix_lsp::lsp::DiagnosticSeverity;
use helix_view::{
document::{Mode, SCRATCH_BUFFER_NAME},
graphics::Rect,
Expand Down Expand Up @@ -141,6 +142,7 @@ where
helix_view::editor::StatusLineElement::FileLineEnding => render_file_line_ending,
helix_view::editor::StatusLineElement::FileType => render_file_type,
helix_view::editor::StatusLineElement::Diagnostics => render_diagnostics,
helix_view::editor::StatusLineElement::WorkspaceDiagnostics => render_workspace_diagnostics,
helix_view::editor::StatusLineElement::Selections => render_selections,
helix_view::editor::StatusLineElement::Position => render_position,
helix_view::editor::StatusLineElement::PositionPercentage => render_position_percentage,
Expand Down Expand Up @@ -205,23 +207,40 @@ where
);
}

fn render_diagnostics<F>(context: &mut RenderContext, write: F)
where
F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
{
let (warnings, errors) = context
.doc
.diagnostics()
.iter()
/// Gets the count pair (warnings, error) of warnings, error on document.
fn diagnostics_count(doc: &Document) -> (i32, i32) {
doc.diagnostics().iter().fold((0, 0), |mut counts, diag| {
use helix_core::diagnostic::Severity;
match diag.severity {
Some(Severity::Warning) => counts.0 += 1,
Some(Severity::Error) | None => counts.1 += 1,
_ => {}
}
counts
})
}

/// Gets the count pair (warnings, error) of warnings, error on workspace.
fn workspace_diagnostic_count(editor: &Editor) -> (i32, i32) {
the-mikedavis marked this conversation as resolved.
Show resolved Hide resolved
editor
.diagnostics
.values()
.flatten()
.fold((0, 0), |mut counts, diag| {
use helix_core::diagnostic::Severity;
match diag.severity {
Some(Severity::Warning) => counts.0 += 1,
Some(Severity::Error) | None => counts.1 += 1,
Some(DiagnosticSeverity::WARNING) => counts.0 += 1,
Some(DiagnosticSeverity::ERROR) | None => counts.1 += 1,
_ => {}
}
counts
});
})
}

fn render_diagnostics<F>(context: &mut RenderContext, write: F)
where
F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
{
let (warnings, errors) = diagnostics_count(context.doc);

if warnings > 0 {
write(
Expand All @@ -242,6 +261,35 @@ where
}
}

fn render_workspace_diagnostics<F>(context: &mut RenderContext, write: F)
where
F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
{
let (w_warnings, w_errors) = workspace_diagnostic_count(context.editor);

if w_warnings > 0 || w_errors > 0 {
write(context, format!(" {} ", "W"), None);
}

if w_warnings > 0 {
write(
context,
"●".to_string(),
Some(context.editor.theme.get("warning")),
);
write(context, format!(" {} ", w_warnings), None);
}

if w_errors > 0 {
write(
context,
"●".to_string(),
Some(context.editor.theme.get("error")),
);
write(context, format!(" {} ", w_errors), None);
}
}

fn render_selections<F>(context: &mut RenderContext, write: F)
where
F: Fn(&mut RenderContext, String, Option<Style>) + Copy,
Expand Down
3 changes: 3 additions & 0 deletions helix-view/src/editor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,9 @@ pub enum StatusLineElement {
/// A summary of the number of errors and warnings
Diagnostics,

/// A summary of the number of errors and warnings on file and workspace
WorkspaceDiagnostics,

/// The number of selections (cursors)
Selections,

Expand Down