3
3
4
4
use smallvec:: SmallVec ;
5
5
use syntax:: SmolStr ;
6
- use tt:: Delimiter ;
7
6
8
7
use crate :: { tt_iter:: TtIter , ParseError } ;
9
8
10
- #[ derive( Clone , Debug , PartialEq , Eq ) ]
11
- pub ( crate ) struct MetaTemplate ( pub ( crate ) Vec < Op > ) ;
12
-
13
- #[ derive( Debug , Clone , Copy ) ]
14
- pub ( crate ) enum OpDelimited < ' a > {
15
- Op ( & ' a Op ) ,
16
- Open ,
17
- Close ,
18
- }
19
-
20
- #[ derive( Debug , Clone , Copy ) ]
21
- pub ( crate ) struct OpDelimitedIter < ' a > {
22
- inner : & ' a Vec < Op > ,
23
- delimited : Option < & ' a Delimiter > ,
24
- idx : usize ,
25
- }
26
-
27
- impl < ' a > OpDelimitedIter < ' a > {
28
- pub ( crate ) fn is_eof ( & self ) -> bool {
29
- let len = self . inner . len ( ) + if self . delimited . is_some ( ) { 2 } else { 0 } ;
30
- self . idx >= len
31
- }
32
-
33
- pub ( crate ) fn peek ( & self ) -> Option < OpDelimited < ' a > > {
34
- match self . delimited {
35
- None => self . inner . get ( self . idx ) . map ( OpDelimited :: Op ) ,
36
- Some ( _) => match self . idx {
37
- 0 => Some ( OpDelimited :: Open ) ,
38
- i if i == self . inner . len ( ) + 1 => Some ( OpDelimited :: Close ) ,
39
- i => self . inner . get ( i - 1 ) . map ( OpDelimited :: Op ) ,
40
- } ,
41
- }
42
- }
43
-
44
- pub ( crate ) fn reset ( & self ) -> Self {
45
- Self { inner : self . inner , idx : 0 , delimited : self . delimited }
46
- }
47
- }
48
-
49
- impl < ' a > Iterator for OpDelimitedIter < ' a > {
50
- type Item = OpDelimited < ' a > ;
51
-
52
- fn next ( & mut self ) -> Option < Self :: Item > {
53
- let res = self . peek ( ) ;
54
- self . idx += 1 ;
55
- res
56
- }
57
-
58
- fn size_hint ( & self ) -> ( usize , Option < usize > ) {
59
- let len = self . inner . len ( ) + if self . delimited . is_some ( ) { 2 } else { 0 } ;
60
- let remain = len. saturating_sub ( self . idx ) ;
61
- ( remain, Some ( remain) )
62
- }
9
+ pub ( crate ) fn parse_template ( template : & tt:: Subtree ) -> Result < Vec < Op > , ParseError > {
10
+ parse_inner ( template, Mode :: Template ) . into_iter ( ) . collect ( )
63
11
}
64
12
65
- impl < ' a > MetaTemplate {
66
- pub ( crate ) fn iter ( & self ) -> impl Iterator < Item = & Op > {
67
- self . 0 . iter ( )
68
- }
69
-
70
- pub ( crate ) fn iter_delimited (
71
- & ' a self ,
72
- delimited : Option < & ' a Delimiter > ,
73
- ) -> OpDelimitedIter < ' a > {
74
- OpDelimitedIter { inner : & self . 0 , idx : 0 , delimited }
75
- }
13
+ pub ( crate ) fn parse_pattern ( pattern : & tt:: Subtree ) -> Result < Vec < Op > , ParseError > {
14
+ parse_inner ( pattern, Mode :: Pattern ) . into_iter ( ) . collect ( )
76
15
}
77
16
78
17
#[ derive( Clone , Debug , PartialEq , Eq ) ]
79
18
pub ( crate ) enum Op {
80
19
Var { name : SmolStr , kind : Option < SmolStr > , id : tt:: TokenId } ,
81
20
Repeat { tokens : MetaTemplate , kind : RepeatKind , separator : Option < Separator > } ,
82
21
Leaf ( tt:: Leaf ) ,
83
- Subtree { tokens : MetaTemplate , delimiter : Option < Delimiter > } ,
22
+ Subtree { tokens : MetaTemplate , delimiter : Option < tt :: Delimiter > } ,
84
23
}
85
24
86
25
#[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
@@ -97,6 +36,15 @@ pub(crate) enum Separator {
97
36
Puncts ( SmallVec < [ tt:: Punct ; 3 ] > ) ,
98
37
}
99
38
39
+ #[ derive( Clone , Debug , PartialEq , Eq ) ]
40
+ pub ( crate ) struct MetaTemplate ( pub ( crate ) Vec < Op > ) ;
41
+
42
+ impl MetaTemplate {
43
+ pub ( crate ) fn iter ( & self ) -> impl Iterator < Item = & Op > {
44
+ self . 0 . iter ( )
45
+ }
46
+ }
47
+
100
48
// Note that when we compare a Separator, we just care about its textual value.
101
49
impl PartialEq for Separator {
102
50
fn eq ( & self , other : & Separator ) -> bool {
@@ -125,14 +73,6 @@ impl Separator {
125
73
}
126
74
}
127
75
128
- pub ( crate ) fn parse_template ( template : & tt:: Subtree ) -> Result < Vec < Op > , ParseError > {
129
- parse_inner ( template, Mode :: Template ) . into_iter ( ) . collect ( )
130
- }
131
-
132
- pub ( crate ) fn parse_pattern ( pattern : & tt:: Subtree ) -> Result < Vec < Op > , ParseError > {
133
- parse_inner ( pattern, Mode :: Pattern ) . into_iter ( ) . collect ( )
134
- }
135
-
136
76
#[ derive( Clone , Copy ) ]
137
77
enum Mode {
138
78
Pattern ,
0 commit comments