Auto merge of #109005 - Nilstrieb:dont-forgor-too-much-from-cfg, r=petrochenkov
Remember names of `cfg`-ed out items to mention them in diagnostics # Examples ## `serde::Deserialize` without the `derive` feature (a classic beginner mistake) I had to slightly modify serde so that it uses explicit re-exports instead of a glob re-export. (Update: a serde PR was merged that adds the manual re-exports) ``` error[E0433]: failed to resolve: could not find `Serialize` in `serde` --> src/main.rs:1:17 | 1 | #[derive(serde::Serialize)] | ^^^^^^^^^ could not find `Serialize` in `serde` | note: crate `serde` has an item named `Serialize` but it is inactive because its cfg predicate evaluated to false --> /home/gh-Nilstrieb/.cargo/registry/src/index.crates.io-6f17d22bba15001f/serde-1.0.160/src/lib.rs:343:1 | 343 | #[cfg(feature = "serde_derive")] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 344 | pub use serde_derive::{Deserialize, Serialize}; | ^^^^^^^^^ = note: the item is gated behind the `serde_derive` feature = note: see https://doc.rust-lang.org/cargo/reference/features.html for how to activate a crate's feature ``` (the suggestion is not ideal but that's serde's fault) I already tested the metadata size impact locally by compiling the `windows` crate without any features. `800k` -> `809k` r? `@ghost`
This commit is contained in:
commit
a97c36dd2e
30 changed files with 599 additions and 84 deletions
|
@ -995,6 +995,15 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
)
|
||||
}
|
||||
|
||||
fn get_stripped_cfg_items(self, cnum: CrateNum, tcx: TyCtxt<'tcx>) -> &'tcx [StrippedCfgItem] {
|
||||
let item_names = self
|
||||
.root
|
||||
.stripped_cfg_items
|
||||
.decode((self, tcx))
|
||||
.map(|item| item.map_mod_id(|index| DefId { krate: cnum, index }));
|
||||
tcx.arena.alloc_from_iter(item_names)
|
||||
}
|
||||
|
||||
/// Iterates over the diagnostic items in the given crate.
|
||||
fn get_diagnostic_items(self) -> DiagnosticItems {
|
||||
let mut id_to_name = FxHashMap::default();
|
||||
|
|
|
@ -345,6 +345,7 @@ provide! { tcx, def_id, other, cdata,
|
|||
stability_implications => {
|
||||
cdata.get_stability_implications(tcx).iter().copied().collect()
|
||||
}
|
||||
stripped_cfg_items => { cdata.get_stripped_cfg_items(cdata.cnum, tcx) }
|
||||
is_intrinsic => { cdata.get_is_intrinsic(def_id.index) }
|
||||
defined_lang_items => { cdata.get_lang_items(tcx) }
|
||||
diagnostic_items => { cdata.get_diagnostic_items() }
|
||||
|
|
|
@ -3,6 +3,7 @@ use crate::rmeta::def_path_hash_map::DefPathHashMapRef;
|
|||
use crate::rmeta::table::TableBuilder;
|
||||
use crate::rmeta::*;
|
||||
|
||||
use rustc_ast::expand::StrippedCfgItem;
|
||||
use rustc_ast::Attribute;
|
||||
use rustc_data_structures::fingerprint::Fingerprint;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxIndexSet};
|
||||
|
@ -584,6 +585,8 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
(self.encode_lang_items(), self.encode_lang_items_missing())
|
||||
});
|
||||
|
||||
let stripped_cfg_items = stat!("stripped-cfg-items", || self.encode_stripped_cfg_items());
|
||||
|
||||
let diagnostic_items = stat!("diagnostic-items", || self.encode_diagnostic_items());
|
||||
|
||||
let native_libraries = stat!("native-libs", || self.encode_native_libraries());
|
||||
|
@ -694,6 +697,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
lang_items,
|
||||
diagnostic_items,
|
||||
lang_items_missing,
|
||||
stripped_cfg_items,
|
||||
native_libraries,
|
||||
foreign_modules,
|
||||
source_map,
|
||||
|
@ -1939,6 +1943,15 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
self.lazy_array(&tcx.lang_items().missing)
|
||||
}
|
||||
|
||||
fn encode_stripped_cfg_items(&mut self) -> LazyArray<StrippedCfgItem<DefIndex>> {
|
||||
self.lazy_array(
|
||||
self.tcx
|
||||
.stripped_cfg_items(LOCAL_CRATE)
|
||||
.into_iter()
|
||||
.map(|item| item.clone().map_mod_id(|def_id| def_id.index)),
|
||||
)
|
||||
}
|
||||
|
||||
fn encode_traits(&mut self) -> LazyArray<DefIndex> {
|
||||
empty_proc_macro!(self);
|
||||
self.lazy_array(self.tcx.traits(LOCAL_CRATE).iter().map(|def_id| def_id.index))
|
||||
|
|
|
@ -6,6 +6,7 @@ use rustc_middle::middle::debugger_visualizer::DebuggerVisualizerFile;
|
|||
use table::TableBuilder;
|
||||
|
||||
use rustc_ast as ast;
|
||||
use rustc_ast::expand::StrippedCfgItem;
|
||||
use rustc_attr as attr;
|
||||
use rustc_data_structures::svh::Svh;
|
||||
use rustc_hir as hir;
|
||||
|
@ -256,6 +257,7 @@ pub(crate) struct CrateRoot {
|
|||
stability_implications: LazyArray<(Symbol, Symbol)>,
|
||||
lang_items: LazyArray<(DefIndex, LangItem)>,
|
||||
lang_items_missing: LazyArray<LangItem>,
|
||||
stripped_cfg_items: LazyArray<StrippedCfgItem<DefIndex>>,
|
||||
diagnostic_items: LazyArray<(Symbol, DefIndex)>,
|
||||
native_libraries: LazyArray<NativeLib>,
|
||||
foreign_modules: LazyArray<ForeignModule>,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue