ryo-executor 0.1.0

[experimental] Mutation execution engine for RYO - parallel execution, conflict detection, workspace management
Documentation
//! ASTRegApply implementation for visibility mutations

use ryo_mutations::basic::ChangeVisibilityMutation;
use ryo_mutations::MutationResult;
use ryo_source::pure::PureItem;

use crate::engine::{ASTMutationContext, ASTRegApply, ModificationType, MutationEvent};

impl ASTRegApply for ChangeVisibilityMutation {
    fn apply_to_registry(&self, ctx: &mut ASTMutationContext) -> MutationResult {
        let target_id = self.symbol_id;

        // Get the AST for this symbol (O(1) lookup)
        let item = match ctx.ast_registry.get(target_id) {
            Some(item) => item.clone(),
            None => {
                return MutationResult {
                    mutation_type: "ChangeVisibility".to_string(),
                    changes: 0,
                    description: format!("AST not found for SymbolId({:?})", target_id),
                };
            }
        };

        // Modify the item visibility
        let new_item = match item {
            PureItem::Fn(mut f) => {
                f.vis = self.to.clone();
                PureItem::Fn(f)
            }
            PureItem::Struct(mut s) => {
                s.vis = self.to.clone();
                PureItem::Struct(s)
            }
            PureItem::Enum(mut e) => {
                e.vis = self.to.clone();
                PureItem::Enum(e)
            }
            PureItem::Const(mut c) => {
                c.vis = self.to.clone();
                PureItem::Const(c)
            }
            PureItem::Static(mut s) => {
                s.vis = self.to.clone();
                PureItem::Static(s)
            }
            PureItem::Type(mut t) => {
                t.vis = self.to.clone();
                PureItem::Type(t)
            }
            PureItem::Trait(mut t) => {
                t.vis = self.to.clone();
                PureItem::Trait(t)
            }
            _ => {
                return MutationResult {
                    mutation_type: "ChangeVisibility".to_string(),
                    changes: 0,
                    description: format!("Cannot change visibility of SymbolId({:?})", target_id),
                };
            }
        };

        ctx.set_ast(target_id, new_item);
        ctx.emit(MutationEvent::SymbolModified {
            id: target_id,
            modification: ModificationType::VisibilityChanged,
        });

        MutationResult {
            mutation_type: "ChangeVisibility".to_string(),
            changes: 1,
            description: format!("Changed SymbolId({:?}) to {:?}", target_id, self.to),
        }
    }
}