Implement clang_getDiagnosticCategoryText() to provide a way for a client of libclang to accurately
get the diagnostic category name from a serialized diagnostic when the version of libclang used to read the diagnostic file is newer than the clang that emitted the diagnostic file. llvm-svn: 154567
This commit is contained in:
parent
5811fd6cc4
commit
26a6d498ee
|
@ -35,6 +35,16 @@ extern "C" {
|
|||
#define CINDEX_LINKAGE
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define CINDEX_DEPRECATED __attribute__((deprecated))
|
||||
#else
|
||||
#ifdef _MSC_VER
|
||||
#define CINDEX_DEPRECATED __declspec(deprecated)
|
||||
#else
|
||||
#define CINDEX_DEPRECATED
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/** \defgroup CINDEX libclang: C Interface to Clang
|
||||
*
|
||||
* The C Interface to Clang provides a relatively small API that exposes
|
||||
|
@ -830,14 +840,25 @@ CINDEX_LINKAGE CXString clang_getDiagnosticOption(CXDiagnostic Diag,
|
|||
CINDEX_LINKAGE unsigned clang_getDiagnosticCategory(CXDiagnostic);
|
||||
|
||||
/**
|
||||
* \brief Retrieve the name of a particular diagnostic category.
|
||||
* \brief Retrieve the name of a particular diagnostic category. This
|
||||
* is now deprecated. Use clang_getDiagnosticCategoryText()
|
||||
* instead.
|
||||
*
|
||||
* \param Category A diagnostic category number, as returned by
|
||||
* \c clang_getDiagnosticCategory().
|
||||
*
|
||||
* \returns The name of the given diagnostic category.
|
||||
*/
|
||||
CINDEX_LINKAGE CXString clang_getDiagnosticCategoryName(unsigned Category);
|
||||
CINDEX_DEPRECATED CINDEX_LINKAGE
|
||||
CXString clang_getDiagnosticCategoryName(unsigned Category);
|
||||
|
||||
/**
|
||||
* \brief Retrieve the diagnostic category text for a given diagnostic.
|
||||
*
|
||||
*
|
||||
* \returns The text of the given diagnostic category.
|
||||
*/
|
||||
CINDEX_LINKAGE CXString clang_getDiagnosticCategoryText(CXDiagnostic);
|
||||
|
||||
/**
|
||||
* \brief Determine the number of source ranges associated with the given
|
||||
|
|
|
@ -10,7 +10,7 @@ void foo() {
|
|||
// NOTE: it is important that this test case only contain a single issue. This test case checks
|
||||
// if we can handle serialized diagnostics that contain only one diagnostic.
|
||||
|
||||
// CHECK: {{.*}}serialized-diags-single-issue.c:3:12: warning: variable 'voodoo' is uninitialized when used here [-Wuninitialized]
|
||||
// CHECK: {{.*}}serialized-diags-single-issue.c:3:12: warning: variable 'voodoo' is uninitialized when used here [-Wuninitialized] [Semantic Issue]
|
||||
// CHECK: Range: {{.*}}serialized-diags-single-issue.c:3:12 {{.*}}serialized-diags-single-issue.c:3:18
|
||||
// CHECK: +-{{.*}}serialized-diags-single-issue.c:2:13: note: initialize the variable 'voodoo' to silence this warning []
|
||||
// CHECK: +-Range: {{.*}}serialized-diags-single-issue.c:2:13 {{.*}}serialized-diags-single-issue.c:2:13
|
||||
|
|
|
@ -2586,9 +2586,9 @@ static void printDiagnosticSet(CXDiagnosticSet Diags, unsigned indent) {
|
|||
CXSourceLocation DiagLoc;
|
||||
CXDiagnostic D;
|
||||
CXFile File;
|
||||
CXString FileName, DiagSpelling, DiagOption;
|
||||
CXString FileName, DiagSpelling, DiagOption, DiagCat;
|
||||
unsigned line, column, offset;
|
||||
const char *DiagOptionStr = 0;
|
||||
const char *DiagOptionStr = 0, *DiagCatStr = 0;
|
||||
|
||||
D = clang_getDiagnosticInSet(Diags, i);
|
||||
DiagLoc = clang_getDiagnosticLocation(D);
|
||||
|
@ -2611,6 +2611,12 @@ static void printDiagnosticSet(CXDiagnosticSet Diags, unsigned indent) {
|
|||
fprintf(stderr, " [%s]", DiagOptionStr);
|
||||
}
|
||||
|
||||
DiagCat = clang_getDiagnosticCategoryText(D);
|
||||
DiagCatStr = clang_getCString(DiagCat);
|
||||
if (DiagCatStr) {
|
||||
fprintf(stderr, " [%s]", DiagCatStr);
|
||||
}
|
||||
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
printRanges(D, indent);
|
||||
|
|
|
@ -72,6 +72,8 @@ public:
|
|||
}
|
||||
|
||||
unsigned getCategory() const { return 0; }
|
||||
CXString getCategoryText() const { return createCXString(""); }
|
||||
|
||||
unsigned getNumRanges() const { return 0; }
|
||||
CXSourceRange getRange(unsigned Range) const { return clang_getNullRange(); }
|
||||
unsigned getNumFixIts() const { return 0; }
|
||||
|
@ -324,7 +326,7 @@ CXString clang_formatDiagnostic(CXDiagnostic Diagnostic, unsigned Options) {
|
|||
}
|
||||
|
||||
if (Options & CXDiagnostic_DisplayCategoryName) {
|
||||
CXString CategoryName = clang_getDiagnosticCategoryName(CategoryID);
|
||||
CXString CategoryName = clang_getDiagnosticCategoryText(Diagnostic);
|
||||
if (NeedBracket)
|
||||
Out << " [";
|
||||
if (NeedComma)
|
||||
|
@ -385,9 +387,16 @@ unsigned clang_getDiagnosticCategory(CXDiagnostic Diag) {
|
|||
}
|
||||
|
||||
CXString clang_getDiagnosticCategoryName(unsigned Category) {
|
||||
// Kept for backwards compatibility.
|
||||
return createCXString(DiagnosticIDs::getCategoryNameFromID(Category));
|
||||
}
|
||||
|
||||
CXString clang_getDiagnosticCategoryText(CXDiagnostic Diag) {
|
||||
if (CXDiagnosticImpl *D = static_cast<CXDiagnosticImpl *>(Diag))
|
||||
return D->getCategoryText();
|
||||
return createCXString("");
|
||||
}
|
||||
|
||||
unsigned clang_getDiagnosticNumRanges(CXDiagnostic Diag) {
|
||||
if (CXDiagnosticImpl *D = static_cast<CXDiagnosticImpl *>(Diag))
|
||||
return D->getNumRanges();
|
||||
|
|
|
@ -73,7 +73,10 @@ public:
|
|||
|
||||
/// \brief Return the category of the diagnostic.
|
||||
virtual unsigned getCategory() const = 0;
|
||||
|
||||
|
||||
/// \brief Return the category string of the diagnostic.
|
||||
virtual CXString getCategoryText() const = 0;
|
||||
|
||||
/// \brief Return the number of source ranges for the diagnostic.
|
||||
virtual unsigned getNumRanges() const = 0;
|
||||
|
||||
|
@ -132,6 +135,9 @@ struct CXStoredDiagnostic : public CXDiagnosticImpl {
|
|||
/// \brief Return the category of the diagnostic.
|
||||
virtual unsigned getCategory() const;
|
||||
|
||||
/// \brief Return the category string of the diagnostic.
|
||||
virtual CXString getCategoryText() const;
|
||||
|
||||
/// \brief Return the number of source ranges for the diagnostic.
|
||||
virtual unsigned getNumRanges() const;
|
||||
|
||||
|
|
|
@ -119,6 +119,10 @@ unsigned CXLoadedDiagnostic::getCategory() const {
|
|||
return category;
|
||||
}
|
||||
|
||||
CXString CXLoadedDiagnostic::getCategoryText() const {
|
||||
return cxstring::createCXString(CategoryText);
|
||||
}
|
||||
|
||||
unsigned CXLoadedDiagnostic::getNumRanges() const {
|
||||
return Ranges.size();
|
||||
}
|
||||
|
@ -650,6 +654,7 @@ LoadResult DiagLoader::readDiagnosticBlock(llvm::BitstreamCursor &Stream,
|
|||
D->category = Record[offset++];
|
||||
unsigned diagFlag = Record[offset++];
|
||||
D->DiagOption = diagFlag ? TopDiags.WarningFlags[diagFlag] : "";
|
||||
D->CategoryText = D->category ? TopDiags.Categories[D->category] : "";
|
||||
D->Spelling = TopDiags.makeString(BlobStart, BlobLen);
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -43,6 +43,9 @@ public:
|
|||
/// \brief Return the category of the diagnostic.
|
||||
virtual unsigned getCategory() const;
|
||||
|
||||
/// \brief Return the category string of the diagnostic.
|
||||
virtual CXString getCategoryText() const;
|
||||
|
||||
/// \brief Return the number of source ranges for the diagnostic.
|
||||
virtual unsigned getNumRanges() const;
|
||||
|
||||
|
@ -82,6 +85,7 @@ public:
|
|||
std::vector<std::pair<CXSourceRange, CXString> > FixIts;
|
||||
llvm::StringRef Spelling;
|
||||
llvm::StringRef DiagOption;
|
||||
llvm::StringRef CategoryText;
|
||||
unsigned severity;
|
||||
unsigned category;
|
||||
};
|
||||
|
|
|
@ -79,6 +79,11 @@ unsigned CXStoredDiagnostic::getCategory() const {
|
|||
return DiagnosticIDs::getCategoryNumberForDiag(Diag.getID());
|
||||
}
|
||||
|
||||
CXString CXStoredDiagnostic::getCategoryText() const {
|
||||
unsigned catID = DiagnosticIDs::getCategoryNumberForDiag(Diag.getID());
|
||||
return createCXString(DiagnosticIDs::getCategoryNameFromID(catID));
|
||||
}
|
||||
|
||||
unsigned CXStoredDiagnostic::getNumRanges() const {
|
||||
if (Diag.getLocation().isInvalid())
|
||||
return 0;
|
||||
|
|
|
@ -6,9 +6,9 @@ clang_CXXMethod_isStatic
|
|||
clang_CXXMethod_isVirtual
|
||||
clang_Cursor_getArgument
|
||||
clang_Cursor_getNumArguments
|
||||
clang_Cursor_getObjCSelectorIndex
|
||||
clang_Cursor_getSpellingNameRange
|
||||
clang_Cursor_getTranslationUnit
|
||||
clang_Cursor_getObjCSelectorIndex
|
||||
clang_Cursor_isNull
|
||||
clang_IndexAction_create
|
||||
clang_IndexAction_dispose
|
||||
|
@ -97,6 +97,7 @@ clang_getDefinitionSpellingAndExtent
|
|||
clang_getDiagnostic
|
||||
clang_getDiagnosticCategory
|
||||
clang_getDiagnosticCategoryName
|
||||
clang_getDiagnosticCategoryText
|
||||
clang_getDiagnosticFixIt
|
||||
clang_getDiagnosticInSet
|
||||
clang_getDiagnosticLocation
|
||||
|
|
Loading…
Reference in New Issue