From 74b9773f0e9cc06d213167012f1d8147e26c8320 Mon Sep 17 00:00:00 2001 From: Colt45s Date: Sun, 4 Aug 2024 02:18:09 +0900 Subject: [PATCH 1/3] fix(no_invalid_regexp): call inside function case --- src/rules/no_invalid_regexp.rs | 44 +++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/src/rules/no_invalid_regexp.rs b/src/rules/no_invalid_regexp.rs index e5f8802e..6463e053 100644 --- a/src/rules/no_invalid_regexp.rs +++ b/src/rules/no_invalid_regexp.rs @@ -7,8 +7,8 @@ use crate::Program; use crate::ProgramRef; use deno_ast::swc::ast::Expr; use deno_ast::swc::ast::ExprOrSpread; -use deno_ast::swc::visit::noop_visit_type; use deno_ast::swc::visit::Visit; +use deno_ast::swc::visit::{noop_visit_type, VisitWith}; use deno_ast::SourceRange; use deno_ast::SourceRangedForSpanned; @@ -74,18 +74,24 @@ impl<'c, 'view> NoInvalidRegexpVisitor<'c, 'view> { args: &[ExprOrSpread], range: SourceRange, ) { - if let Expr::Ident(ident) = callee { - if ident.sym != *"RegExp" || args.is_empty() { - return; - } - if let Some(pattern) = &check_expr_for_string_literal(&args[0].expr) { - if args.len() > 1 { - if let Some(flags) = &check_expr_for_string_literal(&args[1].expr) { - self.check_regex(pattern, flags, range); - return; + match callee { + Expr::Ident(ident) => { + if ident.sym != *"RegExp" || args.is_empty() { + return; + } + if let Some(pattern) = &check_expr_for_string_literal(&args[0].expr) { + if args.len() > 1 { + if let Some(flags) = &check_expr_for_string_literal(&args[1].expr) { + self.check_regex(pattern, flags, range); + return; + } } + self.check_regex(pattern, "", range); } - self.check_regex(pattern, "", range); + } + _ => { + callee.visit_children_with(self); + args.visit_children_with(self); } } } @@ -193,6 +199,22 @@ let re = new RegExp('foo', x);", r"/(?a)\k [ + /+/, + RegExp('+'), + new RegExp('+'), +])([ + /+/, + RegExp('+'), + new RegExp('+'), +]);": [ + { line: 3, col: 2, message: MESSAGE, hint: HINT }, + { line: 4, col: 2, message: MESSAGE, hint: HINT }, + { line: 5, col: 2, message: MESSAGE, hint: HINT }, + { line: 7, col: 2, message: MESSAGE, hint: HINT }, + { line: 8, col: 2, message: MESSAGE, hint: HINT }, + { line: 9, col: 2, message: MESSAGE, hint: HINT }], } } } From 2e88770164dda9d8d44c5941af7198531cbeeea2 Mon Sep 17 00:00:00 2001 From: Colt45s Date: Sun, 4 Aug 2024 02:20:26 +0900 Subject: [PATCH 2/3] fix(no_invalid_regexp): no args case --- src/rules/no_invalid_regexp.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/rules/no_invalid_regexp.rs b/src/rules/no_invalid_regexp.rs index 6463e053..50fb2507 100644 --- a/src/rules/no_invalid_regexp.rs +++ b/src/rules/no_invalid_regexp.rs @@ -132,13 +132,11 @@ impl<'c, 'view> Visit for NoInvalidRegexpVisitor<'c, 'view> { } fn visit_new_expr(&mut self, new_expr: &deno_ast::swc::ast::NewExpr) { - if new_expr.args.is_some() { - self.handle_call_or_new_expr( - &new_expr.callee, - new_expr.args.as_ref().unwrap(), - new_expr.range(), - ); - } + self.handle_call_or_new_expr( + &new_expr.callee, + new_expr.args.as_ref().unwrap_or(&vec![]), + new_expr.range(), + ); } } @@ -215,6 +213,10 @@ let re = new RegExp('foo', x);", { line: 7, col: 2, message: MESSAGE, hint: HINT }, { line: 8, col: 2, message: MESSAGE, hint: HINT }, { line: 9, col: 2, message: MESSAGE, hint: HINT }], + r" +new function () { + return /+/; +};": [{ line: 3, col: 9, message: MESSAGE, hint: HINT }], } } } From 60b1f9b9b93efab5e1c6fb2c60a809ba847a87b2 Mon Sep 17 00:00:00 2001 From: Colt45s Date: Sun, 4 Aug 2024 02:21:23 +0900 Subject: [PATCH 3/3] fix(no_invalid_regexp): call inside super case --- src/rules/no_invalid_regexp.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/rules/no_invalid_regexp.rs b/src/rules/no_invalid_regexp.rs index 50fb2507..842eae26 100644 --- a/src/rules/no_invalid_regexp.rs +++ b/src/rules/no_invalid_regexp.rs @@ -5,8 +5,8 @@ use super::{Context, LintRule}; use crate::js_regex::*; use crate::Program; use crate::ProgramRef; -use deno_ast::swc::ast::Expr; use deno_ast::swc::ast::ExprOrSpread; +use deno_ast::swc::ast::{Callee, Expr}; use deno_ast::swc::visit::Visit; use deno_ast::swc::visit::{noop_visit_type, VisitWith}; use deno_ast::SourceRange; @@ -126,8 +126,12 @@ impl<'c, 'view> Visit for NoInvalidRegexpVisitor<'c, 'view> { } fn visit_call_expr(&mut self, call_expr: &deno_ast::swc::ast::CallExpr) { - if let deno_ast::swc::ast::Callee::Expr(expr) = &call_expr.callee { - self.handle_call_or_new_expr(expr, &call_expr.args, call_expr.range()); + match &call_expr.callee { + Callee::Super(_) => call_expr.args.visit_children_with(self), + Callee::Expr(expr) => { + self.handle_call_or_new_expr(expr, &call_expr.args, call_expr.range()); + } + _ => {} } } @@ -217,6 +221,12 @@ let re = new RegExp('foo', x);", new function () { return /+/; };": [{ line: 3, col: 9, message: MESSAGE, hint: HINT }], + r" +class C extends RegExp { + constructor() { + super(/+/); + } +}": [{ line: 4, col: 10, message: MESSAGE, hint: HINT }], } } }