diff --git a/crates/ruff_linter/src/rules/eradicate/detection.rs b/crates/ruff_linter/src/rules/eradicate/detection.rs index c3ba54a1993500..559a7dbf83f7e3 100644 --- a/crates/ruff_linter/src/rules/eradicate/detection.rs +++ b/crates/ruff_linter/src/rules/eradicate/detection.rs @@ -16,7 +16,7 @@ static CODE_INDICATORS: LazyLock = LazyLock::new(|| { static ALLOWLIST_REGEX: LazyLock = LazyLock::new(|| { Regex::new( - r"^(?i)(?:pylint|pyright|noqa|nosec|region|endregion|type:\s*ignore|fmt:\s*(on|off)|isort:\s*(on|off|skip|skip_file|split|dont-add-imports(:\s*\[.*?])?)|mypy:|SPDX-License-Identifier:|(?:en)?coding[:=][ \t]*([-_.a-zA-Z0-9]+))", + r"^(?i)(?:pylint|pyright|noqa|nosec|region|endregion|type:\s*ignore|fmt:\s*(on|off)|isort:\s*(on|off|skip|skip_file|split|dont-add-imports(:\s*\[.*?])?)|mypy:|SPDX-License-Identifier:|language=[a-z](?: ?[-_.a-z0-9]+)+|(?:en)?coding[:=][ \t]*([-_.a-zA-Z0-9]+))", ).unwrap() }); @@ -297,6 +297,16 @@ mod tests { )); } + #[test] + fn comment_contains_language_injection() { + assert!(comment_contains_code("# language=123", &[])); + assert!(comment_contains_code("# language=\"pt\"", &[])); + assert!(comment_contains_code("# language='en'", &[])); + + assert!(!comment_contains_code("# language=xml", &[])); + assert!(!comment_contains_code("# language=ecma script level 4", &[])); + } + #[test] fn comment_contains_todo() { let task_tags = TASK_TAGS