diff --git a/crates/oxc_linter/src/rules/eslint/no_misleading_character_class.rs b/crates/oxc_linter/src/rules/eslint/no_misleading_character_class.rs index c58e197a4b4e0..56f2384c000b4 100644 --- a/crates/oxc_linter/src/rules/eslint/no_misleading_character_class.rs +++ b/crates/oxc_linter/src/rules/eslint/no_misleading_character_class.rs @@ -136,12 +136,17 @@ impl<'ast> Visit<'ast> for CharacterSequenceCollector<'ast> { self.sequences.push(std::mem::take(&mut self.current_seq)); self.current_seq.push(&range.max); } - CharacterClassContents::ClassStringDisjunction(_) => { + + + CharacterClassContents::ClassStringDisjunction(_) // \q{...} + | CharacterClassContents::UnicodePropertyEscape(_) // \p{...} + | CharacterClassContents::NestedCharacterClass(_) // [[]] nested character class + | CharacterClassContents::CharacterClassEscape(_) // \d, \w, etc. + => { if !self.current_seq.is_empty() { self.sequences.push(std::mem::take(&mut self.current_seq)); } } - _ => {} } } @@ -449,6 +454,8 @@ fn test() { r#"RegExp(`[\uD83D\uDC4D]`) // Backslash + "uD83D" + Backslash + "uDC4D""#, Some(serde_json::json!([{ "allowEscape": true }])), ), + // https://github.com/oxc-project/oxc/issues/19090 + (r"/[\u200c\u200d\p{ID_Continue}.]/u", None), ]; let fail = vec![ @@ -638,6 +645,9 @@ fn test() { // r#"const pattern = "[\x41\u0301]"; RegExp(pattern);"#, // Some(serde_json::json!([{ "allowEscape": true }])), // ), + // https://github.com/oxc-project/oxc/issues/19090 -- without u flag it should fail + // this should not be a `UnicodePropertyEscape` + (r"/[\u200c\u200d\p{ID_Continue}.]/", None), ]; Tester::new(NoMisleadingCharacterClass::NAME, NoMisleadingCharacterClass::PLUGIN, pass, fail) diff --git a/crates/oxc_linter/src/snapshots/eslint_no_misleading_character_class.snap b/crates/oxc_linter/src/snapshots/eslint_no_misleading_character_class.snap index 922f30c42a329..4919ebf1d7fd0 100644 --- a/crates/oxc_linter/src/snapshots/eslint_no_misleading_character_class.snap +++ b/crates/oxc_linter/src/snapshots/eslint_no_misleading_character_class.snap @@ -1,7 +1,6 @@ --- source: crates/oxc_linter/src/tester.rs --- - โš  eslint(no-misleading-character-class): Unexpected surrogate pair in character class. โ•ญโ”€[no_misleading_character_class.tsx:1:10] 1 โ”‚ var r = /[๐Ÿ‘]/ @@ -775,3 +774,9 @@ source: crates/oxc_linter/src/tester.rs 1 โ”‚ RegExp(`[\๐Ÿ‘]`) // Backslash + U+D83D + U+DC4D ยท โ”€โ”€โ”€โ”€โ”€ โ•ฐโ”€โ”€โ”€โ”€ + + โš  eslint(no-misleading-character-class): Unexpected joined character sequence in character class. + โ•ญโ”€[no_misleading_character_class.tsx:1:2] + 1 โ”‚ /[\u200c\u200d\p{ID_Continue}.]/ + ยท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ•ฐโ”€โ”€โ”€โ”€