From a38540771fa93994c369d53a2abc01769c64c0b8 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 14 Jan 2020 14:42:52 +0100 Subject: Move Type API to type --- crates/ra_hir/src/code_model.rs | 74 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 4 deletions(-) (limited to 'crates/ra_hir/src/code_model.rs') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 346118350..3b479356f 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -21,8 +21,8 @@ use hir_expand::{ MacroDefId, }; use hir_ty::{ - autoderef, display::HirFormatter, expr::ExprValidator, method_resolution::implements_trait, - ApplicationTy, Canonical, InEnvironment, TraitEnvironment, Ty, TyDefId, TypeCtor, TypeWalk, + autoderef, display::HirFormatter, expr::ExprValidator, method_resolution, ApplicationTy, + Canonical, InEnvironment, TraitEnvironment, Ty, TyDefId, TypeCtor, TypeWalk, }; use ra_db::{CrateId, Edition, FileId}; use ra_prof::profile; @@ -120,7 +120,8 @@ impl_froms!( BuiltinType ); -pub use hir_def::{attr::Attrs, visibility::Visibility}; +pub use hir_def::{attr::Attrs, visibility::Visibility, AssocItemId}; +use rustc_hash::FxHashSet; impl Module { pub(crate) fn new(krate: Crate, crate_module_id: LocalModuleId) -> Module { @@ -891,7 +892,13 @@ impl Type { }; let canonical_ty = Canonical { value: self.ty.value.clone(), num_vars: 0 }; - implements_trait(&canonical_ty, db, self.ty.environment.clone(), krate, std_future_trait) + method_resolution::implements_trait( + &canonical_ty, + db, + self.ty.environment.clone(), + krate, + std_future_trait, + ) } // FIXME: this method is broken, as it doesn't take closures into account. @@ -1002,6 +1009,65 @@ impl Type { None } + pub fn iterate_method_candidates( + &self, + db: &impl HirDatabase, + krate: Crate, + traits_in_scope: &FxHashSet, + name: Option<&Name>, + mut callback: impl FnMut(&Ty, Function) -> Option, + ) -> Option { + // There should be no inference vars in types passed here + // FIXME check that? + // FIXME replace Unknown by bound vars here + let canonical = Canonical { value: self.ty.value.clone(), num_vars: 0 }; + + let env = self.ty.environment.clone(); + let krate = krate.id; + + method_resolution::iterate_method_candidates( + &canonical, + db, + env, + krate, + traits_in_scope, + name, + method_resolution::LookupMode::MethodCall, + |ty, it| match it { + AssocItemId::FunctionId(f) => callback(ty, f.into()), + _ => None, + }, + ) + } + + pub fn iterate_path_candidates( + &self, + db: &impl HirDatabase, + krate: Crate, + traits_in_scope: &FxHashSet, + name: Option<&Name>, + mut callback: impl FnMut(&Ty, AssocItem) -> Option, + ) -> Option { + // There should be no inference vars in types passed here + // FIXME check that? + // FIXME replace Unknown by bound vars here + let canonical = Canonical { value: self.ty.value.clone(), num_vars: 0 }; + + let env = self.ty.environment.clone(); + let krate = krate.id; + + method_resolution::iterate_method_candidates( + &canonical, + db, + env, + krate, + traits_in_scope, + name, + method_resolution::LookupMode::Path, + |ty, it| callback(ty, it.into()), + ) + } + pub fn as_adt(&self) -> Option { let (adt, _subst) = self.ty.value.as_adt()?; Some(adt.into()) -- cgit v1.2.3