/*===-- clang-c/CXDiagnostic.h - C Index Diagnostics --------------*- C -*-===*\
 
|*                                                                            *|
 
|* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
 
|* Exceptions.                                                                *|
 
|* See https://llvm.org/LICENSE.txt for license information.                  *|
 
|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
 
|*                                                                            *|
 
|*===----------------------------------------------------------------------===*|
 
|*                                                                            *|
 
|* This header provides the interface to C Index diagnostics.                 *|
 
|*                                                                            *|
 
\*===----------------------------------------------------------------------===*/
 
 
 
#ifndef LLVM_CLANG_C_CXDIAGNOSTIC_H
 
#define LLVM_CLANG_C_CXDIAGNOSTIC_H
 
 
 
#include "clang-c/CXSourceLocation.h"
 
#include "clang-c/CXString.h"
 
#include "clang-c/ExternC.h"
 
#include "clang-c/Platform.h"
 
 
 
LLVM_CLANG_C_EXTERN_C_BEGIN
 
 
 
/**
 
 * \defgroup CINDEX_DIAG Diagnostic reporting
 
 *
 
 * @{
 
 */
 
 
 
/**
 
 * Describes the severity of a particular diagnostic.
 
 */
 
enum CXDiagnosticSeverity {
 
  /**
 
   * A diagnostic that has been suppressed, e.g., by a command-line
 
   * option.
 
   */
 
  CXDiagnostic_Ignored = 0,
 
 
 
  /**
 
   * This diagnostic is a note that should be attached to the
 
   * previous (non-note) diagnostic.
 
   */
 
  CXDiagnostic_Note = 1,
 
 
 
  /**
 
   * This diagnostic indicates suspicious code that may not be
 
   * wrong.
 
   */
 
  CXDiagnostic_Warning = 2,
 
 
 
  /**
 
   * This diagnostic indicates that the code is ill-formed.
 
   */
 
  CXDiagnostic_Error = 3,
 
 
 
  /**
 
   * This diagnostic indicates that the code is ill-formed such
 
   * that future parser recovery is unlikely to produce useful
 
   * results.
 
   */
 
  CXDiagnostic_Fatal = 4
 
};
 
 
 
/**
 
 * A single diagnostic, containing the diagnostic's severity,
 
 * location, text, source ranges, and fix-it hints.
 
 */
 
typedef void *CXDiagnostic;
 
 
 
/**
 
 * A group of CXDiagnostics.
 
 */
 
typedef void *CXDiagnosticSet;
 
 
 
/**
 
 * Determine the number of diagnostics in a CXDiagnosticSet.
 
 */
 
CINDEX_LINKAGE unsigned clang_getNumDiagnosticsInSet(CXDiagnosticSet Diags);
 
 
 
/**
 
 * Retrieve a diagnostic associated with the given CXDiagnosticSet.
 
 *
 
 * \param Diags the CXDiagnosticSet to query.
 
 * \param Index the zero-based diagnostic number to retrieve.
 
 *
 
 * \returns the requested diagnostic. This diagnostic must be freed
 
 * via a call to \c clang_disposeDiagnostic().
 
 */
 
CINDEX_LINKAGE CXDiagnostic clang_getDiagnosticInSet(CXDiagnosticSet Diags,
 
                                                     unsigned Index);
 
 
 
/**
 
 * Describes the kind of error that occurred (if any) in a call to
 
 * \c clang_loadDiagnostics.
 
 */
 
enum CXLoadDiag_Error {
 
  /**
 
   * Indicates that no error occurred.
 
   */
 
  CXLoadDiag_None = 0,
 
 
 
  /**
 
   * Indicates that an unknown error occurred while attempting to
 
   * deserialize diagnostics.
 
   */
 
  CXLoadDiag_Unknown = 1,
 
 
 
  /**
 
   * Indicates that the file containing the serialized diagnostics
 
   * could not be opened.
 
   */
 
  CXLoadDiag_CannotLoad = 2,
 
 
 
  /**
 
   * Indicates that the serialized diagnostics file is invalid or
 
   * corrupt.
 
   */
 
  CXLoadDiag_InvalidFile = 3
 
};
 
 
 
/**
 
 * Deserialize a set of diagnostics from a Clang diagnostics bitcode
 
 * file.
 
 *
 
 * \param file The name of the file to deserialize.
 
 * \param error A pointer to a enum value recording if there was a problem
 
 *        deserializing the diagnostics.
 
 * \param errorString A pointer to a CXString for recording the error string
 
 *        if the file was not successfully loaded.
 
 *
 
 * \returns A loaded CXDiagnosticSet if successful, and NULL otherwise.  These
 
 * diagnostics should be released using clang_disposeDiagnosticSet().
 
 */
 
CINDEX_LINKAGE CXDiagnosticSet clang_loadDiagnostics(
 
    const char *file, enum CXLoadDiag_Error *error, CXString *errorString);
 
 
 
/**
 
 * Release a CXDiagnosticSet and all of its contained diagnostics.
 
 */
 
CINDEX_LINKAGE void clang_disposeDiagnosticSet(CXDiagnosticSet Diags);
 
 
 
/**
 
 * Retrieve the child diagnostics of a CXDiagnostic.
 
 *
 
 * This CXDiagnosticSet does not need to be released by
 
 * clang_disposeDiagnosticSet.
 
 */
 
CINDEX_LINKAGE CXDiagnosticSet clang_getChildDiagnostics(CXDiagnostic D);
 
 
 
/**
 
 * Destroy a diagnostic.
 
 */
 
CINDEX_LINKAGE void clang_disposeDiagnostic(CXDiagnostic Diagnostic);
 
 
 
/**
 
 * Options to control the display of diagnostics.
 
 *
 
 * The values in this enum are meant to be combined to customize the
 
 * behavior of \c clang_formatDiagnostic().
 
 */
 
enum CXDiagnosticDisplayOptions {
 
  /**
 
   * Display the source-location information where the
 
   * diagnostic was located.
 
   *
 
   * When set, diagnostics will be prefixed by the file, line, and
 
   * (optionally) column to which the diagnostic refers. For example,
 
   *
 
   * \code
 
   * test.c:28: warning: extra tokens at end of #endif directive
 
   * \endcode
 
   *
 
   * This option corresponds to the clang flag \c -fshow-source-location.
 
   */
 
  CXDiagnostic_DisplaySourceLocation = 0x01,
 
 
 
  /**
 
   * If displaying the source-location information of the
 
   * diagnostic, also include the column number.
 
   *
 
   * This option corresponds to the clang flag \c -fshow-column.
 
   */
 
  CXDiagnostic_DisplayColumn = 0x02,
 
 
 
  /**
 
   * If displaying the source-location information of the
 
   * diagnostic, also include information about source ranges in a
 
   * machine-parsable format.
 
   *
 
   * This option corresponds to the clang flag
 
   * \c -fdiagnostics-print-source-range-info.
 
   */
 
  CXDiagnostic_DisplaySourceRanges = 0x04,
 
 
 
  /**
 
   * Display the option name associated with this diagnostic, if any.
 
   *
 
   * The option name displayed (e.g., -Wconversion) will be placed in brackets
 
   * after the diagnostic text. This option corresponds to the clang flag
 
   * \c -fdiagnostics-show-option.
 
   */
 
  CXDiagnostic_DisplayOption = 0x08,
 
 
 
  /**
 
   * Display the category number associated with this diagnostic, if any.
 
   *
 
   * The category number is displayed within brackets after the diagnostic text.
 
   * This option corresponds to the clang flag
 
   * \c -fdiagnostics-show-category=id.
 
   */
 
  CXDiagnostic_DisplayCategoryId = 0x10,
 
 
 
  /**
 
   * Display the category name associated with this diagnostic, if any.
 
   *
 
   * The category name is displayed within brackets after the diagnostic text.
 
   * This option corresponds to the clang flag
 
   * \c -fdiagnostics-show-category=name.
 
   */
 
  CXDiagnostic_DisplayCategoryName = 0x20
 
};
 
 
 
/**
 
 * Format the given diagnostic in a manner that is suitable for display.
 
 *
 
 * This routine will format the given diagnostic to a string, rendering
 
 * the diagnostic according to the various options given. The
 
 * \c clang_defaultDiagnosticDisplayOptions() function returns the set of
 
 * options that most closely mimics the behavior of the clang compiler.
 
 *
 
 * \param Diagnostic The diagnostic to print.
 
 *
 
 * \param Options A set of options that control the diagnostic display,
 
 * created by combining \c CXDiagnosticDisplayOptions values.
 
 *
 
 * \returns A new string containing for formatted diagnostic.
 
 */
 
CINDEX_LINKAGE CXString clang_formatDiagnostic(CXDiagnostic Diagnostic,
 
                                               unsigned Options);
 
 
 
/**
 
 * Retrieve the set of display options most similar to the
 
 * default behavior of the clang compiler.
 
 *
 
 * \returns A set of display options suitable for use with \c
 
 * clang_formatDiagnostic().
 
 */
 
CINDEX_LINKAGE unsigned clang_defaultDiagnosticDisplayOptions(void);
 
 
 
/**
 
 * Determine the severity of the given diagnostic.
 
 */
 
CINDEX_LINKAGE enum CXDiagnosticSeverity
 
    clang_getDiagnosticSeverity(CXDiagnostic);
 
 
 
/**
 
 * Retrieve the source location of the given diagnostic.
 
 *
 
 * This location is where Clang would print the caret ('^') when
 
 * displaying the diagnostic on the command line.
 
 */
 
CINDEX_LINKAGE CXSourceLocation clang_getDiagnosticLocation(CXDiagnostic);
 
 
 
/**
 
 * Retrieve the text of the given diagnostic.
 
 */
 
CINDEX_LINKAGE CXString clang_getDiagnosticSpelling(CXDiagnostic);
 
 
 
/**
 
 * Retrieve the name of the command-line option that enabled this
 
 * diagnostic.
 
 *
 
 * \param Diag The diagnostic to be queried.
 
 *
 
 * \param Disable If non-NULL, will be set to the option that disables this
 
 * diagnostic (if any).
 
 *
 
 * \returns A string that contains the command-line option used to enable this
 
 * warning, such as "-Wconversion" or "-pedantic".
 
 */
 
CINDEX_LINKAGE CXString clang_getDiagnosticOption(CXDiagnostic Diag,
 
                                                  CXString *Disable);
 
 
 
/**
 
 * Retrieve the category number for this diagnostic.
 
 *
 
 * Diagnostics can be categorized into groups along with other, related
 
 * diagnostics (e.g., diagnostics under the same warning flag). This routine
 
 * retrieves the category number for the given diagnostic.
 
 *
 
 * \returns The number of the category that contains this diagnostic, or zero
 
 * if this diagnostic is uncategorized.
 
 */
 
CINDEX_LINKAGE unsigned clang_getDiagnosticCategory(CXDiagnostic);
 
 
 
/**
 
 * Retrieve the name of a particular diagnostic category.  This
 
 *  is now deprecated.  Use clang_getDiagnosticCategoryText()
 
 *  instead.
 
 *
 
 * \param Category A diagnostic category number, as returned by
 
 * \c clang_getDiagnosticCategory().
 
 *
 
 * \returns The name of the given diagnostic category.
 
 */
 
CINDEX_DEPRECATED CINDEX_LINKAGE CXString
 
clang_getDiagnosticCategoryName(unsigned Category);
 
 
 
/**
 
 * Retrieve the diagnostic category text for a given diagnostic.
 
 *
 
 * \returns The text of the given diagnostic category.
 
 */
 
CINDEX_LINKAGE CXString clang_getDiagnosticCategoryText(CXDiagnostic);
 
 
 
/**
 
 * Determine the number of source ranges associated with the given
 
 * diagnostic.
 
 */
 
CINDEX_LINKAGE unsigned clang_getDiagnosticNumRanges(CXDiagnostic);
 
 
 
/**
 
 * Retrieve a source range associated with the diagnostic.
 
 *
 
 * A diagnostic's source ranges highlight important elements in the source
 
 * code. On the command line, Clang displays source ranges by
 
 * underlining them with '~' characters.
 
 *
 
 * \param Diagnostic the diagnostic whose range is being extracted.
 
 *
 
 * \param Range the zero-based index specifying which range to
 
 *
 
 * \returns the requested source range.
 
 */
 
CINDEX_LINKAGE CXSourceRange clang_getDiagnosticRange(CXDiagnostic Diagnostic,
 
                                                      unsigned Range);
 
 
 
/**
 
 * Determine the number of fix-it hints associated with the
 
 * given diagnostic.
 
 */
 
CINDEX_LINKAGE unsigned clang_getDiagnosticNumFixIts(CXDiagnostic Diagnostic);
 
 
 
/**
 
 * Retrieve the replacement information for a given fix-it.
 
 *
 
 * Fix-its are described in terms of a source range whose contents
 
 * should be replaced by a string. This approach generalizes over
 
 * three kinds of operations: removal of source code (the range covers
 
 * the code to be removed and the replacement string is empty),
 
 * replacement of source code (the range covers the code to be
 
 * replaced and the replacement string provides the new code), and
 
 * insertion (both the start and end of the range point at the
 
 * insertion location, and the replacement string provides the text to
 
 * insert).
 
 *
 
 * \param Diagnostic The diagnostic whose fix-its are being queried.
 
 *
 
 * \param FixIt The zero-based index of the fix-it.
 
 *
 
 * \param ReplacementRange The source range whose contents will be
 
 * replaced with the returned replacement string. Note that source
 
 * ranges are half-open ranges [a, b), so the source code should be
 
 * replaced from a and up to (but not including) b.
 
 *
 
 * \returns A string containing text that should be replace the source
 
 * code indicated by the \c ReplacementRange.
 
 */
 
CINDEX_LINKAGE CXString clang_getDiagnosticFixIt(
 
    CXDiagnostic Diagnostic, unsigned FixIt, CXSourceRange *ReplacementRange);
 
 
 
/**
 
 * @}
 
 */
 
 
 
LLVM_CLANG_C_EXTERN_C_END
 
 
 
#endif