internal: parser cleanups

This commit is contained in:
Aleksey Kladov 2021-09-18 14:53:46 +03:00
parent aaadaa40bd
commit 1d2e9818d6
17 changed files with 58 additions and 84 deletions

View file

@ -42,24 +42,23 @@ pub(super) fn trait_(p: &mut Parser, m: Marker) {
m.complete(p, TRAIT); m.complete(p, TRAIT);
} }
// test impl_def // test impl_item
// impl Foo {} // impl S {}
pub(super) fn impl_(p: &mut Parser, m: Marker) { pub(super) fn impl_(p: &mut Parser, m: Marker) {
assert!(p.at(T![impl]));
p.bump(T![impl]); p.bump(T![impl]);
if choose_type_params_over_qpath(p) { if p.at(T![<]) && not_a_qualified_path(p) {
type_params::opt_generic_param_list(p); type_params::opt_generic_param_list(p);
} }
// test impl_def_const // test impl_item_const
// impl const Send for X {} // impl const Send for S {}
p.eat(T![const]); p.eat(T![const]);
// FIXME: never type // FIXME: never type
// impl ! {} // impl ! {}
// test impl_def_neg // test impl_item_neg
// impl !Send for X {} // impl !Send for S {}
p.eat(T![!]); p.eat(T![!]);
impl_type(p); impl_type(p);
if p.eat(T![for]) { if p.eat(T![for]) {
@ -74,7 +73,7 @@ pub(super) fn impl_(p: &mut Parser, m: Marker) {
m.complete(p, IMPL); m.complete(p, IMPL);
} }
// test impl_item_list // test assoc_item_list
// impl F { // impl F {
// type A = i32; // type A = i32;
// const B: i32 = 92; // const B: i32 = 92;
@ -83,14 +82,11 @@ pub(super) fn impl_(p: &mut Parser, m: Marker) {
// } // }
pub(crate) fn assoc_item_list(p: &mut Parser) { pub(crate) fn assoc_item_list(p: &mut Parser) {
assert!(p.at(T!['{'])); assert!(p.at(T!['{']));
let m = p.start(); let m = p.start();
p.bump(T!['{']); p.bump(T!['{']);
// test impl_inner_attributes // test assoc_item_list_inner_attrs
// enum F{} // impl S { #![attr] }
// impl F {
// //! This is a doc comment
// #![doc("This is also a doc comment")]
// }
attributes::inner_attrs(p); attributes::inner_attrs(p);
while !p.at(EOF) && !p.at(T!['}']) { while !p.at(EOF) && !p.at(T!['}']) {
@ -106,7 +102,7 @@ pub(crate) fn assoc_item_list(p: &mut Parser) {
// test impl_type_params // test impl_type_params
// impl<const N: u32> Bar<N> {} // impl<const N: u32> Bar<N> {}
fn choose_type_params_over_qpath(p: &Parser) -> bool { fn not_a_qualified_path(p: &Parser) -> bool {
// There's an ambiguity between generic parameters and qualified paths in impls. // There's an ambiguity between generic parameters and qualified paths in impls.
// If we see `<` it may start both, so we have to inspect some following tokens. // If we see `<` it may start both, so we have to inspect some following tokens.
// The following combinations can only start generics, // The following combinations can only start generics,
@ -123,9 +119,6 @@ fn choose_type_params_over_qpath(p: &Parser) -> bool {
// we disambiguate it in favor of generics (`impl<T> ::absolute::Path<T> { ... }`) // we disambiguate it in favor of generics (`impl<T> ::absolute::Path<T> { ... }`)
// because this is what almost always expected in practice, qualified paths in impls // because this is what almost always expected in practice, qualified paths in impls
// (`impl <Type>::AssocTy { ... }`) aren't even allowed by type checker at the moment. // (`impl <Type>::AssocTy { ... }`) aren't even allowed by type checker at the moment.
if !p.at(T![<]) {
return false;
}
if p.nth(1) == T![#] || p.nth(1) == T![>] || p.nth(1) == T![const] { if p.nth(1) == T![#] || p.nth(1) == T![>] || p.nth(1) == T![const] {
return true; return true;
} }

View file

@ -1 +0,0 @@
impl !Send for X {}

View file

@ -15,7 +15,7 @@ SOURCE_FILE@0..20
PATH@15..16 PATH@15..16
PATH_SEGMENT@15..16 PATH_SEGMENT@15..16
NAME_REF@15..16 NAME_REF@15..16
IDENT@15..16 "X" IDENT@15..16 "S"
WHITESPACE@16..17 " " WHITESPACE@16..17 " "
ASSOC_ITEM_LIST@17..19 ASSOC_ITEM_LIST@17..19
L_CURLY@17..18 "{" L_CURLY@17..18 "{"

View file

@ -0,0 +1 @@
impl !Send for S {}

View file

@ -1,14 +0,0 @@
SOURCE_FILE@0..12
IMPL@0..11
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..8
PATH@5..8
PATH_SEGMENT@5..8
NAME_REF@5..8
IDENT@5..8 "Foo"
WHITESPACE@8..9 " "
ASSOC_ITEM_LIST@9..11
L_CURLY@9..10 "{"
R_CURLY@10..11 "}"
WHITESPACE@11..12 "\n"

View file

@ -1 +0,0 @@
impl Foo {}

View file

@ -0,0 +1,14 @@
SOURCE_FILE@0..10
IMPL@0..9
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..6
PATH@5..6
PATH_SEGMENT@5..6
NAME_REF@5..6
IDENT@5..6 "S"
WHITESPACE@6..7 " "
ASSOC_ITEM_LIST@7..9
L_CURLY@7..8 "{"
R_CURLY@8..9 "}"
WHITESPACE@9..10 "\n"

View file

@ -0,0 +1 @@
impl S {}

View file

@ -1,41 +0,0 @@
SOURCE_FILE@0..94
ENUM@0..8
ENUM_KW@0..4 "enum"
WHITESPACE@4..5 " "
NAME@5..6
IDENT@5..6 "F"
VARIANT_LIST@6..8
L_CURLY@6..7 "{"
R_CURLY@7..8 "}"
WHITESPACE@8..9 "\n"
IMPL@9..93
IMPL_KW@9..13 "impl"
WHITESPACE@13..14 " "
PATH_TYPE@14..15
PATH@14..15
PATH_SEGMENT@14..15
NAME_REF@14..15
IDENT@14..15 "F"
WHITESPACE@15..16 " "
ASSOC_ITEM_LIST@16..93
L_CURLY@16..17 "{"
WHITESPACE@17..23 "\n "
COMMENT@23..48 "//! This is a doc com ..."
WHITESPACE@48..54 "\n "
ATTR@54..91
POUND@54..55 "#"
BANG@55..56 "!"
L_BRACK@56..57 "["
META@57..90
PATH@57..60
PATH_SEGMENT@57..60
NAME_REF@57..60
IDENT@57..60 "doc"
TOKEN_TREE@60..90
L_PAREN@60..61 "("
STRING@61..89 "\"This is also a doc c ..."
R_PAREN@89..90 ")"
R_BRACK@90..91 "]"
WHITESPACE@91..92 "\n"
R_CURLY@92..93 "}"
WHITESPACE@93..94 "\n"

View file

@ -1,5 +0,0 @@
enum F{}
impl F {
//! This is a doc comment
#![doc("This is also a doc comment")]
}

View file

@ -1 +0,0 @@
impl const Send for X {}

View file

@ -16,7 +16,7 @@ SOURCE_FILE@0..25
PATH@20..21 PATH@20..21
PATH_SEGMENT@20..21 PATH_SEGMENT@20..21
NAME_REF@20..21 NAME_REF@20..21
IDENT@20..21 "X" IDENT@20..21 "S"
WHITESPACE@21..22 " " WHITESPACE@21..22 " "
ASSOC_ITEM_LIST@22..24 ASSOC_ITEM_LIST@22..24
L_CURLY@22..23 "{" L_CURLY@22..23 "{"

View file

@ -0,0 +1 @@
impl const Send for S {}

View file

@ -0,0 +1,26 @@
SOURCE_FILE@0..20
IMPL@0..19
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..6
PATH@5..6
PATH_SEGMENT@5..6
NAME_REF@5..6
IDENT@5..6 "S"
WHITESPACE@6..7 " "
ASSOC_ITEM_LIST@7..19
L_CURLY@7..8 "{"
WHITESPACE@8..9 " "
ATTR@9..17
POUND@9..10 "#"
BANG@10..11 "!"
L_BRACK@11..12 "["
META@12..16
PATH@12..16
PATH_SEGMENT@12..16
NAME_REF@12..16
IDENT@12..16 "attr"
R_BRACK@16..17 "]"
WHITESPACE@17..18 " "
R_CURLY@18..19 "}"
WHITESPACE@19..20 "\n"

View file

@ -0,0 +1 @@
impl S { #![attr] }