From 2eefc9db15f22c993ba1103cb93d3265e528d667 Mon Sep 17 00:00:00 2001 From: Alex Burka Date: Mon, 2 Oct 2017 12:28:16 +0000 Subject: [PATCH] add trait aliases to HIR --- src/librustc/hir/def.rs | 5 ++++- src/librustc/hir/intravisit.rs | 5 +++++ src/librustc/hir/lowering.rs | 6 ++++-- src/librustc/hir/map/def_collector.rs | 3 ++- src/librustc/hir/map/mod.rs | 1 + src/librustc/hir/mod.rs | 3 +++ src/librustc/hir/print.rs | 21 +++++++++++++++++++++ src/librustc/ich/impls_hir.rs | 2 ++ src/librustc/middle/reachable.rs | 2 +- src/librustc/middle/resolve_lifetime.rs | 1 + src/librustc_metadata/encoder.rs | 4 +++- src/librustc_privacy/lib.rs | 13 +++++++++++-- src/librustc_trans_utils/collector.rs | 1 + 13 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/librustc/hir/def.rs b/src/librustc/hir/def.rs index 3ef0633e7f4..19a37b693db 100644 --- a/src/librustc/hir/def.rs +++ b/src/librustc/hir/def.rs @@ -37,6 +37,7 @@ pub enum Def { Trait(DefId), TyAlias(DefId), TyForeign(DefId), + TraitAlias(DefId), AssociatedTy(DefId), PrimTy(hir::PrimTy), TyParam(DefId), @@ -155,7 +156,8 @@ impl Def { pub fn def_id(&self) -> DefId { match *self { Def::Fn(id) | Def::Mod(id) | Def::Static(id, _) | - Def::Variant(id) | Def::VariantCtor(id, ..) | Def::Enum(id) | Def::TyAlias(id) | + Def::Variant(id) | Def::VariantCtor(id, ..) | Def::Enum(id) | + Def::TyAlias(id) | Def::TraitAlias(id) | Def::AssociatedTy(id) | Def::TyParam(id) | Def::Struct(id) | Def::StructCtor(id, ..) | Def::Union(id) | Def::Trait(id) | Def::Method(id) | Def::Const(id) | Def::AssociatedConst(id) | Def::Macro(id, ..) | @@ -186,6 +188,7 @@ pub fn kind_name(&self) -> &'static str { Def::VariantCtor(.., CtorKind::Fictive) => "struct variant", Def::Enum(..) => "enum", Def::TyAlias(..) => "type alias", + Def::TraitAlias(..) => "trait alias", Def::AssociatedTy(..) => "associated type", Def::Struct(..) => "struct", Def::StructCtor(.., CtorKind::Fn) => "tuple struct", diff --git a/src/librustc/hir/intravisit.rs b/src/librustc/hir/intravisit.rs index c9d35158ed0..eacad100f10 100644 --- a/src/librustc/hir/intravisit.rs +++ b/src/librustc/hir/intravisit.rs @@ -526,6 +526,11 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) { walk_list!(visitor, visit_ty_param_bound, bounds); walk_list!(visitor, visit_trait_item_ref, trait_item_refs); } + ItemTraitAlias(ref generics, ref bounds) => { + visitor.visit_id(item.id); + visitor.visit_generics(generics); + walk_list!(visitor, visit_ty_param_bound, bounds); + } } walk_list!(visitor, visit_attribute, &item.attrs); } diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index e3a5e835bb9..b544ea820c0 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -1924,9 +1924,11 @@ fn lower_item_kind(&mut self, bounds, items) } - ItemKind::MacroDef(..) | ItemKind::Mac(..) => { - panic!("Shouldn't still be around") + ItemKind::TraitAlias(ref generics, ref bounds) => { + hir::ItemTraitAlias(self.lower_generics(generics), + self.lower_bounds(bounds, ImplTraitContext::Disallowed)) } + ItemKind::MacroDef(..) | ItemKind::Mac(..) => panic!("Shouldn't still be around"), } // [1] `defaultness.has_value()` is never called for an `impl`, always `true` in order to diff --git a/src/librustc/hir/map/def_collector.rs b/src/librustc/hir/map/def_collector.rs index 17a4c66edb9..2978f1eb409 100644 --- a/src/librustc/hir/map/def_collector.rs +++ b/src/librustc/hir/map/def_collector.rs @@ -106,7 +106,8 @@ fn visit_item(&mut self, i: &'a Item) { let def_data = match i.node { ItemKind::AutoImpl(..) | ItemKind::Impl(..) => DefPathData::Impl, - ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Union(..) | ItemKind::Trait(..) | + ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Union(..) | + ItemKind::Trait(..) | ItemKind::TraitAlias(..) | ItemKind::ExternCrate(..) | ItemKind::ForeignMod(..) | ItemKind::Ty(..) => DefPathData::TypeNs(i.ident.name.as_str()), ItemKind::Mod(..) if i.ident == keywords::Invalid.ident() => { diff --git a/src/librustc/hir/map/mod.rs b/src/librustc/hir/map/mod.rs index 8969528dd19..014e5771656 100644 --- a/src/librustc/hir/map/mod.rs +++ b/src/librustc/hir/map/mod.rs @@ -1185,6 +1185,7 @@ fn node_id_to_string(map: &Map, id: NodeId, include_id: bool) -> String { ItemStruct(..) => "struct", ItemUnion(..) => "union", ItemTrait(..) => "trait", + ItemTraitAlias(..) => "trait alias", ItemImpl(..) => "impl", ItemAutoImpl(..) => "default impl", }; diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index d6107a8f551..dc44a943e4c 100644 --- a/src/librustc/hir/mod.rs +++ b/src/librustc/hir/mod.rs @@ -1888,6 +1888,8 @@ pub enum Item_ { ItemUnion(VariantData, Generics), /// Represents a Trait Declaration ItemTrait(IsAuto, Unsafety, Generics, TyParamBounds, HirVec), + /// Represents a Trait Alias Declaration + ItemTraitAlias(Generics, TyParamBounds), /// Auto trait implementations /// @@ -1919,6 +1921,7 @@ pub fn descriptive_variant(&self) -> &str { ItemStruct(..) => "struct", ItemUnion(..) => "union", ItemTrait(..) => "trait", + ItemTraitAlias(..) => "trait alias", ItemImpl(..) | ItemAutoImpl(..) => "item", } diff --git a/src/librustc/hir/print.rs b/src/librustc/hir/print.rs index fb502ecb996..c7bb121e901 100644 --- a/src/librustc/hir/print.rs +++ b/src/librustc/hir/print.rs @@ -747,6 +747,27 @@ pub fn print_item(&mut self, item: &hir::Item) -> io::Result<()> { } self.bclose(item.span)?; } + hir::ItemTraitAlias(ref generics, ref bounds) => { + self.head("")?; + self.print_visibility(&item.vis)?; + self.word_nbsp("trait")?; + self.print_name(item.name)?; + self.print_generics(generics)?; + let mut real_bounds = Vec::with_capacity(bounds.len()); + // FIXME(durka) this seems to be some quite outdated syntax + for b in bounds.iter() { + if let TraitTyParamBound(ref ptr, hir::TraitBoundModifier::Maybe) = *b { + self.s.space()?; + self.word_space("for ?")?; + self.print_trait_ref(&ptr.trait_ref)?; + } else { + real_bounds.push(b.clone()); + } + } + self.print_bounds(" = ", &real_bounds[..])?; + self.print_where_clause(&generics.where_clause)?; + self.s.word(";")?; + } } self.ann.post(self, NodeItem(item)) } diff --git a/src/librustc/ich/impls_hir.rs b/src/librustc/ich/impls_hir.rs index 6fc49e5189d..ff5327ced8b 100644 --- a/src/librustc/ich/impls_hir.rs +++ b/src/librustc/ich/impls_hir.rs @@ -848,6 +848,7 @@ fn hash_stable(&self, ItemStruct(variant_data, generics), ItemUnion(variant_data, generics), ItemTrait(is_auto, unsafety, generics, bounds, item_refs), + ItemTraitAlias(generics, bounds), ItemAutoImpl(unsafety, trait_ref), ItemImpl(unsafety, impl_polarity, impl_defaultness, generics, trait_ref, ty, impl_item_refs) }); @@ -1004,6 +1005,7 @@ fn hash_stable(&self, Variant(def_id), Trait(def_id), TyAlias(def_id), + TraitAlias(def_id), AssociatedTy(def_id), PrimTy(prim_ty), TyParam(def_id), diff --git a/src/librustc/middle/reachable.rs b/src/librustc/middle/reachable.rs index d5f26d1117c..27f12c2c158 100644 --- a/src/librustc/middle/reachable.rs +++ b/src/librustc/middle/reachable.rs @@ -268,7 +268,7 @@ fn propagate_node(&mut self, node: &hir_map::Node<'tcx>, hir::ItemExternCrate(_) | hir::ItemUse(..) | hir::ItemTy(..) | hir::ItemStatic(..) | hir::ItemMod(..) | hir::ItemForeignMod(..) | - hir::ItemImpl(..) | hir::ItemTrait(..) | + hir::ItemImpl(..) | hir::ItemTrait(..) | hir::ItemTraitAlias(..) | hir::ItemStruct(..) | hir::ItemEnum(..) | hir::ItemUnion(..) | hir::ItemAutoImpl(..) | hir::ItemGlobalAsm(..) => {} diff --git a/src/librustc/middle/resolve_lifetime.rs b/src/librustc/middle/resolve_lifetime.rs index d9b2bf62841..e75762cbacb 100644 --- a/src/librustc/middle/resolve_lifetime.rs +++ b/src/librustc/middle/resolve_lifetime.rs @@ -469,6 +469,7 @@ fn visit_item(&mut self, item: &'tcx hir::Item) { | hir::ItemStruct(_, ref generics) | hir::ItemUnion(_, ref generics) | hir::ItemTrait(_, _, ref generics, ..) + | hir::ItemTraitAlias(ref generics, ..) | hir::ItemImpl(_, _, _, ref generics, ..) => { // These kinds of items have only early bound lifetime parameters. let mut index = if let hir::ItemTrait(..) = item.node { diff --git a/src/librustc_metadata/encoder.rs b/src/librustc_metadata/encoder.rs index caeee989283..5e8bbabee4a 100644 --- a/src/librustc_metadata/encoder.rs +++ b/src/librustc_metadata/encoder.rs @@ -979,6 +979,7 @@ fn encode_info_for_item(&mut self, (def_id, item): (DefId, &'tcx hir::Item)) -> EntryKind::Trait(self.lazy(&data)) } hir::ItemExternCrate(_) | + hir::ItemTraitAlias(..) | hir::ItemUse(..) => bug!("cannot encode info for item {:?}", item), }; @@ -1526,7 +1527,8 @@ fn encode_addl_info_for_item(&mut self, item: &hir::Item) { hir::ItemExternCrate(..) | hir::ItemUse(..) | hir::ItemAutoImpl(..) | - hir::ItemTy(..) => { + hir::ItemTy(..) | + hir::ItemTraitAlias(..) => { // no sub-item recording needed in these cases } hir::ItemEnum(..) => { diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs index 27898b5dd64..d4188121812 100644 --- a/src/librustc_privacy/lib.rs +++ b/src/librustc_privacy/lib.rs @@ -158,7 +158,8 @@ fn visit_item(&mut self, item: &'tcx hir::Item) { // Other `pub` items inherit levels from parents hir::ItemConst(..) | hir::ItemEnum(..) | hir::ItemExternCrate(..) | hir::ItemGlobalAsm(..) | hir::ItemFn(..) | hir::ItemMod(..) | - hir::ItemStatic(..) | hir::ItemStruct(..) | hir::ItemTrait(..) | + hir::ItemStatic(..) | hir::ItemStruct(..) | + hir::ItemTrait(..) | hir::ItemTraitAlias(..) | hir::ItemTy(..) | hir::ItemUnion(..) | hir::ItemUse(..) => { if item.vis == hir::Public { self.prev_level } else { None } } @@ -212,7 +213,7 @@ fn visit_item(&mut self, item: &'tcx hir::Item) { } } hir::ItemUse(..) | hir::ItemStatic(..) | hir::ItemConst(..) | - hir::ItemGlobalAsm(..) | hir::ItemTy(..) | hir::ItemMod(..) | + hir::ItemGlobalAsm(..) | hir::ItemTy(..) | hir::ItemMod(..) | hir::ItemTraitAlias(..) | hir::ItemFn(..) | hir::ItemExternCrate(..) | hir::ItemAutoImpl(..) => {} } @@ -252,6 +253,11 @@ fn visit_item(&mut self, item: &'tcx hir::Item) { } } } + hir::ItemTraitAlias(..) => { + if item_level.is_some() { + self.reach(item.id).generics().predicates(); + } + } // Visit everything except for private impl items hir::ItemImpl(.., ref trait_ref, _, ref impl_item_refs) => { if item_level.is_some() { @@ -1498,6 +1504,9 @@ fn visit_item(&mut self, item: &'tcx hir::Item) { } } } + hir::ItemTraitAlias(..) => { + self.check(item.id, item_visibility).generics().predicates(); + } hir::ItemEnum(ref def, _) => { self.check(item.id, item_visibility).generics().predicates(); diff --git a/src/librustc_trans_utils/collector.rs b/src/librustc_trans_utils/collector.rs index e5a97966723..56b1a0238a1 100644 --- a/src/librustc_trans_utils/collector.rs +++ b/src/librustc_trans_utils/collector.rs @@ -894,6 +894,7 @@ fn visit_item(&mut self, item: &'v hir::Item) { hir::ItemTy(..) | hir::ItemAutoImpl(..) | hir::ItemTrait(..) | + hir::ItemTraitAlias(..) | hir::ItemMod(..) => { // Nothing to do, just keep recursing... } -- GitLab