From c01758660c10a8fced6cd2c20eeefc5f8b738650 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Mon, 10 Sep 2018 09:21:34 -0500 Subject: [PATCH] [beta] rustdoc: disable blanket impl collection --- src/librustdoc/clean/auto_trait.rs | 113 +---------------------------- src/test/rustdoc/generic-impl.rs | 25 ------- 2 files changed, 2 insertions(+), 136 deletions(-) delete mode 100644 src/test/rustdoc/generic-impl.rs diff --git a/src/librustdoc/clean/auto_trait.rs b/src/librustdoc/clean/auto_trait.rs index c30d6817b4664..47b3b00056830 100644 --- a/src/librustdoc/clean/auto_trait.rs +++ b/src/librustdoc/clean/auto_trait.rs @@ -9,15 +9,11 @@ // except according to those terms. use rustc::hir; -use rustc::traits::{self, auto_trait as auto}; -use rustc::ty::{self, ToPredicate, TypeFoldable}; -use rustc::ty::subst::Subst; -use rustc::infer::InferOk; +use rustc::traits::auto_trait as auto; +use rustc::ty::{self, TypeFoldable}; use std::fmt::Debug; use syntax_pos::DUMMY_SP; -use core::DocAccessLevels; - use super::*; pub struct AutoTraitFinder<'a, 'tcx: 'a, 'rcx: 'a> { @@ -111,110 +107,6 @@ impl<'a, 'tcx, 'rcx> AutoTraitFinder<'a, 'tcx, 'rcx> { } } - pub fn get_blanket_impls( - &self, - def_id: DefId, - def_ctor: &F, - name: Option, - generics: &ty::Generics, - ) -> Vec - where F: Fn(DefId) -> Def { - let ty = self.cx.tcx.type_of(def_id); - let mut traits = Vec::new(); - if self.cx.access_levels.borrow().is_doc_reachable(def_id) { - let real_name = name.clone().map(|name| Ident::from_str(&name)); - let param_env = self.cx.tcx.param_env(def_id); - for &trait_def_id in self.cx.all_traits.iter() { - if !self.cx.access_levels.borrow().is_doc_reachable(trait_def_id) || - self.cx.generated_synthetics - .borrow_mut() - .get(&(def_id, trait_def_id)) - .is_some() { - continue - } - self.cx.tcx.for_each_relevant_impl(trait_def_id, ty, |impl_def_id| { - self.cx.tcx.infer_ctxt().enter(|infcx| { - let t_generics = infcx.tcx.generics_of(impl_def_id); - let trait_ref = infcx.tcx.impl_trait_ref(impl_def_id).unwrap(); - - match infcx.tcx.type_of(impl_def_id).sty { - ::rustc::ty::TypeVariants::TyParam(_) => {}, - _ => return, - } - - let substs = infcx.fresh_substs_for_item(DUMMY_SP, def_id); - let ty = ty.subst(infcx.tcx, substs); - let param_env = param_env.subst(infcx.tcx, substs); - - let impl_substs = infcx.fresh_substs_for_item(DUMMY_SP, impl_def_id); - let trait_ref = trait_ref.subst(infcx.tcx, impl_substs); - - // Require the type the impl is implemented on to match - // our type, and ignore the impl if there was a mismatch. - let cause = traits::ObligationCause::dummy(); - let eq_result = infcx.at(&cause, param_env) - .eq(trait_ref.self_ty(), ty); - if let Ok(InferOk { value: (), obligations }) = eq_result { - // FIXME(eddyb) ignoring `obligations` might cause false positives. - drop(obligations); - - let may_apply = infcx.predicate_may_hold(&traits::Obligation::new( - cause.clone(), - param_env, - trait_ref.to_predicate(), - )); - if !may_apply { - return - } - 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(trait_def_id) - .into_iter() - .map(|meth| meth.ident.to_string()) - .collect(); - - let ty = self.get_real_ty(def_id, def_ctor, &real_name, generics); - let predicates = infcx.tcx.predicates_of(impl_def_id); - - traits.push(Item { - source: infcx.tcx.def_span(impl_def_id).clean(self.cx), - 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: (t_generics, &predicates).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::>() - .clean(self.cx), - polarity: None, - synthetic: false, - blanket_impl: Some(infcx.tcx.type_of(impl_def_id) - .clean(self.cx)), - }), - }); - debug!("{:?} => {}", trait_ref, may_apply); - } - }); - }); - } - } - traits - } - pub fn get_auto_trait_impls( &self, def_id: DefId, @@ -262,7 +154,6 @@ impl<'a, 'tcx, 'rcx> AutoTraitFinder<'a, 'tcx, 'rcx> { def_ctor, tcx.require_lang_item(lang_items::SyncTraitLangItem), ).into_iter()) - .chain(self.get_blanket_impls(def_id, def_ctor, name, &generics).into_iter()) .collect(); debug!( diff --git a/src/test/rustdoc/generic-impl.rs b/src/test/rustdoc/generic-impl.rs deleted file mode 100644 index e2665fd8f375b..0000000000000 --- a/src/test/rustdoc/generic-impl.rs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2018 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -#![crate_name = "foo"] - -use std::fmt; - -// @!has foo/struct.Bar.html '//h3[@id="impl-ToString"]//code' 'impl ToString for T' -pub struct Bar; - -// @has foo/struct.Foo.html '//h3[@id="impl-ToString"]//code' 'impl ToString for T' -pub struct Foo; - -impl fmt::Display for Foo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "Foo") - } -}