]> granicus.if.org Git - clang/blob - tools/libclang/CIndexDiagnostic.h
Header guard canonicalization, clang part.
[clang] / tools / libclang / CIndexDiagnostic.h
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_TOOLS_LIBCLANG_CINDEXDIAGNOSTIC_H
14 #define LLVM_CLANG_TOOLS_LIBCLANG_CINDEXDIAGNOSTIC_H
15
16 #include "clang-c/Index.h"
17 #include <vector>
18 #include <assert.h>
19
20 namespace clang {
21
22 class LangOptions;
23 class StoredDiagnostic;
24 class CXDiagnosticImpl;
25   
26 class CXDiagnosticSetImpl {
27   std::vector<CXDiagnosticImpl *> Diagnostics;
28   const bool IsExternallyManaged;
29 public:
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
55 class CXDiagnosticImpl {
56 public:
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   
99 protected:
100   CXDiagnosticImpl(Kind k) : K(k) {}
101   CXDiagnosticSetImpl ChildDiags;
102   
103   void append(CXDiagnosticImpl *D) {
104     ChildDiags.appendDiagnostic(D);
105   }
106   
107 private:
108   Kind K;
109 };
110   
111 /// \brief The storage behind a CXDiagnostic
112 struct 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
159 namespace cxdiag {
160 CXDiagnosticSetImpl *lazyCreateDiags(CXTranslationUnit TU,
161                                      bool checkIfChanged = false);
162 } // end namespace cxdiag
163
164 } // end namespace clang
165
166 #endif