0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruffのeradicateルールは、半角括弧を含むコメント行をコードだと判定することがある

Last updated at Posted at 2023-03-17

概要

  • Python 3.11.2
  • ruff 0.0.256

やりたいこと

Ruffのeradicateルールで、コメントアウトされたコードを検出したいです。

気になったこと

以下のコメント行は、コメントアウトされたコードだと検出されました。

sample.py
# タスク(保留中)
$ ruff check sample.py --select ERA 
sample.py:1:1: ERA001 [*] Found commented-out code
Found 1 error.
[*] 1 potentially fixable with the --fix option.

半角括弧の後ろに何らかの文字が続けば、コメントアウトされたコーダとは認識されませんでした。

sample.py
# タスク(保留中)を削除する
$ ruff check sample.py --select ERA 

コードかどうかどうやって判定しているのか

コメント行にコードが含まれているかは、以下の関数で判断しているようです。
変数CODE_INDICATORSには半角括弧が定義されていました。

※私はRust言語を理解していません

ruff/src/rules/eradicate/detection.rs
/// Returns `true` if a comment contains Python code.
pub fn comment_contains_code(line: &str, task_tags: &[String]) -> bool {
    let line = if let Some(line) = line.trim().strip_prefix('#') {
        line.trim()
    } else {
        return false;
    };

    // Ignore non-comment related hashes (e.g., "# Issue #999").
    if HASH_NUMBER.is_match(line) {
        return false;
    }

    // Ignore whitelisted comments.
    if ALLOWLIST_REGEX.is_match(line) {
        return false;
    }

    if let Some(first) = line.split(&[' ', ':']).next() {
        if task_tags.iter().any(|tag| tag == first) {
            return false;
        }
    }

    if CODING_COMMENT_REGEX.is_match(line) {
        return false;
    }

    // Check that this is possibly code.
    if CODE_INDICATORS.iter().all(|symbol| !line.contains(symbol)) {
        return false;
    }

    if multiline_case(line) {
        return true;
    }

    if CODE_KEYWORDS.iter().any(|symbol| symbol.is_match(line)) {
        return true;
    }

    let line = PRINT_RETURN_REGEX.replace_all(line, "");

    if PARTIAL_DICTIONARY_REGEX.is_match(&line) {
        return true;
    }

    // Finally, compile the source code.
    parser::parse_program(&line, "<filename>").is_ok()
}

static CODE_INDICATORS: &[&str] = &[
    "(", ")", "[", "]", "{", "}", ":", "=", "%", "print", "return", "break", "continue", "import",
];

ソースを見ると、コードを含むコメント行かどうかを判定するのに、結構泥臭いことをしているようです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?