|  | /*===-- CIndexDiagnostic.h - Diagnostics C Interface ------------*- 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                    *| | 
|  | |*                                                                            *| | 
|  | |*===----------------------------------------------------------------------===*| | 
|  | |*                                                                            *| | 
|  | |* Implements the diagnostic functions of the Clang C interface.              *| | 
|  | |*                                                                            *| | 
|  | \*===----------------------------------------------------------------------===*/ | 
|  | #ifndef LLVM_CLANG_TOOLS_LIBCLANG_CINDEXDIAGNOSTIC_H | 
|  | #define LLVM_CLANG_TOOLS_LIBCLANG_CINDEXDIAGNOSTIC_H | 
|  |  | 
|  | #include "clang-c/Index.h" | 
|  | #include <memory> | 
|  | #include <vector> | 
|  | #include <assert.h> | 
|  |  | 
|  | namespace clang { | 
|  |  | 
|  | class LangOptions; | 
|  | class StoredDiagnostic; | 
|  | class CXDiagnosticImpl; | 
|  |  | 
|  | class CXDiagnosticSetImpl { | 
|  | std::vector<std::unique_ptr<CXDiagnosticImpl>> Diagnostics; | 
|  | const bool IsExternallyManaged; | 
|  | public: | 
|  | CXDiagnosticSetImpl(bool isManaged = false) | 
|  | : IsExternallyManaged(isManaged) {} | 
|  |  | 
|  | virtual ~CXDiagnosticSetImpl(); | 
|  |  | 
|  | size_t getNumDiagnostics() const { | 
|  | return Diagnostics.size(); | 
|  | } | 
|  |  | 
|  | CXDiagnosticImpl *getDiagnostic(unsigned i) const { | 
|  | assert(i < getNumDiagnostics()); | 
|  | return Diagnostics[i].get(); | 
|  | } | 
|  |  | 
|  | void appendDiagnostic(std::unique_ptr<CXDiagnosticImpl> D); | 
|  |  | 
|  | bool empty() const { | 
|  | return Diagnostics.empty(); | 
|  | } | 
|  |  | 
|  | bool isExternallyManaged() const { return IsExternallyManaged; } | 
|  | }; | 
|  |  | 
|  | class CXDiagnosticImpl { | 
|  | public: | 
|  | enum Kind { StoredDiagnosticKind, LoadedDiagnosticKind, | 
|  | CustomNoteDiagnosticKind }; | 
|  |  | 
|  | virtual ~CXDiagnosticImpl(); | 
|  |  | 
|  | /// Return the severity of the diagnostic. | 
|  | virtual CXDiagnosticSeverity getSeverity() const = 0; | 
|  |  | 
|  | /// Return the location of the diagnostic. | 
|  | virtual CXSourceLocation getLocation() const = 0; | 
|  |  | 
|  | /// Return the spelling of the diagnostic. | 
|  | virtual CXString getSpelling() const = 0; | 
|  |  | 
|  | /// Return the text for the diagnostic option. | 
|  | virtual CXString getDiagnosticOption(CXString *Disable) const = 0; | 
|  |  | 
|  | /// Return the category of the diagnostic. | 
|  | virtual unsigned getCategory() const = 0; | 
|  |  | 
|  | /// Return the category string of the diagnostic. | 
|  | virtual CXString getCategoryText() const = 0; | 
|  |  | 
|  | /// Return the number of source ranges for the diagnostic. | 
|  | virtual unsigned getNumRanges() const = 0; | 
|  |  | 
|  | /// Return the source ranges for the diagnostic. | 
|  | virtual CXSourceRange getRange(unsigned Range) const = 0; | 
|  |  | 
|  | /// Return the number of FixIts. | 
|  | virtual unsigned getNumFixIts() const = 0; | 
|  |  | 
|  | /// Return the FixIt information (source range and inserted text). | 
|  | virtual CXString getFixIt(unsigned FixIt, | 
|  | CXSourceRange *ReplacementRange) const = 0; | 
|  |  | 
|  | Kind getKind() const { return K; } | 
|  |  | 
|  | CXDiagnosticSetImpl &getChildDiagnostics() { | 
|  | return ChildDiags; | 
|  | } | 
|  |  | 
|  | protected: | 
|  | CXDiagnosticImpl(Kind k) : K(k) {} | 
|  | CXDiagnosticSetImpl ChildDiags; | 
|  |  | 
|  | void append(std::unique_ptr<CXDiagnosticImpl> D) { | 
|  | ChildDiags.appendDiagnostic(std::move(D)); | 
|  | } | 
|  |  | 
|  | private: | 
|  | Kind K; | 
|  | }; | 
|  |  | 
|  | /// The storage behind a CXDiagnostic | 
|  | struct CXStoredDiagnostic : public CXDiagnosticImpl { | 
|  | const StoredDiagnostic &Diag; | 
|  | const LangOptions &LangOpts; | 
|  |  | 
|  | CXStoredDiagnostic(const StoredDiagnostic &Diag, | 
|  | const LangOptions &LangOpts) | 
|  | : CXDiagnosticImpl(StoredDiagnosticKind), | 
|  | Diag(Diag), LangOpts(LangOpts) { } | 
|  |  | 
|  | ~CXStoredDiagnostic() override {} | 
|  |  | 
|  | /// Return the severity of the diagnostic. | 
|  | CXDiagnosticSeverity getSeverity() const override; | 
|  |  | 
|  | /// Return the location of the diagnostic. | 
|  | CXSourceLocation getLocation() const override; | 
|  |  | 
|  | /// Return the spelling of the diagnostic. | 
|  | CXString getSpelling() const override; | 
|  |  | 
|  | /// Return the text for the diagnostic option. | 
|  | CXString getDiagnosticOption(CXString *Disable) const override; | 
|  |  | 
|  | /// Return the category of the diagnostic. | 
|  | unsigned getCategory() const override; | 
|  |  | 
|  | /// Return the category string of the diagnostic. | 
|  | CXString getCategoryText() const override; | 
|  |  | 
|  | /// Return the number of source ranges for the diagnostic. | 
|  | unsigned getNumRanges() const override; | 
|  |  | 
|  | /// Return the source ranges for the diagnostic. | 
|  | CXSourceRange getRange(unsigned Range) const override; | 
|  |  | 
|  | /// Return the number of FixIts. | 
|  | unsigned getNumFixIts() const override; | 
|  |  | 
|  | /// Return the FixIt information (source range and inserted text). | 
|  | CXString getFixIt(unsigned FixIt, | 
|  | CXSourceRange *ReplacementRange) const override; | 
|  |  | 
|  | static bool classof(const CXDiagnosticImpl *D) { | 
|  | return D->getKind() == StoredDiagnosticKind; | 
|  | } | 
|  | }; | 
|  |  | 
|  | namespace cxdiag { | 
|  | CXDiagnosticSetImpl *lazyCreateDiags(CXTranslationUnit TU, | 
|  | bool checkIfChanged = false); | 
|  | } // end namespace cxdiag | 
|  |  | 
|  | } // end namespace clang | 
|  |  | 
|  | #endif |