Skip to main content

wowlab_tidy/languages/rust/rules/complexity/
support.rs

1use ra_ap_syntax::ast::{self, LiteralKind};
2
3pub(super) use super::super::support::{
4    estimate_type_size, parse_int_expr, type_name as self_type_name,
5};
6
7const ONE_BYTE: u64 = 1;
8const TWO_BYTES: u64 = 2;
9const FOUR_BYTES: u64 = 4;
10const EIGHT_BYTES: u64 = 8;
11const SIXTEEN_BYTES: u64 = 16;
12
13pub(super) fn estimate_fields_size(fields: Option<ast::FieldList>) -> Option<u64> {
14    match fields {
15        None => Some(0),
16        Some(ast::FieldList::RecordFieldList(fields)) => {
17            fields.fields().try_fold(0u64, |total, field| {
18                Some(total.saturating_add(estimate_type_size(&field.ty()?)?))
19            })
20        }
21        Some(ast::FieldList::TupleFieldList(fields)) => {
22            fields.fields().try_fold(0u64, |total, field| {
23                Some(total.saturating_add(estimate_type_size(&field.ty()?)?))
24            })
25        }
26    }
27}
28
29pub(super) fn literal_elem_size(expr: &ast::Expr) -> Option<u64> {
30    let ast::Expr::Literal(literal) = expr else {
31        return None;
32    };
33
34    match literal.kind() {
35        LiteralKind::IntNumber(number) => size_for_suffix(number.suffix()?),
36        LiteralKind::FloatNumber(number) => size_for_suffix(number.suffix()?),
37        _ => None,
38    }
39}
40
41fn size_for_suffix(suffix: &str) -> Option<u64> {
42    match suffix {
43        "u8" | "i8" => Some(ONE_BYTE),
44        "u16" | "i16" => Some(TWO_BYTES),
45        "u32" | "i32" | "f32" => Some(FOUR_BYTES),
46        "u64" | "i64" | "usize" | "isize" | "f64" => Some(EIGHT_BYTES),
47        "u128" | "i128" => Some(SIXTEEN_BYTES),
48        _ => None,
49    }
50}