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