-
Notifications
You must be signed in to change notification settings - Fork 883
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
## Summary Extends the pragma comment detection in the formatter to support case-insensitive `noqa` (as supposed by Ruff), plus a variety of other pragmas (`isort:`, `nosec`, etc.). Also extracts the detection out into the trivia crate so that we can reuse it in the linter (see: #7471). ## Test Plan `cargo test`
- Loading branch information
1 parent
46b85ab
commit f62b4c8
Showing
5 changed files
with
42 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,12 @@ | ||
mod comment_ranges; | ||
mod cursor; | ||
mod pragmas; | ||
pub mod textwrap; | ||
mod tokenizer; | ||
mod whitespace; | ||
|
||
pub use comment_ranges::CommentRanges; | ||
pub use cursor::*; | ||
pub use pragmas::*; | ||
pub use tokenizer::*; | ||
pub use whitespace::*; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
/// Returns `true` if a comment appears to be a pragma comment. | ||
/// | ||
/// ``` | ||
/// assert!(ruff_python_trivia::is_pragma_comment("# type: ignore")); | ||
/// assert!(ruff_python_trivia::is_pragma_comment("# noqa: F401")); | ||
/// assert!(ruff_python_trivia::is_pragma_comment("# noqa")); | ||
/// assert!(ruff_python_trivia::is_pragma_comment("# NoQA")); | ||
/// assert!(ruff_python_trivia::is_pragma_comment("# nosec")); | ||
/// assert!(ruff_python_trivia::is_pragma_comment("# nosec B602, B607")); | ||
/// assert!(ruff_python_trivia::is_pragma_comment("# isort: off")); | ||
/// assert!(ruff_python_trivia::is_pragma_comment("# isort: skip")); | ||
/// ``` | ||
pub fn is_pragma_comment(comment: &str) -> bool { | ||
let Some(content) = comment.strip_prefix('#') else { | ||
return false; | ||
}; | ||
let trimmed = content.trim_start(); | ||
|
||
// Case-insensitive match against `noqa` (which doesn't require a trailing colon). | ||
matches!( | ||
trimmed.as_bytes(), | ||
[b'n' | b'N', b'o' | b'O', b'q' | b'Q', b'a' | b'A', ..] | ||
) || | ||
// Case-insensitive match against pragmas that don't require a trailing colon. | ||
trimmed.starts_with("nosec") || | ||
// Case-sensitive match against a variety of pragmas that _do_ require a trailing colon. | ||
trimmed | ||
.split_once(':') | ||
.is_some_and(|(maybe_pragma, _)| matches!(maybe_pragma, "isort" | "type" | "pyright" | "pylint" | "flake8" | "ruff")) | ||
} |