mirror of https://github.com/rust-lang/rust.git
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_parens = `cfg` is not followed by parentheses
|
||||||
expand_invalid_cfg_no_predicate = `cfg` predicate is not specified
|
expand_invalid_cfg_no_predicate = `cfg` predicate is not specified
|
||||||
expand_invalid_cfg_predicate_literal = `cfg` predicate key cannot be a literal
|
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 =
|
expand_macro_body_stability =
|
||||||
macros cannot have body stability attributes
|
macros cannot have body stability attributes
|
||||||
.label = invalid body stability attribute
|
.label = invalid body stability attribute
|
||||||
|
|
|
@ -408,3 +408,13 @@ pub struct DuplicateMatcherBinding {
|
||||||
#[label(expand_label2)]
|
#[label(expand_label2)]
|
||||||
pub prev: Span,
|
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::macro_parser::count_metavar_decls;
|
||||||
use crate::mbe::{Delimited, KleeneOp, KleeneToken, MetaVarExpr, SequenceRepetition, TokenTree};
|
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 }, _)) => {
|
Some(&tokenstream::TokenTree::Token(Token { kind: token::Colon, span }, _)) => {
|
||||||
match trees.next() {
|
match trees.next() {
|
||||||
Some(tokenstream::TokenTree::Token(token, _)) => match token.ident() {
|
Some(tokenstream::TokenTree::Token(token, _)) => match token.ident() {
|
||||||
Some((frag, _)) => {
|
Some((fragment, _)) => {
|
||||||
let span = token.span.with_lo(start_sp.lo());
|
let span = token.span.with_lo(start_sp.lo());
|
||||||
|
|
||||||
let kind =
|
let kind =
|
||||||
token::NonterminalKind::from_symbol(frag.name, || {
|
token::NonterminalKind::from_symbol(fragment.name, || {
|
||||||
// FIXME(#85708) - once we properly decode a foreign
|
// FIXME(#85708) - once we properly decode a foreign
|
||||||
// crate's `SyntaxContext::root`, then we can replace
|
// crate's `SyntaxContext::root`, then we can replace
|
||||||
// this with just `span.edition()`. A
|
// this with just `span.edition()`. A
|
||||||
|
@ -81,14 +82,13 @@ pub(super) fn parse(
|
||||||
})
|
})
|
||||||
.unwrap_or_else(
|
.unwrap_or_else(
|
||||||
|| {
|
|| {
|
||||||
let msg = format!(
|
sess.dcx().emit_err(
|
||||||
"invalid fragment specifier `{}`",
|
errors::InvalidFragmentSpecifier {
|
||||||
frag.name
|
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
|
token::NonterminalKind::Ident
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
@ -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() {}
|
|
@ -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