7687: Specialization for async traits r=matklad a=arnaudgolfouse

Fixes #7669.

Adapting the parser seemed to be all that was needed, but I am not very experienced with the codebase. Is this enough ?

Co-authored-by: Arnaud <arnaud.golfouse@laposte.net>
This commit is contained in:
bors[bot] 2021-02-16 14:16:47 +00:00 committed by GitHub
commit b7a6d830be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 116 additions and 0 deletions

View File

@ -83,6 +83,7 @@ pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool) {
}
}
/// Try to parse an item, completing `m` in case of success.
pub(super) fn maybe_item(p: &mut Parser, m: Marker) -> Result<(), Marker> {
// test_err pub_expr
// fn foo() { pub 92; }
@ -143,6 +144,33 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker) -> Result<(), Marker> {
has_mods = true;
}
}
T![async] => {
// test default_async_fn
// impl T for Foo {
// default async fn foo() {}
// }
// test default_async_unsafe_fn
// impl T for Foo {
// default async unsafe fn foo() {}
// }
let mut maybe_fn = p.nth(2);
let is_unsafe = if matches!(maybe_fn, T![unsafe]) {
maybe_fn = p.nth(3);
true
} else {
false
};
if matches!(maybe_fn, T![fn]) {
p.bump_remap(T![default]);
p.bump(T![async]);
if is_unsafe {
p.bump(T![unsafe])
}
has_mods = true;
}
}
_ => (),
}
}

View File

@ -0,0 +1,42 @@
SOURCE_FILE@0..56
IMPL@0..55
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 "T"
WHITESPACE@6..7 " "
FOR_KW@7..10 "for"
WHITESPACE@10..11 " "
PATH_TYPE@11..14
PATH@11..14
PATH_SEGMENT@11..14
NAME_REF@11..14
IDENT@11..14 "Foo"
WHITESPACE@14..15 " "
ASSOC_ITEM_LIST@15..55
L_CURLY@15..16 "{"
WHITESPACE@16..21 "\n "
FN@21..53
DEFAULT_KW@21..28 "default"
WHITESPACE@28..29 " "
ASYNC_KW@29..34 "async"
WHITESPACE@34..35 " "
UNSAFE_KW@35..41 "unsafe"
WHITESPACE@41..42 " "
FN_KW@42..44 "fn"
WHITESPACE@44..45 " "
NAME@45..48
IDENT@45..48 "foo"
PARAM_LIST@48..50
L_PAREN@48..49 "("
R_PAREN@49..50 ")"
WHITESPACE@50..51 " "
BLOCK_EXPR@51..53
L_CURLY@51..52 "{"
R_CURLY@52..53 "}"
WHITESPACE@53..54 "\n"
R_CURLY@54..55 "}"
WHITESPACE@55..56 "\n"

View File

@ -0,0 +1,3 @@
impl T for Foo {
default async unsafe fn foo() {}
}

View File

@ -0,0 +1,40 @@
SOURCE_FILE@0..49
IMPL@0..48
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 "T"
WHITESPACE@6..7 " "
FOR_KW@7..10 "for"
WHITESPACE@10..11 " "
PATH_TYPE@11..14
PATH@11..14
PATH_SEGMENT@11..14
NAME_REF@11..14
IDENT@11..14 "Foo"
WHITESPACE@14..15 " "
ASSOC_ITEM_LIST@15..48
L_CURLY@15..16 "{"
WHITESPACE@16..21 "\n "
FN@21..46
DEFAULT_KW@21..28 "default"
WHITESPACE@28..29 " "
ASYNC_KW@29..34 "async"
WHITESPACE@34..35 " "
FN_KW@35..37 "fn"
WHITESPACE@37..38 " "
NAME@38..41
IDENT@38..41 "foo"
PARAM_LIST@41..43
L_PAREN@41..42 "("
R_PAREN@42..43 ")"
WHITESPACE@43..44 " "
BLOCK_EXPR@44..46
L_CURLY@44..45 "{"
R_CURLY@45..46 "}"
WHITESPACE@46..47 "\n"
R_CURLY@47..48 "}"
WHITESPACE@48..49 "\n"

View File

@ -0,0 +1,3 @@
impl T for Foo {
default async fn foo() {}
}