From aaa3905fdd18a7981d40ac371099ae9044e833a8 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Tue, 6 Oct 2020 19:07:34 +0200 Subject: Shorten type hints for std::iter Iterators --- crates/hir/src/code_model.rs | 37 +++++++++++++++++++++++++++++++++++-- crates/hir/src/lib.rs | 2 +- 2 files changed, 36 insertions(+), 3 deletions(-) (limited to 'crates/hir') diff --git a/crates/hir/src/code_model.rs b/crates/hir/src/code_model.rs index c75d46bff..031c91ccf 100644 --- a/crates/hir/src/code_model.rs +++ b/crates/hir/src/code_model.rs @@ -30,8 +30,12 @@ use hir_expand::{ use hir_ty::{ autoderef, display::{HirDisplayError, HirFormatter}, - method_resolution, ApplicationTy, CallableDefId, Canonical, FnSig, GenericPredicate, - InEnvironment, Substs, TraitEnvironment, Ty, TyDefId, TypeCtor, + method_resolution, + traits::Solution, + traits::SolutionVariables, + ApplicationTy, BoundVar, CallableDefId, Canonical, DebruijnIndex, FnSig, GenericPredicate, + InEnvironment, Obligation, ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, Ty, + TyDefId, TyKind, TypeCtor, }; use rustc_hash::FxHashSet; use stdx::impl_from; @@ -1362,6 +1366,35 @@ impl Type { db.trait_solve(self.krate, goal).is_some() } + pub fn normalize_trait_assoc_type( + &self, + db: &dyn HirDatabase, + r#trait: Trait, + args: &[Type], + alias: TypeAlias, + ) -> Option { + let subst = Substs::build_for_def(db, r#trait.id) + .push(self.ty.value.clone()) + .fill(args.iter().map(|t| t.ty.value.clone())) + .build(); + let predicate = ProjectionPredicate { + projection_ty: ProjectionTy { associated_ty: alias.id, parameters: subst }, + ty: Ty::Bound(BoundVar::new(DebruijnIndex::INNERMOST, 0)), + }; + let goal = Canonical { + value: InEnvironment::new( + self.ty.environment.clone(), + Obligation::Projection(predicate), + ), + kinds: Arc::new([TyKind::General]), + }; + + match db.trait_solve(self.krate, goal)? { + Solution::Unique(SolutionVariables(subst)) => subst.value.first().cloned(), + Solution::Ambig(_) => None, + } + } + pub fn is_copy(&self, db: &dyn HirDatabase) -> bool { let lang_item = db.lang_item(self.krate, SmolStr::new("copy")); let copy_trait = match lang_item { diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 171118d98..4094a76cb 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -55,7 +55,7 @@ pub use hir_def::{ type_ref::{Mutability, TypeRef}, }; pub use hir_expand::{ - name::AsName, name::Name, HirFileId, InFile, MacroCallId, MacroCallLoc, + name::known, name::AsName, name::Name, HirFileId, InFile, MacroCallId, MacroCallLoc, /* FIXME */ MacroDefId, MacroFile, Origin, }; pub use hir_ty::display::HirDisplay; -- cgit v1.2.3