11edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek/*===-- CXStoreDiagnostic.cpp - Diagnostics C Interface ----------*- C++ -*-===*\ 21edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek|* *| 31edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek|* The LLVM Compiler Infrastructure *| 41edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek|* *| 51edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek|* This file is distributed under the University of Illinois Open Source *| 61edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek|* License. See LICENSE.TXT for details. *| 71edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek|* *| 81edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek|*===----------------------------------------------------------------------===*| 91edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek|* *| 101edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek|* Implements part of the diagnostic functions of the Clang C interface. *| 111edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek|* *| 121edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek\*===----------------------------------------------------------------------===*/ 131edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 141edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek#include "CIndexDiagnostic.h" 151edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek#include "CIndexer.h" 161edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek#include "CXTranslationUnit.h" 171edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek#include "CXSourceLocation.h" 181edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek#include "CXString.h" 191edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 201edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek#include "clang/Frontend/ASTUnit.h" 211edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek#include "clang/Frontend/FrontendDiagnostic.h" 221edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek#include "llvm/ADT/SmallString.h" 231edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek#include "llvm/ADT/Twine.h" 241edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek#include "llvm/Support/MemoryBuffer.h" 251edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek#include "llvm/Support/raw_ostream.h" 261edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 271edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekusing namespace clang; 281edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekusing namespace clang::cxloc; 291edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 301edabbc32a07654d9b9fe44f50533ff146abd03eTed KremenekCXDiagnosticSeverity CXStoredDiagnostic::getSeverity() const { 311edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek switch (Diag.getLevel()) { 321edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek case DiagnosticsEngine::Ignored: return CXDiagnostic_Ignored; 331edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek case DiagnosticsEngine::Note: return CXDiagnostic_Note; 346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case DiagnosticsEngine::Remark: 356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // The 'Remark' level isn't represented in the stable API. 361edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek case DiagnosticsEngine::Warning: return CXDiagnostic_Warning; 371edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek case DiagnosticsEngine::Error: return CXDiagnostic_Error; 381edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek case DiagnosticsEngine::Fatal: return CXDiagnostic_Fatal; 391edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek } 401edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 411edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek llvm_unreachable("Invalid diagnostic level"); 421edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek} 431edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 441edabbc32a07654d9b9fe44f50533ff146abd03eTed KremenekCXSourceLocation CXStoredDiagnostic::getLocation() const { 451edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek if (Diag.getLocation().isInvalid()) 461edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek return clang_getNullLocation(); 471edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 481edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek return translateSourceLocation(Diag.getLocation().getManager(), 491edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek LangOpts, Diag.getLocation()); 501edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek} 511edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 521edabbc32a07654d9b9fe44f50533ff146abd03eTed KremenekCXString CXStoredDiagnostic::getSpelling() const { 535595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko return cxstring::createRef(Diag.getMessage()); 541edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek} 551edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 561edabbc32a07654d9b9fe44f50533ff146abd03eTed KremenekCXString CXStoredDiagnostic::getDiagnosticOption(CXString *Disable) const { 571edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek unsigned ID = Diag.getID(); 581edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek StringRef Option = DiagnosticIDs::getWarningOptionForDiag(ID); 591edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek if (!Option.empty()) { 601edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek if (Disable) 615595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko *Disable = cxstring::createDup((Twine("-Wno-") + Option).str()); 625595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko return cxstring::createDup((Twine("-W") + Option).str()); 631edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek } 641edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 651edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek if (ID == diag::fatal_too_many_errors) { 661edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek if (Disable) 670c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko *Disable = cxstring::createRef("-ferror-limit=0"); 680c4394c7f63008fbf4d335710b34f71afab362a3Dmitri Gribenko return cxstring::createRef("-ferror-limit="); 691edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek } 701edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 71dc66adb40ee871b4c578ba615f45d82476c7119eDmitri Gribenko return cxstring::createEmpty(); 721edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek} 731edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 741edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekunsigned CXStoredDiagnostic::getCategory() const { 751edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek return DiagnosticIDs::getCategoryNumberForDiag(Diag.getID()); 761edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek} 771edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 7878d5d3bb9386a5aa31d19445eb8f81bf2652acb4Ted KremenekCXString CXStoredDiagnostic::getCategoryText() const { 7978d5d3bb9386a5aa31d19445eb8f81bf2652acb4Ted Kremenek unsigned catID = DiagnosticIDs::getCategoryNumberForDiag(Diag.getID()); 805595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko return cxstring::createRef(DiagnosticIDs::getCategoryNameFromID(catID)); 8178d5d3bb9386a5aa31d19445eb8f81bf2652acb4Ted Kremenek} 8278d5d3bb9386a5aa31d19445eb8f81bf2652acb4Ted Kremenek 831edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekunsigned CXStoredDiagnostic::getNumRanges() const { 841edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek if (Diag.getLocation().isInvalid()) 851edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek return 0; 861edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 871edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek return Diag.range_size(); 881edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek} 891edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 901edabbc32a07654d9b9fe44f50533ff146abd03eTed KremenekCXSourceRange CXStoredDiagnostic::getRange(unsigned int Range) const { 911edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek assert(Diag.getLocation().isValid()); 921edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek return translateSourceRange(Diag.getLocation().getManager(), 931edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek LangOpts, 941edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek Diag.range_begin()[Range]); 951edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek} 961edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 971edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenekunsigned CXStoredDiagnostic::getNumFixIts() const { 981edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek if (Diag.getLocation().isInvalid()) 991edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek return 0; 1001edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek return Diag.fixit_size(); 1011edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek} 1021edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 1031edabbc32a07654d9b9fe44f50533ff146abd03eTed KremenekCXString CXStoredDiagnostic::getFixIt(unsigned FixIt, 1041edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek CXSourceRange *ReplacementRange) const { 1051edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek const FixItHint &Hint = Diag.fixit_begin()[FixIt]; 1061edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek if (ReplacementRange) { 1071edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek // Create a range that covers the entire replacement (or 1081edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek // removal) range, adjusting the end of the range to point to 1091edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek // the end of the token. 1101edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek *ReplacementRange = translateSourceRange(Diag.getLocation().getManager(), 1111edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek LangOpts, Hint.RemoveRange); 1121edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek } 1135595ded882b22d77fdf535bd1a4c6c090110348aDmitri Gribenko return cxstring::createDup(Hint.CodeToInsert); 1141edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek} 1151edabbc32a07654d9b9fe44f50533ff146abd03eTed Kremenek 116