Skip to main content

sniff/
roles_surface_assignment.rs

1fn is_assignment_comparison(trimmed: &str) -> bool {
2    trimmed.contains("==")
3        || trimmed.contains("!=")
4        || trimmed.contains(">=")
5        || trimmed.contains("<=")
6}
7
8fn is_assignment_name_like(text: &str) -> bool {
9    text.chars()
10        .all(|ch| ch.is_ascii_uppercase() || ch.is_ascii_digit() || ch == '_' || ch == '.')
11}
12
13fn is_assignment_rhs_alias(rhs: &str) -> bool {
14    let rhs_lower = rhs.to_lowercase();
15    rhs_lower.starts_with("_")
16        || rhs_lower.contains(".")
17        || rhs_lower.contains(" as ")
18        || rhs_lower.ends_with(")")
19        || rhs_lower.ends_with("}")
20        || rhs_lower.ends_with("]")
21}
22
23pub fn is_wrapper_assignment(trimmed: &str) -> bool {
24    let Some((lhs_raw, rhs_raw)) = trimmed.split_once('=') else {
25        return false;
26    };
27
28    if is_assignment_comparison(trimmed) {
29        return false;
30    }
31
32    let lhs = lhs_raw.trim();
33    let rhs = rhs_raw.trim().trim_end_matches(',');
34    if lhs.is_empty() || rhs.is_empty() {
35        return false;
36    }
37
38    if lhs.starts_with("__all__") {
39        return true;
40    }
41
42    if rhs.contains('(') {
43        return false;
44    }
45
46    let rhs_is_alias = is_assignment_rhs_alias(rhs);
47    let rhs_is_const = is_assignment_name_like(rhs);
48    let lhs_is_const = is_assignment_name_like(lhs);
49
50    lhs_is_const || rhs_is_alias || rhs_is_const
51}