/*===-- CIndexDiagnostic.h - Diagnostics C Interface ------------*- C++ -*-===*\ |* *| |* The LLVM Compiler Infrastructure *| |* *| |* This file is distributed under the University of Illinois Open Source *| |* License. See LICENSE.TXT for details. *| |* *| |*===----------------------------------------------------------------------===*| |* *| |* Implements the diagnostic functions of the Clang C interface. *| |* *| \*===----------------------------------------------------------------------===*/ #ifndef LLVM_CLANG_CINDEX_DIAGNOSTIC_H #define LLVM_CLANG_CINDEX_DIAGNOSTIC_H #include "clang-c/Index.h" #include <vector> #include <assert.h> namespace clang { class LangOptions; class StoredDiagnostic; class CXDiagnosticImpl; class CXDiagnosticSetImpl { std::vector<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]; } void appendDiagnostic(CXDiagnosticImpl *D) { Diagnostics.push_back(D); } bool empty() const { return Diagnostics.empty(); } bool isExternallyManaged() const { return IsExternallyManaged; } }; class CXDiagnosticImpl { public: enum Kind { StoredDiagnosticKind, LoadedDiagnosticKind, CustomNoteDiagnosticKind }; virtual ~CXDiagnosticImpl(); /// \brief Return the severity of the diagnostic. virtual CXDiagnosticSeverity getSeverity() const = 0; /// \brief Return the location of the diagnostic. virtual CXSourceLocation getLocation() const = 0; /// \brief Return the spelling of the diagnostic. virtual CXString getSpelling() const = 0; /// \brief Return the text for the diagnostic option. virtual CXString getDiagnosticOption(CXString *Disable) const = 0; /// \brief Return the category of the diagnostic. virtual unsigned getCategory() const = 0; /// \brief Return the category string of the diagnostic. virtual CXString getCategoryText() const = 0; /// \brief Return the number of source ranges for the diagnostic. virtual unsigned getNumRanges() const = 0; /// \brief Return the source ranges for the diagnostic. virtual CXSourceRange getRange(unsigned Range) const = 0; /// \brief Return the number of FixIts. virtual unsigned getNumFixIts() const = 0; /// \brief 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(CXDiagnosticImpl *D) { ChildDiags.appendDiagnostic(D); } private: Kind K; }; /// \brief 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) { } virtual ~CXStoredDiagnostic() {} /// \brief Return the severity of the diagnostic. virtual CXDiagnosticSeverity getSeverity() const; /// \brief Return the location of the diagnostic. virtual CXSourceLocation getLocation() const; /// \brief Return the spelling of the diagnostic. virtual CXString getSpelling() const; /// \brief Return the text for the diagnostic option. virtual CXString getDiagnosticOption(CXString *Disable) const; /// \brief Return the category of the diagnostic. virtual unsigned getCategory() const; /// \brief Return the category string of the diagnostic. virtual CXString getCategoryText() const; /// \brief Return the number of source ranges for the diagnostic. virtual unsigned getNumRanges() const; /// \brief Return the source ranges for the diagnostic. virtual CXSourceRange getRange(unsigned Range) const; /// \brief Return the number of FixIts. virtual unsigned getNumFixIts() const; /// \brief Return the FixIt information (source range and inserted text). virtual CXString getFixIt(unsigned FixIt, CXSourceRange *ReplacementRange) const; 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 // LLVM_CLANG_CINDEX_DIAGNOSTIC_H