@@ -420,6 +420,51 @@ pub(super) enum AllowMultipleAlternatives {
420420 Yes ,
421421}
422422
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+
423468/// Constructs the `format!()` invocation(s) necessary for a `#[suggestion*(code = "foo")]` or
424469/// `#[suggestion*(code("foo", "bar"))]` attribute field
425470pub ( super ) fn build_suggestion_code (
@@ -428,47 +473,7 @@ pub(super) fn build_suggestion_code(
428473 fields : & impl HasFieldMap ,
429474 allow_multiple : AllowMultipleAlternatives ,
430475) -> 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) {
472477 Ok ( x) => x,
473478 Err ( e) => return e. into_compile_error ( ) ,
474479 } ;
@@ -706,14 +711,14 @@ impl SubdiagnosticKind {
706711 let path_span = nested. path . span ( ) . unwrap ( ) ;
707712 let val_span = nested. input . span ( ) . unwrap ( ) ;
708713
709- macro get_string( ) {
710- {
714+ macro_rules! get_string {
715+ ( ) => { {
711716 let Ok ( value) = nested. value( ) . and_then( |x| x. parse:: <LitStr >( ) ) else {
712717 span_err( val_span, "expected `= \" xxx\" `" ) . emit( ) ;
713718 return Ok ( ( ) ) ;
714719 } ;
715720 value
716- }
721+ } } ;
717722 }
718723
719724 let mut has_errors = false ;
0 commit comments