Rollup merge of #112768 - NotStirred:translatable_diag/resolve1, r=WaffleLapkin
Rewrite various resolve/diagnostics errors as translatable diagnostics additional question: For trivial strings is it ever accepted to use `fluent_generated::foo` in a `label` for example? Or is an empty struct `Diagnostic` preferred?
This commit is contained in:
commit
6de869fd23
@ -5,6 +5,9 @@ resolve_add_as_non_derive =
|
|||||||
add as non-Derive macro
|
add as non-Derive macro
|
||||||
`#[{$macro_path}]`
|
`#[{$macro_path}]`
|
||||||
|
|
||||||
|
resolve_added_macro_use =
|
||||||
|
have you added the `#[macro_use]` on the module/import?
|
||||||
|
|
||||||
resolve_ampersand_used_without_explicit_lifetime_name =
|
resolve_ampersand_used_without_explicit_lifetime_name =
|
||||||
`&` without an explicit lifetime name cannot be used here
|
`&` without an explicit lifetime name cannot be used here
|
||||||
.note = explicit lifetime name needed here
|
.note = explicit lifetime name needed here
|
||||||
@ -45,9 +48,18 @@ resolve_cannot_capture_dynamic_environment_in_fn_item =
|
|||||||
can't capture dynamic environment in a fn item
|
can't capture dynamic environment in a fn item
|
||||||
.help = use the `|| {"{"} ... {"}"}` closure form instead
|
.help = use the `|| {"{"} ... {"}"}` closure form instead
|
||||||
|
|
||||||
|
resolve_cannot_find_ident_in_this_scope =
|
||||||
|
cannot find {$expected} `{$ident}` in this scope
|
||||||
|
|
||||||
resolve_cannot_use_self_type_here =
|
resolve_cannot_use_self_type_here =
|
||||||
can't use `Self` here
|
can't use `Self` here
|
||||||
|
|
||||||
|
resolve_change_import_binding =
|
||||||
|
you can use `as` to change the binding name of the import
|
||||||
|
|
||||||
|
resolve_consider_adding_a_derive =
|
||||||
|
consider adding a derive
|
||||||
|
|
||||||
resolve_const_not_member_of_trait =
|
resolve_const_not_member_of_trait =
|
||||||
const `{$const_}` is not a member of trait `{$trait_}`
|
const `{$const_}` is not a member of trait `{$trait_}`
|
||||||
.label = not a member of trait `{$trait_}`
|
.label = not a member of trait `{$trait_}`
|
||||||
@ -74,6 +86,9 @@ resolve_expected_found =
|
|||||||
expected module, found {$res} `{$path_str}`
|
expected module, found {$res} `{$path_str}`
|
||||||
.label = not a module
|
.label = not a module
|
||||||
|
|
||||||
|
resolve_explicit_unsafe_traits =
|
||||||
|
unsafe traits like `{$ident}` should be implemented explicitly
|
||||||
|
|
||||||
resolve_forward_declared_generic_param =
|
resolve_forward_declared_generic_param =
|
||||||
generic parameters with a default cannot use forward declared identifiers
|
generic parameters with a default cannot use forward declared identifiers
|
||||||
.label = defaulted generic parameters cannot be forward declared
|
.label = defaulted generic parameters cannot be forward declared
|
||||||
@ -96,6 +111,9 @@ resolve_ident_bound_more_than_once_in_same_pattern =
|
|||||||
|
|
||||||
resolve_imported_crate = `$crate` may not be imported
|
resolve_imported_crate = `$crate` may not be imported
|
||||||
|
|
||||||
|
resolve_imports_cannot_refer_to =
|
||||||
|
imports cannot refer to {$what}
|
||||||
|
|
||||||
resolve_indeterminate =
|
resolve_indeterminate =
|
||||||
cannot determine resolution for the visibility
|
cannot determine resolution for the visibility
|
||||||
|
|
||||||
|
@ -30,6 +30,10 @@ use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
|||||||
use rustc_span::{BytePos, Span, SyntaxContext};
|
use rustc_span::{BytePos, Span, SyntaxContext};
|
||||||
use thin_vec::ThinVec;
|
use thin_vec::ThinVec;
|
||||||
|
|
||||||
|
use crate::errors::{
|
||||||
|
AddedMacroUse, ChangeImportBinding, ChangeImportBindingSuggestion, ConsiderAddingADerive,
|
||||||
|
ExplicitUnsafeTraits,
|
||||||
|
};
|
||||||
use crate::imports::{Import, ImportKind};
|
use crate::imports::{Import, ImportKind};
|
||||||
use crate::late::{PatternSource, Rib};
|
use crate::late::{PatternSource, Rib};
|
||||||
use crate::path_names_to_string;
|
use crate::path_names_to_string;
|
||||||
@ -376,16 +380,10 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
|
|
||||||
let rename_msg = "you can use `as` to change the binding name of the import";
|
|
||||||
if let Some(suggestion) = suggestion {
|
if let Some(suggestion) = suggestion {
|
||||||
err.span_suggestion(
|
err.subdiagnostic(ChangeImportBindingSuggestion { span: binding_span, suggestion });
|
||||||
binding_span,
|
|
||||||
rename_msg,
|
|
||||||
suggestion,
|
|
||||||
Applicability::MaybeIncorrect,
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
err.span_label(binding_span, rename_msg);
|
err.subdiagnostic(ChangeImportBinding { span: binding_span });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1382,12 +1380,11 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if macro_kind == MacroKind::Derive && (ident.name == sym::Send || ident.name == sym::Sync) {
|
if macro_kind == MacroKind::Derive && (ident.name == sym::Send || ident.name == sym::Sync) {
|
||||||
let msg = format!("unsafe traits like `{}` should be implemented explicitly", ident);
|
err.subdiagnostic(ExplicitUnsafeTraits { span: ident.span, ident });
|
||||||
err.span_note(ident.span, msg);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if self.macro_names.contains(&ident.normalize_to_macros_2_0()) {
|
if self.macro_names.contains(&ident.normalize_to_macros_2_0()) {
|
||||||
err.help("have you added the `#[macro_use]` on the module/import?");
|
err.subdiagnostic(AddedMacroUse);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ident.name == kw::Default
|
if ident.name == kw::Default
|
||||||
@ -1396,14 +1393,10 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||||||
let span = self.def_span(def_id);
|
let span = self.def_span(def_id);
|
||||||
let source_map = self.tcx.sess.source_map();
|
let source_map = self.tcx.sess.source_map();
|
||||||
let head_span = source_map.guess_head_span(span);
|
let head_span = source_map.guess_head_span(span);
|
||||||
if let Ok(head) = source_map.span_to_snippet(head_span) {
|
err.subdiagnostic(ConsiderAddingADerive {
|
||||||
err.span_suggestion(head_span, "consider adding a derive", format!("#[derive(Default)]\n{head}"), Applicability::MaybeIncorrect);
|
span: head_span.shrink_to_lo(),
|
||||||
} else {
|
suggestion: format!("#[derive(Default)]\n")
|
||||||
err.span_help(
|
});
|
||||||
head_span,
|
|
||||||
"consider adding `#[derive(Default)]` to this enum",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
for ns in [Namespace::MacroNS, Namespace::TypeNS, Namespace::ValueNS] {
|
for ns in [Namespace::MacroNS, Namespace::TypeNS, Namespace::ValueNS] {
|
||||||
if let Ok(binding) = self.early_resolve_ident_in_lexical_scope(
|
if let Ok(binding) = self.early_resolve_ident_in_lexical_scope(
|
||||||
|
@ -586,3 +586,63 @@ pub(crate) enum ParamKindInEnumDiscriminant {
|
|||||||
#[note(resolve_lifetime_param_in_enum_discriminant)]
|
#[note(resolve_lifetime_param_in_enum_discriminant)]
|
||||||
Lifetime,
|
Lifetime,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Subdiagnostic)]
|
||||||
|
#[label(resolve_change_import_binding)]
|
||||||
|
pub(crate) struct ChangeImportBinding {
|
||||||
|
#[primary_span]
|
||||||
|
pub(crate) span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Subdiagnostic)]
|
||||||
|
#[suggestion(
|
||||||
|
resolve_change_import_binding,
|
||||||
|
code = "{suggestion}",
|
||||||
|
applicability = "maybe-incorrect"
|
||||||
|
)]
|
||||||
|
pub(crate) struct ChangeImportBindingSuggestion {
|
||||||
|
#[primary_span]
|
||||||
|
pub(crate) span: Span,
|
||||||
|
pub(crate) suggestion: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(resolve_imports_cannot_refer_to)]
|
||||||
|
pub(crate) struct ImportsCannotReferTo<'a> {
|
||||||
|
#[primary_span]
|
||||||
|
pub(crate) span: Span,
|
||||||
|
pub(crate) what: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(resolve_cannot_find_ident_in_this_scope)]
|
||||||
|
pub(crate) struct CannotFindIdentInThisScope<'a> {
|
||||||
|
#[primary_span]
|
||||||
|
pub(crate) span: Span,
|
||||||
|
pub(crate) expected: &'a str,
|
||||||
|
pub(crate) ident: Ident,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Subdiagnostic)]
|
||||||
|
#[note(resolve_explicit_unsafe_traits)]
|
||||||
|
pub(crate) struct ExplicitUnsafeTraits {
|
||||||
|
#[primary_span]
|
||||||
|
pub(crate) span: Span,
|
||||||
|
pub(crate) ident: Ident,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Subdiagnostic)]
|
||||||
|
#[help(resolve_added_macro_use)]
|
||||||
|
pub(crate) struct AddedMacroUse;
|
||||||
|
|
||||||
|
#[derive(Subdiagnostic)]
|
||||||
|
#[suggestion(
|
||||||
|
resolve_consider_adding_a_derive,
|
||||||
|
code = "{suggestion}",
|
||||||
|
applicability = "maybe-incorrect"
|
||||||
|
)]
|
||||||
|
pub(crate) struct ConsiderAddingADerive {
|
||||||
|
#[primary_span]
|
||||||
|
pub(crate) span: Span,
|
||||||
|
pub(crate) suggestion: String,
|
||||||
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
//! If you wonder why there's no `early.rs`, that's because it's split into three files -
|
//! If you wonder why there's no `early.rs`, that's because it's split into three files -
|
||||||
//! `build_reduced_graph.rs`, `macros.rs` and `imports.rs`.
|
//! `build_reduced_graph.rs`, `macros.rs` and `imports.rs`.
|
||||||
|
|
||||||
|
use crate::errors::ImportsCannotReferTo;
|
||||||
use crate::BindingKey;
|
use crate::BindingKey;
|
||||||
use crate::{path_names_to_string, rustdoc, BindingError, Finalize, LexicalScopeBinding};
|
use crate::{path_names_to_string, rustdoc, BindingError, Finalize, LexicalScopeBinding};
|
||||||
use crate::{Module, ModuleOrUniformRoot, NameBinding, ParentScope, PathResult};
|
use crate::{Module, ModuleOrUniformRoot, NameBinding, ParentScope, PathResult};
|
||||||
@ -2244,12 +2245,13 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
|
|||||||
_ => &[TypeNS],
|
_ => &[TypeNS],
|
||||||
};
|
};
|
||||||
let report_error = |this: &Self, ns| {
|
let report_error = |this: &Self, ns| {
|
||||||
let what = if ns == TypeNS { "type parameters" } else { "local variables" };
|
|
||||||
if this.should_report_errs() {
|
if this.should_report_errs() {
|
||||||
|
let what = if ns == TypeNS { "type parameters" } else { "local variables" };
|
||||||
this.r
|
this.r
|
||||||
.tcx
|
.tcx
|
||||||
.sess
|
.sess
|
||||||
.span_err(ident.span, format!("imports cannot refer to {}", what));
|
.create_err(ImportsCannotReferTo { span: ident.span, what })
|
||||||
|
.emit();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
//! A bunch of methods and structures more or less related to resolving macros and
|
//! A bunch of methods and structures more or less related to resolving macros and
|
||||||
//! interface provided by `Resolver` to macro expander.
|
//! interface provided by `Resolver` to macro expander.
|
||||||
|
|
||||||
use crate::errors::{self, AddAsNonDerive, MacroExpectedFound, RemoveSurroundingDerive};
|
use crate::errors::{
|
||||||
|
self, AddAsNonDerive, CannotFindIdentInThisScope, MacroExpectedFound, RemoveSurroundingDerive,
|
||||||
|
};
|
||||||
use crate::Namespace::*;
|
use crate::Namespace::*;
|
||||||
use crate::{BuiltinMacroState, Determinacy};
|
use crate::{BuiltinMacroState, Determinacy};
|
||||||
use crate::{DeriveData, Finalize, ParentScope, ResolutionError, Resolver, ScopeSet};
|
use crate::{DeriveData, Finalize, ParentScope, ResolutionError, Resolver, ScopeSet};
|
||||||
@ -793,8 +795,13 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
Err(..) => {
|
Err(..) => {
|
||||||
let expected = kind.descr_expected();
|
let expected = kind.descr_expected();
|
||||||
let msg = format!("cannot find {} `{}` in this scope", expected, ident);
|
|
||||||
let mut err = self.tcx.sess.struct_span_err(ident.span, msg);
|
let mut err = self.tcx.sess.create_err(CannotFindIdentInThisScope {
|
||||||
|
span: ident.span,
|
||||||
|
expected,
|
||||||
|
ident,
|
||||||
|
});
|
||||||
|
|
||||||
self.unresolved_macro_suggestions(&mut err, kind, &parent_scope, ident, krate);
|
self.unresolved_macro_suggestions(&mut err, kind, &parent_scope, ident, krate);
|
||||||
err.emit();
|
err.emit();
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ LL | #[default]
|
|||||||
help: consider adding a derive
|
help: consider adding a derive
|
||||||
|
|
|
|
||||||
LL + #[derive(Default)]
|
LL + #[derive(Default)]
|
||||||
LL ~ pub enum Test {
|
LL | pub enum Test {
|
||||||
|
|
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
Loading…
x
Reference in New Issue
Block a user