diff options
Diffstat (limited to 'crates/ra_hir')
-rw-r--r-- | crates/ra_hir/src/source_binder.rs | 23 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/method_resolution.rs | 12 |
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 | ||
258 | pub(crate) fn implements_trait(ty: &Canonical<Ty>, db: &impl HirDatabase, resolver: &Resolver, krate: Crate, trait_: Trait) -> bool { | 258 | pub(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 | ||