forked from qt-creator/qt-creator
Clang: Show info bar for parse errors in header files
...because those errors can lead to a substantial performance/functional regression. The actual diagnostics (possibly with children) are shown as details in the info bar. The info bar can be hidden with the "Do Not Show Again" button. Re-enabling the info bar is possible with the new editor tool bar button. Change-Id: I03394ff8e3c84127946b0b791930b28a385f5a46 Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -112,11 +112,12 @@ TranslationUnit::CodeCompletionResult TranslationUnit::complete(
|
||||
}
|
||||
|
||||
void TranslationUnit::extractDocumentAnnotations(
|
||||
QVector<DiagnosticContainer> &diagnostics,
|
||||
DiagnosticContainer &firstHeaderErrorDiagnostic,
|
||||
QVector<DiagnosticContainer> &mainFileDiagnostics,
|
||||
QVector<HighlightingMarkContainer> &highlightingMarks,
|
||||
QVector<SourceRangeContainer> &skippedSourceRanges) const
|
||||
{
|
||||
diagnostics = mainFileDiagnostics();
|
||||
extractDiagnostics(firstHeaderErrorDiagnostic, mainFileDiagnostics);
|
||||
highlightingMarks = this->highlightingMarks().toHighlightingMarksContainers();
|
||||
skippedSourceRanges = this->skippedSourceRanges().toSourceRangeContainers();
|
||||
}
|
||||
@@ -126,15 +127,6 @@ DiagnosticSet TranslationUnit::diagnostics() const
|
||||
return DiagnosticSet(clang_getDiagnosticSetFromTU(m_cxTranslationUnit));
|
||||
}
|
||||
|
||||
QVector<DiagnosticContainer> TranslationUnit::mainFileDiagnostics() const
|
||||
{
|
||||
const auto isMainFileDiagnostic = [this](const Diagnostic &diagnostic) {
|
||||
return diagnostic.location().filePath() == m_filePath;
|
||||
};
|
||||
|
||||
return diagnostics().toDiagnosticContainers(isMainFileDiagnostic);
|
||||
}
|
||||
|
||||
SourceLocation TranslationUnit::sourceLocationAt(uint line,uint column) const
|
||||
{
|
||||
return SourceLocation(m_cxTranslationUnit, m_filePath, line, column);
|
||||
@@ -193,4 +185,35 @@ SkippedSourceRanges TranslationUnit::skippedSourceRanges() const
|
||||
return SkippedSourceRanges(m_cxTranslationUnit, m_filePath.constData());
|
||||
}
|
||||
|
||||
static bool isMainFileDiagnostic(const Utf8String &mainFilePath, const Diagnostic &diagnostic)
|
||||
{
|
||||
return diagnostic.location().filePath() == mainFilePath;
|
||||
}
|
||||
|
||||
static bool isHeaderErrorDiagnostic(const Utf8String &mainFilePath, const Diagnostic &diagnostic)
|
||||
{
|
||||
const bool isCritical = diagnostic.severity() == DiagnosticSeverity::Error
|
||||
|| diagnostic.severity() == DiagnosticSeverity::Fatal;
|
||||
return isCritical && diagnostic.location().filePath() != mainFilePath;
|
||||
}
|
||||
|
||||
void TranslationUnit::extractDiagnostics(DiagnosticContainer &firstHeaderErrorDiagnostic,
|
||||
QVector<DiagnosticContainer> &mainFileDiagnostics) const
|
||||
{
|
||||
mainFileDiagnostics.clear();
|
||||
mainFileDiagnostics.reserve(int(diagnostics().size()));
|
||||
|
||||
bool hasFirstHeaderErrorDiagnostic = false;
|
||||
|
||||
for (const Diagnostic &diagnostic : diagnostics()) {
|
||||
if (!hasFirstHeaderErrorDiagnostic && isHeaderErrorDiagnostic(m_filePath, diagnostic)) {
|
||||
hasFirstHeaderErrorDiagnostic = true;
|
||||
firstHeaderErrorDiagnostic = diagnostic.toDiagnosticContainer();
|
||||
}
|
||||
|
||||
if (isMainFileDiagnostic(m_filePath, diagnostic))
|
||||
mainFileDiagnostics.push_back(diagnostic.toDiagnosticContainer());
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ClangBackEnd
|
||||
|
||||
Reference in New Issue
Block a user