xref: /openbsd-src/gnu/llvm/clang/lib/Frontend/TextDiagnosticBuffer.cpp (revision ec727ea710c91afd8ce4f788c5aaa8482b7b69b2)
1e5dd7070Spatrick //===- TextDiagnosticBuffer.cpp - Buffer Text Diagnostics -----------------===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick //
9e5dd7070Spatrick // This is a concrete diagnostic client, which buffers the diagnostic messages.
10e5dd7070Spatrick //
11e5dd7070Spatrick //===----------------------------------------------------------------------===//
12e5dd7070Spatrick 
13e5dd7070Spatrick #include "clang/Frontend/TextDiagnosticBuffer.h"
14e5dd7070Spatrick #include "clang/Basic/Diagnostic.h"
15e5dd7070Spatrick #include "clang/Basic/LLVM.h"
16e5dd7070Spatrick #include "llvm/ADT/SmallString.h"
17e5dd7070Spatrick #include "llvm/Support/ErrorHandling.h"
18e5dd7070Spatrick 
19e5dd7070Spatrick using namespace clang;
20e5dd7070Spatrick 
21e5dd7070Spatrick /// HandleDiagnostic - Store the errors, warnings, and notes that are
22e5dd7070Spatrick /// reported.
HandleDiagnostic(DiagnosticsEngine::Level Level,const Diagnostic & Info)23e5dd7070Spatrick void TextDiagnosticBuffer::HandleDiagnostic(DiagnosticsEngine::Level Level,
24e5dd7070Spatrick                                             const Diagnostic &Info) {
25e5dd7070Spatrick   // Default implementation (Warnings/errors count).
26e5dd7070Spatrick   DiagnosticConsumer::HandleDiagnostic(Level, Info);
27e5dd7070Spatrick 
28e5dd7070Spatrick   SmallString<100> Buf;
29e5dd7070Spatrick   Info.FormatDiagnostic(Buf);
30e5dd7070Spatrick   switch (Level) {
31e5dd7070Spatrick   default: llvm_unreachable(
32e5dd7070Spatrick                          "Diagnostic not handled during diagnostic buffering!");
33e5dd7070Spatrick   case DiagnosticsEngine::Note:
34e5dd7070Spatrick     All.emplace_back(Level, Notes.size());
35*ec727ea7Spatrick     Notes.emplace_back(Info.getLocation(), std::string(Buf.str()));
36e5dd7070Spatrick     break;
37e5dd7070Spatrick   case DiagnosticsEngine::Warning:
38e5dd7070Spatrick     All.emplace_back(Level, Warnings.size());
39*ec727ea7Spatrick     Warnings.emplace_back(Info.getLocation(), std::string(Buf.str()));
40e5dd7070Spatrick     break;
41e5dd7070Spatrick   case DiagnosticsEngine::Remark:
42e5dd7070Spatrick     All.emplace_back(Level, Remarks.size());
43*ec727ea7Spatrick     Remarks.emplace_back(Info.getLocation(), std::string(Buf.str()));
44e5dd7070Spatrick     break;
45e5dd7070Spatrick   case DiagnosticsEngine::Error:
46e5dd7070Spatrick   case DiagnosticsEngine::Fatal:
47e5dd7070Spatrick     All.emplace_back(Level, Errors.size());
48*ec727ea7Spatrick     Errors.emplace_back(Info.getLocation(), std::string(Buf.str()));
49e5dd7070Spatrick     break;
50e5dd7070Spatrick   }
51e5dd7070Spatrick }
52e5dd7070Spatrick 
FlushDiagnostics(DiagnosticsEngine & Diags) const53e5dd7070Spatrick void TextDiagnosticBuffer::FlushDiagnostics(DiagnosticsEngine &Diags) const {
54e5dd7070Spatrick   for (const auto &I : All) {
55e5dd7070Spatrick     auto Diag = Diags.Report(Diags.getCustomDiagID(I.first, "%0"));
56e5dd7070Spatrick     switch (I.first) {
57e5dd7070Spatrick     default: llvm_unreachable(
58e5dd7070Spatrick                            "Diagnostic not handled during diagnostic flushing!");
59e5dd7070Spatrick     case DiagnosticsEngine::Note:
60e5dd7070Spatrick       Diag << Notes[I.second].second;
61e5dd7070Spatrick       break;
62e5dd7070Spatrick     case DiagnosticsEngine::Warning:
63e5dd7070Spatrick       Diag << Warnings[I.second].second;
64e5dd7070Spatrick       break;
65e5dd7070Spatrick     case DiagnosticsEngine::Remark:
66e5dd7070Spatrick       Diag << Remarks[I.second].second;
67e5dd7070Spatrick       break;
68e5dd7070Spatrick     case DiagnosticsEngine::Error:
69e5dd7070Spatrick     case DiagnosticsEngine::Fatal:
70e5dd7070Spatrick       Diag << Errors[I.second].second;
71e5dd7070Spatrick       break;
72e5dd7070Spatrick     }
73e5dd7070Spatrick   }
74e5dd7070Spatrick }
75