Skip to content

Commit 1a7a15b

Browse files
committed
Remove astconv::ConvertedBinding
1 parent a69f489 commit 1a7a15b

File tree

3 files changed

+95
-150
lines changed

3 files changed

+95
-150
lines changed

compiler/rustc_hir_analysis/src/astconv/bounds.rs

+64-66
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ use rustc_span::{ErrorGuaranteed, Span};
99
use rustc_trait_selection::traits;
1010
use smallvec::SmallVec;
1111

12-
use crate::astconv::{
13-
AstConv, ConvertedBinding, ConvertedBindingKind, OnlySelfBounds, PredicateFilter,
14-
};
12+
use crate::astconv::{AstConv, OnlySelfBounds, PredicateFilter};
1513
use crate::bounds::Bounds;
1614
use crate::errors;
1715

@@ -228,7 +226,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
228226
&self,
229227
hir_ref_id: hir::HirId,
230228
trait_ref: ty::PolyTraitRef<'tcx>,
231-
binding: &ConvertedBinding<'_, 'tcx>,
229+
binding: &hir::TypeBinding<'_>,
232230
bounds: &mut Bounds<'tcx>,
233231
speculative: bool,
234232
dup_bindings: &mut FxHashMap<DefId, Span>,
@@ -255,21 +253,20 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
255253

256254
let tcx = self.tcx();
257255

258-
let assoc_kind =
259-
if binding.gen_args.parenthesized == hir::GenericArgsParentheses::ReturnTypeNotation {
260-
ty::AssocKind::Fn
261-
} else if let ConvertedBindingKind::Equality(term) = binding.kind
262-
&& let ty::TermKind::Const(_) = term.node.unpack()
263-
{
264-
ty::AssocKind::Const
265-
} else {
266-
ty::AssocKind::Type
267-
};
256+
let assoc_kind = if binding.gen_args.parenthesized
257+
== hir::GenericArgsParentheses::ReturnTypeNotation
258+
{
259+
ty::AssocKind::Fn
260+
} else if let hir::TypeBindingKind::Equality { term: hir::Term::Const(_) } = binding.kind {
261+
ty::AssocKind::Const
262+
} else {
263+
ty::AssocKind::Type
264+
};
268265

269266
let candidate = if self.trait_defines_associated_item_named(
270267
trait_ref.def_id(),
271268
assoc_kind,
272-
binding.item_name,
269+
binding.ident,
273270
) {
274271
// Simple case: The assoc item is defined in the current trait.
275272
trait_ref
@@ -281,14 +278,14 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
281278
trait_ref.skip_binder().print_only_trait_name(),
282279
None,
283280
assoc_kind,
284-
binding.item_name,
281+
binding.ident,
285282
path_span,
286-
Some(&binding),
283+
Some(binding),
287284
)?
288285
};
289286

290287
let (assoc_ident, def_scope) =
291-
tcx.adjust_ident_and_get_scope(binding.item_name, candidate.def_id(), hir_ref_id);
288+
tcx.adjust_ident_and_get_scope(binding.ident, candidate.def_id(), hir_ref_id);
292289

293290
// We have already adjusted the item name above, so compare with `.normalize_to_macros_2_0()`
294291
// instead of calling `filter_by_name_and_kind` which would needlessly normalize the
@@ -303,7 +300,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
303300
tcx.dcx()
304301
.struct_span_err(
305302
binding.span,
306-
format!("{} `{}` is private", assoc_item.kind, binding.item_name),
303+
format!("{} `{}` is private", assoc_item.kind, binding.ident),
307304
)
308305
.span_label_mv(binding.span, format!("private {}", assoc_item.kind))
309306
.emit();
@@ -317,7 +314,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
317314
tcx.dcx().emit_err(errors::ValueOfAssociatedStructAlreadySpecified {
318315
span: binding.span,
319316
prev_span: *prev_span,
320-
item_name: binding.item_name,
317+
item_name: binding.ident,
321318
def_path: tcx.def_path_str(assoc_item.container_id(tcx)),
322319
});
323320
})
@@ -417,7 +414,7 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
417414
// parent arguments (the arguments of the trait) and the own arguments (the ones of
418415
// the associated item itself) and construct an alias type using them.
419416
candidate.map_bound(|trait_ref| {
420-
let ident = Ident::new(assoc_item.name, binding.item_name.span);
417+
let ident = Ident::new(assoc_item.name, binding.ident.span);
421418
let item_segment = hir::PathSegment {
422419
ident,
423420
hir_id: binding.hir_id,
@@ -441,65 +438,66 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
441438
})
442439
};
443440

444-
// FIXME(associated_const_equality): Can this actually ever fail with assoc consts?
445-
if !speculative {
446-
// Find any late-bound regions declared in `ty` that are not
447-
// declared in the trait-ref or assoc_item. These are not well-formed.
448-
//
449-
// Example:
450-
//
451-
// for<'a> <T as Iterator>::Item = &'a str // <-- 'a is bad
452-
// for<'a> <T as FnMut<(&'a u32,)>>::Output = &'a str // <-- 'a is ok
453-
if let ConvertedBindingKind::Equality(term) = binding.kind {
454-
let late_bound_in_projection_ty =
455-
tcx.collect_constrained_late_bound_regions(&projection_ty);
456-
let late_bound_in_term =
457-
tcx.collect_referenced_late_bound_regions(&trait_ref.rebind(term.node));
458-
debug!(?late_bound_in_projection_ty);
459-
debug!(?late_bound_in_term);
460-
461-
// FIXME: point at the type params that don't have appropriate lifetimes:
462-
// struct S1<F: for<'a> Fn(&i32, &i32) -> &'a i32>(F);
463-
// ---- ---- ^^^^^^^
464-
self.validate_late_bound_regions(
465-
late_bound_in_projection_ty,
466-
late_bound_in_term,
467-
|br_name| {
468-
struct_span_err!(
469-
tcx.dcx(),
470-
binding.span,
471-
E0582,
472-
"binding for associated type `{}` references {}, \
473-
which does not appear in the trait input types",
474-
binding.item_name,
475-
br_name
476-
)
477-
},
478-
);
479-
}
480-
}
481-
482441
match binding.kind {
483-
ConvertedBindingKind::Equality(..) if let ty::AssocKind::Fn = assoc_kind => {
442+
hir::TypeBindingKind::Equality { .. } if let ty::AssocKind::Fn = assoc_kind => {
484443
return Err(tcx.dcx().emit_err(crate::errors::ReturnTypeNotationEqualityBound {
485444
span: binding.span,
486445
}));
487446
}
488-
ConvertedBindingKind::Equality(term) => {
447+
hir::TypeBindingKind::Equality { term } => {
448+
let term = match term {
449+
hir::Term::Ty(ty) => self.ast_ty_to_ty(ty).into(),
450+
hir::Term::Const(ct) => ty::Const::from_anon_const(tcx, ct.def_id).into(),
451+
};
452+
453+
// FIXME(associated_const_equality): Can this actually ever fail with assoc consts?
454+
if !speculative {
455+
// Find any late-bound regions declared in `ty` that are not
456+
// declared in the trait-ref or assoc_item. These are not well-formed.
457+
//
458+
// Example:
459+
//
460+
// for<'a> <T as Iterator>::Item = &'a str // <-- 'a is bad
461+
// for<'a> <T as FnMut<(&'a u32,)>>::Output = &'a str // <-- 'a is ok
462+
let late_bound_in_projection_ty =
463+
tcx.collect_constrained_late_bound_regions(&projection_ty);
464+
let late_bound_in_term =
465+
tcx.collect_referenced_late_bound_regions(&trait_ref.rebind(term));
466+
debug!(?late_bound_in_projection_ty);
467+
debug!(?late_bound_in_term);
468+
469+
// FIXME: point at the type params that don't have appropriate lifetimes:
470+
// struct S1<F: for<'a> Fn(&i32, &i32) -> &'a i32>(F);
471+
// ---- ---- ^^^^^^^
472+
self.validate_late_bound_regions(
473+
late_bound_in_projection_ty,
474+
late_bound_in_term,
475+
|br_name| {
476+
struct_span_err!(
477+
tcx.dcx(),
478+
binding.span,
479+
E0582,
480+
"binding for associated type `{}` references {}, \
481+
which does not appear in the trait input types",
482+
binding.ident,
483+
br_name
484+
)
485+
},
486+
);
487+
}
488+
489489
// "Desugar" a constraint like `T: Iterator<Item = u32>` this to
490490
// the "projection predicate" for:
491491
//
492492
// `<T as Iterator>::Item = u32`
493493
bounds.push_projection_bound(
494494
tcx,
495-
projection_ty.map_bound(|projection_ty| ty::ProjectionPredicate {
496-
projection_ty,
497-
term: term.node,
498-
}),
495+
projection_ty
496+
.map_bound(|projection_ty| ty::ProjectionPredicate { projection_ty, term }),
499497
binding.span,
500498
);
501499
}
502-
ConvertedBindingKind::Constraint(ast_bounds) => {
500+
hir::TypeBindingKind::Constraint { bounds: ast_bounds } => {
503501
// "Desugar" a constraint like `T: Iterator<Item: Debug>` to
504502
//
505503
// `<T as Iterator>::Item: Debug`

compiler/rustc_hir_analysis/src/astconv/errors.rs

+14-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::astconv::{AstConv, ConvertedBindingKind};
1+
use crate::astconv::AstConv;
22
use crate::errors::{
33
self, AssocTypeBindingNotAllowed, ManualImplementation, MissingTypeParams,
44
ParenthesizedFnTraitExpansion,
@@ -107,7 +107,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
107107
assoc_kind: ty::AssocKind,
108108
assoc_name: Ident,
109109
span: Span,
110-
binding: Option<&super::ConvertedBinding<'_, 'tcx>>,
110+
binding: Option<&hir::TypeBinding<'_>>,
111111
) -> ErrorGuaranteed
112112
where
113113
I: Iterator<Item = ty::PolyTraitRef<'tcx>>,
@@ -286,13 +286,13 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
286286
assoc_kind: ty::AssocKind,
287287
ident: Ident,
288288
span: Span,
289-
binding: Option<&super::ConvertedBinding<'_, 'tcx>>,
289+
binding: Option<&hir::TypeBinding<'_>>,
290290
) -> ErrorGuaranteed {
291291
let tcx = self.tcx();
292292

293293
let bound_on_assoc_const_label = if let ty::AssocKind::Const = assoc_item.kind
294294
&& let Some(binding) = binding
295-
&& let ConvertedBindingKind::Constraint(_) = binding.kind
295+
&& let hir::TypeBindingKind::Constraint { .. } = binding.kind
296296
{
297297
let lo = if binding.gen_args.span_ext.is_dummy() {
298298
ident.span
@@ -306,14 +306,14 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
306306

307307
// FIXME(associated_const_equality): This has quite a few false positives and negatives.
308308
let wrap_in_braces_sugg = if let Some(binding) = binding
309-
&& let ConvertedBindingKind::Equality(term) = binding.kind
310-
&& let ty::TermKind::Ty(ty) = term.node.unpack()
309+
&& let hir::TypeBindingKind::Equality { term: hir::Term::Ty(hir_ty) } = binding.kind
310+
&& let ty = self.ast_ty_to_ty(hir_ty)
311311
&& (ty.is_enum() || ty.references_error())
312312
&& tcx.features().associated_const_equality
313313
{
314314
Some(errors::AssocKindMismatchWrapInBracesSugg {
315-
lo: term.span.shrink_to_lo(),
316-
hi: term.span.shrink_to_hi(),
315+
lo: hir_ty.span.shrink_to_lo(),
316+
hi: hir_ty.span.shrink_to_hi(),
317317
})
318318
} else {
319319
None
@@ -322,9 +322,13 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
322322
// For equality bounds, we want to blame the term (RHS) instead of the item (LHS) since
323323
// one can argue that that's more “intuitive” to the user.
324324
let (span, expected_because_label, expected, got) = if let Some(binding) = binding
325-
&& let ConvertedBindingKind::Equality(term) = binding.kind
325+
&& let hir::TypeBindingKind::Equality { term } = binding.kind
326326
{
327-
(term.span, Some(ident.span), assoc_item.kind, assoc_kind)
327+
let span = match term {
328+
hir::Term::Ty(ty) => ty.span,
329+
hir::Term::Const(ct) => tcx.def_span(ct.def_id),
330+
};
331+
(span, Some(ident.span), assoc_item.kind, assoc_kind)
328332
} else {
329333
(ident.span, None, assoc_kind, assoc_item.kind)
330334
};

0 commit comments

Comments
 (0)