//===--- TextDiagnostic.cpp - Text Diagnostic Pretty-Printing -------------===// // // 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 // //===----------------------------------------------------------------------===// // // Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/ // //===----------------------------------------------------------------------===// #include "flang/Frontend/TextDiagnostic.h" #include "clang/Basic/DiagnosticOptions.h" #include "llvm/Support/raw_ostream.h" using namespace Fortran::frontend; // TODO: Similar enums are defined in clang/lib/Frontend/TextDiagnostic.cpp. // It would be best to share them static const enum llvm::raw_ostream::Colors noteColor = llvm::raw_ostream::BLACK; static const enum llvm::raw_ostream::Colors remarkColor = llvm::raw_ostream::BLUE; static const enum llvm::raw_ostream::Colors warningColor = llvm::raw_ostream::MAGENTA; static const enum llvm::raw_ostream::Colors errorColor = llvm::raw_ostream::RED; static const enum llvm::raw_ostream::Colors fatalColor = llvm::raw_ostream::RED; // Used for changing only the bold attribute. static const enum llvm::raw_ostream::Colors savedColor = llvm::raw_ostream::SAVEDCOLOR; TextDiagnostic::TextDiagnostic() {} TextDiagnostic::~TextDiagnostic() {} /*static*/ void TextDiagnostic::printDiagnosticLevel(llvm::raw_ostream &os, clang::DiagnosticsEngine::Level level, bool showColors) { if (showColors) { // Print diagnostic category in bold and color switch (level) { case clang::DiagnosticsEngine::Ignored: llvm_unreachable("Invalid diagnostic type"); case clang::DiagnosticsEngine::Note: os.changeColor(noteColor, true); break; case clang::DiagnosticsEngine::Remark: os.changeColor(remarkColor, true); break; case clang::DiagnosticsEngine::Warning: os.changeColor(warningColor, true); break; case clang::DiagnosticsEngine::Error: os.changeColor(errorColor, true); break; case clang::DiagnosticsEngine::Fatal: os.changeColor(fatalColor, true); break; } } switch (level) { case clang::DiagnosticsEngine::Ignored: llvm_unreachable("Invalid diagnostic type"); case clang::DiagnosticsEngine::Note: os << "note"; break; case clang::DiagnosticsEngine::Remark: os << "remark"; break; case clang::DiagnosticsEngine::Warning: os << "warning"; break; case clang::DiagnosticsEngine::Error: os << "error"; break; case clang::DiagnosticsEngine::Fatal: os << "fatal error"; break; } os << ": "; if (showColors) os.resetColor(); } /*static*/ void TextDiagnostic::printDiagnosticMessage(llvm::raw_ostream &os, bool isSupplemental, llvm::StringRef message, bool showColors) { if (showColors && !isSupplemental) { // Print primary diagnostic messages in bold and without color. os.changeColor(savedColor, true); } os << message; if (showColors) os.resetColor(); os << '\n'; }