mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-25 04:23:25 +00:00
Merge #11805
11805: fix: Don't try to resolve methods on unknown types r=Veykril a=flodiebold Fixes #10454, and some type mismatches. Co-authored-by: Florian Diebold <flodiebold@gmail.com>
This commit is contained in:
commit
75fada4aab
5 changed files with 79 additions and 4 deletions
|
@ -108,8 +108,13 @@ fn builtin_deref(ty: &Ty) -> Option<&Ty> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deref_by_trait(table: &mut InferenceTable, ty: Ty) -> Option<Ty> {
|
fn deref_by_trait(table: &mut InferenceTable, ty: Ty) -> Option<Ty> {
|
||||||
let db = table.db;
|
|
||||||
let _p = profile::span("deref_by_trait");
|
let _p = profile::span("deref_by_trait");
|
||||||
|
if table.resolve_ty_shallow(&ty).inference_var(Interner).is_some() {
|
||||||
|
// don't try to deref unknown variables
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let db = table.db;
|
||||||
let deref_trait = db
|
let deref_trait = db
|
||||||
.lang_item(table.trait_env.krate, SmolStr::new_inline("deref"))
|
.lang_item(table.trait_env.krate, SmolStr::new_inline("deref"))
|
||||||
.and_then(|l| l.as_trait())?;
|
.and_then(|l| l.as_trait())?;
|
||||||
|
|
|
@ -681,6 +681,11 @@ fn iterate_method_candidates_with_autoref(
|
||||||
name: Option<&Name>,
|
name: Option<&Name>,
|
||||||
mut callback: &mut dyn FnMut(ReceiverAdjustments, AssocItemId) -> ControlFlow<()>,
|
mut callback: &mut dyn FnMut(ReceiverAdjustments, AssocItemId) -> ControlFlow<()>,
|
||||||
) -> ControlFlow<()> {
|
) -> ControlFlow<()> {
|
||||||
|
if receiver_ty.value.is_general_var(Interner, &receiver_ty.binders) {
|
||||||
|
// don't try to resolve methods on unknown types
|
||||||
|
return ControlFlow::Continue(());
|
||||||
|
}
|
||||||
|
|
||||||
iterate_method_candidates_by_receiver(
|
iterate_method_candidates_by_receiver(
|
||||||
receiver_ty,
|
receiver_ty,
|
||||||
first_adjustment.clone(),
|
first_adjustment.clone(),
|
||||||
|
|
|
@ -2,7 +2,7 @@ use expect_test::expect;
|
||||||
|
|
||||||
use crate::tests::check;
|
use crate::tests::check;
|
||||||
|
|
||||||
use super::{check_infer, check_types};
|
use super::{check_infer, check_no_mismatches, check_types};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn infer_slice_method() {
|
fn infer_slice_method() {
|
||||||
|
@ -1697,3 +1697,68 @@ fn test() {
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bad_inferred_reference_1() {
|
||||||
|
check_no_mismatches(
|
||||||
|
r#"
|
||||||
|
//- minicore: sized
|
||||||
|
pub trait Into<T>: Sized {
|
||||||
|
fn into(self) -> T;
|
||||||
|
}
|
||||||
|
impl<T> Into<T> for T {
|
||||||
|
fn into(self) -> T { self }
|
||||||
|
}
|
||||||
|
|
||||||
|
trait ExactSizeIterator {
|
||||||
|
fn len(&self) -> usize;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Foo;
|
||||||
|
impl Foo {
|
||||||
|
fn len(&self) -> usize { 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn test(generic_args: impl Into<Foo>) {
|
||||||
|
let generic_args = generic_args.into();
|
||||||
|
generic_args.len();
|
||||||
|
let _: Foo = generic_args;
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bad_inferred_reference_2() {
|
||||||
|
check_no_mismatches(
|
||||||
|
r#"
|
||||||
|
//- minicore: deref
|
||||||
|
trait ExactSizeIterator {
|
||||||
|
fn len(&self) -> usize;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Foo;
|
||||||
|
impl Foo {
|
||||||
|
fn len(&self) -> usize { 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn test() {
|
||||||
|
let generic_args;
|
||||||
|
generic_args.len();
|
||||||
|
let _: Foo = generic_args;
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn resolve_minicore_iterator() {
|
||||||
|
check_types(
|
||||||
|
r#"
|
||||||
|
//- minicore: iterators, sized
|
||||||
|
fn foo() {
|
||||||
|
let m = core::iter::repeat(()).filter_map(|()| Some(92)).next();
|
||||||
|
} //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Option<i32>
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
@ -1018,5 +1018,5 @@ fn benchmark_syntax_highlighting_parser() {
|
||||||
.filter(|it| it.highlight.tag == HlTag::Symbol(SymbolKind::Function))
|
.filter(|it| it.highlight.tag == HlTag::Symbol(SymbolKind::Function))
|
||||||
.count()
|
.count()
|
||||||
};
|
};
|
||||||
assert_eq!(hash, 1616);
|
assert_eq!(hash, 1609);
|
||||||
}
|
}
|
||||||
|
|
|
@ -518,7 +518,7 @@ pub mod iter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub use self::adapters::Take;
|
pub use self::adapters::{Take, FilterMap};
|
||||||
|
|
||||||
mod sources {
|
mod sources {
|
||||||
mod repeat {
|
mod repeat {
|
||||||
|
|
Loading…
Reference in a new issue