xref: /llvm-project/flang/lib/Frontend/TextDiagnostic.cpp (revision 1e462fafdf8be70137c8eaf856f4eb886f8b4d4c)
18d51d37eSAndrzej Warzynski //===--- TextDiagnostic.cpp - Text Diagnostic Pretty-Printing -------------===//
28d51d37eSAndrzej Warzynski //
38d51d37eSAndrzej Warzynski // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48d51d37eSAndrzej Warzynski // See https://llvm.org/LICENSE.txt for license information.
58d51d37eSAndrzej Warzynski // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68d51d37eSAndrzej Warzynski //
78d51d37eSAndrzej Warzynski //===----------------------------------------------------------------------===//
8*1e462fafSAndrzej Warzynski //
9*1e462fafSAndrzej Warzynski // Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/
10*1e462fafSAndrzej Warzynski //
11*1e462fafSAndrzej Warzynski //===----------------------------------------------------------------------===//
128d51d37eSAndrzej Warzynski 
138d51d37eSAndrzej Warzynski #include "flang/Frontend/TextDiagnostic.h"
148d51d37eSAndrzej Warzynski #include "clang/Basic/DiagnosticOptions.h"
158d51d37eSAndrzej Warzynski #include "llvm/Support/raw_ostream.h"
168d51d37eSAndrzej Warzynski 
178d51d37eSAndrzej Warzynski using namespace Fortran::frontend;
188d51d37eSAndrzej Warzynski 
198d51d37eSAndrzej Warzynski // TODO: Similar enums are defined in clang/lib/Frontend/TextDiagnostic.cpp.
208d51d37eSAndrzej Warzynski // It would be best to share them
218d51d37eSAndrzej Warzynski static const enum llvm::raw_ostream::Colors noteColor =
228d51d37eSAndrzej Warzynski     llvm::raw_ostream::BLACK;
238d51d37eSAndrzej Warzynski static const enum llvm::raw_ostream::Colors remarkColor =
248d51d37eSAndrzej Warzynski     llvm::raw_ostream::BLUE;
258d51d37eSAndrzej Warzynski static const enum llvm::raw_ostream::Colors warningColor =
268d51d37eSAndrzej Warzynski     llvm::raw_ostream::MAGENTA;
278d51d37eSAndrzej Warzynski static const enum llvm::raw_ostream::Colors errorColor = llvm::raw_ostream::RED;
288d51d37eSAndrzej Warzynski static const enum llvm::raw_ostream::Colors fatalColor = llvm::raw_ostream::RED;
298d51d37eSAndrzej Warzynski // Used for changing only the bold attribute.
308d51d37eSAndrzej Warzynski static const enum llvm::raw_ostream::Colors savedColor =
318d51d37eSAndrzej Warzynski     llvm::raw_ostream::SAVEDCOLOR;
328d51d37eSAndrzej Warzynski 
TextDiagnostic()338d51d37eSAndrzej Warzynski TextDiagnostic::TextDiagnostic() {}
348d51d37eSAndrzej Warzynski 
~TextDiagnostic()358d51d37eSAndrzej Warzynski TextDiagnostic::~TextDiagnostic() {}
368d51d37eSAndrzej Warzynski 
37*1e462fafSAndrzej Warzynski /*static*/ void
printDiagnosticLevel(llvm::raw_ostream & os,clang::DiagnosticsEngine::Level level,bool showColors)38*1e462fafSAndrzej Warzynski TextDiagnostic::printDiagnosticLevel(llvm::raw_ostream &os,
39*1e462fafSAndrzej Warzynski                                      clang::DiagnosticsEngine::Level level,
40*1e462fafSAndrzej Warzynski                                      bool showColors) {
418d51d37eSAndrzej Warzynski   if (showColors) {
428d51d37eSAndrzej Warzynski     // Print diagnostic category in bold and color
438d51d37eSAndrzej Warzynski     switch (level) {
448d51d37eSAndrzej Warzynski     case clang::DiagnosticsEngine::Ignored:
458d51d37eSAndrzej Warzynski       llvm_unreachable("Invalid diagnostic type");
468d51d37eSAndrzej Warzynski     case clang::DiagnosticsEngine::Note:
478d51d37eSAndrzej Warzynski       os.changeColor(noteColor, true);
488d51d37eSAndrzej Warzynski       break;
498d51d37eSAndrzej Warzynski     case clang::DiagnosticsEngine::Remark:
508d51d37eSAndrzej Warzynski       os.changeColor(remarkColor, true);
518d51d37eSAndrzej Warzynski       break;
528d51d37eSAndrzej Warzynski     case clang::DiagnosticsEngine::Warning:
538d51d37eSAndrzej Warzynski       os.changeColor(warningColor, true);
548d51d37eSAndrzej Warzynski       break;
558d51d37eSAndrzej Warzynski     case clang::DiagnosticsEngine::Error:
568d51d37eSAndrzej Warzynski       os.changeColor(errorColor, true);
578d51d37eSAndrzej Warzynski       break;
588d51d37eSAndrzej Warzynski     case clang::DiagnosticsEngine::Fatal:
598d51d37eSAndrzej Warzynski       os.changeColor(fatalColor, true);
608d51d37eSAndrzej Warzynski       break;
618d51d37eSAndrzej Warzynski     }
628d51d37eSAndrzej Warzynski   }
638d51d37eSAndrzej Warzynski 
648d51d37eSAndrzej Warzynski   switch (level) {
658d51d37eSAndrzej Warzynski   case clang::DiagnosticsEngine::Ignored:
668d51d37eSAndrzej Warzynski     llvm_unreachable("Invalid diagnostic type");
678d51d37eSAndrzej Warzynski   case clang::DiagnosticsEngine::Note:
688d51d37eSAndrzej Warzynski     os << "note";
698d51d37eSAndrzej Warzynski     break;
708d51d37eSAndrzej Warzynski   case clang::DiagnosticsEngine::Remark:
718d51d37eSAndrzej Warzynski     os << "remark";
728d51d37eSAndrzej Warzynski     break;
738d51d37eSAndrzej Warzynski   case clang::DiagnosticsEngine::Warning:
748d51d37eSAndrzej Warzynski     os << "warning";
758d51d37eSAndrzej Warzynski     break;
768d51d37eSAndrzej Warzynski   case clang::DiagnosticsEngine::Error:
778d51d37eSAndrzej Warzynski     os << "error";
788d51d37eSAndrzej Warzynski     break;
798d51d37eSAndrzej Warzynski   case clang::DiagnosticsEngine::Fatal:
808d51d37eSAndrzej Warzynski     os << "fatal error";
818d51d37eSAndrzej Warzynski     break;
828d51d37eSAndrzej Warzynski   }
838d51d37eSAndrzej Warzynski 
848d51d37eSAndrzej Warzynski   os << ": ";
858d51d37eSAndrzej Warzynski 
868d51d37eSAndrzej Warzynski   if (showColors)
878d51d37eSAndrzej Warzynski     os.resetColor();
888d51d37eSAndrzej Warzynski }
898d51d37eSAndrzej Warzynski 
908d51d37eSAndrzej Warzynski /*static*/
printDiagnosticMessage(llvm::raw_ostream & os,bool isSupplemental,llvm::StringRef message,bool showColors)91*1e462fafSAndrzej Warzynski void TextDiagnostic::printDiagnosticMessage(llvm::raw_ostream &os,
92*1e462fafSAndrzej Warzynski                                             bool isSupplemental,
93*1e462fafSAndrzej Warzynski                                             llvm::StringRef message,
94*1e462fafSAndrzej Warzynski                                             bool showColors) {
958d51d37eSAndrzej Warzynski   if (showColors && !isSupplemental) {
968d51d37eSAndrzej Warzynski     // Print primary diagnostic messages in bold and without color.
978d51d37eSAndrzej Warzynski     os.changeColor(savedColor, true);
988d51d37eSAndrzej Warzynski   }
998d51d37eSAndrzej Warzynski 
1008d51d37eSAndrzej Warzynski   os << message;
1018d51d37eSAndrzej Warzynski 
1028d51d37eSAndrzej Warzynski   if (showColors)
1038d51d37eSAndrzej Warzynski     os.resetColor();
1048d51d37eSAndrzej Warzynski   os << '\n';
1058d51d37eSAndrzej Warzynski }
106