- pub fn finalize_as_infer_ok<E>(self, pref: LvaluePreference, exprs: &[E])
- -> InferOk<'tcx, ()>
- where E: AsCoercionSite
- {
- let Autoderef { fcx, span, mut obligations, steps, .. } = self;
- let methods: Vec<_> = steps
- .iter()
- .map(|&(ty, kind)| {
- if let AutoderefKind::Overloaded = kind {
- fcx.try_overloaded_deref(span, None, ty, pref)
- .map(|InferOk { value, obligations: o }| {
- obligations.extend(o);
- value
- })
- } else {
- None
- }
- })
- .collect();
-
- debug!("finalize({:?}) - {:?},{:?}",
- pref,
- methods,
- obligations);
-
- for expr in exprs {
- let expr = expr.as_coercion_site();
- debug!("finalize - finalizing #{} - {:?}", expr.id, expr);
- for (n, method) in methods.iter().enumerate() {
- if let &Some(method) = method {
- let method_call = MethodCall::autoderef(expr.id, n as u32);
- fcx.tables.borrow_mut().method_map.insert(method_call, method);
- }
+ pub fn adjust_steps_as_infer_ok(&self, pref: LvaluePreference)
+ -> InferOk<'tcx, Vec<Adjustment<'tcx>>> {
+ let mut obligations = vec![];
+ let targets = self.steps.iter().skip(1).map(|&(ty, _)| ty)
+ .chain(iter::once(self.cur_ty));
+ let steps: Vec<_> = self.steps.iter().map(|&(source, kind)| {
+ if let AutoderefKind::Overloaded = kind {
+ self.fcx.try_overloaded_deref(self.span, source, pref)
+ .and_then(|InferOk { value: method, obligations: o }| {
+ obligations.extend(o);
+ if let ty::TyRef(region, mt) = method.sig.output().sty {
+ Some(OverloadedDeref {
+ region,
+ mutbl: mt.mutbl,
+ })
+ } else {
+ None
+ }
+ })
+ } else {
+ None