+ self.cx.generated_synthetics.borrow_mut()
+ .insert((def_id, trait_def_id));
+ let trait_ = hir::TraitRef {
+ path: get_path_for_type(infcx.tcx, trait_def_id, hir::def::Def::Trait),
+ ref_id: ast::DUMMY_NODE_ID,
+ };
+ let provided_trait_methods = infcx.tcx.provided_trait_methods(impl_def_id)
+ .into_iter()
+ .map(|meth| meth.ident.to_string())
+ .collect();
+
+ let path = get_path_for_type(self.cx.tcx, def_id, def_ctor);
+ let mut segments = path.segments.into_vec();
+ let last = segments.pop().unwrap();
+
+ segments.push(hir::PathSegment::new(
+ real_name.unwrap_or(last.ident),
+ self.generics_to_path_params(generics.clone()),
+ false,
+ ));
+
+ let new_path = hir::Path {
+ span: path.span,
+ def: path.def,
+ segments: HirVec::from_vec(segments),
+ };
+
+ let ty = hir::Ty {
+ id: ast::DUMMY_NODE_ID,
+ node: hir::Ty_::TyPath(hir::QPath::Resolved(None, P(new_path))),
+ span: DUMMY_SP,
+ hir_id: hir::DUMMY_HIR_ID,
+ };
+
+ traits.push(Item {
+ source: Span::empty(),
+ name: None,
+ attrs: Default::default(),
+ visibility: None,
+ def_id: self.next_def_id(impl_def_id.krate),
+ stability: None,
+ deprecation: None,
+ inner: ImplItem(Impl {
+ unsafety: hir::Unsafety::Normal,
+ generics: (generics,
+ &tcx.predicates_of(impl_def_id)).clean(self.cx),
+ provided_trait_methods,
+ trait_: Some(trait_.clean(self.cx)),
+ for_: ty.clean(self.cx),
+ items: infcx.tcx.associated_items(impl_def_id).collect::<Vec<_>>().clean(self.cx),
+ polarity: None,
+ synthetic: true,
+ }),
+ });