From b8c1e402fa3a40c7e979750d60d7b003f9cb7b0d Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Tue, 3 Sep 2019 13:10:00 +0200 Subject: Make type walking infrastructure a bit nicer If/when we switch to using Chalk's Ty, we'll need to replace this by its `Fold` trait, but I didn't want to import the whole thing just yet. --- crates/ra_hir/src/ty/autoderef.rs | 2 +- crates/ra_hir/src/ty/infer.rs | 2 +- crates/ra_hir/src/ty/infer/unify.rs | 2 +- crates/ra_hir/src/ty/lower.rs | 1 + crates/ra_hir/src/ty/traits.rs | 20 ++++---------------- crates/ra_hir/src/ty/traits/chalk.rs | 1 + 6 files changed, 9 insertions(+), 19 deletions(-) (limited to 'crates/ra_hir/src/ty') diff --git a/crates/ra_hir/src/ty/autoderef.rs b/crates/ra_hir/src/ty/autoderef.rs index 2535d4ae7..08f52a53b 100644 --- a/crates/ra_hir/src/ty/autoderef.rs +++ b/crates/ra_hir/src/ty/autoderef.rs @@ -7,7 +7,7 @@ use std::iter::successors; use log::{info, warn}; -use super::{traits::Solution, Canonical, Ty}; +use super::{traits::Solution, Canonical, Ty, TypeWalk}; use crate::{HasGenericParams, HirDatabase, Name, Resolver}; const AUTODEREF_RECURSION_LIMIT: usize = 10; diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index b89a40b4b..ec3b7ffef 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs @@ -30,7 +30,7 @@ use super::{ autoderef, lower, method_resolution, op, primitive, traits::{Guidance, Obligation, ProjectionPredicate, Solution}, ApplicationTy, CallableDef, InEnvironment, ProjectionTy, Substs, TraitEnvironment, TraitRef, - Ty, TypableDef, TypeCtor, + Ty, TypableDef, TypeCtor, TypeWalk, }; use crate::{ adt::VariantDef, diff --git a/crates/ra_hir/src/ty/infer/unify.rs b/crates/ra_hir/src/ty/infer/unify.rs index e7e8825d1..9a0d2d8f9 100644 --- a/crates/ra_hir/src/ty/infer/unify.rs +++ b/crates/ra_hir/src/ty/infer/unify.rs @@ -3,7 +3,7 @@ use super::{InferenceContext, Obligation}; use crate::db::HirDatabase; use crate::ty::{ - Canonical, InEnvironment, InferTy, ProjectionPredicate, ProjectionTy, TraitRef, Ty, + Canonical, InEnvironment, InferTy, ProjectionPredicate, ProjectionTy, TraitRef, Ty, TypeWalk, }; impl<'a, D: HirDatabase> InferenceContext<'a, D> { diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs index 0011c06b4..f6f0137cf 100644 --- a/crates/ra_hir/src/ty/lower.rs +++ b/crates/ra_hir/src/ty/lower.rs @@ -10,6 +10,7 @@ use std::sync::Arc; use super::{ FnSig, GenericPredicate, ProjectionPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor, + TypeWalk, }; use crate::{ adt::VariantDef, diff --git a/crates/ra_hir/src/ty/traits.rs b/crates/ra_hir/src/ty/traits.rs index 25316bc02..6e0271a96 100644 --- a/crates/ra_hir/src/ty/traits.rs +++ b/crates/ra_hir/src/ty/traits.rs @@ -8,7 +8,7 @@ use ra_db::salsa; use ra_prof::profile; use rustc_hash::FxHashSet; -use super::{Canonical, GenericPredicate, HirDisplay, ProjectionTy, TraitRef, Ty}; +use super::{Canonical, GenericPredicate, HirDisplay, ProjectionTy, TraitRef, Ty, TypeWalk}; use crate::{db::HirDatabase, Crate, ImplBlock, Trait}; use self::chalk::{from_chalk, ToChalk}; @@ -138,25 +138,13 @@ pub struct ProjectionPredicate { pub ty: Ty, } -impl ProjectionPredicate { - pub fn subst(mut self, substs: &super::Substs) -> ProjectionPredicate { - self.walk_mut(&mut |ty| match ty { - Ty::Param { idx, .. } => { - if let Some(t) = substs.get(*idx as usize).cloned() { - *ty = t; - } - } - _ => {} - }); - self - } - - pub fn walk(&self, f: &mut impl FnMut(&Ty)) { +impl TypeWalk for ProjectionPredicate { + fn walk(&self, f: &mut impl FnMut(&Ty)) { self.projection_ty.walk(f); self.ty.walk(f); } - pub fn walk_mut(&mut self, f: &mut impl FnMut(&mut Ty)) { + fn walk_mut(&mut self, f: &mut impl FnMut(&mut Ty)) { self.projection_ty.walk_mut(f); self.ty.walk_mut(f); } diff --git a/crates/ra_hir/src/ty/traits/chalk.rs b/crates/ra_hir/src/ty/traits/chalk.rs index 3ab5b7cca..c201c5e50 100644 --- a/crates/ra_hir/src/ty/traits/chalk.rs +++ b/crates/ra_hir/src/ty/traits/chalk.rs @@ -19,6 +19,7 @@ use crate::{ ty::display::HirDisplay, ty::{ ApplicationTy, CallableDef, GenericPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor, + TypeWalk, }, Crate, HasGenericParams, ImplBlock, ImplItem, Trait, TypeAlias, }; -- cgit v1.2.3