Skip to content

Commit 2d27737

Browse files
committed
Propagate ImplOfTrait to hir
1 parent 9733489 commit 2d27737

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+329
-320
lines changed

compiler/rustc_ast_lowering/src/item.rs

Lines changed: 44 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -361,71 +361,69 @@ impl<'hir> LoweringContext<'_, 'hir> {
361361
// lifetime to be added, but rather a reference to a
362362
// parent lifetime.
363363
let itctx = ImplTraitContext::Universal;
364-
let (generics, (trait_ref, lowered_ty)) =
364+
let (generics, (of_trait, lowered_ty)) =
365365
self.lower_generics(ast_generics, id, itctx, |this| {
366-
let modifiers = TraitBoundModifiers {
367-
constness: BoundConstness::Never,
368-
asyncness: BoundAsyncness::Normal,
369-
// we don't use this in bound lowering
370-
polarity: BoundPolarity::Positive,
371-
};
372-
373-
let trait_ref = of_trait.as_ref().map(|of_trait| {
374-
this.lower_trait_ref(
366+
let of_trait = of_trait.as_deref().map(|of_trait| {
367+
let ImplOfTrait {
368+
constness,
369+
safety,
370+
polarity,
371+
defaultness,
372+
ref trait_ref,
373+
} = *of_trait;
374+
let constness = this.lower_constness(constness);
375+
let safety = this.lower_safety(safety, hir::Safety::Safe);
376+
let polarity = match polarity {
377+
ImplPolarity::Positive => ImplPolarity::Positive,
378+
ImplPolarity::Negative(s) => {
379+
ImplPolarity::Negative(this.lower_span(s))
380+
}
381+
};
382+
// `defaultness.has_value()` is never called for an `impl`, always `true` in order
383+
// to not cause an assertion failure inside the `lower_defaultness` function.
384+
let has_val = true;
385+
let (defaultness, defaultness_span) =
386+
this.lower_defaultness(defaultness, has_val);
387+
let modifiers = TraitBoundModifiers {
388+
constness: BoundConstness::Never,
389+
asyncness: BoundAsyncness::Normal,
390+
// we don't use this in bound lowering
391+
polarity: BoundPolarity::Positive,
392+
};
393+
let trait_ref = this.lower_trait_ref(
375394
modifiers,
376-
&of_trait.trait_ref,
395+
trait_ref,
377396
ImplTraitContext::Disallowed(ImplTraitPosition::Trait),
378-
)
397+
);
398+
399+
&*this.arena.alloc(hir::ImplOfTrait {
400+
constness,
401+
safety,
402+
polarity,
403+
defaultness,
404+
defaultness_span,
405+
trait_ref,
406+
})
379407
});
380408

381409
let lowered_ty = this.lower_ty(
382410
ty,
383411
ImplTraitContext::Disallowed(ImplTraitPosition::ImplSelf),
384412
);
385413

386-
(trait_ref, lowered_ty)
414+
(of_trait, lowered_ty)
387415
});
388416

389417
let new_impl_items = self
390418
.arena
391419
.alloc_from_iter(impl_items.iter().map(|item| self.lower_impl_item_ref(item)));
392420

393-
// `defaultness.has_value()` is never called for an `impl`, always `true` in order
394-
// to not cause an assertion failure inside the `lower_defaultness` function.
395-
let has_val = true;
396-
let (constness, safety, polarity, defaultness, defaultness_span) = match of_trait {
397-
Some(of_trait) => {
398-
let ImplOfTrait { constness, safety, polarity, defaultness, trait_ref: _ } =
399-
**of_trait;
400-
let constness = self.lower_constness(constness);
401-
let safety = self.lower_safety(safety, hir::Safety::Safe);
402-
let polarity = match polarity {
403-
ImplPolarity::Positive => ImplPolarity::Positive,
404-
ImplPolarity::Negative(s) => ImplPolarity::Negative(self.lower_span(s)),
405-
};
406-
let (defaultness, defaultness_span) =
407-
self.lower_defaultness(defaultness, has_val);
408-
(constness, safety, polarity, defaultness, defaultness_span)
409-
}
410-
None => (
411-
hir::Constness::NotConst,
412-
hir::Safety::Safe,
413-
ImplPolarity::Positive,
414-
hir::Defaultness::Final,
415-
None,
416-
),
417-
};
418-
hir::ItemKind::Impl(self.arena.alloc(hir::Impl {
419-
constness,
420-
safety,
421-
polarity,
422-
defaultness,
423-
defaultness_span,
421+
hir::ItemKind::Impl(hir::Impl {
424422
generics,
425-
of_trait: trait_ref,
423+
of_trait,
426424
self_ty: lowered_ty,
427425
items: new_impl_items,
428-
}))
426+
})
429427
}
430428
ItemKind::Trait(box Trait {
431429
constness,

compiler/rustc_ast_pretty/src/pprust/state/item.rs

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -324,27 +324,26 @@ impl<'a> State<'a> {
324324
}
325325
};
326326

327-
match of_trait {
328-
None => impl_generics(self),
329-
Some(box of_trait) => {
330-
let ast::ImplOfTrait {
331-
defaultness,
332-
safety,
333-
constness,
334-
polarity,
335-
ref trait_ref,
336-
} = *of_trait;
337-
self.print_defaultness(defaultness);
338-
self.print_safety(safety);
339-
impl_generics(self);
340-
self.print_constness(constness);
341-
if let ast::ImplPolarity::Negative(_) = polarity {
342-
self.word("!");
343-
}
344-
self.print_trait_ref(trait_ref);
345-
self.space();
346-
self.word_space("for");
327+
if let Some(box of_trait) = of_trait {
328+
let ast::ImplOfTrait {
329+
defaultness,
330+
safety,
331+
constness,
332+
polarity,
333+
ref trait_ref,
334+
} = *of_trait;
335+
self.print_defaultness(defaultness);
336+
self.print_safety(safety);
337+
impl_generics(self);
338+
self.print_constness(constness);
339+
if let ast::ImplPolarity::Negative(_) = polarity {
340+
self.word("!");
347341
}
342+
self.print_trait_ref(trait_ref);
343+
self.space();
344+
self.word_space("for");
345+
} else {
346+
impl_generics(self);
348347
}
349348

350349
self.print_type(self_ty);

compiler/rustc_hir/src/hir.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4178,7 +4178,7 @@ impl<'hir> Item<'hir> {
41784178
expect_trait_alias, (Ident, &'hir Generics<'hir>, GenericBounds<'hir>),
41794179
ItemKind::TraitAlias(ident, generics, bounds), (*ident, generics, bounds);
41804180

4181-
expect_impl, &'hir Impl<'hir>, ItemKind::Impl(imp), imp;
4181+
expect_impl, &Impl<'hir>, ItemKind::Impl(imp), imp;
41824182
}
41834183
}
41844184

@@ -4356,7 +4356,7 @@ pub enum ItemKind<'hir> {
43564356
TraitAlias(Ident, &'hir Generics<'hir>, GenericBounds<'hir>),
43574357

43584358
/// An implementation, e.g., `impl<A> Trait for Foo { .. }`.
4359-
Impl(&'hir Impl<'hir>),
4359+
Impl(Impl<'hir>),
43604360
}
43614361

43624362
/// Represents an impl block declaration.
@@ -4365,20 +4365,22 @@ pub enum ItemKind<'hir> {
43654365
/// Refer to [`ImplItem`] for an associated item within an impl block.
43664366
#[derive(Debug, Clone, Copy, HashStable_Generic)]
43674367
pub struct Impl<'hir> {
4368+
pub generics: &'hir Generics<'hir>,
4369+
pub of_trait: Option<&'hir ImplOfTrait<'hir>>,
4370+
pub self_ty: &'hir Ty<'hir>,
4371+
pub items: &'hir [ImplItemId],
4372+
}
4373+
4374+
#[derive(Debug, Clone, Copy, HashStable_Generic)]
4375+
pub struct ImplOfTrait<'hir> {
43684376
pub constness: Constness,
43694377
pub safety: Safety,
43704378
pub polarity: ImplPolarity,
43714379
pub defaultness: Defaultness,
43724380
// We do not put a `Span` in `Defaultness` because it breaks foreign crate metadata
43734381
// decoding as `Span`s cannot be decoded when a `Session` is not available.
43744382
pub defaultness_span: Option<Span>,
4375-
pub generics: &'hir Generics<'hir>,
4376-
4377-
/// The trait being implemented, if any.
4378-
pub of_trait: Option<TraitRef<'hir>>,
4379-
4380-
pub self_ty: &'hir Ty<'hir>,
4381-
pub items: &'hir [ImplItemId],
4383+
pub trait_ref: TraitRef<'hir>,
43824384
}
43834385

43844386
impl ItemKind<'_> {
@@ -4740,8 +4742,8 @@ impl<'hir> Node<'hir> {
47404742
/// Get a `hir::Impl` if the node is an impl block for the given `trait_def_id`.
47414743
pub fn impl_block_of_trait(self, trait_def_id: DefId) -> Option<&'hir Impl<'hir>> {
47424744
if let Node::Item(Item { kind: ItemKind::Impl(impl_block), .. }) = self
4743-
&& let Some(trait_ref) = impl_block.of_trait
4744-
&& let Some(trait_id) = trait_ref.trait_def_id()
4745+
&& let Some(of_trait) = impl_block.of_trait
4746+
&& let Some(trait_id) = of_trait.trait_ref.trait_def_id()
47454747
&& trait_id == trait_def_id
47464748
{
47474749
Some(impl_block)
@@ -4936,9 +4938,10 @@ mod size_asserts {
49364938
static_assert_size!(GenericArg<'_>, 16);
49374939
static_assert_size!(GenericBound<'_>, 64);
49384940
static_assert_size!(Generics<'_>, 56);
4939-
static_assert_size!(Impl<'_>, 80);
4941+
static_assert_size!(Impl<'_>, 40);
49404942
static_assert_size!(ImplItem<'_>, 96);
49414943
static_assert_size!(ImplItemKind<'_>, 40);
4944+
static_assert_size!(ImplOfTrait<'_>, 48);
49424945
static_assert_size!(Item<'_>, 88);
49434946
static_assert_size!(ItemKind<'_>, 64);
49444947
static_assert_size!(LetStmt<'_>, 72);

compiler/rustc_hir/src/intravisit.rs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -596,21 +596,13 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) -> V::
596596
try_visit!(visitor.visit_generics(generics));
597597
try_visit!(visitor.visit_enum_def(enum_definition));
598598
}
599-
ItemKind::Impl(Impl {
600-
constness: _,
601-
safety: _,
602-
defaultness: _,
603-
polarity: _,
604-
defaultness_span: _,
605-
generics,
606-
of_trait,
607-
self_ty,
608-
items,
609-
}) => {
599+
ItemKind::Impl(Impl { generics, of_trait, self_ty, items }) => {
610600
try_visit!(visitor.visit_generics(generics));
611-
visit_opt!(visitor, visit_trait_ref, of_trait);
601+
if let Some(of_trait) = of_trait {
602+
try_visit!(visitor.visit_trait_ref(&of_trait.trait_ref));
603+
}
612604
try_visit!(visitor.visit_ty_unambig(self_ty));
613-
walk_list!(visitor, visit_impl_item_ref, *items);
605+
walk_list!(visitor, visit_impl_item_ref, items);
614606
}
615607
ItemKind::Struct(ident, ref generics, ref struct_definition)
616608
| ItemKind::Union(ident, ref generics, ref struct_definition) => {

0 commit comments

Comments
 (0)