//===--- TextDiagnosticPrinter.cpp - Diagnostic Printer -------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This diagnostic client prints out their diagnostic messages. // //===----------------------------------------------------------------------===// // // Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/ // //===----------------------------------------------------------------------===// #include "flang/Frontend/TextDiagnosticPrinter.h" #include "flang/Frontend/TextDiagnostic.h" #include "clang/Basic/DiagnosticOptions.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" using namespace Fortran::frontend; TextDiagnosticPrinter::TextDiagnosticPrinter(raw_ostream &diagOs, clang::DiagnosticOptions *diags) : os(diagOs), diagOpts(diags) {} TextDiagnosticPrinter::~TextDiagnosticPrinter() {} void TextDiagnosticPrinter::HandleDiagnostic( clang::DiagnosticsEngine::Level level, const clang::Diagnostic &info) { // Default implementation (Warnings/errors count). DiagnosticConsumer::HandleDiagnostic(level, info); // Render the diagnostic message into a temporary buffer eagerly. We'll use // this later as we print out the diagnostic to the terminal. llvm::SmallString<100> outStr; info.FormatDiagnostic(outStr); llvm::raw_svector_ostream diagMessageStream(outStr); if (!prefix.empty()) os << prefix << ": "; // We only emit diagnostics in contexts that lack valid source locations. assert(!info.getLocation().isValid() && "Diagnostics with valid source location are not supported"); Fortran::frontend::TextDiagnostic::printDiagnosticLevel(os, level, diagOpts->ShowColors); Fortran::frontend::TextDiagnostic::printDiagnosticMessage( os, /*IsSupplemental=*/level == clang::DiagnosticsEngine::Note, diagMessageStream.str(), diagOpts->ShowColors); os.flush(); }