aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/autoderef.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-11-25 10:10:26 +0000
committerAleksey Kladov <[email protected]>2019-11-25 10:10:26 +0000
commit8c3e372835243c922b0eff7ca23f79f227991e88 (patch)
tree5dda185ddeba593b7af36f66eeb6098e4f913c05 /crates/ra_hir/src/ty/autoderef.rs
parentbd53bd80bff9a1f320615a975235399b1fa4792e (diff)
Remove Resolver from autoderef
Resolver holds onto too much context, including local scopes. Let's try to pass in only what is necessary -- the trait environment.
Diffstat (limited to 'crates/ra_hir/src/ty/autoderef.rs')
-rw-r--r--crates/ra_hir/src/ty/autoderef.rs24
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
6use std::iter::successors; 6use std::iter::successors;
7 7
8use hir_def::{lang_item::LangItemTarget, resolver::Resolver}; 8use hir_def::lang_item::LangItemTarget;
9use hir_expand::name; 9use hir_expand::name;
10use log::{info, warn}; 10use log::{info, warn};
11use ra_db::CrateId; 11use ra_db::CrateId;
@@ -21,23 +21,25 @@ const AUTODEREF_RECURSION_LIMIT: usize = 10;
21 21
22pub(crate) fn autoderef<'a>( 22pub(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
30pub(crate) fn deref( 34pub(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