From c9b1a5874d06ca6c437ca8cca2224d546e8669ec Mon Sep 17 00:00:00 2001 From: Xiretza Date: Wed, 17 Aug 2022 12:09:06 +0200 Subject: [PATCH 1/3] fluent: mandate slug names to be prefixed by crate name --- .../locales/en-US/privacy.ftl | 2 +- .../rustc_macros/src/diagnostics/fluent.rs | 22 ++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/compiler/rustc_error_messages/locales/en-US/privacy.ftl b/compiler/rustc_error_messages/locales/en-US/privacy.ftl index 97050635f45bf..223092a74bd97 100644 --- a/compiler/rustc_error_messages/locales/en-US/privacy.ftl +++ b/compiler/rustc_error_messages/locales/en-US/privacy.ftl @@ -14,7 +14,7 @@ privacy_in_public_interface = {$vis_descr} {$kind} `{$descr}` in public interfac privacy_from_private_dep_in_public_interface = {$kind} `{$descr}` from private dependency '{$krate}' in public interface -private_in_public_lint = +privacy_private_in_public_lint = {$vis_descr} {$kind} `{$descr}` in public interface (error {$kind -> [trait] E0445 *[other] E0446 diff --git a/compiler/rustc_macros/src/diagnostics/fluent.rs b/compiler/rustc_macros/src/diagnostics/fluent.rs index 2e7652ad333ff..a222b9d5f129c 100644 --- a/compiler/rustc_macros/src/diagnostics/fluent.rs +++ b/compiler/rustc_macros/src/diagnostics/fluent.rs @@ -205,11 +205,23 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok // The last case we error about above, but we want to fall back gracefully // so that only the error is being emitted and not also one about the macro // failing. - let snake_name = Ident::new( - // FIXME: should probably trim prefix, not replace all occurrences - &name.replace('-', "_").replace(&format!("{}_", res.ident), ""), - span, - ); + let crate_prefix = format!("{}_", res.ident); + + let snake_name = name.replace('-', "_"); + let snake_name = match snake_name.strip_prefix(&crate_prefix) { + Some(rest) => Ident::new(rest, span), + None => { + Diagnostic::spanned( + ident_span, + Level::Error, + format!("name `{name}` does not start with the crate name"), + ) + .help(format!("prepend `{crate_prefix}` to the slug name: `{crate_prefix}{snake_name}`")) + .emit(); + Ident::new(&snake_name, span) + } + }; + constants.extend(quote! { pub const #snake_name: crate::DiagnosticMessage = crate::DiagnosticMessage::FluentIdentifier( From 28b29db8f02302997ff161cd97af766fa601aab1 Mon Sep 17 00:00:00 2001 From: Xiretza Date: Wed, 17 Aug 2022 12:12:59 +0200 Subject: [PATCH 2/3] fluent: point to path containing error instead of module name Example error before: error: name `generic_does_not_live_long_enough` does not start with the crate name --> compiler/rustc_error_messages/src/lib.rs:33:17 | 33 | borrowck => "../locales/en-US/borrowck.ftl", | ^^^^^^^^ | = help: prepend `borrowck_` to the slug name: `borrowck_generic_does_not_live_long_enough` after: error: name `generic_does_not_live_long_enough` does not start with the crate name --> compiler/rustc_error_messages/src/lib.rs:33:17 | 33 | borrowck => "../locales/en-US/borrowck.ftl", | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = help: prepend `borrowck_` to the slug name: `borrowck_generic_does_not_live_long_enough` --- compiler/rustc_macros/src/diagnostics/fluent.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_macros/src/diagnostics/fluent.rs b/compiler/rustc_macros/src/diagnostics/fluent.rs index a222b9d5f129c..f7d8b494ee257 100644 --- a/compiler/rustc_macros/src/diagnostics/fluent.rs +++ b/compiler/rustc_macros/src/diagnostics/fluent.rs @@ -187,11 +187,11 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok for entry in resource.entries() { let span = res.ident.span(); if let Entry::Message(Message { id: Identifier { name }, attributes, .. }) = entry { - let _ = previous_defns.entry(name.to_string()).or_insert(ident_span); + let _ = previous_defns.entry(name.to_string()).or_insert(path_span); if name.contains('-') { Diagnostic::spanned( - ident_span, + path_span, Level::Error, format!("name `{name}` contains a '-' character"), ) @@ -212,7 +212,7 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok Some(rest) => Ident::new(rest, span), None => { Diagnostic::spanned( - ident_span, + path_span, Level::Error, format!("name `{name}` does not start with the crate name"), ) @@ -238,7 +238,7 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok if attr_name.contains('-') { Diagnostic::spanned( - ident_span, + path_span, Level::Error, format!("attribute `{attr_name}` contains a '-' character"), ) @@ -261,7 +261,7 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok match e { FluentError::Overriding { kind, id } => { Diagnostic::spanned( - ident_span, + path_span, Level::Error, format!("overrides existing {}: `{}`", kind, id), ) From 0c7da94be01694cb816ac3465aa608da89451f50 Mon Sep 17 00:00:00 2001 From: Xiretza Date: Wed, 17 Aug 2022 13:05:13 +0200 Subject: [PATCH 3/3] fluent: update tests --- .../fluent-messages/duplicate-a-b.ftl | 1 + .../fluent-messages/duplicate-a.ftl | 2 +- .../fluent-messages/duplicate-b.ftl | 1 - .../fluent-messages/label-with-hyphens.ftl | 2 +- .../fluent-messages/missing-crate-name.ftl | 2 + .../fluent-messages/slug-with-hyphens.ftl | 2 +- src/test/ui-fulldeps/fluent-messages/test.rs | 21 ++++++-- .../ui-fulldeps/fluent-messages/test.stderr | 48 ++++++++++++++----- .../ui-fulldeps/fluent-messages/valid.ftl | 2 +- 9 files changed, 60 insertions(+), 21 deletions(-) create mode 100644 src/test/ui-fulldeps/fluent-messages/duplicate-a-b.ftl delete mode 100644 src/test/ui-fulldeps/fluent-messages/duplicate-b.ftl create mode 100644 src/test/ui-fulldeps/fluent-messages/missing-crate-name.ftl diff --git a/src/test/ui-fulldeps/fluent-messages/duplicate-a-b.ftl b/src/test/ui-fulldeps/fluent-messages/duplicate-a-b.ftl new file mode 100644 index 0000000000000..9407c51704502 --- /dev/null +++ b/src/test/ui-fulldeps/fluent-messages/duplicate-a-b.ftl @@ -0,0 +1 @@ +a_b_key = Value diff --git a/src/test/ui-fulldeps/fluent-messages/duplicate-a.ftl b/src/test/ui-fulldeps/fluent-messages/duplicate-a.ftl index fd9976b5a4146..9407c51704502 100644 --- a/src/test/ui-fulldeps/fluent-messages/duplicate-a.ftl +++ b/src/test/ui-fulldeps/fluent-messages/duplicate-a.ftl @@ -1 +1 @@ -key = Value +a_b_key = Value diff --git a/src/test/ui-fulldeps/fluent-messages/duplicate-b.ftl b/src/test/ui-fulldeps/fluent-messages/duplicate-b.ftl deleted file mode 100644 index fd9976b5a4146..0000000000000 --- a/src/test/ui-fulldeps/fluent-messages/duplicate-b.ftl +++ /dev/null @@ -1 +0,0 @@ -key = Value diff --git a/src/test/ui-fulldeps/fluent-messages/label-with-hyphens.ftl b/src/test/ui-fulldeps/fluent-messages/label-with-hyphens.ftl index 84b6c3e6c0055..016cbeef662c7 100644 --- a/src/test/ui-fulldeps/fluent-messages/label-with-hyphens.ftl +++ b/src/test/ui-fulldeps/fluent-messages/label-with-hyphens.ftl @@ -1,2 +1,2 @@ -some_slug = hi +label_with_hyphens_some_slug = hi .label-has-hyphens = test diff --git a/src/test/ui-fulldeps/fluent-messages/missing-crate-name.ftl b/src/test/ui-fulldeps/fluent-messages/missing-crate-name.ftl new file mode 100644 index 0000000000000..9bd035c1bbac6 --- /dev/null +++ b/src/test/ui-fulldeps/fluent-messages/missing-crate-name.ftl @@ -0,0 +1,2 @@ +with-hyphens = 1234 +test-crate_foo = abcd diff --git a/src/test/ui-fulldeps/fluent-messages/slug-with-hyphens.ftl b/src/test/ui-fulldeps/fluent-messages/slug-with-hyphens.ftl index 07517c9a2434f..86ba9a268f3f5 100644 --- a/src/test/ui-fulldeps/fluent-messages/slug-with-hyphens.ftl +++ b/src/test/ui-fulldeps/fluent-messages/slug-with-hyphens.ftl @@ -1 +1 @@ -this-slug-has-hyphens = hi +slug_with_hyphens_this-slug-has-hyphens = hi diff --git a/src/test/ui-fulldeps/fluent-messages/test.rs b/src/test/ui-fulldeps/fluent-messages/test.rs index f0f35780666bb..256857e52a7ee 100644 --- a/src/test/ui-fulldeps/fluent-messages/test.rs +++ b/src/test/ui-fulldeps/fluent-messages/test.rs @@ -50,8 +50,8 @@ mod duplicate { fluent_messages! { a => "./duplicate-a.ftl", - b => "./duplicate-b.ftl", -//~^ ERROR overrides existing message: `key` + a_b => "./duplicate-a-b.ftl", +//~^ ERROR overrides existing message: `a_b_key` } } @@ -60,7 +60,7 @@ mod slug_with_hyphens { fluent_messages! { slug_with_hyphens => "./slug-with-hyphens.ftl", -//~^ ERROR name `this-slug-has-hyphens` contains a '-' character +//~^ ERROR name `slug_with_hyphens_this-slug-has-hyphens` contains a '-' character } } @@ -80,5 +80,18 @@ mod valid { valid => "./valid.ftl", } - use self::fluent_generated::{DEFAULT_LOCALE_RESOURCES, valid::valid}; + use self::fluent_generated::{DEFAULT_LOCALE_RESOURCES, valid::key}; +} + +mod missing_crate_name { + use super::fluent_messages; + + fluent_messages! { + test_crate => "./missing-crate-name.ftl", +//~^ ERROR name `test-crate_foo` contains a '-' character +//~| ERROR name `with-hyphens` contains a '-' character +//~| ERROR name `with-hyphens` does not start with the crate name + } + + use self::fluent_generated::{DEFAULT_LOCALE_RESOURCES, test_crate::{foo, with_hyphens}}; } diff --git a/src/test/ui-fulldeps/fluent-messages/test.stderr b/src/test/ui-fulldeps/fluent-messages/test.stderr index 856642c4818da..26d87430a8f8e 100644 --- a/src/test/ui-fulldeps/fluent-messages/test.stderr +++ b/src/test/ui-fulldeps/fluent-messages/test.stderr @@ -29,33 +29,57 @@ error: expected a message field for "missing_message" | ^^^^^^^^^^^^^^^^^ | -error: overrides existing message: `key` - --> $DIR/test.rs:53:9 +error: overrides existing message: `a_b_key` + --> $DIR/test.rs:53:16 | -LL | b => "./duplicate-b.ftl", - | ^ +LL | a_b => "./duplicate-a-b.ftl", + | ^^^^^^^^^^^^^^^^^^^^^ | help: previously defined in this resource - --> $DIR/test.rs:52:9 + --> $DIR/test.rs:52:14 | LL | a => "./duplicate-a.ftl", - | ^ + | ^^^^^^^^^^^^^^^^^^^ -error: name `this-slug-has-hyphens` contains a '-' character - --> $DIR/test.rs:62:9 +error: name `slug_with_hyphens_this-slug-has-hyphens` contains a '-' character + --> $DIR/test.rs:62:30 | LL | slug_with_hyphens => "./slug-with-hyphens.ftl", - | ^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^ | = help: replace any '-'s with '_'s error: attribute `label-has-hyphens` contains a '-' character - --> $DIR/test.rs:71:9 + --> $DIR/test.rs:71:31 | LL | label_with_hyphens => "./label-with-hyphens.ftl", - | ^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | = help: replace any '-'s with '_'s -error: aborting due to 6 previous errors +error: name `with-hyphens` contains a '-' character + --> $DIR/test.rs:90:23 + | +LL | test_crate => "./missing-crate-name.ftl", + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = help: replace any '-'s with '_'s + +error: name `with-hyphens` does not start with the crate name + --> $DIR/test.rs:90:23 + | +LL | test_crate => "./missing-crate-name.ftl", + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = help: prepend `test_crate_` to the slug name: `test_crate_with_hyphens` + +error: name `test-crate_foo` contains a '-' character + --> $DIR/test.rs:90:23 + | +LL | test_crate => "./missing-crate-name.ftl", + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = help: replace any '-'s with '_'s + +error: aborting due to 9 previous errors diff --git a/src/test/ui-fulldeps/fluent-messages/valid.ftl b/src/test/ui-fulldeps/fluent-messages/valid.ftl index 0eee4a02b96ae..549274306005c 100644 --- a/src/test/ui-fulldeps/fluent-messages/valid.ftl +++ b/src/test/ui-fulldeps/fluent-messages/valid.ftl @@ -1 +1 @@ -valid = Valid! +valid_key = Valid!