solstat/analyzer/optimizations/
private_constant.rs1use 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}