Fix approximately a bajillion fmt and parsing bugs

(discovered by fuzzing)

There's more to come, but this seems like a good batch for now.
This commit is contained in:
Joshua Warner 2023-01-11 19:44:29 -08:00
parent 8f62eeaf7e
commit 0b8e68f70d
No known key found for this signature in database
GPG key ID: 89AD497003F93FDD
68 changed files with 1011 additions and 229 deletions

View file

@ -6,6 +6,9 @@ license = "UPL-1.0"
edition = "2021"
description = "Tests for the parse + fmt crates."
[features]
"parse_debug_trace" = ["roc_parse/parse_debug_trace"]
[dependencies]
roc_collections = { path = "../collections" }
roc_region = { path = "../region" }

View file

@ -219,7 +219,7 @@ impl<'a> Input<'a> {
* * * AST after formatting:\n{:#?}\n\n",
self.as_str(),
output.as_ref().as_str(),
ast_normalized,
actual,
reparsed_ast_normalized
);
}
@ -229,7 +229,10 @@ impl<'a> Input<'a> {
let reformatted = reparsed_ast.format();
if output != reformatted {
eprintln!("Formatting bug; formatting is not stable.\nOriginal code:\n{}\n\nFormatted code:\n{}\n\n", self.as_str(), output.as_ref().as_str());
eprintln!("Formatting bug; formatting is not stable.\nOriginal code:\n{}\n\nFormatted code:\n{}\n\nAST:\n{:#?}\n\n",
self.as_str(),
output.as_ref().as_str(),
actual);
eprintln!("Reformatting the formatted code changed it again, as follows:\n\n");
assert_multiline_str_eq!(output.as_ref().as_str(), reformatted.as_ref().as_str());

View file

@ -1 +1 @@
Expr(BadExprEnd(@20), @0)
Expr(BadExprEnd(@22), @0)

View file

@ -0,0 +1,25 @@
Apply(
@0-1 SpaceAfter(
Var {
module_name: "",
ident: "f",
},
[
Newline,
],
),
[
@2-4 Num(
"-5",
),
@5-6 SpaceBefore(
Num(
"2",
),
[
Newline,
],
),
],
Space,
)

View file

@ -0,0 +1,42 @@
Defs(
Defs {
tags: [
Index(0),
],
regions: [
@0-3,
],
space_before: [
Slice(start = 0, length = 0),
],
space_after: [
Slice(start = 0, length = 0),
],
spaces: [],
type_defs: [
Alias {
header: TypeHeader {
name: @0-1 "F",
vars: [],
},
ann: @2-3 BoundVariable(
"e",
),
},
],
value_defs: [],
},
@7-8 SpaceBefore(
Var {
module_name: "",
ident: "q",
},
[
LineComment(
"",
),
Newline,
Newline,
],
),
)

View file

@ -0,0 +1,13 @@
ParensAround(
SpaceAfter(
Var {
module_name: "",
ident: "i",
},
[
LineComment(
"abc",
),
],
),
)

View file

@ -0,0 +1,54 @@
Defs(
Defs {
tags: [
Index(0),
],
regions: [
@0-7,
],
space_before: [
Slice(start = 0, length = 0),
],
space_after: [
Slice(start = 0, length = 0),
],
spaces: [],
type_defs: [
Alias {
header: TypeHeader {
name: @0-1 "Z",
vars: [
@3-4 SpaceAfter(
SpaceBefore(
Identifier(
"h",
),
[
LineComment(
"",
),
],
),
[
Newline,
],
),
],
},
ann: @6-7 BoundVariable(
"a",
),
},
],
value_defs: [],
},
@8-9 SpaceBefore(
Var {
module_name: "",
ident: "j",
},
[
Newline,
],
),
)

View file

@ -0,0 +1,43 @@
Defs(
Defs {
tags: [
Index(2147483648),
],
regions: [
@0-5,
],
space_before: [
Slice(start = 0, length = 0),
],
space_after: [
Slice(start = 0, length = 0),
],
spaces: [],
type_defs: [],
value_defs: [
Annotation(
@0-1 SpaceAfter(
Identifier(
"w",
),
[
LineComment(
"",
),
],
),
@4-5 BoundVariable(
"n",
),
),
],
},
@6-7 SpaceBefore(
Tag(
"Q",
),
[
Newline,
],
),
)

View file

@ -0,0 +1,44 @@
Defs(
Defs {
tags: [
Index(2147483648),
],
regions: [
@0-5,
],
space_before: [
Slice(start = 0, length = 0),
],
space_after: [
Slice(start = 0, length = 0),
],
spaces: [],
type_defs: [],
value_defs: [
Body(
@0-1 SpaceAfter(
Identifier(
"t",
),
[
LineComment(
"",
),
],
),
@4-5 Num(
"3",
),
),
],
},
@6-7 SpaceBefore(
Var {
module_name: "",
ident: "e",
},
[
Newline,
],
),
)

View file

@ -16,8 +16,11 @@ Defs(
type_defs: [],
value_defs: [
Body(
@0-7 Malformed(
@0-7 MalformedIdent(
"my_list",
Underscore(
@3,
),
),
@10-58 List(
Collection {

View file

@ -16,8 +16,11 @@ Defs(
type_defs: [],
value_defs: [
Body(
@0-7 Malformed(
@0-7 MalformedIdent(
"my_list",
Underscore(
@3,
),
),
@10-26 List(
[

View file

@ -16,8 +16,11 @@ Defs(
type_defs: [],
value_defs: [
Body(
@0-7 Malformed(
@0-7 MalformedIdent(
"my_list",
Underscore(
@3,
),
),
@10-27 List(
Collection {

View file

@ -0,0 +1,29 @@
Backpassing(
[
@0-3 Apply(
@0-1 Tag(
"F",
),
[
@2-3 NumLiteral(
"1",
),
],
),
@5-6 Identifier(
"r",
),
],
@10-11 Var {
module_name: "",
ident: "a",
},
@12-13 SpaceBefore(
Tag(
"W",
),
[
Newline,
],
),
)

View file

@ -0,0 +1,23 @@
Apply(
@0-1 Var {
module_name: "",
ident: "e",
},
[
@1-10 Str(
Block(
[
[
Plaintext(
"\"",
),
EscapedChar(
DoubleQuote,
),
],
],
),
),
],
Space,
)

View file

@ -0,0 +1,8 @@
UnaryOp(
@1-7 Str(
Block(
[],
),
),
@0-1 Not,
)

View file

@ -0,0 +1,58 @@
Defs(
Defs {
tags: [
Index(2147483648),
],
regions: [
@0-9,
],
space_before: [
Slice(start = 0, length = 0),
],
space_after: [
Slice(start = 0, length = 0),
],
spaces: [],
type_defs: [],
value_defs: [
Body(
@0-1 Identifier(
"a",
),
@2-9 Apply(
@2-3 SpaceAfter(
Tag(
"A",
),
[
Newline,
],
),
[
@5-7 UnaryOp(
@6-7 Var {
module_name: "",
ident: "g",
},
@5-6 Negate,
),
@8-9 Var {
module_name: "",
ident: "a",
},
],
Space,
),
),
],
},
@10-11 SpaceBefore(
Var {
module_name: "",
ident: "a",
},
[
Newline,
],
),
)

View file

@ -0,0 +1,3 @@
a=A
-g a
a

View file

@ -0,0 +1,64 @@
Defs(
Defs {
tags: [
Index(2147483648),
],
regions: [
@0-7,
],
space_before: [
Slice(start = 0, length = 0),
],
space_after: [
Slice(start = 0, length = 0),
],
spaces: [],
type_defs: [],
value_defs: [
Body(
@0-1 Identifier(
"x",
),
@2-7 Defs(
Defs {
tags: [
Index(2147483648),
],
regions: [
@2-5,
],
space_before: [
Slice(start = 0, length = 0),
],
space_after: [
Slice(start = 0, length = 0),
],
spaces: [],
type_defs: [],
value_defs: [
Annotation(
@2-3 Identifier(
"a",
),
@4-5 BoundVariable(
"n",
),
),
],
},
@6-7 Num(
"4",
),
),
),
],
},
@8-9 SpaceBefore(
Underscore(
"",
),
[
Newline,
],
),
)

View file

@ -0,0 +1,10 @@
ParensAround(
SpaceBefore(
Tag(
"A",
),
[
Newline,
],
),
)

View file

@ -0,0 +1,49 @@
BinOps(
[
(
@0-1 SpaceAfter(
Num(
"7",
),
[
Newline,
],
),
@2-4 Equals,
),
],
@5-11 ParensAround(
Defs(
Defs {
tags: [
Index(0),
],
regions: [
@5-8,
],
space_before: [
Slice(start = 0, length = 0),
],
space_after: [
Slice(start = 0, length = 0),
],
spaces: [],
type_defs: [
Alias {
header: TypeHeader {
name: @5-6 "Q",
vars: [],
},
ann: @7-8 BoundVariable(
"c",
),
},
],
value_defs: [],
},
@9-11 Num(
"42",
),
),
),
)

View file

@ -0,0 +1,51 @@
Defs(
Defs {
tags: [
Index(0),
],
regions: [
@0-6,
],
space_before: [
Slice(start = 0, length = 0),
],
space_after: [
Slice(start = 0, length = 0),
],
spaces: [],
type_defs: [
Alias {
header: TypeHeader {
name: @0-1 "A",
vars: [],
},
ann: @2-6 Apply(
"",
"A",
[
@5-6 SpaceBefore(
Apply(
"",
"A",
[],
),
[
Newline,
],
),
],
),
},
],
value_defs: [],
},
@7-8 SpaceBefore(
Var {
module_name: "",
ident: "p",
},
[
Newline,
],
),
)

View file

@ -0,0 +1,42 @@
Defs(
Defs {
tags: [
Index(0),
],
regions: [
@0-3,
],
space_before: [
Slice(start = 0, length = 0),
],
space_after: [
Slice(start = 0, length = 0),
],
spaces: [],
type_defs: [
Alias {
header: TypeHeader {
name: @0-1 "J",
vars: [],
},
ann: @2-3 Apply(
"",
"R",
[],
),
},
],
value_defs: [],
},
@5-8 SpaceBefore(
MalformedIdent(
"n_p",
Underscore(
@7,
),
),
[
Newline,
],
),
)

View file

@ -0,0 +1,3 @@
a : F
F : h
abc

View file

@ -0,0 +1,55 @@
Defs(
Defs {
tags: [
Index(2147483648),
Index(0),
],
regions: [
@0-3,
@4-8,
],
space_before: [
Slice(start = 0, length = 0),
Slice(start = 0, length = 1),
],
space_after: [
Slice(start = 0, length = 0),
Slice(start = 1, length = 0),
],
spaces: [
Newline,
],
type_defs: [
Alias {
header: TypeHeader {
name: @4-5 "F",
vars: [],
},
ann: @7-8 BoundVariable(
"h",
),
},
],
value_defs: [
Annotation(
@0-1 Identifier(
"a",
),
@2-3 Apply(
"",
"F",
[],
),
),
],
},
@9-12 SpaceBefore(
Var {
module_name: "",
ident: "abc",
},
[
Newline,
],
),
)

View file

@ -0,0 +1,4 @@
a:F
F
:h
abc

View file

@ -213,7 +213,6 @@ mod test_fmt {
indoc!(
r#"
x = 0 # comment
x
"#
),
@ -1410,6 +1409,7 @@ mod test_fmt {
r#"
f = \x ->
# 1st
# 2nd
x
@ -1693,6 +1693,7 @@ mod test_fmt {
),
);
// TODO: do we want to override the user's intent like this?
expr_formats_to(
indoc!(
r#"
@ -1821,6 +1822,7 @@ mod test_fmt {
),
);
// TODO: do we want to override the user's intent like this?
expr_formats_to(
indoc!(
r#"

View file

@ -252,9 +252,15 @@ mod test_snapshots {
pass/basic_tuple.expr,
pass/basic_var.expr,
pass/bound_variable.expr,
pass/call_with_newlines.expr,
pass/closure_with_underscores.expr,
pass/comment_after_annotation.expr,
pass/comment_after_def.moduledefs,
pass/comment_after_expr_in_parens.expr,
pass/comment_after_op.expr,
pass/comment_after_tag_in_def.expr,
pass/comment_before_colon_def.expr,
pass/comment_before_equals_def.expr,
pass/comment_before_op.expr,
pass/comment_inside_empty_list.expr,
pass/comment_with_non_ascii.expr,
@ -303,26 +309,34 @@ mod test_snapshots {
pass/mixed_docs.expr,
pass/module_def_newline.moduledefs,
pass/multi_backpassing.expr,
pass/multi_backpassing_with_apply.expr,
pass/multi_char_string.expr,
pass/multiline_string.expr,
pass/multiline_string_in_apply.expr,
pass/multiline_tuple_with_comments.expr,
pass/multiline_type_signature.expr,
pass/multiline_type_signature_with_comment.expr,
pass/multiple_fields.expr,
pass/multiple_operators.expr,
pass/neg_inf_float.expr,
pass/negate_multiline_string.expr,
pass/negative_float.expr,
pass/negative_in_apply_def.expr,
pass/negative_int.expr,
pass/nested_def_annotation.moduledefs,
pass/nested_def_without_newline.expr,
pass/nested_if.expr,
pass/nested_module.header,
pass/newline_after_equals.expr, // Regression test for https://github.com/roc-lang/roc/issues/51
pass/newline_after_mul.expr,
pass/newline_after_paren.expr,
pass/newline_after_sub.expr,
pass/newline_and_spaces_before_less_than.expr,
pass/newline_before_add.expr,
pass/newline_before_operator_with_defs.expr,
pass/newline_before_sub.expr,
pass/newline_in_packages.full,
pass/newline_in_type_alias_application.expr,
pass/newline_in_type_def.expr,
pass/newline_inside_empty_list.expr,
pass/newline_singleton_list.expr,
@ -407,7 +421,9 @@ mod test_snapshots {
pass/unary_not.expr,
pass/unary_not_with_parens.expr,
pass/underscore_backpassing.expr,
pass/underscore_expr_in_def.expr,
pass/underscore_in_assignment_pattern.expr,
pass/value_def_confusion.expr,
pass/var_else.expr,
pass/var_if.expr,
pass/var_is.expr,