fix arg comma messages

This commit is contained in:
Folkert 2021-02-25 14:25:43 +01:00
parent 1a7fd57833
commit c208f500d9
4 changed files with 370 additions and 35 deletions

View file

@ -173,10 +173,238 @@ fn to_expr_report<'a>(
match parse_problem {
EExpr::When(when, row, col) => to_when_report(alloc, filename, context, &when, *row, *col),
EExpr::Lambda(lambda, row, col) => {
to_lambda_report(alloc, filename, context, &lambda, *row, *col)
}
_ => todo!("unhandled parse error: {:?}", parse_problem),
}
}
fn to_lambda_report<'a>(
alloc: &'a RocDocAllocator<'a>,
filename: PathBuf,
context: Context,
parse_problem: &roc_parse::parser::ELambda<'a>,
start_row: Row,
start_col: Col,
) -> Report<'a> {
use roc_parse::parser::ELambda;
match *parse_problem {
ELambda::Arrow(row, col) => match what_is_next(alloc.src_lines, row, col) {
Next::Token("=>") => {
let surroundings = Region::from_rows_cols(start_row, start_col, row, col);
let region = Region::from_row_col(row, col);
let doc = alloc.stack(vec![
alloc
.reflow(r"I am in the middle of parsing a function argument list, but I got stuck here:"),
alloc.region_with_subregion(surroundings, region),
alloc.concat(vec![
alloc.reflow("I was expecting a "),
alloc.parser_suggestion("->"),
alloc.reflow(" next."),
]),
]);
Report {
filename,
doc,
title: "WEIRD ARROW".to_string(),
}
}
_ => {
let surroundings = Region::from_rows_cols(start_row, start_col, row, col);
let region = Region::from_row_col(row, col);
let doc = alloc.stack(vec![
alloc
.reflow(r"I am in the middle of parsing a function argument list, but I got stuck here:"),
alloc.region_with_subregion(surroundings, region),
alloc.concat(vec![
alloc.reflow("I was expecting a "),
alloc.parser_suggestion("->"),
alloc.reflow(" next."),
]),
]);
Report {
filename,
doc,
title: "MISSING ARROW".to_string(),
}
}
},
ELambda::Comma(row, col) => match what_is_next(alloc.src_lines, row, col) {
Next::Token("=>") => {
let surroundings = Region::from_rows_cols(start_row, start_col, row, col);
let region = Region::from_row_col(row, col);
let doc = alloc.stack(vec![
alloc
.reflow(r"I am in the middle of parsing a function argument list, but I got stuck here:"),
alloc.region_with_subregion(surroundings, region),
alloc.concat(vec![
alloc.reflow("I was expecting a "),
alloc.parser_suggestion("->"),
alloc.reflow(" next."),
]),
]);
Report {
filename,
doc,
title: "WEIRD ARROW".to_string(),
}
}
_ => {
let surroundings = Region::from_rows_cols(start_row, start_col, row, col);
let region = Region::from_row_col(row, col);
let doc = alloc.stack(vec![
alloc
.reflow(r"I am in the middle of parsing a function argument list, but I got stuck here:"),
alloc.region_with_subregion(surroundings, region),
alloc.concat(vec![
alloc.reflow("I was expecting a "),
alloc.parser_suggestion("->"),
alloc.reflow(" next."),
]),
]);
Report {
filename,
doc,
title: "MISSING ARROW".to_string(),
}
}
},
ELambda::Arg(row, col) => match what_is_next(alloc.src_lines, row, col) {
Next::Other(Some(',')) => {
let surroundings = Region::from_rows_cols(start_row, start_col, row, col);
let region = Region::from_row_col(row, col);
let doc = alloc.stack(vec![
alloc
.reflow(r"I am in the middle of parsing a function argument list, but I got stuck at this comma:"),
alloc.region_with_subregion(surroundings, region),
alloc.concat(vec![
alloc.reflow("I was expecting an argument pattern before this, "),
alloc.reflow("so try adding an argument before the comma and see if that helps?"),
]),
]);
Report {
filename,
doc,
title: "UNFINISHED ARGUMENT LIST".to_string(),
}
}
_ => {
let surroundings = Region::from_rows_cols(start_row, start_col, row, col);
let region = Region::from_row_col(row, col);
let doc = alloc.stack(vec![
alloc
.reflow(r"I am in the middle of parsing a function argument list, but I got stuck here:"),
alloc.region_with_subregion(surroundings, region),
alloc.concat(vec![
alloc.reflow("I was expecting an argument pattern before this, "),
alloc.reflow("so try adding an argument and see if that helps?"),
]),
]);
Report {
filename,
doc,
title: "MISSING ARROW".to_string(),
}
}
},
ELambda::Start(_row, _col) => unreachable!("another branch would have been taken"),
ELambda::Syntax(syntax, row, col) => to_syntax_report(alloc, filename, syntax, row, col),
ELambda::Pattern(ref pattern, row, col) => {
to_pattern_report(alloc, filename, pattern, row, col)
}
ELambda::Space(error, row, col) => to_space_report(alloc, filename, &error, row, col),
ELambda::IndentArrow(row, col) => to_unfinished_lambda_report(
alloc,
filename,
row,
col,
start_row,
start_col,
alloc.concat(vec![
alloc.reflow(r"I just saw a pattern, so I was expecting to see a "),
alloc.parser_suggestion("->"),
alloc.reflow(" next."),
]),
),
ELambda::IndentBody(row, col) => to_unfinished_lambda_report(
alloc,
filename,
row,
col,
start_row,
start_col,
alloc.concat(vec![
alloc.reflow(r"I just saw a pattern, so I was expecting to see a "),
alloc.parser_suggestion("->"),
alloc.reflow(" next."),
]),
),
ELambda::IndentArg(row, col) => to_unfinished_lambda_report(
alloc,
filename,
row,
col,
start_row,
start_col,
alloc.concat(vec![
alloc.reflow(r"I just saw a pattern, so I was expecting to see a "),
alloc.parser_suggestion("->"),
alloc.reflow(" next."),
]),
),
}
}
fn to_unfinished_lambda_report<'a>(
alloc: &'a RocDocAllocator<'a>,
filename: PathBuf,
row: Row,
col: Col,
start_row: Row,
start_col: Col,
message: RocDocBuilder<'a>,
) -> Report<'a> {
let surroundings = Region::from_rows_cols(start_row, start_col, row, col);
let region = Region::from_row_col(row, col);
let doc = alloc.stack(vec![
alloc.concat(vec![
alloc.reflow(r"I was partway through parsing a "),
alloc.reflow(r" function, but I got stuck here:"),
]),
alloc.region_with_subregion(surroundings, region),
message,
// note_for_when_error(alloc),
]);
Report {
filename,
doc,
title: "UNFINISHED FUNCTION".to_string(),
}
}
fn to_when_report<'a>(
alloc: &'a RocDocAllocator<'a>,
filename: PathBuf,
@ -1635,6 +1863,7 @@ fn what_is_next<'a>(source_lines: &'a [&'a str], row: Row, col: Col) -> Next<'a>
']' => Next::Close("square bracket", ']'),
'}' => Next::Close("curly brace", '}'),
'-' if it.next() == Some('>') => Next::Token("->"),
'=' if it.next() == Some('>') => Next::Token("=>"),
// _ if is_symbol(c) => todo!("it's an operator"),
_ => Next::Other(Some(c)),
},

View file

@ -4912,6 +4912,56 @@ mod test_reporting {
)
}
#[test]
fn lambda_double_comma() {
report_problem_as(
indoc!(
r#"
\a,,b -> 1
"#
),
indoc!(
r#"
UNFINISHED ARGUMENT LIST
I am in the middle of parsing a function argument list, but I got
stuck at this comma:
1 \,b -> 1
^
I was expecting an argument pattern before this, so try adding an
argument before the comma and see if that helps?
"#
),
)
}
#[test]
fn lambda_leading_comma() {
report_problem_as(
indoc!(
r#"
\,b -> 1
"#
),
indoc!(
r#"
UNFINISHED ARGUMENT LIST
I am in the middle of parsing a function argument list, but I got
stuck at this comma:
1 \,b -> 1
^
I was expecting an argument pattern before this, so try adding an
argument before the comma and see if that helps?
"#
),
)
}
#[test]
fn when_outdented_branch() {
// this should get better with time