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