about summary refs log tree commit diff
path: root/compiler/rustc_macros/src/diagnostics/fluent.rs
diff options
context:
space:
mode:
authorXiretza <xiretza@xiretza.xyz>2022-08-17 12:09:06 +0200
committerXiretza <xiretza@xiretza.xyz>2022-08-22 08:42:44 +0200
commitc9b1a5874d06ca6c437ca8cca2224d546e8669ec (patch)
tree26679898bc571ff18117e92207c16725a31e50cc /compiler/rustc_macros/src/diagnostics/fluent.rs
parentd0ea1d767925d53b2230e2ba81197821514781f0 (diff)
downloadrust-c9b1a5874d06ca6c437ca8cca2224d546e8669ec.tar.gz
rust-c9b1a5874d06ca6c437ca8cca2224d546e8669ec.zip
fluent: mandate slug names to be prefixed by crate name
Diffstat (limited to 'compiler/rustc_macros/src/diagnostics/fluent.rs')
-rw-r--r--compiler/rustc_macros/src/diagnostics/fluent.rs22
1 files changed, 17 insertions, 5 deletions
diff --git a/compiler/rustc_macros/src/diagnostics/fluent.rs b/compiler/rustc_macros/src/diagnostics/fluent.rs
index 2e7652ad333..a222b9d5f12 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(