1 | /*===-- clang-c/CXDiagnostic.h - C Index Diagnostics --------------*- C -*-===*\ |
2 | |* *| |
3 | |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *| |
4 | |* Exceptions. *| |
5 | |* See https://llvm.org/LICENSE.txt for license information. *| |
6 | |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *| |
7 | |* *| |
8 | |*===----------------------------------------------------------------------===*| |
9 | |* *| |
10 | |* This header provides the interface to C Index diagnostics. *| |
11 | |* *| |
12 | \*===----------------------------------------------------------------------===*/ |
13 | |
14 | #ifndef LLVM_CLANG_C_CXDIAGNOSTIC_H |
15 | #define LLVM_CLANG_C_CXDIAGNOSTIC_H |
16 | |
17 | #include "clang-c/CXSourceLocation.h" |
18 | #include "clang-c/CXString.h" |
19 | #include "clang-c/ExternC.h" |
20 | #include "clang-c/Platform.h" |
21 | |
22 | LLVM_CLANG_C_EXTERN_C_BEGIN |
23 | |
24 | /** |
25 | * \defgroup CINDEX_DIAG Diagnostic reporting |
26 | * |
27 | * @{ |
28 | */ |
29 | |
30 | /** |
31 | * Describes the severity of a particular diagnostic. |
32 | */ |
33 | enum CXDiagnosticSeverity { |
34 | /** |
35 | * A diagnostic that has been suppressed, e.g., by a command-line |
36 | * option. |
37 | */ |
38 | CXDiagnostic_Ignored = 0, |
39 | |
40 | /** |
41 | * This diagnostic is a note that should be attached to the |
42 | * previous (non-note) diagnostic. |
43 | */ |
44 | CXDiagnostic_Note = 1, |
45 | |
46 | /** |
47 | * This diagnostic indicates suspicious code that may not be |
48 | * wrong. |
49 | */ |
50 | CXDiagnostic_Warning = 2, |
51 | |
52 | /** |
53 | * This diagnostic indicates that the code is ill-formed. |
54 | */ |
55 | CXDiagnostic_Error = 3, |
56 | |
57 | /** |
58 | * This diagnostic indicates that the code is ill-formed such |
59 | * that future parser recovery is unlikely to produce useful |
60 | * results. |
61 | */ |
62 | CXDiagnostic_Fatal = 4 |
63 | }; |
64 | |
65 | /** |
66 | * A single diagnostic, containing the diagnostic's severity, |
67 | * location, text, source ranges, and fix-it hints. |
68 | */ |
69 | typedef void *CXDiagnostic; |
70 | |
71 | /** |
72 | * A group of CXDiagnostics. |
73 | */ |
74 | typedef void *CXDiagnosticSet; |
75 | |
76 | /** |
77 | * Determine the number of diagnostics in a CXDiagnosticSet. |
78 | */ |
79 | CINDEX_LINKAGE unsigned clang_getNumDiagnosticsInSet(CXDiagnosticSet Diags); |
80 | |
81 | /** |
82 | * Retrieve a diagnostic associated with the given CXDiagnosticSet. |
83 | * |
84 | * \param Diags the CXDiagnosticSet to query. |
85 | * \param Index the zero-based diagnostic number to retrieve. |
86 | * |
87 | * \returns the requested diagnostic. This diagnostic must be freed |
88 | * via a call to \c clang_disposeDiagnostic(). |
89 | */ |
90 | CINDEX_LINKAGE CXDiagnostic clang_getDiagnosticInSet(CXDiagnosticSet Diags, |
91 | unsigned Index); |
92 | |
93 | /** |
94 | * Describes the kind of error that occurred (if any) in a call to |
95 | * \c clang_loadDiagnostics. |
96 | */ |
97 | enum CXLoadDiag_Error { |
98 | /** |
99 | * Indicates that no error occurred. |
100 | */ |
101 | CXLoadDiag_None = 0, |
102 | |
103 | /** |
104 | * Indicates that an unknown error occurred while attempting to |
105 | * deserialize diagnostics. |
106 | */ |
107 | CXLoadDiag_Unknown = 1, |
108 | |
109 | /** |
110 | * Indicates that the file containing the serialized diagnostics |
111 | * could not be opened. |
112 | */ |
113 | CXLoadDiag_CannotLoad = 2, |
114 | |
115 | /** |
116 | * Indicates that the serialized diagnostics file is invalid or |
117 | * corrupt. |
118 | */ |
119 | CXLoadDiag_InvalidFile = 3 |
120 | }; |
121 | |
122 | /** |
123 | * Deserialize a set of diagnostics from a Clang diagnostics bitcode |
124 | * file. |
125 | * |
126 | * \param file The name of the file to deserialize. |
127 | * \param error A pointer to a enum value recording if there was a problem |
128 | * deserializing the diagnostics. |
129 | * \param errorString A pointer to a CXString for recording the error string |
130 | * if the file was not successfully loaded. |
131 | * |
132 | * \returns A loaded CXDiagnosticSet if successful, and NULL otherwise. These |
133 | * diagnostics should be released using clang_disposeDiagnosticSet(). |
134 | */ |
135 | CINDEX_LINKAGE CXDiagnosticSet clang_loadDiagnostics( |
136 | const char *file, enum CXLoadDiag_Error *error, CXString *errorString); |
137 | |
138 | /** |
139 | * Release a CXDiagnosticSet and all of its contained diagnostics. |
140 | */ |
141 | CINDEX_LINKAGE void clang_disposeDiagnosticSet(CXDiagnosticSet Diags); |
142 | |
143 | /** |
144 | * Retrieve the child diagnostics of a CXDiagnostic. |
145 | * |
146 | * This CXDiagnosticSet does not need to be released by |
147 | * clang_disposeDiagnosticSet. |
148 | */ |
149 | CINDEX_LINKAGE CXDiagnosticSet clang_getChildDiagnostics(CXDiagnostic D); |
150 | |
151 | /** |
152 | * Destroy a diagnostic. |
153 | */ |
154 | CINDEX_LINKAGE void clang_disposeDiagnostic(CXDiagnostic Diagnostic); |
155 | |
156 | /** |
157 | * Options to control the display of diagnostics. |
158 | * |
159 | * The values in this enum are meant to be combined to customize the |
160 | * behavior of \c clang_formatDiagnostic(). |
161 | */ |
162 | enum CXDiagnosticDisplayOptions { |
163 | /** |
164 | * Display the source-location information where the |
165 | * diagnostic was located. |
166 | * |
167 | * When set, diagnostics will be prefixed by the file, line, and |
168 | * (optionally) column to which the diagnostic refers. For example, |
169 | * |
170 | * \code |
171 | * test.c:28: warning: extra tokens at end of #endif directive |
172 | * \endcode |
173 | * |
174 | * This option corresponds to the clang flag \c -fshow-source-location. |
175 | */ |
176 | CXDiagnostic_DisplaySourceLocation = 0x01, |
177 | |
178 | /** |
179 | * If displaying the source-location information of the |
180 | * diagnostic, also include the column number. |
181 | * |
182 | * This option corresponds to the clang flag \c -fshow-column. |
183 | */ |
184 | CXDiagnostic_DisplayColumn = 0x02, |
185 | |
186 | /** |
187 | * If displaying the source-location information of the |
188 | * diagnostic, also include information about source ranges in a |
189 | * machine-parsable format. |
190 | * |
191 | * This option corresponds to the clang flag |
192 | * \c -fdiagnostics-print-source-range-info. |
193 | */ |
194 | CXDiagnostic_DisplaySourceRanges = 0x04, |
195 | |
196 | /** |
197 | * Display the option name associated with this diagnostic, if any. |
198 | * |
199 | * The option name displayed (e.g., -Wconversion) will be placed in brackets |
200 | * after the diagnostic text. This option corresponds to the clang flag |
201 | * \c -fdiagnostics-show-option. |
202 | */ |
203 | CXDiagnostic_DisplayOption = 0x08, |
204 | |
205 | /** |
206 | * Display the category number associated with this diagnostic, if any. |
207 | * |
208 | * The category number is displayed within brackets after the diagnostic text. |
209 | * This option corresponds to the clang flag |
210 | * \c -fdiagnostics-show-category=id. |
211 | */ |
212 | CXDiagnostic_DisplayCategoryId = 0x10, |
213 | |
214 | /** |
215 | * Display the category name associated with this diagnostic, if any. |
216 | * |
217 | * The category name is displayed within brackets after the diagnostic text. |
218 | * This option corresponds to the clang flag |
219 | * \c -fdiagnostics-show-category=name. |
220 | */ |
221 | CXDiagnostic_DisplayCategoryName = 0x20 |
222 | }; |
223 | |
224 | /** |
225 | * Format the given diagnostic in a manner that is suitable for display. |
226 | * |
227 | * This routine will format the given diagnostic to a string, rendering |
228 | * the diagnostic according to the various options given. The |
229 | * \c clang_defaultDiagnosticDisplayOptions() function returns the set of |
230 | * options that most closely mimics the behavior of the clang compiler. |
231 | * |
232 | * \param Diagnostic The diagnostic to print. |
233 | * |
234 | * \param Options A set of options that control the diagnostic display, |
235 | * created by combining \c CXDiagnosticDisplayOptions values. |
236 | * |
237 | * \returns A new string containing for formatted diagnostic. |
238 | */ |
239 | CINDEX_LINKAGE CXString clang_formatDiagnostic(CXDiagnostic Diagnostic, |
240 | unsigned Options); |
241 | |
242 | /** |
243 | * Retrieve the set of display options most similar to the |
244 | * default behavior of the clang compiler. |
245 | * |
246 | * \returns A set of display options suitable for use with \c |
247 | * clang_formatDiagnostic(). |
248 | */ |
249 | CINDEX_LINKAGE unsigned clang_defaultDiagnosticDisplayOptions(void); |
250 | |
251 | /** |
252 | * Determine the severity of the given diagnostic. |
253 | */ |
254 | CINDEX_LINKAGE enum CXDiagnosticSeverity |
255 | clang_getDiagnosticSeverity(CXDiagnostic); |
256 | |
257 | /** |
258 | * Retrieve the source location of the given diagnostic. |
259 | * |
260 | * This location is where Clang would print the caret ('^') when |
261 | * displaying the diagnostic on the command line. |
262 | */ |
263 | CINDEX_LINKAGE CXSourceLocation clang_getDiagnosticLocation(CXDiagnostic); |
264 | |
265 | /** |
266 | * Retrieve the text of the given diagnostic. |
267 | */ |
268 | CINDEX_LINKAGE CXString clang_getDiagnosticSpelling(CXDiagnostic); |
269 | |
270 | /** |
271 | * Retrieve the name of the command-line option that enabled this |
272 | * diagnostic. |
273 | * |
274 | * \param Diag The diagnostic to be queried. |
275 | * |
276 | * \param Disable If non-NULL, will be set to the option that disables this |
277 | * diagnostic (if any). |
278 | * |
279 | * \returns A string that contains the command-line option used to enable this |
280 | * warning, such as "-Wconversion" or "-pedantic". |
281 | */ |
282 | CINDEX_LINKAGE CXString clang_getDiagnosticOption(CXDiagnostic Diag, |
283 | CXString *Disable); |
284 | |
285 | /** |
286 | * Retrieve the category number for this diagnostic. |
287 | * |
288 | * Diagnostics can be categorized into groups along with other, related |
289 | * diagnostics (e.g., diagnostics under the same warning flag). This routine |
290 | * retrieves the category number for the given diagnostic. |
291 | * |
292 | * \returns The number of the category that contains this diagnostic, or zero |
293 | * if this diagnostic is uncategorized. |
294 | */ |
295 | CINDEX_LINKAGE unsigned clang_getDiagnosticCategory(CXDiagnostic); |
296 | |
297 | /** |
298 | * Retrieve the name of a particular diagnostic category. This |
299 | * is now deprecated. Use clang_getDiagnosticCategoryText() |
300 | * instead. |
301 | * |
302 | * \param Category A diagnostic category number, as returned by |
303 | * \c clang_getDiagnosticCategory(). |
304 | * |
305 | * \returns The name of the given diagnostic category. |
306 | */ |
307 | CINDEX_DEPRECATED CINDEX_LINKAGE CXString |
308 | clang_getDiagnosticCategoryName(unsigned Category); |
309 | |
310 | /** |
311 | * Retrieve the diagnostic category text for a given diagnostic. |
312 | * |
313 | * \returns The text of the given diagnostic category. |
314 | */ |
315 | CINDEX_LINKAGE CXString clang_getDiagnosticCategoryText(CXDiagnostic); |
316 | |
317 | /** |
318 | * Determine the number of source ranges associated with the given |
319 | * diagnostic. |
320 | */ |
321 | CINDEX_LINKAGE unsigned clang_getDiagnosticNumRanges(CXDiagnostic); |
322 | |
323 | /** |
324 | * Retrieve a source range associated with the diagnostic. |
325 | * |
326 | * A diagnostic's source ranges highlight important elements in the source |
327 | * code. On the command line, Clang displays source ranges by |
328 | * underlining them with '~' characters. |
329 | * |
330 | * \param Diagnostic the diagnostic whose range is being extracted. |
331 | * |
332 | * \param Range the zero-based index specifying which range to |
333 | * |
334 | * \returns the requested source range. |
335 | */ |
336 | CINDEX_LINKAGE CXSourceRange clang_getDiagnosticRange(CXDiagnostic Diagnostic, |
337 | unsigned Range); |
338 | |
339 | /** |
340 | * Determine the number of fix-it hints associated with the |
341 | * given diagnostic. |
342 | */ |
343 | CINDEX_LINKAGE unsigned clang_getDiagnosticNumFixIts(CXDiagnostic Diagnostic); |
344 | |
345 | /** |
346 | * Retrieve the replacement information for a given fix-it. |
347 | * |
348 | * Fix-its are described in terms of a source range whose contents |
349 | * should be replaced by a string. This approach generalizes over |
350 | * three kinds of operations: removal of source code (the range covers |
351 | * the code to be removed and the replacement string is empty), |
352 | * replacement of source code (the range covers the code to be |
353 | * replaced and the replacement string provides the new code), and |
354 | * insertion (both the start and end of the range point at the |
355 | * insertion location, and the replacement string provides the text to |
356 | * insert). |
357 | * |
358 | * \param Diagnostic The diagnostic whose fix-its are being queried. |
359 | * |
360 | * \param FixIt The zero-based index of the fix-it. |
361 | * |
362 | * \param ReplacementRange The source range whose contents will be |
363 | * replaced with the returned replacement string. Note that source |
364 | * ranges are half-open ranges [a, b), so the source code should be |
365 | * replaced from a and up to (but not including) b. |
366 | * |
367 | * \returns A string containing text that should be replace the source |
368 | * code indicated by the \c ReplacementRange. |
369 | */ |
370 | CINDEX_LINKAGE CXString clang_getDiagnosticFixIt( |
371 | CXDiagnostic Diagnostic, unsigned FixIt, CXSourceRange *ReplacementRange); |
372 | |
373 | /** |
374 | * @} |
375 | */ |
376 | |
377 | LLVM_CLANG_C_EXTERN_C_END |
378 | |
379 | #endif |
380 | |