rusty_cpp/analysis/
ownership.rs1use 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 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}