Coverage Report

Created: 2021-09-21 08:58

/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/include/clang/Frontend/TextDiagnostic.h
Line
Count
Source
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
33.4k
                       ArrayRef<FixItHint> Hints) override {
88
33.4k
    emitSnippetAndCaret(Loc, Level, Ranges, Hints);
89
33.4k
  }
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