@@ -26,7 +26,7 @@ use rustc_metadata::creader::CrateLoader;
2626use rustc_metadata:: cstore:: CStore ;
2727use rustc_target:: spec:: TargetTriple ;
2828
29- use syntax:: ast:: { self , Ident , Name , NodeId } ;
29+ use syntax:: ast:: { self , Ident } ;
3030use syntax:: codemap;
3131use syntax:: edition:: Edition ;
3232use syntax:: feature_gate:: UnstableFeatures ;
@@ -45,8 +45,9 @@ use std::path::PathBuf;
4545
4646use visit_ast:: RustdocVisitor ;
4747use clean;
48- use clean:: { get_path_for_type, Clean , MAX_DEF_ID } ;
48+ use clean:: { get_path_for_type, Clean , MAX_DEF_ID , AttributesExt } ;
4949use html:: render:: RenderInfo ;
50+ use passes;
5051
5152pub use rustc:: session:: config:: { Input , Options , CodegenOptions } ;
5253pub use rustc:: session:: search_paths:: SearchPaths ;
@@ -57,7 +58,6 @@ pub struct DocContext<'a, 'tcx: 'a, 'rcx: 'a, 'cstore: 'rcx> {
5758 pub tcx : TyCtxt < ' a , ' tcx , ' tcx > ,
5859 pub resolver : & ' a RefCell < resolve:: Resolver < ' rcx , ' cstore > > ,
5960 /// The stack of module NodeIds up till this point
60- pub mod_ids : RefCell < Vec < NodeId > > ,
6161 pub crate_name : Option < String > ,
6262 pub cstore : Rc < CStore > ,
6363 pub populated_all_crate_impls : Cell < bool > ,
@@ -87,7 +87,6 @@ pub struct DocContext<'a, 'tcx: 'a, 'rcx: 'a, 'cstore: 'rcx> {
8787 pub all_fake_def_ids : RefCell < FxHashSet < DefId > > ,
8888 /// Maps (type_id, trait_id) -> auto trait impl
8989 pub generated_synthetics : RefCell < FxHashSet < ( DefId , DefId ) > > ,
90- pub current_item_name : RefCell < Option < Name > > ,
9190 pub all_traits : Vec < DefId > ,
9291}
9392
@@ -322,7 +321,10 @@ pub fn run_core(search_paths: SearchPaths,
322321 error_format : ErrorOutputType ,
323322 cmd_lints : Vec < ( String , lint:: Level ) > ,
324323 lint_cap : Option < lint:: Level > ,
325- describe_lints : bool ) -> ( clean:: Crate , RenderInfo )
324+ describe_lints : bool ,
325+ mut manual_passes : Vec < String > ,
326+ mut default_passes : passes:: DefaultPassOption )
327+ -> ( clean:: Crate , RenderInfo , Vec < String > )
326328{
327329 // Parse, resolve, and typecheck the given crate.
328330
@@ -517,23 +519,86 @@ pub fn run_core(search_paths: SearchPaths,
517519 ty_substs : Default :: default ( ) ,
518520 lt_substs : Default :: default ( ) ,
519521 impl_trait_bounds : Default :: default ( ) ,
520- mod_ids : Default :: default ( ) ,
521522 send_trait : send_trait,
522523 fake_def_ids : RefCell :: new ( FxHashMap ( ) ) ,
523524 all_fake_def_ids : RefCell :: new ( FxHashSet ( ) ) ,
524525 generated_synthetics : RefCell :: new ( FxHashSet ( ) ) ,
525- current_item_name : RefCell :: new ( None ) ,
526526 all_traits : tcx. all_traits ( LOCAL_CRATE ) . to_vec ( ) ,
527527 } ;
528528 debug ! ( "crate: {:?}" , tcx. hir. krate( ) ) ;
529529
530- let krate = {
530+ let mut krate = {
531531 let mut v = RustdocVisitor :: new ( & ctxt) ;
532532 v. visit ( tcx. hir . krate ( ) ) ;
533533 v. clean ( & ctxt)
534534 } ;
535535
536- ( krate, ctxt. renderinfo . into_inner ( ) )
536+ fn report_deprecated_attr ( name : & str , diag : & errors:: Handler ) {
537+ let mut msg = diag. struct_warn ( & format ! ( "the `#![doc({})]` attribute is \
538+ considered deprecated", name) ) ;
539+ msg. warn ( "please see https://github.com/rust-lang/rust/issues/44136" ) ;
540+
541+ if name == "no_default_passes" {
542+ msg. help ( "you may want to use `#![doc(document_private_items)]`" ) ;
543+ }
544+
545+ msg. emit ( ) ;
546+ }
547+
548+ // Process all of the crate attributes, extracting plugin metadata along
549+ // with the passes which we are supposed to run.
550+ for attr in krate. module . as_ref ( ) . unwrap ( ) . attrs . lists ( "doc" ) {
551+ let diag = ctxt. sess ( ) . diagnostic ( ) ;
552+
553+ let name = attr. name ( ) . map ( |s| s. as_str ( ) ) ;
554+ let name = name. as_ref ( ) . map ( |s| & s[ ..] ) ;
555+ if attr. is_word ( ) {
556+ if name == Some ( "no_default_passes" ) {
557+ report_deprecated_attr ( "no_default_passes" , diag) ;
558+ if default_passes == passes:: DefaultPassOption :: Default {
559+ default_passes = passes:: DefaultPassOption :: None ;
560+ }
561+ }
562+ } else if let Some ( value) = attr. value_str ( ) {
563+ let sink = match name {
564+ Some ( "passes" ) => {
565+ report_deprecated_attr ( "passes = \" ...\" " , diag) ;
566+ & mut manual_passes
567+ } ,
568+ Some ( "plugins" ) => {
569+ report_deprecated_attr ( "plugins = \" ...\" " , diag) ;
570+ eprintln ! ( "WARNING: #![doc(plugins = \" ...\" )] no longer functions; \
571+ see CVE-2018-1000622") ;
572+ continue
573+ } ,
574+ _ => continue ,
575+ } ;
576+ for p in value. as_str ( ) . split_whitespace ( ) {
577+ sink. push ( p. to_string ( ) ) ;
578+ }
579+ }
580+
581+ if attr. is_word ( ) && name == Some ( "document_private_items" ) {
582+ if default_passes == passes:: DefaultPassOption :: Default {
583+ default_passes = passes:: DefaultPassOption :: Private ;
584+ }
585+ }
586+ }
587+
588+ let mut passes: Vec < String > =
589+ passes:: defaults ( default_passes) . iter ( ) . map ( |p| p. to_string ( ) ) . collect ( ) ;
590+ passes. extend ( manual_passes) ;
591+
592+ for pass in & passes {
593+ // the "unknown pass" error will be reported when late passes are run
594+ if let Some ( pass) = passes:: find_pass ( pass) . and_then ( |p| p. early_fn ( ) ) {
595+ krate = pass ( krate, & ctxt) ;
596+ }
597+ }
598+
599+ ctxt. sess ( ) . abort_if_errors ( ) ;
600+
601+ ( krate, ctxt. renderinfo . into_inner ( ) , passes)
537602 } ) , & sess)
538603 } )
539604}
0 commit comments