1
Fork 0

added methods src_root and location to External crate, remove extern_location function

This commit is contained in:
Timothée Delabrouille 2021-04-26 21:08:14 +02:00
parent 855c2d130f
commit 7d09dba728
3 changed files with 56 additions and 56 deletions

View file

@ -4,6 +4,7 @@ use std::fmt;
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
use std::iter::FromIterator; use std::iter::FromIterator;
use std::lazy::SyncOnceCell as OnceCell; use std::lazy::SyncOnceCell as OnceCell;
use std::path::PathBuf;
use std::rc::Rc; use std::rc::Rc;
use std::sync::Arc; use std::sync::Arc;
use std::{slice, vec}; use std::{slice, vec};
@ -90,6 +91,57 @@ impl ExternalCrate {
tcx.crate_name(self.crate_num) tcx.crate_name(self.crate_num)
} }
crate fn src_root(&self, tcx: TyCtxt<'_>) -> PathBuf {
match self.src(tcx) {
FileName::Real(ref p) => match p.local_path().parent() {
Some(p) => p.to_path_buf(),
None => PathBuf::new(),
},
_ => PathBuf::new(),
}
}
/// Attempts to find where an external crate is located, given that we're
/// rendering in to the specified source destination.
crate fn location(
&self,
extern_url: Option<&str>,
ast_attrs: &[ast::Attribute],
dst: &std::path::Path,
tcx: TyCtxt<'_>,
) -> ExternalLocation {
use ExternalLocation::*;
// See if there's documentation generated into the local directory
let local_location = dst.join(&*self.name(tcx).as_str());
if local_location.is_dir() {
return Local;
}
if let Some(url) = extern_url {
let mut url = url.to_string();
if !url.ends_with('/') {
url.push('/');
}
return Remote(url);
}
// Failing that, see if there's an attribute specifying where to find this
// external crate
ast_attrs
.lists(sym::doc)
.filter(|a| a.has_name(sym::html_root_url))
.filter_map(|a| a.value_str())
.map(|url| {
let mut url = url.to_string();
if !url.ends_with('/') {
url.push('/')
}
Remote(url)
})
.next()
.unwrap_or(Unknown) // Well, at least we tried.
}
crate fn keywords(&self, tcx: TyCtxt<'_>) -> ThinVec<(DefId, Symbol)> { crate fn keywords(&self, tcx: TyCtxt<'_>) -> ThinVec<(DefId, Symbol)> {
let root = self.def_id(); let root = self.def_id();

View file

@ -6,7 +6,6 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX}; use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX};
use rustc_middle::middle::privacy::AccessLevels; use rustc_middle::middle::privacy::AccessLevels;
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
use rustc_span::source_map::FileName;
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use rustc_span::Symbol; use rustc_span::Symbol;
@ -15,7 +14,7 @@ use crate::fold::DocFolder;
use crate::formats::item_type::ItemType; use crate::formats::item_type::ItemType;
use crate::formats::Impl; use crate::formats::Impl;
use crate::html::markdown::short_markdown_summary; use crate::html::markdown::short_markdown_summary;
use crate::html::render::cache::{extern_location, get_index_search_type, ExternalLocation}; use crate::html::render::cache::{get_index_search_type, ExternalLocation};
use crate::html::render::IndexItem; use crate::html::render::IndexItem;
/// This cache is used to store information about the [`clean::Crate`] being /// This cache is used to store information about the [`clean::Crate`] being
@ -155,21 +154,13 @@ impl Cache {
// Cache where all our extern crates are located // Cache where all our extern crates are located
// FIXME: this part is specific to HTML so it'd be nice to remove it from the common code // FIXME: this part is specific to HTML so it'd be nice to remove it from the common code
for &(n, ref e) in &krate.externs { for &(n, ref e) in &krate.externs {
let src_root = match e.src(tcx) {
FileName::Real(ref p) => match p.local_path().parent() {
Some(p) => p.to_path_buf(),
None => PathBuf::new(),
},
_ => PathBuf::new(),
};
let name = e.name(tcx); let name = e.name(tcx);
let extern_url = extern_html_root_urls.get(&*name.as_str()).map(|u| &**u); let extern_url = extern_html_root_urls.get(&*name.as_str()).map(|u| &**u);
let did = DefId { krate: n, index: CRATE_DEF_INDEX }; let did = DefId { krate: n, index: CRATE_DEF_INDEX };
self.extern_locations.insert( self.extern_locations.insert(
n, n,
(name, src_root, extern_location(e, extern_url, tcx.get_attrs(did), &dst, tcx)), (name, e.src_root(tcx), e.location(extern_url, tcx.get_attrs(did), &dst, tcx)),
); );
self.external_paths.insert(did, (vec![name.to_string()], ItemType::Module)); self.external_paths.insert(did, (vec![name.to_string()], ItemType::Module));
} }

View file

@ -1,15 +1,13 @@
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::path::Path;
use rustc_ast::ast;
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
use rustc_span::symbol::{sym, Symbol}; use rustc_span::symbol::Symbol;
use serde::ser::{Serialize, SerializeStruct, Serializer}; use serde::ser::{Serialize, SerializeStruct, Serializer};
use crate::clean; use crate::clean;
use crate::clean::types::{ use crate::clean::types::{
AttributesExt, FnDecl, FnRetTy, GenericBound, Generics, GetDefId, Type, WherePredicate, FnDecl, FnRetTy, GenericBound, Generics, GetDefId, Type, WherePredicate,
}; };
use crate::formats::cache::Cache; use crate::formats::cache::Cache;
use crate::formats::item_type::ItemType; use crate::formats::item_type::ItemType;
@ -26,47 +24,6 @@ crate enum ExternalLocation {
Unknown, Unknown,
} }
/// Attempts to find where an external crate is located, given that we're
/// rendering in to the specified source destination.
crate fn extern_location(
e: &clean::ExternalCrate,
extern_url: Option<&str>,
ast_attrs: &[ast::Attribute],
dst: &Path,
tcx: TyCtxt<'_>,
) -> ExternalLocation {
use ExternalLocation::*;
// See if there's documentation generated into the local directory
let local_location = dst.join(&*e.name(tcx).as_str());
if local_location.is_dir() {
return Local;
}
if let Some(url) = extern_url {
let mut url = url.to_string();
if !url.ends_with('/') {
url.push('/');
}
return Remote(url);
}
// Failing that, see if there's an attribute specifying where to find this
// external crate
ast_attrs
.lists(sym::doc)
.filter(|a| a.has_name(sym::html_root_url))
.filter_map(|a| a.value_str())
.map(|url| {
let mut url = url.to_string();
if !url.ends_with('/') {
url.push('/')
}
Remote(url)
})
.next()
.unwrap_or(Unknown) // Well, at least we tried.
}
/// Builds the search index from the collected metadata /// Builds the search index from the collected metadata
crate fn build_index<'tcx>(krate: &clean::Crate, cache: &mut Cache, tcx: TyCtxt<'tcx>) -> String { crate fn build_index<'tcx>(krate: &clean::Crate, cache: &mut Cache, tcx: TyCtxt<'tcx>) -> String {
let mut defid_to_pathid = FxHashMap::default(); let mut defid_to_pathid = FxHashMap::default();