Skip to content

Commit 02141b6

Browse files
committed
Make "use latest edition" subdiagnostic translatable
1 parent a37ff4c commit 02141b6

File tree

9 files changed

+73
-57
lines changed

9 files changed

+73
-57
lines changed

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

+4
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,7 @@ hir_typeck_add_missing_parentheses_in_range = you must surround the range in par
4646
4747
hir_typeck_op_trait_generic_params =
4848
`{$method_name}` must not have any generic parameters
49+
50+
hir_typeck_help_set_edition_cargo = set `edition = "{$edition}"` in `Cargo.toml`
51+
hir_typeck_help_set_edition_standalone = pass `--edition {$edition}` to `rustc`
52+
hir_typeck_note_edition_guide = for more on editions, read https://doc.rust-lang.org/edition-guide

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

+4
Original file line numberDiff line numberDiff line change
@@ -560,3 +560,7 @@ parse_negative_bounds_not_supported = negative bounds are not supported
560560
[one] remove the bound
561561
*[other] remove the bounds
562562
}
563+
564+
parse_help_set_edition_cargo = set `edition = "{$edition}"` in `Cargo.toml`
565+
parse_help_set_edition_standalone = pass `--edition {$edition}` to `rustc`
566+
parse_note_edition_guide = for more on editions, read https://doc.rust-lang.org/edition-guide

compiler/rustc_errors/src/diagnostic.rs

-37
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use rustc_data_structures::fx::FxHashMap;
77
use rustc_error_messages::fluent_value_from_str_list_sep_by_and;
88
use rustc_error_messages::FluentValue;
99
use rustc_lint_defs::{Applicability, LintExpectationId};
10-
use rustc_span::edition::LATEST_STABLE_EDITION;
1110
use rustc_span::symbol::Symbol;
1211
use rustc_span::{Span, DUMMY_SP};
1312
use std::borrow::Cow;
@@ -1052,39 +1051,3 @@ impl PartialEq for Diagnostic {
10521051
self.keys() == other.keys()
10531052
}
10541053
}
1055-
1056-
pub enum HelpUseLatestEdition {
1057-
Cargo,
1058-
Standalone,
1059-
}
1060-
1061-
impl HelpUseLatestEdition {
1062-
pub fn new() -> Self {
1063-
if std::env::var_os("CARGO").is_some() { Self::Cargo } else { Self::Standalone }
1064-
}
1065-
}
1066-
1067-
impl AddToDiagnostic for HelpUseLatestEdition {
1068-
fn add_to_diagnostic_with<F>(self, diag: &mut Diagnostic, f: F)
1069-
where
1070-
F: Fn(&mut Diagnostic, SubdiagnosticMessage) -> SubdiagnosticMessage,
1071-
{
1072-
let msg = f(
1073-
diag,
1074-
match self {
1075-
Self::Cargo => {
1076-
format!("set `edition = \"{}\"` in `Cargo.toml`", LATEST_STABLE_EDITION)
1077-
}
1078-
Self::Standalone => {
1079-
format!("pass `--edition {}` to `rustc`", LATEST_STABLE_EDITION)
1080-
}
1081-
}
1082-
.into(),
1083-
);
1084-
diag.help(msg);
1085-
1086-
let msg =
1087-
f(diag, "for more on editions, read https://doc.rust-lang.org/edition-guide".into());
1088-
diag.note(msg);
1089-
}
1090-
}

compiler/rustc_errors/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ pub struct GoodPathBug;
370370

371371
pub use diagnostic::{
372372
AddToDiagnostic, DecorateLint, Diagnostic, DiagnosticArg, DiagnosticArgValue, DiagnosticId,
373-
DiagnosticStyledString, HelpUseLatestEdition, IntoDiagnosticArg, SubDiagnostic,
373+
DiagnosticStyledString, IntoDiagnosticArg, SubDiagnostic,
374374
};
375375
pub use diagnostic_builder::{DiagnosticBuilder, EmissionGuarantee, Noted};
376376
pub use diagnostic_impls::{DiagnosticArgFromDisplay, DiagnosticSymbolList};

compiler/rustc_hir_typeck/src/errors.rs

+26-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
use rustc_errors::{AddToDiagnostic, Applicability, Diagnostic, MultiSpan, SubdiagnosticMessage};
33
use rustc_macros::{Diagnostic, Subdiagnostic};
44
use rustc_middle::ty::Ty;
5-
use rustc_span::{symbol::Ident, Span};
5+
use rustc_span::{
6+
edition::{Edition, LATEST_STABLE_EDITION},
7+
symbol::Ident,
8+
Span,
9+
};
610

711
#[derive(Diagnostic)]
812
#[diag(hir_typeck_field_multiply_specified_in_initializer, code = "E0062")]
@@ -172,3 +176,24 @@ impl AddToDiagnostic for TypeMismatchFruTypo {
172176
);
173177
}
174178
}
179+
180+
#[derive(Subdiagnostic)]
181+
pub enum HelpUseLatestEdition {
182+
#[help(hir_typeck_help_set_edition_cargo)]
183+
#[note(hir_typeck_note_edition_guide)]
184+
Cargo { edition: Edition },
185+
#[help(hir_typeck_help_set_edition_standalone)]
186+
#[note(hir_typeck_note_edition_guide)]
187+
Standalone { edition: Edition },
188+
}
189+
190+
impl HelpUseLatestEdition {
191+
pub fn new() -> Self {
192+
let edition = LATEST_STABLE_EDITION;
193+
if std::env::var_os("CARGO").is_some() {
194+
Self::Cargo { edition }
195+
} else {
196+
Self::Standalone { edition }
197+
}
198+
}
199+
}

compiler/rustc_hir_typeck/src/expr.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::coercion::DynamicCoerceMany;
88
use crate::errors::TypeMismatchFruTypo;
99
use crate::errors::{AddressOfTemporaryTaken, ReturnStmtOutsideOfFnBody, StructExprNonExhaustive};
1010
use crate::errors::{
11-
FieldMultiplySpecifiedInInitializer, FunctionalRecordUpdateOnNonStruct,
11+
FieldMultiplySpecifiedInInitializer, FunctionalRecordUpdateOnNonStruct, HelpUseLatestEdition,
1212
YieldExprOutsideOfGenerator,
1313
};
1414
use crate::fatally_break_rust;
@@ -24,7 +24,7 @@ use rustc_data_structures::fx::FxHashMap;
2424
use rustc_data_structures::stack::ensure_sufficient_stack;
2525
use rustc_errors::{
2626
pluralize, struct_span_err, AddToDiagnostic, Applicability, Diagnostic, DiagnosticBuilder,
27-
DiagnosticId, ErrorGuaranteed, HelpUseLatestEdition, StashKey,
27+
DiagnosticId, ErrorGuaranteed, StashKey,
2828
};
2929
use rustc_hir as hir;
3030
use rustc_hir::def::{CtorKind, DefKind, Res};

compiler/rustc_parse/src/errors.rs

+23-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
use rustc_ast::token::Token;
22
use rustc_ast::{Path, Visibility};
3-
use rustc_errors::{
4-
fluent, AddToDiagnostic, Applicability, EmissionGuarantee, HelpUseLatestEdition, IntoDiagnostic,
5-
};
3+
use rustc_errors::{fluent, AddToDiagnostic, Applicability, EmissionGuarantee, IntoDiagnostic};
64
use rustc_macros::{Diagnostic, Subdiagnostic};
75
use rustc_session::errors::ExprParenthesesNeeded;
6+
use rustc_span::edition::{Edition, LATEST_STABLE_EDITION};
87
use rustc_span::symbol::Ident;
98
use rustc_span::{Span, Symbol};
109

@@ -1841,3 +1840,24 @@ pub(crate) struct NegativeBoundsNotSupportedSugg {
18411840
pub num_bounds: usize,
18421841
pub fixed: String,
18431842
}
1843+
1844+
#[derive(Subdiagnostic)]
1845+
pub enum HelpUseLatestEdition {
1846+
#[help(parse_help_set_edition_cargo)]
1847+
#[note(parse_note_edition_guide)]
1848+
Cargo { edition: Edition },
1849+
#[help(parse_help_set_edition_standalone)]
1850+
#[note(parse_note_edition_guide)]
1851+
Standalone { edition: Edition },
1852+
}
1853+
1854+
impl HelpUseLatestEdition {
1855+
pub fn new() -> Self {
1856+
let edition = LATEST_STABLE_EDITION;
1857+
if std::env::var_os("CARGO").is_some() {
1858+
Self::Cargo { edition }
1859+
} else {
1860+
Self::Standalone { edition }
1861+
}
1862+
}
1863+
}

compiler/rustc_parse/src/parser/expr.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ use crate::errors::{
1111
ComparisonInterpretedAsGeneric, ComparisonOrShiftInterpretedAsGenericSugg,
1212
DoCatchSyntaxRemoved, DotDotDot, EqFieldInit, ExpectedElseBlock, ExpectedEqForLetExpr,
1313
ExpectedExpressionFoundLet, FieldExpressionWithGeneric, FloatLiteralRequiresIntegerPart,
14-
FoundExprWouldBeStmt, IfExpressionMissingCondition, IfExpressionMissingThenBlock,
15-
IfExpressionMissingThenBlockSub, InvalidBlockMacroSegment, InvalidComparisonOperator,
16-
InvalidComparisonOperatorSub, InvalidInterpolatedExpression, InvalidLiteralSuffixOnTupleIndex,
17-
InvalidLogicalOperator, InvalidLogicalOperatorSub, LabeledLoopInBreak, LeadingPlusNotSupported,
18-
LeftArrowOperator, LifetimeInBorrowExpression, MacroInvocationWithQualifiedPath,
19-
MalformedLoopLabel, MatchArmBodyWithoutBraces, MatchArmBodyWithoutBracesSugg,
20-
MissingCommaAfterMatchArm, MissingDotDot, MissingInInForLoop, MissingInInForLoopSub,
21-
MissingSemicolonBeforeArray, NoFieldsForFnCall, NotAsNegationOperator,
14+
FoundExprWouldBeStmt, HelpUseLatestEdition, IfExpressionMissingCondition,
15+
IfExpressionMissingThenBlock, IfExpressionMissingThenBlockSub, InvalidBlockMacroSegment,
16+
InvalidComparisonOperator, InvalidComparisonOperatorSub, InvalidInterpolatedExpression,
17+
InvalidLiteralSuffixOnTupleIndex, InvalidLogicalOperator, InvalidLogicalOperatorSub,
18+
LabeledLoopInBreak, LeadingPlusNotSupported, LeftArrowOperator, LifetimeInBorrowExpression,
19+
MacroInvocationWithQualifiedPath, MalformedLoopLabel, MatchArmBodyWithoutBraces,
20+
MatchArmBodyWithoutBracesSugg, MissingCommaAfterMatchArm, MissingDotDot, MissingInInForLoop,
21+
MissingInInForLoopSub, MissingSemicolonBeforeArray, NoFieldsForFnCall, NotAsNegationOperator,
2222
NotAsNegationOperatorSub, OuterAttributeNotAllowedOnIfElse, ParenthesesWithStructFields,
2323
RequireColonAfterLabeledExpression, ShiftInterpretedAsGeneric, StructLiteralNotAllowedHere,
2424
StructLiteralNotAllowedHereSugg, TildeAsUnaryOperator, UnexpectedIfWithIf,
@@ -39,8 +39,8 @@ use rustc_ast::{Arm, Async, BlockCheckMode, Expr, ExprKind, Label, Movability, R
3939
use rustc_ast::{ClosureBinder, MetaItemLit, StmtKind};
4040
use rustc_ast_pretty::pprust;
4141
use rustc_errors::{
42-
AddToDiagnostic, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed,
43-
HelpUseLatestEdition, IntoDiagnostic, PResult, StashKey,
42+
AddToDiagnostic, Applicability, Diagnostic, DiagnosticBuilder, ErrorGuaranteed, IntoDiagnostic,
43+
PResult, StashKey,
4444
};
4545
use rustc_session::errors::{report_lit_error, ExprParenthesesNeeded};
4646
use rustc_session::lint::builtin::BREAK_WITH_LABEL_AND_LOOP;

compiler/rustc_parse/src/parser/item.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::errors::{
33
BoundsNotAllowedOnTraitAliases, ConstGlobalCannotBeMutable, ConstLetMutuallyExclusive,
44
DefaultNotFollowedByItem, DocCommentDoesNotDocumentAnything, EnumStructMutuallyExclusive,
55
ExpectedTraitInTraitImplFoundType, ExternCrateNameWithDashes, ExternCrateNameWithDashesSugg,
6-
ExternItemCannotBeConst, MissingConstType, MissingForInTraitImpl,
6+
ExternItemCannotBeConst, HelpUseLatestEdition, MissingConstType, MissingForInTraitImpl,
77
MissingKeywordForItemDefinition, MissingTraitInTraitImpl, SelfArgumentPointer,
88
TraitAliasCannotBeAuto, TraitAliasCannotBeUnsafe, UnexpectedTokenAfterStructName,
99
UseEmptyBlockNotSemi, VisibilityNotFollowedByItem,
@@ -26,8 +26,8 @@ use rustc_ast::{FnHeader, ForeignItem, Path, PathSegment, Visibility, Visibility
2626
use rustc_ast::{MacCall, MacDelimiter};
2727
use rustc_ast_pretty::pprust;
2828
use rustc_errors::{
29-
struct_span_err, Applicability, DiagnosticBuilder, ErrorGuaranteed, HelpUseLatestEdition,
30-
IntoDiagnostic, PResult, StashKey,
29+
struct_span_err, Applicability, DiagnosticBuilder, ErrorGuaranteed, IntoDiagnostic, PResult,
30+
StashKey,
3131
};
3232
use rustc_span::edition::Edition;
3333
use rustc_span::lev_distance::lev_distance;

0 commit comments

Comments
 (0)