diff options
author | Ted Kremenek <kremenek@apple.com> | 2012-04-12 00:03:31 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2012-04-12 00:03:31 +0000 |
commit | 78d5d3bb9386a5aa31d19445eb8f81bf2652acb4 (patch) | |
tree | 5bc532482d3f9dd23f983cc62120ac4256e2b9c0 | |
parent | 104dbf982582f16888fb15f9342fce9748af48c5 (diff) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154567 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang-c/Index.h | 25 | ||||
-rw-r--r-- | test/Misc/serialized-diags-single-issue.c | 2 | ||||
-rw-r--r-- | tools/c-index-test/c-index-test.c | 10 | ||||
-rw-r--r-- | tools/libclang/CIndexDiagnostic.cpp | 11 | ||||
-rw-r--r-- | tools/libclang/CIndexDiagnostic.h | 8 | ||||
-rw-r--r-- | tools/libclang/CXLoadedDiagnostic.cpp | 5 | ||||
-rw-r--r-- | tools/libclang/CXLoadedDiagnostic.h | 4 | ||||
-rw-r--r-- | tools/libclang/CXStoredDiagnostic.cpp | 5 | ||||
-rw-r--r-- | tools/libclang/libclang.exports | 3 |
9 files changed, 65 insertions, 8 deletions
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 18316b4d33..b297e54512 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -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 diff --git a/test/Misc/serialized-diags-single-issue.c b/test/Misc/serialized-diags-single-issue.c index a6af836e38..938dda3f0d 100644 --- a/test/Misc/serialized-diags-single-issue.c +++ b/test/Misc/serialized-diags-single-issue.c @@ -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 diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index a81de2717f..04e7a506e2 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -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); diff --git a/tools/libclang/CIndexDiagnostic.cpp b/tools/libclang/CIndexDiagnostic.cpp index d8a2b05b20..8fbe3d8c3d 100644 --- a/tools/libclang/CIndexDiagnostic.cpp +++ b/tools/libclang/CIndexDiagnostic.cpp @@ -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(); diff --git a/tools/libclang/CIndexDiagnostic.h b/tools/libclang/CIndexDiagnostic.h index 3066998237..b1c3978e0a 100644 --- a/tools/libclang/CIndexDiagnostic.h +++ b/tools/libclang/CIndexDiagnostic.h @@ -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; diff --git a/tools/libclang/CXLoadedDiagnostic.cpp b/tools/libclang/CXLoadedDiagnostic.cpp index d52c18319f..e5b6ccc5b7 100644 --- a/tools/libclang/CXLoadedDiagnostic.cpp +++ b/tools/libclang/CXLoadedDiagnostic.cpp @@ -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; } diff --git a/tools/libclang/CXLoadedDiagnostic.h b/tools/libclang/CXLoadedDiagnostic.h index 9eff144901..d4a321e0e1 100644 --- a/tools/libclang/CXLoadedDiagnostic.h +++ b/tools/libclang/CXLoadedDiagnostic.h @@ -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; }; diff --git a/tools/libclang/CXStoredDiagnostic.cpp b/tools/libclang/CXStoredDiagnostic.cpp index c1bcd74387..8284dc9618 100644 --- a/tools/libclang/CXStoredDiagnostic.cpp +++ b/tools/libclang/CXStoredDiagnostic.cpp @@ -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; diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index 07bdece8eb..d3b64dbd0f 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -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 |