cairo_lang_lowering/optimizations/
var_renamer.rs

1use cairo_lang_utils::unordered_hash_map::UnorderedHashMap;
2
3use crate::utils::Rebuilder;
4use crate::{BlockId, VariableId};
5
6/// Utility for renaming variables.
7/// Support recursive renaming, e.g. if A is renamed to B, and B is renamed to C, then A is renamed
8/// to C.
9#[derive(Default)]
10pub struct VarRenamer {
11    pub renamed_vars: UnorderedHashMap<VariableId, VariableId>,
12}
13
14impl Rebuilder for VarRenamer {
15    fn map_var_id(&mut self, var: VariableId) -> VariableId {
16        let Some(mut new_var_id) = self.renamed_vars.get(&var).cloned() else {
17            return var;
18        };
19        while let Some(new_id) = self.renamed_vars.get(&new_var_id) {
20            assert_ne!(new_var_id, *new_id);
21            new_var_id = *new_id;
22        }
23
24        self.renamed_vars.insert(var, new_var_id);
25        new_var_id
26    }
27
28    fn map_block_id(&mut self, block: BlockId) -> BlockId {
29        block
30    }
31}