aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-03-15 07:19:31 +0000
committerBlaž Hrastnik2021-03-15 07:19:31 +0000
commit87e3cd3df283a6da055488bbea60637713bd1f35 (patch)
tree94fc1d72a136d4ccadc927ea19f95cac370eb61c /helix-term/src
parent1abf2953cdee525f8c1f30e881bc5c4211cb62fd (diff)
ui: Render diagnostic errors in sideline.
Diffstat (limited to 'helix-term/src')
-rw-r--r--helix-term/src/application.rs7
-rw-r--r--helix-term/src/ui/editor.rs59
2 files changed, 63 insertions, 3 deletions
diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index 24b5317b..c22cf996 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -140,14 +140,17 @@ impl Application {
.into_iter()
.map(|diagnostic| {
use helix_core::diagnostic::Severity::*;
- use helix_core::{diagnostic::Severity, Diagnostic};
+ use helix_core::{
+ diagnostic::{Range, Severity},
+ Diagnostic,
+ };
use helix_lsp::{lsp, util::lsp_pos_to_pos};
use lsp::DiagnosticSeverity;
let start = lsp_pos_to_pos(doc, diagnostic.range.start);
let end = lsp_pos_to_pos(doc, diagnostic.range.end);
Diagnostic {
- range: (start, end),
+ range: Range { start, end },
line: diagnostic.range.start.line as usize,
message: diagnostic.message,
severity: diagnostic.severity.map(
diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs
index abdbb7a3..fe4e3439 100644
--- a/helix-term/src/ui/editor.rs
+++ b/helix-term/src/ui/editor.rs
@@ -56,6 +56,8 @@ impl EditorView {
// TODO: this seems to prevent setting style later
// surface.set_style(viewport, theme.get("ui.background"));
+ self.render_diagnostics(&view.doc, area, surface, theme, is_focused);
+
let area = Rect::new(
viewport.x,
viewport.y + viewport.height.saturating_sub(1),
@@ -166,7 +168,8 @@ impl EditorView {
// ugh,interleave highlight spans with diagnostic spans
let is_diagnostic = view.doc.diagnostics.iter().any(|diagnostic| {
- diagnostic.range.0 <= char_index && diagnostic.range.1 > char_index
+ diagnostic.range.start <= char_index
+ && diagnostic.range.end > char_index
});
let style = if is_diagnostic {
@@ -316,6 +319,60 @@ impl EditorView {
}
}
+ pub fn render_diagnostics(
+ &self,
+ doc: &Document,
+ viewport: Rect,
+ surface: &mut Surface,
+ theme: &Theme,
+ is_focused: bool,
+ ) {
+ use helix_core::diagnostic::Severity;
+ use tui::{
+ layout::Alignment,
+ text::Text,
+ widgets::{Paragraph, Widget},
+ };
+
+ let cursor = doc.selection().cursor();
+ let line = doc.text().char_to_line(cursor);
+
+ let diagnostics = doc.diagnostics.iter().filter(|diagnostic| {
+ diagnostic.range.start <= cursor && diagnostic.range.end >= cursor
+ });
+
+ let warning: Style = theme.get("warning");
+ let error: Style = theme.get("error");
+ let info: Style = theme.get("info");
+ let hint: Style = theme.get("hint");
+
+ // Vec::with_capacity(diagnostics.len()); // rough estimate
+ let mut lines = Vec::new();
+ for diagnostic in diagnostics {
+ let text = Text::styled(
+ &diagnostic.message,
+ match diagnostic.severity {
+ Some(Severity::Error) => error,
+ Some(Severity::Warning) | None => warning,
+ Some(Severity::Info) => info,
+ Some(Severity::Hint) => hint,
+ },
+ );
+ lines.extend(text.lines);
+ }
+
+ let paragraph = Paragraph::new(lines).alignment(Alignment::Right);
+ paragraph.render(
+ Rect::new(
+ viewport.x + viewport.width - 80 - 1,
+ viewport.y as u16 + 1,
+ 80,
+ 15,
+ ),
+ surface,
+ );
+ }
+
pub fn render_statusline(
&self,
doc: &Document,