Skip to main content

ryo_executor/engine/impls/
visibility.rs

1//! ASTRegApply implementation for visibility mutations
2
3use ryo_mutations::basic::ChangeVisibilityMutation;
4use ryo_mutations::MutationResult;
5use ryo_source::pure::PureItem;
6
7use crate::engine::{ASTMutationContext, ASTRegApply, ModificationType, MutationEvent};
8
9impl ASTRegApply for ChangeVisibilityMutation {
10    fn apply_to_registry(&self, ctx: &mut ASTMutationContext) -> MutationResult {
11        let target_id = self.symbol_id;
12
13        // Get the AST for this symbol (O(1) lookup)
14        let item = match ctx.ast_registry.get(target_id) {
15            Some(item) => item.clone(),
16            None => {
17                return MutationResult {
18                    mutation_type: "ChangeVisibility".to_string(),
19                    changes: 0,
20                    description: format!("AST not found for SymbolId({:?})", target_id),
21                };
22            }
23        };
24
25        // Modify the item visibility
26        let new_item = match item {
27            PureItem::Fn(mut f) => {
28                f.vis = self.to.clone();
29                PureItem::Fn(f)
30            }
31            PureItem::Struct(mut s) => {
32                s.vis = self.to.clone();
33                PureItem::Struct(s)
34            }
35            PureItem::Enum(mut e) => {
36                e.vis = self.to.clone();
37                PureItem::Enum(e)
38            }
39            PureItem::Const(mut c) => {
40                c.vis = self.to.clone();
41                PureItem::Const(c)
42            }
43            PureItem::Static(mut s) => {
44                s.vis = self.to.clone();
45                PureItem::Static(s)
46            }
47            PureItem::Type(mut t) => {
48                t.vis = self.to.clone();
49                PureItem::Type(t)
50            }
51            PureItem::Trait(mut t) => {
52                t.vis = self.to.clone();
53                PureItem::Trait(t)
54            }
55            _ => {
56                return MutationResult {
57                    mutation_type: "ChangeVisibility".to_string(),
58                    changes: 0,
59                    description: format!("Cannot change visibility of SymbolId({:?})", target_id),
60                };
61            }
62        };
63
64        ctx.set_ast(target_id, new_item);
65        ctx.emit(MutationEvent::SymbolModified {
66            id: target_id,
67            modification: ModificationType::VisibilityChanged,
68        });
69
70        MutationResult {
71            mutation_type: "ChangeVisibility".to_string(),
72            changes: 1,
73            description: format!("Changed SymbolId({:?}) to {:?}", target_id, self.to),
74        }
75    }
76}