CIndexDiagnostic.h revision 7473b1c6e7ba2654d4a0d469198f0e01b485b51a
1d93256e55673a17d18543397ec462416acb13792Douglas Gregor/*===-- CIndexDiagnostic.h - Diagnostics C Interface ------------*- C++ -*-===*\ 25352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor|* *| 35352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor|* The LLVM Compiler Infrastructure *| 45352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor|* *| 55352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor|* This file is distributed under the University of Illinois Open Source *| 65352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor|* License. See LICENSE.TXT for details. *| 75352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor|* *| 85352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor|*===----------------------------------------------------------------------===*| 95352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor|* *| 105352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor|* Implements the diagnostic functions of the Clang C interface. *| 115352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor|* *| 125352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor\*===----------------------------------------------------------------------===*/ 135352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor#ifndef LLVM_CLANG_CINDEX_DIAGNOSTIC_H 145352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor#define LLVM_CLANG_CINDEX_DIAGNOSTIC_H 155352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor 161edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek#include "clang-c/Index.h" 17153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek#include <vector> 18153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek#include <assert.h> 191edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 205352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregornamespace clang { 215352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor 2235b8440f615a2336f2819a98a78fc89f07d905e1Daniel Dunbarclass LangOptions; 23b846debc1b22a37228efe4aa87b34482d15b6a3cBenjamin Kramerclass StoredDiagnostic; 24153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenekclass CXDiagnosticImpl; 25153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 26153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenekclass CXDiagnosticSetImpl { 27153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek std::vector<CXDiagnosticImpl *> Diagnostics; 28153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek const bool IsExternallyManaged; 29153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenekpublic: 30153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek CXDiagnosticSetImpl(bool isManaged = false) 31153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek : IsExternallyManaged(isManaged) {} 32153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 33153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek virtual ~CXDiagnosticSetImpl(); 34153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 35153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek size_t getNumDiagnostics() const { 36153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek return Diagnostics.size(); 37153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek } 38153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 39153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek CXDiagnosticImpl *getDiagnostic(unsigned i) const { 40153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek assert(i < getNumDiagnostics()); 41153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek return Diagnostics[i]; 42153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek } 43153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 44153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek void appendDiagnostic(CXDiagnosticImpl *D) { 45153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek Diagnostics.push_back(D); 46153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek } 47153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 48153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek bool empty() const { 49153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek return Diagnostics.empty(); 50153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek } 51153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 52153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek bool isExternallyManaged() const { return IsExternallyManaged; } 53153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek}; 544914612675787cda11ad6b31735e130a81a1d7a1Daniel Dunbar 551edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekclass CXDiagnosticImpl { 561edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekpublic: 577473b1c6e7ba2654d4a0d469198f0e01b485b51aTed Kremenek enum Kind { StoredDiagnosticKind, LoadedDiagnosticKind, 587473b1c6e7ba2654d4a0d469198f0e01b485b51aTed Kremenek CustomNoteDiagnosticKind }; 591edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 601edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual ~CXDiagnosticImpl(); 611edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 621edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the severity of the diagnostic. 631edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXDiagnosticSeverity getSeverity() const = 0; 641edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 651edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the location of the diagnostic. 661edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXSourceLocation getLocation() const = 0; 671edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 681edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the spelling of the diagnostic. 691edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXString getSpelling() const = 0; 701edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 711edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the text for the diagnostic option. 721edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXString getDiagnosticOption(CXString *Disable) const = 0; 731edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 741edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the category of the diagnostic. 751edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual unsigned getCategory() const = 0; 761edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 771edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the number of source ranges for the diagnostic. 781edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual unsigned getNumRanges() const = 0; 791edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 801edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the source ranges for the diagnostic. 811edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXSourceRange getRange(unsigned Range) const = 0; 821edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 831edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the number of FixIts. 841edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual unsigned getNumFixIts() const = 0; 851edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 861edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the FixIt information (source range and inserted text). 871edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXString getFixIt(unsigned FixIt, 881edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek CXSourceRange *ReplacementRange) const = 0; 891edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 901edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek Kind getKind() const { return K; } 91153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 92153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek CXDiagnosticSetImpl &getChildDiagnostics() { 93153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek return ChildDiags; 94153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek } 95153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 961edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekprotected: 971edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek CXDiagnosticImpl(Kind k) : K(k) {} 98153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek CXDiagnosticSetImpl ChildDiags; 99153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 100153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek void append(CXDiagnosticImpl *D) { 101153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek ChildDiags.appendDiagnostic(D); 102153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek } 1031edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1041edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekprivate: 1051edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek Kind K; 1061edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek}; 1071edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 108a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor/// \brief The storage behind a CXDiagnostic 1091edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekstruct CXStoredDiagnostic : public CXDiagnosticImpl { 110a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor const StoredDiagnostic &Diag; 111a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor const LangOptions &LangOpts; 112a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 113a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor CXStoredDiagnostic(const StoredDiagnostic &Diag, 114a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor const LangOptions &LangOpts) 1151edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek : CXDiagnosticImpl(StoredDiagnosticKind), 1161edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek Diag(Diag), LangOpts(LangOpts) { } 1171edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1181edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual ~CXStoredDiagnostic() {} 1191edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1201edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the severity of the diagnostic. 1211edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXDiagnosticSeverity getSeverity() const; 1221edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1231edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the location of the diagnostic. 1241edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXSourceLocation getLocation() const; 1251edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1261edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the spelling of the diagnostic. 1271edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXString getSpelling() const; 1281edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1291edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the text for the diagnostic option. 1301edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXString getDiagnosticOption(CXString *Disable) const; 1311edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1321edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the category of the diagnostic. 1331edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual unsigned getCategory() const; 1341edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1351edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the number of source ranges for the diagnostic. 1361edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual unsigned getNumRanges() const; 1371edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1381edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the source ranges for the diagnostic. 1391edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXSourceRange getRange(unsigned Range) const; 1401edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1411edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the number of FixIts. 1421edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual unsigned getNumFixIts() const; 1431edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1441edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the FixIt information (source range and inserted text). 1451edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXString getFixIt(unsigned FixIt, 1461edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek CXSourceRange *ReplacementRange) const; 1471edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1481edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek static bool classof(const CXDiagnosticImpl *D) { 1491edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek return D->getKind() == StoredDiagnosticKind; 1501edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek } 1515352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor}; 152d93256e55673a17d18543397ec462416acb13792Douglas Gregor 153996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidisnamespace cxdiag { 154996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios KyrtzidisCXDiagnosticSetImpl *lazyCreateDiags(CXTranslationUnit TU, 155996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidis bool checkIfChanged = false); 156996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidis} // end namespace cxdiag 157996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidis 1585352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor} // end namespace clang 1595352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor 1605352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor#endif // LLVM_CLANG_CINDEX_DIAGNOSTIC_H 161