diff options
Diffstat (limited to 'crates/ra_hir/src/ty/autoderef.rs')
-rw-r--r-- | crates/ra_hir/src/ty/autoderef.rs | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/crates/ra_hir/src/ty/autoderef.rs b/crates/ra_hir/src/ty/autoderef.rs index 86b08ae6f..44547197c 100644 --- a/crates/ra_hir/src/ty/autoderef.rs +++ b/crates/ra_hir/src/ty/autoderef.rs | |||
@@ -5,7 +5,7 @@ | |||
5 | 5 | ||
6 | use std::iter::successors; | 6 | use std::iter::successors; |
7 | 7 | ||
8 | use hir_def::{lang_item::LangItemTarget, resolver::Resolver}; | 8 | use hir_def::lang_item::LangItemTarget; |
9 | use hir_expand::name; | 9 | use hir_expand::name; |
10 | use log::{info, warn}; | 10 | use log::{info, warn}; |
11 | use ra_db::CrateId; | 11 | use ra_db::CrateId; |
@@ -21,23 +21,25 @@ const AUTODEREF_RECURSION_LIMIT: usize = 10; | |||
21 | 21 | ||
22 | pub(crate) fn autoderef<'a>( | 22 | pub(crate) fn autoderef<'a>( |
23 | db: &'a impl HirDatabase, | 23 | db: &'a impl HirDatabase, |
24 | resolver: &'a Resolver, | 24 | krate: Option<CrateId>, |
25 | ty: Canonical<Ty>, | 25 | ty: InEnvironment<Canonical<Ty>>, |
26 | ) -> impl Iterator<Item = Canonical<Ty>> + 'a { | 26 | ) -> impl Iterator<Item = Canonical<Ty>> + 'a { |
27 | successors(Some(ty), move |ty| deref(db, resolver, ty)).take(AUTODEREF_RECURSION_LIMIT) | 27 | let InEnvironment { value: ty, environment } = ty; |
28 | successors(Some(ty), move |ty| { | ||
29 | deref(db, krate?, InEnvironment { value: ty, environment: environment.clone() }) | ||
30 | }) | ||
31 | .take(AUTODEREF_RECURSION_LIMIT) | ||
28 | } | 32 | } |
29 | 33 | ||
30 | pub(crate) fn deref( | 34 | pub(crate) fn deref( |
31 | db: &impl HirDatabase, | 35 | db: &impl HirDatabase, |
32 | resolver: &Resolver, | 36 | krate: CrateId, |
33 | ty: &Canonical<Ty>, | 37 | ty: InEnvironment<&Canonical<Ty>>, |
34 | ) -> Option<Canonical<Ty>> { | 38 | ) -> Option<Canonical<Ty>> { |
35 | if let Some(derefed) = ty.value.builtin_deref() { | 39 | if let Some(derefed) = ty.value.value.builtin_deref() { |
36 | Some(Canonical { value: derefed, num_vars: ty.num_vars }) | 40 | Some(Canonical { value: derefed, num_vars: ty.value.num_vars }) |
37 | } else { | 41 | } else { |
38 | let krate = resolver.krate()?; | 42 | deref_by_trait(db, krate, ty) |
39 | let environment = super::lower::trait_env(db, resolver); | ||
40 | deref_by_trait(db, krate, InEnvironment { value: ty, environment }) | ||
41 | } | 43 | } |
42 | } | 44 | } |
43 | 45 | ||