Directly encode DefKind in metadata.
This commit is contained in:
parent
2129866dc0
commit
72be5b81df
4 changed files with 64 additions and 14 deletions
|
@ -292,6 +292,12 @@ trait LazyQueryDecodable<'a, 'tcx, T> {
|
||||||
) -> T;
|
) -> T;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a, 'tcx, T> LazyQueryDecodable<'a, 'tcx, T> for T {
|
||||||
|
fn decode_query(self, _: CrateMetadataRef<'a>, _: TyCtxt<'tcx>, _: impl FnOnce() -> !) -> T {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx, T> LazyQueryDecodable<'a, 'tcx, T> for Option<T> {
|
impl<'a, 'tcx, T> LazyQueryDecodable<'a, 'tcx, T> for Option<T> {
|
||||||
fn decode_query(self, _: CrateMetadataRef<'a>, _: TyCtxt<'tcx>, err: impl FnOnce() -> !) -> T {
|
fn decode_query(self, _: CrateMetadataRef<'a>, _: TyCtxt<'tcx>, err: impl FnOnce() -> !) -> T {
|
||||||
if let Some(l) = self { l } else { err() }
|
if let Some(l) = self { l } else { err() }
|
||||||
|
@ -862,16 +868,14 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn def_kind(self, item_id: DefIndex) -> DefKind {
|
fn def_kind(self, item_id: DefIndex) -> DefKind {
|
||||||
self.root.tables.opt_def_kind.get(self, item_id).map(|k| k.decode(self)).unwrap_or_else(
|
self.root.tables.opt_def_kind.get(self, item_id).unwrap_or_else(|| {
|
||||||
|| {
|
bug!(
|
||||||
bug!(
|
"CrateMetadata::def_kind({:?}): id not found, in crate {:?} with number {}",
|
||||||
"CrateMetadata::def_kind({:?}): id not found, in crate {:?} with number {}",
|
item_id,
|
||||||
item_id,
|
self.root.name,
|
||||||
self.root.name,
|
self.cnum,
|
||||||
self.cnum,
|
)
|
||||||
)
|
})
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_span(self, index: DefIndex, sess: &Session) -> Span {
|
fn get_span(self, index: DefIndex, sess: &Session) -> Span {
|
||||||
|
|
|
@ -988,7 +988,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
||||||
let def_id = local_id.to_def_id();
|
let def_id = local_id.to_def_id();
|
||||||
let def_kind = tcx.opt_def_kind(local_id);
|
let def_kind = tcx.opt_def_kind(local_id);
|
||||||
let Some(def_kind) = def_kind else { continue };
|
let Some(def_kind) = def_kind else { continue };
|
||||||
record!(self.tables.opt_def_kind[def_id] <- def_kind);
|
self.tables.opt_def_kind.set(def_id.index, def_kind);
|
||||||
record!(self.tables.def_span[def_id] <- tcx.def_span(def_id));
|
record!(self.tables.def_span[def_id] <- tcx.def_span(def_id));
|
||||||
record!(self.tables.attributes[def_id] <- tcx.get_attrs(def_id));
|
record!(self.tables.attributes[def_id] <- tcx.get_attrs(def_id));
|
||||||
record!(self.tables.expn_that_defined[def_id] <- self.tcx.expn_that_defined(def_id));
|
record!(self.tables.expn_that_defined[def_id] <- self.tcx.expn_that_defined(def_id));
|
||||||
|
@ -1644,7 +1644,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
||||||
self.tables.proc_macro_quoted_spans.set(i, span);
|
self.tables.proc_macro_quoted_spans.set(i, span);
|
||||||
}
|
}
|
||||||
|
|
||||||
record!(self.tables.opt_def_kind[LOCAL_CRATE.as_def_id()] <- DefKind::Mod);
|
self.tables.opt_def_kind.set(LOCAL_CRATE.as_def_id().index, DefKind::Mod);
|
||||||
record!(self.tables.def_span[LOCAL_CRATE.as_def_id()] <- tcx.def_span(LOCAL_CRATE.as_def_id()));
|
record!(self.tables.def_span[LOCAL_CRATE.as_def_id()] <- tcx.def_span(LOCAL_CRATE.as_def_id()));
|
||||||
record!(self.tables.attributes[LOCAL_CRATE.as_def_id()] <- tcx.get_attrs(LOCAL_CRATE.as_def_id()));
|
record!(self.tables.attributes[LOCAL_CRATE.as_def_id()] <- tcx.get_attrs(LOCAL_CRATE.as_def_id()));
|
||||||
record!(self.tables.visibility[LOCAL_CRATE.as_def_id()] <- tcx.visibility(LOCAL_CRATE.as_def_id()));
|
record!(self.tables.visibility[LOCAL_CRATE.as_def_id()] <- tcx.visibility(LOCAL_CRATE.as_def_id()));
|
||||||
|
@ -1685,7 +1685,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
||||||
def_key.disambiguated_data.data = DefPathData::MacroNs(name);
|
def_key.disambiguated_data.data = DefPathData::MacroNs(name);
|
||||||
|
|
||||||
let def_id = id.to_def_id();
|
let def_id = id.to_def_id();
|
||||||
record!(self.tables.opt_def_kind[def_id] <- DefKind::Macro(macro_kind));
|
self.tables.opt_def_kind.set(def_id.index, DefKind::Macro(macro_kind));
|
||||||
record!(self.tables.kind[def_id] <- EntryKind::ProcMacro(macro_kind));
|
record!(self.tables.kind[def_id] <- EntryKind::ProcMacro(macro_kind));
|
||||||
record!(self.tables.attributes[def_id] <- attrs);
|
record!(self.tables.attributes[def_id] <- attrs);
|
||||||
record!(self.tables.def_keys[def_id] <- def_key);
|
record!(self.tables.def_keys[def_id] <- def_key);
|
||||||
|
|
|
@ -286,7 +286,7 @@ define_tables! {
|
||||||
attributes: Table<DefIndex, Lazy<[ast::Attribute]>>,
|
attributes: Table<DefIndex, Lazy<[ast::Attribute]>>,
|
||||||
children: Table<DefIndex, Lazy<[DefIndex]>>,
|
children: Table<DefIndex, Lazy<[DefIndex]>>,
|
||||||
|
|
||||||
opt_def_kind: Table<DefIndex, Lazy<DefKind>>,
|
opt_def_kind: Table<DefIndex, DefKind>,
|
||||||
visibility: Table<DefIndex, Lazy<ty::Visibility>>,
|
visibility: Table<DefIndex, Lazy<ty::Visibility>>,
|
||||||
def_span: Table<DefIndex, Lazy<Span>>,
|
def_span: Table<DefIndex, Lazy<Span>>,
|
||||||
def_ident_span: Table<DefIndex, Lazy<Span>>,
|
def_ident_span: Table<DefIndex, Lazy<Span>>,
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
use crate::rmeta::*;
|
use crate::rmeta::*;
|
||||||
|
|
||||||
|
use rustc_hir::def::{CtorKind, CtorOf};
|
||||||
use rustc_index::vec::Idx;
|
use rustc_index::vec::Idx;
|
||||||
use rustc_serialize::opaque::Encoder;
|
use rustc_serialize::opaque::Encoder;
|
||||||
use rustc_serialize::Encoder as _;
|
use rustc_serialize::Encoder as _;
|
||||||
|
use rustc_span::hygiene::MacroKind;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::num::NonZeroUsize;
|
use std::num::NonZeroUsize;
|
||||||
|
@ -105,6 +107,50 @@ macro_rules! fixed_size_enum {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fixed_size_enum! {
|
||||||
|
DefKind {
|
||||||
|
( Mod )
|
||||||
|
( Struct )
|
||||||
|
( Union )
|
||||||
|
( Enum )
|
||||||
|
( Variant )
|
||||||
|
( Trait )
|
||||||
|
( TyAlias )
|
||||||
|
( ForeignTy )
|
||||||
|
( TraitAlias )
|
||||||
|
( AssocTy )
|
||||||
|
( TyParam )
|
||||||
|
( Fn )
|
||||||
|
( Const )
|
||||||
|
( ConstParam )
|
||||||
|
( AssocFn )
|
||||||
|
( AssocConst )
|
||||||
|
( ExternCrate )
|
||||||
|
( Use )
|
||||||
|
( ForeignMod )
|
||||||
|
( AnonConst )
|
||||||
|
( InlineConst )
|
||||||
|
( OpaqueTy )
|
||||||
|
( Field )
|
||||||
|
( LifetimeParam )
|
||||||
|
( GlobalAsm )
|
||||||
|
( Impl )
|
||||||
|
( Closure )
|
||||||
|
( Generator )
|
||||||
|
( Static(ast::Mutability::Not) )
|
||||||
|
( 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) )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fixed_size_enum! {
|
fixed_size_enum! {
|
||||||
ty::ImplPolarity {
|
ty::ImplPolarity {
|
||||||
( Positive )
|
( Positive )
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue