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;
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),
};
}
};
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),
}
}
}