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="", hostname="",
mem=2048, mem=2048,
cpu=2, cpu=2,

View File

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

View File

@ -1654,11 +1654,17 @@ impl<'a> FileBuilder<'a> {
// we are not in validate_mode so build_asserts are noops. // we are not in validate_mode so build_asserts are noops.
return Ok(Rc::new(Val::Empty)); 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) { let ok = match self.eval_expr(expr, scope) {
Ok(v) => v, Ok(v) => v,
Err(e) => { Err(e) => {
// failure! // failure!
let msg = format!("CompileError: {}\n", e); let msg = format!("CompileError: {}\nfor expression:\n{}\n", e, expr_pretty);
self.record_assert_result(&msg, false); self.record_assert_result(&msg, false);
return Ok(Rc::new(Val::Empty)); return Ok(Rc::new(Val::Empty));
} }
@ -1965,9 +1971,16 @@ impl<'a> FileBuilder<'a> {
}; };
} }
&Expression::Debug(ref def) => { &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); let val = self.eval_expr(&def.expr, scope);
if let Ok(ref val) = val { if let Ok(ref val) = val {
eprintln!("TRACE: {} at {}", val, def.pos); eprintln!("TRACE: {} = {} at {}", expr_pretty, val, def.pos);
} }
val val
} }