- /// If `typ` is a type variable of some kind, resolve it one level
- /// (but do not resolve types found in the result). If `typ` is
- /// not a type variable, just return it unmodified.
- // FIXME(eddyb) inline into `ShallowResolver::visit_ty`.
- fn shallow_resolve_ty(&self, typ: Ty<'tcx>) -> Ty<'tcx> {
- match *typ.kind() {
- ty::Infer(ty::TyVar(v)) => {
- // Not entirely obvious: if `typ` is a type variable,
- // it can be resolved to an int/float variable, which
- // can then be recursively resolved, hence the
- // recursion. Note though that we prevent type
- // variables from unifying to other type variables
- // directly (though they may be embedded
- // structurally), and we prevent cycles in any case,
- // so this recursion should always be of very limited
- // depth.
- //
- // Note: if these two lines are combined into one we get
- // dynamic borrow errors on `self.inner`.
- let known = self.inner.borrow_mut().type_variables().probe(v).known();
- known.map_or(typ, |t| self.shallow_resolve_ty(t))
- }
-
- ty::Infer(ty::IntVar(v)) => self
- .inner
- .borrow_mut()
- .int_unification_table()
- .probe_value(v)
- .map(|v| v.to_type(self.tcx))
- .unwrap_or(typ),
-
- ty::Infer(ty::FloatVar(v)) => self
- .inner
- .borrow_mut()
- .float_unification_table()
- .probe_value(v)
- .map(|v| v.to_type(self.tcx))
- .unwrap_or(typ),
-
- _ => typ,
- }
- }
-