mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 05:45:12 +00:00
Parse bare dyn types with leading lifetime
This commit is contained in:
parent
0dd94d3b07
commit
2a509d0eb2
4 changed files with 72 additions and 1 deletions
|
@ -35,7 +35,7 @@ const GENERIC_ARG_FIRST: TokenSet = TokenSet::new(&[
|
|||
// type T = S<i32>;
|
||||
fn generic_arg(p: &mut Parser<'_>) -> bool {
|
||||
match p.current() {
|
||||
LIFETIME_IDENT => lifetime_arg(p),
|
||||
LIFETIME_IDENT if !p.nth_at(1, T![+]) => lifetime_arg(p),
|
||||
T!['{'] | T![true] | T![false] | T![-] => const_arg(p),
|
||||
k if k.is_literal() => const_arg(p),
|
||||
// test associated_type_bounds
|
||||
|
|
|
@ -15,6 +15,7 @@ pub(super) const TYPE_FIRST: TokenSet = paths::PATH_FIRST.union(TokenSet::new(&[
|
|||
T![impl],
|
||||
T![dyn],
|
||||
T![Self],
|
||||
LIFETIME_IDENT,
|
||||
]));
|
||||
|
||||
pub(super) const TYPE_RECOVERY_SET: TokenSet = TokenSet::new(&[
|
||||
|
@ -49,6 +50,7 @@ fn type_with_bounds_cond(p: &mut Parser<'_>, allow_bounds: bool) {
|
|||
// Some path types are not allowed to have bounds (no plus)
|
||||
T![<] => path_type_(p, allow_bounds),
|
||||
_ if paths::is_path_start(p) => path_or_macro_type_(p, allow_bounds),
|
||||
LIFETIME_IDENT if p.nth_at(1, T![+]) => bare_dyn_trait_type(p),
|
||||
_ => {
|
||||
p.err_recover("expected type", TYPE_RECOVERY_SET);
|
||||
}
|
||||
|
@ -275,6 +277,15 @@ fn dyn_trait_type(p: &mut Parser<'_>) {
|
|||
m.complete(p, DYN_TRAIT_TYPE);
|
||||
}
|
||||
|
||||
// test bare_dyn_types_with_leading_lifetime
|
||||
// type A = 'static + Trait;
|
||||
// type B = S<'static + Trait>;
|
||||
fn bare_dyn_trait_type(p: &mut Parser<'_>) {
|
||||
let m = p.start();
|
||||
generic_params::bounds_without_colon(p);
|
||||
m.complete(p, DYN_TRAIT_TYPE);
|
||||
}
|
||||
|
||||
// test path_type
|
||||
// type A = Foo;
|
||||
// type B = ::Foo;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue