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