Merge branch 'trunk' into rename-many-list-builtins

This commit is contained in:
Chadtech 2020-07-25 03:45:49 -04:00 committed by GitHub
commit c1e4b77a7b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 474 additions and 359 deletions

771
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -81,6 +81,7 @@ where
let mut is_capitalized; let mut is_capitalized;
let is_accessor_fn; let is_accessor_fn;
let mut is_private_tag = false; let mut is_private_tag = false;
let mut chars_parsed;
// Identifiers and accessor functions must start with either a letter or a dot. // Identifiers and accessor functions must start with either a letter or a dot.
// If this starts with neither, it must be something else! // If this starts with neither, it must be something else!
@ -96,6 +97,8 @@ where
is_private_tag = true; is_private_tag = true;
is_capitalized = true; is_capitalized = true;
is_accessor_fn = false; is_accessor_fn = false;
chars_parsed = 2;
} }
Some(ch) => { Some(ch) => {
return Err(unexpected(ch, 0, state, Attempting::Identifier)); return Err(unexpected(ch, 0, state, Attempting::Identifier));
@ -109,9 +112,13 @@ where
is_capitalized = ch.is_uppercase(); is_capitalized = ch.is_uppercase();
is_accessor_fn = false; is_accessor_fn = false;
chars_parsed = 1;
} else if ch == '.' { } else if ch == '.' {
is_capitalized = false; is_capitalized = false;
is_accessor_fn = true; is_accessor_fn = true;
chars_parsed = 1;
} else { } else {
return Err(unexpected(ch, 0, state, Attempting::Identifier)); return Err(unexpected(ch, 0, state, Attempting::Identifier));
} }
@ -121,7 +128,6 @@ where
} }
}; };
let mut chars_parsed = part_buf.len();
let mut next_char = None; let mut next_char = None;
while let Some(ch) = chars.next() { while let Some(ch) = chars.next() {

View file

@ -3667,26 +3667,40 @@ mod test_reporting {
) )
} }
// TODO field accessors give a parse error at the moment #[test]
// #[test] fn optional_record_invalid_accessor() {
// fn optional_record_invalid_accessor() { report_problem_as(
// report_problem_as( indoc!(
// indoc!( r#"
// r#" f : { x : Int, y ? Int } -> Int
// f : { x : Int, y ? Int } -> Int f = \r -> .y r
// f = \r -> .y r
// f
// f "#
// "# ),
// ), indoc!(
// indoc!( r#"
// r#" -- TYPE MISMATCH ---------------------------------------------------------------
// -- TYPE MISMATCH ---------------------------------------------------------------
// The 1st argument to this function is not what I expect:
// "#
// ), 2 f = \r -> .y r
// ) ^
// }
This `r` value is a:
{ x : Int, y ? Int }
But this function needs the 1st argument to be:
{ x : Int, y : Int }
Hint: To extract the `.y` field it must be non-optional, but the type
says this field is optional. Learn more about optional fields at TODO.
"#
),
)
}
#[test] #[test]
fn guard_mismatch_with_annotation() { fn guard_mismatch_with_annotation() {