@@ -158,8 +158,8 @@ ast_fragments! {
158
158
}
159
159
160
160
impl AstFragmentKind {
161
- fn dummy ( self , span : Span ) -> Option < AstFragment > {
162
- self . make_from ( DummyResult :: any ( span) )
161
+ fn dummy ( self , span : Span ) -> AstFragment {
162
+ self . make_from ( DummyResult :: any ( span) ) . expect ( "couldn't create a dummy AST fragment" )
163
163
}
164
164
165
165
fn expect_from_annotatables < I : IntoIterator < Item = Annotatable > > ( self , items : I )
@@ -327,10 +327,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
327
327
328
328
// FIXME(jseyfried): Refactor out the following logic
329
329
let ( expanded_fragment, new_invocations) = if let Some ( ext) = ext {
330
- let ( invoc_fragment_kind, invoc_span) = ( invoc. fragment_kind , invoc. span ( ) ) ;
331
- let fragment = self . expand_invoc ( invoc, & ext) . unwrap_or_else ( || {
332
- invoc_fragment_kind. dummy ( invoc_span) . unwrap ( )
333
- } ) ;
330
+ let fragment = self . expand_invoc ( invoc, & ext) ;
334
331
self . collect_invocations ( fragment, & [ ] )
335
332
} else if let InvocationKind :: Attr { attr : None , traits, item, .. } = invoc. kind {
336
333
if !item. derive_allowed ( ) {
@@ -477,7 +474,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
477
474
}
478
475
}
479
476
480
- fn expand_invoc ( & mut self , invoc : Invocation , ext : & SyntaxExtension ) -> Option < AstFragment > {
477
+ fn expand_invoc ( & mut self , invoc : Invocation , ext : & SyntaxExtension ) -> AstFragment {
481
478
if invoc. fragment_kind == AstFragmentKind :: ForeignItems &&
482
479
!self . cx . ecfg . macros_in_extern ( ) {
483
480
if let SyntaxExtensionKind :: NonMacroAttr { .. } = ext. kind { } else {
@@ -487,12 +484,6 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
487
484
}
488
485
}
489
486
490
- let result = match invoc. kind {
491
- InvocationKind :: Bang { .. } => self . expand_bang_invoc ( invoc, ext) ?,
492
- InvocationKind :: Attr { .. } => self . expand_attr_invoc ( invoc, ext) ?,
493
- InvocationKind :: Derive { .. } => self . expand_derive_invoc ( invoc, ext) ?,
494
- } ;
495
-
496
487
if self . cx . current_expansion . depth > self . cx . ecfg . recursion_limit {
497
488
let info = self . cx . current_expansion . mark . expn_info ( ) . unwrap ( ) ;
498
489
let suggested_limit = self . cx . ecfg . recursion_limit * 2 ;
@@ -507,15 +498,19 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
507
498
FatalError . raise ( ) ;
508
499
}
509
500
510
- Some ( result)
501
+ match invoc. kind {
502
+ InvocationKind :: Bang { .. } => self . expand_bang_invoc ( invoc, ext) ,
503
+ InvocationKind :: Attr { .. } => self . expand_attr_invoc ( invoc, ext) ,
504
+ InvocationKind :: Derive { .. } => self . expand_derive_invoc ( invoc, ext) ,
505
+ }
511
506
}
512
507
513
508
fn expand_attr_invoc ( & mut self ,
514
509
invoc : Invocation ,
515
510
ext : & SyntaxExtension )
516
- -> Option < AstFragment > {
511
+ -> AstFragment {
517
512
let ( attr, mut item) = match invoc. kind {
518
- InvocationKind :: Attr { attr, item, .. } => ( attr? , item) ,
513
+ InvocationKind :: Attr { attr : Some ( attr ) , item, .. } => ( attr, item) ,
519
514
_ => unreachable ! ( ) ,
520
515
} ;
521
516
@@ -526,13 +521,19 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
526
521
attr:: mark_used ( & attr) ;
527
522
}
528
523
item. visit_attrs ( |attrs| attrs. push ( attr) ) ;
529
- Some ( invoc. fragment_kind . expect_from_annotatables ( iter:: once ( item) ) )
524
+ invoc. fragment_kind . expect_from_annotatables ( iter:: once ( item) )
530
525
}
531
526
SyntaxExtensionKind :: LegacyAttr ( expander) => {
532
- let meta = attr. parse_meta ( self . cx . parse_sess )
533
- . map_err ( |mut e| { e. emit ( ) ; } ) . ok ( ) ?;
534
- let item = expander. expand ( self . cx , attr. span , & meta, item) ;
535
- Some ( invoc. fragment_kind . expect_from_annotatables ( item) )
527
+ match attr. parse_meta ( self . cx . parse_sess ) {
528
+ Ok ( meta) => {
529
+ let item = expander. expand ( self . cx , attr. span , & meta, item) ;
530
+ invoc. fragment_kind . expect_from_annotatables ( item)
531
+ }
532
+ Err ( mut err) => {
533
+ err. emit ( ) ;
534
+ invoc. fragment_kind . dummy ( attr. span )
535
+ }
536
+ }
536
537
}
537
538
SyntaxExtensionKind :: Attr ( expander) => {
538
539
self . gate_proc_macro_attr_item ( attr. span , & item) ;
@@ -598,14 +599,10 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
598
599
) ;
599
600
}
600
601
601
- fn gate_proc_macro_expansion ( & self , span : Span , fragment : & Option < AstFragment > ) {
602
+ fn gate_proc_macro_expansion ( & self , span : Span , fragment : & AstFragment ) {
602
603
if self . cx . ecfg . proc_macro_hygiene ( ) {
603
604
return
604
605
}
605
- let fragment = match fragment {
606
- Some ( fragment) => fragment,
607
- None => return ,
608
- } ;
609
606
610
607
fragment. visit_with ( & mut DisallowMacros {
611
608
span,
@@ -641,15 +638,15 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
641
638
fn expand_bang_invoc ( & mut self ,
642
639
invoc : Invocation ,
643
640
ext : & SyntaxExtension )
644
- -> Option < AstFragment > {
641
+ -> AstFragment {
645
642
let kind = invoc. fragment_kind ;
646
643
let ( mac, span) = match invoc. kind {
647
644
InvocationKind :: Bang { mac, span } => ( mac, span) ,
648
645
_ => unreachable ! ( ) ,
649
646
} ;
650
647
let path = & mac. node . path ;
651
648
652
- let opt_expanded = match & ext. kind {
649
+ match & ext. kind {
653
650
SyntaxExtensionKind :: Bang ( expander) => {
654
651
self . gate_proc_macro_expansion_kind ( span, kind) ;
655
652
let tok_result = expander. expand ( self . cx , span, mac. node . stream ( ) ) ;
@@ -659,19 +656,17 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
659
656
}
660
657
SyntaxExtensionKind :: LegacyBang ( expander) => {
661
658
let tok_result = expander. expand ( self . cx , span, mac. node . stream ( ) ) ;
662
- kind. make_from ( tok_result)
659
+ if let Some ( result) = kind. make_from ( tok_result) {
660
+ result
661
+ } else {
662
+ let msg = format ! ( "non-{kind} macro in {kind} position: {name}" ,
663
+ name = path. segments[ 0 ] . ident. name, kind = kind. name( ) ) ;
664
+ self . cx . span_err ( path. span , & msg) ;
665
+ self . cx . trace_macros_diag ( ) ;
666
+ kind. dummy ( span)
667
+ }
663
668
}
664
669
_ => unreachable ! ( )
665
- } ;
666
-
667
- if opt_expanded. is_some ( ) {
668
- opt_expanded
669
- } else {
670
- let msg = format ! ( "non-{kind} macro in {kind} position: {name}" ,
671
- name = path. segments[ 0 ] . ident. name, kind = kind. name( ) ) ;
672
- self . cx . span_err ( path. span , & msg) ;
673
- self . cx . trace_macros_diag ( ) ;
674
- kind. dummy ( span)
675
670
}
676
671
}
677
672
@@ -703,7 +698,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
703
698
fn expand_derive_invoc ( & mut self ,
704
699
invoc : Invocation ,
705
700
ext : & SyntaxExtension )
706
- -> Option < AstFragment > {
701
+ -> AstFragment {
707
702
let ( path, item) = match invoc. kind {
708
703
InvocationKind :: Derive { path, item, item_with_markers } => match ext. kind {
709
704
SyntaxExtensionKind :: LegacyDerive ( ..) => ( path, item_with_markers) ,
@@ -712,7 +707,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
712
707
_ => unreachable ! ( ) ,
713
708
} ;
714
709
if !item. derive_allowed ( ) {
715
- return None ;
710
+ return invoc . fragment_kind . dummy ( path . span ) ;
716
711
}
717
712
718
713
match & ext. kind {
@@ -721,7 +716,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
721
716
let meta = ast:: MetaItem { node : ast:: MetaItemKind :: Word , span : path. span , path } ;
722
717
let span = meta. span . with_ctxt ( self . cx . backtrace ( ) ) ;
723
718
let items = expander. expand ( self . cx , span, & meta, item) ;
724
- Some ( invoc. fragment_kind . expect_from_annotatables ( items) )
719
+ invoc. fragment_kind . expect_from_annotatables ( items)
725
720
}
726
721
_ => unreachable ! ( )
727
722
}
@@ -732,12 +727,12 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
732
727
kind : AstFragmentKind ,
733
728
path : & Path ,
734
729
span : Span )
735
- -> Option < AstFragment > {
730
+ -> AstFragment {
736
731
let mut parser = self . cx . new_parser_from_tts ( & toks. into_trees ( ) . collect :: < Vec < _ > > ( ) ) ;
737
732
match parser. parse_ast_fragment ( kind, false ) {
738
733
Ok ( fragment) => {
739
734
parser. ensure_complete_parse ( path, kind. name ( ) , span) ;
740
- Some ( fragment)
735
+ fragment
741
736
}
742
737
Err ( mut err) => {
743
738
err. set_span ( span) ;
0 commit comments