1 //===--- TextDiagnostic.h - Text Diagnostic Pretty-Printing -----*- C++ -*-===// 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 // This is a utility class that provides support for textual pretty-printing of 10 // diagnostics. It is used to implement the different code paths which require 11 // such functionality in a consistent way. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CLANG_FRONTEND_TEXTDIAGNOSTIC_H 16 #define LLVM_CLANG_FRONTEND_TEXTDIAGNOSTIC_H 17 18 #include "clang/Frontend/DiagnosticRenderer.h" 19 20 namespace clang { 21 22 /// Class to encapsulate the logic for formatting and printing a textual 23 /// diagnostic message. 24 /// 25 /// This class provides an interface for building and emitting a textual 26 /// diagnostic, including all of the macro backtraces, caret diagnostics, FixIt 27 /// Hints, and code snippets. In the presence of macros this involves 28 /// a recursive process, synthesizing notes for each macro expansion. 29 /// 30 /// The purpose of this class is to isolate the implementation of printing 31 /// beautiful text diagnostics from any particular interfaces. The Clang 32 /// DiagnosticClient is implemented through this class as is diagnostic 33 /// printing coming out of libclang. 34 class TextDiagnostic : public DiagnosticRenderer { 35 raw_ostream &OS; 36 37 public: 38 TextDiagnostic(raw_ostream &OS, 39 const LangOptions &LangOpts, 40 DiagnosticOptions *DiagOpts); 41 42 ~TextDiagnostic() override; 43 44 /// Print the diagonstic level to a raw_ostream. 45 /// 46 /// This is a static helper that handles colorizing the level and formatting 47 /// it into an arbitrary output stream. This is used internally by the 48 /// TextDiagnostic emission code, but it can also be used directly by 49 /// consumers that don't have a source manager or other state that the full 50 /// TextDiagnostic logic requires. 51 static void printDiagnosticLevel(raw_ostream &OS, 52 DiagnosticsEngine::Level Level, 53 bool ShowColors); 54 55 /// Pretty-print a diagnostic message to a raw_ostream. 56 /// 57 /// This is a static helper to handle the line wrapping, colorizing, and 58 /// rendering of a diagnostic message to a particular ostream. It is 59 /// publicly visible so that clients which do not have sufficient state to 60 /// build a complete TextDiagnostic object can still get consistent 61 /// formatting of their diagnostic messages. 62 /// 63 /// \param OS Where the message is printed 64 /// \param IsSupplemental true if this is a continuation note diagnostic 65 /// \param Message The text actually printed 66 /// \param CurrentColumn The starting column of the first line, accounting 67 /// for any prefix. 68 /// \param Columns The number of columns to use in line-wrapping, 0 disables 69 /// all line-wrapping. 70 /// \param ShowColors Enable colorizing of the message. 71 static void printDiagnosticMessage(raw_ostream &OS, bool IsSupplemental, 72 StringRef Message, unsigned CurrentColumn, 73 unsigned Columns, bool ShowColors); 74 75 protected: 76 void emitDiagnosticMessage(FullSourceLoc Loc, PresumedLoc PLoc, 77 DiagnosticsEngine::Level Level, StringRef Message, 78 ArrayRef<CharSourceRange> Ranges, 79 DiagOrStoredDiag D) override; 80 81 void emitDiagnosticLoc(FullSourceLoc Loc, PresumedLoc PLoc, 82 DiagnosticsEngine::Level Level, 83 ArrayRef<CharSourceRange> Ranges) override; 84 85 void emitCodeContext(FullSourceLoc Loc, DiagnosticsEngine::Level Level, 86 SmallVectorImpl<CharSourceRange> &Ranges, 87 ArrayRef<FixItHint> Hints) override { 88 emitSnippetAndCaret(Loc, Level, Ranges, Hints); 89 } 90 91 void emitIncludeLocation(FullSourceLoc Loc, PresumedLoc PLoc) override; 92 93 void emitImportLocation(FullSourceLoc Loc, PresumedLoc PLoc, 94 StringRef ModuleName) override; 95 96 void emitBuildingModuleLocation(FullSourceLoc Loc, PresumedLoc PLoc, 97 StringRef ModuleName) override; 98 99 private: 100 void emitFilename(StringRef Filename, const SourceManager &SM); 101 102 void emitSnippetAndCaret(FullSourceLoc Loc, DiagnosticsEngine::Level Level, 103 SmallVectorImpl<CharSourceRange> &Ranges, 104 ArrayRef<FixItHint> Hints); 105 106 void emitSnippet(StringRef SourceLine); 107 108 void emitParseableFixits(ArrayRef<FixItHint> Hints, const SourceManager &SM); 109 }; 110 111 } // end namespace clang 112 113 #endif 114