@@ -1428,19 +1428,11 @@ mod tests {
14281428 }
14291429
14301430 fn hir_uclass ( ranges : & [ ( char , char ) ] ) -> Hir {
1431- let ranges: Vec < hir:: ClassUnicodeRange > = ranges
1432- . iter ( )
1433- . map ( |& ( s, e) | hir:: ClassUnicodeRange :: new ( s, e) )
1434- . collect ( ) ;
1435- Hir :: class ( hir:: Class :: Unicode ( hir:: ClassUnicode :: new ( ranges) ) )
1431+ Hir :: class ( uclass ( ranges) )
14361432 }
14371433
14381434 fn hir_bclass ( ranges : & [ ( u8 , u8 ) ] ) -> Hir {
1439- let ranges: Vec < hir:: ClassBytesRange > = ranges
1440- . iter ( )
1441- . map ( |& ( s, e) | hir:: ClassBytesRange :: new ( s, e) )
1442- . collect ( ) ;
1443- Hir :: class ( hir:: Class :: Bytes ( hir:: ClassBytes :: new ( ranges) ) )
1435+ Hir :: class ( bclass ( ranges) )
14441436 }
14451437
14461438 fn hir_case_fold ( expr : Hir ) -> Hir {
@@ -1463,6 +1455,33 @@ mod tests {
14631455 }
14641456 }
14651457
1458+ fn uclass ( ranges : & [ ( char , char ) ] ) -> hir:: Class {
1459+ let ranges: Vec < hir:: ClassUnicodeRange > = ranges
1460+ . iter ( )
1461+ . map ( |& ( s, e) | hir:: ClassUnicodeRange :: new ( s, e) )
1462+ . collect ( ) ;
1463+ hir:: Class :: Unicode ( hir:: ClassUnicode :: new ( ranges) )
1464+ }
1465+
1466+ fn bclass ( ranges : & [ ( u8 , u8 ) ] ) -> hir:: Class {
1467+ let ranges: Vec < hir:: ClassBytesRange > = ranges
1468+ . iter ( )
1469+ . map ( |& ( s, e) | hir:: ClassBytesRange :: new ( s, e) )
1470+ . collect ( ) ;
1471+ hir:: Class :: Bytes ( hir:: ClassBytes :: new ( ranges) )
1472+ }
1473+
1474+ #[ cfg( feature = "unicode-case" ) ]
1475+ fn class_case_fold ( mut cls : hir:: Class ) -> Hir {
1476+ cls. case_fold_simple ( ) ;
1477+ Hir :: class ( cls)
1478+ }
1479+
1480+ fn class_negate ( mut cls : hir:: Class ) -> Hir {
1481+ cls. negate ( ) ;
1482+ Hir :: class ( cls)
1483+ }
1484+
14661485 #[ allow( dead_code) ]
14671486 fn hir_union ( expr1 : Hir , expr2 : Hir ) -> Hir {
14681487 use crate :: hir:: Class :: { Bytes , Unicode } ;
@@ -2522,8 +2541,9 @@ mod tests {
25222541
25232542 #[ test]
25242543 fn class_bracketed ( ) {
2525- assert_eq ! ( t( "[a]" ) , hir_uclass( & [ ( 'a' , 'a' ) ] ) ) ;
2526- assert_eq ! ( t( "[^[a]]" ) , hir_negate( hir_uclass( & [ ( 'a' , 'a' ) ] ) ) ) ;
2544+ assert_eq ! ( t( "[a]" ) , hir_lit( "a" ) ) ;
2545+ assert_eq ! ( t( "[ab]" ) , hir_uclass( & [ ( 'a' , 'b' ) ] ) ) ;
2546+ assert_eq ! ( t( "[^[a]]" ) , class_negate( uclass( & [ ( 'a' , 'a' ) ] ) ) ) ;
25272547 assert_eq ! ( t( "[a-z]" ) , hir_uclass( & [ ( 'a' , 'z' ) ] ) ) ;
25282548 assert_eq ! ( t( "[a-fd-h]" ) , hir_uclass( & [ ( 'a' , 'h' ) ] ) ) ;
25292549 assert_eq ! ( t( "[a-fg-m]" ) , hir_uclass( & [ ( 'a' , 'm' ) ] ) ) ;
@@ -2586,11 +2606,11 @@ mod tests {
25862606 ) ;
25872607 assert_eq ! ( t( "(?i-u)[k]" ) , hir_bclass( & [ ( b'K' , b'K' ) , ( b'k' , b'k' ) , ] ) ) ;
25882608
2589- assert_eq ! ( t( "[^a]" ) , hir_negate ( hir_uclass ( & [ ( 'a' , 'a' ) ] ) ) ) ;
2590- assert_eq ! ( t( r"[^\x00]" ) , hir_negate ( hir_uclass ( & [ ( '\0' , '\0' ) ] ) ) ) ;
2609+ assert_eq ! ( t( "[^a]" ) , class_negate ( uclass ( & [ ( 'a' , 'a' ) ] ) ) ) ;
2610+ assert_eq ! ( t( r"[^\x00]" ) , class_negate ( uclass ( & [ ( '\0' , '\0' ) ] ) ) ) ;
25912611 assert_eq ! (
25922612 t_bytes( "(?-u)[^a]" ) ,
2593- hir_negate ( hir_bclass ( & [ ( b'a' , b'a' ) ] ) )
2613+ class_negate ( bclass ( & [ ( b'a' , b'a' ) ] ) )
25942614 ) ;
25952615 #[ cfg( any( feature = "unicode-perl" , feature = "unicode-gencat" ) ) ]
25962616 assert_eq ! (
@@ -2778,8 +2798,8 @@ mod tests {
27782798
27792799 #[ test]
27802800 fn class_bracketed_nested ( ) {
2781- assert_eq ! ( t( r"[a[^c]]" ) , hir_negate ( hir_uclass ( & [ ( 'c' , 'c' ) ] ) ) ) ;
2782- assert_eq ! ( t( r"[a-b[^c]]" ) , hir_negate ( hir_uclass ( & [ ( 'c' , 'c' ) ] ) ) ) ;
2801+ assert_eq ! ( t( r"[a[^c]]" ) , class_negate ( uclass ( & [ ( 'c' , 'c' ) ] ) ) ) ;
2802+ assert_eq ! ( t( r"[a-b[^c]]" ) , class_negate ( uclass ( & [ ( 'c' , 'c' ) ] ) ) ) ;
27832803 assert_eq ! ( t( r"[a-c[^c]]" ) , hir_negate( hir_uclass( & [ ] ) ) ) ;
27842804
27852805 assert_eq ! ( t( r"[^a[^c]]" ) , hir_uclass( & [ ( 'c' , 'c' ) ] ) ) ;
@@ -2788,12 +2808,12 @@ mod tests {
27882808 #[ cfg( feature = "unicode-case" ) ]
27892809 assert_eq ! (
27902810 t( r"(?i)[a[^c]]" ) ,
2791- hir_negate( hir_case_fold ( hir_uclass ( & [ ( 'c' , 'c' ) ] ) ) )
2811+ hir_negate( class_case_fold ( uclass ( & [ ( 'c' , 'c' ) ] ) ) )
27922812 ) ;
27932813 #[ cfg( feature = "unicode-case" ) ]
27942814 assert_eq ! (
27952815 t( r"(?i)[a-b[^c]]" ) ,
2796- hir_negate( hir_case_fold ( hir_uclass ( & [ ( 'c' , 'c' ) ] ) ) )
2816+ hir_negate( class_case_fold ( uclass ( & [ ( 'c' , 'c' ) ] ) ) )
27972817 ) ;
27982818
27992819 #[ cfg( feature = "unicode-case" ) ]
@@ -3239,6 +3259,10 @@ mod tests {
32393259 assert ! ( props( r"ab" ) . is_literal( ) ) ;
32403260 assert ! ( props( r"abc" ) . is_literal( ) ) ;
32413261 assert ! ( props( r"(?m)abc" ) . is_literal( ) ) ;
3262+ assert ! ( props( r"(?:a)" ) . is_literal( ) ) ;
3263+ assert ! ( props( r"foo(?:a)" ) . is_literal( ) ) ;
3264+ assert ! ( props( r"(?:a)foo" ) . is_literal( ) ) ;
3265+ assert ! ( props( r"[a]" ) . is_literal( ) ) ;
32423266
32433267 // Negative examples.
32443268 assert ! ( !props( r"" ) . is_literal( ) ) ;
@@ -3248,7 +3272,7 @@ mod tests {
32483272 assert ! ( !props( r"a+" ) . is_literal( ) ) ;
32493273 assert ! ( !props( r"foo(a)" ) . is_literal( ) ) ;
32503274 assert ! ( !props( r"(a)foo" ) . is_literal( ) ) ;
3251- assert ! ( !props( r"[a ]" ) . is_literal( ) ) ;
3275+ assert ! ( !props( r"[ab ]" ) . is_literal( ) ) ;
32523276 }
32533277
32543278 #[ test]
@@ -3262,6 +3286,11 @@ mod tests {
32623286 assert ! ( props( r"a|b|c" ) . is_alternation_literal( ) ) ;
32633287 assert ! ( props( r"foo|bar" ) . is_alternation_literal( ) ) ;
32643288 assert ! ( props( r"foo|bar|baz" ) . is_alternation_literal( ) ) ;
3289+ assert ! ( props( r"[a]" ) . is_alternation_literal( ) ) ;
3290+ assert ! ( props( r"[a]|b" ) . is_alternation_literal( ) ) ;
3291+ assert ! ( props( r"a|[b]" ) . is_alternation_literal( ) ) ;
3292+ assert ! ( props( r"(?:a)|b" ) . is_alternation_literal( ) ) ;
3293+ assert ! ( props( r"a|(?:b)" ) . is_alternation_literal( ) ) ;
32653294
32663295 // Negative examples.
32673296 assert ! ( !props( r"" ) . is_alternation_literal( ) ) ;
@@ -3270,9 +3299,9 @@ mod tests {
32703299 assert ! ( !props( r"a+" ) . is_alternation_literal( ) ) ;
32713300 assert ! ( !props( r"foo(a)" ) . is_alternation_literal( ) ) ;
32723301 assert ! ( !props( r"(a)foo" ) . is_alternation_literal( ) ) ;
3273- assert ! ( !props( r"[a ]" ) . is_alternation_literal( ) ) ;
3274- assert ! ( !props( r"[a ]|b" ) . is_alternation_literal( ) ) ;
3275- assert ! ( !props( r"a|[b ]" ) . is_alternation_literal( ) ) ;
3302+ assert ! ( !props( r"[ab ]" ) . is_alternation_literal( ) ) ;
3303+ assert ! ( !props( r"[ab ]|b" ) . is_alternation_literal( ) ) ;
3304+ assert ! ( !props( r"a|[ab ]" ) . is_alternation_literal( ) ) ;
32763305 assert ! ( !props( r"(a)|b" ) . is_alternation_literal( ) ) ;
32773306 assert ! ( !props( r"a|(b)" ) . is_alternation_literal( ) ) ;
32783307 }
0 commit comments