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 LiCXDiagnosticSeverity 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 LiCXSourceLocation 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 LiCXString CXStoredDiagnostic::getSpelling() const { 53*67e74705SXin Li return cxstring::createRef(Diag.getMessage()); 54*67e74705SXin Li } 55*67e74705SXin Li getDiagnosticOption(CXString * Disable) const56*67e74705SXin LiCXString 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 Liunsigned CXStoredDiagnostic::getCategory() const { 75*67e74705SXin Li return DiagnosticIDs::getCategoryNumberForDiag(Diag.getID()); 76*67e74705SXin Li } 77*67e74705SXin Li getCategoryText() const78*67e74705SXin LiCXString 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 Liunsigned 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 LiCXSourceRange 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 Liunsigned 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 LiCXString 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