aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src')
-rw-r--r--crates/ra_hir/src/source_binder.rs23
-rw-r--r--crates/ra_hir/src/ty/method_resolution.rs12
2 files changed, 22 insertions, 13 deletions
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs
index 8496b143a..67cb19615 100644
--- a/crates/ra_hir/src/source_binder.rs
+++ b/crates/ra_hir/src/source_binder.rs
@@ -23,8 +23,8 @@ use crate::{
23 scope::{ExprScopes, ScopeId}, 23 scope::{ExprScopes, ScopeId},
24 BodySourceMap, 24 BodySourceMap,
25 }, 25 },
26 ty::method_resolution::implements_trait,
27 ids::LocationCtx, 26 ids::LocationCtx,
27 ty::method_resolution::implements_trait,
28 AsName, AstId, Const, Crate, DefWithBody, Either, Enum, Function, HirDatabase, HirFileId, 28 AsName, AstId, Const, Crate, DefWithBody, Either, Enum, Function, HirDatabase, HirFileId,
29 MacroDef, Module, Name, Path, PerNs, Resolver, Static, Struct, Trait, Ty, 29 MacroDef, Module, Name, Path, PerNs, Resolver, Static, Struct, Trait, Ty,
30}; 30};
@@ -414,22 +414,25 @@ impl SourceAnalyzer {
414 /// This function is used in `.await` syntax completion. 414 /// This function is used in `.await` syntax completion.
415 pub fn impls_future(&self, db: &impl HirDatabase, ty: Ty) -> bool { 415 pub fn impls_future(&self, db: &impl HirDatabase, ty: Ty) -> bool {
416 // Search for std::future::Future trait in scope 416 // Search for std::future::Future trait in scope
417 let future_trait = self.resolver.traits_in_scope(db) 417 let future_trait = self
418 .resolver
419 .traits_in_scope(db)
418 .into_iter() 420 .into_iter()
419 .filter(|t| { 421 .filter(|t| {
420 let std = t.module(db).parent(db) 422 let std = t
421 .and_then(|m| m 423 .module(db)
422 .name(db) 424 .parent(db)
423 .and_then(|n| Some(n.to_string() == "std"))) 425 .and_then(|m| m.name(db).and_then(|n| Some(n.to_string() == "std")))
424 .unwrap_or(false); 426 .unwrap_or(false);
425 427
426 let future = t.module(db).name(db) 428 let future = t
429 .module(db)
430 .name(db)
427 .and_then(|n| Some(n.to_string() == "future")) 431 .and_then(|n| Some(n.to_string() == "future"))
428 .unwrap_or(false); 432 .unwrap_or(false);
429 433
430 let future_trait = t.name(db) 434 let future_trait =
431 .and_then(|n| Some(n.to_string() == "Future")) 435 t.name(db).and_then(|n| Some(n.to_string() == "Future")).unwrap_or(false);
432 .unwrap_or(false);
433 436
434 std && future && future_trait 437 std && future && future_trait
435 }) 438 })
diff --git a/crates/ra_hir/src/ty/method_resolution.rs b/crates/ra_hir/src/ty/method_resolution.rs
index 2e2f88138..8731d6ba4 100644
--- a/crates/ra_hir/src/ty/method_resolution.rs
+++ b/crates/ra_hir/src/ty/method_resolution.rs
@@ -15,7 +15,7 @@ use crate::{
15 resolve::Resolver, 15 resolve::Resolver,
16 traits::TraitItem, 16 traits::TraitItem,
17 ty::primitive::{FloatBitness, UncertainFloatTy, UncertainIntTy}, 17 ty::primitive::{FloatBitness, UncertainFloatTy, UncertainIntTy},
18 ty::{Ty, TypeCtor, traits::Solution}, 18 ty::{traits::Solution, Ty, TypeCtor},
19 Crate, Function, HirDatabase, Module, Name, Trait, 19 Crate, Function, HirDatabase, Module, Name, Trait,
20}; 20};
21 21
@@ -255,14 +255,20 @@ fn iterate_inherent_methods<T>(
255 None 255 None
256} 256}
257 257
258pub(crate) fn implements_trait(ty: &Canonical<Ty>, db: &impl HirDatabase, resolver: &Resolver, krate: Crate, trait_: Trait) -> bool { 258pub(crate) fn implements_trait(
259 ty: &Canonical<Ty>,
260 db: &impl HirDatabase,
261 resolver: &Resolver,
262 krate: Crate,
263 trait_: Trait,
264) -> bool {
259 let env = lower::trait_env(db, resolver); 265 let env = lower::trait_env(db, resolver);
260 let goal = generic_implements_goal(db, env.clone(), trait_, ty.clone()); 266 let goal = generic_implements_goal(db, env.clone(), trait_, ty.clone());
261 let solution = db.trait_solve(krate, goal); 267 let solution = db.trait_solve(krate, goal);
262 268
263 if let Some(solution) = solution { 269 if let Some(solution) = solution {
264 if let Solution::Unique(_) = solution { 270 if let Solution::Unique(_) = solution {
265 return true 271 return true;
266 } 272 }
267 } 273 }
268 274