use ryo_analysis::{SymbolId, SymbolKind, SymbolPath};
#[derive(Debug, Clone)]
pub enum MutationEvent {
SymbolAdded { path: SymbolPath, kind: SymbolKind },
SymbolRemoved { path: SymbolPath },
SymbolModified {
id: SymbolId,
modification: ModificationType,
},
SymbolRenamed {
old_path: SymbolPath,
new_path: Box<SymbolPath>,
},
}
#[derive(Debug, Clone)]
pub enum ModificationType {
FieldAdded(String),
FieldRemoved(String),
MethodAdded(String),
MethodRemoved(String),
VariantAdded(String),
VariantRemoved(String),
VisibilityChanged,
DeriveAdded(String),
DeriveRemoved(String),
BodyModified,
TypeChanged,
AttributeAdded(String),
AttributeRemoved(String),
Other(String),
}
impl std::fmt::Display for MutationEvent {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
MutationEvent::SymbolAdded { path, kind } => {
write!(f, "Added {:?} {}", kind, path)
}
MutationEvent::SymbolRemoved { path } => {
write!(f, "Removed {}", path)
}
MutationEvent::SymbolModified { id, modification } => {
write!(f, "Modified {:?}: {}", id, modification)
}
MutationEvent::SymbolRenamed { old_path, new_path } => {
write!(f, "Renamed {} -> {}", old_path, new_path)
}
}
}
}
impl std::fmt::Display for ModificationType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ModificationType::FieldAdded(name) => write!(f, "field added: {}", name),
ModificationType::FieldRemoved(name) => write!(f, "field removed: {}", name),
ModificationType::MethodAdded(name) => write!(f, "method added: {}", name),
ModificationType::MethodRemoved(name) => write!(f, "method removed: {}", name),
ModificationType::VariantAdded(name) => write!(f, "variant added: {}", name),
ModificationType::VariantRemoved(name) => write!(f, "variant removed: {}", name),
ModificationType::VisibilityChanged => write!(f, "visibility changed"),
ModificationType::DeriveAdded(name) => write!(f, "derive added: {}", name),
ModificationType::DeriveRemoved(name) => write!(f, "derive removed: {}", name),
ModificationType::BodyModified => write!(f, "body modified"),
ModificationType::TypeChanged => write!(f, "type changed"),
ModificationType::AttributeAdded(attr) => write!(f, "attribute added: {}", attr),
ModificationType::AttributeRemoved(attr) => write!(f, "attribute removed: {}", attr),
ModificationType::Other(desc) => write!(f, "{}", desc),
}
}
}
use ryo_analysis::SymbolRegistry;
pub fn collect_affected_ids(events: &[MutationEvent], registry: &SymbolRegistry) -> Vec<SymbolId> {
let mut ids = Vec::new();
for event in events {
match event {
MutationEvent::SymbolAdded { path, .. } => {
if let Some(id) = registry.lookup(path) {
ids.push(id);
}
}
MutationEvent::SymbolRemoved { path } => {
if let Some(id) = registry.lookup(path) {
ids.push(id);
}
}
MutationEvent::SymbolModified { id, .. } => {
ids.push(*id);
}
MutationEvent::SymbolRenamed { new_path, .. } => {
if let Some(id) = registry.lookup(new_path) {
ids.push(id);
}
}
}
}
ids.sort_unstable();
ids.dedup();
ids
}