-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Migrate rustc_ast_passes diagnostics to SessionDiagnostic
and translatable messages (first part)
#100694
Merged
Merged
Migrate rustc_ast_passes diagnostics to SessionDiagnostic
and translatable messages (first part)
#100694
Changes from all commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
d6fdf14
Migrate forbidden_let
finalchild 80451de
Use DiagnosticMessage for BufferedEarlyLint.msg
finalchild e144a23
Migrate deprecated_where_clause_location, forbidden_assoc_constraint,…
finalchild 88afae5
Tidy
finalchild e3d4c40
Migrate trait_fn_async
finalchild 8d042f4
Migrate trait_fn_const
finalchild 269c853
Migrate forbidden_lifetime_bound, forbidden_non_lifetime_param, too_m…
finalchild c6903c0
Migrate doc_comment_on_fn_param, forbidden_attr_on_fn_param
finalchild 07e0bc9
Rename c_var_args_without_named_arg to c_var_args_is_sole_param
finalchild bfefefb
Migrate fn_param_forbidden_self and rename others to have prefix fn_p…
finalchild b28cc09
Support #[fatal(..)]
finalchild 8ed8aac
Fix `build_format` not unescaping braces properly
finalchild e331ae5
Migrate forbidden_default and *_without_body
finalchild 6a34074
Remove redundant clone
finalchild 70e0af6
Fix incorrect return type of emit_fatal
finalchild 09d495c
Replace #[error(..)] etc. to #[diag(..)]
finalchild File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,248 @@ | ||
//! Errors emitted by ast_passes. | ||
|
||
use rustc_errors::{fluent, AddSubdiagnostic, Applicability, Diagnostic}; | ||
use rustc_macros::{SessionDiagnostic, SessionSubdiagnostic}; | ||
use rustc_span::{Span, Symbol}; | ||
|
||
use crate::ast_validation::ForbiddenLetReason; | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::forbidden_let)] | ||
#[note] | ||
pub struct ForbiddenLet { | ||
#[primary_span] | ||
pub span: Span, | ||
#[subdiagnostic] | ||
pub(crate) reason: ForbiddenLetReason, | ||
} | ||
|
||
impl AddSubdiagnostic for ForbiddenLetReason { | ||
fn add_to_diagnostic(self, diag: &mut Diagnostic) { | ||
match self { | ||
Self::GenericForbidden => {} | ||
Self::NotSupportedOr(span) => { | ||
diag.span_note(span, fluent::ast_passes::not_supported_or); | ||
} | ||
Self::NotSupportedParentheses(span) => { | ||
diag.span_note(span, fluent::ast_passes::not_supported_parentheses); | ||
} | ||
} | ||
} | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::forbidden_assoc_constraint)] | ||
pub struct ForbiddenAssocConstraint { | ||
#[primary_span] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::keyword_lifetime)] | ||
pub struct KeywordLifetime { | ||
#[primary_span] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::invalid_label)] | ||
pub struct InvalidLabel { | ||
#[primary_span] | ||
pub span: Span, | ||
pub name: Symbol, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::invalid_visibility, code = "E0449")] | ||
pub struct InvalidVisibility { | ||
#[primary_span] | ||
pub span: Span, | ||
#[label(ast_passes::implied)] | ||
pub implied: Option<Span>, | ||
#[subdiagnostic] | ||
pub note: Option<InvalidVisibilityNote>, | ||
} | ||
|
||
#[derive(SessionSubdiagnostic)] | ||
pub enum InvalidVisibilityNote { | ||
#[note(ast_passes::individual_impl_items)] | ||
IndividualImplItems, | ||
#[note(ast_passes::individual_foreign_items)] | ||
IndividualForeignItems, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::trait_fn_async, code = "E0706")] | ||
#[note] | ||
#[note(ast_passes::note2)] | ||
pub struct TraitFnAsync { | ||
#[primary_span] | ||
pub fn_span: Span, | ||
#[label] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::trait_fn_const, code = "E0379")] | ||
pub struct TraitFnConst { | ||
#[primary_span] | ||
#[label] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::forbidden_lifetime_bound)] | ||
pub struct ForbiddenLifetimeBound { | ||
#[primary_span] | ||
pub spans: Vec<Span>, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::forbidden_non_lifetime_param)] | ||
pub struct ForbiddenNonLifetimeParam { | ||
#[primary_span] | ||
pub spans: Vec<Span>, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_param_too_many)] | ||
pub struct FnParamTooMany { | ||
#[primary_span] | ||
pub span: Span, | ||
pub max_num_args: usize, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_param_c_var_args_only)] | ||
pub struct FnParamCVarArgsOnly { | ||
#[primary_span] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_param_c_var_args_not_last)] | ||
pub struct FnParamCVarArgsNotLast { | ||
#[primary_span] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_param_doc_comment)] | ||
pub struct FnParamDocComment { | ||
#[primary_span] | ||
#[label] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_param_forbidden_attr)] | ||
pub struct FnParamForbiddenAttr { | ||
#[primary_span] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_param_forbidden_self)] | ||
#[note] | ||
pub struct FnParamForbiddenSelf { | ||
#[primary_span] | ||
#[label] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::forbidden_default)] | ||
pub struct ForbiddenDefault { | ||
#[primary_span] | ||
pub span: Span, | ||
#[label] | ||
pub def_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::assoc_const_without_body)] | ||
pub struct AssocConstWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " = <expr>;", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::assoc_fn_without_body)] | ||
pub struct AssocFnWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " {{ <body> }}", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::assoc_type_without_body)] | ||
pub struct AssocTypeWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " = <type>;", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::const_without_body)] | ||
pub struct ConstWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " = <expr>;", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::static_without_body)] | ||
pub struct StaticWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " = <expr>;", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::ty_alias_without_body)] | ||
pub struct TyAliasWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " = <type>;", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_without_body)] | ||
pub struct FnWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " {{ <body> }}", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
#[subdiagnostic] | ||
pub extern_block_suggestion: Option<ExternBlockSuggestion>, | ||
} | ||
|
||
pub struct ExternBlockSuggestion { | ||
pub start_span: Span, | ||
pub end_span: Span, | ||
pub abi: Option<Symbol>, | ||
} | ||
|
||
impl AddSubdiagnostic for ExternBlockSuggestion { | ||
fn add_to_diagnostic(self, diag: &mut Diagnostic) { | ||
let start_suggestion = if let Some(abi) = self.abi { | ||
format!("extern \"{}\" {{", abi) | ||
} else { | ||
"extern {".to_owned() | ||
}; | ||
let end_suggestion = " }".to_owned(); | ||
|
||
diag.multipart_suggestion( | ||
fluent::ast_passes::extern_block_suggestion, | ||
vec![(self.start_span, start_suggestion), (self.end_span, end_suggestion)], | ||
Applicability::MaybeIncorrect, | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
93 changes: 93 additions & 0 deletions
93
compiler/rustc_error_messages/locales/en-US/ast_passes.ftl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
ast_passes_forbidden_let = | ||
`let` expressions are not supported here | ||
.note = only supported directly in conditions of `if` and `while` expressions | ||
.not_supported_or = `||` operators are not supported in let chain expressions | ||
.not_supported_parentheses = `let`s wrapped in parentheses are not supported in a context with let chains | ||
ast_passes_deprecated_where_clause_location = | ||
where clause not allowed here | ||
ast_passes_forbidden_assoc_constraint = | ||
associated type bounds are not allowed within structs, enums, or unions | ||
ast_passes_keyword_lifetime = | ||
lifetimes cannot use keyword names | ||
ast_passes_invalid_label = | ||
invalid label name `{$name}` | ||
ast_passes_invalid_visibility = | ||
unnecessary visibility qualifier | ||
.implied = `pub` not permitted here because it's implied | ||
.individual_impl_items = place qualifiers on individual impl items instead | ||
.individual_foreign_items = place qualifiers on individual foreign items instead | ||
ast_passes_trait_fn_async = | ||
functions in traits cannot be declared `async` | ||
.label = `async` because of this | ||
.note = `async` trait functions are not currently supported | ||
.note2 = consider using the `async-trait` crate: https://crates.io/crates/async-trait | ||
ast_passes_trait_fn_const = | ||
functions in traits cannot be declared const | ||
.label = functions in traits cannot be const | ||
ast_passes_forbidden_lifetime_bound = | ||
lifetime bounds cannot be used in this context | ||
ast_passes_forbidden_non_lifetime_param = | ||
only lifetime parameters can be used in this context | ||
ast_passes_fn_param_too_many = | ||
function can not have more than {$max_num_args} arguments | ||
ast_passes_fn_param_c_var_args_only = | ||
C-variadic function must be declared with at least one named argument | ||
ast_passes_fn_param_c_var_args_not_last = | ||
`...` must be the last argument of a C-variadic function | ||
ast_passes_fn_param_doc_comment = | ||
documentation comments cannot be applied to function parameters | ||
.label = doc comments are not allowed here | ||
ast_passes_fn_param_forbidden_attr = | ||
allow, cfg, cfg_attr, deny, expect, forbid, and warn are the only allowed built-in attributes in function parameters | ||
ast_passes_fn_param_forbidden_self = | ||
`self` parameter is only allowed in associated functions | ||
.label = not semantically valid as function parameter | ||
.note = associated functions are those in `impl` or `trait` definitions | ||
ast_passes_forbidden_default = | ||
`default` is only allowed on items in trait impls | ||
.label = `default` because of this | ||
ast_passes_assoc_const_without_body = | ||
associated constant in `impl` without body | ||
.suggestion = provide a definition for the constant | ||
ast_passes_assoc_fn_without_body = | ||
associated function in `impl` without body | ||
.suggestion = provide a definition for the function | ||
ast_passes_assoc_type_without_body = | ||
associated type in `impl` without body | ||
.suggestion = provide a definition for the type | ||
ast_passes_const_without_body = | ||
free constant item without body | ||
.suggestion = provide a definition for the constant | ||
ast_passes_static_without_body = | ||
free static item without body | ||
.suggestion = provide a definition for the static | ||
ast_passes_ty_alias_without_body = | ||
free type alias without body | ||
.suggestion = provide a definition for the type | ||
ast_passes_fn_without_body = | ||
free function without a body | ||
.suggestion = provide a definition for the function | ||
.extern_block_suggestion = if you meant to declare an externally defined function, use an `extern` block |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: it would be nice if this was slightly more descriptive