xref: /llvm-project/flang/lib/Frontend/TextDiagnostic.cpp (revision 1e462fafdf8be70137c8eaf856f4eb886f8b4d4c)
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 
TextDiagnostic()33 TextDiagnostic::TextDiagnostic() {}
34 
~TextDiagnostic()35 TextDiagnostic::~TextDiagnostic() {}
36 
37 /*static*/ void
printDiagnosticLevel(llvm::raw_ostream & os,clang::DiagnosticsEngine::Level level,bool showColors)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*/
printDiagnosticMessage(llvm::raw_ostream & os,bool isSupplemental,llvm::StringRef message,bool showColors)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