[] impl_item_ref: rustc::hir::ImplItemRef,
[] macro_def: rustc::hir::MacroDef<$tcx>,
[] path: rustc::hir::Path,
+ [] struct_field: rustc::hir::StructField,
[] trait_item_ref: rustc::hir::TraitItemRef,
[] ty: rustc::hir::Ty,
+ [] variant: rustc::hir::Variant<$tcx>,
], $tcx);
)
}
fn is_c_like_enum(item: &Item<'_>) -> bool {
if let ItemKind::Enum(ref def, _) = item.kind {
- for variant in &def.variants {
+ for variant in def.variants {
match variant.data {
hir::VariantData::Unit(..) => { /* continue */ }
_ => return false,
}
}
- pub fn from_hir(vdata: &hir::VariantData) -> CtorKind {
+ pub fn from_hir(vdata: &hir::VariantData<'_>) -> CtorKind {
match *vdata {
hir::VariantData::Tuple(..) => CtorKind::Fn,
hir::VariantData::Unit(..) => CtorKind::Const,
walk_poly_trait_ref(self, t, m)
}
fn visit_variant_data(&mut self,
- s: &'v VariantData,
+ s: &'v VariantData<'v>,
_: Name,
_: &'v Generics,
_parent_id: HirId,
walk_struct_field(self, s)
}
fn visit_enum_def(&mut self,
- enum_definition: &'v EnumDef,
+ enum_definition: &'v EnumDef<'v>,
generics: &'v Generics,
item_id: HirId,
_: Span) {
walk_enum_def(self, enum_definition, generics, item_id)
}
- fn visit_variant(&mut self, v: &'v Variant, g: &'v Generics, item_id: HirId) {
+ fn visit_variant(&mut self, v: &'v Variant<'v>, g: &'v Generics, item_id: HirId) {
walk_variant(self, v, g, item_id)
}
fn visit_label(&mut self, label: &'v Label) {
}
pub fn walk_enum_def<'v, V: Visitor<'v>>(visitor: &mut V,
- enum_definition: &'v EnumDef,
+ enum_definition: &'v EnumDef<'v>,
generics: &'v Generics,
item_id: HirId) {
visitor.visit_id(item_id);
walk_list!(visitor,
visit_variant,
- &enum_definition.variants,
+ enum_definition.variants,
generics,
item_id);
}
pub fn walk_variant<'v, V: Visitor<'v>>(visitor: &mut V,
- variant: &'v Variant,
+ variant: &'v Variant<'v>,
generics: &'v Generics,
parent_item_id: HirId) {
visitor.visit_ident(variant.ident);
parent_item_id,
variant.span);
walk_list!(visitor, visit_anon_const, &variant.disr_expr);
- walk_list!(visitor, visit_attribute, &variant.attrs);
+ walk_list!(visitor, visit_attribute, variant.attrs);
}
pub fn walk_ty<'v, V: Visitor<'v>>(visitor: &mut V, typ: &'v Ty) {
visitor.visit_defaultness(defaultness);
}
-pub fn walk_struct_def<'v, V: Visitor<'v>>(visitor: &mut V, struct_definition: &'v VariantData) {
+pub fn walk_struct_def<'v, V: Visitor<'v>>(visitor: &mut V, struct_definition: &'v VariantData<'v>) {
if let Some(ctor_hir_id) = struct_definition.ctor_hir_id() {
visitor.visit_id(ctor_hir_id);
}
ItemKind::Enum(ref enum_definition, ref generics) => {
hir::ItemKind::Enum(
hir::EnumDef {
- variants: enum_definition
+ variants: self.arena.alloc_from_iter(
+ enum_definition
.variants
.iter()
.map(|x| self.lower_variant(x))
- .collect(),
+ ),
},
self.lower_generics(generics, ImplTraitContext::disallowed()),
)
self.arena.alloc(hir::GlobalAsm { asm: ga.asm })
}
- fn lower_variant(&mut self, v: &Variant) -> hir::Variant {
+ fn lower_variant(&mut self, v: &Variant) -> hir::Variant<'hir> {
hir::Variant {
- attrs: self.lower_attrs(&v.attrs),
+ attrs: self.lower_attrs_arena(&v.attrs),
data: self.lower_variant_data(&v.data),
disr_expr: v.disr_expr.as_ref().map(|e| self.lower_anon_const(e)),
id: self.lower_node_id(v.id),
}
}
- fn lower_variant_data(&mut self, vdata: &VariantData) -> hir::VariantData {
+ fn lower_variant_data(&mut self, vdata: &VariantData) -> hir::VariantData<'hir> {
match *vdata {
VariantData::Struct(ref fields, recovered) => hir::VariantData::Struct(
- fields.iter().enumerate().map(|f| self.lower_struct_field(f)).collect(),
+ self.arena.alloc_from_iter(fields.iter().enumerate().map(|f| self.lower_struct_field(f))),
recovered,
),
VariantData::Tuple(ref fields, id) => {
hir::VariantData::Tuple(
- fields
+ self.arena.alloc_from_iter(
+ fields
.iter()
.enumerate()
.map(|f| self.lower_struct_field(f))
- .collect(),
+ ),
self.lower_node_id(id),
)
},
});
}
- fn visit_variant(&mut self, v: &'hir Variant, g: &'hir Generics, item_id: HirId) {
+ fn visit_variant(&mut self, v: &'hir Variant<'hir>, g: &'hir Generics, item_id: HirId) {
self.insert(v.span, v.id, Node::Variant(v));
self.with_parent(v.id, |this| {
// Register the constructor of this variant.
}
}
- pub fn expect_variant_data(&self, id: HirId) -> &'hir VariantData {
+ pub fn expect_variant_data(&self, id: HirId) -> &'hir VariantData<'hir> {
match self.find(id) {
Some(Node::Item(i)) => {
match i.kind {
}
}
- pub fn expect_variant(&self, id: HirId) -> &'hir Variant {
+ pub fn expect_variant(&self, id: HirId) -> &'hir Variant<'hir> {
match self.find(id) {
Some(Node::Variant(variant)) => variant,
_ => bug!("expected variant, found {}", self.node_to_string(id)),
impl Named for Item<'_> { fn name(&self) -> Name { self.ident.name } }
impl Named for ForeignItem<'_> { fn name(&self) -> Name { self.ident.name } }
-impl Named for Variant { fn name(&self) -> Name { self.ident.name } }
+impl Named for Variant<'_> { fn name(&self) -> Name { self.ident.name } }
impl Named for StructField { fn name(&self) -> Name { self.ident.name } }
impl Named for TraitItem<'_> { fn name(&self) -> Name { self.ident.name } }
impl Named for ImplItem<'_> { fn name(&self) -> Name { self.ident.name } }
}
#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)]
-pub struct EnumDef {
- pub variants: HirVec<Variant>,
+pub struct EnumDef<'hir> {
+ pub variants: &'hir [Variant<'hir>],
}
#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)]
-pub struct Variant {
+pub struct Variant<'hir> {
/// Name of the variant.
#[stable_hasher(project(name))]
pub ident: Ident,
/// Attributes of the variant.
- pub attrs: HirVec<Attribute>,
+ pub attrs: &'hir [Attribute],
/// Id of the variant (not the constructor, see `VariantData::ctor_hir_id()`).
pub id: HirId,
/// Fields and constructor id of the variant.
- pub data: VariantData,
+ pub data: VariantData<'hir>,
/// Explicit discriminant (e.g., `Foo = 1`).
pub disr_expr: Option<AnonConst>,
/// Span
/// Fields and constructor IDs of enum variants and structs.
#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)]
-pub enum VariantData {
+pub enum VariantData<'hir> {
/// A struct variant.
///
/// E.g., `Bar { .. }` as in `enum Foo { Bar { .. } }`.
- Struct(HirVec<StructField>, /* recovered */ bool),
+ Struct(&'hir [StructField], /* recovered */ bool),
/// A tuple variant.
///
/// E.g., `Bar(..)` as in `enum Foo { Bar(..) }`.
- Tuple(HirVec<StructField>, HirId),
+ Tuple(&'hir [StructField], HirId),
/// A unit variant.
///
/// E.g., `Bar = ..` as in `enum Foo { Bar = .. }`.
Unit(HirId),
}
-impl VariantData {
+impl VariantData<'hir> {
/// Return the fields of this variant.
- pub fn fields(&self) -> &[StructField] {
+ pub fn fields(&self) -> &'hir [StructField] {
match *self {
VariantData::Struct(ref fields, ..) | VariantData::Tuple(ref fields, ..) => fields,
_ => &[],
/// An opaque `impl Trait` type alias, e.g., `type Foo = impl Bar;`.
OpaqueTy(OpaqueTy),
/// An enum definition, e.g., `enum Foo<A, B> {C<A>, D<B>}`.
- Enum(EnumDef, Generics),
+ Enum(EnumDef<'hir>, Generics),
/// A struct definition, e.g., `struct Foo<A> {x: A}`.
- Struct(VariantData, Generics),
+ Struct(VariantData<'hir>, Generics),
/// A union definition, e.g., `union Foo<A, B> {x: A, y: B}`.
- Union(VariantData, Generics),
+ Union(VariantData<'hir>, Generics),
/// A trait definition.
Trait(IsAuto, Unsafety, Generics, GenericBounds, &'hir [TraitItemRef]),
/// A trait alias.
ForeignItem(&'hir ForeignItem<'hir>),
TraitItem(&'hir TraitItem<'hir>),
ImplItem(&'hir ImplItem<'hir>),
- Variant(&'hir Variant),
+ Variant(&'hir Variant<'hir>),
Field(&'hir StructField),
AnonConst(&'hir AnonConst),
Expr(&'hir Expr),
/// `Ctor` refers to the constructor of an enum variant or struct. Only tuple or unit variants
/// with synthesized constructors.
- Ctor(&'hir VariantData),
+ Ctor(&'hir VariantData<'hir>),
Lifetime(&'hir Lifetime),
GenericParam(&'hir GenericParam),
}
pub fn print_enum_def(&mut self,
- enum_definition: &hir::EnumDef,
+ enum_definition: &hir::EnumDef<'_>,
generics: &hir::Generics,
name: ast::Name,
span: syntax_pos::Span,
}
pub fn print_variants(&mut self,
- variants: &[hir::Variant],
+ variants: &[hir::Variant<'_>],
span: syntax_pos::Span)
{
self.bopen();
}
pub fn print_struct(&mut self,
- struct_def: &hir::VariantData,
+ struct_def: &hir::VariantData<'_>,
generics: &hir::Generics,
name: ast::Name,
span: syntax_pos::Span,
}
}
- pub fn print_variant(&mut self, v: &hir::Variant) {
+ pub fn print_variant(&mut self, v: &hir::Variant<'_>) {
self.head("");
let generics = hir::Generics::empty();
self.print_struct(&v.data, &generics, v.ident.name, v.span, false);
}
fn visit_variant_data(&mut self,
- s: &'tcx hir::VariantData,
+ s: &'tcx hir::VariantData<'tcx>,
_: ast::Name,
_: &'tcx hir::Generics,
_: hir::HirId,
}
fn visit_variant(&mut self,
- v: &'tcx hir::Variant,
+ v: &'tcx hir::Variant<'tcx>,
g: &'tcx hir::Generics,
item_id: hir::HirId) {
self.with_lint_attrs(v.id, &v.attrs, |cx| {
fn check_trait_item_post(a: &$hir hir::TraitItem<$hir>);
fn check_impl_item(a: &$hir hir::ImplItem<$hir>);
fn check_impl_item_post(a: &$hir hir::ImplItem<$hir>);
- fn check_struct_def(a: &$hir hir::VariantData);
- fn check_struct_def_post(a: &$hir hir::VariantData);
+ fn check_struct_def(a: &$hir hir::VariantData<$hir>);
+ fn check_struct_def_post(a: &$hir hir::VariantData<$hir>);
fn check_struct_field(a: &$hir hir::StructField);
- fn check_variant(a: &$hir hir::Variant);
- fn check_variant_post(a: &$hir hir::Variant);
+ fn check_variant(a: &$hir hir::Variant<$hir>);
+ fn check_variant_post(a: &$hir hir::Variant<$hir>);
fn check_lifetime(a: &$hir hir::Lifetime);
fn check_path(a: &$hir hir::Path, b: hir::HirId);
fn check_attribute(a: &$hir ast::Attribute);
}
fn visit_variant(&mut self,
- v: &'tcx hir::Variant,
+ v: &'tcx hir::Variant<'tcx>,
g: &'tcx hir::Generics,
item_id: hir::HirId) {
self.with_lint_attrs(v.id, &v.attrs, |builder| {
});
}
- fn visit_variant(&mut self, var: &'tcx Variant, g: &'tcx Generics, item_id: HirId) {
+ fn visit_variant(&mut self, var: &'tcx Variant<'tcx>, g: &'tcx Generics, item_id: HirId) {
self.annotate(var.id, &var.attrs, var.span, AnnotationKind::Required,
|v| {
if let Some(ctor_hir_id) = var.data.ctor_hir_id() {
intravisit::walk_impl_item(self, ii);
}
- fn visit_variant(&mut self, var: &'tcx Variant, g: &'tcx Generics, item_id: HirId) {
+ fn visit_variant(&mut self, var: &'tcx Variant<'tcx>, g: &'tcx Generics, item_id: HirId) {
self.check_missing_stability(var.id, var.span, "variant");
intravisit::walk_variant(self, var, g, item_id);
}
}
}
- fn check_variant(&mut self, cx: &LateContext<'_, '_>, v: &hir::Variant) {
+ fn check_variant(&mut self, cx: &LateContext<'_, '_>, v: &hir::Variant<'_>) {
self.check_missing_docs_attrs(cx,
Some(v.id),
&v.attrs,
fn check_struct_def(
&mut self,
cx: &LateContext<'_, '_>,
- s: &hir::VariantData,
+ s: &hir::VariantData<'_>,
) {
for sf in s.fields() {
self.check_snake_case(cx, "structure field", &sf.ident);
}
impl<'a, 'tcx> Visitor<'tcx> for GatherCtors<'a, 'tcx> {
fn visit_variant_data(&mut self,
- v: &'tcx hir::VariantData,
+ v: &'tcx hir::VariantData<'tcx>,
_: ast::Name,
_: &'tcx hir::Generics,
_: hir::HirId,
self.tables = old_tables;
}
- fn visit_variant_data(&mut self, def: &'tcx hir::VariantData, _: ast::Name,
+ fn visit_variant_data(&mut self, def: &'tcx hir::VariantData<'tcx>, _: ast::Name,
_: &hir::Generics, _: hir::HirId, _: syntax_pos::Span) {
let has_repr_c = self.repr_has_repr_c;
let inherited_pub_visibility = self.inherited_pub_visibility;
self.worklist.extend(enum_def.variants.iter().map(|variant| variant.id));
}
- for variant in &enum_def.variants {
+ for variant in enum_def.variants {
if let Some(ctor_hir_id) = variant.data.ctor_hir_id() {
self.struct_constructors.insert(ctor_hir_id, variant.id);
}
&& !has_allow_dead_code_or_lang_attr(self.tcx, field.hir_id, &field.attrs)
}
- fn should_warn_about_variant(&mut self, variant: &hir::Variant) -> bool {
+ fn should_warn_about_variant(&mut self, variant: &hir::Variant<'_>) -> bool {
!self.symbol_is_live(variant.id)
&& !has_allow_dead_code_or_lang_attr(self.tcx,
variant.id,
}
fn visit_variant(&mut self,
- variant: &'tcx hir::Variant,
+ variant: &'tcx hir::Variant<'tcx>,
g: &'tcx hir::Generics,
id: hir::HirId) {
if self.should_warn_about_variant(&variant) {
}
fn visit_variant(&mut self,
- v: &'v hir::Variant,
+ v: &'v hir::Variant<'v>,
g: &'v hir::Generics,
item_id: hir::HirId) {
self.record("Variant", Id::None, v);
// Update levels of nested things.
match item.kind {
hir::ItemKind::Enum(ref def, _) => {
- for variant in &def.variants {
+ for variant in def.variants {
let variant_level = self.update(variant.id, item_level);
if let Some(ctor_hir_id) = variant.data.ctor_hir_id() {
self.update(ctor_hir_id, item_level);
if item_level.is_some() {
self.reach(item.hir_id, item_level).generics().predicates();
}
- for variant in &def.variants {
+ for variant in def.variants {
let variant_level = self.get(variant.id);
if variant_level.is_some() {
for field in variant.data.fields() {
}
fn visit_variant(&mut self,
- v: &'tcx hir::Variant,
+ v: &'tcx hir::Variant<'tcx>,
g: &'tcx hir::Generics,
item_id: hir::HirId) {
if self.access_levels.is_reachable(v.id) {
hir::ItemKind::Enum(ref def, _) => {
self.check(item.hir_id, item_visibility).generics().predicates();
- for variant in &def.variants {
+ for variant in def.variants {
for field in variant.data.fields() {
self.check(field.hir_id, item_visibility).ty();
}
}
#[allow(trivial_numeric_casts)]
-pub fn check_enum<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, vs: &'tcx [hir::Variant], id: hir::HirId) {
+pub fn check_enum<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, vs: &'tcx [hir::Variant<'tcx>], id: hir::HirId) {
let def_id = tcx.hir().local_def_id(id);
let def = tcx.adt_def(def_id);
def.destructor(tcx); // force the destructor to be evaluated
if tcx.adt_def(def_id).repr.int.is_none() && tcx.features().arbitrary_enum_discriminant {
let is_unit =
- |var: &hir::Variant| match var.data {
+ |var: &hir::Variant<'_>| match var.data {
hir::VariantData::Unit(..) => true,
_ => false
};
- let has_disr = |var: &hir::Variant| var.disr_expr.is_some();
+ let has_disr = |var: &hir::Variant<'_>| var.disr_expr.is_some();
let has_non_units = vs.iter().any(|var| !is_unit(var));
let disr_units = vs.iter().any(|var| is_unit(&var) && has_disr(&var));
let disr_non_unit = vs.iter().any(|var| !is_unit(&var) && has_disr(&var));
}
impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
- fn non_enum_variant(&self, struct_def: &hir::VariantData) -> AdtVariant<'tcx> {
+ fn non_enum_variant(&self, struct_def: &hir::VariantData<'_>) -> AdtVariant<'tcx> {
let fields = struct_def.fields().iter().map(|field| {
let field_ty = self.tcx.type_of(self.tcx.hir().local_def_id(field.hir_id));
let field_ty = self.normalize_associated_types_in(field.span,
AdtVariant { fields }
}
- fn enum_variants(&self, enum_def: &hir::EnumDef) -> Vec<AdtVariant<'tcx>> {
+ fn enum_variants(&self, enum_def: &hir::EnumDef<'_>) -> Vec<AdtVariant<'tcx>> {
enum_def.variants.iter()
.map(|variant| self.non_enum_variant(&variant.data))
.collect()
fn convert_enum_variant_types(
tcx: TyCtxt<'_>,
def_id: DefId,
- variants: &[hir::Variant]
+ variants: &[hir::Variant<'_>]
) {
let def = tcx.adt_def(def_id);
let repr_type = def.repr.discr_type();
ctor_did: Option<DefId>,
ident: Ident,
discr: ty::VariantDiscr,
- def: &hir::VariantData,
+ def: &hir::VariantData<'_>,
adt_kind: ty::AdtKind,
parent_did: DefId,
) -> ty::VariantDef {
hir::ItemKind::Enum(ref enum_def, _) => {
self.visit_node_helper(item.hir_id);
- for variant in &enum_def.variants {
+ for variant in enum_def.variants {
if let hir::VariantData::Tuple(..) = variant.data {
self.visit_node_helper(variant.data.ctor_hir_id().unwrap());
}
hir::ItemKind::Enum(ref enum_def, _) => {
self.add_inferreds_for_item(item.hir_id);
- for variant in &enum_def.variants {
+ for variant in enum_def.variants {
if let hir::VariantData::Tuple(..) = variant.data {
self.add_inferreds_for_item(variant.data.ctor_hir_id().unwrap());
}
}
}
-impl Clean<VariantStruct> for ::rustc::hir::VariantData {
+impl Clean<VariantStruct> for ::rustc::hir::VariantData<'_> {
fn clean(&self, cx: &DocContext<'_>) -> VariantStruct {
VariantStruct {
struct_type: doctree::struct_type_from_def(self),
}
}
-impl Clean<VariantKind> for hir::VariantData {
+impl Clean<VariantKind> for hir::VariantData<'_> {
fn clean(&self, cx: &DocContext<'_>) -> VariantKind {
match self {
hir::VariantData::Struct(..) => VariantKind::Struct(self.clean(cx)),
pub name: Name,
pub id: hir::HirId,
pub attrs: &'hir [ast::Attribute],
- pub def: &'hir hir::VariantData,
+ pub def: &'hir hir::VariantData<'hir>,
pub whence: Span,
}