]> git.lizzy.rs Git - rust.git/commitdiff
Fix extern prelude failure in rustdoc
authorGuillaume Gomez <guillaume1.gomez@gmail.com>
Thu, 10 May 2018 18:13:25 +0000 (20:13 +0200)
committerGuillaume Gomez <guillaume1.gomez@gmail.com>
Mon, 11 Jun 2018 20:24:35 +0000 (22:24 +0200)
src/librustc/session/config.rs
src/librustc_resolve/lib.rs
src/librustdoc/clean/mod.rs
src/librustdoc/core.rs

index 2c8f021c6a520b4d719e4820410a87b071b08b9f..f831b006642bbaec4034dc2701292619611670e8 100644 (file)
@@ -494,6 +494,13 @@ pub fn filestem(&self) -> String {
             Input::Str { .. } => "rust_out".to_string(),
         }
     }
+
+    pub fn get_input(&mut self) -> Option<&mut String> {
+        match *self {
+            Input::File(_) => None,
+            Input::Str { ref mut input, .. } => Some(input),
+        }
+    }
 }
 
 #[derive(Clone)]
index 7bb7f2fffbc694e165c47364243619d7b5a2d038..8ff250dfa5c50cee953a8ac09af9f7c97acd3c3c 100644 (file)
@@ -1437,6 +1437,9 @@ pub struct Resolver<'a> {
     current_type_ascription: Vec<Span>,
 
     injected_crate: Option<Module<'a>>,
+
+    /// Only supposed to be used by rustdoc, otherwise should be false.
+    pub ignore_extern_prelude_feature: bool,
 }
 
 /// Nothing really interesting here, it just provides memory for the rest of the crate.
@@ -1718,6 +1721,7 @@ pub fn new(session: &'a Session,
             unused_macros: FxHashSet(),
             current_type_ascription: Vec::new(),
             injected_crate: None,
+            ignore_extern_prelude_feature: false,
         }
     }
 
@@ -1891,7 +1895,8 @@ fn resolve_ident_in_lexical_scope(&mut self,
         if !module.no_implicit_prelude {
             // `record_used` means that we don't try to load crates during speculative resolution
             if record_used && ns == TypeNS && self.extern_prelude.contains(&ident.name) {
-                if !self.session.features_untracked().extern_prelude {
+                if !self.session.features_untracked().extern_prelude &&
+                   !self.ignore_extern_prelude_feature {
                     feature_err(&self.session.parse_sess, "extern_prelude",
                                 ident.span, GateIssue::Language,
                                 "access to extern crates through prelude is experimental").emit();
index 3f883eab172db57aa737066a5408409a1ee4b2bc..54647b45159e24a7087e751e12e1909a058a11bf 100644 (file)
@@ -1103,7 +1103,7 @@ fn resolve(cx: &DocContext, path_str: &str, is_val: bool) -> Result<(Def, Option
             // early return and try looking for the trait
             let value = match result.def {
                 Def::Method(_) | Def::AssociatedConst(_) => true,
-                Def::AssociatedTy(_)  => false,
+                Def::AssociatedTy(_) => false,
                 Def::Variant(_) => return handle_variant(cx, result.def),
                 // not a trait item, just return what we found
                 _ => return Ok((result.def, None))
index bad5ff2596fd3496f2086729a34ffd2288106577..9b5e1074cfa342905b758416037fe7e1ec7e4ada 100644 (file)
@@ -250,10 +250,12 @@ pub fn run_core(search_paths: SearchPaths,
                                                         |_| Ok(()));
         let driver::InnerExpansionResult {
             mut hir_forest,
-            resolver,
+            mut resolver,
             ..
         } = abort_on_err(result, &sess);
 
+        resolver.ignore_extern_prelude_feature = true;
+
         // We need to hold on to the complete resolver, so we clone everything
         // for the analysis passes to use. Suboptimal, but necessary in the
         // current architecture.