1- use debug_unreachable :: debug_unreachable ;
1+ use swc_atoms :: Atom ;
22use swc_common:: { BytePos , Span } ;
33use swc_ecma_ast:: EsVersion ;
44
55use super :: token_and_span:: TokenAndSpan as TokenAndSpanTrait ;
66use crate :: common:: {
7- context:: Context , input:: Tokens , lexer:: token:: TokenFactory , syntax:: SyntaxFlags ,
7+ context:: Context ,
8+ input:: Tokens ,
9+ lexer:: { token:: TokenFactory , LexResult } ,
10+ syntax:: SyntaxFlags ,
811} ;
912
1013pub trait NextTokenAndSpan {
@@ -30,9 +33,9 @@ pub trait Buffer<'a> {
3033 fn set_next ( & mut self , token : Option < Self :: Next > ) ;
3134 fn next_mut ( & mut self ) -> & mut Option < Self :: Next > ;
3235
33- fn cur ( & mut self ) -> Option < & Self :: Token > ;
34- fn get_cur ( & self ) -> Option < & Self :: TokenAndSpan > ;
35- fn get_cur_mut ( & mut self ) -> & mut Option < Self :: TokenAndSpan > ;
36+ fn cur ( & self ) -> & Self :: Token ;
37+ fn get_cur ( & self ) -> & Self :: TokenAndSpan ;
38+ fn get_cur_mut ( & mut self ) -> & mut Self :: TokenAndSpan ;
3639
3740 fn prev_span ( & self ) -> Span ;
3841 fn set_prev_span ( & mut self , span : Span ) ;
@@ -43,47 +46,38 @@ pub trait Buffer<'a> {
4346
4447 fn store ( & mut self , token : Self :: Token ) {
4548 debug_assert ! ( self . next( ) . is_none( ) ) ;
46- debug_assert ! ( self . get_cur ( ) . is_none ( ) ) ;
49+ debug_assert ! ( ! self . cur ( ) . is_eof ( ) ) ;
4750 let span = self . prev_span ( ) ;
4851 let token = Self :: TokenAndSpan :: new ( token, span, false ) ;
4952 self . set_cur ( token) ;
5053 }
5154
52- #[ allow( dead_code) ]
53- fn cur_debug < ' b > ( & ' b self ) -> Option < & ' b Self :: Token >
54- where
55- Self :: TokenAndSpan : ' b ,
56- {
57- self . get_cur ( ) . map ( |it| it. token ( ) )
55+ #[ cold]
56+ #[ inline( never) ]
57+ fn dump_cur ( & self ) -> String {
58+ format ! ( "{:?}" , self . cur( ) )
5859 }
5960
60- fn dump_cur ( & mut self ) -> String ;
61-
62- /// Returns current token.
63- fn bump ( & mut self ) -> Self :: Token {
64- let prev = match self . get_cur_mut ( ) . take ( ) {
65- Some ( t) => t,
66- None => unsafe {
67- debug_unreachable ! (
68- "Current token is `None`. Parser should not call bump() without knowing \
69- current token"
70- )
71- } ,
72- } ;
73- self . set_prev_span ( prev. span ( ) ) ;
74- prev. take_token ( )
75- }
61+ /// find next token.
62+ fn bump ( & mut self ) ;
63+ fn expect_word_token_and_bump ( & mut self ) -> Atom ;
64+ fn expect_number_token_and_bump ( & mut self ) -> ( f64 , Atom ) ;
65+ fn expect_string_token_and_bump ( & mut self ) -> ( Atom , Atom ) ;
66+ fn expect_bigint_token_and_bump ( & mut self ) -> ( Box < num_bigint:: BigInt > , Atom ) ;
67+ fn expect_regex_token_and_bump ( & mut self ) -> ( Atom , Atom ) ;
68+ fn expect_template_token_and_bump ( & mut self ) -> ( LexResult < Atom > , Atom ) ;
69+ fn expect_error_token_and_bump ( & mut self ) -> crate :: error:: Error ;
70+ fn expect_jsx_name_token_and_bump ( & mut self ) -> Atom ;
71+ fn expect_jsx_text_token_and_bump ( & mut self ) -> ( Atom , Atom ) ;
72+ fn expect_shebang_token_and_bump ( & mut self ) -> Atom ;
7673
7774 #[ inline]
7875 fn knows_cur ( & self ) -> bool {
79- self . get_cur ( ) . is_some ( )
76+ ! self . cur ( ) . is_eof ( )
8077 }
8178
82- fn had_line_break_before_cur ( & mut self ) -> bool {
83- self . cur ( ) ;
84- self . get_cur ( )
85- . map ( |it| it. had_line_break ( ) )
86- . unwrap_or_else ( || true )
79+ fn had_line_break_before_cur ( & self ) -> bool {
80+ self . get_cur ( ) . had_line_break ( )
8781 }
8882
8983 /// This returns true on eof.
@@ -118,8 +112,8 @@ pub trait Buffer<'a> {
118112 if span. hi != next. span ( ) . lo {
119113 return ;
120114 }
121- let cur = self . get_cur_mut ( ) . take ( ) . unwrap ( ) ;
122115 let next = self . next_mut ( ) . take ( ) . unwrap ( ) ;
116+ let cur = self . get_cur ( ) ;
123117 let cur_token = cur. token ( ) ;
124118 let token = if cur_token. is_greater ( ) {
125119 let next_token = next. token ( ) ;
@@ -139,7 +133,6 @@ pub trait Buffer<'a> {
139133 // >>>=
140134 Self :: Token :: ZERO_FILL_RSHIFT_EQ
141135 } else {
142- self . set_cur ( cur) ;
143136 self . set_next ( Some ( next) ) ;
144137 return ;
145138 }
@@ -155,12 +148,10 @@ pub trait Buffer<'a> {
155148 // <<=
156149 Self :: Token :: LSHIFT_EQ
157150 } else {
158- self . set_cur ( cur) ;
159151 self . set_next ( Some ( next) ) ;
160152 return ;
161153 }
162154 } else {
163- self . set_cur ( cur) ;
164155 self . set_next ( Some ( next) ) ;
165156 return ;
166157 } ;
@@ -170,8 +161,8 @@ pub trait Buffer<'a> {
170161 }
171162
172163 #[ inline( always) ]
173- fn is ( & mut self , expected : & Self :: Token ) -> bool {
174- self . cur ( ) . is_some_and ( |cur| cur == expected)
164+ fn is ( & self , expected : & Self :: Token ) -> bool {
165+ self . cur ( ) == expected
175166 }
176167
177168 #[ inline( always) ]
@@ -185,23 +176,13 @@ pub trait Buffer<'a> {
185176
186177 /// Returns start of current token.
187178 #[ inline]
188- fn cur_pos ( & mut self ) -> BytePos {
189- let _ = self . cur ( ) ;
190- self . get_cur ( )
191- . map ( |item| item. span ( ) . lo )
192- . unwrap_or_else ( || {
193- // eof
194- self . last_pos ( )
195- } )
179+ fn cur_pos ( & self ) -> BytePos {
180+ self . get_cur ( ) . span ( ) . lo
196181 }
197182
198183 #[ inline]
199184 fn cur_span ( & self ) -> Span {
200- let data = self
201- . get_cur ( )
202- . map ( |item| item. span ( ) )
203- . unwrap_or ( self . prev_span ( ) ) ;
204- Span :: new_with_checked ( data. lo , data. hi )
185+ self . get_cur ( ) . span ( )
205186 }
206187
207188 /// Returns last byte position of previous token.
0 commit comments