//===- FindDiagnosticID.cpp - diagtool tool for finding diagnostic id -----===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "DiagTool.h"
#include "DiagnosticNames.h"
#include "clang/Basic/AllDiagnostics.h"
#include "llvm/Support/CommandLine.h"

DEF_DIAGTOOL("find-diagnostic-id", "Print the id of the given diagnostic",
             FindDiagnosticID)

using namespace clang;
using namespace diagtool;

static StringRef getNameFromID(StringRef Name) {
  int DiagID;
  if(!Name.getAsInteger(0, DiagID)) {
    const DiagnosticRecord &Diag = getDiagnosticForID(DiagID);
    return Diag.getName();
  }
  return StringRef();
}

static Optional<DiagnosticRecord>
findDiagnostic(ArrayRef<DiagnosticRecord> Diagnostics, StringRef Name) {
  for (const auto &Diag : Diagnostics) {
    StringRef DiagName = Diag.getName();
    if (DiagName == Name)
      return Diag;
  }
  return None;
}

int FindDiagnosticID::run(unsigned int argc, char **argv,
                          llvm::raw_ostream &OS) {
  static llvm::cl::OptionCategory FindDiagnosticIDOptions(
      "diagtool find-diagnostic-id options");

  static llvm::cl::opt<std::string> DiagnosticName(
      llvm::cl::Positional, llvm::cl::desc("<diagnostic-name>"),
      llvm::cl::Required, llvm::cl::cat(FindDiagnosticIDOptions));

  std::vector<const char *> Args;
  Args.push_back("diagtool find-diagnostic-id");
  for (const char *A : llvm::makeArrayRef(argv, argc))
    Args.push_back(A);

  llvm::cl::HideUnrelatedOptions(FindDiagnosticIDOptions);
  llvm::cl::ParseCommandLineOptions((int)Args.size(), Args.data(),
                                    "Diagnostic ID mapping utility");

  ArrayRef<DiagnosticRecord> AllDiagnostics = getBuiltinDiagnosticsByName();
  Optional<DiagnosticRecord> Diag =
      findDiagnostic(AllDiagnostics, DiagnosticName);
  if (!Diag) {
    // Name to id failed, so try id to name.
    auto Name = getNameFromID(DiagnosticName);
    if (!Name.empty()) {
      OS << Name << '\n';
      return 0;
    }

    llvm::errs() << "error: invalid diagnostic '" << DiagnosticName << "'\n";
    return 1;
  }
  OS << Diag->DiagID << "\n";
  return 0;
}
