Unreserve braced enum variants in value namespace
This commit is contained in:
parent
1cbc45942d
commit
7a5376d23c
71 changed files with 364 additions and 642 deletions
|
@ -11,7 +11,7 @@ use rustc_data_structures::sync::{Lock, LockGuard, Lrc, OnceCell};
|
|||
use rustc_data_structures::unhash::UnhashMap;
|
||||
use rustc_expand::base::{SyntaxExtension, SyntaxExtensionKind};
|
||||
use rustc_expand::proc_macro::{AttrProcMacro, BangProcMacro, DeriveProcMacro};
|
||||
use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
|
||||
use rustc_hir::def::{CtorKind, DefKind, Res};
|
||||
use rustc_hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE};
|
||||
use rustc_hir::definitions::{DefKey, DefPath, DefPathData, DefPathHash};
|
||||
use rustc_hir::diagnostic_items::DiagnosticItems;
|
||||
|
@ -31,7 +31,7 @@ use rustc_session::cstore::{
|
|||
use rustc_session::Session;
|
||||
use rustc_span::hygiene::{ExpnIndex, MacroKind};
|
||||
use rustc_span::source_map::{respan, Spanned};
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
use rustc_span::symbol::{kw, Ident, Symbol};
|
||||
use rustc_span::{self, BytePos, ExpnId, Pos, Span, SyntaxContext, DUMMY_SP};
|
||||
|
||||
use proc_macro::bridge::client::ProcMacro;
|
||||
|
@ -866,12 +866,12 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
|
||||
let variant_did =
|
||||
if adt_kind == ty::AdtKind::Enum { Some(self.local_def_id(index)) } else { None };
|
||||
let ctor_did = data.ctor.map(|index| self.local_def_id(index));
|
||||
let ctor = data.ctor.map(|(kind, index)| (kind, self.local_def_id(index)));
|
||||
|
||||
ty::VariantDef::new(
|
||||
self.item_name(index),
|
||||
variant_did,
|
||||
ctor_did,
|
||||
ctor,
|
||||
data.discr,
|
||||
self.root
|
||||
.tables
|
||||
|
@ -885,7 +885,6 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
vis: self.get_visibility(index),
|
||||
})
|
||||
.collect(),
|
||||
data.ctor_kind,
|
||||
adt_kind,
|
||||
parent_did,
|
||||
false,
|
||||
|
@ -1041,29 +1040,6 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
};
|
||||
|
||||
callback(ModChild { ident, res, vis, span, macro_rules });
|
||||
|
||||
// For non-reexport variants add their fictive constructors to children.
|
||||
// Braced variants, unlike structs, generate unusable names in value namespace,
|
||||
// they are reserved for possible future use. It's ok to use the variant's id as
|
||||
// a ctor id since an error will be reported on any use of such resolution anyway.
|
||||
// Reexport lists automatically contain such constructors when necessary.
|
||||
if kind == DefKind::Variant && self.get_ctor_def_id_and_kind(child_index).is_none()
|
||||
{
|
||||
let ctor_res =
|
||||
Res::Def(DefKind::Ctor(CtorOf::Variant, CtorKind::Fictive), def_id);
|
||||
let mut vis = vis;
|
||||
if vis.is_public() {
|
||||
// For non-exhaustive variants lower the constructor visibility to
|
||||
// within the crate. We only need this for fictive constructors,
|
||||
// for other constructors correct visibilities
|
||||
// were already encoded in metadata.
|
||||
let mut attrs = self.get_item_attrs(def_id.index, sess);
|
||||
if attrs.any(|item| item.has_name(sym::non_exhaustive)) {
|
||||
vis = ty::Visibility::Restricted(self.local_def_id(CRATE_DEF_INDEX));
|
||||
}
|
||||
}
|
||||
callback(ModChild { ident, res: ctor_res, vis, span, macro_rules: false });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1136,11 +1112,11 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
fn get_ctor_def_id_and_kind(self, node_id: DefIndex) -> Option<(DefId, CtorKind)> {
|
||||
fn get_ctor(self, node_id: DefIndex) -> Option<(CtorKind, DefId)> {
|
||||
match self.def_kind(node_id) {
|
||||
DefKind::Struct | DefKind::Variant => {
|
||||
let vdata = self.root.tables.variant_data.get(self, node_id).unwrap().decode(self);
|
||||
vdata.ctor.map(|index| (self.local_def_id(index), vdata.ctor_kind))
|
||||
vdata.ctor.map(|(kind, index)| (kind, self.local_def_id(index)))
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
|
|
|
@ -495,8 +495,8 @@ impl CStore {
|
|||
self.get_crate_data(def.krate).get_struct_field_visibilities(def.index)
|
||||
}
|
||||
|
||||
pub fn ctor_def_id_and_kind_untracked(&self, def: DefId) -> Option<(DefId, CtorKind)> {
|
||||
self.get_crate_data(def.krate).get_ctor_def_id_and_kind(def.index)
|
||||
pub fn ctor_untracked(&self, def: DefId) -> Option<(CtorKind, DefId)> {
|
||||
self.get_crate_data(def.krate).get_ctor(def.index)
|
||||
}
|
||||
|
||||
pub fn visibility_untracked(&self, def: DefId) -> Visibility<DefId> {
|
||||
|
|
|
@ -1221,9 +1221,8 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
debug!("EncodeContext::encode_enum_variant_info({:?})", def_id);
|
||||
|
||||
let data = VariantData {
|
||||
ctor_kind: variant.ctor_kind,
|
||||
discr: variant.discr,
|
||||
ctor: variant.ctor_def_id.map(|did| did.index),
|
||||
ctor: variant.ctor.map(|(kind, def_id)| (kind, def_id.index)),
|
||||
is_non_exhaustive: variant.is_field_list_non_exhaustive(),
|
||||
};
|
||||
|
||||
|
@ -1233,32 +1232,28 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
assert!(f.did.is_local());
|
||||
f.did.index
|
||||
}));
|
||||
if variant.ctor_kind == CtorKind::Fn {
|
||||
if let Some((CtorKind::Fn, ctor_def_id)) = variant.ctor {
|
||||
// FIXME(eddyb) encode signature only in `encode_enum_variant_ctor`.
|
||||
if let Some(ctor_def_id) = variant.ctor_def_id {
|
||||
record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(ctor_def_id));
|
||||
}
|
||||
record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(ctor_def_id));
|
||||
}
|
||||
}
|
||||
|
||||
fn encode_enum_variant_ctor(&mut self, def: ty::AdtDef<'tcx>, index: VariantIdx) {
|
||||
let tcx = self.tcx;
|
||||
let variant = &def.variant(index);
|
||||
let def_id = variant.ctor_def_id.unwrap();
|
||||
let Some((ctor_kind, def_id)) = variant.ctor else { return };
|
||||
debug!("EncodeContext::encode_enum_variant_ctor({:?})", def_id);
|
||||
|
||||
// FIXME(eddyb) encode only the `CtorKind` for constructors.
|
||||
let data = VariantData {
|
||||
ctor_kind: variant.ctor_kind,
|
||||
discr: variant.discr,
|
||||
ctor: Some(def_id.index),
|
||||
ctor: Some((ctor_kind, def_id.index)),
|
||||
is_non_exhaustive: variant.is_field_list_non_exhaustive(),
|
||||
};
|
||||
|
||||
record!(self.tables.variant_data[def_id] <- data);
|
||||
self.tables.constness.set(def_id.index, hir::Constness::Const);
|
||||
if variant.ctor_kind == CtorKind::Fn {
|
||||
record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(def_id));
|
||||
if ctor_kind == CtorKind::Fn {
|
||||
record!(self.tables.fn_sig[def_id] <- self.tcx.fn_sig(def_id));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1313,23 +1308,22 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
fn encode_struct_ctor(&mut self, adt_def: ty::AdtDef<'tcx>, def_id: DefId) {
|
||||
debug!("EncodeContext::encode_struct_ctor({:?})", def_id);
|
||||
let tcx = self.tcx;
|
||||
fn encode_struct_ctor(&mut self, adt_def: ty::AdtDef<'tcx>) {
|
||||
let variant = adt_def.non_enum_variant();
|
||||
let Some((ctor_kind, def_id)) = variant.ctor else { return };
|
||||
debug!("EncodeContext::encode_struct_ctor({:?})", def_id);
|
||||
|
||||
let data = VariantData {
|
||||
ctor_kind: variant.ctor_kind,
|
||||
discr: variant.discr,
|
||||
ctor: Some(def_id.index),
|
||||
ctor: Some((ctor_kind, def_id.index)),
|
||||
is_non_exhaustive: variant.is_field_list_non_exhaustive(),
|
||||
};
|
||||
|
||||
record!(self.tables.repr_options[def_id] <- adt_def.repr());
|
||||
record!(self.tables.variant_data[def_id] <- data);
|
||||
self.tables.constness.set(def_id.index, hir::Constness::Const);
|
||||
if variant.ctor_kind == CtorKind::Fn {
|
||||
record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(def_id));
|
||||
if ctor_kind == CtorKind::Fn {
|
||||
record!(self.tables.fn_sig[def_id] <- self.tcx.fn_sig(def_id));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1550,21 +1544,15 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
let adt_def = self.tcx.adt_def(def_id);
|
||||
record!(self.tables.repr_options[def_id] <- adt_def.repr());
|
||||
}
|
||||
hir::ItemKind::Struct(ref struct_def, _) => {
|
||||
hir::ItemKind::Struct(..) => {
|
||||
let adt_def = self.tcx.adt_def(def_id);
|
||||
record!(self.tables.repr_options[def_id] <- adt_def.repr());
|
||||
self.tables.constness.set(def_id.index, hir::Constness::Const);
|
||||
|
||||
// Encode def_ids for each field and method
|
||||
// for methods, write all the stuff get_trait_method
|
||||
// needs to know
|
||||
let ctor = struct_def.ctor_def_id().map(|ctor_def_id| ctor_def_id.local_def_index);
|
||||
|
||||
let variant = adt_def.non_enum_variant();
|
||||
record!(self.tables.variant_data[def_id] <- VariantData {
|
||||
ctor_kind: variant.ctor_kind,
|
||||
discr: variant.discr,
|
||||
ctor,
|
||||
ctor: variant.ctor.map(|(kind, def_id)| (kind, def_id.index)),
|
||||
is_non_exhaustive: variant.is_field_list_non_exhaustive(),
|
||||
});
|
||||
}
|
||||
|
@ -1574,9 +1562,8 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
|
||||
let variant = adt_def.non_enum_variant();
|
||||
record!(self.tables.variant_data[def_id] <- VariantData {
|
||||
ctor_kind: variant.ctor_kind,
|
||||
discr: variant.discr,
|
||||
ctor: None,
|
||||
ctor: variant.ctor.map(|(kind, def_id)| (kind, def_id.index)),
|
||||
is_non_exhaustive: variant.is_field_list_non_exhaustive(),
|
||||
});
|
||||
}
|
||||
|
@ -1629,7 +1616,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
for variant in tcx.adt_def(def_id).variants() {
|
||||
yield variant.def_id.index;
|
||||
// Encode constructors which take a separate slot in value namespace.
|
||||
if let Some(ctor_def_id) = variant.ctor_def_id {
|
||||
if let Some(ctor_def_id) = variant.ctor_def_id() {
|
||||
yield ctor_def_id.index;
|
||||
}
|
||||
}
|
||||
|
@ -1672,20 +1659,14 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
match item.kind {
|
||||
hir::ItemKind::Enum(..) => {
|
||||
let def = self.tcx.adt_def(item.owner_id.to_def_id());
|
||||
for (i, variant) in def.variants().iter_enumerated() {
|
||||
for (i, _) in def.variants().iter_enumerated() {
|
||||
self.encode_enum_variant_info(def, i);
|
||||
|
||||
if let Some(_ctor_def_id) = variant.ctor_def_id {
|
||||
self.encode_enum_variant_ctor(def, i);
|
||||
}
|
||||
self.encode_enum_variant_ctor(def, i);
|
||||
}
|
||||
}
|
||||
hir::ItemKind::Struct(ref struct_def, _) => {
|
||||
hir::ItemKind::Struct(..) => {
|
||||
let def = self.tcx.adt_def(item.owner_id.to_def_id());
|
||||
// If the struct has a constructor, encode it.
|
||||
if let Some(ctor_def_id) = struct_def.ctor_def_id() {
|
||||
self.encode_struct_ctor(def, ctor_def_id.to_def_id());
|
||||
}
|
||||
self.encode_struct_ctor(def);
|
||||
}
|
||||
hir::ItemKind::Impl { .. } => {
|
||||
for &trait_item_def_id in
|
||||
|
|
|
@ -410,10 +410,9 @@ define_tables! {
|
|||
|
||||
#[derive(TyEncodable, TyDecodable)]
|
||||
struct VariantData {
|
||||
ctor_kind: CtorKind,
|
||||
discr: ty::VariantDiscr,
|
||||
/// If this is unit or tuple-variant/struct, then this is the index of the ctor id.
|
||||
ctor: Option<DefIndex>,
|
||||
ctor: Option<(CtorKind, DefIndex)>,
|
||||
is_non_exhaustive: bool,
|
||||
}
|
||||
|
||||
|
|
|
@ -101,10 +101,8 @@ fixed_size_enum! {
|
|||
( Static(ast::Mutability::Mut) )
|
||||
( Ctor(CtorOf::Struct, CtorKind::Fn) )
|
||||
( Ctor(CtorOf::Struct, CtorKind::Const) )
|
||||
( Ctor(CtorOf::Struct, CtorKind::Fictive) )
|
||||
( Ctor(CtorOf::Variant, CtorKind::Fn) )
|
||||
( Ctor(CtorOf::Variant, CtorKind::Const) )
|
||||
( Ctor(CtorOf::Variant, CtorKind::Fictive) )
|
||||
( Macro(MacroKind::Bang) )
|
||||
( Macro(MacroKind::Attr) )
|
||||
( Macro(MacroKind::Derive) )
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue