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