1 //===--- TextDiagnostic.cpp - Text Diagnostic Pretty-Printing -------------===// 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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/ 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "flang/Frontend/TextDiagnostic.h" 14 #include "clang/Basic/DiagnosticOptions.h" 15 #include "llvm/Support/raw_ostream.h" 16 17 using namespace Fortran::frontend; 18 19 // TODO: Similar enums are defined in clang/lib/Frontend/TextDiagnostic.cpp. 20 // It would be best to share them 21 static const enum llvm::raw_ostream::Colors noteColor = 22 llvm::raw_ostream::BLACK; 23 static const enum llvm::raw_ostream::Colors remarkColor = 24 llvm::raw_ostream::BLUE; 25 static const enum llvm::raw_ostream::Colors warningColor = 26 llvm::raw_ostream::MAGENTA; 27 static const enum llvm::raw_ostream::Colors errorColor = llvm::raw_ostream::RED; 28 static const enum llvm::raw_ostream::Colors fatalColor = llvm::raw_ostream::RED; 29 // Used for changing only the bold attribute. 30 static const enum llvm::raw_ostream::Colors savedColor = 31 llvm::raw_ostream::SAVEDCOLOR; 32 33 TextDiagnostic::TextDiagnostic() {} 34 35 TextDiagnostic::~TextDiagnostic() {} 36 37 /*static*/ void 38 TextDiagnostic::printDiagnosticLevel(llvm::raw_ostream &os, 39 clang::DiagnosticsEngine::Level level, 40 bool showColors) { 41 if (showColors) { 42 // Print diagnostic category in bold and color 43 switch (level) { 44 case clang::DiagnosticsEngine::Ignored: 45 llvm_unreachable("Invalid diagnostic type"); 46 case clang::DiagnosticsEngine::Note: 47 os.changeColor(noteColor, true); 48 break; 49 case clang::DiagnosticsEngine::Remark: 50 os.changeColor(remarkColor, true); 51 break; 52 case clang::DiagnosticsEngine::Warning: 53 os.changeColor(warningColor, true); 54 break; 55 case clang::DiagnosticsEngine::Error: 56 os.changeColor(errorColor, true); 57 break; 58 case clang::DiagnosticsEngine::Fatal: 59 os.changeColor(fatalColor, true); 60 break; 61 } 62 } 63 64 switch (level) { 65 case clang::DiagnosticsEngine::Ignored: 66 llvm_unreachable("Invalid diagnostic type"); 67 case clang::DiagnosticsEngine::Note: 68 os << "note"; 69 break; 70 case clang::DiagnosticsEngine::Remark: 71 os << "remark"; 72 break; 73 case clang::DiagnosticsEngine::Warning: 74 os << "warning"; 75 break; 76 case clang::DiagnosticsEngine::Error: 77 os << "error"; 78 break; 79 case clang::DiagnosticsEngine::Fatal: 80 os << "fatal error"; 81 break; 82 } 83 84 os << ": "; 85 86 if (showColors) 87 os.resetColor(); 88 } 89 90 /*static*/ 91 void TextDiagnostic::printDiagnosticMessage(llvm::raw_ostream &os, 92 bool isSupplemental, 93 llvm::StringRef message, 94 bool showColors) { 95 if (showColors && !isSupplemental) { 96 // Print primary diagnostic messages in bold and without color. 97 os.changeColor(savedColor, true); 98 } 99 100 os << message; 101 102 if (showColors) 103 os.resetColor(); 104 os << '\n'; 105 } 106