package scotch.compiler.error; import static java.lang.Thread.currentThread; import static java.util.Arrays.asList; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.google.common.collect.ImmutableList; import lombok.SneakyThrows; public abstract class SyntaxError { @SneakyThrows private static List<StackTraceElement> formatStackTrace() { List<StackTraceElement> stackTrace = new ArrayList<>(asList(currentThread().getStackTrace())); Iterator<StackTraceElement> iterator = stackTrace.iterator(); while (iterator.hasNext()) { StackTraceElement element = iterator.next(); Class<?> clazz = Class.forName(element.getClassName()); if (clazz == Thread.class || SyntaxError.class.isAssignableFrom(clazz)) { iterator.remove(); } else { break; } } return ImmutableList.copyOf(stackTrace); } private final List<StackTraceElement> stackTrace; public SyntaxError() { this.stackTrace = formatStackTrace(); } @Override public abstract boolean equals(Object o); public List<StackTraceElement> getStackTrace() { return stackTrace; } @Override public abstract int hashCode(); public abstract String prettyPrint(); public abstract String report(String indent, int indentLevel); @Override public String toString() { return prettyPrint(); } }