@@ -420,6 +420,51 @@ pub(super) enum AllowMultipleAlternatives {
420
420
Yes ,
421
421
}
422
422
423
+ fn parse_suggestion_values (
424
+ nested : ParseNestedMeta < ' _ > ,
425
+ allow_multiple : AllowMultipleAlternatives ,
426
+ ) -> syn:: Result < Vec < LitStr > > {
427
+ let values = if let Ok ( val) = nested. value ( ) {
428
+ vec ! [ val. parse( ) ?]
429
+ } else {
430
+ let content;
431
+ parenthesized ! ( content in nested. input) ;
432
+
433
+ if let AllowMultipleAlternatives :: No = allow_multiple {
434
+ span_err (
435
+ nested. input . span ( ) . unwrap ( ) ,
436
+ "expected exactly one string literal for `code = ...`" ,
437
+ )
438
+ . emit ( ) ;
439
+ vec ! [ ]
440
+ } else {
441
+ let literals = Punctuated :: < LitStr , Token ! [ , ] > :: parse_terminated ( & content) ;
442
+
443
+ match literals {
444
+ Ok ( p) if p. is_empty ( ) => {
445
+ span_err (
446
+ content. span ( ) . unwrap ( ) ,
447
+ "expected at least one string literal for `code(...)`" ,
448
+ )
449
+ . emit ( ) ;
450
+ vec ! [ ]
451
+ }
452
+ Ok ( p) => p. into_iter ( ) . collect ( ) ,
453
+ Err ( _) => {
454
+ span_err (
455
+ content. span ( ) . unwrap ( ) ,
456
+ "`code(...)` must contain only string literals" ,
457
+ )
458
+ . emit ( ) ;
459
+ vec ! [ ]
460
+ }
461
+ }
462
+ }
463
+ } ;
464
+
465
+ Ok ( values)
466
+ }
467
+
423
468
/// Constructs the `format!()` invocation(s) necessary for a `#[suggestion*(code = "foo")]` or
424
469
/// `#[suggestion*(code("foo", "bar"))]` attribute field
425
470
pub ( super ) fn build_suggestion_code (
@@ -428,47 +473,7 @@ pub(super) fn build_suggestion_code(
428
473
fields : & impl HasFieldMap ,
429
474
allow_multiple : AllowMultipleAlternatives ,
430
475
) -> TokenStream {
431
- let values = match ( || {
432
- let values: Vec < LitStr > = if let Ok ( val) = nested. value ( ) {
433
- vec ! [ val. parse( ) ?]
434
- } else {
435
- let content;
436
- parenthesized ! ( content in nested. input) ;
437
-
438
- if let AllowMultipleAlternatives :: No = allow_multiple {
439
- span_err (
440
- nested. input . span ( ) . unwrap ( ) ,
441
- "expected exactly one string literal for `code = ...`" ,
442
- )
443
- . emit ( ) ;
444
- vec ! [ ]
445
- } else {
446
- let literals = Punctuated :: < LitStr , Token ! [ , ] > :: parse_terminated ( & content) ;
447
-
448
- match literals {
449
- Ok ( p) if p. is_empty ( ) => {
450
- span_err (
451
- content. span ( ) . unwrap ( ) ,
452
- "expected at least one string literal for `code(...)`" ,
453
- )
454
- . emit ( ) ;
455
- vec ! [ ]
456
- }
457
- Ok ( p) => p. into_iter ( ) . collect ( ) ,
458
- Err ( _) => {
459
- span_err (
460
- content. span ( ) . unwrap ( ) ,
461
- "`code(...)` must contain only string literals" ,
462
- )
463
- . emit ( ) ;
464
- vec ! [ ]
465
- }
466
- }
467
- }
468
- } ;
469
-
470
- Ok ( values)
471
- } ) ( ) {
476
+ let values = match parse_suggestion_values ( nested, allow_multiple) {
472
477
Ok ( x) => x,
473
478
Err ( e) => return e. into_compile_error ( ) ,
474
479
} ;
@@ -706,14 +711,14 @@ impl SubdiagnosticKind {
706
711
let path_span = nested. path . span ( ) . unwrap ( ) ;
707
712
let val_span = nested. input . span ( ) . unwrap ( ) ;
708
713
709
- macro get_string( ) {
710
- {
714
+ macro_rules! get_string {
715
+ ( ) => { {
711
716
let Ok ( value) = nested. value( ) . and_then( |x| x. parse:: <LitStr >( ) ) else {
712
717
span_err( val_span, "expected `= \" xxx\" `" ) . emit( ) ;
713
718
return Ok ( ( ) ) ;
714
719
} ;
715
720
value
716
- }
721
+ } } ;
717
722
}
718
723
719
724
let mut has_errors = false ;
0 commit comments