package sk.stuba.fiit.perconik.core.java;
import java.util.LinkedList;
import javax.annotation.Nullable;
import com.google.common.base.Throwables;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaModelException;
import sk.stuba.fiit.perconik.eclipse.jdt.core.JavaException;
import static com.google.common.collect.Lists.newLinkedList;
public final class JavaElements {
private JavaElements() {}
public static IJavaElement parent(@Nullable final IJavaElement element) {
return element != null ? element.getParent() : null;
}
public static LinkedList<IJavaElement> ancestors(@Nullable IJavaElement element) {
final LinkedList<IJavaElement> ancestors = newLinkedList();
while (element != null) {
ancestors.add(element = element.getParent());
}
return ancestors;
}
public static LinkedList<IJavaElement> downToRoot(@Nullable IJavaElement element) {
LinkedList<IJavaElement> branch = newLinkedList();
if (element != null) {
do {
branch.add(element);
} while ((element = element.getParent()) != null);
}
return branch;
}
private static <T> T handle(final Exception failure) {
if (failure instanceof JavaModelException) {
throw new JavaException(failure);
}
if (failure instanceof NullPointerException) {
return null;
}
throw Throwables.propagate(failure);
}
public static IResource resource(@Nullable final IJavaElement element) {
return element != null ? element.getResource() : null;
}
public static IResource correspondingResource(@Nullable final IJavaElement element) {
try {
return element != null ? element.getCorrespondingResource() : null;
} catch (JavaModelException e) {
return handle(e);
}
}
public static IResource underlyingResource(@Nullable final IJavaElement element) {
try {
return element != null ? element.getUnderlyingResource() : null;
} catch (JavaModelException e) {
return handle(e);
}
}
}