| /*===-- 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 |