xref: /llvm-project/clang/tools/diagtool/FindDiagnosticID.cpp (revision 6ad0788c332bb2043142954d300c49ac3e537f34)
1ada11923SAlex Lorenz //===- FindDiagnosticID.cpp - diagtool tool for finding diagnostic id -----===//
2ada11923SAlex Lorenz //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ada11923SAlex Lorenz //
7ada11923SAlex Lorenz //===----------------------------------------------------------------------===//
8ada11923SAlex Lorenz 
9ada11923SAlex Lorenz #include "DiagTool.h"
10ada11923SAlex Lorenz #include "DiagnosticNames.h"
11ada11923SAlex Lorenz #include "clang/Basic/AllDiagnostics.h"
12ada11923SAlex Lorenz #include "llvm/Support/CommandLine.h"
13a1580d7bSKazu Hirata #include <optional>
14ada11923SAlex Lorenz 
15ada11923SAlex Lorenz DEF_DIAGTOOL("find-diagnostic-id", "Print the id of the given diagnostic",
16ada11923SAlex Lorenz              FindDiagnosticID)
17ada11923SAlex Lorenz 
18ada11923SAlex Lorenz using namespace clang;
19ada11923SAlex Lorenz using namespace diagtool;
20ada11923SAlex Lorenz 
getNameFromID(StringRef Name)216c2ded87SDon Hinton static StringRef getNameFromID(StringRef Name) {
226c2ded87SDon Hinton   int DiagID;
236c2ded87SDon Hinton   if(!Name.getAsInteger(0, DiagID)) {
246c2ded87SDon Hinton     const DiagnosticRecord &Diag = getDiagnosticForID(DiagID);
256c2ded87SDon Hinton     return Diag.getName();
266c2ded87SDon Hinton   }
276c2ded87SDon Hinton   return StringRef();
286c2ded87SDon Hinton }
296c2ded87SDon Hinton 
30*6ad0788cSKazu Hirata static std::optional<DiagnosticRecord>
findDiagnostic(ArrayRef<DiagnosticRecord> Diagnostics,StringRef Name)31ada11923SAlex Lorenz findDiagnostic(ArrayRef<DiagnosticRecord> Diagnostics, StringRef Name) {
32ada11923SAlex Lorenz   for (const auto &Diag : Diagnostics) {
33ada11923SAlex Lorenz     StringRef DiagName = Diag.getName();
34ada11923SAlex Lorenz     if (DiagName == Name)
35ada11923SAlex Lorenz       return Diag;
36ada11923SAlex Lorenz   }
375891420eSKazu Hirata   return std::nullopt;
38ada11923SAlex Lorenz }
39ada11923SAlex Lorenz 
run(unsigned int argc,char ** argv,llvm::raw_ostream & OS)40ada11923SAlex Lorenz int FindDiagnosticID::run(unsigned int argc, char **argv,
41ada11923SAlex Lorenz                           llvm::raw_ostream &OS) {
42ada11923SAlex Lorenz   static llvm::cl::OptionCategory FindDiagnosticIDOptions(
43ada11923SAlex Lorenz       "diagtool find-diagnostic-id options");
44ada11923SAlex Lorenz 
45ada11923SAlex Lorenz   static llvm::cl::opt<std::string> DiagnosticName(
46ada11923SAlex Lorenz       llvm::cl::Positional, llvm::cl::desc("<diagnostic-name>"),
47ada11923SAlex Lorenz       llvm::cl::Required, llvm::cl::cat(FindDiagnosticIDOptions));
48ada11923SAlex Lorenz 
49ada11923SAlex Lorenz   std::vector<const char *> Args;
506c2ded87SDon Hinton   Args.push_back("diagtool find-diagnostic-id");
51a3c248dbSserge-sans-paille   for (const char *A : llvm::ArrayRef(argv, argc))
52ada11923SAlex Lorenz     Args.push_back(A);
53ada11923SAlex Lorenz 
54ada11923SAlex Lorenz   llvm::cl::HideUnrelatedOptions(FindDiagnosticIDOptions);
55ada11923SAlex Lorenz   llvm::cl::ParseCommandLineOptions((int)Args.size(), Args.data(),
56ada11923SAlex Lorenz                                     "Diagnostic ID mapping utility");
57ada11923SAlex Lorenz 
58ada11923SAlex Lorenz   ArrayRef<DiagnosticRecord> AllDiagnostics = getBuiltinDiagnosticsByName();
59*6ad0788cSKazu Hirata   std::optional<DiagnosticRecord> Diag =
60ada11923SAlex Lorenz       findDiagnostic(AllDiagnostics, DiagnosticName);
61ada11923SAlex Lorenz   if (!Diag) {
626c2ded87SDon Hinton     // Name to id failed, so try id to name.
636c2ded87SDon Hinton     auto Name = getNameFromID(DiagnosticName);
646c2ded87SDon Hinton     if (!Name.empty()) {
656c2ded87SDon Hinton       OS << Name << '\n';
666c2ded87SDon Hinton       return 0;
676c2ded87SDon Hinton     }
686c2ded87SDon Hinton 
69ada11923SAlex Lorenz     llvm::errs() << "error: invalid diagnostic '" << DiagnosticName << "'\n";
70ada11923SAlex Lorenz     return 1;
71ada11923SAlex Lorenz   }
72ada11923SAlex Lorenz   OS << Diag->DiagID << "\n";
73ada11923SAlex Lorenz   return 0;
74ada11923SAlex Lorenz }
75