Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.