use syn::spanned::Spanned;
#[derive(Default)]
pub struct RemoveItemImplVisitor {
done: bool,
visited: std::collections::BTreeSet<(proc_macro2::LineColumn, proc_macro2::LineColumn)>,
}
impl super::Visiter for RemoveItemImplVisitor {
fn reset(&mut self) {
self.done = false;
}
fn visited_count(&self) -> usize {
self.visited.len()
}
}
impl syn::fold::Fold for RemoveItemImplVisitor {
fn fold_file(&mut self, mut file: syn::File) -> syn::File {
if self.done {
return file;
}
let mut i = file.items.len();
while i != 0 {
i = i.saturating_sub(1);
let item = file.items[i].span();
let item = (item.start(), item.end());
if self.visited.insert(item) {
file.items.remove(i).span();
self.done = true;
return file;
}
}
syn::fold::fold_file(self, file)
}
fn fold_item_impl(&mut self, mut r#impl: syn::ItemImpl) -> syn::ItemImpl {
if self.done {
return r#impl;
}
let mut i = r#impl.items.len();
while i != 0 {
i = i.saturating_sub(1);
let item = r#impl.items[i].span();
let item = (item.start(), item.end());
if self.visited.insert(item) {
r#impl.items.remove(i).span();
self.done = true;
return r#impl;
}
}
syn::fold::fold_item_impl(self, r#impl)
}
}