@@ -22,20 +22,22 @@ impl<'a> DiagnosticDerive<'a> {
2222 pub ( crate ) fn into_tokens ( self ) -> TokenStream {
2323 let DiagnosticDerive { mut structure } = self ;
2424 let kind = DiagnosticDeriveKind :: Diagnostic ;
25- let slugs = RefCell :: new ( Vec :: new ( ) ) ;
25+ let messages = RefCell :: new ( Vec :: new ( ) ) ;
2626 let implementation = kind. each_variant ( & mut structure, |mut builder, variant| {
2727 let preamble = builder. preamble ( variant) ;
2828 let body = builder. body ( variant) ;
2929
30- let Some ( slug ) = builder. primary_message ( ) else {
30+ let Some ( message ) = builder. primary_message ( ) else {
3131 return DiagnosticDeriveError :: ErrorHandled . to_compile_error ( ) ;
3232 } ;
33- slugs. borrow_mut ( ) . push ( slug. clone ( ) ) ;
33+ messages. borrow_mut ( ) . push ( message. clone ( ) ) ;
34+ let message = message. diag_message ( variant) ;
35+
3436 let init = quote ! {
3537 let mut diag = rustc_errors:: Diag :: new(
3638 dcx,
3739 level,
38- crate :: fluent_generated :: #slug
40+ #message
3941 ) ;
4042 } ;
4143
@@ -66,7 +68,7 @@ impl<'a> DiagnosticDerive<'a> {
6668 }
6769 }
6870 } ) ;
69- for test in slugs . borrow ( ) . iter ( ) . map ( |s| generate_test ( s , & structure) ) {
71+ for test in messages . borrow ( ) . iter ( ) . map ( |s| s . generate_test ( & structure) ) {
7072 imp. extend ( test) ;
7173 }
7274 imp
@@ -86,17 +88,18 @@ impl<'a> LintDiagnosticDerive<'a> {
8688 pub ( crate ) fn into_tokens ( self ) -> TokenStream {
8789 let LintDiagnosticDerive { mut structure } = self ;
8890 let kind = DiagnosticDeriveKind :: LintDiagnostic ;
89- let slugs = RefCell :: new ( Vec :: new ( ) ) ;
91+ let messages = RefCell :: new ( Vec :: new ( ) ) ;
9092 let implementation = kind. each_variant ( & mut structure, |mut builder, variant| {
9193 let preamble = builder. preamble ( variant) ;
9294 let body = builder. body ( variant) ;
9395
94- let Some ( slug ) = builder. primary_message ( ) else {
96+ let Some ( message ) = builder. primary_message ( ) else {
9597 return DiagnosticDeriveError :: ErrorHandled . to_compile_error ( ) ;
9698 } ;
97- slugs. borrow_mut ( ) . push ( slug. clone ( ) ) ;
99+ messages. borrow_mut ( ) . push ( message. clone ( ) ) ;
100+ let message = message. diag_message ( variant) ;
98101 let primary_message = quote ! {
99- diag. primary_message( crate :: fluent_generated :: #slug ) ;
102+ diag. primary_message( #message ) ;
100103 } ;
101104
102105 let formatting_init = & builder. formatting_init ;
@@ -122,47 +125,10 @@ impl<'a> LintDiagnosticDerive<'a> {
122125 }
123126 }
124127 } ) ;
125- for test in slugs . borrow ( ) . iter ( ) . map ( |s| generate_test ( s , & structure) ) {
128+ for test in messages . borrow ( ) . iter ( ) . map ( |s| s . generate_test ( & structure) ) {
126129 imp. extend ( test) ;
127130 }
128131
129132 imp
130133 }
131134}
132-
133- /// Generates a `#[test]` that verifies that all referenced variables
134- /// exist on this structure.
135- fn generate_test ( slug : & syn:: Path , structure : & Structure < ' _ > ) -> TokenStream {
136- // FIXME: We can't identify variables in a subdiagnostic
137- for field in structure. variants ( ) . iter ( ) . flat_map ( |v| v. ast ( ) . fields . iter ( ) ) {
138- for attr_name in field. attrs . iter ( ) . filter_map ( |at| at. path ( ) . get_ident ( ) ) {
139- if attr_name == "subdiagnostic" {
140- return quote ! ( ) ;
141- }
142- }
143- }
144- use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
145- // We need to make sure that the same diagnostic slug can be used multiple times without
146- // causing an error, so just have a global counter here.
147- static COUNTER : AtomicUsize = AtomicUsize :: new ( 0 ) ;
148- let slug = slug. get_ident ( ) . unwrap ( ) ;
149- let ident = quote:: format_ident!( "verify_{slug}_{}" , COUNTER . fetch_add( 1 , Ordering :: Relaxed ) ) ;
150- let ref_slug = quote:: format_ident!( "{slug}_refs" ) ;
151- let struct_name = & structure. ast ( ) . ident ;
152- let variables: Vec < _ > = structure
153- . variants ( )
154- . iter ( )
155- . flat_map ( |v| v. ast ( ) . fields . iter ( ) . filter_map ( |f| f. ident . as_ref ( ) . map ( |i| i. to_string ( ) ) ) )
156- . collect ( ) ;
157- // tidy errors on `#[test]` outside of test files, so we use `#[test ]` to work around this
158- quote ! {
159- #[ cfg( test) ]
160- #[ test ]
161- fn #ident( ) {
162- let variables = [ #( #variables) , * ] ;
163- for vref in crate :: fluent_generated:: #ref_slug {
164- assert!( variables. contains( vref) , "{}: variable `{vref}` not found ({})" , stringify!( #struct_name) , stringify!( #slug) ) ;
165- }
166- }
167- }
168- }
0 commit comments