clang 20.0.0git
TextDiagnosticBuffer.cpp
Go to the documentation of this file.
1//===- TextDiagnosticBuffer.cpp - Buffer Text Diagnostics -----------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This is a concrete diagnostic client, which buffers the diagnostic messages.
10//
11//===----------------------------------------------------------------------===//
12
15#include "clang/Basic/LLVM.h"
16#include "llvm/ADT/SmallString.h"
17#include "llvm/Support/ErrorHandling.h"
18
19using namespace clang;
20
21/// HandleDiagnostic - Store the errors, warnings, and notes that are
22/// reported.
24 const Diagnostic &Info) {
25 // Default implementation (Warnings/errors count).
27
29 Info.FormatDiagnostic(Buf);
30 switch (Level) {
31 default: llvm_unreachable(
32 "Diagnostic not handled during diagnostic buffering!");
34 All.emplace_back(Level, Notes.size());
35 Notes.emplace_back(Info.getLocation(), std::string(Buf));
36 break;
38 All.emplace_back(Level, Warnings.size());
39 Warnings.emplace_back(Info.getLocation(), std::string(Buf));
40 break;
42 All.emplace_back(Level, Remarks.size());
43 Remarks.emplace_back(Info.getLocation(), std::string(Buf));
44 break;
47 All.emplace_back(Level, Errors.size());
48 Errors.emplace_back(Info.getLocation(), std::string(Buf));
49 break;
50 }
51}
52
54 for (const auto &I : All) {
55 auto Diag = Diags.Report(Diags.getCustomDiagID(I.first, "%0"));
56 switch (I.first) {
57 default: llvm_unreachable(
58 "Diagnostic not handled during diagnostic flushing!");
60 Diag << Notes[I.second].second;
61 break;
63 Diag << Warnings[I.second].second;
64 break;
66 Diag << Remarks[I.second].second;
67 break;
70 Diag << Errors[I.second].second;
71 break;
72 }
73 }
74}
Defines the Diagnostic-related interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info)
Handle this diagnostic, reporting it to the user or capturing it to a log as needed.
Definition: Diagnostic.cpp:561
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine) ...
Definition: Diagnostic.h:1571
const SourceLocation & getLocation() const
Definition: Diagnostic.h:1582
void FormatDiagnostic(SmallVectorImpl< char > &OutStr) const
Format this diagnostic into a string, substituting the formal arguments into the %0 slots.
Definition: Diagnostic.cpp:792
Concrete class used by the front-end to report problems and issues.
Definition: Diagnostic.h:192
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Definition: Diagnostic.h:1547
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
Definition: Diagnostic.h:873
Level
The level of the diagnostic, after it has been through mapping.
Definition: Diagnostic.h:195
void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info) override
HandleDiagnostic - Store the errors, warnings, and notes that are reported.
void FlushDiagnostics(DiagnosticsEngine &Diags) const
FlushDiagnostics - Flush the buffered diagnostics to an given diagnostic engine.
The JSON file list parser is used to communicate input to InstallAPI.