mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-10 23:24:29 +00:00
Auto merge of #14271 - Veykril:ty-diag-err, r=Veykril
Don't trigger unresolved method/field diagnostics on types containing errors
This commit is contained in:
commit
ecc32c2f85
3 changed files with 21 additions and 3 deletions
|
@ -13,7 +13,7 @@ use crate::{
|
|||
db::HirDatabase, from_assoc_type_id, from_chalk_trait_id, from_foreign_def_id,
|
||||
from_placeholder_idx, to_chalk_trait_id, utils::generics, AdtId, AliasEq, AliasTy, Binders,
|
||||
CallableDefId, CallableSig, FnPointer, ImplTraitId, Interner, Lifetime, ProjectionTy,
|
||||
QuantifiedWhereClause, Substitution, TraitRef, Ty, TyBuilder, TyKind, WhereClause,
|
||||
QuantifiedWhereClause, Substitution, TraitRef, Ty, TyBuilder, TyKind, TypeFlags, WhereClause,
|
||||
};
|
||||
|
||||
pub trait TyExt {
|
||||
|
@ -22,6 +22,7 @@ pub trait TyExt {
|
|||
fn is_floating_point(&self) -> bool;
|
||||
fn is_never(&self) -> bool;
|
||||
fn is_unknown(&self) -> bool;
|
||||
fn contains_unknown(&self) -> bool;
|
||||
fn is_ty_var(&self) -> bool;
|
||||
|
||||
fn as_adt(&self) -> Option<(hir_def::AdtId, &Substitution)>;
|
||||
|
@ -76,6 +77,10 @@ impl TyExt for Ty {
|
|||
matches!(self.kind(Interner), TyKind::Error)
|
||||
}
|
||||
|
||||
fn contains_unknown(&self) -> bool {
|
||||
self.data(Interner).flags.contains(TypeFlags::HAS_ERROR)
|
||||
}
|
||||
|
||||
fn is_ty_var(&self) -> bool {
|
||||
matches!(self.kind(Interner), TyKind::InferenceVar(_, _))
|
||||
}
|
||||
|
|
|
@ -567,7 +567,7 @@ impl<'a> InferenceContext<'a> {
|
|||
{
|
||||
*ty = table.resolve_completely(ty.clone());
|
||||
// FIXME: Remove this when we are on par with rustc in terms of inference
|
||||
if ty.is_unknown() {
|
||||
if ty.contains_unknown() {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -576,7 +576,7 @@ impl<'a> InferenceContext<'a> {
|
|||
{
|
||||
let clear = if let Some(ty) = field_with_same_name {
|
||||
*ty = table.resolve_completely(ty.clone());
|
||||
ty.is_unknown()
|
||||
ty.contains_unknown()
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
|
|
@ -129,6 +129,19 @@ fn foo() {
|
|||
Foo.bar;
|
||||
// ^^^^^^^ 💡 error: no field `bar` on type `Foo`, but a method with a similar name exists
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn no_diagnostic_on_unknown() {
|
||||
check_diagnostics(
|
||||
r#"
|
||||
fn foo() {
|
||||
x.foo;
|
||||
(&x).foo;
|
||||
(&((x,),),).foo;
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue