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,6 +161,7 @@ impl CheckError {
err.human_readable(f, src, &cfg)?; err.human_readable(f, src, &cfg)?;
} }
CheckErrorComponent::Source(highlights) => { CheckErrorComponent::Source(highlights) => {
if let Some(src) = src {
let start = highlights.iter().map(|v| v.0.start.pos()).min(); let start = highlights.iter().map(|v| v.0.start.pos()).min();
let end = highlights.iter().map(|v| v.0.start.pos()).max(); let end = highlights.iter().map(|v| v.0.start.pos()).max();
if let (Some(start), Some(end)) = (start, end) { if let (Some(start), Some(end)) = (start, end) {
@ -172,8 +179,10 @@ impl CheckError {
if let Some(color) = color { if let Some(color) = color {
let highlight_start = pos.start.pos() - start; let highlight_start = pos.start.pos() - start;
let highlight_end = pos.end.pos() - start; let highlight_end = pos.end.pos() - start;
if highlight_start < line_end && highlight_end > line_start { if highlight_start < line_end && highlight_end > line_start
let hl_start = highlight_start.saturating_sub(line_start); {
let hl_start =
highlight_start.saturating_sub(line_start);
if hl_start < right { if hl_start < right {
right = 0; right = 0;
writeln!(f)?; writeln!(f)?;
@ -184,7 +193,8 @@ impl CheckError {
let hl_space = hl_start - right; let hl_space = hl_start - right;
let print_indent = right == 0; let print_indent = right == 0;
right += hl_space + hl_len; right += hl_space + hl_len;
let hl_len = hl_len.min(highlight_end - highlight_start); let hl_len =
hl_len.min(highlight_end - highlight_start);
if print_indent && right != 0 { if print_indent && right != 0 {
write!(f, "{} ", indent!())?; write!(f, "{} ", indent!())?;
} }
@ -205,6 +215,7 @@ impl CheckError {
} }
} }
} }
}
Ok(()) Ok(())
} }
} }