diff --git a/compiler/reporting/src/report.rs b/compiler/reporting/src/report.rs index 7135cb66af..f0e8ea99ce 100644 --- a/compiler/reporting/src/report.rs +++ b/compiler/reporting/src/report.rs @@ -320,12 +320,11 @@ impl ReportText { buf.push_str(" ".repeat(max_line_number_length).as_str()); buf.push_str(" ┆"); - let spaces = std::iter::repeat(" ").take(region.start_col as usize + 2); - let carets = - std::iter::repeat("^").take((region.end_col - region.start_col) as usize); - - let line = spaces.chain(carets).collect::(); - buf.push_str(&*line); + buf.push_str(" ".repeat(region.start_col as usize + 2).as_str()); + buf.push_str( + "^".repeat((region.end_col - region.start_col) as usize) + .as_str(), + ); } else { for i in region.start_line..=region.end_line { let i_one_indexed = i + 1; @@ -339,7 +338,7 @@ impl ReportText { .as_str(), ); buf.push_str(line_number); - buf.push_str(" ┆"); + buf.push_str(" ┆>"); let line = src_lines[i as usize]; @@ -431,9 +430,13 @@ impl ReportText { // newline before snippet buf.push('\n'); buf.push('\n'); - let max_line_number_length = region.end_line.to_string().len(); - for i in region.start_line..=region.end_line { + // the widest line number that is rendered + let max_line_number_length = (region.end_line + 1).to_string().len(); + + if region.start_line == region.end_line { + // single line + let i = region.start_line; let i_one_indexed = i + 1; let line_number_string = i_one_indexed.to_string(); @@ -454,8 +457,41 @@ impl ReportText { buf.push_str(&palette.code_block.render(src_lines[i as usize])); } - if i != region.end_line { - buf.push('\n'); + buf.push('\n'); + buf.push_str(" ".repeat(max_line_number_length).as_str()); + buf.push_str(&palette.gutter_bar.render(" ┆")); + + buf.push_str(" ".repeat(region.start_col as usize + 2).as_str()); + let carets = "^".repeat((region.end_col - region.start_col) as usize); + buf.push_str(&palette.error.render(carets.as_str())); + } else { + // multiline + + for i in region.start_line..=region.end_line { + let i_one_indexed = i + 1; + + let line_number_string = i_one_indexed.to_string(); + let line_number = line_number_string.as_str(); + let this_line_number_length = line_number.len(); + + buf.push_str( + " ".repeat(max_line_number_length - this_line_number_length) + .as_str(), + ); + buf.push_str(&palette.line_number.render(line_number)); + buf.push_str(&palette.gutter_bar.render(" ┆")); + buf.push_str(&palette.error.render(">")); + + let line = src_lines[i as usize]; + + if !line.trim().is_empty() { + buf.push_str(" "); + buf.push_str(&palette.code_block.render(src_lines[i as usize])); + } + + if i != region.end_line { + buf.push('\n'); + } } } diff --git a/compiler/reporting/tests/test_reporting.rs b/compiler/reporting/tests/test_reporting.rs index 3b5737ac51..ef936dcf99 100644 --- a/compiler/reporting/tests/test_reporting.rs +++ b/compiler/reporting/tests/test_reporting.rs @@ -373,9 +373,9 @@ mod test_reporting { r#" You cannot mix (!=) and (==) without parentheses - 2 ┆ 1 - 3 ┆ != 2 - 4 ┆ == 3 + 2 ┆> 1 + 3 ┆> != 2 + 4 ┆> == 3 "# ), @@ -581,10 +581,10 @@ mod test_reporting { r#" - 1 isDisabled = \user -> user.isAdmin - 2 - 3 theAdmin - 4 |> isDisabled + 1> isDisabled = \user -> user.isAdmin + 2> + 3> theAdmin + 4> |> isDisabled "# ), @@ -613,9 +613,9 @@ mod test_reporting { r#" - 2 ┆ y = 2 - 3 ┆ f = \a -> a + 4 - 4 ┆ + 2 ┆> y = 2 + 3 ┆> f = \a -> a + 4 + 4 ┆> "# ), @@ -652,9 +652,9 @@ mod test_reporting { r#" - 9 ┆ - 10 ┆ y = 2 - 11 ┆ f = \a -> a + 4 + 9 ┆> + 10 ┆> y = 2 + 11 ┆> f = \a -> a + 4 "# ),