From e92e6792cfdff177541b16966a70a7dbcfc9a833 Mon Sep 17 00:00:00 2001 From: A4-Tacks Date: Wed, 5 Nov 2025 16:33:02 +0800 Subject: [PATCH] Fix not parse never type in inherent impl --- crates/parser/src/grammar/items/traits.rs | 11 ++++++----- crates/parser/test_data/generated/runner.rs | 4 ++++ .../parser/inline/ok/impl_item_never_type.rast | 11 +++++++++++ .../parser/inline/ok/impl_item_never_type.rs | 1 + 4 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 crates/parser/test_data/parser/inline/ok/impl_item_never_type.rast create mode 100644 crates/parser/test_data/parser/inline/ok/impl_item_never_type.rs diff --git a/crates/parser/src/grammar/items/traits.rs b/crates/parser/src/grammar/items/traits.rs index c1b1a3fc8a94..4e48a4c50671 100644 --- a/crates/parser/src/grammar/items/traits.rs +++ b/crates/parser/src/grammar/items/traits.rs @@ -54,12 +54,13 @@ pub(super) fn impl_(p: &mut Parser<'_>, m: Marker) { // impl const Send for S {} p.eat(T![const]); - // FIXME: never type + // test impl_item_never_type // impl ! {} - - // test impl_item_neg - // impl !Send for S {} - p.eat(T![!]); + if p.at(T![!]) && !p.nth_at(1, T!['{']) { + // test impl_item_neg + // impl !Send for S {} + p.eat(T![!]); + } impl_type(p); if p.eat(T![for]) { impl_type(p); diff --git a/crates/parser/test_data/generated/runner.rs b/crates/parser/test_data/generated/runner.rs index 7f5ff0ec0735..7b0d32d9d1e4 100644 --- a/crates/parser/test_data/generated/runner.rs +++ b/crates/parser/test_data/generated/runner.rs @@ -322,6 +322,10 @@ mod ok { #[test] fn impl_item_neg() { run_and_expect_no_errors("test_data/parser/inline/ok/impl_item_neg.rs"); } #[test] + fn impl_item_never_type() { + run_and_expect_no_errors("test_data/parser/inline/ok/impl_item_never_type.rs"); + } + #[test] fn impl_trait_type() { run_and_expect_no_errors("test_data/parser/inline/ok/impl_trait_type.rs"); } diff --git a/crates/parser/test_data/parser/inline/ok/impl_item_never_type.rast b/crates/parser/test_data/parser/inline/ok/impl_item_never_type.rast new file mode 100644 index 000000000000..fa4575e0ce0c --- /dev/null +++ b/crates/parser/test_data/parser/inline/ok/impl_item_never_type.rast @@ -0,0 +1,11 @@ +SOURCE_FILE + IMPL + IMPL_KW "impl" + WHITESPACE " " + NEVER_TYPE + BANG "!" + WHITESPACE " " + ASSOC_ITEM_LIST + L_CURLY "{" + R_CURLY "}" + WHITESPACE "\n" diff --git a/crates/parser/test_data/parser/inline/ok/impl_item_never_type.rs b/crates/parser/test_data/parser/inline/ok/impl_item_never_type.rs new file mode 100644 index 000000000000..ed8057b04f2a --- /dev/null +++ b/crates/parser/test_data/parser/inline/ok/impl_item_never_type.rs @@ -0,0 +1 @@ +impl ! {}