A 'remark' is information that is not an error or a warning, but rather some additional information provided to the user. In contrast to a 'note' a 'remark' is an independent diagnostic, whereas a 'note' always depends on another diagnostic. A typical use case for remark nodes is information provided to the user, e.g. information provided by the vectorizer about loops that have been vectorized. This patch provides the initial implementation of 'remarks'. It includes the actual definiton of the remark nodes, their printing as well as basic parameter handling. We are reusing the existing diagnostic parameters which means a remark can be enabled with normal '-Wdiagnostic-name' flags and can be upgraded to an error using '-Werror=diagnostic-name'. '-Werror' alone does not upgrade remarks. This patch is by intention minimal in terms of parameter handling. More experience and more discussions will most likely lead to further enhancements in the parameter handling. llvm-svn: 202475
115 lines
4.2 KiB
C++
115 lines
4.2 KiB
C++
/*===-- CXStoreDiagnostic.cpp - Diagnostics C Interface ----------*- C++ -*-===*\
|
|
|* *|
|
|
|* The LLVM Compiler Infrastructure *|
|
|
|* *|
|
|
|* This file is distributed under the University of Illinois Open Source *|
|
|
|* License. See LICENSE.TXT for details. *|
|
|
|* *|
|
|
|*===----------------------------------------------------------------------===*|
|
|
|* *|
|
|
|* Implements part of the diagnostic functions of the Clang C interface. *|
|
|
|* *|
|
|
\*===----------------------------------------------------------------------===*/
|
|
|
|
#include "CIndexDiagnostic.h"
|
|
#include "CIndexer.h"
|
|
#include "CXTranslationUnit.h"
|
|
#include "CXSourceLocation.h"
|
|
#include "CXString.h"
|
|
|
|
#include "clang/Frontend/ASTUnit.h"
|
|
#include "clang/Frontend/FrontendDiagnostic.h"
|
|
#include "llvm/ADT/SmallString.h"
|
|
#include "llvm/ADT/Twine.h"
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
using namespace clang;
|
|
using namespace clang::cxloc;
|
|
|
|
CXDiagnosticSeverity CXStoredDiagnostic::getSeverity() const {
|
|
switch (Diag.getLevel()) {
|
|
case DiagnosticsEngine::Ignored: return CXDiagnostic_Ignored;
|
|
case DiagnosticsEngine::Note: return CXDiagnostic_Note;
|
|
case DiagnosticsEngine::Remark: return CXDiagnostic_Remark;
|
|
case DiagnosticsEngine::Warning: return CXDiagnostic_Warning;
|
|
case DiagnosticsEngine::Error: return CXDiagnostic_Error;
|
|
case DiagnosticsEngine::Fatal: return CXDiagnostic_Fatal;
|
|
}
|
|
|
|
llvm_unreachable("Invalid diagnostic level");
|
|
}
|
|
|
|
CXSourceLocation CXStoredDiagnostic::getLocation() const {
|
|
if (Diag.getLocation().isInvalid())
|
|
return clang_getNullLocation();
|
|
|
|
return translateSourceLocation(Diag.getLocation().getManager(),
|
|
LangOpts, Diag.getLocation());
|
|
}
|
|
|
|
CXString CXStoredDiagnostic::getSpelling() const {
|
|
return cxstring::createRef(Diag.getMessage());
|
|
}
|
|
|
|
CXString CXStoredDiagnostic::getDiagnosticOption(CXString *Disable) const {
|
|
unsigned ID = Diag.getID();
|
|
StringRef Option = DiagnosticIDs::getWarningOptionForDiag(ID);
|
|
if (!Option.empty()) {
|
|
if (Disable)
|
|
*Disable = cxstring::createDup((Twine("-Wno-") + Option).str());
|
|
return cxstring::createDup((Twine("-W") + Option).str());
|
|
}
|
|
|
|
if (ID == diag::fatal_too_many_errors) {
|
|
if (Disable)
|
|
*Disable = cxstring::createRef("-ferror-limit=0");
|
|
return cxstring::createRef("-ferror-limit=");
|
|
}
|
|
|
|
return cxstring::createEmpty();
|
|
}
|
|
|
|
unsigned CXStoredDiagnostic::getCategory() const {
|
|
return DiagnosticIDs::getCategoryNumberForDiag(Diag.getID());
|
|
}
|
|
|
|
CXString CXStoredDiagnostic::getCategoryText() const {
|
|
unsigned catID = DiagnosticIDs::getCategoryNumberForDiag(Diag.getID());
|
|
return cxstring::createRef(DiagnosticIDs::getCategoryNameFromID(catID));
|
|
}
|
|
|
|
unsigned CXStoredDiagnostic::getNumRanges() const {
|
|
if (Diag.getLocation().isInvalid())
|
|
return 0;
|
|
|
|
return Diag.range_size();
|
|
}
|
|
|
|
CXSourceRange CXStoredDiagnostic::getRange(unsigned int Range) const {
|
|
assert(Diag.getLocation().isValid());
|
|
return translateSourceRange(Diag.getLocation().getManager(),
|
|
LangOpts,
|
|
Diag.range_begin()[Range]);
|
|
}
|
|
|
|
unsigned CXStoredDiagnostic::getNumFixIts() const {
|
|
if (Diag.getLocation().isInvalid())
|
|
return 0;
|
|
return Diag.fixit_size();
|
|
}
|
|
|
|
CXString CXStoredDiagnostic::getFixIt(unsigned FixIt,
|
|
CXSourceRange *ReplacementRange) const {
|
|
const FixItHint &Hint = Diag.fixit_begin()[FixIt];
|
|
if (ReplacementRange) {
|
|
// Create a range that covers the entire replacement (or
|
|
// removal) range, adjusting the end of the range to point to
|
|
// the end of the token.
|
|
*ReplacementRange = translateSourceRange(Diag.getLocation().getManager(),
|
|
LangOpts, Hint.RemoveRange);
|
|
}
|
|
return cxstring::createDup(Hint.CodeToInsert);
|
|
}
|
|
|