rusty_cpp/analysis/
ownership.rs

1use crate::ir::{OwnershipState, IrStatement, IrExpression};
2use std::collections::HashMap;
3
4#[allow(dead_code)]
5pub struct OwnershipAnalyzer {
6    states: HashMap<String, OwnershipState>,
7}
8
9impl OwnershipAnalyzer {
10    #[allow(dead_code)]
11    pub fn new() -> Self {
12        Self {
13            states: HashMap::new(),
14        }
15    }
16    
17    #[allow(dead_code)]
18    pub fn analyze_statement(&mut self, stmt: &IrStatement) -> Result<(), String> {
19        match stmt {
20            IrStatement::Assign { lhs, rhs } => {
21                match rhs {
22                    IrExpression::Move(from) => {
23                        // Check if source is available
24                        match self.states.get(from) {
25                            Some(OwnershipState::Owned) => {
26                                self.states.insert(from.clone(), OwnershipState::Moved);
27                                self.states.insert(lhs.clone(), OwnershipState::Owned);
28                            }
29                            Some(OwnershipState::Moved) => {
30                                return Err(format!("Use after move: '{}'", from));
31                            }
32                            _ => {}
33                        }
34                    }
35                    IrExpression::New(_) => {
36                        self.states.insert(lhs.clone(), OwnershipState::Owned);
37                    }
38                    _ => {}
39                }
40            }
41            IrStatement::Drop(var) => {
42                self.states.insert(var.clone(), OwnershipState::Moved);
43            }
44            _ => {}
45        }
46        Ok(())
47    }
48    
49    #[allow(dead_code)]
50    pub fn get_state(&self, var: &str) -> Option<&OwnershipState> {
51        self.states.get(var)
52    }
53}