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