1 /*===-- CIndexDiagnostic.h - Diagnostics C Interface ------------*- C++ -*-===*\
3 |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|
5 |* See https://llvm.org/LICENSE.txt for license information. *|
6 |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|
8 |*===----------------------------------------------------------------------===*|
10 |* Implements the diagnostic functions of the Clang C interface. *|
12 \*===----------------------------------------------------------------------===*/
13 #ifndef LLVM_CLANG_TOOLS_LIBCLANG_CINDEXDIAGNOSTIC_H
14 #define LLVM_CLANG_TOOLS_LIBCLANG_CINDEXDIAGNOSTIC_H
16 #include "clang-c/Index.h"
24 class StoredDiagnostic
;
25 class CXDiagnosticImpl
;
27 class CXDiagnosticSetImpl
{
28 std::vector
<std::unique_ptr
<CXDiagnosticImpl
>> Diagnostics
;
29 const bool IsExternallyManaged
;
31 CXDiagnosticSetImpl(bool isManaged
= false)
32 : IsExternallyManaged(isManaged
) {}
34 virtual ~CXDiagnosticSetImpl();
36 size_t getNumDiagnostics() const {
37 return Diagnostics
.size();
40 CXDiagnosticImpl
*getDiagnostic(unsigned i
) const {
41 assert(i
< getNumDiagnostics());
42 return Diagnostics
[i
].get();
45 void appendDiagnostic(std::unique_ptr
<CXDiagnosticImpl
> D
);
48 return Diagnostics
.empty();
51 bool isExternallyManaged() const { return IsExternallyManaged
; }
54 class CXDiagnosticImpl
{
56 enum Kind
{ StoredDiagnosticKind
, LoadedDiagnosticKind
,
57 CustomNoteDiagnosticKind
};
59 virtual ~CXDiagnosticImpl();
61 /// Return the severity of the diagnostic.
62 virtual CXDiagnosticSeverity
getSeverity() const = 0;
64 /// Return the location of the diagnostic.
65 virtual CXSourceLocation
getLocation() const = 0;
67 /// Return the spelling of the diagnostic.
68 virtual CXString
getSpelling() const = 0;
70 /// Return the text for the diagnostic option.
71 virtual CXString
getDiagnosticOption(CXString
*Disable
) const = 0;
73 /// Return the category of the diagnostic.
74 virtual unsigned getCategory() const = 0;
76 /// Return the category string of the diagnostic.
77 virtual CXString
getCategoryText() const = 0;
79 /// Return the number of source ranges for the diagnostic.
80 virtual unsigned getNumRanges() const = 0;
82 /// Return the source ranges for the diagnostic.
83 virtual CXSourceRange
getRange(unsigned Range
) const = 0;
85 /// Return the number of FixIts.
86 virtual unsigned getNumFixIts() const = 0;
88 /// Return the FixIt information (source range and inserted text).
89 virtual CXString
getFixIt(unsigned FixIt
,
90 CXSourceRange
*ReplacementRange
) const = 0;
92 Kind
getKind() const { return K
; }
94 CXDiagnosticSetImpl
&getChildDiagnostics() {
99 CXDiagnosticImpl(Kind k
) : K(k
) {}
100 CXDiagnosticSetImpl ChildDiags
;
102 void append(std::unique_ptr
<CXDiagnosticImpl
> D
) {
103 ChildDiags
.appendDiagnostic(std::move(D
));
110 /// The storage behind a CXDiagnostic
111 struct CXStoredDiagnostic
: public CXDiagnosticImpl
{
112 const StoredDiagnostic
&Diag
;
113 const LangOptions
&LangOpts
;
115 CXStoredDiagnostic(const StoredDiagnostic
&Diag
,
116 const LangOptions
&LangOpts
)
117 : CXDiagnosticImpl(StoredDiagnosticKind
),
118 Diag(Diag
), LangOpts(LangOpts
) { }
120 ~CXStoredDiagnostic() override
{}
122 /// Return the severity of the diagnostic.
123 CXDiagnosticSeverity
getSeverity() const override
;
125 /// Return the location of the diagnostic.
126 CXSourceLocation
getLocation() const override
;
128 /// Return the spelling of the diagnostic.
129 CXString
getSpelling() const override
;
131 /// Return the text for the diagnostic option.
132 CXString
getDiagnosticOption(CXString
*Disable
) const override
;
134 /// Return the category of the diagnostic.
135 unsigned getCategory() const override
;
137 /// Return the category string of the diagnostic.
138 CXString
getCategoryText() const override
;
140 /// Return the number of source ranges for the diagnostic.
141 unsigned getNumRanges() const override
;
143 /// Return the source ranges for the diagnostic.
144 CXSourceRange
getRange(unsigned Range
) const override
;
146 /// Return the number of FixIts.
147 unsigned getNumFixIts() const override
;
149 /// Return the FixIt information (source range and inserted text).
150 CXString
getFixIt(unsigned FixIt
,
151 CXSourceRange
*ReplacementRange
) const override
;
153 static bool classof(const CXDiagnosticImpl
*D
) {
154 return D
->getKind() == StoredDiagnosticKind
;
159 CXDiagnosticSetImpl
*lazyCreateDiags(CXTranslationUnit TU
,
160 bool checkIfChanged
= false);
161 } // end namespace cxdiag
163 } // end namespace clang