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; 7678d5d3bb9386a5aa31d19445eb8f81bf2652acb4Ted Kremenek 7778d5d3bb9386a5aa31d19445eb8f81bf2652acb4Ted Kremenek /// \brief Return the category string of the diagnostic. 7878d5d3bb9386a5aa31d19445eb8f81bf2652acb4Ted Kremenek virtual CXString getCategoryText() const = 0; 7978d5d3bb9386a5aa31d19445eb8f81bf2652acb4Ted Kremenek 801edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the number of source ranges for the diagnostic. 811edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual unsigned getNumRanges() const = 0; 821edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 831edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the source ranges for the diagnostic. 841edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXSourceRange getRange(unsigned Range) const = 0; 851edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 861edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the number of FixIts. 871edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual unsigned getNumFixIts() const = 0; 881edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 891edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the FixIt information (source range and inserted text). 901edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXString getFixIt(unsigned FixIt, 911edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek CXSourceRange *ReplacementRange) const = 0; 921edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 931edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek Kind getKind() const { return K; } 94153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 95153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek CXDiagnosticSetImpl &getChildDiagnostics() { 96153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek return ChildDiags; 97153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek } 98153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 991edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekprotected: 1001edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek CXDiagnosticImpl(Kind k) : K(k) {} 101153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek CXDiagnosticSetImpl ChildDiags; 102153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek 103153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek void append(CXDiagnosticImpl *D) { 104153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek ChildDiags.appendDiagnostic(D); 105153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek } 1061edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1071edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekprivate: 1081edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek Kind K; 1091edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek}; 1101edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 111a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor/// \brief The storage behind a CXDiagnostic 1121edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekstruct CXStoredDiagnostic : public CXDiagnosticImpl { 113a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor const StoredDiagnostic &Diag; 114a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor const LangOptions &LangOpts; 115a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor 116a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor CXStoredDiagnostic(const StoredDiagnostic &Diag, 117a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor const LangOptions &LangOpts) 1181edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek : CXDiagnosticImpl(StoredDiagnosticKind), 1191edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek Diag(Diag), LangOpts(LangOpts) { } 1201edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1211edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual ~CXStoredDiagnostic() {} 1221edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1231edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the severity of the diagnostic. 1241edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXDiagnosticSeverity getSeverity() const; 1251edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1261edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the location of the diagnostic. 1271edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXSourceLocation getLocation() const; 1281edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1291edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the spelling of the diagnostic. 1301edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXString getSpelling() const; 1311edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1321edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the text for the diagnostic option. 1331edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXString getDiagnosticOption(CXString *Disable) const; 1341edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1351edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the category of the diagnostic. 1361edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual unsigned getCategory() const; 1371edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 13878d5d3bb9386a5aa31d19445eb8f81bf2652acb4Ted Kremenek /// \brief Return the category string of the diagnostic. 13978d5d3bb9386a5aa31d19445eb8f81bf2652acb4Ted Kremenek virtual CXString getCategoryText() const; 14078d5d3bb9386a5aa31d19445eb8f81bf2652acb4Ted Kremenek 1411edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the number of source ranges for the diagnostic. 1421edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual unsigned getNumRanges() const; 1431edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1441edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the source ranges for the diagnostic. 1451edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXSourceRange getRange(unsigned Range) const; 1461edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1471edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the number of FixIts. 1481edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual unsigned getNumFixIts() const; 1491edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1501edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek /// \brief Return the FixIt information (source range and inserted text). 1511edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek virtual CXString getFixIt(unsigned FixIt, 1521edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek CXSourceRange *ReplacementRange) const; 1531edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1541edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek static bool classof(const CXDiagnosticImpl *D) { 1551edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek return D->getKind() == StoredDiagnosticKind; 1561edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek } 1575352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor}; 158d93256e55673a17d18543397ec462416acb13792Douglas Gregor 159996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidisnamespace cxdiag { 160996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios KyrtzidisCXDiagnosticSetImpl *lazyCreateDiags(CXTranslationUnit TU, 161996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidis bool checkIfChanged = false); 162996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidis} // end namespace cxdiag 163996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidis 1645352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor} // end namespace clang 1655352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor 1665352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor#endif // LLVM_CLANG_CINDEX_DIAGNOSTIC_H 167