@@ -2,7 +2,7 @@ use super::SeqSep;
22use crate :: { PResult , Parser } ;
33use smallvec:: SmallVec ;
44use solar_ast:: {
5- AstPath , Box , DocComments , Lit , LitKind , PathSlice , StrKind , StrLit , token:: * , yul:: * ,
5+ AstPath , Box , DocComments , Lit , LitKind , PathSlice , StrKind , StrLit , Symbol , token:: * , yul:: * ,
66} ;
77use solar_interface:: { Ident , error_code, kw, sym} ;
88
@@ -214,20 +214,16 @@ impl<'sess, 'ast> Parser<'sess, 'ast> {
214214 fn parse_yul_stmt_switch ( & mut self ) -> PResult < ' sess , StmtSwitch < ' ast > > {
215215 let lo = self . prev_token . span ;
216216 let selector = self . parse_yul_expr ( ) ?;
217- let mut branches = Vec :: new ( ) ;
218- while self . eat_keyword ( kw:: Case ) {
219- let constant = self . parse_yul_lit ( ) ?;
220- self . expect_no_subdenomination ( ) ;
221- let body = self . parse_yul_block_unchecked ( ) ?;
222- branches. push ( StmtSwitchCase { constant, body } ) ;
217+ let mut cases = Vec :: new ( ) ;
218+ while self . check_keyword ( kw:: Case ) {
219+ cases. push ( self . parse_yul_stmt_switch_case ( kw:: Case ) ?) ;
223220 }
224- let branches = self . alloc_vec ( branches) ;
225- let default_case = if self . eat_keyword ( kw:: Default ) {
226- Some ( self . parse_yul_block_unchecked ( ) ?)
221+ let default_case = if self . check_keyword ( kw:: Default ) {
222+ Some ( self . parse_yul_stmt_switch_case ( kw:: Default ) ?)
227223 } else {
228224 None
229225 } ;
230- if branches . is_empty ( ) {
226+ if cases . is_empty ( ) {
231227 let span = lo. to ( self . prev_token . span ) ;
232228 if default_case. is_none ( ) {
233229 self . dcx ( ) . err ( "`switch` statement has no cases" ) . span ( span) . emit ( ) ;
@@ -239,7 +235,28 @@ impl<'sess, 'ast> Parser<'sess, 'ast> {
239235 . emit ( ) ;
240236 }
241237 }
242- Ok ( StmtSwitch { selector, branches, default_case } )
238+ if let Some ( default_case) = default_case {
239+ cases. push ( default_case) ;
240+ }
241+ let cases = self . alloc_vec ( cases) ;
242+ Ok ( StmtSwitch { selector, cases } )
243+ }
244+
245+ fn parse_yul_stmt_switch_case ( & mut self , kw : Symbol ) -> PResult < ' sess , StmtSwitchCase < ' ast > > {
246+ self . parse_spanned ( |this| {
247+ debug_assert ! ( this. token. is_keyword( kw) ) ;
248+ this. bump ( ) ;
249+ let constant = if kw == kw:: Case {
250+ let lit = this. parse_yul_lit ( ) ?;
251+ this. expect_no_subdenomination ( ) ;
252+ Some ( lit)
253+ } else {
254+ None
255+ } ;
256+ let body = this. parse_yul_block_unchecked ( ) ?;
257+ Ok ( ( constant, body) )
258+ } )
259+ . map ( |( span, ( constant, body) ) | StmtSwitchCase { span, constant, body } )
243260 }
244261
245262 /// Parses a Yul for statement.
0 commit comments