Store a Symbol
instead of an Ident
in VariantDef
/FieldDef
The field is also renamed from `ident` to `name. In most cases, we don't actually need the `Span`. A new `ident` method is added to `VariantDef` and `FieldDef`, which constructs the full `Ident` using `tcx.def_ident_span()`. This method is used in the cases where we actually need an `Ident`. This makes incremental compilation properly track changes to the `Span`, without all of the invalidations caused by storing a `Span` directly via an `Ident`.
This commit is contained in:
parent
e4b1d58414
commit
450ef8613c
38 changed files with 120 additions and 107 deletions
|
@ -336,10 +336,7 @@ impl<'tcx> PlaceBuilder<'tcx> {
|
|||
}
|
||||
|
||||
crate fn downcast(self, adt_def: &'tcx AdtDef, variant_index: VariantIdx) -> Self {
|
||||
self.project(PlaceElem::Downcast(
|
||||
Some(adt_def.variants[variant_index].ident.name),
|
||||
variant_index,
|
||||
))
|
||||
self.project(PlaceElem::Downcast(Some(adt_def.variants[variant_index].name), variant_index))
|
||||
}
|
||||
|
||||
fn index(self, index: Local) -> Self {
|
||||
|
|
|
@ -754,10 +754,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
// So, if we have a match-pattern like `x @ Enum::Variant(P1, P2)`,
|
||||
// we want to create a set of derived match-patterns like
|
||||
// `(x as Variant).0 @ P1` and `(x as Variant).1 @ P1`.
|
||||
let elem = ProjectionElem::Downcast(
|
||||
Some(adt_def.variants[variant_index].ident.name),
|
||||
variant_index,
|
||||
);
|
||||
let elem =
|
||||
ProjectionElem::Downcast(Some(adt_def.variants[variant_index].name), variant_index);
|
||||
let downcast_place = match_pair.place.project(elem); // `(x as Variant)`
|
||||
let consequent_match_pairs = subpatterns.iter().map(|subpattern| {
|
||||
// e.g., `(x as Variant).0`
|
||||
|
|
|
@ -327,7 +327,7 @@ fn check_for_bindings_named_same_as_variants(
|
|||
if let ty::Adt(edef, _) = pat_ty.kind() {
|
||||
if edef.is_enum()
|
||||
&& edef.variants.iter().any(|variant| {
|
||||
variant.ident == ident && variant.ctor_kind == CtorKind::Const
|
||||
variant.ident(cx.tcx) == ident && variant.ctor_kind == CtorKind::Const
|
||||
})
|
||||
{
|
||||
let variant_count = edef.variants.len();
|
||||
|
@ -627,7 +627,7 @@ fn maybe_point_at_variant<'a, 'p: 'a, 'tcx: 'a>(
|
|||
continue;
|
||||
}
|
||||
}
|
||||
let sp = def.variants[*variant_index].ident.span;
|
||||
let sp = def.variants[*variant_index].ident(cx.tcx).span;
|
||||
if covered.contains(&sp) {
|
||||
// Don't point at variants that have already been covered due to other patterns to avoid
|
||||
// visual clutter.
|
||||
|
|
|
@ -1648,7 +1648,7 @@ impl<'p, 'tcx> fmt::Debug for DeconstructedPat<'p, 'tcx> {
|
|||
};
|
||||
|
||||
if let Some(variant) = variant {
|
||||
write!(f, "{}", variant.ident)?;
|
||||
write!(f, "{}", variant.name)?;
|
||||
}
|
||||
|
||||
// Without `cx`, we can't know which field corresponds to which, so we can't
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue