Clean up AstConv · rust-lang/rust@5beda81 (original) (raw)
`@@ -22,7 +22,7 @@ use rustc_span::symbol::{sym, Ident};
`
22
22
`use rustc_span::{Span, Symbol, DUMMY_SP};
`
23
23
`use rustc_trait_selection::traits::object_safety_violations_for_assoc_item;
`
24
24
``
25
``
`-
impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
`
``
25
`+
impl<'tcx> dyn AstConv<'tcx> + '_ {
`
26
26
`/// On missing type parameters, emit an E0393 error and provide a structured suggestion using
`
27
27
`/// the type parameter's name as a placeholder.
`
28
28
`pub(crate) fn complain_about_missing_type_params(
`
`@@ -349,6 +349,118 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
`
349
349
`})
`
350
350
`}
`
351
351
``
``
352
`+
pub(super) fn report_ambiguous_associated_type(
`
``
353
`+
&self,
`
``
354
`+
span: Span,
`
``
355
`+
types: &[String],
`
``
356
`+
traits: &[String],
`
``
357
`+
name: Symbol,
`
``
358
`+
) -> ErrorGuaranteed {
`
``
359
`+
let mut err =
`
``
360
`+
struct_span_code_err!(self.tcx().dcx(), span, E0223, "ambiguous associated type");
`
``
361
`+
if self
`
``
362
`+
.tcx()
`
``
363
`+
.resolutions(())
`
``
364
`+
.confused_type_with_std_module
`
``
365
`+
.keys()
`
``
366
`+
.any(|full_span| full_span.contains(span))
`
``
367
`+
{
`
``
368
`+
err.span_suggestion_verbose(
`
``
369
`+
span.shrink_to_lo(),
`
``
370
`` +
"you are looking for the module in std
, not the primitive type",
``
``
371
`+
"std::",
`
``
372
`+
Applicability::MachineApplicable,
`
``
373
`+
);
`
``
374
`+
} else {
`
``
375
`+
let mut types = types.to_vec();
`
``
376
`+
types.sort();
`
``
377
`+
let mut traits = traits.to_vec();
`
``
378
`+
traits.sort();
`
``
379
`+
match (&types[..], &traits[..]) {
`
``
380
`+
([], []) => {
`
``
381
`+
err.span_suggestion_verbose(
`
``
382
`+
span,
`
``
383
`+
format!(
`
``
384
`` +
"if there were a type named Type
that implements a trait named \
``
``
385
`` +
Trait
with associated type {name}
, you could use the \
``
``
386
`+
fully-qualified path",
`
``
387
`+
),
`
``
388
`+
format!("::{name}"),
`
``
389
`+
Applicability::HasPlaceholders,
`
``
390
`+
);
`
``
391
`+
}
`
``
392
`+
([], [trait_str]) => {
`
``
393
`+
err.span_suggestion_verbose(
`
``
394
`+
span,
`
``
395
`+
format!(
`
``
396
`` +
"if there were a type named Example
that implemented {trait_str}
, \
``
``
397
`+
you could use the fully-qualified path",
`
``
398
`+
),
`
``
399
`+
format!("<Example as {trait_str}>::{name}"),
`
``
400
`+
Applicability::HasPlaceholders,
`
``
401
`+
);
`
``
402
`+
}
`
``
403
`+
([], traits) => {
`
``
404
`+
err.span_suggestions(
`
``
405
`+
span,
`
``
406
`+
format!(
`
``
407
`` +
"if there were a type named Example
that implemented one of the \
``
``
408
`` +
traits with associated type {name}
, you could use the \
``
``
409
`+
fully-qualified path",
`
``
410
`+
),
`
``
411
`+
traits
`
``
412
`+
.iter()
`
``
413
`+
.map(|trait_str| format!("<Example as {trait_str}>::{name}"))
`
``
414
`+
.collect::<Vec<_>>(),
`
``
415
`+
Applicability::HasPlaceholders,
`
``
416
`+
);
`
``
417
`+
}
`
``
418
`+
([type_str], []) => {
`
``
419
`+
err.span_suggestion_verbose(
`
``
420
`+
span,
`
``
421
`+
format!(
`
``
422
`` +
"if there were a trait named Example
with associated type {name}
\
``
``
423
`` +
implemented for {type_str}
, you could use the fully-qualified path",
``
``
424
`+
),
`
``
425
`+
format!("<{type_str} as Example>::{name}"),
`
``
426
`+
Applicability::HasPlaceholders,
`
``
427
`+
);
`
``
428
`+
}
`
``
429
`+
(types, []) => {
`
``
430
`+
err.span_suggestions(
`
``
431
`+
span,
`
``
432
`+
format!(
`
``
433
`` +
"if there were a trait named Example
with associated type {name}
\
``
``
434
`+
implemented for one of the types, you could use the fully-qualified \
`
``
435
`+
path",
`
``
436
`+
),
`
``
437
`+
types
`
``
438
`+
.into_iter()
`
``
439
`+
.map(|type_str| format!("<{type_str} as Example>::{name}")),
`
``
440
`+
Applicability::HasPlaceholders,
`
``
441
`+
);
`
``
442
`+
}
`
``
443
`+
(types, traits) => {
`
``
444
`+
let mut suggestions = vec![];
`
``
445
`+
for type_str in types {
`
``
446
`+
for trait_str in traits {
`
``
447
`+
suggestions.push(format!("<{type_str} as {trait_str}>::{name}"));
`
``
448
`+
}
`
``
449
`+
}
`
``
450
`+
err.span_suggestions(
`
``
451
`+
span,
`
``
452
`+
"use fully-qualified syntax",
`
``
453
`+
suggestions,
`
``
454
`+
Applicability::MachineApplicable,
`
``
455
`+
);
`
``
456
`+
}
`
``
457
`+
}
`
``
458
`+
}
`
``
459
`+
let reported = err.emit();
`
``
460
`+
self.set_tainted_by_errors(reported);
`
``
461
`+
reported
`
``
462
`+
}
`
``
463
+
352
464
`pub(crate) fn complain_about_ambiguous_inherent_assoc_type(
`
353
465
`&self,
`
354
466
`name: Ident,
`