@@ -6,6 +6,76 @@ use oxc_span::Span;
6
6
7
7
use crate :: { AstNode , context:: LintContext } ;
8
8
9
+ fn run_on_arguments < ' a , M > (
10
+ arg1 : Option < & ' a Argument > ,
11
+ arg2 : Option < & ' a Argument > ,
12
+ ctx : & ' a LintContext < ' _ > ,
13
+ cb : M ,
14
+ ) where
15
+ M : FnOnce ( & Pattern < ' _ > , Span ) ,
16
+ {
17
+ // note: improvements required for strings used via identifier references
18
+ // Missing or non-string arguments will be runtime errors, but are not covered by this rule.
19
+ match ( arg1, arg2) {
20
+ ( Some ( Argument :: StringLiteral ( pattern) ) , Some ( Argument :: StringLiteral ( flags) ) ) => {
21
+ let allocator = Allocator :: default ( ) ;
22
+ if let Some ( pat) = parse_regex ( & allocator, pattern. span , Some ( flags. span ) , ctx) {
23
+ cb ( & pat, pattern. span ) ;
24
+ }
25
+ }
26
+ ( Some ( Argument :: StringLiteral ( pattern) ) , Some ( Argument :: TemplateLiteral ( flags) ) ) => {
27
+ let allocator = Allocator :: default ( ) ;
28
+ if let Some ( pat) = parse_regex (
29
+ & allocator,
30
+ pattern. span ,
31
+ flags. is_no_substitution_template ( ) . then ( || flags. span ) ,
32
+ ctx,
33
+ ) {
34
+ cb ( & pat, pattern. span ) ;
35
+ }
36
+ }
37
+ ( Some ( Argument :: StringLiteral ( pattern) ) , _) => {
38
+ let allocator = Allocator :: default ( ) ;
39
+ if let Some ( pat) = parse_regex ( & allocator, pattern. span , None , ctx) {
40
+ cb ( & pat, pattern. span ) ;
41
+ }
42
+ }
43
+ ( Some ( Argument :: TemplateLiteral ( pattern) ) , Some ( Argument :: TemplateLiteral ( flags) ) ) => {
44
+ if !pattern. is_no_substitution_template ( ) {
45
+ return ;
46
+ }
47
+ let allocator = Allocator :: default ( ) ;
48
+ if let Some ( pat) = parse_regex (
49
+ & allocator,
50
+ pattern. span ,
51
+ flags. is_no_substitution_template ( ) . then ( || flags. span ) ,
52
+ ctx,
53
+ ) {
54
+ cb ( & pat, pattern. span ) ;
55
+ }
56
+ }
57
+ ( Some ( Argument :: TemplateLiteral ( pattern) ) , Some ( Argument :: StringLiteral ( flags) ) ) => {
58
+ if !pattern. is_no_substitution_template ( ) {
59
+ return ;
60
+ }
61
+ let allocator = Allocator :: default ( ) ;
62
+ if let Some ( pat) = parse_regex ( & allocator, pattern. span , Some ( flags. span ) , ctx) {
63
+ cb ( & pat, pattern. span ) ;
64
+ }
65
+ }
66
+ ( Some ( Argument :: TemplateLiteral ( pattern) ) , _) => {
67
+ if !pattern. is_no_substitution_template ( ) {
68
+ return ;
69
+ }
70
+ let allocator = Allocator :: default ( ) ;
71
+ if let Some ( pat) = parse_regex ( & allocator, pattern. span , None , ctx) {
72
+ cb ( & pat, pattern. span ) ;
73
+ }
74
+ }
75
+ _ => { }
76
+ }
77
+ }
78
+
9
79
pub fn run_on_regex_node < ' a , ' b , M > ( node : & ' a AstNode < ' b > , ctx : & ' a LintContext < ' b > , cb : M )
10
80
where
11
81
M : FnOnce ( & Pattern < ' _ > , Span ) ,
@@ -19,48 +89,14 @@ where
19
89
AstKind :: NewExpression ( expr)
20
90
if expr. callee . is_global_reference_name ( "RegExp" , ctx. semantic ( ) . scoping ( ) ) =>
21
91
{
22
- // note: improvements required for strings used via identifier references
23
- // Missing or non-string arguments will be runtime errors, but are not covered by this rule.
24
- match ( & expr. arguments . first ( ) , & expr. arguments . get ( 1 ) ) {
25
- ( Some ( Argument :: StringLiteral ( pattern) ) , Some ( Argument :: StringLiteral ( flags) ) ) => {
26
- let allocator = Allocator :: default ( ) ;
27
- if let Some ( pat) = parse_regex ( & allocator, pattern. span , Some ( flags. span ) , ctx)
28
- {
29
- cb ( & pat, pattern. span ) ;
30
- }
31
- }
32
- ( Some ( Argument :: StringLiteral ( pattern) ) , _) => {
33
- let allocator = Allocator :: default ( ) ;
34
- if let Some ( pat) = parse_regex ( & allocator, pattern. span , None , ctx) {
35
- cb ( & pat, pattern. span ) ;
36
- }
37
- }
38
- _ => { }
39
- }
92
+ run_on_arguments ( expr. arguments . first ( ) , expr. arguments . get ( 1 ) , ctx, cb) ;
40
93
}
41
94
42
95
// RegExp()
43
96
AstKind :: CallExpression ( expr)
44
97
if expr. callee . is_global_reference_name ( "RegExp" , ctx. semantic ( ) . scoping ( ) ) =>
45
98
{
46
- // note: improvements required for strings used via identifier references
47
- // Missing or non-string arguments will be runtime errors, but are not covered by this rule.
48
- match ( & expr. arguments . first ( ) , & expr. arguments . get ( 1 ) ) {
49
- ( Some ( Argument :: StringLiteral ( pattern) ) , Some ( Argument :: StringLiteral ( flags) ) ) => {
50
- let allocator = Allocator :: default ( ) ;
51
- if let Some ( pat) = parse_regex ( & allocator, pattern. span , Some ( flags. span ) , ctx)
52
- {
53
- cb ( & pat, pattern. span ) ;
54
- }
55
- }
56
- ( Some ( Argument :: StringLiteral ( pattern) ) , _) => {
57
- let allocator = Allocator :: default ( ) ;
58
- if let Some ( pat) = parse_regex ( & allocator, pattern. span , None , ctx) {
59
- cb ( & pat, pattern. span ) ;
60
- }
61
- }
62
- _ => { }
63
- }
99
+ run_on_arguments ( expr. arguments . first ( ) , expr. arguments . get ( 1 ) , ctx, cb) ;
64
100
}
65
101
_ => { }
66
102
}
0 commit comments