FEATURE: Improvements to format expression printing.

This commit is contained in:
Jeremy Wall 2019-05-17 21:19:01 -05:00
parent 9b99bc026c
commit aa9e664c0d
2 changed files with 31 additions and 5 deletions

View File

@ -248,21 +248,21 @@ where
self.render_expr(&_def.message)?; self.render_expr(&_def.message)?;
} }
Expression::Format(_def) => { Expression::Format(_def) => {
self.w write!(self.w, "\"{}\"", Self::escape_quotes(&_def.template))?;
.write(Self::escape_quotes(&_def.template).as_bytes())?;
write!(self.w, " % ")?; write!(self.w, " % ")?;
match _def.args { match _def.args {
FormatArgs::Single(ref e) => { FormatArgs::Single(ref e) => {
self.render_expr(e)?; self.render_expr(e)?;
} }
FormatArgs::List(ref es) => { FormatArgs::List(ref es) => {
self.w.write("(".as_bytes())?; self.w.write("(\n".as_bytes())?;
self.curr_indent += self.indent; self.curr_indent += self.indent;
let indent = self.make_indent(); let indent = self.make_indent();
let mut prefix = "";
for e in es.iter() { for e in es.iter() {
self.w.write(indent.as_bytes())?; write!(self.w, "{}{}", prefix, indent)?;
self.render_expr(e)?; self.render_expr(e)?;
self.w.write("\n".as_bytes())?; prefix = ",\n";
} }
self.curr_indent -= self.indent; self.curr_indent -= self.indent;
self.w.write(")".as_bytes())?; self.w.write(")".as_bytes())?;

View File

@ -333,3 +333,29 @@ fn test_func_expr_single_arg_printing() {
assert!(printer.err.is_none()); assert!(printer.err.is_none());
assert_eq!(String::from_utf8(buffer).unwrap(), format!("{}\n", input)); assert_eq!(String::from_utf8(buffer).unwrap(), format!("{}\n", input));
} }
#[test]
fn test_format_expr_single_arg_printing() {
let input = "\"what? @{item.foo}\" % {
foo = 1,
};";
let stmts = assert_parse(input);
let mut buffer: Vec<u8> = Vec::new();
let mut printer = AstPrinter::new(2, &mut buffer);
printer.render(&stmts);
assert!(printer.err.is_none());
assert_eq!(String::from_utf8(buffer).unwrap(), format!("{}\n", input));
}
#[test]
fn test_format_expr_list_arg_printing() {
let input = "\"what? @ @\" % (
1,
2);";
let stmts = assert_parse(input);
let mut buffer: Vec<u8> = Vec::new();
let mut printer = AstPrinter::new(2, &mut buffer);
printer.render(&stmts);
assert!(printer.err.is_none());
assert_eq!(String::from_utf8(buffer).unwrap(), format!("{}\n", input));
}