similarity-core 0.5.2

Core library for code similarity detection using AST-based comparison
Documentation
pub(crate) fn has_similarity_ignore_directive(source_text: &str, start_line: usize) -> bool {
    if start_line <= 1 {
        return false;
    }

    let lines: Vec<&str> = source_text.lines().collect();
    if start_line > lines.len() + 1 {
        return false;
    }

    let mut current = start_line - 1;
    let mut in_block_comment = false;

    while current > 0 {
        current -= 1;
        let line = lines[current].trim();

        if line.is_empty() {
            continue;
        }

        if in_block_comment {
            if line.contains("similarity-ignore") {
                return true;
            }
            if line.starts_with("/*") || line.contains("/*") {
                in_block_comment = false;
            }
            continue;
        }

        if line.starts_with("//") {
            if line.contains("similarity-ignore") {
                return true;
            }
            continue;
        }

        if line.starts_with("/*") {
            return line.contains("similarity-ignore");
        }

        if line.ends_with("*/") || line.starts_with("*/") {
            if line.contains("similarity-ignore") {
                return true;
            }
            if !line.contains("/*") {
                in_block_comment = true;
            }
            continue;
        }

        if line.starts_with('*') {
            if line.contains("similarity-ignore") {
                return true;
            }
            continue;
        }

        break;
    }

    false
}

#[cfg(test)]
mod tests {
    use super::has_similarity_ignore_directive;

    #[test]
    fn detects_single_line_directive() {
        let source = r#"
// similarity-ignore
function test() {}
"#;

        assert!(has_similarity_ignore_directive(source, 3));
    }

    #[test]
    fn detects_block_comment_directive() {
        let source = r#"
/**
 * similarity-ignore
 */
function test() {}
"#;

        assert!(has_similarity_ignore_directive(source, 5));
    }

    #[test]
    fn stops_at_non_comment_code() {
        let source = r#"
const marker = true;
// similarity-ignore

function test() {}
"#;

        assert!(has_similarity_ignore_directive(source, 5));
        assert!(!has_similarity_ignore_directive(source, 2));
    }
}