diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/c-index-test/c-index-test.c | 3 | ||||
-rw-r--r-- | tools/libclang/CIndexDiagnostic.cpp | 93 | ||||
-rw-r--r-- | tools/libclang/libclang.darwin.exports | 3 | ||||
-rw-r--r-- | tools/libclang/libclang.exports | 3 |
4 files changed, 100 insertions, 2 deletions
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index c13f0313f2..8e76dc0b8b 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -309,7 +309,8 @@ void PrintDiagnostic(CXDiagnostic Diagnostic) { CXFile file; CXString Msg; unsigned display_opts = CXDiagnostic_DisplaySourceLocation - | CXDiagnostic_DisplayColumn | CXDiagnostic_DisplaySourceRanges; + | CXDiagnostic_DisplayColumn | CXDiagnostic_DisplaySourceRanges + | CXDiagnostic_DisplayOption; unsigned i, num_fixits; if (clang_getDiagnosticSeverity(Diagnostic) == CXDiagnostic_Ignored) diff --git a/tools/libclang/CIndexDiagnostic.cpp b/tools/libclang/CIndexDiagnostic.cpp index 35acd0da00..fa3b1cec7f 100644 --- a/tools/libclang/CIndexDiagnostic.cpp +++ b/tools/libclang/CIndexDiagnostic.cpp @@ -119,11 +119,61 @@ CXString clang_formatDiagnostic(CXDiagnostic Diagnostic, unsigned Options) { else Out << "<no diagnostic text>"; clang_disposeString(Text); + + if (Options & (CXDiagnostic_DisplayOption | CXDiagnostic_DisplayCategoryId | + CXDiagnostic_DisplayCategoryName)) { + bool NeedBracket = true; + bool NeedComma = false; + + if (Options & CXDiagnostic_DisplayOption) { + CXString OptionName = clang_getDiagnosticOption(Diagnostic, 0); + if (const char *OptionText = clang_getCString(OptionName)) { + if (OptionText[0]) { + Out << " [" << OptionText; + NeedBracket = false; + NeedComma = true; + } + } + clang_disposeString(OptionName); + } + + if (Options & (CXDiagnostic_DisplayCategoryId | + CXDiagnostic_DisplayCategoryName)) { + if (unsigned CategoryID = clang_getDiagnosticCategory(Diagnostic)) { + if (Options & CXDiagnostic_DisplayCategoryId) { + if (NeedBracket) + Out << " ["; + if (NeedComma) + Out << ", "; + Out << CategoryID; + NeedBracket = false; + NeedComma = true; + } + + if (Options & CXDiagnostic_DisplayCategoryName) { + CXString CategoryName = clang_getDiagnosticCategoryName(CategoryID); + if (NeedBracket) + Out << " ["; + if (NeedComma) + Out << ", "; + Out << clang_getCString(CategoryName); + NeedBracket = false; + NeedComma = true; + clang_disposeString(CategoryName); + } + } + } + + if (!NeedBracket) + Out << "]"; + } + return createCXString(Out.str(), true); } unsigned clang_defaultDiagnosticDisplayOptions() { - return CXDiagnostic_DisplaySourceLocation | CXDiagnostic_DisplayColumn; + return CXDiagnostic_DisplaySourceLocation | CXDiagnostic_DisplayColumn | + CXDiagnostic_DisplayOption; } enum CXDiagnosticSeverity clang_getDiagnosticSeverity(CXDiagnostic Diag) { @@ -161,6 +211,47 @@ CXString clang_getDiagnosticSpelling(CXDiagnostic Diag) { return createCXString(StoredDiag->Diag.getMessage(), false); } +CXString clang_getDiagnosticOption(CXDiagnostic Diag, CXString *Disable) { + if (Disable) + *Disable = createCXString(""); + + CXStoredDiagnostic *StoredDiag = static_cast<CXStoredDiagnostic *>(Diag); + if (!StoredDiag) + return createCXString(""); + + unsigned ID = StoredDiag->Diag.getID(); + if (const char *Option = DiagnosticIDs::getWarningOptionForDiag(ID)) { + if (Disable) + *Disable = createCXString((llvm::Twine("-Wno-") + Option).str()); + return createCXString((llvm::Twine("-W") + Option).str()); + } + + if (ID == diag::fatal_too_many_errors) { + if (Disable) + *Disable = createCXString("-ferror-limit=0"); + return createCXString("-ferror-limit="); + } + + bool EnabledByDefault; + if (DiagnosticIDs::isBuiltinExtensionDiag(ID, EnabledByDefault) && + !EnabledByDefault) + return createCXString("-pedantic"); + + return createCXString(""); +} + +unsigned clang_getDiagnosticCategory(CXDiagnostic Diag) { + CXStoredDiagnostic *StoredDiag = static_cast<CXStoredDiagnostic *>(Diag); + if (!StoredDiag) + return 0; + + return DiagnosticIDs::getCategoryNumberForDiag(StoredDiag->Diag.getID()); +} + +CXString clang_getDiagnosticCategoryName(unsigned Category) { + return createCXString(DiagnosticIDs::getCategoryNameFromID(Category)); +} + unsigned clang_getDiagnosticNumRanges(CXDiagnostic Diag) { CXStoredDiagnostic *StoredDiag = static_cast<CXStoredDiagnostic *>(Diag); if (!StoredDiag || StoredDiag->Diag.getLocation().isInvalid()) diff --git a/tools/libclang/libclang.darwin.exports b/tools/libclang/libclang.darwin.exports index 09f3cf7d21..5e8abf2533 100644 --- a/tools/libclang/libclang.darwin.exports +++ b/tools/libclang/libclang.darwin.exports @@ -58,10 +58,13 @@ _clang_getCursorType _clang_getCursorUSR _clang_getDefinitionSpellingAndExtent _clang_getDiagnostic +_clang_getDiagnosticCategory +_clang_getDiagnosticCategoryName _clang_getDiagnosticFixIt _clang_getDiagnosticLocation _clang_getDiagnosticNumFixIts _clang_getDiagnosticNumRanges +_clang_getDiagnosticOption _clang_getDiagnosticRange _clang_getDiagnosticSeverity _clang_getDiagnosticSpelling diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index 6cbd2c63b7..ca9a9d1016 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -58,10 +58,13 @@ clang_getCursorType clang_getCursorUSR clang_getDefinitionSpellingAndExtent clang_getDiagnostic +clang_getDiagnosticCategory +clang_getDiagnosticCategoryName clang_getDiagnosticFixIt clang_getDiagnosticLocation clang_getDiagnosticNumFixIts clang_getDiagnosticNumRanges +clang_getDiagnosticOption clang_getDiagnosticRange clang_getDiagnosticSeverity clang_getDiagnosticSpelling |