@@ -1229,14 +1229,26 @@ impl<'a> Tokenizer<'a> {
1229
1229
// operators
1230
1230
'-' => {
1231
1231
chars. next ( ) ; // consume the '-'
1232
+
1232
1233
match chars. peek ( ) {
1233
1234
Some ( '-' ) => {
1234
- chars. next ( ) ; // consume the second '-', starting a single-line comment
1235
- let comment = self . tokenize_single_line_comment ( chars) ;
1236
- Ok ( Some ( Token :: Whitespace ( Whitespace :: SingleLineComment {
1237
- prefix : "--" . to_owned ( ) ,
1238
- comment,
1239
- } ) ) )
1235
+ let mut is_comment = true ;
1236
+ if self . dialect . requires_single_line_comment_whitespace ( ) {
1237
+ is_comment = Some ( ' ' ) == chars. peekable . clone ( ) . nth ( 1 ) ;
1238
+ }
1239
+
1240
+ if is_comment {
1241
+ chars. next ( ) ; // consume second '-'
1242
+ let comment = self . tokenize_single_line_comment ( chars) ;
1243
+ return Ok ( Some ( Token :: Whitespace (
1244
+ Whitespace :: SingleLineComment {
1245
+ prefix : "--" . to_owned ( ) ,
1246
+ comment,
1247
+ } ,
1248
+ ) ) ) ;
1249
+ }
1250
+
1251
+ self . start_binop ( chars, "-" , Token :: Minus )
1240
1252
}
1241
1253
Some ( '>' ) => {
1242
1254
chars. next ( ) ;
@@ -3685,4 +3697,85 @@ mod tests {
3685
3697
] ,
3686
3698
) ;
3687
3699
}
3700
+
3701
+ #[ test]
3702
+ fn test_whitespace_required_after_single_line_comment ( ) {
3703
+ all_dialects_where ( |dialect| dialect. requires_single_line_comment_whitespace ( ) )
3704
+ . tokenizes_to (
3705
+ "SELECT --'abc'" ,
3706
+ vec ! [
3707
+ Token :: make_keyword( "SELECT" ) ,
3708
+ Token :: Whitespace ( Whitespace :: Space ) ,
3709
+ Token :: Minus ,
3710
+ Token :: Minus ,
3711
+ Token :: SingleQuotedString ( "abc" . to_string( ) ) ,
3712
+ ] ,
3713
+ ) ;
3714
+
3715
+ all_dialects_where ( |dialect| dialect. requires_single_line_comment_whitespace ( ) )
3716
+ . tokenizes_to (
3717
+ "SELECT -- 'abc'" ,
3718
+ vec ! [
3719
+ Token :: make_keyword( "SELECT" ) ,
3720
+ Token :: Whitespace ( Whitespace :: Space ) ,
3721
+ Token :: Whitespace ( Whitespace :: SingleLineComment {
3722
+ prefix: "--" . to_string( ) ,
3723
+ comment: " 'abc'" . to_string( ) ,
3724
+ } ) ,
3725
+ ] ,
3726
+ ) ;
3727
+
3728
+ all_dialects_where ( |dialect| dialect. requires_single_line_comment_whitespace ( ) )
3729
+ . tokenizes_to (
3730
+ "SELECT --" ,
3731
+ vec ! [
3732
+ Token :: make_keyword( "SELECT" ) ,
3733
+ Token :: Whitespace ( Whitespace :: Space ) ,
3734
+ Token :: Minus ,
3735
+ Token :: Minus ,
3736
+ ] ,
3737
+ ) ;
3738
+ }
3739
+
3740
+ #[ test]
3741
+ fn test_whitespace_not_required_after_single_line_comment ( ) {
3742
+ all_dialects_where ( |dialect| !dialect. requires_single_line_comment_whitespace ( ) )
3743
+ . tokenizes_to (
3744
+ "SELECT --'abc'" ,
3745
+ vec ! [
3746
+ Token :: make_keyword( "SELECT" ) ,
3747
+ Token :: Whitespace ( Whitespace :: Space ) ,
3748
+ Token :: Whitespace ( Whitespace :: SingleLineComment {
3749
+ prefix: "--" . to_string( ) ,
3750
+ comment: "'abc'" . to_string( ) ,
3751
+ } ) ,
3752
+ ] ,
3753
+ ) ;
3754
+
3755
+ all_dialects_where ( |dialect| !dialect. requires_single_line_comment_whitespace ( ) )
3756
+ . tokenizes_to (
3757
+ "SELECT -- 'abc'" ,
3758
+ vec ! [
3759
+ Token :: make_keyword( "SELECT" ) ,
3760
+ Token :: Whitespace ( Whitespace :: Space ) ,
3761
+ Token :: Whitespace ( Whitespace :: SingleLineComment {
3762
+ prefix: "--" . to_string( ) ,
3763
+ comment: " 'abc'" . to_string( ) ,
3764
+ } ) ,
3765
+ ] ,
3766
+ ) ;
3767
+
3768
+ all_dialects_where ( |dialect| !dialect. requires_single_line_comment_whitespace ( ) )
3769
+ . tokenizes_to (
3770
+ "SELECT --" ,
3771
+ vec ! [
3772
+ Token :: make_keyword( "SELECT" ) ,
3773
+ Token :: Whitespace ( Whitespace :: Space ) ,
3774
+ Token :: Whitespace ( Whitespace :: SingleLineComment {
3775
+ prefix: "--" . to_string( ) ,
3776
+ comment: "" . to_string( ) ,
3777
+ } ) ,
3778
+ ] ,
3779
+ ) ;
3780
+ }
3688
3781
}
0 commit comments