//===- CodeViewError.cpp - Error extensions for CodeView --------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "llvm/DebugInfo/CodeView/CodeViewError.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"

using namespace llvm;
using namespace llvm::codeview;

namespace {
// 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 CodeViewErrorCategory : public std::error_category {
public:
  const char *name() const noexcept override { return "llvm.codeview"; }

  std::string message(int Condition) const override {
    switch (static_cast<cv_error_code>(Condition)) {
    case cv_error_code::unspecified:
      return "An unknown error has occurred.";
    case cv_error_code::insufficient_buffer:
      return "The buffer is not large enough to read the requested number of "
             "bytes.";
    case cv_error_code::corrupt_record:
      return "The CodeView record is corrupted.";
    case cv_error_code::no_records:
      return "There are no records";
    case cv_error_code::operation_unsupported:
      return "The requested operation is not supported.";
    case cv_error_code::unknown_member_record:
      return "The member record is of an unknown type.";
    }
    llvm_unreachable("Unrecognized cv_error_code");
  }
};
} // end anonymous namespace

static ManagedStatic<CodeViewErrorCategory> Category;

char CodeViewError::ID = 0;

CodeViewError::CodeViewError(cv_error_code C) : CodeViewError(C, "") {}

CodeViewError::CodeViewError(const std::string &Context)
    : CodeViewError(cv_error_code::unspecified, Context) {}

CodeViewError::CodeViewError(cv_error_code C, const std::string &Context)
    : Code(C) {
  ErrMsg = "CodeView Error: ";
  std::error_code EC = convertToErrorCode();
  if (Code != cv_error_code::unspecified)
    ErrMsg += EC.message() + "  ";
  if (!Context.empty())
    ErrMsg += Context;
}

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

const std::string &CodeViewError::getErrorMessage() const { return ErrMsg; }

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