xref: /aosp_15_r20/external/clang/tools/libclang/CXStoredDiagnostic.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li /*===-- CXStoreDiagnostic.cpp - Diagnostics C Interface ----------*- C++ -*-===*\
2*67e74705SXin Li |*                                                                            *|
3*67e74705SXin Li |*                     The LLVM Compiler Infrastructure                       *|
4*67e74705SXin Li |*                                                                            *|
5*67e74705SXin Li |* This file is distributed under the University of Illinois Open Source      *|
6*67e74705SXin Li |* License. See LICENSE.TXT for details.                                      *|
7*67e74705SXin Li |*                                                                            *|
8*67e74705SXin Li |*===----------------------------------------------------------------------===*|
9*67e74705SXin Li |*                                                                            *|
10*67e74705SXin Li |* Implements part of the diagnostic functions of the Clang C interface.      *|
11*67e74705SXin Li |*                                                                            *|
12*67e74705SXin Li \*===----------------------------------------------------------------------===*/
13*67e74705SXin Li 
14*67e74705SXin Li #include "CIndexDiagnostic.h"
15*67e74705SXin Li #include "CIndexer.h"
16*67e74705SXin Li #include "CXTranslationUnit.h"
17*67e74705SXin Li #include "CXSourceLocation.h"
18*67e74705SXin Li #include "CXString.h"
19*67e74705SXin Li 
20*67e74705SXin Li #include "clang/Frontend/ASTUnit.h"
21*67e74705SXin Li #include "clang/Frontend/FrontendDiagnostic.h"
22*67e74705SXin Li #include "llvm/ADT/SmallString.h"
23*67e74705SXin Li #include "llvm/ADT/Twine.h"
24*67e74705SXin Li #include "llvm/Support/MemoryBuffer.h"
25*67e74705SXin Li #include "llvm/Support/raw_ostream.h"
26*67e74705SXin Li 
27*67e74705SXin Li using namespace clang;
28*67e74705SXin Li using namespace clang::cxloc;
29*67e74705SXin Li 
getSeverity() const30*67e74705SXin Li CXDiagnosticSeverity CXStoredDiagnostic::getSeverity() const {
31*67e74705SXin Li   switch (Diag.getLevel()) {
32*67e74705SXin Li     case DiagnosticsEngine::Ignored: return CXDiagnostic_Ignored;
33*67e74705SXin Li     case DiagnosticsEngine::Note:    return CXDiagnostic_Note;
34*67e74705SXin Li     case DiagnosticsEngine::Remark:
35*67e74705SXin Li     // The 'Remark' level isn't represented in the stable API.
36*67e74705SXin Li     case DiagnosticsEngine::Warning: return CXDiagnostic_Warning;
37*67e74705SXin Li     case DiagnosticsEngine::Error:   return CXDiagnostic_Error;
38*67e74705SXin Li     case DiagnosticsEngine::Fatal:   return CXDiagnostic_Fatal;
39*67e74705SXin Li   }
40*67e74705SXin Li 
41*67e74705SXin Li   llvm_unreachable("Invalid diagnostic level");
42*67e74705SXin Li }
43*67e74705SXin Li 
getLocation() const44*67e74705SXin Li CXSourceLocation CXStoredDiagnostic::getLocation() const {
45*67e74705SXin Li   if (Diag.getLocation().isInvalid())
46*67e74705SXin Li     return clang_getNullLocation();
47*67e74705SXin Li 
48*67e74705SXin Li   return translateSourceLocation(Diag.getLocation().getManager(),
49*67e74705SXin Li                                  LangOpts, Diag.getLocation());
50*67e74705SXin Li }
51*67e74705SXin Li 
getSpelling() const52*67e74705SXin Li CXString CXStoredDiagnostic::getSpelling() const {
53*67e74705SXin Li   return cxstring::createRef(Diag.getMessage());
54*67e74705SXin Li }
55*67e74705SXin Li 
getDiagnosticOption(CXString * Disable) const56*67e74705SXin Li CXString CXStoredDiagnostic::getDiagnosticOption(CXString *Disable) const {
57*67e74705SXin Li   unsigned ID = Diag.getID();
58*67e74705SXin Li   StringRef Option = DiagnosticIDs::getWarningOptionForDiag(ID);
59*67e74705SXin Li   if (!Option.empty()) {
60*67e74705SXin Li     if (Disable)
61*67e74705SXin Li       *Disable = cxstring::createDup((Twine("-Wno-") + Option).str());
62*67e74705SXin Li     return cxstring::createDup((Twine("-W") + Option).str());
63*67e74705SXin Li   }
64*67e74705SXin Li 
65*67e74705SXin Li   if (ID == diag::fatal_too_many_errors) {
66*67e74705SXin Li     if (Disable)
67*67e74705SXin Li       *Disable = cxstring::createRef("-ferror-limit=0");
68*67e74705SXin Li     return cxstring::createRef("-ferror-limit=");
69*67e74705SXin Li   }
70*67e74705SXin Li 
71*67e74705SXin Li   return cxstring::createEmpty();
72*67e74705SXin Li }
73*67e74705SXin Li 
getCategory() const74*67e74705SXin Li unsigned CXStoredDiagnostic::getCategory() const {
75*67e74705SXin Li   return DiagnosticIDs::getCategoryNumberForDiag(Diag.getID());
76*67e74705SXin Li }
77*67e74705SXin Li 
getCategoryText() const78*67e74705SXin Li CXString CXStoredDiagnostic::getCategoryText() const {
79*67e74705SXin Li   unsigned catID = DiagnosticIDs::getCategoryNumberForDiag(Diag.getID());
80*67e74705SXin Li   return cxstring::createRef(DiagnosticIDs::getCategoryNameFromID(catID));
81*67e74705SXin Li }
82*67e74705SXin Li 
getNumRanges() const83*67e74705SXin Li unsigned CXStoredDiagnostic::getNumRanges() const {
84*67e74705SXin Li   if (Diag.getLocation().isInvalid())
85*67e74705SXin Li     return 0;
86*67e74705SXin Li 
87*67e74705SXin Li   return Diag.range_size();
88*67e74705SXin Li }
89*67e74705SXin Li 
getRange(unsigned int Range) const90*67e74705SXin Li CXSourceRange CXStoredDiagnostic::getRange(unsigned int Range) const {
91*67e74705SXin Li   assert(Diag.getLocation().isValid());
92*67e74705SXin Li   return translateSourceRange(Diag.getLocation().getManager(),
93*67e74705SXin Li                               LangOpts,
94*67e74705SXin Li                               Diag.range_begin()[Range]);
95*67e74705SXin Li }
96*67e74705SXin Li 
getNumFixIts() const97*67e74705SXin Li unsigned CXStoredDiagnostic::getNumFixIts() const {
98*67e74705SXin Li   if (Diag.getLocation().isInvalid())
99*67e74705SXin Li     return 0;
100*67e74705SXin Li   return Diag.fixit_size();
101*67e74705SXin Li }
102*67e74705SXin Li 
getFixIt(unsigned FixIt,CXSourceRange * ReplacementRange) const103*67e74705SXin Li CXString CXStoredDiagnostic::getFixIt(unsigned FixIt,
104*67e74705SXin Li                                       CXSourceRange *ReplacementRange) const {
105*67e74705SXin Li   const FixItHint &Hint = Diag.fixit_begin()[FixIt];
106*67e74705SXin Li   if (ReplacementRange) {
107*67e74705SXin Li     // Create a range that covers the entire replacement (or
108*67e74705SXin Li     // removal) range, adjusting the end of the range to point to
109*67e74705SXin Li     // the end of the token.
110*67e74705SXin Li     *ReplacementRange = translateSourceRange(Diag.getLocation().getManager(),
111*67e74705SXin Li                                              LangOpts, Hint.RemoveRange);
112*67e74705SXin Li   }
113*67e74705SXin Li   return cxstring::createDup(Hint.CodeToInsert);
114*67e74705SXin Li }
115*67e74705SXin Li 
116