Skip to content

Commit

Permalink
test(lint/noMisleadingCharacterClass): add more test cases for the gl…
Browse files Browse the repository at this point in the history
…obalObject (#1129)
  • Loading branch information
togami2864 authored Dec 17, 2023
1 parent a625e4e commit 6d86024
Show file tree
Hide file tree
Showing 5 changed files with 265 additions and 98 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@ use biome_console::markup;
use biome_diagnostics::Applicability;
use biome_js_factory::make;
use biome_js_syntax::{
AnyJsCallArgument, AnyJsExpression, AnyJsLiteralExpression, AnyJsTemplateElement,
JsCallArguments, JsCallExpression, JsNewExpression, JsRegexLiteralExpression,
JsStringLiteralExpression, JsSyntaxKind, JsSyntaxToken, T,
global_identifier, AnyJsCallArgument, AnyJsExpression, AnyJsLiteralExpression,
AnyJsTemplateElement, JsCallArguments, JsCallExpression, JsNewExpression,
JsRegexLiteralExpression, JsStringLiteralExpression, JsSyntaxKind, JsSyntaxToken, T,
};
use biome_rowan::{
declare_node_union, AstNode, AstNodeList, AstSeparatedList, BatchMutationExt, TextRange,
TriviaPieceKind,
};
declare_rule! {
/// Disallow characters made with multiple code points in character class syntax.
Expand Down Expand Up @@ -127,25 +128,7 @@ impl Rule for NoMisleadingCharacterClass {
}

AnyRegexExpression::JsNewExpression(expr) => {
let is_reg_exp = match expr.callee().ok()? {
AnyJsExpression::JsIdentifierExpression(callee) => {
callee.name().ok()?.has_name("RegExp")
}
AnyJsExpression::JsStaticMemberExpression(callee) => {
let is_global_this = match callee.object().ok()? {
AnyJsExpression::JsIdentifierExpression(e) => {
e.name().ok()?.has_name("globalThis")
}
_ => false,
};

is_global_this
&& callee.member().ok()?.value_token().ok()?.text() == "RegExp"
}
_ => false,
};

if is_reg_exp {
if is_regex_expr(expr.callee().ok()?)? {
let mut args = expr.arguments()?.args().iter();
let raw_regex_pattern = args
.next()
Expand All @@ -171,11 +154,7 @@ impl Rule for NoMisleadingCharacterClass {
}
}
AnyRegexExpression::JsCallExpression(expr) => {
let callee = match expr.callee().ok()? {
AnyJsExpression::JsIdentifierExpression(callee) => callee,
_ => return None,
};
if callee.name().ok()?.has_name("RegExp") {
if is_regex_expr(expr.callee().ok()?)? {
let mut args = expr.arguments().ok()?.args().iter();
let raw_regex_pattern = args
.next()
Expand Down Expand Up @@ -293,6 +272,23 @@ impl Rule for NoMisleadingCharacterClass {
}
}

fn is_regex_expr(expr: AnyJsExpression) -> Option<bool> {
match expr {
AnyJsExpression::JsIdentifierExpression(callee) => {
Some(callee.name().ok()?.has_name("RegExp"))
}
AnyJsExpression::JsStaticMemberExpression(callee) => {
let is_member_regexp = callee.member().ok()?.value_token().ok()?.text() == "RegExp";
let callee = callee.object().ok()?;
let (_, name) = global_identifier(&callee)?;
let is_global_obj =
name.text() == "globalThis" || name.text() == "global" || name.text() == "window";
Some(is_global_obj && is_member_regexp)
}
_ => Some(false),
}
}

fn diagnostic_regex_pattern(
regex_pattern: &str,
has_u_flag: bool,
Expand Down Expand Up @@ -421,7 +417,10 @@ fn make_suggestion(
suggestion.map(|s| {
make::js_call_arguments(
make::token(T!['(']),
make::js_call_argument_list([literal, s], [make::token(T![,])]),
make::js_call_argument_list(
[literal, s],
Some(make::token(T![,]).with_trailing_trivia([(TriviaPieceKind::Whitespace, " ")])),
),
make::token(T![')']),
)
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,14 @@ var r = new RegExp("[\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F466}]", "u");
var r = new globalThis.RegExp("[❇️]", "");
var r = new globalThis.RegExp("[👶🏻]", "u");
var r = new globalThis.RegExp("[🇯🇵]", "");
var r = new globalThis.RegExp("[\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F466}]", "u");
var r = new globalThis.RegExp("[\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F466}]", "u");
var r = new window.RegExp("[❇️]", "");
var r = new window.RegExp("[👍]", "");
var r = new global.RegExp("[❇️]", "");
var r = new global.RegExp("[👍]", "");
var r = new globalThis.globalThis.globalThis.RegExp("[❇️]", "");
var r = new globalThis.globalThis.globalThis.RegExp("[👍]", "");
var r = RegExp("[👍]", "");
var r = window.RegExp("[👍]", "");
var r = global.RegExp("[👍]", "");
var r = globalThis.RegExp("[👍]", "");
Loading

0 comments on commit 6d86024

Please sign in to comment.