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