@@ -25,18 +25,18 @@ use syn::{
2525use unic_langid:: langid;
2626
2727struct Resource {
28- ident : Ident ,
28+ krate : Ident ,
2929 #[ allow( dead_code) ]
3030 fat_arrow_token : token:: FatArrow ,
31- resource : LitStr ,
31+ resource_path : LitStr ,
3232}
3333
3434impl Parse for Resource {
3535 fn parse ( input : ParseStream < ' _ > ) -> Result < Self > {
3636 Ok ( Resource {
37- ident : input. parse ( ) ?,
37+ krate : input. parse ( ) ?,
3838 fat_arrow_token : input. parse ( ) ?,
39- resource : input. parse ( ) ?,
39+ resource_path : input. parse ( ) ?,
4040 } )
4141 }
4242}
@@ -94,19 +94,20 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok
9494 // diagnostics.
9595 let mut previous_defns = HashMap :: new ( ) ;
9696
97+ // Set of Fluent attribute names already output, to avoid duplicate type errors - any given
98+ // constant created for a given attribute is the same.
99+ let mut previous_attrs = HashSet :: new ( ) ;
100+
97101 let mut includes = TokenStream :: new ( ) ;
98102 let mut generated = TokenStream :: new ( ) ;
99- for res in resources. 0 {
100- let ident_span = res. ident . span ( ) . unwrap ( ) ;
101- let path_span = res. resource . span ( ) . unwrap ( ) ;
102103
103- // Set of Fluent attribute names already output, to avoid duplicate type errors - any given
104- // constant created for a given attribute is the same.
105- let mut previous_attrs = HashSet :: new ( ) ;
104+ for res in resources . 0 {
105+ let krate_span = res . krate . span ( ) . unwrap ( ) ;
106+ let path_span = res . resource_path . span ( ) . unwrap ( ) ;
106107
107- let relative_ftl_path = res. resource . value ( ) ;
108+ let relative_ftl_path = res. resource_path . value ( ) ;
108109 let absolute_ftl_path =
109- invocation_relative_path_to_absolute ( ident_span , & relative_ftl_path) ;
110+ invocation_relative_path_to_absolute ( krate_span , & relative_ftl_path) ;
110111 // As this macro also outputs an `include_str!` for this file, the macro will always be
111112 // re-executed when the file changes.
112113 let mut resource_file = match File :: open ( absolute_ftl_path) {
@@ -185,7 +186,7 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok
185186
186187 let mut constants = TokenStream :: new ( ) ;
187188 for entry in resource. entries ( ) {
188- let span = res. ident . span ( ) ;
189+ let span = res. krate . span ( ) ;
189190 if let Entry :: Message ( Message { id : Identifier { name } , attributes, .. } ) = entry {
190191 let _ = previous_defns. entry ( name. to_string ( ) ) . or_insert ( path_span) ;
191192
@@ -199,29 +200,30 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok
199200 . emit ( ) ;
200201 }
201202
202- // `typeck_foo_bar` => `foo_bar` (in `typeck.ftl`)
203- // `const_eval_baz` => `baz` (in `const_eval.ftl`)
203+ // Require that the message name starts with the crate name
204+ // `hir_typeck_foo_bar` (in `hir_typeck.ftl`)
205+ // `const_eval_baz` (in `const_eval.ftl`)
204206 // `const-eval-hyphen-having` => `hyphen_having` (in `const_eval.ftl`)
205207 // The last case we error about above, but we want to fall back gracefully
206208 // so that only the error is being emitted and not also one about the macro
207209 // failing.
208- let crate_prefix = format ! ( "{}_" , res. ident ) ;
210+ let crate_prefix = format ! ( "{}_" , res. krate ) ;
209211
210212 let snake_name = name. replace ( '-' , "_" ) ;
211- let snake_name = match snake_name. strip_prefix ( & crate_prefix) {
212- Some ( rest) => Ident :: new ( rest, span) ,
213- None => {
214- Diagnostic :: spanned (
215- path_span,
216- Level :: Error ,
217- format ! ( "name `{name}` does not start with the crate name" ) ,
218- )
219- . help ( format ! ( "prepend `{crate_prefix}` to the slug name: `{crate_prefix}{snake_name}`" ) )
220- . emit ( ) ;
221- Ident :: new ( & snake_name, span)
222- }
213+ if !snake_name. starts_with ( & crate_prefix) {
214+ Diagnostic :: spanned (
215+ path_span,
216+ Level :: Error ,
217+ format ! ( "name `{name}` does not start with the crate name" ) ,
218+ )
219+ . help ( format ! (
220+ "prepend `{crate_prefix}` to the slug name: `{crate_prefix}{snake_name}`"
221+ ) )
222+ . emit ( ) ;
223223 } ;
224224
225+ let snake_name = Ident :: new ( & snake_name, span) ;
226+
225227 constants. extend ( quote ! {
226228 pub const #snake_name: crate :: DiagnosticMessage =
227229 crate :: DiagnosticMessage :: FluentIdentifier (
@@ -275,12 +277,7 @@ pub(crate) fn fluent_messages(input: proc_macro::TokenStream) -> proc_macro::Tok
275277
276278 includes. extend ( quote ! { include_str!( #relative_ftl_path) , } ) ;
277279
278- let ident = res. ident ;
279- generated. extend ( quote ! {
280- pub mod #ident {
281- #constants
282- }
283- } ) ;
280+ generated. extend ( constants) ;
284281 }
285282
286283 quote ! {
0 commit comments