#include "llvm/DebugInfo/PDB/DIA/DIAError.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"

using namespace llvm;
using namespace llvm::pdb;

// FIXME: This class is only here to support the transition to llvm::Error. It
// will be removed once this transition is complete. Clients should prefer to
// deal with the Error value directly, rather than converting to error_code.
class DIAErrorCategory : public std::error_category {
public:
  const char *name() const noexcept override { return "llvm.pdb.dia"; }

  std::string message(int Condition) const override {
    switch (static_cast<dia_error_code>(Condition)) {
    case dia_error_code::could_not_create_impl:
      return "Failed to connect to DIA at runtime.  Verify that Visual Studio "
             "is properly installed, or that msdiaXX.dll is in your PATH.";
    case dia_error_code::invalid_file_format:
      return "Unable to load PDB.  The file has an unrecognized format.";
    case dia_error_code::invalid_parameter:
      return "The parameter is incorrect.";
    case dia_error_code::already_loaded:
      return "Unable to load the PDB or EXE, because it is already loaded.";
    case dia_error_code::debug_info_mismatch:
      return "The PDB file and the EXE file do not match.";
    case dia_error_code::unspecified:
      return "An unknown error has occurred.";
    }
    llvm_unreachable("Unrecognized DIAErrorCode");
  }
};

static ManagedStatic<DIAErrorCategory> Category;

char DIAError::ID = 0;

DIAError::DIAError(dia_error_code C) : DIAError(C, "") {}

DIAError::DIAError(StringRef Context)
    : DIAError(dia_error_code::unspecified, Context) {}

DIAError::DIAError(dia_error_code C, StringRef Context) : Code(C) {
  ErrMsg = "DIA Error: ";
  std::error_code EC = convertToErrorCode();
  ErrMsg += EC.message() + "  ";
  if (!Context.empty())
    ErrMsg += Context;
}

void DIAError::log(raw_ostream &OS) const { OS << ErrMsg << "\n"; }

StringRef DIAError::getErrorMessage() const { return ErrMsg; }

std::error_code DIAError::convertToErrorCode() const {
  return std::error_code(static_cast<int>(Code), *Category);
}
