Skip to content

Commit c8de335

Browse files
committed
Migrate GenericArgAfterConstraint and fix prev
1 parent 00d739b commit c8de335

File tree

3 files changed

+54
-26
lines changed

3 files changed

+54
-26
lines changed

compiler/rustc_ast_passes/src/ast_validation.rs

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use rustc_ast::walk_list;
1313
use rustc_ast::*;
1414
use rustc_ast_pretty::pprust::{self, State};
1515
use rustc_data_structures::fx::FxHashMap;
16-
use rustc_errors::{error_code, fluent, pluralize, struct_span_err, Applicability};
16+
use rustc_errors::{error_code, fluent, struct_span_err, Applicability};
1717
use rustc_macros::Subdiagnostic;
1818
use rustc_parse::validate_attr;
1919
use rustc_session::lint::builtin::{
@@ -602,32 +602,21 @@ impl<'a> AstValidator<'a> {
602602
AngleBracketedArg::Constraint(c) => Either::Left(c.span),
603603
AngleBracketedArg::Arg(a) => Either::Right(a.span()),
604604
});
605+
let last_arg_span = *arg_spans.last().unwrap();
606+
let first_constraint_span = constraint_spans[0];
605607
let args_len = arg_spans.len();
606-
let constraint_len = constraint_spans.len();
608+
let constraints_len = constraint_spans.len();
607609
// ...and then error:
608-
self.err_handler()
609-
.struct_span_err(
610-
arg_spans.clone(),
611-
"generic arguments must come before the first constraint",
612-
)
613-
.span_label(constraint_spans[0], &format!("constraint{}", pluralize!(constraint_len)))
614-
.span_label(
615-
*arg_spans.iter().last().unwrap(),
616-
&format!("generic argument{}", pluralize!(args_len)),
617-
)
618-
.span_labels(constraint_spans, "")
619-
.span_labels(arg_spans, "")
620-
.span_suggestion_verbose(
621-
data.span,
622-
&format!(
623-
"move the constraint{} after the generic argument{}",
624-
pluralize!(constraint_len),
625-
pluralize!(args_len)
626-
),
627-
self.correct_generic_order_suggestion(&data),
628-
Applicability::MachineApplicable,
629-
)
630-
.emit();
610+
self.session.emit_err(GenericArgAfterConstraint {
611+
arg_spans: arg_spans.clone(),
612+
constraint_spans,
613+
last_arg_span,
614+
first_constraint_span,
615+
replace_span: data.span,
616+
args_len,
617+
constraints_len,
618+
correct_order: self.correct_generic_order_suggestion(&data),
619+
});
631620
}
632621

633622
fn visit_ty_common(&mut self, ty: &'a Ty) {

compiler/rustc_ast_passes/src/errors.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,13 +374,14 @@ pub struct AutoTraitWithGenericParam {
374374
#[diag(ast_passes::auto_trait_with_super_trait_or_where_clause, code = "E0568")]
375375
pub struct AutoTraitWithSuperTraitOrWhereClause {
376376
#[primary_span]
377+
#[suggestion(code = "", applicability = "machine-applicable")]
377378
pub span: Span,
378379
#[label(ast_passes::ident_label)]
379380
pub ident_span: Span,
380381
}
381382

382383
#[derive(SessionDiagnostic)]
383-
#[diag(ast_passes::auto_trait_with_assoc_item)]
384+
#[diag(ast_passes::auto_trait_with_assoc_item, code = "E0380")]
384385
pub struct AutoTraitWithAssocItem {
385386
#[primary_span]
386387
pub spans: Vec<Span>,
@@ -389,3 +390,21 @@ pub struct AutoTraitWithAssocItem {
389390
#[label(ast_passes::ident_label)]
390391
pub ident_span: Span,
391392
}
393+
394+
#[derive(SessionDiagnostic)]
395+
#[diag(ast_passes::generic_arg_after_constraint)]
396+
pub struct GenericArgAfterConstraint {
397+
#[primary_span]
398+
pub arg_spans: Vec<Span>,
399+
#[label(ast_passes::constraints_label)]
400+
pub constraint_spans: Vec<Span>,
401+
#[label(ast_passes::last_arg_label)]
402+
pub last_arg_span: Span,
403+
#[label(ast_passes::first_constraint_label)]
404+
pub first_constraint_span: Span,
405+
#[suggestion_verbose(code = "{correct_order}", applicability = "machine-applicable")]
406+
pub replace_span: Span,
407+
pub args_len: usize,
408+
pub constraints_len: usize,
409+
pub correct_order: String,
410+
}

compiler/rustc_error_messages/locales/en-US/ast_passes.ftl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,3 +175,23 @@ ast_passes_auto_trait_with_assoc_item =
175175
auto traits cannot have associated items
176176
.suggestion = remove these associated items
177177
.ident_label = auto trait cannot have associated items
178+
179+
ast_passes_generic_arg_after_constraint =
180+
generic arguments must come before the first constraint
181+
.first_constraint_label = { $constraints_len ->
182+
[one] constraint
183+
*[other] constraints
184+
}
185+
.last_arg_label = { $args_len ->
186+
[one] generic argument
187+
*[other] generic arguments
188+
}
189+
.constraints_label = {""}
190+
.args_label = {""}
191+
.suggestion = move the { $constraints_len ->
192+
[one] constraint
193+
*[other] constraints
194+
} after the { $args_len ->
195+
[one] generic argument
196+
*[other] generic arguments
197+
}

0 commit comments

Comments
 (0)