aboutsummaryrefslogtreecommitdiff
path: root/crates/hir/src
diff options
context:
space:
mode:
authorGrayJack <[email protected]>2020-10-16 11:52:18 +0100
committerGrayJack <[email protected]>2020-10-16 11:52:18 +0100
commita483b5545dad2d36336c1e9a4f5dc991d2c8460b (patch)
tree4a9a2a515fa205a316f662cfa12a9cd220055875 /crates/hir/src
parent83d6bc7113080c9bf3fd70bed1b89c6b4795d826 (diff)
Add Callable modifier for variables that implements Fnonce
Diffstat (limited to 'crates/hir/src')
-rw-r--r--crates/hir/src/code_model.rs25
1 files changed, 23 insertions, 2 deletions
diff --git a/crates/hir/src/code_model.rs b/crates/hir/src/code_model.rs
index b65be4fe1..8ecf72bd9 100644
--- a/crates/hir/src/code_model.rs
+++ b/crates/hir/src/code_model.rs
@@ -31,8 +31,7 @@ use hir_ty::{
31 autoderef, 31 autoderef,
32 display::{HirDisplayError, HirFormatter}, 32 display::{HirDisplayError, HirFormatter},
33 method_resolution, 33 method_resolution,
34 traits::Solution, 34 traits::{FnTrait, Solution, SolutionVariables},
35 traits::SolutionVariables,
36 ApplicationTy, BoundVar, CallableDefId, Canonical, DebruijnIndex, FnSig, GenericPredicate, 35 ApplicationTy, BoundVar, CallableDefId, Canonical, DebruijnIndex, FnSig, GenericPredicate,
37 InEnvironment, Obligation, ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, Ty, 36 InEnvironment, Obligation, ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, Ty,
38 TyDefId, TyKind, TypeCtor, 37 TyDefId, TyKind, TypeCtor,
@@ -1385,6 +1384,28 @@ impl Type {
1385 ) 1384 )
1386 } 1385 }
1387 1386
1387 /// Checks that particular type `ty` implements `std::ops::FnOnce`.
1388 ///
1389 /// This function can be used to check if a particular type is callable, since FnOnce is a
1390 /// supertrait of Fn and FnMut, so all callable types implements at least FnOnce.
1391 pub fn impls_fnonce(&self, db: &dyn HirDatabase) -> bool {
1392 let krate = self.krate;
1393
1394 let fnonce_trait = match FnTrait::FnOnce.get_id(db, krate) {
1395 Some(it) => it,
1396 None => return false,
1397 };
1398
1399 let canonical_ty = Canonical { value: self.ty.value.clone(), kinds: Arc::new([]) };
1400 method_resolution::implements_trait(
1401 &canonical_ty,
1402 db,
1403 self.ty.environment.clone(),
1404 krate,
1405 fnonce_trait,
1406 )
1407 }
1408
1388 pub fn impls_trait(&self, db: &dyn HirDatabase, trait_: Trait, args: &[Type]) -> bool { 1409 pub fn impls_trait(&self, db: &dyn HirDatabase, trait_: Trait, args: &[Type]) -> bool {
1389 let trait_ref = hir_ty::TraitRef { 1410 let trait_ref = hir_ty::TraitRef {
1390 trait_: trait_.id, 1411 trait_: trait_.id,