improve function type display

This commit is contained in:
Mark 2023-10-27 14:56:01 +02:00
parent 3b179ba2d4
commit 36e0f69d0c
2 changed files with 61 additions and 45 deletions

View File

@ -133,6 +133,11 @@ impl Display for Function {
} }
impl Display for FunctionT { impl Display for FunctionT {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Function") match (self.0)(&Type::empty_tuple()) {
Ok(t) => write!(f, "Function /* () -> {t} */"),
Err(_) => {
write!(f, "Function",)
}
}
} }
} }

View File

@ -90,7 +90,7 @@ pub struct CheckErrorHRConfig {
} }
pub struct CheckErrorDisplay<'a> { pub struct CheckErrorDisplay<'a> {
e: &'a CheckError, e: &'a CheckError,
src: &'a Source, src: Option<&'a Source>,
} }
impl Display for CheckErrorDisplay<'_> { impl Display for CheckErrorDisplay<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
@ -123,13 +123,19 @@ impl CheckError {
self.add(CheckErrorComponent::Source(s)) self.add(CheckErrorComponent::Source(s))
} }
pub fn display<'a>(&'a self, src: &'a Source) -> CheckErrorDisplay<'a> { pub fn display<'a>(&'a self, src: &'a Source) -> CheckErrorDisplay<'a> {
CheckErrorDisplay { e: self, src } CheckErrorDisplay {
e: self,
src: Some(src),
}
}
pub fn display_no_src<'a>(&'a self) -> CheckErrorDisplay<'a> {
CheckErrorDisplay { e: self, src: None }
} }
// will, unless empty, end in a newline // will, unless empty, end in a newline
fn human_readable( fn human_readable(
&self, &self,
f: &mut std::fmt::Formatter<'_>, f: &mut std::fmt::Formatter<'_>,
src: &Source, src: Option<&Source>,
cfg: &CheckErrorHRConfig, cfg: &CheckErrorHRConfig,
) -> std::fmt::Result { ) -> std::fmt::Result {
let len = self.0.len(); let len = self.0.len();
@ -155,50 +161,55 @@ impl CheckError {
err.human_readable(f, src, &cfg)?; err.human_readable(f, src, &cfg)?;
} }
CheckErrorComponent::Source(highlights) => { CheckErrorComponent::Source(highlights) => {
let start = highlights.iter().map(|v| v.0.start.pos()).min(); if let Some(src) = src {
let end = highlights.iter().map(|v| v.0.start.pos()).max(); let start = highlights.iter().map(|v| v.0.start.pos()).min();
if let (Some(start), Some(end)) = (start, end) { let end = highlights.iter().map(|v| v.0.start.pos()).max();
writeln!(f, "{}Line(s) [?] ({start}..{end})", indent!())?; if let (Some(start), Some(end)) = (start, end) {
let start = src.get_line_start(start); writeln!(f, "{}Line(s) [?] ({start}..{end})", indent!())?;
let end = src.get_line_end(end); let start = src.get_line_start(start);
let lines = src.src()[start..end].line_spans().collect::<Vec<_>>(); let end = src.get_line_end(end);
for line in lines { let lines = src.src()[start..end].line_spans().collect::<Vec<_>>();
let line_start = line.start(); for line in lines {
let line_end = line.end(); let line_start = line.start();
let line = line.as_str(); let line_end = line.end();
writeln!(f, "{} {line}", indent!())?; let line = line.as_str();
let mut right = 0; writeln!(f, "{} {line}", indent!())?;
for (pos, color) in highlights { let mut right = 0;
if let Some(color) = color { for (pos, color) in highlights {
let highlight_start = pos.start.pos() - start; if let Some(color) = color {
let highlight_end = pos.end.pos() - start; let highlight_start = pos.start.pos() - start;
if highlight_start < line_end && highlight_end > line_start { let highlight_end = pos.end.pos() - start;
let hl_start = highlight_start.saturating_sub(line_start); if highlight_start < line_end && highlight_end > line_start
if hl_start < right { {
right = 0; let hl_start =
writeln!(f)?; highlight_start.saturating_sub(line_start);
if hl_start < right {
right = 0;
writeln!(f)?;
}
let hl_len = highlight_end
.saturating_sub(line_start)
.saturating_sub(hl_start);
let hl_space = hl_start - right;
let print_indent = right == 0;
right += hl_space + hl_len;
let hl_len =
hl_len.min(highlight_end - highlight_start);
if print_indent && right != 0 {
write!(f, "{} ", indent!())?;
}
write!(
f,
"{}{}",
" ".repeat(hl_space),
"^".repeat(hl_len).color(*color)
)?;
} }
let hl_len = highlight_end
.saturating_sub(line_start)
.saturating_sub(hl_start);
let hl_space = hl_start - right;
let print_indent = right == 0;
right += hl_space + hl_len;
let hl_len = hl_len.min(highlight_end - highlight_start);
if print_indent && right != 0 {
write!(f, "{} ", indent!())?;
}
write!(
f,
"{}{}",
" ".repeat(hl_space),
"^".repeat(hl_len).color(*color)
)?;
} }
} }
} if right != 0 {
if right != 0 { writeln!(f)?;
writeln!(f)?; }
} }
} }
} }