mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-11-01 20:31:59 +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>) {
|
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(
|
errors.push(SyntaxError::new(
|
||||||
"At least one trait must be specified",
|
"At least one trait must be specified",
|
||||||
ty.syntax().text_range(),
|
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