mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-08-04 10:50:15 +00:00
Merge pull request #19347 from Shourya742/2025-03-13-add-diagnostic-for-dnagling-impl-with-lifetime
Add diagnostic for missing ambiguity error for impl trait
This commit is contained in:
commit
ed7e25a0c0
5 changed files with 99 additions and 1 deletions
|
@ -363,11 +363,40 @@ fn validate_trait_object_ty(ty: ast::DynTraitType) -> Option<SyntaxError> {
|
|||
}
|
||||
|
||||
fn validate_impl_object_ty(ty: ast::ImplTraitType, errors: &mut Vec<SyntaxError>) {
|
||||
if ty.type_bound_list().map_or(0, |tbl| tbl.bounds().count()) == 0 {
|
||||
let Some(bound_list) = ty.type_bound_list() else {
|
||||
errors.push(SyntaxError::new(
|
||||
"At least one trait must be specified",
|
||||
ty.syntax().text_range(),
|
||||
));
|
||||
return;
|
||||
};
|
||||
|
||||
let bounds: Vec<_> = bound_list.bounds().collect();
|
||||
|
||||
if !bounds.iter().any(|b| !matches!(b.kind(), ast::TypeBoundKind::Lifetime(_))) {
|
||||
errors.push(SyntaxError::new(
|
||||
"At least one trait must be specified",
|
||||
ty.syntax().text_range(),
|
||||
));
|
||||
return;
|
||||
}
|
||||
|
||||
if bounds.len() == 1 {
|
||||
return;
|
||||
}
|
||||
|
||||
let Some(preceding_token) = ty
|
||||
.impl_token()
|
||||
.and_then(|token| token.prev_token())
|
||||
.and_then(|prev| algo::skip_trivia_token(prev, Direction::Prev))
|
||||
else {
|
||||
return;
|
||||
};
|
||||
|
||||
if !matches!(preceding_token.kind(), T!['('] | T![<] | T![=])
|
||||
&& matches!(preceding_token.kind(), T![&])
|
||||
{
|
||||
errors.push(SyntaxError::new("ambiguous `+` in a type", ty.syntax().text_range()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
SOURCE_FILE@0..28
|
||||
FN@0..28
|
||||
FN_KW@0..2 "fn"
|
||||
WHITESPACE@2..3 " "
|
||||
NAME@3..4
|
||||
IDENT@3..4 "f"
|
||||
PARAM_LIST@4..25
|
||||
L_PAREN@4..5 "("
|
||||
PARAM@5..24
|
||||
WILDCARD_PAT@5..6
|
||||
UNDERSCORE@5..6 "_"
|
||||
COLON@6..7 ":"
|
||||
WHITESPACE@7..8 " "
|
||||
REF_TYPE@8..24
|
||||
AMP@8..9 "&"
|
||||
IMPL_TRAIT_TYPE@9..24
|
||||
IMPL_KW@9..13 "impl"
|
||||
WHITESPACE@13..14 " "
|
||||
TYPE_BOUND_LIST@14..24
|
||||
TYPE_BOUND@14..16
|
||||
LIFETIME@14..16
|
||||
LIFETIME_IDENT@14..16 "'a"
|
||||
WHITESPACE@16..17 " "
|
||||
PLUS@17..18 "+"
|
||||
WHITESPACE@18..19 " "
|
||||
TYPE_BOUND@19..24
|
||||
PATH_TYPE@19..24
|
||||
PATH@19..24
|
||||
PATH_SEGMENT@19..24
|
||||
NAME_REF@19..24
|
||||
IDENT@19..24 "Sized"
|
||||
R_PAREN@24..25 ")"
|
||||
WHITESPACE@25..26 " "
|
||||
BLOCK_EXPR@26..28
|
||||
STMT_LIST@26..28
|
||||
L_CURLY@26..27 "{"
|
||||
R_CURLY@27..28 "}"
|
||||
error 9..24: ambiguous `+` in a type
|
|
@ -0,0 +1 @@
|
|||
fn f(_: &impl 'a + Sized) {}
|
|
@ -0,0 +1,29 @@
|
|||
SOURCE_FILE@0..20
|
||||
FN@0..20
|
||||
FN_KW@0..2 "fn"
|
||||
WHITESPACE@2..3 " "
|
||||
NAME@3..4
|
||||
IDENT@3..4 "f"
|
||||
PARAM_LIST@4..17
|
||||
L_PAREN@4..5 "("
|
||||
PARAM@5..16
|
||||
WILDCARD_PAT@5..6
|
||||
UNDERSCORE@5..6 "_"
|
||||
COLON@6..7 ":"
|
||||
WHITESPACE@7..8 " "
|
||||
REF_TYPE@8..16
|
||||
AMP@8..9 "&"
|
||||
IMPL_TRAIT_TYPE@9..16
|
||||
IMPL_KW@9..13 "impl"
|
||||
WHITESPACE@13..14 " "
|
||||
TYPE_BOUND_LIST@14..16
|
||||
TYPE_BOUND@14..16
|
||||
LIFETIME@14..16
|
||||
LIFETIME_IDENT@14..16 "'a"
|
||||
R_PAREN@16..17 ")"
|
||||
WHITESPACE@17..18 " "
|
||||
BLOCK_EXPR@18..20
|
||||
STMT_LIST@18..20
|
||||
L_CURLY@18..19 "{"
|
||||
R_CURLY@19..20 "}"
|
||||
error 9..16: At least one trait must be specified
|
|
@ -0,0 +1 @@
|
|||
fn f(_: &impl 'a) {}
|
Loading…
Add table
Add a link
Reference in a new issue