mirror of
https://github.com/zaphar/ucg.git
synced 2025-07-23 18:29:50 -04:00
FEATURE: Use the AST Pretty Printer for TRACE and assert output.
This commit is contained in:
parent
cd6307824f
commit
525cdd32e6
@ -1,4 +1,4 @@
|
|||||||
let host_mod = module{
|
let host_mod = TRACE module{
|
||||||
hostname="",
|
hostname="",
|
||||||
mem=2048,
|
mem=2048,
|
||||||
cpu=2,
|
cpu=2,
|
||||||
|
@ -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) => {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user