//===- ErrorCollector.cpp -------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===-----------------------------------------------------------------------===/

#include "ErrorCollector.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/WithColor.h"
#include "llvm/Support/raw_ostream.h"
#include <vector>

using namespace llvm;
using namespace llvm::elfabi;

void ErrorCollector::escalateToFatal() {
  ErrorsAreFatal = true;
}

void ErrorCollector::addError(Error &&Err, StringRef Tag) {
  if (Err) {
    Errors.push_back(std::move(Err));
    Tags.push_back(Tag.str());
  }
}

Error ErrorCollector::makeError() {
  // TODO: Make this return something (an AggregateError?) that gives more
  // individual control over each error and which might be of interest.
  Error JoinedErrors = Error::success();
  for (Error &E : Errors) {
    JoinedErrors = joinErrors(std::move(JoinedErrors), std::move(E));
  }
  Errors.clear();
  Tags.clear();
  return JoinedErrors;
}

void ErrorCollector::log(raw_ostream &OS) {
  OS << "Encountered multiple errors:\n";
  for (size_t i = 0; i < Errors.size(); ++i) {
    WithColor::error(OS) << "(" << Tags[i] << ") " << Errors[i];
    if (i != Errors.size() - 1)
      OS << "\n";
  }
}

bool ErrorCollector::allErrorsHandled() const {
  return Errors.empty();
}

ErrorCollector::~ErrorCollector() {
  if (ErrorsAreFatal && !allErrorsHandled())
    fatalUnhandledError();

  for (Error &E : Errors) {
    consumeError(std::move(E));
  }
}

LLVM_ATTRIBUTE_NORETURN void ErrorCollector::fatalUnhandledError() {
  errs() << "Program aborted due to unhandled Error(s):\n";
  log(errs());
  errs() << "\n";
  abort();
}
