diff --git a/crates/compiler/fmt/src/expr.rs b/crates/compiler/fmt/src/expr.rs index 0ac5825f18..60b6d7399c 100644 --- a/crates/compiler/fmt/src/expr.rs +++ b/crates/compiler/fmt/src/expr.rs @@ -476,7 +476,24 @@ pub fn fmt_str_literal<'buf>(buf: &mut Buf<'buf>, literal: StrLiteral, indent: u buf.push('"'); match literal { PlainLine(string) => { - buf.push_str_allow_spaces(string); + // When a PlainLine contains "\n" it is formatted as a block string using """ + let mut lines = string.split('\n'); + match (lines.next(), lines.next()) { + (Some(first), Some(second)) => { + buf.push_str("\"\""); + buf.newline(); + + for line in [first, second].into_iter().chain(lines) { + buf.indent(indent); + buf.push_str_allow_spaces(line); + buf.newline(); + } + + buf.indent(indent); + buf.push_str("\"\""); + } + _ => buf.push_str_allow_spaces(string), + } } Line(segments) => { for seg in segments.iter() { diff --git a/crates/repl_test/src/tests.rs b/crates/repl_test/src/tests.rs index 4a08f3c6bb..01c4100a0e 100644 --- a/crates/repl_test/src/tests.rs +++ b/crates/repl_test/src/tests.rs @@ -542,7 +542,18 @@ fn four_element_record() { #[test] fn multiline_string() { // If a string contains newlines, format it as a multiline string in the output - expect_success(r#""\n\nhi!\n\n""#, "\"\n\nhi!\n\n\" : Str"); + expect_success( + r#""\n\nhi!\n\n""#, + indoc!( + r#"""" + + + hi! + + + """ : Str"# + ), + ); } #[test]