@@ -6,6 +6,76 @@ use oxc_span::Span;
66
77use crate :: { AstNode , context:: LintContext } ;
88
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+
979pub fn run_on_regex_node < ' a , ' b , M > ( node : & ' a AstNode < ' b > , ctx : & ' a LintContext < ' b > , cb : M )
1080where
1181 M : FnOnce ( & Pattern < ' _ > , Span ) ,
@@ -19,48 +89,14 @@ where
1989 AstKind :: NewExpression ( expr)
2090 if expr. callee . is_global_reference_name ( "RegExp" , ctx. semantic ( ) . scoping ( ) ) =>
2191 {
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) ;
4093 }
4194
4295 // RegExp()
4396 AstKind :: CallExpression ( expr)
4497 if expr. callee . is_global_reference_name ( "RegExp" , ctx. semantic ( ) . scoping ( ) ) =>
4598 {
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) ;
64100 }
65101 _ => { }
66102 }
0 commit comments