@@ -567,13 +567,13 @@ impl Parser {
567
567
pub fn peek_nth_token ( & self , mut n : usize ) -> Option < Token > {
568
568
let mut index = self . index ;
569
569
loop {
570
- match self . token_at ( index) {
570
+ match self . tokens . get ( index) {
571
571
Some ( Token :: Whitespace ( _) ) => {
572
572
index += 1 ;
573
573
}
574
574
Some ( token) => {
575
575
if n == 0 {
576
- return Some ( token) ;
576
+ return Some ( token. clone ( ) ) ;
577
577
}
578
578
index += 1 ;
579
579
n -= 1 ;
@@ -589,56 +589,32 @@ impl Parser {
589
589
pub fn next_token ( & mut self ) -> Option < Token > {
590
590
loop {
591
591
match self . next_token_no_skip ( ) {
592
- Some ( Token :: Whitespace ( _) ) => {
593
- continue ;
594
- }
595
- token => {
596
- return token;
597
- }
592
+ Some ( Token :: Whitespace ( _) ) => continue ,
593
+ token => return token. cloned ( ) ,
598
594
}
599
595
}
600
596
}
601
597
602
- /// see the token at this index
603
- fn token_at ( & self , n : usize ) -> Option < Token > {
604
- if let Some ( token) = self . tokens . get ( n) {
605
- Some ( token. clone ( ) )
606
- } else {
607
- None
608
- }
609
- }
610
-
611
- pub fn next_token_no_skip ( & mut self ) -> Option < Token > {
598
+ pub fn next_token_no_skip ( & mut self ) -> Option < & Token > {
612
599
if self . index < self . tokens . len ( ) {
613
600
self . index += 1 ;
614
- Some ( self . tokens [ self . index - 1 ] . clone ( ) )
601
+ Some ( & self . tokens [ self . index - 1 ] )
615
602
} else {
616
603
None
617
604
}
618
605
}
619
606
620
607
/// Push back the last one non-whitespace token
621
- pub fn prev_token ( & mut self ) -> Option < Token > {
622
- // TODO: returned value is unused (available via peek_token)
608
+ pub fn prev_token ( & mut self ) {
623
609
loop {
624
- match self . prev_token_no_skip ( ) {
625
- Some ( Token :: Whitespace ( _) ) => {
610
+ assert ! ( self . index > 0 ) ;
611
+ if self . index > 0 {
612
+ self . index -= 1 ;
613
+ if let Token :: Whitespace ( _) = & self . tokens [ self . index ] {
626
614
continue ;
627
615
}
628
- token => {
629
- return token;
630
- }
631
- }
632
- }
633
- }
634
-
635
- /// Get the previous token and decrement the token index
636
- fn prev_token_no_skip ( & mut self ) -> Option < Token > {
637
- if self . index > 0 {
638
- self . index -= 1 ;
639
- Some ( self . tokens [ self . index ] . clone ( ) )
640
- } else {
641
- None
616
+ } ;
617
+ return ;
642
618
}
643
619
}
644
620
@@ -1776,13 +1752,12 @@ mod tests {
1776
1752
fn test_prev_index ( ) {
1777
1753
let sql = "SELECT version()" ;
1778
1754
all_dialects ( ) . run_parser_method ( sql, |parser| {
1779
- assert_eq ! ( parser. prev_token( ) , None ) ;
1780
1755
assert_eq ! ( parser. next_token( ) , Some ( Token :: make_keyword( "SELECT" ) ) ) ;
1781
1756
assert_eq ! ( parser. next_token( ) , Some ( Token :: make_word( "version" , None ) ) ) ;
1782
- assert_eq ! ( parser. prev_token( ) , Some ( Token :: make_word ( "version" , None ) ) ) ;
1757
+ parser. prev_token ( ) ;
1783
1758
assert_eq ! ( parser. peek_token( ) , Some ( Token :: make_word( "version" , None ) ) ) ;
1784
- assert_eq ! ( parser. prev_token( ) , Some ( Token :: make_keyword ( "SELECT" ) ) ) ;
1785
- assert_eq ! ( parser. prev_token ( ) , None ) ;
1759
+ parser. prev_token ( ) ;
1760
+ assert_eq ! ( parser. peek_token ( ) , Some ( Token :: make_keyword ( "SELECT" ) ) ) ;
1786
1761
} ) ;
1787
1762
}
1788
1763
}
0 commit comments