package sk.stuba.fiit.perconik.core.java.dom; import javax.annotation.Nullable; import com.google.common.base.Function; import com.google.common.base.Predicate; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; import static com.google.common.base.Preconditions.checkNotNull; public final class NodeCutter<N extends ASTNode> implements Function<N, N> { final Predicate<ASTNode> filter; private NodeCutter(final Predicate<ASTNode> filter) { this.filter = checkNotNull(filter); } public static <N extends ASTNode> NodeCutter<N> using(final Predicate<ASTNode> filter) { return new NodeCutter<>(filter); } @Override public N apply(@Nullable final N node) { if (node == null) { return null; } return new Processor().perform(node); } private final class Processor extends ASTVisitor { Processor() { super(true); } public N perform(final N node) { node.accept(this); return node; } @Override public boolean preVisit2(final ASTNode node) { if (NodeCutter.this.filter.apply(node)) { node.delete(); return false; } return true; } } @Override public boolean equals(@Nullable final Object o) { if (o instanceof NodeCutter) { NodeCutter<?> other = (NodeCutter<?>) o; return this.filter.equals(other.filter); } return false; } @Override public int hashCode() { return this.filter.hashCode(); } @Override public String toString() { return "cutter(" + this.filter + ")"; } }