FEATURE: Use the AST Pretty Printer for TRACE and assert output.

This commit is contained in:
Jeremy Wall 2019-05-17 19:42:50 -05:00
parent cd6307824f
commit 525cdd32e6
3 changed files with 19 additions and 6 deletions

View File

@ -1,4 +1,4 @@
let host_mod = module{
let host_mod = TRACE module{
hostname="",
mem=2048,
cpu=2,

View File

@ -184,7 +184,7 @@ where
Ok(())
}
fn render_expr(&mut self, expr: &Expression) -> std::io::Result<()> {
pub fn render_expr(&mut self, expr: &Expression) -> std::io::Result<()> {
match expr {
Expression::Binary(_def) => {
let op = match _def.kind {
@ -331,7 +331,7 @@ where
self.render_expr(e)?;
write!(self.w, ") ")?;
}
write!(self.w, "{{")?;
write!(self.w, "{{\n")?;
self.curr_indent += self.indent;
let indent = self.make_indent();
for stmt in _def.statements.iter() {
@ -372,7 +372,7 @@ where
Ok(())
}
fn render_stmt(&mut self, stmt: &Statement) -> std::io::Result<()> {
pub fn render_stmt(&mut self, stmt: &Statement) -> std::io::Result<()> {
// All statements start at the beginning of a line.
match stmt {
Statement::Let(def) => {

View File

@ -1654,11 +1654,17 @@ impl<'a> FileBuilder<'a> {
// we are not in validate_mode so build_asserts are noops.
return Ok(Rc::new(Val::Empty));
}
let mut buffer: Vec<u8> = Vec::new();
{
let mut printer = crate::ast::printer::AstPrinter::new(2, &mut buffer);
let _ = printer.render_expr(expr);
}
let expr_pretty = String::from_utf8(buffer).unwrap();
let ok = match self.eval_expr(expr, scope) {
Ok(v) => v,
Err(e) => {
// failure!
let msg = format!("CompileError: {}\n", e);
let msg = format!("CompileError: {}\nfor expression:\n{}\n", e, expr_pretty);
self.record_assert_result(&msg, false);
return Ok(Rc::new(Val::Empty));
}
@ -1965,9 +1971,16 @@ impl<'a> FileBuilder<'a> {
};
}
&Expression::Debug(ref def) => {
let mut buffer: Vec<u8> = Vec::new();
{
let mut printer = crate::ast::printer::AstPrinter::new(2, &mut buffer);
let _ = printer.render_expr(&def.expr);
}
let expr_pretty = String::from_utf8(buffer).unwrap();
let val = self.eval_expr(&def.expr, scope);
if let Ok(ref val) = val {
eprintln!("TRACE: {} at {}", val, def.pos);
eprintln!("TRACE: {} = {} at {}", expr_pretty, val, def.pos);
}
val
}