Hook default keyword into metadata and carry data through to typeck

This commit is contained in:
Aaron Turon 2015-12-28 16:14:28 -08:00
parent 8fe63e2342
commit 991f32a6ca
5 changed files with 48 additions and 3 deletions

View file

@ -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,
}

View file

@ -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!(

View file

@ -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,
}))

View file

@ -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),

View file

@ -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);