solstat/analyzer/optimizations/
private_constant.rs

1use std::collections::HashSet;
2
3use solang_parser::pt::{self, Loc, SourceUnit};
4
5use crate::analyzer::utils;
6
7pub fn private_constant_optimization(source_unit: SourceUnit) -> HashSet<Loc> {
8    let mut optimization_locations: HashSet<Loc> = HashSet::new();
9
10    let storage_variables = utils::get_32_byte_storage_variables(source_unit.clone(), false, true);
11
12    for (_, variable_data) in storage_variables {
13        let (option_variable_attributes, loc) = variable_data;
14
15        if option_variable_attributes.is_some() {
16            let variable_attributes = option_variable_attributes.unwrap();
17
18            let mut is_constant = false;
19            let mut is_private = false;
20
21            for variable_attribute in variable_attributes {
22                match variable_attribute {
23                    pt::VariableAttribute::Constant(_) => {
24                        is_constant = true;
25                    }
26
27                    pt::VariableAttribute::Visibility(visibility) => match visibility {
28                        pt::Visibility::Private(_) => is_private = true,
29                        _ => {}
30                    },
31
32                    _ => {}
33                }
34            }
35
36            if is_constant && !is_private {
37                optimization_locations.insert(loc);
38            }
39        }
40    }
41
42    optimization_locations
43}
44
45#[test]
46fn test_private_constant_optimization() {
47    let file_contents = r#"
48    
49contract Contract0 {
50
51    uint256 constant public x = 100;
52    uint256 constant private y = 100;
53    uint256 constant z = 100;
54
55
56    function addPublicConstant(uint256 a) external pure returns (uint256) {
57        return a + x;
58    }
59
60
61    function addPrivateConstant(uint256 a) external pure returns (uint256) {
62        return a +x;
63    }
64}
65
66    "#;
67    let source_unit = solang_parser::parse(file_contents, 0).unwrap().0;
68    let optimization_locations = private_constant_optimization(source_unit);
69    assert_eq!(optimization_locations.len(), 2)
70}