mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-16 17:03:35 +00:00
Rollup merge of #121067 - tshepang:make-expand-translatable, r=fmease
make "invalid fragment specifier" translatable
This commit is contained in:
commit
ddf6c6dbc6
@ -61,6 +61,11 @@ expand_invalid_cfg_multiple_predicates = multiple `cfg` predicates are specified
|
||||
expand_invalid_cfg_no_parens = `cfg` is not followed by parentheses
|
||||
expand_invalid_cfg_no_predicate = `cfg` predicate is not specified
|
||||
expand_invalid_cfg_predicate_literal = `cfg` predicate key cannot be a literal
|
||||
|
||||
expand_invalid_fragment_specifier =
|
||||
invalid fragment specifier `{$fragment}`
|
||||
.help = {$help}
|
||||
|
||||
expand_macro_body_stability =
|
||||
macros cannot have body stability attributes
|
||||
.label = invalid body stability attribute
|
||||
|
@ -408,3 +408,13 @@ pub struct DuplicateMatcherBinding {
|
||||
#[label(expand_label2)]
|
||||
pub prev: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(expand_invalid_fragment_specifier)]
|
||||
#[help]
|
||||
pub struct InvalidFragmentSpecifier {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
pub fragment: Ident,
|
||||
pub help: String,
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
use crate::errors;
|
||||
use crate::mbe::macro_parser::count_metavar_decls;
|
||||
use crate::mbe::{Delimited, KleeneOp, KleeneToken, MetaVarExpr, SequenceRepetition, TokenTree};
|
||||
|
||||
@ -60,11 +61,11 @@ pub(super) fn parse(
|
||||
Some(&tokenstream::TokenTree::Token(Token { kind: token::Colon, span }, _)) => {
|
||||
match trees.next() {
|
||||
Some(tokenstream::TokenTree::Token(token, _)) => match token.ident() {
|
||||
Some((frag, _)) => {
|
||||
Some((fragment, _)) => {
|
||||
let span = token.span.with_lo(start_sp.lo());
|
||||
|
||||
let kind =
|
||||
token::NonterminalKind::from_symbol(frag.name, || {
|
||||
token::NonterminalKind::from_symbol(fragment.name, || {
|
||||
// FIXME(#85708) - once we properly decode a foreign
|
||||
// crate's `SyntaxContext::root`, then we can replace
|
||||
// this with just `span.edition()`. A
|
||||
@ -81,14 +82,13 @@ pub(super) fn parse(
|
||||
})
|
||||
.unwrap_or_else(
|
||||
|| {
|
||||
let msg = format!(
|
||||
"invalid fragment specifier `{}`",
|
||||
frag.name
|
||||
sess.dcx().emit_err(
|
||||
errors::InvalidFragmentSpecifier {
|
||||
span,
|
||||
fragment,
|
||||
help: VALID_FRAGMENT_NAMES_MSG.into(),
|
||||
},
|
||||
);
|
||||
sess.dcx()
|
||||
.struct_span_err(span, msg)
|
||||
.with_help(VALID_FRAGMENT_NAMES_MSG)
|
||||
.emit();
|
||||
token::NonterminalKind::Ident
|
||||
},
|
||||
);
|
||||
|
10
tests/ui/macros/invalid-fragment-specifier.rs
Normal file
10
tests/ui/macros/invalid-fragment-specifier.rs
Normal file
@ -0,0 +1,10 @@
|
||||
macro_rules! test {
|
||||
($wrong:id) => {};
|
||||
} //~^ ERROR: invalid fragment specifier `id`
|
||||
|
||||
// guard against breaking raw identifier diagnostic
|
||||
macro_rules! test_raw_identifer {
|
||||
($wrong:r#if) => {};
|
||||
} //~^ ERROR: invalid fragment specifier `r#if`
|
||||
|
||||
fn main() {}
|
18
tests/ui/macros/invalid-fragment-specifier.stderr
Normal file
18
tests/ui/macros/invalid-fragment-specifier.stderr
Normal file
@ -0,0 +1,18 @@
|
||||
error: invalid fragment specifier `id`
|
||||
--> $DIR/invalid-fragment-specifier.rs:2:6
|
||||
|
|
||||
LL | ($wrong:id) => {};
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= help: valid fragment specifiers are `ident`, `block`, `stmt`, `expr`, `pat`, `ty`, `lifetime`, `literal`, `path`, `meta`, `tt`, `item` and `vis`
|
||||
|
||||
error: invalid fragment specifier `r#if`
|
||||
--> $DIR/invalid-fragment-specifier.rs:7:6
|
||||
|
|
||||
LL | ($wrong:r#if) => {};
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= help: valid fragment specifiers are `ident`, `block`, `stmt`, `expr`, `pat`, `ty`, `lifetime`, `literal`, `path`, `meta`, `tt`, `item` and `vis`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
@ -1,8 +0,0 @@
|
||||
macro_rules! foo(
|
||||
($x:foo) => ()
|
||||
//~^ ERROR invalid fragment specifier
|
||||
);
|
||||
|
||||
fn main() {
|
||||
foo!(foo);
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
error: invalid fragment specifier `foo`
|
||||
--> $DIR/macro-invalid-fragment-spec.rs:2:6
|
||||
|
|
||||
LL | ($x:foo) => ()
|
||||
| ^^^^^^
|
||||
|
|
||||
= help: valid fragment specifiers are `ident`, `block`, `stmt`, `expr`, `pat`, `ty`, `lifetime`, `literal`, `path`, `meta`, `tt`, `item` and `vis`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
Loading…
Reference in New Issue
Block a user