166 lines · c
1/*===-- CIndexDiagnostic.h - Diagnostics C Interface ------------*- 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|* Implements the diagnostic functions of the Clang C interface. *|11|* *|12\*===----------------------------------------------------------------------===*/13#ifndef LLVM_CLANG_TOOLS_LIBCLANG_CINDEXDIAGNOSTIC_H14#define LLVM_CLANG_TOOLS_LIBCLANG_CINDEXDIAGNOSTIC_H15 16#include "clang-c/Index.h"17#include <memory>18#include <vector>19#include <assert.h>20 21namespace clang {22 23class LangOptions;24class StoredDiagnostic;25class CXDiagnosticImpl;26 27class CXDiagnosticSetImpl {28 std::vector<std::unique_ptr<CXDiagnosticImpl>> Diagnostics;29 const bool IsExternallyManaged;30public:31 CXDiagnosticSetImpl(bool isManaged = false)32 : IsExternallyManaged(isManaged) {}33 34 virtual ~CXDiagnosticSetImpl();35 36 size_t getNumDiagnostics() const {37 return Diagnostics.size();38 }39 40 CXDiagnosticImpl *getDiagnostic(unsigned i) const {41 assert(i < getNumDiagnostics());42 return Diagnostics[i].get();43 }44 45 void appendDiagnostic(std::unique_ptr<CXDiagnosticImpl> D);46 47 bool empty() const {48 return Diagnostics.empty();49 }50 51 bool isExternallyManaged() const { return IsExternallyManaged; }52};53 54class CXDiagnosticImpl {55public:56 enum Kind { StoredDiagnosticKind, LoadedDiagnosticKind,57 CustomNoteDiagnosticKind };58 59 virtual ~CXDiagnosticImpl();60 61 /// Return the severity of the diagnostic.62 virtual CXDiagnosticSeverity getSeverity() const = 0;63 64 /// Return the location of the diagnostic.65 virtual CXSourceLocation getLocation() const = 0;66 67 /// Return the spelling of the diagnostic.68 virtual CXString getSpelling() const = 0;69 70 /// Return the text for the diagnostic option.71 virtual CXString getDiagnosticOption(CXString *Disable) const = 0;72 73 /// Return the category of the diagnostic.74 virtual unsigned getCategory() const = 0;75 76 /// Return the category string of the diagnostic.77 virtual CXString getCategoryText() const = 0;78 79 /// Return the number of source ranges for the diagnostic.80 virtual unsigned getNumRanges() const = 0;81 82 /// Return the source ranges for the diagnostic.83 virtual CXSourceRange getRange(unsigned Range) const = 0;84 85 /// Return the number of FixIts.86 virtual unsigned getNumFixIts() const = 0;87 88 /// Return the FixIt information (source range and inserted text).89 virtual CXString getFixIt(unsigned FixIt,90 CXSourceRange *ReplacementRange) const = 0;91 92 Kind getKind() const { return K; }93 94 CXDiagnosticSetImpl &getChildDiagnostics() {95 return ChildDiags;96 }97 98protected:99 CXDiagnosticImpl(Kind k) : K(k) {}100 CXDiagnosticSetImpl ChildDiags;101 102 void append(std::unique_ptr<CXDiagnosticImpl> D) {103 ChildDiags.appendDiagnostic(std::move(D));104 }105 106private:107 Kind K;108};109 110/// The storage behind a CXDiagnostic111struct CXStoredDiagnostic : public CXDiagnosticImpl {112 const StoredDiagnostic &Diag;113 const LangOptions &LangOpts;114 115 CXStoredDiagnostic(const StoredDiagnostic &Diag,116 const LangOptions &LangOpts)117 : CXDiagnosticImpl(StoredDiagnosticKind),118 Diag(Diag), LangOpts(LangOpts) { }119 120 ~CXStoredDiagnostic() override {}121 122 /// Return the severity of the diagnostic.123 CXDiagnosticSeverity getSeverity() const override;124 125 /// Return the location of the diagnostic.126 CXSourceLocation getLocation() const override;127 128 /// Return the spelling of the diagnostic.129 CXString getSpelling() const override;130 131 /// Return the text for the diagnostic option.132 CXString getDiagnosticOption(CXString *Disable) const override;133 134 /// Return the category of the diagnostic.135 unsigned getCategory() const override;136 137 /// Return the category string of the diagnostic.138 CXString getCategoryText() const override;139 140 /// Return the number of source ranges for the diagnostic.141 unsigned getNumRanges() const override;142 143 /// Return the source ranges for the diagnostic.144 CXSourceRange getRange(unsigned Range) const override;145 146 /// Return the number of FixIts.147 unsigned getNumFixIts() const override;148 149 /// Return the FixIt information (source range and inserted text).150 CXString getFixIt(unsigned FixIt,151 CXSourceRange *ReplacementRange) const override;152 153 static bool classof(const CXDiagnosticImpl *D) {154 return D->getKind() == StoredDiagnosticKind;155 }156};157 158namespace cxdiag {159CXDiagnosticSetImpl *lazyCreateDiags(CXTranslationUnit TU,160 bool checkIfChanged = false);161} // end namespace cxdiag162 163} // end namespace clang164 165#endif166