blob: 9f406987ebf1ab0c7bef433523c2c004dafe0273 [file] [log] [blame]
Douglas Gregorac0605e2010-01-28 06:00:51 +00001/*===-- CIndexDiagnostic.h - Diagnostics C Interface ------------*- C++ -*-===*\
Douglas Gregor4f9c3762010-01-28 00:27:43 +00002|* *|
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\*===----------------------------------------------------------------------===*/
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +000013#ifndef LLVM_CLANG_TOOLS_LIBCLANG_CINDEXDIAGNOSTIC_H
14#define LLVM_CLANG_TOOLS_LIBCLANG_CINDEXDIAGNOSTIC_H
Douglas Gregor4f9c3762010-01-28 00:27:43 +000015
Ted Kremenekbb2c7102011-10-31 21:40:19 +000016#include "clang-c/Index.h"
David Blaikie759548b2014-08-29 18:43:24 +000017#include <memory>
Ted Kremenekd010ba42011-11-10 08:43:12 +000018#include <vector>
19#include <assert.h>
Ted Kremenekbb2c7102011-10-31 21:40:19 +000020
Douglas Gregor4f9c3762010-01-28 00:27:43 +000021namespace clang {
22
Daniel Dunbar854d36b2010-01-30 23:31:40 +000023class LangOptions;
Benjamin Kramer064414532010-04-12 19:45:50 +000024class StoredDiagnostic;
Ted Kremenekd010ba42011-11-10 08:43:12 +000025class CXDiagnosticImpl;
26
27class CXDiagnosticSetImpl {
David Blaikie759548b2014-08-29 18:43:24 +000028 std::vector<std::unique_ptr<CXDiagnosticImpl>> Diagnostics;
Ted Kremenekd010ba42011-11-10 08:43:12 +000029 const bool IsExternallyManaged;
30public:
31 CXDiagnosticSetImpl(bool isManaged = false)
32 : IsExternallyManaged(isManaged) {}
33
34 virtual ~CXDiagnosticSetImpl();
David Blaikie759548b2014-08-29 18:43:24 +000035
Ted Kremenekd010ba42011-11-10 08:43:12 +000036 size_t getNumDiagnostics() const {
37 return Diagnostics.size();
38 }
39
40 CXDiagnosticImpl *getDiagnostic(unsigned i) const {
41 assert(i < getNumDiagnostics());
David Blaikie759548b2014-08-29 18:43:24 +000042 return Diagnostics[i].get();
Ted Kremenekd010ba42011-11-10 08:43:12 +000043 }
David Blaikie759548b2014-08-29 18:43:24 +000044
45 void appendDiagnostic(std::unique_ptr<CXDiagnosticImpl> D);
46
Ted Kremenekd010ba42011-11-10 08:43:12 +000047 bool empty() const {
48 return Diagnostics.empty();
49 }
50
51 bool isExternallyManaged() const { return IsExternallyManaged; }
52};
Daniel Dunbar9ee3a922010-01-30 23:31:49 +000053
Ted Kremenekbb2c7102011-10-31 21:40:19 +000054class CXDiagnosticImpl {
55public:
Ted Kremenek914c7e62012-02-14 02:46:03 +000056 enum Kind { StoredDiagnosticKind, LoadedDiagnosticKind,
57 CustomNoteDiagnosticKind };
Ted Kremenekbb2c7102011-10-31 21:40:19 +000058
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;
Ted Kremenek26a6d492012-04-12 00:03:31 +000075
76 /// \brief Return the category string of the diagnostic.
77 virtual CXString getCategoryText() const = 0;
78
Ted Kremenekbb2c7102011-10-31 21:40:19 +000079 /// \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
92 Kind getKind() const { return K; }
Ted Kremenekd010ba42011-11-10 08:43:12 +000093
94 CXDiagnosticSetImpl &getChildDiagnostics() {
95 return ChildDiags;
96 }
97
Ted Kremenekbb2c7102011-10-31 21:40:19 +000098protected:
99 CXDiagnosticImpl(Kind k) : K(k) {}
Ted Kremenekd010ba42011-11-10 08:43:12 +0000100 CXDiagnosticSetImpl ChildDiags;
David Blaikie759548b2014-08-29 18:43:24 +0000101
102 void append(std::unique_ptr<CXDiagnosticImpl> D) {
103 ChildDiags.appendDiagnostic(std::move(D));
Ted Kremenekd010ba42011-11-10 08:43:12 +0000104 }
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000105
106private:
107 Kind K;
108};
109
Douglas Gregor33cdd812010-02-18 18:08:43 +0000110/// \brief The storage behind a CXDiagnostic
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000111struct CXStoredDiagnostic : public CXDiagnosticImpl {
Douglas Gregor33cdd812010-02-18 18:08:43 +0000112 const StoredDiagnostic &Diag;
113 const LangOptions &LangOpts;
114
115 CXStoredDiagnostic(const StoredDiagnostic &Diag,
116 const LangOptions &LangOpts)
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000117 : CXDiagnosticImpl(StoredDiagnosticKind),
118 Diag(Diag), LangOpts(LangOpts) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +0000119
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000120 ~CXStoredDiagnostic() override {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +0000121
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000122 /// \brief Return the severity of the diagnostic.
Craig Topper36835562014-03-15 07:47:46 +0000123 CXDiagnosticSeverity getSeverity() const override;
124
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000125 /// \brief Return the location of the diagnostic.
Craig Topper36835562014-03-15 07:47:46 +0000126 CXSourceLocation getLocation() const override;
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000127
128 /// \brief Return the spelling of the diagnostic.
Craig Topper36835562014-03-15 07:47:46 +0000129 CXString getSpelling() const override;
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000130
131 /// \brief Return the text for the diagnostic option.
Craig Topper36835562014-03-15 07:47:46 +0000132 CXString getDiagnosticOption(CXString *Disable) const override;
133
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000134 /// \brief Return the category of the diagnostic.
Craig Topper36835562014-03-15 07:47:46 +0000135 unsigned getCategory() const override;
136
Ted Kremenek26a6d492012-04-12 00:03:31 +0000137 /// \brief Return the category string of the diagnostic.
Craig Topper36835562014-03-15 07:47:46 +0000138 CXString getCategoryText() const override;
Ted Kremenek26a6d492012-04-12 00:03:31 +0000139
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000140 /// \brief Return the number of source ranges for the diagnostic.
Craig Topper36835562014-03-15 07:47:46 +0000141 unsigned getNumRanges() const override;
142
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000143 /// \brief Return the source ranges for the diagnostic.
Craig Topper36835562014-03-15 07:47:46 +0000144 CXSourceRange getRange(unsigned Range) const override;
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000145
146 /// \brief Return the number of FixIts.
Craig Topper36835562014-03-15 07:47:46 +0000147 unsigned getNumFixIts() const override;
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000148
149 /// \brief Return the FixIt information (source range and inserted text).
Craig Topper36835562014-03-15 07:47:46 +0000150 CXString getFixIt(unsigned FixIt,
151 CXSourceRange *ReplacementRange) const override;
Ted Kremenekbb2c7102011-10-31 21:40:19 +0000152
153 static bool classof(const CXDiagnosticImpl *D) {
154 return D->getKind() == StoredDiagnosticKind;
155 }
Douglas Gregor4f9c3762010-01-28 00:27:43 +0000156};
Douglas Gregorac0605e2010-01-28 06:00:51 +0000157
Argyrios Kyrtzidisf2d99b02011-12-01 02:42:50 +0000158namespace cxdiag {
159CXDiagnosticSetImpl *lazyCreateDiags(CXTranslationUnit TU,
160 bool checkIfChanged = false);
161} // end namespace cxdiag
162
Douglas Gregor4f9c3762010-01-28 00:27:43 +0000163} // end namespace clang
164
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +0000165#endif