brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 681bc25 Raw
75 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8//9// This is a concrete diagnostic client, which buffers the diagnostic messages.10//11//===----------------------------------------------------------------------===//12 13#include "clang/Frontend/TextDiagnosticBuffer.h"14#include "clang/Basic/Diagnostic.h"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 are22/// reported.23void TextDiagnosticBuffer::HandleDiagnostic(DiagnosticsEngine::Level Level,24                                            const Diagnostic &Info) {25  // Default implementation (Warnings/errors count).26  DiagnosticConsumer::HandleDiagnostic(Level, Info);27 28  SmallString<100> Buf;29  Info.FormatDiagnostic(Buf);30  switch (Level) {31  default: llvm_unreachable(32                         "Diagnostic not handled during diagnostic buffering!");33  case DiagnosticsEngine::Note:34    All.emplace_back(Level, Notes.size());35    Notes.emplace_back(Info.getLocation(), std::string(Buf));36    break;37  case DiagnosticsEngine::Warning:38    All.emplace_back(Level, Warnings.size());39    Warnings.emplace_back(Info.getLocation(), std::string(Buf));40    break;41  case DiagnosticsEngine::Remark:42    All.emplace_back(Level, Remarks.size());43    Remarks.emplace_back(Info.getLocation(), std::string(Buf));44    break;45  case DiagnosticsEngine::Error:46  case DiagnosticsEngine::Fatal:47    All.emplace_back(Level, Errors.size());48    Errors.emplace_back(Info.getLocation(), std::string(Buf));49    break;50  }51}52 53void TextDiagnosticBuffer::FlushDiagnostics(DiagnosticsEngine &Diags) const {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!");59    case DiagnosticsEngine::Note:60      Diag << Notes[I.second].second;61      break;62    case DiagnosticsEngine::Warning:63      Diag << Warnings[I.second].second;64      break;65    case DiagnosticsEngine::Remark:66      Diag << Remarks[I.second].second;67      break;68    case DiagnosticsEngine::Error:69    case DiagnosticsEngine::Fatal:70      Diag << Errors[I.second].second;71      break;72    }73  }74}75