wowlab_tidy/languages/rust/rules/complexity/
support.rs1use 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}