1/*===-- CIndexDiagnostic.h - Diagnostics C Interface ------------*- 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|* Implements the diagnostic functions of the Clang C interface.              *|
11|*                                                                            *|
12\*===----------------------------------------------------------------------===*/
13#ifndef LLVM_CLANG_CINDEX_DIAGNOSTIC_H
14#define LLVM_CLANG_CINDEX_DIAGNOSTIC_H
15
16#include "clang-c/Index.h"
17#include <vector>
18#include <assert.h>
19
20namespace clang {
21
22class LangOptions;
23class StoredDiagnostic;
24class CXDiagnosticImpl;
25
26class CXDiagnosticSetImpl {
27  std::vector<CXDiagnosticImpl *> Diagnostics;
28  const bool IsExternallyManaged;
29public:
30  CXDiagnosticSetImpl(bool isManaged = false)
31    : IsExternallyManaged(isManaged) {}
32
33  virtual ~CXDiagnosticSetImpl();
34
35  size_t getNumDiagnostics() const {
36    return Diagnostics.size();
37  }
38
39  CXDiagnosticImpl *getDiagnostic(unsigned i) const {
40    assert(i < getNumDiagnostics());
41    return Diagnostics[i];
42  }
43
44  void appendDiagnostic(CXDiagnosticImpl *D) {
45    Diagnostics.push_back(D);
46  }
47
48  bool empty() const {
49    return Diagnostics.empty();
50  }
51
52  bool isExternallyManaged() const { return IsExternallyManaged; }
53};
54
55class CXDiagnosticImpl {
56public:
57  enum Kind { StoredDiagnosticKind, LoadedDiagnosticKind,
58              CustomNoteDiagnosticKind };
59
60  virtual ~CXDiagnosticImpl();
61
62  /// \brief Return the severity of the diagnostic.
63  virtual CXDiagnosticSeverity getSeverity() const = 0;
64
65  /// \brief Return the location of the diagnostic.
66  virtual CXSourceLocation getLocation() const = 0;
67
68  /// \brief Return the spelling of the diagnostic.
69  virtual CXString getSpelling() const = 0;
70
71  /// \brief Return the text for the diagnostic option.
72  virtual CXString getDiagnosticOption(CXString *Disable) const = 0;
73
74  /// \brief Return the category of the diagnostic.
75  virtual unsigned getCategory() const = 0;
76
77  /// \brief Return the category string of the diagnostic.
78  virtual CXString getCategoryText() const = 0;
79
80  /// \brief Return the number of source ranges for the diagnostic.
81  virtual unsigned getNumRanges() const = 0;
82
83  /// \brief Return the source ranges for the diagnostic.
84  virtual CXSourceRange getRange(unsigned Range) const = 0;
85
86  /// \brief Return the number of FixIts.
87  virtual unsigned getNumFixIts() const = 0;
88
89  /// \brief Return the FixIt information (source range and inserted text).
90  virtual CXString getFixIt(unsigned FixIt,
91                            CXSourceRange *ReplacementRange) const = 0;
92
93  Kind getKind() const { return K; }
94
95  CXDiagnosticSetImpl &getChildDiagnostics() {
96    return ChildDiags;
97  }
98
99protected:
100  CXDiagnosticImpl(Kind k) : K(k) {}
101  CXDiagnosticSetImpl ChildDiags;
102
103  void append(CXDiagnosticImpl *D) {
104    ChildDiags.appendDiagnostic(D);
105  }
106
107private:
108  Kind K;
109};
110
111/// \brief The storage behind a CXDiagnostic
112struct CXStoredDiagnostic : public CXDiagnosticImpl {
113  const StoredDiagnostic &Diag;
114  const LangOptions &LangOpts;
115
116  CXStoredDiagnostic(const StoredDiagnostic &Diag,
117                     const LangOptions &LangOpts)
118    : CXDiagnosticImpl(StoredDiagnosticKind),
119      Diag(Diag), LangOpts(LangOpts) { }
120
121  virtual ~CXStoredDiagnostic() {}
122
123  /// \brief Return the severity of the diagnostic.
124  CXDiagnosticSeverity getSeverity() const override;
125
126  /// \brief Return the location of the diagnostic.
127  CXSourceLocation getLocation() const override;
128
129  /// \brief Return the spelling of the diagnostic.
130  CXString getSpelling() const override;
131
132  /// \brief Return the text for the diagnostic option.
133  CXString getDiagnosticOption(CXString *Disable) const override;
134
135  /// \brief Return the category of the diagnostic.
136  unsigned getCategory() const override;
137
138  /// \brief Return the category string of the diagnostic.
139  CXString getCategoryText() const override;
140
141  /// \brief Return the number of source ranges for the diagnostic.
142  unsigned getNumRanges() const override;
143
144  /// \brief Return the source ranges for the diagnostic.
145  CXSourceRange getRange(unsigned Range) const override;
146
147  /// \brief Return the number of FixIts.
148  unsigned getNumFixIts() const override;
149
150  /// \brief Return the FixIt information (source range and inserted text).
151  CXString getFixIt(unsigned FixIt,
152                    CXSourceRange *ReplacementRange) const override;
153
154  static bool classof(const CXDiagnosticImpl *D) {
155    return D->getKind() == StoredDiagnosticKind;
156  }
157};
158
159namespace cxdiag {
160CXDiagnosticSetImpl *lazyCreateDiags(CXTranslationUnit TU,
161                                     bool checkIfChanged = false);
162} // end namespace cxdiag
163
164} // end namespace clang
165
166#endif // LLVM_CLANG_CINDEX_DIAGNOSTIC_H
167