forge_lint/sol/info/
too_many_digits.rs1use super::TooManyDigits;
2use crate::{
3 linter::{EarlyLintPass, LintContext},
4 sol::{Severity, SolLint},
5};
6use solar::ast::{Expr, ExprKind, LitKind};
7
8declare_forge_lint!(
9 TOO_MANY_DIGITS,
10 Severity::Info,
11 "too-many-digits",
12 "numeric literal with many digits is error-prone; \
13 use scientific notation, sub-denominations, or underscore separators"
14);
15
16impl<'ast> EarlyLintPass<'ast> for TooManyDigits {
17 fn check_expr(&mut self, ctx: &LintContext, expr: &'ast Expr<'ast>) {
18 let ExprKind::Lit(lit, sub_denom) = &expr.kind else { return };
19
20 if !matches!(lit.kind, LitKind::Number(_)) {
23 return;
24 }
25
26 if sub_denom.is_some() {
28 return;
29 }
30
31 let s = lit.symbol.as_str();
32
33 if s.starts_with("0x") || s.starts_with("0X") {
36 return;
37 }
38
39 if s.contains('e') || s.contains('E') {
41 return;
42 }
43
44 if s.contains("00000") {
47 ctx.emit(&TOO_MANY_DIGITS, lit.span);
48 }
49 }
50}