| //===--- 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. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #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 &os, clang::DiagnosticOptions *diags) |
| : os_(os), 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(); |
| return; |
| } |