diff options
author | Ted Kremenek <kremenek@apple.com> | 2011-11-10 08:43:12 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2011-11-10 08:43:12 +0000 |
commit | d010ba47294d21bc303fdfb1bca4e18ea92e366c (patch) | |
tree | 6bb99a336fb8f7b134deaa9c837233e48786ba37 /clang/tools/libclang/CIndexDiagnostic.cpp | |
parent | 08ef466048e06328401fd06527b20315902cab19 (diff) | |
download | bcm5719-llvm-d010ba47294d21bc303fdfb1bca4e18ea92e366c.tar.gz bcm5719-llvm-d010ba47294d21bc303fdfb1bca4e18ea92e366c.zip |
serialized diagnostics: implement full deserialization of clang diagnostics via the libclang API.
I've tested it on simple cases and it works. Test cases to follow as well as a few tweaks.
llvm-svn: 144269
Diffstat (limited to 'clang/tools/libclang/CIndexDiagnostic.cpp')
-rw-r--r-- | clang/tools/libclang/CIndexDiagnostic.cpp | 73 |
1 files changed, 66 insertions, 7 deletions
diff --git a/clang/tools/libclang/CIndexDiagnostic.cpp b/clang/tools/libclang/CIndexDiagnostic.cpp index 1beb9938635..436ea37038a 100644 --- a/clang/tools/libclang/CIndexDiagnostic.cpp +++ b/clang/tools/libclang/CIndexDiagnostic.cpp @@ -28,27 +28,58 @@ using namespace clang::cxloc; using namespace clang::cxstring; using namespace llvm; + +CXDiagnosticSetImpl::~CXDiagnosticSetImpl() { + for (std::vector<CXDiagnosticImpl *>::iterator it = Diagnostics.begin(), + et = Diagnostics.end(); + it != et; ++it) { + delete *it; + } +} + +CXDiagnosticImpl::~CXDiagnosticImpl() {} + +static CXDiagnosticSetImpl *lazyCreateDiags(CXTranslationUnit TU) { + if (!TU->Diagnostics) { + ASTUnit *AU = static_cast<ASTUnit *>(TU->TUData); + CXDiagnosticSetImpl *Set = new CXDiagnosticSetImpl(); + TU->Diagnostics = Set; + + for (ASTUnit::stored_diag_iterator it = AU->stored_diag_begin(), + ei = AU->stored_diag_end(); it != ei; ++it) { + CXStoredDiagnostic *D = + new CXStoredDiagnostic(*it, AU->getASTContext().getLangOptions()); + Set->appendDiagnostic(D); + } + } + return static_cast<CXDiagnosticSetImpl*>(TU->Diagnostics); +} + //----------------------------------------------------------------------------- // C Interface Routines //----------------------------------------------------------------------------- extern "C" { unsigned clang_getNumDiagnostics(CXTranslationUnit Unit) { - ASTUnit *CXXUnit = static_cast<ASTUnit *>(Unit->TUData); - return CXXUnit? CXXUnit->stored_diag_size() : 0; + if (!Unit->TUData) + return 0; + return lazyCreateDiags(Unit)->getNumDiagnostics(); } CXDiagnostic clang_getDiagnostic(CXTranslationUnit Unit, unsigned Index) { - ASTUnit *CXXUnit = static_cast<ASTUnit *>(Unit->TUData); - if (!CXXUnit || Index >= CXXUnit->stored_diag_size()) + if (!Unit->TUData) + return 0; + + CXDiagnosticSetImpl *Diags = lazyCreateDiags(Unit); + if (Index >= Diags->getNumDiagnostics()) return 0; - return new CXStoredDiagnostic(CXXUnit->stored_diag_begin()[Index], - CXXUnit->getASTContext().getLangOptions()); + return Diags->getDiagnostic(Index); } void clang_disposeDiagnostic(CXDiagnostic Diagnostic) { - delete static_cast<CXDiagnosticImpl *>(Diagnostic); + // No-op. Kept as a legacy API. CXDiagnostics are now managed + // by the enclosing CXDiagnosticSet. } CXString clang_formatDiagnostic(CXDiagnostic Diagnostic, unsigned Options) { @@ -243,4 +274,32 @@ CXString clang_getDiagnosticFixIt(CXDiagnostic Diag, unsigned FixIt, return D->getFixIt(FixIt, ReplacementRange); } +void clang_disposeDiagnosticSet(CXDiagnosticSet Diags) { + CXDiagnosticSetImpl *D = static_cast<CXDiagnosticSetImpl*>(Diags); + if (D->isExternallyManaged()) + delete D; +} + +CXDiagnostic clang_getDiagnosticInSet(CXDiagnosticSet Diags, + unsigned Index) { + if (CXDiagnosticSetImpl *D = static_cast<CXDiagnosticSetImpl*>(Diags)) + if (Index < D->getNumDiagnostics()) + return D->getDiagnostic(Index); + return 0; +} + +CXDiagnosticSet clang_getChildDiagnostics(CXDiagnostic Diag) { + if (CXDiagnosticImpl *D = static_cast<CXDiagnosticImpl *>(Diag)) { + CXDiagnosticSetImpl &ChildDiags = D->getChildDiagnostics(); + return ChildDiags.empty() ? 0 : (CXDiagnosticSet) &ChildDiags; + } + return 0; +} + +unsigned clang_getNumDiagnosticsInSet(CXDiagnosticSet Diags) { + if (CXDiagnosticSetImpl *D = static_cast<CXDiagnosticSetImpl*>(Diags)) + return D->getNumDiagnostics(); + return 0; +} + } // end extern "C" |