Skip to content

Commit aa4e4e8

Browse files
committed
Refactorings: code cleanup
1 parent b99fad4 commit aa4e4e8

3 files changed

Lines changed: 85 additions & 88 deletions

File tree

compiler/rustc_ast_lowering/src/delegation/delegation.rs

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -638,13 +638,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
638638

639639
// FIXME(fn_delegation): proper support for parent generics propagation
640640
// in method call scenario.
641-
let segment = self.arena.alloc(self.process_segment(
642-
item_id,
643-
span,
644-
&segment,
645-
&mut generics.child,
646-
false,
647-
));
641+
let segment = self.process_segment(item_id, span, &segment, &mut generics.child, false);
642+
let segment = self.arena.alloc(segment);
648643

649644
self.arena.alloc(hir::Expr {
650645
hir_id: self.next_id(),
@@ -685,16 +680,12 @@ impl<'hir> LoweringContext<'_, 'hir> {
685680

686681
hir::QPath::Resolved(ty, self.arena.alloc(new_path))
687682
}
688-
hir::QPath::TypeRelative(ty, segment) => hir::QPath::TypeRelative(
689-
ty,
690-
self.arena.alloc(self.process_segment(
691-
item_id,
692-
span,
693-
segment,
694-
&mut generics.child,
695-
false,
696-
)),
697-
),
683+
hir::QPath::TypeRelative(ty, segment) => {
684+
let segment =
685+
self.process_segment(item_id, span, segment, &mut generics.child, false);
686+
687+
hir::QPath::TypeRelative(ty, self.arena.alloc(segment))
688+
}
698689
};
699690

700691
let callee_path = self.arena.alloc(self.mk_expr(hir::ExprKind::Path(new_path), span));

compiler/rustc_ast_lowering/src/delegation/generics.rs

Lines changed: 46 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ impl<'hir> LoweringContext<'_, 'hir> {
8181
generics: &DelegationGenerics<Generics>,
8282
) -> DelegationGenerics<&'hir hir::Generics<'hir>> {
8383
let mut process_params = |generics: &Option<Generics>| {
84-
generics.as_ref().map(|g| self.process_generic_params(item_id, span, g.params.clone()))
84+
generics
85+
.as_ref()
86+
.map(|g| self.lower_delegation_generic_params(item_id, span, g.params.clone()))
8587
};
8688

8789
match generics {
@@ -95,7 +97,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
9597
}
9698
}
9799

98-
fn process_generic_params(
100+
fn lower_delegation_generic_params(
99101
&mut self,
100102
item_id: NodeId,
101103
span: Span,
@@ -357,43 +359,43 @@ impl<'hir> LoweringContext<'_, 'hir> {
357359
add_self: bool,
358360
user_specified: bool,
359361
) -> Option<Generics> {
360-
id.map(|id| {
361-
let mut generics = if user_specified {
362-
Some(Generics::default())
363-
} else {
364-
if let Some(local_id) = id.as_local() {
365-
if let Some(AstOwner::Item(item)) = self.ast_accessor.get(local_id)
366-
&& matches!(item.kind, ItemKind::Trait(..))
367-
{
368-
item.opt_generics().cloned()
369-
} else {
370-
None
371-
}
362+
let id = if let Some(id) = id { id } else { return None };
363+
364+
// If args are user-specified we still maybe need to add self
365+
let mut generics = if user_specified {
366+
None
367+
} else {
368+
if let Some(local_id) = id.as_local() {
369+
if let Some(AstOwner::Item(item)) = self.ast_accessor.get(local_id)
370+
&& matches!(item.kind, ItemKind::Trait(..))
371+
{
372+
item.opt_generics().cloned()
372373
} else {
373-
self.get_external_generics(id, true)
374+
None
374375
}
375-
};
376-
377-
if add_self {
378-
generics = Some(generics.unwrap_or(Generics::default()));
379-
380-
generics.as_mut().unwrap().params.insert(
381-
0,
382-
GenericParam {
383-
id: self.next_node_id(),
384-
ident: Ident::new(kw::SelfUpper, DUMMY_SP),
385-
attrs: Default::default(),
386-
bounds: vec![],
387-
is_placeholder: false,
388-
kind: GenericParamKind::Type { default: None },
389-
colon_span: None,
390-
},
391-
);
376+
} else {
377+
self.get_external_generics(id, true)
392378
}
379+
};
393380

394-
generics
395-
})
396-
.flatten()
381+
if add_self {
382+
generics = Some(generics.unwrap_or(Generics::default()));
383+
384+
generics.as_mut().unwrap().params.insert(
385+
0,
386+
GenericParam {
387+
id: self.next_node_id(),
388+
ident: Ident::new(kw::SelfUpper, DUMMY_SP),
389+
attrs: Default::default(),
390+
bounds: vec![],
391+
is_placeholder: false,
392+
kind: GenericParamKind::Type { default: None },
393+
colon_span: None,
394+
},
395+
);
396+
}
397+
398+
generics
397399
}
398400
}
399401

@@ -405,13 +407,13 @@ pub(super) enum HirOrAstGenerics<'hir> {
405407
impl<'hir> HirOrAstGenerics<'hir> {
406408
pub(super) fn into_hir_generics(
407409
&mut self,
408-
this: &mut LoweringContext<'_, 'hir>,
410+
ctx: &mut LoweringContext<'_, 'hir>,
409411
item_id: NodeId,
410412
span: Span,
411413
) -> &mut Self {
412414
match self {
413415
HirOrAstGenerics::Ast(delegation_generics) => {
414-
*self = Self::Hir(this.lower_ast_generics(item_id, span, delegation_generics));
416+
*self = Self::Hir(ctx.lower_ast_generics(item_id, span, delegation_generics));
415417
}
416418
HirOrAstGenerics::Hir(_) => {}
417419
}
@@ -434,20 +436,17 @@ impl<'hir> HirOrAstGenerics<'hir> {
434436

435437
pub(super) fn into_generic_args(
436438
&self,
437-
this: &mut LoweringContext<'_, 'hir>,
439+
ctx: &mut LoweringContext<'_, 'hir>,
438440
add_lifetimes: bool,
439441
) -> Option<&'hir hir::GenericArgs<'hir>> {
440442
match self {
441443
HirOrAstGenerics::Ast(_) => None,
442444
HirOrAstGenerics::Hir(hir_generics) => match hir_generics {
443445
DelegationGenerics::UserSpecified => None,
444446
DelegationGenerics::Default(generics)
445-
| DelegationGenerics::SelfAndUserSpecified(generics) => match generics {
446-
Some(generics) => {
447-
Some(this.create_generics_args_from_params(generics.params, add_lifetimes))
448-
}
449-
None => None,
450-
},
447+
| DelegationGenerics::SelfAndUserSpecified(generics) => generics.map(|generics| {
448+
ctx.create_generics_args_from_params(generics.params, add_lifetimes)
449+
}),
451450
},
452451
}
453452
}
@@ -481,19 +480,19 @@ impl<'hir> GenericsGenerationResults<'hir> {
481480
&mut self,
482481
item_id: NodeId,
483482
span: Span,
484-
this: &mut LoweringContext<'_, 'hir>,
483+
ctx: &mut LoweringContext<'_, 'hir>,
485484
) -> impl Iterator<Item = hir::GenericParam<'hir>> {
486485
let parent = self
487486
.parent
488487
.generics
489-
.into_hir_generics(this, item_id, span)
488+
.into_hir_generics(ctx, item_id, span)
490489
.hir_generics_or_empty()
491490
.params;
492491

493492
let child = self
494493
.child
495494
.generics
496-
.into_hir_generics(this, item_id, span)
495+
.into_hir_generics(ctx, item_id, span)
497496
.hir_generics_or_empty()
498497
.params;
499498

compiler/rustc_hir_analysis/src/delegation.rs

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -219,22 +219,19 @@ fn get_delegation_parent_args_count_without_self<'tcx>(
219219
let delegation_parent_args_count = tcx.generics_of(delegation_id).parent_count;
220220

221221
match get_caller_and_callee_kind(tcx, delegation_id, sig_id) {
222-
(FnKind::Free, FnKind::Free) | (FnKind::Free, FnKind::AssocTrait) => 0,
222+
(FnKind::Free, FnKind::Free)
223+
| (FnKind::Free, FnKind::AssocTrait)
224+
| (FnKind::AssocTraitImpl, FnKind::AssocTrait) => 0,
223225

224-
(FnKind::AssocInherentImpl, FnKind::Free) => {
226+
(FnKind::AssocInherentImpl, FnKind::Free)
227+
| (FnKind::AssocInherentImpl, FnKind::AssocTrait) => {
225228
delegation_parent_args_count /* No Self in AssocInherentImpl */
226229
}
227230

228231
(FnKind::AssocTrait, FnKind::Free) | (FnKind::AssocTrait, FnKind::AssocTrait) => {
229232
delegation_parent_args_count - 1 /* Without Self */
230233
}
231234

232-
(FnKind::AssocTraitImpl, FnKind::AssocTrait) => 0,
233-
234-
(FnKind::AssocInherentImpl, FnKind::AssocTrait) => {
235-
delegation_parent_args_count /* No Self in AssocInherentImpl */
236-
}
237-
238235
unsupported_caller_callee_kinds!() => unreachable!(),
239236
}
240237
}
@@ -304,22 +301,36 @@ pub(crate) fn get_delegation_self_ty<'tcx>(
304301
}
305302

306303
(FnKind::AssocTraitImpl, FnKind::AssocTrait) => {
307-
let parent = tcx.parent(delegation_id.into());
308-
let parent_args = tcx.impl_trait_header(parent).trait_ref.instantiate_identity().args;
309-
parent_args.first().map(|a| a.as_type()).flatten()
304+
create_trait_impl_to_trait_parent_args(tcx, delegation_id)
305+
.first()
306+
.map(|a| a.as_type())
307+
.flatten()
310308
}
311309

312310
(FnKind::AssocInherentImpl, FnKind::AssocTrait) => {
313-
let parent = tcx.parent(delegation_id.into());
314-
let self_ty = tcx.type_of(parent).instantiate_identity();
315-
316-
Some(self_ty)
311+
Some(create_inherent_impl_to_trait_self_ty(tcx, delegation_id))
317312
}
318313

319314
unsupported_caller_callee_kinds!() => unreachable!(),
320315
}
321316
}
322317

318+
fn create_trait_impl_to_trait_parent_args<'tcx>(
319+
tcx: TyCtxt<'tcx>,
320+
delegation_id: LocalDefId,
321+
) -> ty::GenericArgsRef<'tcx> {
322+
let parent = tcx.parent(delegation_id.into());
323+
tcx.impl_trait_header(parent).trait_ref.instantiate_identity().args
324+
}
325+
326+
fn create_inherent_impl_to_trait_self_ty<'tcx>(
327+
tcx: TyCtxt<'tcx>,
328+
delegation_id: LocalDefId,
329+
) -> Ty<'tcx> {
330+
let parent = tcx.parent(delegation_id.into());
331+
tcx.type_of(parent).instantiate_identity()
332+
}
333+
323334
/// Creates generic arguments for further delegation signature and predicates instantiation.
324335
/// Arguments can be user-specified (in this case they are in `parent_args` and `child_args`)
325336
/// or propagated. User can specify either both `parent_args` and `child_args`, one of them or none,
@@ -358,22 +369,18 @@ fn create_generic_args<'tcx>(
358369
| (FnKind::AssocTrait, FnKind::AssocTrait) => delegation_args,
359370

360371
(FnKind::AssocTraitImpl, FnKind::AssocTrait) => {
361-
let parent = tcx.parent(delegation_id.into());
362372
// Special case, as user specifies Trait args in impl trait header, we want to treat
363373
// them as parent args.
364-
parent_args = tcx.impl_trait_header(parent).trait_ref.instantiate_identity().args;
365-
374+
parent_args = create_trait_impl_to_trait_parent_args(tcx, delegation_id);
366375
tcx.mk_args(&delegation_args[delegation_parent_args_count..])
367376
}
368377

369378
(FnKind::AssocInherentImpl, FnKind::AssocTrait) => {
370-
let parent = tcx.parent(delegation_id.into());
371-
let self_ty = tcx.type_of(parent).instantiate_identity();
372-
let generic_self_ty = ty::GenericArg::from(self_ty);
373-
374-
let args_iter = std::iter::once(generic_self_ty).chain(delegation_args.iter());
379+
let self_ty = create_inherent_impl_to_trait_self_ty(tcx, delegation_id);
375380

376-
tcx.mk_args_from_iter(args_iter)
381+
tcx.mk_args_from_iter(
382+
std::iter::once(ty::GenericArg::from(self_ty)).chain(delegation_args.iter()),
383+
)
377384
}
378385

379386
unsupported_caller_callee_kinds!() => unreachable!(),

0 commit comments

Comments
 (0)