remove more syntax errors

This commit is contained in:
Folkert 2021-03-12 03:04:47 +01:00
parent b688fd11a9
commit e815e57dcf
5 changed files with 37 additions and 30 deletions

View File

@ -48,7 +48,7 @@ pub fn expr<'a>(min_indent: u16) -> impl Parser<'a, Expr<'a>, SyntaxError<'a>> {
)
}
fn expr_help<'a>(min_indent: u16) -> impl Parser<'a, Expr<'a>, EExpr<'a>> {
pub fn expr_help<'a>(min_indent: u16) -> impl Parser<'a, Expr<'a>, EExpr<'a>> {
move |arena, state: State<'a>| parse_expr_help(min_indent, arena, state)
}
@ -2062,7 +2062,7 @@ fn list_literal_help<'a>(min_indent: u16) -> impl Parser<'a, Expr<'a>, List<'a>>
move |arena, state| {
let (_, (parsed_elems, final_comments), state) = collection_trailing_sep_e!(
word1(b'[', List::Open),
specialize_ref(List::Syntax, loc!(expr(min_indent))),
specialize_ref(List::Expr, loc!(expr_help(min_indent))),
word1(b',', List::End),
word1(b']', List::End),
min_indent,

View File

@ -426,7 +426,7 @@ pub enum EString<'a> {
EndlessSingle(Row, Col),
EndlessMulti(Row, Col),
UnknownEscape(Row, Col),
Format(&'a SyntaxError<'a>, Row, Col),
Format(&'a EExpr<'a>, Row, Col),
FormatEnd(Row, Col),
}
@ -489,7 +489,6 @@ pub enum List<'a> {
End(Row, Col),
Space(BadInputError, Row, Col),
Syntax(&'a SyntaxError<'a>, Row, Col),
Expr(&'a EExpr<'a>, Row, Col),
IndentOpen(Row, Col),
@ -510,7 +509,6 @@ pub enum When<'a> {
Condition(&'a EExpr<'a>, Row, Col),
Branch(&'a EExpr<'a>, Row, Col),
Syntax(&'a SyntaxError<'a>, Row, Col),
IndentIs(Row, Col),
IndentCondition(Row, Col),
@ -531,7 +529,6 @@ pub enum If<'a> {
Condition(&'a EExpr<'a>, Row, Col),
ThenBranch(&'a EExpr<'a>, Row, Col),
ElseBranch(&'a EExpr<'a>, Row, Col),
Syntax(&'a SyntaxError<'a>, Row, Col),
IndentCondition(Row, Col),
IndentIf(Row, Col),
@ -566,9 +563,9 @@ pub enum PRecord<'a> {
Field(Row, Col),
Colon(Row, Col),
Optional(Row, Col),
Pattern(&'a EPattern<'a>, Row, Col),
// TODO remove
Syntax(&'a SyntaxError<'a>, Row, Col),
Expr(&'a EExpr<'a>, Row, Col),
Space(BadInputError, Row, Col),
@ -582,13 +579,9 @@ pub enum PRecord<'a> {
pub enum PInParens<'a> {
End(Row, Col),
Open(Row, Col),
///
// TODO remove
Syntax(&'a SyntaxError<'a>, Row, Col),
Pattern(&'a EPattern<'a>, Row, Col),
///
Space(BadInputError, Row, Col),
///
IndentOpen(Row, Col),
IndentEnd(Row, Col),
}

View File

@ -51,13 +51,6 @@ fn parse_closure_param<'a>(
.parse(arena, state)
}
pub fn loc_pattern<'a>(min_indent: u16) -> impl Parser<'a, Located<Pattern<'a>>, SyntaxError<'a>> {
specialize(
|e, _, _| SyntaxError::Pattern(e),
loc_pattern_help(min_indent),
)
}
pub fn loc_pattern_help<'a>(
min_indent: u16,
) -> impl Parser<'a, Located<Pattern<'a>>, EPattern<'a>> {
@ -130,7 +123,7 @@ fn loc_pattern_in_parens_help<'a>(
between!(
word1(b'(', PInParens::Open),
space0_around_ee(
move |arena, state| specialize_ref(PInParens::Syntax, loc_pattern(min_indent))
move |arena, state| specialize_ref(PInParens::Pattern, loc_pattern_help(min_indent))
.parse(arena, state),
min_indent,
PInParens::Space,
@ -386,7 +379,7 @@ fn record_pattern_field<'a>(min_indent: u16) -> impl Parser<'a, Located<Pattern<
match opt_loc_val {
Some(First(_)) => {
let val_parser = specialize_ref(PRecord::Syntax, loc_pattern(min_indent));
let val_parser = specialize_ref(PRecord::Pattern, loc_pattern_help(min_indent));
let (_, loc_val, state) =
space0_before_e(val_parser, min_indent, PRecord::Space, PRecord::IndentColon)
.parse(arena, state)?;
@ -414,7 +407,7 @@ fn record_pattern_field<'a>(min_indent: u16) -> impl Parser<'a, Located<Pattern<
}
Some(Second(_)) => {
let val_parser =
specialize_ref(PRecord::Syntax, loc!(crate::expr::expr(min_indent)));
specialize_ref(PRecord::Expr, loc!(crate::expr::expr_help(min_indent)));
let (_, loc_val, state) =
space0_before_e(val_parser, min_indent, PRecord::Space, PRecord::IndentColon)

View File

@ -231,7 +231,7 @@ pub fn parse<'a>() -> impl Parser<'a, StrLiteral<'a>, EString<'a>> {
// canonicalization error if that expression variant
// is not allowed inside a string interpolation.
let (_progress, loc_expr, new_state) = skip_second!(
specialize_ref(EString::Format, loc(allocated(expr::expr(0)))),
specialize_ref(EString::Format, loc(allocated(expr::expr_help(0)))),
word1(b')', EString::FormatEnd)
)
.parse(arena, state)?;

View File

@ -172,6 +172,8 @@ enum Node {
IfElseBranch,
ListElement,
InsideParens,
RecordConditionalDefault,
StringFormat,
}
fn to_expr_report<'a>(
@ -343,6 +345,8 @@ fn to_expr_report<'a>(
]),
),
Node::ListElement => (r, c, alloc.text("a list")),
Node::RecordConditionalDefault => (r, c, alloc.text("record field default")),
Node::StringFormat => (r, c, alloc.text("a string format")),
Node::InsideParens => (r, c, alloc.text("some parentheses")),
},
Context::InDef(r, c) => (r, c, alloc.text("a definition")),
@ -662,7 +666,7 @@ fn to_unfinished_lambda_report<'a>(
fn to_str_report<'a>(
alloc: &'a RocDocAllocator<'a>,
filename: PathBuf,
_context: Context,
context: Context,
parse_problem: &roc_parse::parser::EString<'a>,
start_row: Row,
start_col: Col,
@ -671,7 +675,14 @@ fn to_str_report<'a>(
match *parse_problem {
EString::Open(_row, _col) => unreachable!("another branch would be taken"),
EString::Format(syntax, row, col) => to_syntax_report(alloc, filename, syntax, row, col),
EString::Format(expr, row, col) => to_expr_report(
alloc,
filename,
Context::InNode(Node::StringFormat, start_row, start_col, Box::new(context)),
expr,
row,
col,
),
EString::Space(error, row, col) => to_space_report(alloc, filename, &error, row, col),
EString::UnknownEscape(row, col) => {
let surroundings = Region::from_rows_cols(start_row, start_col, row, col);
@ -885,7 +896,6 @@ fn to_list_report<'a>(
use roc_parse::parser::List;
match *parse_problem {
List::Syntax(syntax, row, col) => to_syntax_report(alloc, filename, syntax, row, col),
List::Space(error, row, col) => to_space_report(alloc, filename, &error, row, col),
List::Expr(expr, row, col) => to_expr_report(
@ -994,7 +1004,6 @@ fn to_if_report<'a>(
use roc_parse::parser::If;
match *parse_problem {
If::Syntax(syntax, row, col) => to_syntax_report(alloc, filename, syntax, row, col),
If::Space(error, row, col) => to_space_report(alloc, filename, &error, row, col),
If::Condition(expr, row, col) => to_expr_report(
@ -1165,7 +1174,6 @@ fn to_when_report<'a>(
}
}
When::Syntax(syntax, row, col) => to_syntax_report(alloc, filename, syntax, row, col),
When::Space(error, row, col) => to_space_report(alloc, filename, &error, row, col),
When::Branch(expr, row, col) => to_expr_report(
@ -1558,7 +1566,20 @@ fn to_precord_report<'a>(
PRecord::Pattern(pattern, row, col) => {
to_pattern_report(alloc, filename, pattern, row, col)
}
PRecord::Syntax(syntax, row, col) => to_syntax_report(alloc, filename, syntax, row, col),
PRecord::Expr(expr, row, col) => to_expr_report(
alloc,
filename,
Context::InNode(
Node::RecordConditionalDefault,
start_row,
start_col,
Box::new(Context::InDef(row, col)),
),
expr,
row,
col,
),
PRecord::IndentOpen(row, col) => {
let surroundings = Region::from_rows_cols(start_row, start_col, row, col);