Hook default
keyword into metadata and carry data through to typeck
This commit is contained in:
parent
8fe63e2342
commit
991f32a6ca
src
@ -281,6 +281,7 @@ pub struct Method<'tcx> {
|
||||
pub fty: BareFnTy<'tcx>,
|
||||
pub explicit_self: ExplicitSelfCategory,
|
||||
pub vis: hir::Visibility,
|
||||
pub defaultness: hir::Defaultness,
|
||||
pub def_id: DefId,
|
||||
pub container: ImplOrTraitItemContainer,
|
||||
}
|
||||
@ -292,16 +293,18 @@ impl<'tcx> Method<'tcx> {
|
||||
fty: BareFnTy<'tcx>,
|
||||
explicit_self: ExplicitSelfCategory,
|
||||
vis: hir::Visibility,
|
||||
defaultness: hir::Defaultness,
|
||||
def_id: DefId,
|
||||
container: ImplOrTraitItemContainer)
|
||||
-> Method<'tcx> {
|
||||
Method {
|
||||
Method {
|
||||
name: name,
|
||||
generics: generics,
|
||||
predicates: predicates,
|
||||
fty: fty,
|
||||
explicit_self: explicit_self,
|
||||
vis: vis,
|
||||
defaultness: defaultness,
|
||||
def_id: def_id,
|
||||
container: container,
|
||||
}
|
||||
@ -334,6 +337,7 @@ pub struct AssociatedConst<'tcx> {
|
||||
pub name: Name,
|
||||
pub ty: Ty<'tcx>,
|
||||
pub vis: hir::Visibility,
|
||||
pub defaultness: hir::Defaultness,
|
||||
pub def_id: DefId,
|
||||
pub container: ImplOrTraitItemContainer,
|
||||
pub has_value: bool
|
||||
@ -344,6 +348,7 @@ pub struct AssociatedType<'tcx> {
|
||||
pub name: Name,
|
||||
pub ty: Option<Ty<'tcx>>,
|
||||
pub vis: hir::Visibility,
|
||||
pub defaultness: hir::Defaultness,
|
||||
pub def_id: DefId,
|
||||
pub container: ImplOrTraitItemContainer,
|
||||
}
|
||||
|
@ -241,6 +241,8 @@ pub const tag_items_data_item_constness: usize = 0xa6;
|
||||
|
||||
pub const tag_items_data_item_deprecation: usize = 0xa7;
|
||||
|
||||
pub const tag_items_data_item_defaultness: usize = 0xa8;
|
||||
|
||||
pub const tag_rustc_version: usize = 0x10f;
|
||||
pub fn rustc_version() -> String {
|
||||
format!(
|
||||
|
@ -165,6 +165,19 @@ fn fn_constness(item: rbml::Doc) -> hir::Constness {
|
||||
}
|
||||
}
|
||||
|
||||
fn item_defaultness(item: rbml::Doc) -> hir::Defaultness {
|
||||
match reader::maybe_get_doc(item, tag_items_data_item_defaultness) {
|
||||
None => hir::Defaultness::Default, // should occur only for default impls on traits
|
||||
Some(defaultness_doc) => {
|
||||
match reader::doc_as_u8(defaultness_doc) as char {
|
||||
'd' => hir::Defaultness::Default,
|
||||
'f' => hir::Defaultness::Final,
|
||||
_ => panic!("unknown defaultness character")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn item_sort(item: rbml::Doc) -> Option<char> {
|
||||
reader::tagged_docs(item, tag_item_trait_item_sort).nth(0).map(|doc| {
|
||||
doc.as_str_slice().as_bytes()[0] as char
|
||||
@ -976,6 +989,7 @@ pub fn get_impl_or_trait_item<'tcx>(intr: Rc<IdentInterner>,
|
||||
|
||||
let name = item_name(&intr, item_doc);
|
||||
let vis = item_visibility(item_doc);
|
||||
let defaultness = item_defaultness(item_doc);
|
||||
|
||||
match item_sort(item_doc) {
|
||||
sort @ Some('C') | sort @ Some('c') => {
|
||||
@ -984,6 +998,7 @@ pub fn get_impl_or_trait_item<'tcx>(intr: Rc<IdentInterner>,
|
||||
name: name,
|
||||
ty: ty,
|
||||
vis: vis,
|
||||
defaultness: defaultness,
|
||||
def_id: def_id,
|
||||
container: container,
|
||||
has_value: sort == Some('C')
|
||||
@ -1007,6 +1022,7 @@ pub fn get_impl_or_trait_item<'tcx>(intr: Rc<IdentInterner>,
|
||||
fty,
|
||||
explicit_self,
|
||||
vis,
|
||||
defaultness,
|
||||
def_id,
|
||||
container)))
|
||||
}
|
||||
@ -1016,6 +1032,7 @@ pub fn get_impl_or_trait_item<'tcx>(intr: Rc<IdentInterner>,
|
||||
name: name,
|
||||
ty: ty,
|
||||
vis: vis,
|
||||
defaultness: defaultness,
|
||||
def_id: def_id,
|
||||
container: container,
|
||||
}))
|
||||
|
@ -451,6 +451,14 @@ fn encode_constness(rbml_w: &mut Encoder, constness: hir::Constness) {
|
||||
rbml_w.end_tag();
|
||||
}
|
||||
|
||||
fn encode_defaultness(rbml_w: &mut Encoder, defaultness: hir::Defaultness) {
|
||||
let ch = match defaultness {
|
||||
hir::Defaultness::Default => 'd',
|
||||
hir::Defaultness::Final => 'f',
|
||||
};
|
||||
rbml_w.wr_tagged_u8(tag_items_data_item_defaultness, ch as u8);
|
||||
}
|
||||
|
||||
fn encode_explicit_self(rbml_w: &mut Encoder,
|
||||
explicit_self: &ty::ExplicitSelfCategory) {
|
||||
let tag = tag_item_trait_method_explicit_self;
|
||||
@ -674,6 +682,7 @@ fn encode_info_for_associated_const<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
|
||||
|
||||
if let Some(ii) = impl_item_opt {
|
||||
encode_attributes(rbml_w, &ii.attrs);
|
||||
encode_defaultness(rbml_w, ii.defaultness);
|
||||
encode_inlined_item(ecx,
|
||||
rbml_w,
|
||||
InlinedItemRef::ImplItem(ecx.tcx.map.local_def_id(parent_id),
|
||||
@ -725,6 +734,7 @@ fn encode_info_for_method<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
|
||||
impl_item));
|
||||
}
|
||||
encode_constness(rbml_w, sig.constness);
|
||||
encode_defaultness(rbml_w, impl_item.defaultness);
|
||||
if !any_types {
|
||||
let m_id = ecx.local_id(m.def_id);
|
||||
encode_symbol(ecx, rbml_w, m_id);
|
||||
@ -767,6 +777,7 @@ fn encode_info_for_associated_type<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
|
||||
|
||||
if let Some(ii) = impl_item_opt {
|
||||
encode_attributes(rbml_w, &ii.attrs);
|
||||
encode_defaultness(rbml_w, ii.defaultness);
|
||||
} else {
|
||||
encode_predicates(rbml_w, ecx, index,
|
||||
&ecx.tcx.lookup_predicates(associated_type.def_id),
|
||||
|
@ -533,6 +533,7 @@ fn convert_method<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
|
||||
id: ast::NodeId,
|
||||
vis: hir::Visibility,
|
||||
sig: &hir::MethodSig,
|
||||
defaultness: hir::Defaultness,
|
||||
untransformed_rcvr_ty: Ty<'tcx>,
|
||||
rcvr_ty_generics: &ty::Generics<'tcx>,
|
||||
rcvr_ty_predicates: &ty::GenericPredicates<'tcx>) {
|
||||
@ -554,6 +555,7 @@ fn convert_method<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
|
||||
fty,
|
||||
explicit_self_category,
|
||||
vis,
|
||||
defaultness,
|
||||
def_id,
|
||||
container);
|
||||
|
||||
@ -600,6 +602,7 @@ fn convert_associated_const<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
|
||||
name: ast::Name,
|
||||
id: ast::NodeId,
|
||||
vis: hir::Visibility,
|
||||
defaultness: hir::Defaultness,
|
||||
ty: ty::Ty<'tcx>,
|
||||
has_value: bool)
|
||||
{
|
||||
@ -611,6 +614,7 @@ fn convert_associated_const<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
|
||||
let associated_const = Rc::new(ty::AssociatedConst {
|
||||
name: name,
|
||||
vis: vis,
|
||||
defaultness: defaultness,
|
||||
def_id: ccx.tcx.map.local_def_id(id),
|
||||
container: container,
|
||||
ty: ty,
|
||||
@ -625,11 +629,13 @@ fn convert_associated_type<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
|
||||
name: ast::Name,
|
||||
id: ast::NodeId,
|
||||
vis: hir::Visibility,
|
||||
defaultness: hir::Defaultness,
|
||||
ty: Option<Ty<'tcx>>)
|
||||
{
|
||||
let associated_type = Rc::new(ty::AssociatedType {
|
||||
name: name,
|
||||
vis: vis,
|
||||
defaultness: defaultness,
|
||||
ty: ty,
|
||||
def_id: ccx.tcx.map.local_def_id(id),
|
||||
container: container
|
||||
@ -767,6 +773,7 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
|
||||
convert_associated_const(ccx, ImplContainer(def_id),
|
||||
impl_item.name, impl_item.id,
|
||||
impl_item.vis.inherit_from(parent_visibility),
|
||||
impl_item.defaultness,
|
||||
ty, true /* has_value */);
|
||||
}
|
||||
}
|
||||
@ -783,7 +790,7 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
|
||||
|
||||
convert_associated_type(ccx, ImplContainer(def_id),
|
||||
impl_item.name, impl_item.id, impl_item.vis,
|
||||
Some(typ));
|
||||
impl_item.defaultness, Some(typ));
|
||||
}
|
||||
}
|
||||
|
||||
@ -797,7 +804,7 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
|
||||
|
||||
convert_method(ccx, ImplContainer(def_id),
|
||||
impl_item.name, impl_item.id, method_vis,
|
||||
sig, selfty, &ty_generics, &ty_predicates);
|
||||
sig, impl_item.defaultness, selfty, &ty_generics, &ty_predicates);
|
||||
}
|
||||
}
|
||||
|
||||
@ -831,6 +838,7 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
|
||||
trait_item.name,
|
||||
trait_item.id,
|
||||
hir::Public,
|
||||
hir::Defaultness::Default,
|
||||
ty,
|
||||
default.is_some())
|
||||
}
|
||||
@ -848,6 +856,7 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
|
||||
trait_item.name,
|
||||
trait_item.id,
|
||||
hir::Public,
|
||||
hir::Defaultness::Default,
|
||||
typ);
|
||||
}
|
||||
}
|
||||
@ -861,6 +870,7 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
|
||||
trait_item.id,
|
||||
hir::Inherited,
|
||||
sig,
|
||||
hir::Defaultness::Default
|
||||
tcx.mk_self_type(),
|
||||
&trait_def.generics,
|
||||
&trait_predicates);
|
||||
|
Loading…
x
Reference in New Issue
Block a user