brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 1f3b86f Raw
79 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// Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/14//15//===----------------------------------------------------------------------===//16 17#include "flang/Frontend/TextDiagnosticBuffer.h"18#include "clang/Basic/Diagnostic.h"19#include "llvm/ADT/SmallString.h"20#include "llvm/Support/ErrorHandling.h"21 22using namespace Fortran::frontend;23 24/// HandleDiagnostic - Store the errors, warnings, and notes that are25/// reported.26void TextDiagnosticBuffer::HandleDiagnostic(27    clang::DiagnosticsEngine::Level level, const clang::Diagnostic &info) {28  // Default implementation (warnings_/errors count).29  DiagnosticConsumer::HandleDiagnostic(level, info);30 31  llvm::SmallString<100> buf;32  info.FormatDiagnostic(buf);33  switch (level) {34  default:35    llvm_unreachable("Diagnostic not handled during diagnostic buffering!");36  case clang::DiagnosticsEngine::Note:37    all.emplace_back(level, notes.size());38    notes.emplace_back(info.getLocation(), std::string(buf));39    break;40  case clang::DiagnosticsEngine::Warning:41    all.emplace_back(level, warnings.size());42    warnings.emplace_back(info.getLocation(), std::string(buf));43    break;44  case clang::DiagnosticsEngine::Remark:45    all.emplace_back(level, remarks.size());46    remarks.emplace_back(info.getLocation(), std::string(buf));47    break;48  case clang::DiagnosticsEngine::Error:49  case clang::DiagnosticsEngine::Fatal:50    all.emplace_back(level, errors.size());51    errors.emplace_back(info.getLocation(), std::string(buf));52    break;53  }54}55 56void TextDiagnosticBuffer::flushDiagnostics(57    clang::DiagnosticsEngine &diags) const {58  for (const auto &i : all) {59    auto diag = diags.Report(diags.getCustomDiagID(i.first, "%0"));60    switch (i.first) {61    default:62      llvm_unreachable("Diagnostic not handled during diagnostic flushing!");63    case clang::DiagnosticsEngine::Note:64      diag << notes[i.second].second;65      break;66    case clang::DiagnosticsEngine::Warning:67      diag << warnings[i.second].second;68      break;69    case clang::DiagnosticsEngine::Remark:70      diag << remarks[i.second].second;71      break;72    case clang::DiagnosticsEngine::Error:73    case clang::DiagnosticsEngine::Fatal:74      diag << errors[i.second].second;75      break;76    }77  }78}79