in src/_Private/VerboseCLIOutput.hack [76:114]
private async function writeFailureDetailsAsync(
<<__AcceptDisposable>> IO\WriteHandle $handle,
): Awaitable<void> {
$error_id = 0;
foreach ($this->getErrors() as $event) {
$ex = $event->getException();
$error_id++;
$header = $this->getMessageHeaderForErrorDetails($error_id, $event);
if ($event is HackTest\TestSkippedProgressEvent) {
await $handle->writeAllAsync($header.'Skipped: '.$ex->getMessage());
return;
}
$it = $ex;
$message = '';
while ($it) {
$message .= Str\format(
"%s\n\n@ %s(%d)\n%s",
$it->getMessage(),
$it->getFile(),
$it->getLine(),
$it->getTraceAsString(),
);
$it = $it->getPrevious();
if ($it !== null) {
$message .= "\n\nPrevious exception:\n\n";
}
}
if ($event is HackTest\FileProgressEvent) {
$file = $event->getPath();
$context = $this->getPrettyContext($ex, $file);
if ($context is nonnull) {
$message .= "\n\n".$context;
}
}
await $handle->writeAllAsync($header.$message);
}
}