From 21c5fd8b1b8f9536449325738baea1e48efdefe0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 14 Jan 2020 14:20:33 +0100 Subject: Push resolver further up --- crates/ra_hir/src/source_analyzer.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir/src/source_analyzer.rs') diff --git a/crates/ra_hir/src/source_analyzer.rs b/crates/ra_hir/src/source_analyzer.rs index 3df48842d..5707a5696 100644 --- a/crates/ra_hir/src/source_analyzer.rs +++ b/crates/ra_hir/src/source_analyzer.rs @@ -358,10 +358,17 @@ impl SourceAnalyzer { // FIXME check that? // FIXME replace Unknown by bound vars here let canonical = Canonical { value: ty.ty.value.clone(), num_vars: 0 }; + + let env = TraitEnvironment::lower(db, &self.resolver); + let krate = self.resolver.krate()?; + let traits_in_scope = self.resolver.traits_in_scope(db); + method_resolution::iterate_method_candidates( &canonical, db, - &self.resolver, + env, + krate, + &traits_in_scope, name, method_resolution::LookupMode::MethodCall, |ty, it| match it { @@ -382,10 +389,17 @@ impl SourceAnalyzer { // FIXME check that? // FIXME replace Unknown by bound vars here let canonical = Canonical { value: ty.ty.value.clone(), num_vars: 0 }; + + let env = TraitEnvironment::lower(db, &self.resolver); + let krate = self.resolver.krate()?; + let traits_in_scope = self.resolver.traits_in_scope(db); + method_resolution::iterate_method_candidates( &canonical, db, - &self.resolver, + env, + krate, + &traits_in_scope, name, method_resolution::LookupMode::Path, |ty, it| callback(ty, it.into()), -- cgit v1.2.3 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/source_analyzer.rs | 70 +++++------------------------------- 1 file changed, 8 insertions(+), 62 deletions(-) (limited to 'crates/ra_hir/src/source_analyzer.rs') diff --git a/crates/ra_hir/src/source_analyzer.rs b/crates/ra_hir/src/source_analyzer.rs index 5707a5696..76e0bff34 100644 --- a/crates/ra_hir/src/source_analyzer.rs +++ b/crates/ra_hir/src/source_analyzer.rs @@ -16,12 +16,12 @@ use hir_def::{ expr::{ExprId, PatId}, nameres::ModuleSource, resolver::{self, resolver_for_scope, HasResolver, Resolver, TypeNs, ValueNs}, - AssocItemId, DefWithBodyId, + DefWithBodyId, TraitId, }; use hir_expand::{ hygiene::Hygiene, name::AsName, AstId, HirFileId, InFile, MacroCallId, MacroCallKind, }; -use hir_ty::{method_resolution, Canonical, InEnvironment, InferenceResult, TraitEnvironment, Ty}; +use hir_ty::{InEnvironment, InferenceResult, TraitEnvironment}; use ra_prof::profile; use ra_syntax::{ ast::{self, AstNode}, @@ -29,11 +29,11 @@ use ra_syntax::{ SyntaxKind::*, SyntaxNode, SyntaxNodePtr, SyntaxToken, TextRange, TextUnit, }; +use rustc_hash::FxHashSet; use crate::{ - db::HirDatabase, Adt, AssocItem, Const, DefWithBody, Enum, EnumVariant, FromSource, Function, - ImplBlock, Local, MacroDef, Name, Path, ScopeDef, Static, Struct, Trait, Type, TypeAlias, - TypeParam, + db::HirDatabase, Adt, Const, DefWithBody, Enum, EnumVariant, FromSource, Function, ImplBlock, + Local, MacroDef, Name, Path, ScopeDef, Static, Struct, Trait, Type, TypeAlias, TypeParam, }; /// `SourceAnalyzer` is a convenience wrapper which exposes HIR API in terms of @@ -347,63 +347,9 @@ impl SourceAnalyzer { .collect() } - pub fn iterate_method_candidates( - &self, - db: &impl HirDatabase, - ty: &Type, - 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: ty.ty.value.clone(), num_vars: 0 }; - - let env = TraitEnvironment::lower(db, &self.resolver); - let krate = self.resolver.krate()?; - let traits_in_scope = self.resolver.traits_in_scope(db); - - 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, - ty: &Type, - 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: ty.ty.value.clone(), num_vars: 0 }; - - let env = TraitEnvironment::lower(db, &self.resolver); - let krate = self.resolver.krate()?; - let traits_in_scope = self.resolver.traits_in_scope(db); - - method_resolution::iterate_method_candidates( - &canonical, - db, - env, - krate, - &traits_in_scope, - name, - method_resolution::LookupMode::Path, - |ty, it| callback(ty, it.into()), - ) + /// Note: `FxHashSet` should be treated as an opaque type, passed into `Type + pub fn traits_in_scope(&self, db: &impl HirDatabase) -> FxHashSet { + self.resolver.traits_in_scope(db) } pub fn expand( -- cgit v1.2.3