diff --git a/plugins/clang/duchain/parsesession.h b/plugins/clang/duchain/parsesession.h --- a/plugins/clang/duchain/parsesession.h +++ b/plugins/clang/duchain/parsesession.h @@ -79,6 +79,8 @@ /// TODO: share this file for all TUs that use the same defines (probably most in a project) /// best would be a PCH, if possible QTemporaryFile m_definesFile; + // cached ProblemPointer representation for diagnostics + QVector m_diagnosticsCache; }; /** diff --git a/plugins/clang/duchain/parsesession.cpp b/plugins/clang/duchain/parsesession.cpp --- a/plugins/clang/duchain/parsesession.cpp +++ b/plugins/clang/duchain/parsesession.cpp @@ -380,6 +380,7 @@ void ParseSessionData::setUnit(CXTranslationUnit unit) { m_unit = unit; + m_diagnosticsCache.clear(); if (m_unit) { const ClangString unitFile(clang_getTranslationUnitSpelling(unit)); m_file = clang_getFile(m_unit, unitFile.c_str()); @@ -449,6 +450,8 @@ // extra clang diagnostics const uint numDiagnostics = clang_getNumDiagnostics(d->m_unit); problems.reserve(numDiagnostics); + d->m_diagnosticsCache.resize(numDiagnostics); + for (uint i = 0; i < numDiagnostics; ++i) { auto diagnostic = clang_getDiagnostic(d->m_unit, i); @@ -461,7 +464,11 @@ continue; } - ProblemPointer problem(ClangDiagnosticEvaluator::createProblem(diagnostic, d->m_unit)); + auto& problem = d->m_diagnosticsCache[i]; + if (!problem) { + problem = ClangDiagnosticEvaluator::createProblem(diagnostic, d->m_unit); + } + problems << problem; clang_disposeDiagnostic(diagnostic);