@@ -64,12 +64,12 @@ use std::{rc::Rc, sync::Arc};
64
64
use smallvec:: { smallvec, SmallVec } ;
65
65
use span:: { Edition , Span } ;
66
66
use syntax:: SmolStr ;
67
- use tt:: DelimSpan ;
67
+ use tt:: { iter :: TtIter , DelimSpan } ;
68
68
69
69
use crate :: {
70
70
expander:: { Binding , Bindings , ExpandResult , Fragment } ,
71
+ expect_fragment,
71
72
parser:: { MetaVarKind , Op , RepeatKind , Separator } ,
72
- tt_iter:: TtIter ,
73
73
ExpandError , MetaTemplate , ValueResult ,
74
74
} ;
75
75
@@ -406,7 +406,7 @@ fn match_loop_inner<'t>(
406
406
if item. sep . is_some ( ) && !item. sep_matched {
407
407
let sep = item. sep . as_ref ( ) . unwrap ( ) ;
408
408
let mut fork = src. clone ( ) ;
409
- if fork . expect_separator ( sep) {
409
+ if expect_separator ( & mut fork , sep) {
410
410
// HACK: here we use `meta_result` to pass `TtIter` back to caller because
411
411
// it might have been advanced multiple times. `ValueResult` is
412
412
// insignificant.
@@ -746,7 +746,7 @@ fn match_meta_var(
746
746
) -> ExpandResult < Option < Fragment > > {
747
747
let fragment = match kind {
748
748
MetaVarKind :: Path => {
749
- return input . expect_fragment ( parser:: PrefixEntryPoint :: Path , edition) . map ( |it| {
749
+ return expect_fragment ( input , parser:: PrefixEntryPoint :: Path , edition) . map ( |it| {
750
750
it. map ( |it| tt:: TokenTree :: subtree_or_wrap ( it, delim_span) ) . map ( Fragment :: Path )
751
751
} ) ;
752
752
}
@@ -765,7 +765,7 @@ fn match_meta_var(
765
765
}
766
766
_ => { }
767
767
} ;
768
- return input . expect_fragment ( parser:: PrefixEntryPoint :: Expr , edition) . map ( |tt| {
768
+ return expect_fragment ( input , parser:: PrefixEntryPoint :: Expr , edition) . map ( |tt| {
769
769
tt. map ( |tt| match tt {
770
770
tt:: TokenTree :: Leaf ( leaf) => tt:: Subtree {
771
771
delimiter : tt:: Delimiter :: invisible_spanned ( * leaf. span ( ) ) ,
@@ -787,14 +787,13 @@ fn match_meta_var(
787
787
. expect_ident ( )
788
788
. map ( |ident| tt:: Leaf :: from ( ident. clone ( ) ) . into ( ) )
789
789
. map_err ( |( ) | ExpandError :: binding_error ( "expected ident" ) ) ,
790
- MetaVarKind :: Tt => input
791
- . expect_tt ( )
792
- . map_err ( |( ) | ExpandError :: binding_error ( "expected token tree" ) ) ,
793
- MetaVarKind :: Lifetime => input
794
- . expect_lifetime ( )
790
+ MetaVarKind :: Tt => {
791
+ expect_tt ( input) . map_err ( |( ) | ExpandError :: binding_error ( "expected token tree" ) )
792
+ }
793
+ MetaVarKind :: Lifetime => expect_lifetime ( input)
795
794
. map_err ( |( ) | ExpandError :: binding_error ( "expected lifetime" ) ) ,
796
795
MetaVarKind :: Literal => {
797
- let neg = input . eat_char ( '-' ) ;
796
+ let neg = eat_char ( input , '-' ) ;
798
797
input
799
798
. expect_literal ( )
800
799
. map ( |literal| {
@@ -822,7 +821,7 @@ fn match_meta_var(
822
821
MetaVarKind :: Item => parser:: PrefixEntryPoint :: Item ,
823
822
MetaVarKind :: Vis => parser:: PrefixEntryPoint :: Vis ,
824
823
} ;
825
- input . expect_fragment ( fragment, edition) . map ( |it| it. map ( Fragment :: Tokens ) )
824
+ expect_fragment ( input , fragment, edition) . map ( |it| it. map ( Fragment :: Tokens ) )
826
825
}
827
826
828
827
fn collect_vars ( collector_fun : & mut impl FnMut ( SmolStr ) , pattern : & MetaTemplate ) {
@@ -905,86 +904,84 @@ impl<'a> Iterator for OpDelimitedIter<'a> {
905
904
}
906
905
}
907
906
908
- impl TtIter < ' _ , Span > {
909
- fn expect_separator ( & mut self , separator : & Separator ) -> bool {
910
- let mut fork = self . clone ( ) ;
911
- let ok = match separator {
912
- Separator :: Ident ( lhs) => match fork. expect_ident_or_underscore ( ) {
913
- Ok ( rhs) => rhs. text == lhs. text ,
914
- Err ( _) => false ,
915
- } ,
916
- Separator :: Literal ( lhs) => match fork. expect_literal ( ) {
917
- Ok ( rhs) => match rhs {
918
- tt:: Leaf :: Literal ( rhs) => rhs. text == lhs. text ,
919
- tt:: Leaf :: Ident ( rhs) => rhs. text == lhs. text ,
920
- tt:: Leaf :: Punct ( _) => false ,
921
- } ,
922
- Err ( _) => false ,
907
+ fn expect_separator < S : Copy > ( iter : & mut TtIter < ' _ , S > , separator : & Separator ) -> bool {
908
+ let mut fork = iter. clone ( ) ;
909
+ let ok = match separator {
910
+ Separator :: Ident ( lhs) => match fork. expect_ident_or_underscore ( ) {
911
+ Ok ( rhs) => rhs. text == lhs. text ,
912
+ Err ( _) => false ,
913
+ } ,
914
+ Separator :: Literal ( lhs) => match fork. expect_literal ( ) {
915
+ Ok ( rhs) => match rhs {
916
+ tt:: Leaf :: Literal ( rhs) => rhs. text == lhs. text ,
917
+ tt:: Leaf :: Ident ( rhs) => rhs. text == lhs. text ,
918
+ tt:: Leaf :: Punct ( _) => false ,
923
919
} ,
924
- Separator :: Puncts ( lhs) => match fork. expect_glued_punct ( ) {
925
- Ok ( rhs) => {
926
- let lhs = lhs. iter ( ) . map ( |it| it. char ) ;
927
- let rhs = rhs. iter ( ) . map ( |it| it. char ) ;
928
- lhs. eq ( rhs)
929
- }
930
- Err ( _) => false ,
931
- } ,
932
- } ;
933
- if ok {
934
- * self = fork;
935
- }
936
- ok
937
- }
938
-
939
- fn expect_tt ( & mut self ) -> Result < tt:: TokenTree < Span > , ( ) > {
940
- if let Some ( tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( punct) ) ) = self . peek_n ( 0 ) {
941
- if punct. char == '\'' {
942
- self . expect_lifetime ( )
943
- } else {
944
- let puncts = self . expect_glued_punct ( ) ?;
945
- let delimiter = tt:: Delimiter {
946
- open : puncts. first ( ) . unwrap ( ) . span ,
947
- close : puncts. last ( ) . unwrap ( ) . span ,
948
- kind : tt:: DelimiterKind :: Invisible ,
949
- } ;
950
- let token_trees = puncts. into_iter ( ) . map ( |p| tt:: Leaf :: Punct ( p) . into ( ) ) . collect ( ) ;
951
- Ok ( tt:: TokenTree :: Subtree ( tt:: Subtree { delimiter, token_trees } ) )
920
+ Err ( _) => false ,
921
+ } ,
922
+ Separator :: Puncts ( lhs) => match fork. expect_glued_punct ( ) {
923
+ Ok ( rhs) => {
924
+ let lhs = lhs. iter ( ) . map ( |it| it. char ) ;
925
+ let rhs = rhs. iter ( ) . map ( |it| it. char ) ;
926
+ lhs. eq ( rhs)
952
927
}
953
- } else {
954
- self . next ( ) . ok_or ( ( ) ) . cloned ( )
955
- }
928
+ Err ( _) => false ,
929
+ } ,
930
+ } ;
931
+ if ok {
932
+ * iter = fork;
956
933
}
934
+ ok
935
+ }
957
936
958
- fn expect_lifetime ( & mut self ) -> Result < tt:: TokenTree < Span > , ( ) > {
959
- let punct = self . expect_single_punct ( ) ?;
960
- if punct. char != '\'' {
961
- return Err ( ( ) ) ;
962
- }
963
- let ident = self . expect_ident_or_underscore ( ) ?;
964
-
965
- Ok ( tt:: Subtree {
966
- delimiter : tt:: Delimiter {
967
- open : punct. span ,
968
- close : ident. span ,
937
+ fn expect_tt < S : Copy > ( iter : & mut TtIter < ' _ , S > ) -> Result < tt:: TokenTree < S > , ( ) > {
938
+ if let Some ( tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( punct) ) ) = iter. peek_n ( 0 ) {
939
+ if punct. char == '\'' {
940
+ expect_lifetime ( iter)
941
+ } else {
942
+ let puncts = iter. expect_glued_punct ( ) ?;
943
+ let delimiter = tt:: Delimiter {
944
+ open : puncts. first ( ) . unwrap ( ) . span ,
945
+ close : puncts. last ( ) . unwrap ( ) . span ,
969
946
kind : tt:: DelimiterKind :: Invisible ,
970
- } ,
971
- token_trees : Box :: new ( [
972
- tt:: Leaf :: Punct ( * punct) . into ( ) ,
973
- tt:: Leaf :: Ident ( ident. clone ( ) ) . into ( ) ,
974
- ] ) ,
947
+ } ;
948
+ let token_trees = puncts. into_iter ( ) . map ( |p| tt:: Leaf :: Punct ( p) . into ( ) ) . collect ( ) ;
949
+ Ok ( tt:: TokenTree :: Subtree ( tt:: Subtree { delimiter, token_trees } ) )
975
950
}
976
- . into ( ) )
951
+ } else {
952
+ iter. next ( ) . ok_or ( ( ) ) . cloned ( )
977
953
}
954
+ }
978
955
979
- fn eat_char ( & mut self , c : char ) -> Option < tt:: TokenTree < Span > > {
980
- let mut fork = self . clone ( ) ;
981
- match fork. expect_char ( c) {
982
- Ok ( _) => {
983
- let tt = self . next ( ) . cloned ( ) ;
984
- * self = fork;
985
- tt
986
- }
987
- Err ( _) => None ,
956
+ fn expect_lifetime < S : Copy > ( iter : & mut TtIter < ' _ , S > ) -> Result < tt:: TokenTree < S > , ( ) > {
957
+ let punct = iter. expect_single_punct ( ) ?;
958
+ if punct. char != '\'' {
959
+ return Err ( ( ) ) ;
960
+ }
961
+ let ident = iter. expect_ident_or_underscore ( ) ?;
962
+
963
+ Ok ( tt:: Subtree {
964
+ delimiter : tt:: Delimiter {
965
+ open : punct. span ,
966
+ close : ident. span ,
967
+ kind : tt:: DelimiterKind :: Invisible ,
968
+ } ,
969
+ token_trees : Box :: new ( [
970
+ tt:: Leaf :: Punct ( * punct) . into ( ) ,
971
+ tt:: Leaf :: Ident ( ident. clone ( ) ) . into ( ) ,
972
+ ] ) ,
973
+ }
974
+ . into ( ) )
975
+ }
976
+
977
+ fn eat_char < S : Copy > ( iter : & mut TtIter < ' _ , S > , c : char ) -> Option < tt:: TokenTree < S > > {
978
+ let mut fork = iter. clone ( ) ;
979
+ match fork. expect_char ( c) {
980
+ Ok ( _) => {
981
+ let tt = iter. next ( ) . cloned ( ) ;
982
+ * iter = fork;
983
+ tt
988
984
}
985
+ Err ( _) => None ,
989
986
}
990
987
}
0 commit comments