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