From 8de8137af4f04c5301c2a55f34f52c3b9eff7390 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 29 Dec 2025 08:07:08 -0600 Subject: [PATCH 1/2] test(parser): Unclosed key errors --- .../ext/string/no-close-recovery-03.toml | 20 + .../ext/string/no-close-recovery-03.stderr | 54 ++ .../ext/string/no-close-recovery-03.toml | 20 + .../ext/string/no-close-recovery-03.stderr | 5 + ...__document_unclosed_dotted_key_abspath.txt | 405 ++++++++++++++ ...__document_unclosed_dotted_key_relpath.txt | 495 +++++++++++++++++ ...ment_unclosed_inline_table_key_abspath.txt | 451 ++++++++++++++++ ...ment_unclosed_inline_table_key_relpath.txt | 509 ++++++++++++++++++ ...t__document_unclosed_table_key_abspath.txt | 405 ++++++++++++++ ...t__document_unclosed_table_key_relpath.txt | 495 +++++++++++++++++ .../tests/testsuite/parse_document.rs | 120 +++++ 11 files changed, 2979 insertions(+) create mode 100644 crates/toml/tests/fixtures/invalid/ext/string/no-close-recovery-03.toml create mode 100644 crates/toml/tests/snapshots/invalid/ext/string/no-close-recovery-03.stderr create mode 100644 crates/toml_edit/tests/fixtures/invalid/ext/string/no-close-recovery-03.toml create mode 100644 crates/toml_edit/tests/snapshots/invalid/ext/string/no-close-recovery-03.stderr create mode 100644 crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_dotted_key_abspath.txt create mode 100644 crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_dotted_key_relpath.txt create mode 100644 crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_inline_table_key_abspath.txt create mode 100644 crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_inline_table_key_relpath.txt create mode 100644 crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_table_key_abspath.txt create mode 100644 crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_table_key_relpath.txt diff --git a/crates/toml/tests/fixtures/invalid/ext/string/no-close-recovery-03.toml b/crates/toml/tests/fixtures/invalid/ext/string/no-close-recovery-03.toml new file mode 100644 index 000000000..36e60af9c --- /dev/null +++ b/crates/toml/tests/fixtures/invalid/ext/string/no-close-recovery-03.toml @@ -0,0 +1,20 @@ +[package] +name = "a_name" +version = "0.1.0" +edition = "2024" + +[dependencies] +crate1 = { version = "0.1.0" } +crate2 = { version = "1.0.0", features=[] } + +[patch.crates-io] +crate3."path = "../somewhere" +crate4."path = "/somewhere" +crate5 = { "path = "../somewhere" } +crate6 = { "path = "/somewhere" } + +[patch.crates-io.crate7] +"path = "../somewhere" + +[patch.crates-io.crate8] +"path = "/somewhere" diff --git a/crates/toml/tests/snapshots/invalid/ext/string/no-close-recovery-03.stderr b/crates/toml/tests/snapshots/invalid/ext/string/no-close-recovery-03.stderr new file mode 100644 index 000000000..f82e7b8fb --- /dev/null +++ b/crates/toml/tests/snapshots/invalid/ext/string/no-close-recovery-03.stderr @@ -0,0 +1,54 @@ +TOML parse error at line 11, column 30 + | +11 | crate3."path = "../somewhere" + | ^ +key with no value, expected `=` + +--- +TOML parse error at line 12, column 17 + | +12 | crate4."path = "/somewhere" + | ^ +key with no value, expected `=` + +--- +TOML parse error at line 14, column 21 + | +14 | crate6 = { "path = "/somewhere" } + | ^ +missing assignment between key-value pairs, expected `=` + +--- +TOML parse error at line 17, column 23 + | +17 | "path = "../somewhere" + | ^ +key with no value, expected `=` + +--- +TOML parse error at line 20, column 10 + | +20 | "path = "/somewhere" + | ^ +key with no value, expected `=` + +--- +TOML parse error at line 11, column 18 + | +11 | crate3."path = "../somewhere" + | ^ +unquoted keys cannot be empty, expected letters, numbers, `-`, `_` + +--- +TOML parse error at line 11, column 19 + | +11 | crate3."path = "../somewhere" + | ^ +invalid unquoted key, expected letters, numbers, `-`, `_` + +--- +TOML parse error at line 11, column 29 + | +11 | crate3."path = "../somewhere" + | ^ +invalid unquoted key, expected letters, numbers, `-`, `_` diff --git a/crates/toml_edit/tests/fixtures/invalid/ext/string/no-close-recovery-03.toml b/crates/toml_edit/tests/fixtures/invalid/ext/string/no-close-recovery-03.toml new file mode 100644 index 000000000..36e60af9c --- /dev/null +++ b/crates/toml_edit/tests/fixtures/invalid/ext/string/no-close-recovery-03.toml @@ -0,0 +1,20 @@ +[package] +name = "a_name" +version = "0.1.0" +edition = "2024" + +[dependencies] +crate1 = { version = "0.1.0" } +crate2 = { version = "1.0.0", features=[] } + +[patch.crates-io] +crate3."path = "../somewhere" +crate4."path = "/somewhere" +crate5 = { "path = "../somewhere" } +crate6 = { "path = "/somewhere" } + +[patch.crates-io.crate7] +"path = "../somewhere" + +[patch.crates-io.crate8] +"path = "/somewhere" diff --git a/crates/toml_edit/tests/snapshots/invalid/ext/string/no-close-recovery-03.stderr b/crates/toml_edit/tests/snapshots/invalid/ext/string/no-close-recovery-03.stderr new file mode 100644 index 000000000..2c8e460da --- /dev/null +++ b/crates/toml_edit/tests/snapshots/invalid/ext/string/no-close-recovery-03.stderr @@ -0,0 +1,5 @@ +TOML parse error at line 11, column 30 + | +11 | crate3."path = "../somewhere" + | ^ +key with no value, expected `=` diff --git a/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_dotted_key_abspath.txt b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_dotted_key_abspath.txt new file mode 100644 index 000000000..1f2332a00 --- /dev/null +++ b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_dotted_key_abspath.txt @@ -0,0 +1,405 @@ +EventResults { + input: "\n[package]\nname = \"a_name\"\nversion = \"0.1.0\"\nedition = \"2024\"\n\n[dependencies]\ncrate1 = { version = \"0.1.0\" }\ncrate2 = { version = \"1.0.0\", features=[] }\n\n[patch.crates-io]\ncrate4.\"path = \"/somewhere\"\n", + events: [ + Event { + kind: Newline, + encoding: None, + span: 0..1, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 1..2, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 2..9, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 9..10, + }, + Event { + kind: Newline, + encoding: None, + span: 10..11, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 11..15, + }, + Event { + kind: Whitespace, + encoding: None, + span: 15..16, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 16..17, + }, + Event { + kind: Whitespace, + encoding: None, + span: 17..18, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 18..26, + }, + Event { + kind: Newline, + encoding: None, + span: 26..27, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 27..34, + }, + Event { + kind: Whitespace, + encoding: None, + span: 34..35, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 35..36, + }, + Event { + kind: Whitespace, + encoding: None, + span: 36..37, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 37..44, + }, + Event { + kind: Newline, + encoding: None, + span: 44..45, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 45..52, + }, + Event { + kind: Whitespace, + encoding: None, + span: 52..53, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 53..54, + }, + Event { + kind: Whitespace, + encoding: None, + span: 54..55, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 55..61, + }, + Event { + kind: Newline, + encoding: None, + span: 61..62, + }, + Event { + kind: Newline, + encoding: None, + span: 62..63, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 63..64, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 64..76, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 76..77, + }, + Event { + kind: Newline, + encoding: None, + span: 77..78, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 78..84, + }, + Event { + kind: Whitespace, + encoding: None, + span: 84..85, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 85..86, + }, + Event { + kind: Whitespace, + encoding: None, + span: 86..87, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 87..88, + }, + Event { + kind: Whitespace, + encoding: None, + span: 88..89, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 89..96, + }, + Event { + kind: Whitespace, + encoding: None, + span: 96..97, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 97..98, + }, + Event { + kind: Whitespace, + encoding: None, + span: 98..99, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 99..106, + }, + Event { + kind: Whitespace, + encoding: None, + span: 106..107, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 107..108, + }, + Event { + kind: Newline, + encoding: None, + span: 108..109, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 109..115, + }, + Event { + kind: Whitespace, + encoding: None, + span: 115..116, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 116..117, + }, + Event { + kind: Whitespace, + encoding: None, + span: 117..118, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 118..119, + }, + Event { + kind: Whitespace, + encoding: None, + span: 119..120, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 120..127, + }, + Event { + kind: Whitespace, + encoding: None, + span: 127..128, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 128..129, + }, + Event { + kind: Whitespace, + encoding: None, + span: 129..130, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 130..137, + }, + Event { + kind: ValueSep, + encoding: None, + span: 137..138, + }, + Event { + kind: Whitespace, + encoding: None, + span: 138..139, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 139..147, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 147..148, + }, + Event { + kind: ArrayOpen, + encoding: None, + span: 148..149, + }, + Event { + kind: ArrayClose, + encoding: None, + span: 149..150, + }, + Event { + kind: Whitespace, + encoding: None, + span: 150..151, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 151..152, + }, + Event { + kind: Newline, + encoding: None, + span: 152..153, + }, + Event { + kind: Newline, + encoding: None, + span: 153..154, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 154..155, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 155..160, + }, + Event { + kind: KeySep, + encoding: None, + span: 160..161, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 161..170, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 170..171, + }, + Event { + kind: Newline, + encoding: None, + span: 171..172, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 172..178, + }, + Event { + kind: KeySep, + encoding: None, + span: 178..179, + }, + Event { + kind: SimpleKey, + encoding: Some( + BasicString, + ), + span: 179..188, + }, + Event { + kind: Error, + encoding: None, + span: 188..199, + }, + Event { + kind: Newline, + encoding: None, + span: 199..200, + }, + ], + errors: [ + ParseError { + context: Some( + 188..188, + ), + description: "key with no value", + expected: Some( + [ + Literal( + "=", + ), + ], + ), + unexpected: Some( + 188..188, + ), + }, + ], +} diff --git a/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_dotted_key_relpath.txt b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_dotted_key_relpath.txt new file mode 100644 index 000000000..c28f8ab90 --- /dev/null +++ b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_dotted_key_relpath.txt @@ -0,0 +1,495 @@ +EventResults { + input: "\n[package]\nname = \"a_name\"\nversion = \"0.1.0\"\nedition = \"2024\"\n\n[dependencies]\ncrate1 = { version = \"0.1.0\" }\ncrate2 = { version = \"1.0.0\", features=[] }\n\n[patch.crates-io]\ncrate3.\"path = \"../somewhere\"\n", + events: [ + Event { + kind: Newline, + encoding: None, + span: 0..1, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 1..2, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 2..9, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 9..10, + }, + Event { + kind: Newline, + encoding: None, + span: 10..11, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 11..15, + }, + Event { + kind: Whitespace, + encoding: None, + span: 15..16, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 16..17, + }, + Event { + kind: Whitespace, + encoding: None, + span: 17..18, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 18..26, + }, + Event { + kind: Newline, + encoding: None, + span: 26..27, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 27..34, + }, + Event { + kind: Whitespace, + encoding: None, + span: 34..35, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 35..36, + }, + Event { + kind: Whitespace, + encoding: None, + span: 36..37, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 37..44, + }, + Event { + kind: Newline, + encoding: None, + span: 44..45, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 45..52, + }, + Event { + kind: Whitespace, + encoding: None, + span: 52..53, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 53..54, + }, + Event { + kind: Whitespace, + encoding: None, + span: 54..55, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 55..61, + }, + Event { + kind: Newline, + encoding: None, + span: 61..62, + }, + Event { + kind: Newline, + encoding: None, + span: 62..63, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 63..64, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 64..76, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 76..77, + }, + Event { + kind: Newline, + encoding: None, + span: 77..78, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 78..84, + }, + Event { + kind: Whitespace, + encoding: None, + span: 84..85, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 85..86, + }, + Event { + kind: Whitespace, + encoding: None, + span: 86..87, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 87..88, + }, + Event { + kind: Whitespace, + encoding: None, + span: 88..89, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 89..96, + }, + Event { + kind: Whitespace, + encoding: None, + span: 96..97, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 97..98, + }, + Event { + kind: Whitespace, + encoding: None, + span: 98..99, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 99..106, + }, + Event { + kind: Whitespace, + encoding: None, + span: 106..107, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 107..108, + }, + Event { + kind: Newline, + encoding: None, + span: 108..109, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 109..115, + }, + Event { + kind: Whitespace, + encoding: None, + span: 115..116, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 116..117, + }, + Event { + kind: Whitespace, + encoding: None, + span: 117..118, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 118..119, + }, + Event { + kind: Whitespace, + encoding: None, + span: 119..120, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 120..127, + }, + Event { + kind: Whitespace, + encoding: None, + span: 127..128, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 128..129, + }, + Event { + kind: Whitespace, + encoding: None, + span: 129..130, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 130..137, + }, + Event { + kind: ValueSep, + encoding: None, + span: 137..138, + }, + Event { + kind: Whitespace, + encoding: None, + span: 138..139, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 139..147, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 147..148, + }, + Event { + kind: ArrayOpen, + encoding: None, + span: 148..149, + }, + Event { + kind: ArrayClose, + encoding: None, + span: 149..150, + }, + Event { + kind: Whitespace, + encoding: None, + span: 150..151, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 151..152, + }, + Event { + kind: Newline, + encoding: None, + span: 152..153, + }, + Event { + kind: Newline, + encoding: None, + span: 153..154, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 154..155, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 155..160, + }, + Event { + kind: KeySep, + encoding: None, + span: 160..161, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 161..170, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 170..171, + }, + Event { + kind: Newline, + encoding: None, + span: 171..172, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 172..178, + }, + Event { + kind: KeySep, + encoding: None, + span: 178..179, + }, + Event { + kind: SimpleKey, + encoding: Some( + BasicString, + ), + span: 179..188, + }, + Event { + kind: KeySep, + encoding: None, + span: 188..189, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 189..189, + }, + Event { + kind: KeySep, + encoding: None, + span: 189..190, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 190..201, + }, + Event { + kind: Newline, + encoding: None, + span: 201..202, + }, + ], + errors: [ + ParseError { + context: Some( + 201..201, + ), + description: "key with no value", + expected: Some( + [ + Literal( + "=", + ), + ], + ), + unexpected: Some( + 201..201, + ), + }, + ParseError { + context: Some( + 189..189, + ), + description: "unquoted keys cannot be empty", + expected: Some( + [ + Description( + "letters", + ), + Description( + "numbers", + ), + Literal( + "-", + ), + Literal( + "_", + ), + ], + ), + unexpected: Some( + 189..189, + ), + }, + ParseError { + context: Some( + 190..201, + ), + description: "invalid unquoted key", + expected: Some( + [ + Description( + "letters", + ), + Description( + "numbers", + ), + Literal( + "-", + ), + Literal( + "_", + ), + ], + ), + unexpected: Some( + 190..190, + ), + }, + ParseError { + context: Some( + 190..201, + ), + description: "invalid unquoted key", + expected: Some( + [ + Description( + "letters", + ), + Description( + "numbers", + ), + Literal( + "-", + ), + Literal( + "_", + ), + ], + ), + unexpected: Some( + 200..200, + ), + }, + ], +} diff --git a/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_inline_table_key_abspath.txt b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_inline_table_key_abspath.txt new file mode 100644 index 000000000..7c73d7c50 --- /dev/null +++ b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_inline_table_key_abspath.txt @@ -0,0 +1,451 @@ +EventResults { + input: "\n[package]\nname = \"a_name\"\nversion = \"0.1.0\"\nedition = \"2024\"\n\n[dependencies]\ncrate1 = { version = \"0.1.0\" }\ncrate2 = { version = \"1.0.0\", features=[] }\n\n[patch.crates-io]\ncrate6 = { \"path = \"/somewhere\" }\n", + events: [ + Event { + kind: Newline, + encoding: None, + span: 0..1, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 1..2, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 2..9, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 9..10, + }, + Event { + kind: Newline, + encoding: None, + span: 10..11, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 11..15, + }, + Event { + kind: Whitespace, + encoding: None, + span: 15..16, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 16..17, + }, + Event { + kind: Whitespace, + encoding: None, + span: 17..18, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 18..26, + }, + Event { + kind: Newline, + encoding: None, + span: 26..27, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 27..34, + }, + Event { + kind: Whitespace, + encoding: None, + span: 34..35, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 35..36, + }, + Event { + kind: Whitespace, + encoding: None, + span: 36..37, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 37..44, + }, + Event { + kind: Newline, + encoding: None, + span: 44..45, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 45..52, + }, + Event { + kind: Whitespace, + encoding: None, + span: 52..53, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 53..54, + }, + Event { + kind: Whitespace, + encoding: None, + span: 54..55, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 55..61, + }, + Event { + kind: Newline, + encoding: None, + span: 61..62, + }, + Event { + kind: Newline, + encoding: None, + span: 62..63, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 63..64, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 64..76, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 76..77, + }, + Event { + kind: Newline, + encoding: None, + span: 77..78, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 78..84, + }, + Event { + kind: Whitespace, + encoding: None, + span: 84..85, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 85..86, + }, + Event { + kind: Whitespace, + encoding: None, + span: 86..87, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 87..88, + }, + Event { + kind: Whitespace, + encoding: None, + span: 88..89, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 89..96, + }, + Event { + kind: Whitespace, + encoding: None, + span: 96..97, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 97..98, + }, + Event { + kind: Whitespace, + encoding: None, + span: 98..99, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 99..106, + }, + Event { + kind: Whitespace, + encoding: None, + span: 106..107, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 107..108, + }, + Event { + kind: Newline, + encoding: None, + span: 108..109, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 109..115, + }, + Event { + kind: Whitespace, + encoding: None, + span: 115..116, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 116..117, + }, + Event { + kind: Whitespace, + encoding: None, + span: 117..118, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 118..119, + }, + Event { + kind: Whitespace, + encoding: None, + span: 119..120, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 120..127, + }, + Event { + kind: Whitespace, + encoding: None, + span: 127..128, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 128..129, + }, + Event { + kind: Whitespace, + encoding: None, + span: 129..130, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 130..137, + }, + Event { + kind: ValueSep, + encoding: None, + span: 137..138, + }, + Event { + kind: Whitespace, + encoding: None, + span: 138..139, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 139..147, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 147..148, + }, + Event { + kind: ArrayOpen, + encoding: None, + span: 148..149, + }, + Event { + kind: ArrayClose, + encoding: None, + span: 149..150, + }, + Event { + kind: Whitespace, + encoding: None, + span: 150..151, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 151..152, + }, + Event { + kind: Newline, + encoding: None, + span: 152..153, + }, + Event { + kind: Newline, + encoding: None, + span: 153..154, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 154..155, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 155..160, + }, + Event { + kind: KeySep, + encoding: None, + span: 160..161, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 161..170, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 170..171, + }, + Event { + kind: Newline, + encoding: None, + span: 171..172, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 172..178, + }, + Event { + kind: Whitespace, + encoding: None, + span: 178..179, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 179..180, + }, + Event { + kind: Whitespace, + encoding: None, + span: 180..181, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 181..182, + }, + Event { + kind: Whitespace, + encoding: None, + span: 182..183, + }, + Event { + kind: SimpleKey, + encoding: Some( + BasicString, + ), + span: 183..192, + }, + Event { + kind: Scalar, + encoding: None, + span: 192..203, + }, + Event { + kind: Whitespace, + encoding: None, + span: 203..204, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 204..205, + }, + Event { + kind: Newline, + encoding: None, + span: 205..206, + }, + ], + errors: [ + ParseError { + context: Some( + 181..182, + ), + description: "missing assignment between key-value pairs", + expected: Some( + [ + Literal( + "=", + ), + ], + ), + unexpected: Some( + 192..192, + ), + }, + ParseError { + context: Some( + 192..203, + ), + description: "missing opening quote", + expected: Some( + [ + Literal( + "\"", + ), + ], + ), + unexpected: Some( + 192..192, + ), + }, + ], +} diff --git a/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_inline_table_key_relpath.txt b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_inline_table_key_relpath.txt new file mode 100644 index 000000000..bb8a5b391 --- /dev/null +++ b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_inline_table_key_relpath.txt @@ -0,0 +1,509 @@ +EventResults { + input: "\n[package]\nname = \"a_name\"\nversion = \"0.1.0\"\nedition = \"2024\"\n\n[dependencies]\ncrate1 = { version = \"0.1.0\" }\ncrate2 = { version = \"1.0.0\", features=[] }\n\n[patch.crates-io]\ncrate5 = { \"path = \"../somewhere\" }\n", + events: [ + Event { + kind: Newline, + encoding: None, + span: 0..1, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 1..2, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 2..9, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 9..10, + }, + Event { + kind: Newline, + encoding: None, + span: 10..11, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 11..15, + }, + Event { + kind: Whitespace, + encoding: None, + span: 15..16, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 16..17, + }, + Event { + kind: Whitespace, + encoding: None, + span: 17..18, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 18..26, + }, + Event { + kind: Newline, + encoding: None, + span: 26..27, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 27..34, + }, + Event { + kind: Whitespace, + encoding: None, + span: 34..35, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 35..36, + }, + Event { + kind: Whitespace, + encoding: None, + span: 36..37, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 37..44, + }, + Event { + kind: Newline, + encoding: None, + span: 44..45, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 45..52, + }, + Event { + kind: Whitespace, + encoding: None, + span: 52..53, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 53..54, + }, + Event { + kind: Whitespace, + encoding: None, + span: 54..55, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 55..61, + }, + Event { + kind: Newline, + encoding: None, + span: 61..62, + }, + Event { + kind: Newline, + encoding: None, + span: 62..63, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 63..64, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 64..76, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 76..77, + }, + Event { + kind: Newline, + encoding: None, + span: 77..78, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 78..84, + }, + Event { + kind: Whitespace, + encoding: None, + span: 84..85, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 85..86, + }, + Event { + kind: Whitespace, + encoding: None, + span: 86..87, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 87..88, + }, + Event { + kind: Whitespace, + encoding: None, + span: 88..89, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 89..96, + }, + Event { + kind: Whitespace, + encoding: None, + span: 96..97, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 97..98, + }, + Event { + kind: Whitespace, + encoding: None, + span: 98..99, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 99..106, + }, + Event { + kind: Whitespace, + encoding: None, + span: 106..107, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 107..108, + }, + Event { + kind: Newline, + encoding: None, + span: 108..109, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 109..115, + }, + Event { + kind: Whitespace, + encoding: None, + span: 115..116, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 116..117, + }, + Event { + kind: Whitespace, + encoding: None, + span: 117..118, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 118..119, + }, + Event { + kind: Whitespace, + encoding: None, + span: 119..120, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 120..127, + }, + Event { + kind: Whitespace, + encoding: None, + span: 127..128, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 128..129, + }, + Event { + kind: Whitespace, + encoding: None, + span: 129..130, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 130..137, + }, + Event { + kind: ValueSep, + encoding: None, + span: 137..138, + }, + Event { + kind: Whitespace, + encoding: None, + span: 138..139, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 139..147, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 147..148, + }, + Event { + kind: ArrayOpen, + encoding: None, + span: 148..149, + }, + Event { + kind: ArrayClose, + encoding: None, + span: 149..150, + }, + Event { + kind: Whitespace, + encoding: None, + span: 150..151, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 151..152, + }, + Event { + kind: Newline, + encoding: None, + span: 152..153, + }, + Event { + kind: Newline, + encoding: None, + span: 153..154, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 154..155, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 155..160, + }, + Event { + kind: KeySep, + encoding: None, + span: 160..161, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 161..170, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 170..171, + }, + Event { + kind: Newline, + encoding: None, + span: 171..172, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 172..178, + }, + Event { + kind: Whitespace, + encoding: None, + span: 178..179, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 179..180, + }, + Event { + kind: Whitespace, + encoding: None, + span: 180..181, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 181..182, + }, + Event { + kind: Whitespace, + encoding: None, + span: 182..183, + }, + Event { + kind: SimpleKey, + encoding: Some( + BasicString, + ), + span: 183..192, + }, + Event { + kind: KeySep, + encoding: None, + span: 192..193, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 193..193, + }, + Event { + kind: KeySep, + encoding: None, + span: 193..194, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 194..205, + }, + Event { + kind: Whitespace, + encoding: None, + span: 205..206, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 206..207, + }, + Event { + kind: Newline, + encoding: None, + span: 207..208, + }, + ], + errors: [ + ParseError { + context: Some( + 193..193, + ), + description: "unquoted keys cannot be empty", + expected: Some( + [ + Description( + "letters", + ), + Description( + "numbers", + ), + Literal( + "-", + ), + Literal( + "_", + ), + ], + ), + unexpected: Some( + 193..193, + ), + }, + ParseError { + context: Some( + 194..205, + ), + description: "invalid unquoted key", + expected: Some( + [ + Description( + "letters", + ), + Description( + "numbers", + ), + Literal( + "-", + ), + Literal( + "_", + ), + ], + ), + unexpected: Some( + 194..194, + ), + }, + ParseError { + context: Some( + 194..205, + ), + description: "invalid unquoted key", + expected: Some( + [ + Description( + "letters", + ), + Description( + "numbers", + ), + Literal( + "-", + ), + Literal( + "_", + ), + ], + ), + unexpected: Some( + 204..204, + ), + }, + ], +} diff --git a/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_table_key_abspath.txt b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_table_key_abspath.txt new file mode 100644 index 000000000..10425f795 --- /dev/null +++ b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_table_key_abspath.txt @@ -0,0 +1,405 @@ +EventResults { + input: "\n[package]\nname = \"a_name\"\nversion = \"0.1.0\"\nedition = \"2024\"\n\n[dependencies]\ncrate1 = { version = \"0.1.0\" }\ncrate2 = { version = \"1.0.0\", features=[] }\n\n[patch.crates-io.crate8]\n\"path = \"/somewhere\"\n", + events: [ + Event { + kind: Newline, + encoding: None, + span: 0..1, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 1..2, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 2..9, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 9..10, + }, + Event { + kind: Newline, + encoding: None, + span: 10..11, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 11..15, + }, + Event { + kind: Whitespace, + encoding: None, + span: 15..16, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 16..17, + }, + Event { + kind: Whitespace, + encoding: None, + span: 17..18, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 18..26, + }, + Event { + kind: Newline, + encoding: None, + span: 26..27, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 27..34, + }, + Event { + kind: Whitespace, + encoding: None, + span: 34..35, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 35..36, + }, + Event { + kind: Whitespace, + encoding: None, + span: 36..37, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 37..44, + }, + Event { + kind: Newline, + encoding: None, + span: 44..45, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 45..52, + }, + Event { + kind: Whitespace, + encoding: None, + span: 52..53, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 53..54, + }, + Event { + kind: Whitespace, + encoding: None, + span: 54..55, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 55..61, + }, + Event { + kind: Newline, + encoding: None, + span: 61..62, + }, + Event { + kind: Newline, + encoding: None, + span: 62..63, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 63..64, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 64..76, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 76..77, + }, + Event { + kind: Newline, + encoding: None, + span: 77..78, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 78..84, + }, + Event { + kind: Whitespace, + encoding: None, + span: 84..85, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 85..86, + }, + Event { + kind: Whitespace, + encoding: None, + span: 86..87, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 87..88, + }, + Event { + kind: Whitespace, + encoding: None, + span: 88..89, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 89..96, + }, + Event { + kind: Whitespace, + encoding: None, + span: 96..97, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 97..98, + }, + Event { + kind: Whitespace, + encoding: None, + span: 98..99, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 99..106, + }, + Event { + kind: Whitespace, + encoding: None, + span: 106..107, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 107..108, + }, + Event { + kind: Newline, + encoding: None, + span: 108..109, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 109..115, + }, + Event { + kind: Whitespace, + encoding: None, + span: 115..116, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 116..117, + }, + Event { + kind: Whitespace, + encoding: None, + span: 117..118, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 118..119, + }, + Event { + kind: Whitespace, + encoding: None, + span: 119..120, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 120..127, + }, + Event { + kind: Whitespace, + encoding: None, + span: 127..128, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 128..129, + }, + Event { + kind: Whitespace, + encoding: None, + span: 129..130, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 130..137, + }, + Event { + kind: ValueSep, + encoding: None, + span: 137..138, + }, + Event { + kind: Whitespace, + encoding: None, + span: 138..139, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 139..147, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 147..148, + }, + Event { + kind: ArrayOpen, + encoding: None, + span: 148..149, + }, + Event { + kind: ArrayClose, + encoding: None, + span: 149..150, + }, + Event { + kind: Whitespace, + encoding: None, + span: 150..151, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 151..152, + }, + Event { + kind: Newline, + encoding: None, + span: 152..153, + }, + Event { + kind: Newline, + encoding: None, + span: 153..154, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 154..155, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 155..160, + }, + Event { + kind: KeySep, + encoding: None, + span: 160..161, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 161..170, + }, + Event { + kind: KeySep, + encoding: None, + span: 170..171, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 171..177, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 177..178, + }, + Event { + kind: Newline, + encoding: None, + span: 178..179, + }, + Event { + kind: SimpleKey, + encoding: Some( + BasicString, + ), + span: 179..188, + }, + Event { + kind: Error, + encoding: None, + span: 188..199, + }, + Event { + kind: Newline, + encoding: None, + span: 199..200, + }, + ], + errors: [ + ParseError { + context: Some( + 188..188, + ), + description: "key with no value", + expected: Some( + [ + Literal( + "=", + ), + ], + ), + unexpected: Some( + 188..188, + ), + }, + ], +} diff --git a/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_table_key_relpath.txt b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_table_key_relpath.txt new file mode 100644 index 000000000..56ed25ff5 --- /dev/null +++ b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_table_key_relpath.txt @@ -0,0 +1,495 @@ +EventResults { + input: "\n[package]\nname = \"a_name\"\nversion = \"0.1.0\"\nedition = \"2024\"\n\n[dependencies]\ncrate1 = { version = \"0.1.0\" }\ncrate2 = { version = \"1.0.0\", features=[] }\n\n[patch.crates-io.crate7]\n\"path = \"../somewhere\"\n", + events: [ + Event { + kind: Newline, + encoding: None, + span: 0..1, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 1..2, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 2..9, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 9..10, + }, + Event { + kind: Newline, + encoding: None, + span: 10..11, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 11..15, + }, + Event { + kind: Whitespace, + encoding: None, + span: 15..16, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 16..17, + }, + Event { + kind: Whitespace, + encoding: None, + span: 17..18, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 18..26, + }, + Event { + kind: Newline, + encoding: None, + span: 26..27, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 27..34, + }, + Event { + kind: Whitespace, + encoding: None, + span: 34..35, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 35..36, + }, + Event { + kind: Whitespace, + encoding: None, + span: 36..37, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 37..44, + }, + Event { + kind: Newline, + encoding: None, + span: 44..45, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 45..52, + }, + Event { + kind: Whitespace, + encoding: None, + span: 52..53, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 53..54, + }, + Event { + kind: Whitespace, + encoding: None, + span: 54..55, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 55..61, + }, + Event { + kind: Newline, + encoding: None, + span: 61..62, + }, + Event { + kind: Newline, + encoding: None, + span: 62..63, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 63..64, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 64..76, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 76..77, + }, + Event { + kind: Newline, + encoding: None, + span: 77..78, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 78..84, + }, + Event { + kind: Whitespace, + encoding: None, + span: 84..85, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 85..86, + }, + Event { + kind: Whitespace, + encoding: None, + span: 86..87, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 87..88, + }, + Event { + kind: Whitespace, + encoding: None, + span: 88..89, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 89..96, + }, + Event { + kind: Whitespace, + encoding: None, + span: 96..97, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 97..98, + }, + Event { + kind: Whitespace, + encoding: None, + span: 98..99, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 99..106, + }, + Event { + kind: Whitespace, + encoding: None, + span: 106..107, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 107..108, + }, + Event { + kind: Newline, + encoding: None, + span: 108..109, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 109..115, + }, + Event { + kind: Whitespace, + encoding: None, + span: 115..116, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 116..117, + }, + Event { + kind: Whitespace, + encoding: None, + span: 117..118, + }, + Event { + kind: InlineTableOpen, + encoding: None, + span: 118..119, + }, + Event { + kind: Whitespace, + encoding: None, + span: 119..120, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 120..127, + }, + Event { + kind: Whitespace, + encoding: None, + span: 127..128, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 128..129, + }, + Event { + kind: Whitespace, + encoding: None, + span: 129..130, + }, + Event { + kind: Scalar, + encoding: Some( + BasicString, + ), + span: 130..137, + }, + Event { + kind: ValueSep, + encoding: None, + span: 137..138, + }, + Event { + kind: Whitespace, + encoding: None, + span: 138..139, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 139..147, + }, + Event { + kind: KeyValSep, + encoding: None, + span: 147..148, + }, + Event { + kind: ArrayOpen, + encoding: None, + span: 148..149, + }, + Event { + kind: ArrayClose, + encoding: None, + span: 149..150, + }, + Event { + kind: Whitespace, + encoding: None, + span: 150..151, + }, + Event { + kind: InlineTableClose, + encoding: None, + span: 151..152, + }, + Event { + kind: Newline, + encoding: None, + span: 152..153, + }, + Event { + kind: Newline, + encoding: None, + span: 153..154, + }, + Event { + kind: StdTableOpen, + encoding: None, + span: 154..155, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 155..160, + }, + Event { + kind: KeySep, + encoding: None, + span: 160..161, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 161..170, + }, + Event { + kind: KeySep, + encoding: None, + span: 170..171, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 171..177, + }, + Event { + kind: StdTableClose, + encoding: None, + span: 177..178, + }, + Event { + kind: Newline, + encoding: None, + span: 178..179, + }, + Event { + kind: SimpleKey, + encoding: Some( + BasicString, + ), + span: 179..188, + }, + Event { + kind: KeySep, + encoding: None, + span: 188..189, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 189..189, + }, + Event { + kind: KeySep, + encoding: None, + span: 189..190, + }, + Event { + kind: SimpleKey, + encoding: None, + span: 190..201, + }, + Event { + kind: Newline, + encoding: None, + span: 201..202, + }, + ], + errors: [ + ParseError { + context: Some( + 201..201, + ), + description: "key with no value", + expected: Some( + [ + Literal( + "=", + ), + ], + ), + unexpected: Some( + 201..201, + ), + }, + ParseError { + context: Some( + 189..189, + ), + description: "unquoted keys cannot be empty", + expected: Some( + [ + Description( + "letters", + ), + Description( + "numbers", + ), + Literal( + "-", + ), + Literal( + "_", + ), + ], + ), + unexpected: Some( + 189..189, + ), + }, + ParseError { + context: Some( + 190..201, + ), + description: "invalid unquoted key", + expected: Some( + [ + Description( + "letters", + ), + Description( + "numbers", + ), + Literal( + "-", + ), + Literal( + "_", + ), + ], + ), + unexpected: Some( + 190..190, + ), + }, + ParseError { + context: Some( + 190..201, + ), + description: "invalid unquoted key", + expected: Some( + [ + Description( + "letters", + ), + Description( + "numbers", + ), + Literal( + "-", + ), + Literal( + "_", + ), + ], + ), + unexpected: Some( + 200..200, + ), + }, + ], +} diff --git a/crates/toml_parser/tests/testsuite/parse_document.rs b/crates/toml_parser/tests/testsuite/parse_document.rs index f7649e084..654bf09ae 100644 --- a/crates/toml_parser/tests/testsuite/parse_document.rs +++ b/crates/toml_parser/tests/testsuite/parse_document.rs @@ -56,6 +56,126 @@ fn document_key_string_comment() { ); } +#[test] +fn document_unclosed_dotted_key_relpath() { + t( + r#" +[package] +name = "a_name" +version = "0.1.0" +edition = "2024" + +[dependencies] +crate1 = { version = "0.1.0" } +crate2 = { version = "1.0.0", features=[] } + +[patch.crates-io] +crate3."path = "../somewhere" +"#, + file![_].raw(), + ); +} + +#[test] +fn document_unclosed_dotted_key_abspath() { + t( + r#" +[package] +name = "a_name" +version = "0.1.0" +edition = "2024" + +[dependencies] +crate1 = { version = "0.1.0" } +crate2 = { version = "1.0.0", features=[] } + +[patch.crates-io] +crate4."path = "/somewhere" +"#, + file![_].raw(), + ); +} + +#[test] +fn document_unclosed_inline_table_key_relpath() { + t( + r#" +[package] +name = "a_name" +version = "0.1.0" +edition = "2024" + +[dependencies] +crate1 = { version = "0.1.0" } +crate2 = { version = "1.0.0", features=[] } + +[patch.crates-io] +crate5 = { "path = "../somewhere" } +"#, + file![_].raw(), + ); +} + +#[test] +fn document_unclosed_inline_table_key_abspath() { + t( + r#" +[package] +name = "a_name" +version = "0.1.0" +edition = "2024" + +[dependencies] +crate1 = { version = "0.1.0" } +crate2 = { version = "1.0.0", features=[] } + +[patch.crates-io] +crate6 = { "path = "/somewhere" } +"#, + file![_].raw(), + ); +} + +#[test] +fn document_unclosed_table_key_relpath() { + t( + r#" +[package] +name = "a_name" +version = "0.1.0" +edition = "2024" + +[dependencies] +crate1 = { version = "0.1.0" } +crate2 = { version = "1.0.0", features=[] } + +[patch.crates-io.crate7] +"path = "../somewhere" +"#, + file![_].raw(), + ); +} + +#[test] +fn document_unclosed_table_key_abspath() { + t( + r#" +[package] +name = "a_name" +version = "0.1.0" +edition = "2024" + +[dependencies] +crate1 = { version = "0.1.0" } +crate2 = { version = "1.0.0", features=[] } + +[patch.crates-io.crate8] +"path = "/somewhere" +"#, + file![_].raw(), + ); +} + #[test] fn document_key_ws() { t( From 5b8c1b2328c86eaf337842215ad52a6488e53d64 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 29 Dec 2025 08:33:54 -0600 Subject: [PATCH 2/2] fix(parser): Treat unquoted strings w/ trailing quotes as regular strings --- .../ext/string/no-close-recovery-03.stderr | 9 +---- .../invalid/key/partial-quoted.stderr | 12 +++--- .../invalid/key/partial-quoted.stderr | 6 +-- crates/toml_parser/src/decoder/string.rs | 10 +++++ ...__document_unclosed_dotted_key_relpath.txt | 38 +------------------ ...ment_unclosed_inline_table_key_relpath.txt | 38 +------------------ ...t__document_unclosed_table_key_relpath.txt | 38 +------------------ 7 files changed, 26 insertions(+), 125 deletions(-) diff --git a/crates/toml/tests/snapshots/invalid/ext/string/no-close-recovery-03.stderr b/crates/toml/tests/snapshots/invalid/ext/string/no-close-recovery-03.stderr index f82e7b8fb..be80ef3fa 100644 --- a/crates/toml/tests/snapshots/invalid/ext/string/no-close-recovery-03.stderr +++ b/crates/toml/tests/snapshots/invalid/ext/string/no-close-recovery-03.stderr @@ -44,11 +44,4 @@ TOML parse error at line 11, column 19 | 11 | crate3."path = "../somewhere" | ^ -invalid unquoted key, expected letters, numbers, `-`, `_` - ---- -TOML parse error at line 11, column 29 - | -11 | crate3."path = "../somewhere" - | ^ -invalid unquoted key, expected letters, numbers, `-`, `_` +invalid basic string, expected `"` diff --git a/crates/toml/tests/snapshots/invalid/key/partial-quoted.stderr b/crates/toml/tests/snapshots/invalid/key/partial-quoted.stderr index c6650f089..ab30dfc50 100644 --- a/crates/toml/tests/snapshots/invalid/key/partial-quoted.stderr +++ b/crates/toml/tests/snapshots/invalid/key/partial-quoted.stderr @@ -1,12 +1,12 @@ -TOML parse error at line 1, column 8 +TOML parse error at line 1, column 1 | 1 | partial"quoted" = 5 - | ^ -invalid unquoted key, expected letters, numbers, `-`, `_` + | ^ +invalid basic string, expected `"` --- -TOML parse error at line 1, column 15 +TOML parse error at line 1, column 8 | 1 | partial"quoted" = 5 - | ^ -invalid unquoted key, expected letters, numbers, `-`, `_` + | ^ +invalid basic string, expected non-double-quote visible characters, `\` diff --git a/crates/toml_edit/tests/snapshots/invalid/key/partial-quoted.stderr b/crates/toml_edit/tests/snapshots/invalid/key/partial-quoted.stderr index 16761ca20..62fa43c10 100644 --- a/crates/toml_edit/tests/snapshots/invalid/key/partial-quoted.stderr +++ b/crates/toml_edit/tests/snapshots/invalid/key/partial-quoted.stderr @@ -1,5 +1,5 @@ -TOML parse error at line 1, column 8 +TOML parse error at line 1, column 1 | 1 | partial"quoted" = 5 - | ^ -invalid unquoted key, expected letters, numbers, `-`, `_` + | ^ +invalid basic string, expected `"` diff --git a/crates/toml_parser/src/decoder/string.rs b/crates/toml_parser/src/decoder/string.rs index ba0319e9d..67a78dfd9 100644 --- a/crates/toml_parser/src/decoder/string.rs +++ b/crates/toml_parser/src/decoder/string.rs @@ -688,6 +688,16 @@ pub(crate) fn decode_unquoted_key<'i>( ) { let s = raw.as_str(); + if s.ends_with("'''") { + return decode_ml_literal_string(raw, output, error); + } else if s.ends_with("\"\"\"") { + return decode_ml_basic_string(raw, output, error); + } else if s.ends_with("'") { + return decode_literal_string(raw, output, error); + } else if s.ends_with("\"") { + return decode_basic_string(raw, output, error); + } + if s.is_empty() { error.report_error( ParseError::new("unquoted keys cannot be empty") diff --git a/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_dotted_key_relpath.txt b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_dotted_key_relpath.txt index c28f8ab90..c441872dc 100644 --- a/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_dotted_key_relpath.txt +++ b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_dotted_key_relpath.txt @@ -445,20 +445,11 @@ EventResults { context: Some( 190..201, ), - description: "invalid unquoted key", + description: "invalid basic string", expected: Some( [ - Description( - "letters", - ), - Description( - "numbers", - ), Literal( - "-", - ), - Literal( - "_", + "\"", ), ], ), @@ -466,30 +457,5 @@ EventResults { 190..190, ), }, - ParseError { - context: Some( - 190..201, - ), - description: "invalid unquoted key", - expected: Some( - [ - Description( - "letters", - ), - Description( - "numbers", - ), - Literal( - "-", - ), - Literal( - "_", - ), - ], - ), - unexpected: Some( - 200..200, - ), - }, ], } diff --git a/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_inline_table_key_relpath.txt b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_inline_table_key_relpath.txt index bb8a5b391..07deb809a 100644 --- a/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_inline_table_key_relpath.txt +++ b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_inline_table_key_relpath.txt @@ -459,20 +459,11 @@ EventResults { context: Some( 194..205, ), - description: "invalid unquoted key", + description: "invalid basic string", expected: Some( [ - Description( - "letters", - ), - Description( - "numbers", - ), Literal( - "-", - ), - Literal( - "_", + "\"", ), ], ), @@ -480,30 +471,5 @@ EventResults { 194..194, ), }, - ParseError { - context: Some( - 194..205, - ), - description: "invalid unquoted key", - expected: Some( - [ - Description( - "letters", - ), - Description( - "numbers", - ), - Literal( - "-", - ), - Literal( - "_", - ), - ], - ), - unexpected: Some( - 204..204, - ), - }, ], } diff --git a/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_table_key_relpath.txt b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_table_key_relpath.txt index 56ed25ff5..fc5f5b3a8 100644 --- a/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_table_key_relpath.txt +++ b/crates/toml_parser/tests/snapshots/testsuite__parse_document__document_unclosed_table_key_relpath.txt @@ -445,20 +445,11 @@ EventResults { context: Some( 190..201, ), - description: "invalid unquoted key", + description: "invalid basic string", expected: Some( [ - Description( - "letters", - ), - Description( - "numbers", - ), Literal( - "-", - ), - Literal( - "_", + "\"", ), ], ), @@ -466,30 +457,5 @@ EventResults { 190..190, ), }, - ParseError { - context: Some( - 190..201, - ), - description: "invalid unquoted key", - expected: Some( - [ - Description( - "letters", - ), - Description( - "numbers", - ), - Literal( - "-", - ), - Literal( - "_", - ), - ], - ), - unexpected: Some( - 200..200, - ), - }, ], }