package sk.stuba.fiit.perconik.activity.listeners.java.dom; import java.util.Collection; import java.util.List; import java.util.Set; import javax.annotation.Nullable; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration; import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.EnumConstantDeclaration; import org.eclipse.jdt.core.dom.EnumDeclaration; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.ImportDeclaration; import org.eclipse.jdt.core.dom.Initializer; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.PackageDeclaration; import org.eclipse.jdt.core.dom.TypeDeclaration; import sk.stuba.fiit.perconik.utilities.function.Collector; import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Sets.newLinkedHashSet; final class RelevantNodeCollector implements Collector<CompilationUnit, ASTNode> { RelevantNodeCollector() {} public final List<ASTNode> apply(@Nullable final CompilationUnit unit) { return new Processor().apply(unit); } private static final class Processor extends ASTVisitor implements Collector<CompilationUnit, ASTNode> { private final Set<ASTNode> result; Processor() { this.result = newLinkedHashSet(); } public List<ASTNode> apply(@Nullable final CompilationUnit unit) { if (unit == null) { return null; } unit.accept(this); return newArrayList(this.result); } private void addNode(final ASTNode node) { if (node != null) { this.result.add(node); } } private void addNodes(final Collection<? extends ASTNode> nodes) { this.result.addAll(nodes); } // compilation unit @Override public boolean visit(final CompilationUnit node) { return true; } @Override public boolean visit(final PackageDeclaration node) { this.addNode(node); return true; } @Override public boolean visit(final ImportDeclaration node) { this.addNode(node); return true; } // abstract type declarations @Override public boolean visit(final AnnotationTypeDeclaration node) { this.addNode(node.getJavadoc()); this.addNodes(node.modifiers()); this.addNode(node.getName()); return true; } @Override public boolean visit(final EnumDeclaration node) { this.addNode(node.getJavadoc()); this.addNodes(node.modifiers()); this.addNode(node.getName()); this.addNodes(node.superInterfaceTypes()); return true; } @Override public boolean visit(final TypeDeclaration node) { this.addNode(node.getJavadoc()); this.addNodes(node.modifiers()); this.addNode(node.getName()); this.addNodes(node.typeParameters()); this.addNode(node.getSuperclassType()); this.addNodes(node.superInterfaceTypes()); return true; } // abstract type body declarations @Override public boolean visit(final AnnotationTypeMemberDeclaration node) { this.addNode(node); return true; } @Override public boolean visit(final EnumConstantDeclaration node) { this.addNode(node); return true; } @Override public boolean visit(final FieldDeclaration node) { this.addNode(node); return true; } @Override public boolean visit(final Initializer node) { this.addNode(node); return true; } @Override public boolean visit(final MethodDeclaration node) { this.addNode(node); return true; } } }