33
44use smallvec:: SmallVec ;
55use syntax:: SmolStr ;
6- use tt:: Delimiter ;
76
87use crate :: { tt_iter:: TtIter , ParseError } ;
98
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 ( )
6311}
6412
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 ( )
7615}
7716
7817#[ derive( Clone , Debug , PartialEq , Eq ) ]
7918pub ( crate ) enum Op {
8019 Var { name : SmolStr , kind : Option < SmolStr > , id : tt:: TokenId } ,
8120 Repeat { tokens : MetaTemplate , kind : RepeatKind , separator : Option < Separator > } ,
8221 Leaf ( tt:: Leaf ) ,
83- Subtree { tokens : MetaTemplate , delimiter : Option < Delimiter > } ,
22+ Subtree { tokens : MetaTemplate , delimiter : Option < tt :: Delimiter > } ,
8423}
8524
8625#[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
@@ -97,6 +36,15 @@ pub(crate) enum Separator {
9736 Puncts ( SmallVec < [ tt:: Punct ; 3 ] > ) ,
9837}
9938
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+
10048// Note that when we compare a Separator, we just care about its textual value.
10149impl PartialEq for Separator {
10250 fn eq ( & self , other : & Separator ) -> bool {
@@ -125,14 +73,6 @@ impl Separator {
12573 }
12674}
12775
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-
13676#[ derive( Clone , Copy ) ]
13777enum Mode {
13878 Pattern ,
0 commit comments