| //===--- 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'; | |
| } |