feat(tvix/eval): use fancy error formatting in REPL
Change-Id: I8d5652d797b012bc3d5248ca2b2d0c87572dbf2e Reviewed-on: https://cl.tvl.fyi/c/depot/+/6851 Tested-by: BuildkiteCI Reviewed-by: wpcarro <wpcarro@gmail.com>
This commit is contained in:
parent
546f445f07
commit
d6643f66b1
3 changed files with 16 additions and 9 deletions
|
@ -3,7 +3,7 @@ use std::path::PathBuf;
|
||||||
use std::{fmt::Display, num::ParseIntError};
|
use std::{fmt::Display, num::ParseIntError};
|
||||||
|
|
||||||
use codemap::{CodeMap, Span};
|
use codemap::{CodeMap, Span};
|
||||||
use codemap_diagnostic::{Diagnostic, Emitter, Level, SpanLabel, SpanStyle};
|
use codemap_diagnostic::{ColorConfig, Diagnostic, Emitter, Level, SpanLabel, SpanStyle};
|
||||||
use smol_str::SmolStr;
|
use smol_str::SmolStr;
|
||||||
|
|
||||||
use crate::Value;
|
use crate::Value;
|
||||||
|
@ -141,6 +141,12 @@ impl Error {
|
||||||
String::from_utf8_lossy(&out).to_string()
|
String::from_utf8_lossy(&out).to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Render a fancy, human-readable output of this error and print
|
||||||
|
/// it to stderr.
|
||||||
|
pub fn fancy_format_stderr(&self, codemap: &CodeMap) {
|
||||||
|
Emitter::stderr(ColorConfig::Auto, Some(codemap)).emit(&[self.diagnostic(codemap)]);
|
||||||
|
}
|
||||||
|
|
||||||
/// Create the optional span label displayed as an annotation on
|
/// Create the optional span label displayed as an annotation on
|
||||||
/// the underlined span of the error.
|
/// the underlined span of the error.
|
||||||
fn span_label(&self) -> Option<String> {
|
fn span_label(&self) -> Option<String> {
|
||||||
|
|
|
@ -81,21 +81,22 @@ pub fn interpret(code: &str, location: Option<PathBuf>, options: Options) -> Eva
|
||||||
}
|
}
|
||||||
|
|
||||||
for error in &result.errors {
|
for error in &result.errors {
|
||||||
eprintln!(
|
error.fancy_format_stderr(&codemap);
|
||||||
"compiler error: {:?} at `{}`[line {}]",
|
|
||||||
error.kind,
|
|
||||||
file.source_slice(error.span),
|
|
||||||
file.find_line(error.span.low()) + 1
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(err) = result.errors.last() {
|
if let Some(err) = result.errors.last() {
|
||||||
return Err(err.clone());
|
return Err(err.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
if options.trace_runtime {
|
let result = if options.trace_runtime {
|
||||||
crate::vm::run_lambda(&mut TracingObserver::new(std::io::stderr()), result.lambda)
|
crate::vm::run_lambda(&mut TracingObserver::new(std::io::stderr()), result.lambda)
|
||||||
} else {
|
} else {
|
||||||
crate::vm::run_lambda(&mut NoOpObserver::default(), result.lambda)
|
crate::vm::run_lambda(&mut NoOpObserver::default(), result.lambda)
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Err(err) = &result {
|
||||||
|
err.fancy_format_stderr(&codemap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ fn run_prompt(eval_options: tvix_eval::Options) {
|
||||||
Ok(result) => {
|
Ok(result) => {
|
||||||
println!("=> {} :: {}", result, result.type_of());
|
println!("=> {} :: {}", result, result.type_of());
|
||||||
}
|
}
|
||||||
Err(err) => println!("{}", err),
|
Err(_) => { /* interpret takes care of error formatting */ }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(ReadlineError::Interrupted) | Err(ReadlineError::Eof) => break,
|
Err(ReadlineError::Interrupted) | Err(ReadlineError::Eof) => break,
|
||||||
|
|
Loading…
Reference in a new issue