obelix 0.2.0

Obélix is a tool to reduce Rust source files to produce MVEs
Documentation
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)
    }
}