//===-- DiagnosticManager.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 "lldb/Expression/DiagnosticManager.h"

#include "llvm/Support/ErrorHandling.h"

#include "lldb/Utility/Log.h"
#include "lldb/Utility/StreamString.h"

using namespace lldb_private;

void DiagnosticManager::Dump(Log *log) {
  if (!log)
    return;

  std::string str = GetString();

  // GetString() puts a separator after each diagnostic. We want to remove the
  // last '\n' because log->PutCString will add one for us.

  if (str.size() && str.back() == '\n') {
    str.pop_back();
  }

  log->PutCString(str.c_str());
}

static const char *StringForSeverity(DiagnosticSeverity severity) {
  switch (severity) {
  // this should be exhaustive
  case lldb_private::eDiagnosticSeverityError:
    return "error: ";
  case lldb_private::eDiagnosticSeverityWarning:
    return "warning: ";
  case lldb_private::eDiagnosticSeverityRemark:
    return "";
  }
  llvm_unreachable("switch needs another case for DiagnosticSeverity enum");
}

std::string DiagnosticManager::GetString(char separator) {
  std::string ret;

  for (const auto &diagnostic : Diagnostics()) {
    ret.append(StringForSeverity(diagnostic->GetSeverity()));
    ret.append(std::string(diagnostic->GetMessage()));
    ret.push_back(separator);
  }

  return ret;
}

size_t DiagnosticManager::Printf(DiagnosticSeverity severity,
                                 const char *format, ...) {
  StreamString ss;

  va_list args;
  va_start(args, format);
  size_t result = ss.PrintfVarArg(format, args);
  va_end(args);

  AddDiagnostic(ss.GetString(), severity, eDiagnosticOriginLLDB);

  return result;
}

void DiagnosticManager::PutString(DiagnosticSeverity severity,
                                  llvm::StringRef str) {
  if (str.empty())
    return;
  AddDiagnostic(str, severity, eDiagnosticOriginLLDB);
}
