@@ -6,8 +6,8 @@ use rustc_middle::middle::privacy::AccessLevels;
6
6
use rustc_middle::ty::TyCtxt;
7
7
use rustc_span::symbol::sym;
8
8
9
- use crate::clean::{self, ItemId, PrimitiveType};
10
- use crate::config::RenderOptions ;
9
+ use crate::clean::{self, ExternalCrate, ItemId, PrimitiveType};
10
+ use crate::core::DocContext ;
11
11
use crate::fold::DocFolder;
12
12
use crate::formats::item_type::ItemType;
13
13
use crate::formats::Impl;
@@ -136,46 +136,47 @@ impl Cache {
136
136
137
137
/// Populates the `Cache` with more data. The returned `Crate` will be missing some data that was
138
138
/// in `krate` due to the data being moved into the `Cache`.
139
- crate fn populate(
140
- &mut self,
141
- mut krate: clean::Crate,
142
- tcx: TyCtxt<'_>,
143
- render_options: &RenderOptions,
144
- ) -> clean::Crate {
139
+ crate fn populate(cx: &mut DocContext<'_>, mut krate: clean::Crate) -> clean::Crate {
140
+ let tcx = cx.tcx;
141
+
145
142
// Crawl the crate to build various caches used for the output
146
- debug!(?self.crate_version);
147
- self.traits = krate.external_traits.take();
148
- let RenderOptions { extern_html_root_takes_precedence, output: dst, .. } = render_options;
143
+ debug!(?cx.cache.crate_version);
144
+ cx.cache.traits = krate.external_traits.take();
149
145
150
146
// Cache where all our extern crates are located
151
147
// FIXME: this part is specific to HTML so it'd be nice to remove it from the common code
152
- for &e in &krate.externs {
148
+ for &crate_num in cx.tcx.crates(()) {
149
+ let e = ExternalCrate { crate_num };
150
+
153
151
let name = e.name(tcx);
152
+ let render_options = &cx.render_options;
154
153
let extern_url =
155
154
render_options.extern_html_root_urls.get(&*name.as_str()).map(|u| &**u);
156
- let location = e.location(extern_url, *extern_html_root_takes_precedence, dst, tcx);
157
- self.extern_locations.insert(e.crate_num, location);
158
- self.external_paths.insert(e.def_id(), (vec![name.to_string()], ItemType::Module));
155
+ let extern_url_takes_precedence = render_options.extern_html_root_takes_precedence;
156
+ let dst = &render_options.output;
157
+ let location = e.location(extern_url, extern_url_takes_precedence, dst, tcx);
158
+ cx.cache.extern_locations.insert(e.crate_num, location);
159
+ cx.cache.external_paths.insert(e.def_id(), (vec![name.to_string()], ItemType::Module));
159
160
}
160
161
161
162
// FIXME: avoid this clone (requires implementing Default manually)
162
- self .primitive_locations = PrimitiveType::primitive_locations(tcx).clone();
163
- for (prim, &def_id) in &self .primitive_locations {
163
+ cx.cache .primitive_locations = PrimitiveType::primitive_locations(tcx).clone();
164
+ for (prim, &def_id) in &cx.cache .primitive_locations {
164
165
let crate_name = tcx.crate_name(def_id.krate);
165
166
// Recall that we only allow primitive modules to be at the root-level of the crate.
166
167
// If that restriction is ever lifted, this will have to include the relative paths instead.
167
- self .external_paths.insert(
168
+ cx.cache .external_paths.insert(
168
169
def_id,
169
170
(vec![crate_name.to_string(), prim.as_sym().to_string()], ItemType::Primitive),
170
171
);
171
172
}
172
173
173
- krate = CacheBuilder { tcx, cache: self }.fold_crate(krate);
174
+ krate = CacheBuilder { tcx, cache: &mut cx.cache }.fold_crate(krate);
174
175
175
- for (trait_did, dids, impl_) in self .orphan_trait_impls.drain(..) {
176
- if self .traits.contains_key(&trait_did) {
176
+ for (trait_did, dids, impl_) in cx.cache .orphan_trait_impls.drain(..) {
177
+ if cx.cache .traits.contains_key(&trait_did) {
177
178
for did in dids {
178
- self .impls.entry(did).or_default().push(impl_.clone());
179
+ cx.cache .impls.entry(did).or_default().push(impl_.clone());
179
180
}
180
181
}
181
182
}
0 commit comments