diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2016-10-04 16:23:42 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2016-10-11 14:01:14 +0000 |
commit | 9d55d8485cda7077d1280f3335102ffd036240b5 (patch) | |
tree | 5a0485198a1a72f23b2de4206bf40bb540208319 /src/plugins | |
parent | cb24872f439a92e7ab0d6ed6919c9c253707c3d9 (diff) | |
download | qt-creator-9d55d8485cda7077d1280f3335102ffd036240b5.tar.gz |
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>
Diffstat (limited to 'src/plugins')
13 files changed, 199 insertions, 29 deletions
diff --git a/src/plugins/clangcodemodel/clangbackendipcintegration.cpp b/src/plugins/clangcodemodel/clangbackendipcintegration.cpp index 1edce8fbd4..831a3bdea6 100644 --- a/src/plugins/clangcodemodel/clangbackendipcintegration.cpp +++ b/src/plugins/clangcodemodel/clangbackendipcintegration.cpp @@ -182,7 +182,9 @@ void IpcReceiver::documentAnnotationsChanged(const DocumentAnnotationsChangedMes const QString documentProjectPartId = CppTools::CppToolsBridge::projectPartIdForFile(filePath); if (projectPartId == documentProjectPartId) { const quint32 documentRevision = message.fileContainer().documentRevision(); - processor->updateCodeWarnings(message.diagnostics(), documentRevision); + processor->updateCodeWarnings(message.diagnostics(), + message.firstHeaderErrorDiagnostic(), + documentRevision); processor->updateHighlighting(message.highlightingMarks(), message.skippedPreprocessorRanges(), documentRevision); diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp index 2bfa7baac7..52c441443d 100644 --- a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp +++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp @@ -41,6 +41,7 @@ #include <utils/proxyaction.h> #include <utils/qtcassert.h> +#include <QFileInfo> #include <QTextBlock> namespace { diff --git a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp index 52c097f305..5b6c48c953 100644 --- a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp +++ b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp @@ -129,9 +129,10 @@ enum IndentType { IndentDiagnostic, DoNotIndentDiagnostic }; QWidget *createDiagnosticLabel(const ClangBackEnd::DiagnosticContainer &diagnostic, const QString &mainFilePath, - IndentType indentType = DoNotIndentDiagnostic) + IndentType indentType = DoNotIndentDiagnostic, + bool enableClickableFixits = true) { - const bool hasFixit = !diagnostic.fixIts().isEmpty(); + const bool hasFixit = enableClickableFixits ? !diagnostic.fixIts().isEmpty() : false; const QString diagnosticText = diagnostic.text().toString().toHtmlEscaped(); const QString text = clickableLocation(mainFilePath, diagnostic.location()) + QStringLiteral(": ") @@ -159,25 +160,35 @@ class MainDiagnosticWidget : public QWidget { Q_OBJECT public: - MainDiagnosticWidget(const ClangBackEnd::DiagnosticContainer &diagnostic) + MainDiagnosticWidget(const ClangBackEnd::DiagnosticContainer &diagnostic, + const ClangCodeModel::Internal::DisplayHints &displayHints) { setContentsMargins(0, 0, 0, 0); auto *mainLayout = createLayout<QVBoxLayout>(); - // Set up header row: category + responsible option - const QString category = diagnostic.category(); - const QString responsibleOption = diagnostic.enableOption(); const ClangBackEnd::SourceLocationContainer location = diagnostic.location(); - auto *headerLayout = createLayout<QHBoxLayout>(); - headerLayout->addWidget(new QLabel(wrapInBoldTags(category)), 1); + // Set up header row: category + responsible option + if (displayHints.showMainDiagnosticHeader) { + const QString category = diagnostic.category(); + const QString responsibleOption = diagnostic.enableOption(); + + auto *headerLayout = createLayout<QHBoxLayout>(); + headerLayout->addWidget(new QLabel(wrapInBoldTags(category)), 1); - auto *responsibleOptionLabel = new QLabel(wrapInColor(responsibleOption, "gray")); - headerLayout->addWidget(responsibleOptionLabel, 0); - mainLayout->addLayout(headerLayout); + auto *responsibleOptionLabel = new QLabel(wrapInColor(responsibleOption, "gray")); + headerLayout->addWidget(responsibleOptionLabel, 0); + mainLayout->addLayout(headerLayout); + } // Set up main row: diagnostic text - mainLayout->addWidget(createDiagnosticLabel(diagnostic, location.filePath())); + const Utf8String mainFilePath = displayHints.showFileNameInMainDiagnostic + ? Utf8String() + : location.filePath(); + mainLayout->addWidget(createDiagnosticLabel(diagnostic, + mainFilePath, + DoNotIndentDiagnostic, + displayHints.enableClickableFixits)); setLayout(mainLayout); } @@ -186,26 +197,35 @@ public: void addChildrenToLayout(const QString &mainFilePath, const QVector<ClangBackEnd::DiagnosticContainer>::const_iterator first, const QVector<ClangBackEnd::DiagnosticContainer>::const_iterator last, + bool enableClickableFixits, QLayout &boxLayout) { - for (auto it = first; it != last; ++it) - boxLayout.addWidget(createDiagnosticLabel(*it, mainFilePath, IndentDiagnostic)); + for (auto it = first; it != last; ++it) { + boxLayout.addWidget(createDiagnosticLabel(*it, + mainFilePath, + IndentDiagnostic, + enableClickableFixits)); + } } void setupChildDiagnostics(const QString &mainFilePath, const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics, + bool enableClickableFixits, QLayout &boxLayout) { if (diagnostics.size() <= 10) { - addChildrenToLayout(mainFilePath, diagnostics.begin(), diagnostics.end(), boxLayout); + addChildrenToLayout(mainFilePath, diagnostics.begin(), diagnostics.end(), + enableClickableFixits, boxLayout); } else { - addChildrenToLayout(mainFilePath, diagnostics.begin(), diagnostics.begin() + 7, boxLayout); + addChildrenToLayout(mainFilePath, diagnostics.begin(), diagnostics.begin() + 7, + enableClickableFixits, boxLayout); auto ellipsisLabel = new QLabel(QStringLiteral("...")); ellipsisLabel->setContentsMargins(childIndentationOnTheLeftInPixel, 0, 0, 0); boxLayout.addWidget(ellipsisLabel); - addChildrenToLayout(mainFilePath, diagnostics.end() - 3, diagnostics.end(), boxLayout); + addChildrenToLayout(mainFilePath, diagnostics.end() - 3, diagnostics.end(), + enableClickableFixits, boxLayout); } } @@ -214,13 +234,18 @@ void setupChildDiagnostics(const QString &mainFilePath, namespace ClangCodeModel { namespace Internal { -void addToolTipToLayout(const ClangBackEnd::DiagnosticContainer &diagnostic, QLayout *target) +void addToolTipToLayout(const ClangBackEnd::DiagnosticContainer &diagnostic, + QLayout *target, + const DisplayHints &displayHints) { // Set up header and text row for main diagnostic - target->addWidget(new MainDiagnosticWidget(diagnostic)); + target->addWidget(new MainDiagnosticWidget(diagnostic, displayHints)); // Set up child rows for notes - setupChildDiagnostics(diagnostic.location().filePath(), diagnostic.children(), *target); + setupChildDiagnostics(diagnostic.location().filePath(), + diagnostic.children(), + displayHints.enableClickableFixits, + *target); } } // namespace Internal diff --git a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.h b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.h index 600ccf22d8..839952fc77 100644 --- a/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.h +++ b/src/plugins/clangcodemodel/clangdiagnostictooltipwidget.h @@ -34,7 +34,15 @@ QT_END_NAMESPACE namespace ClangCodeModel { namespace Internal { -void addToolTipToLayout(const ClangBackEnd::DiagnosticContainer &diagnostic, QLayout *target); +struct DisplayHints { + bool showMainDiagnosticHeader = true; + bool showFileNameInMainDiagnostic = false; + bool enableClickableFixits = true; +}; + +void addToolTipToLayout(const ClangBackEnd::DiagnosticContainer &diagnostic, + QLayout *target, + const DisplayHints &displayHints = DisplayHints()); } // namespace Internal } // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 99c6a67033..09a7b76b6f 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -57,6 +57,8 @@ #include <utils/runextensions.h> #include <QTextBlock> +#include <QVBoxLayout> +#include <QWidget> namespace ClangCodeModel { namespace Internal { @@ -167,14 +169,21 @@ void ClangEditorDocumentProcessor::clearProjectPart() m_projectPart.clear(); } -void ClangEditorDocumentProcessor::updateCodeWarnings(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics, - uint documentRevision) +void ClangEditorDocumentProcessor::updateCodeWarnings( + const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics, + const ClangBackEnd::DiagnosticContainer &firstHeaderErrorDiagnostic, + uint documentRevision) { if (documentRevision == revision()) { m_diagnosticManager.processNewDiagnostics(diagnostics); const auto codeWarnings = m_diagnosticManager.takeExtraSelections(); const auto fixitAvailableMarkers = m_diagnosticManager.takeFixItAvailableMarkers(); - emit codeWarningsUpdated(revision(), codeWarnings, fixitAvailableMarkers); + const auto creator = creatorForHeaderErrorDiagnosticWidget(firstHeaderErrorDiagnostic); + + emit codeWarningsUpdated(revision(), + codeWarnings, + creator, + fixitAvailableMarkers); } } namespace { @@ -333,6 +342,38 @@ void ClangEditorDocumentProcessor::requestDocumentAnnotations(const QString &pro m_ipcCommunicator.requestDocumentAnnotations(fileContainer); } +static Internal::DisplayHints displayHintsForInfoBar() +{ + Internal::DisplayHints displayHints; + displayHints.showMainDiagnosticHeader = false; + displayHints.showFileNameInMainDiagnostic = true; + displayHints.enableClickableFixits = false; // Tool chain headers might be changed, so disable. + + return displayHints; +} + +CppTools::BaseEditorDocumentProcessor::HeaderErrorDiagnosticWidgetCreator +ClangEditorDocumentProcessor::creatorForHeaderErrorDiagnosticWidget( + const ClangBackEnd::DiagnosticContainer &firstHeaderErrorDiagnostic) +{ + if (firstHeaderErrorDiagnostic.text().isEmpty()) + return CppTools::BaseEditorDocumentProcessor::HeaderErrorDiagnosticWidgetCreator(); + + return [firstHeaderErrorDiagnostic]() { + auto vbox = new QVBoxLayout; + vbox->setMargin(0); + vbox->setContentsMargins(10, 0, 0, 2); + vbox->setSpacing(2); + + addToolTipToLayout(firstHeaderErrorDiagnostic, vbox, displayHintsForInfoBar()); + + auto widget = new QWidget; + widget->setLayout(vbox); + + return widget; + }; +} + static CppTools::ProjectPart projectPartForLanguageOption(CppTools::ProjectPart *projectPart) { if (projectPart) diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index a23d93d72f..10355e349d 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -68,6 +68,7 @@ public: void clearProjectPart(); void updateCodeWarnings(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics, + const ClangBackEnd::DiagnosticContainer &firstHeaderErrorDiagnostic, uint documentRevision); void updateHighlighting(const QVector<ClangBackEnd::HighlightingMarkContainer> &highlightingMarks, const QVector<ClangBackEnd::SourceRangeContainer> &skippedPreprocessorRanges, @@ -96,6 +97,8 @@ private: void registerTranslationUnitForEditor(CppTools::ProjectPart *projectPart); void updateTranslationUnitIfProjectPartExists(); void requestDocumentAnnotations(const QString &projectpartId); + HeaderErrorDiagnosticWidgetCreator creatorForHeaderErrorDiagnosticWidget( + const ClangBackEnd::DiagnosticContainer &firstHeaderErrorDiagnostic); ClangBackEnd::FileContainer fileContainerWithArguments(CppTools::ProjectPart *projectPart) const; ClangBackEnd::FileContainer fileContainerWithDocumentContent(const QString &projectpartId) const; diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp index 137787daa6..8057d66cb6 100644 --- a/src/plugins/clangcodemodel/clangtextmark.cpp +++ b/src/plugins/clangcodemodel/clangtextmark.cpp @@ -84,7 +84,7 @@ void ClangTextMark::setIcon(ClangBackEnd::DiagnosticSeverity severity) bool ClangTextMark::addToolTipContent(QLayout *target) { - Internal::addToolTipToLayout(m_diagnostic, target); + Internal::addToolTipToLayout(m_diagnostic, target, Internal::DisplayHints()); return true; } diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index c26a8b25f1..0492635d1a 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -44,6 +44,7 @@ #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/documentmodel.h> +#include <coreplugin/infobar.h> #include <cpptools/cppchecksymbols.h> #include <cpptools/cppcodeformatter.h> @@ -77,6 +78,7 @@ #include <cplusplus/FastPreprocessor.h> #include <cplusplus/MatchingText.h> #include <utils/qtcassert.h> +#include <utils/utilsicons.h> #include <QApplication> #include <QAction> @@ -126,9 +128,13 @@ public: QSharedPointer<FunctionDeclDefLink> m_declDefLink; QScopedPointer<FollowSymbolUnderCursor> m_followSymbolUnderCursor; - QToolButton *m_preprocessorButton; + + QToolButton *m_preprocessorButton = nullptr; + QToolButton *m_headerErrorsIndicatorButton = nullptr; CppSelectionChanger m_cppSelectionChanger; + + CppEditorWidget::HeaderErrorDiagnosticWidgetCreator m_headerErrorDiagnosticWidgetCreator; }; CppEditorWidgetPrivate::CppEditorWidgetPrivate(CppEditorWidget *q) @@ -139,7 +145,6 @@ CppEditorWidgetPrivate::CppEditorWidgetPrivate(CppEditorWidget *q) , m_useSelectionsUpdater(q) , m_declDefLinkFinder(new FunctionDeclDefLinkFinder(q)) , m_followSymbolUnderCursor(new FollowSymbolUnderCursor(q)) - , m_preprocessorButton(0) , m_cppSelectionChanger() { } @@ -224,7 +229,15 @@ void CppEditorWidget::finalizeInitialization() connect(cmd, &Command::keySequenceChanged, this, &CppEditorWidget::updatePreprocessorButtonTooltip); updatePreprocessorButtonTooltip(); connect(d->m_preprocessorButton, &QAbstractButton::clicked, this, &CppEditorWidget::showPreProcessorWidget); + + d->m_headerErrorsIndicatorButton = new QToolButton(this); + d->m_headerErrorsIndicatorButton->setIcon(Utils::Icons::WARNING_TOOLBAR.pixmap()); + connect(d->m_headerErrorsIndicatorButton, &QAbstractButton::clicked, + this, &CppEditorWidget::showHeaderErrorInfoBar); + d->m_headerErrorsIndicatorButton->setEnabled(false); + insertExtraToolBarWidget(TextEditorWidget::Left, d->m_preprocessorButton); + insertExtraToolBarWidget(TextEditorWidget::Left, d->m_headerErrorsIndicatorButton); insertExtraToolBarWidget(TextEditorWidget::Left, d->m_cppEditorOutline->widget()); } @@ -287,6 +300,7 @@ void CppEditorWidget::onCppDocumentUpdated() void CppEditorWidget::onCodeWarningsUpdated(unsigned revision, const QList<QTextEdit::ExtraSelection> selections, + const HeaderErrorDiagnosticWidgetCreator &creator, const TextEditor::RefactorMarkers &refactorMarkers) { if (revision != documentRevision()) @@ -294,6 +308,9 @@ void CppEditorWidget::onCodeWarningsUpdated(unsigned revision, setExtraSelections(TextEditorWidget::CodeWarningsSelection, selections); setRefactorMarkers(refactorMarkersWithoutClangMarkers() + refactorMarkers); + + d->m_headerErrorDiagnosticWidgetCreator = creator; + updateHeaderErrorWidgets(); } void CppEditorWidget::onIfdefedOutBlocksUpdated(unsigned revision, @@ -304,6 +321,24 @@ void CppEditorWidget::onIfdefedOutBlocksUpdated(unsigned revision, setIfdefedOutBlocks(ifdefedOutBlocks); } +void CppEditorWidget::updateHeaderErrorWidgets() +{ + const Id id(Constants::ERRORS_IN_HEADER_FILES); + InfoBar *infoBar = textDocument()->infoBar(); + + infoBar->removeInfo(id); + + if (d->m_headerErrorDiagnosticWidgetCreator) { + if (infoBar->canInfoBeAdded(id)) { + addHeaderErrorInfoBarEntryAndHideIndicator(); + } else { + d->m_headerErrorsIndicatorButton->setEnabled(true); + } + } else { + d->m_headerErrorsIndicatorButton->setEnabled(false); + } +} + void CppEditorWidget::findUsages() { if (!d->m_modelManager) @@ -399,6 +434,25 @@ void CppEditorWidget::renameSymbolUnderCursorBuiltin() renameUsages(); // Rename non-local symbol or macro } +void CppEditorWidget::addHeaderErrorInfoBarEntryAndHideIndicator() const +{ + InfoBarEntry info(Constants::ERRORS_IN_HEADER_FILES, + tr("<b>Warning</b>: The code model could not parse an included file, " + "which might lead to slow or incorrect code completion and " + "highlighting, for example."), + InfoBarEntry::GlobalSuppressionEnabled); + info.setDetailsWidgetCreator(d->m_headerErrorDiagnosticWidgetCreator); + info.setShowDefaultCancelButton(false); + info.setSuppressionButtonInfo([this](){ + d->m_headerErrorsIndicatorButton->setEnabled(true); + }); + + InfoBar *infoBar = textDocument()->infoBar(); + infoBar->addInfo(info); + + d->m_headerErrorsIndicatorButton->setEnabled(false); +} + namespace { QList<ProjectPart::Ptr> fetchProjectParts(CppTools::CppModelManager *modelManager, @@ -970,5 +1024,14 @@ void CppEditorWidget::showPreProcessorWidget() } } +void CppEditorWidget::showHeaderErrorInfoBar() +{ + const Id id(Constants::ERRORS_IN_HEADER_FILES); + QTC_CHECK(!textDocument()->infoBar()->canInfoBeAdded(id)); + + InfoBar::globallyUnsuppressInfo(id); + addHeaderErrorInfoBarEntryAndHideIndicator(); +} + } // namespace Internal } // namespace CppEditor diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h index 7fb26e93c3..cce22cebcd 100644 --- a/src/plugins/cppeditor/cppeditor.h +++ b/src/plugins/cppeditor/cppeditor.h @@ -31,6 +31,10 @@ #include <QScopedPointer> +namespace Core { +class InfoBarEntry; +} + namespace CppTools { class CppEditorOutline; class RefactoringEngineInterface; @@ -87,6 +91,7 @@ public: void switchDeclarationDefinition(bool inNextSplit); void showPreProcessorWidget(); + void showHeaderErrorInfoBar(); void findUsages(); void renameSymbolUnderCursor(); @@ -108,6 +113,9 @@ protected: void slotCodeStyleSettingsChanged(const QVariant &) override; +public: + using HeaderErrorDiagnosticWidgetCreator = std::function<QWidget*()>; + private: void updateFunctionDeclDefLink(); void updateFunctionDeclDefLinkNow(); @@ -118,10 +126,12 @@ private: void onCodeWarningsUpdated(unsigned revision, const QList<QTextEdit::ExtraSelection> selections, + const HeaderErrorDiagnosticWidgetCreator &creator, const TextEditor::RefactorMarkers &refactorMarkers); void onIfdefedOutBlocksUpdated(unsigned revision, const QList<TextEditor::BlockRange> ifdefedOutBlocks); + void updateHeaderErrorWidgets(); void updateSemanticInfo(const CppTools::SemanticInfo &semanticInfo, bool updateUseSelectionSynchronously = false); void updatePreprocessorButtonTooltip(); @@ -140,6 +150,8 @@ private: void renameSymbolUnderCursorClang(); void renameSymbolUnderCursorBuiltin(); + void addHeaderErrorInfoBarEntryAndHideIndicator() const; + CppTools::ProjectPart *projectPart() const; private: diff --git a/src/plugins/cppeditor/cppeditorconstants.h b/src/plugins/cppeditor/cppeditorconstants.h index 1d72be7a7a..761822d101 100644 --- a/src/plugins/cppeditor/cppeditorconstants.h +++ b/src/plugins/cppeditor/cppeditorconstants.h @@ -36,6 +36,7 @@ const char OPEN_DECLARATION_DEFINITION_IN_NEXT_SPLIT[] = "CppEditor.OpenDeclarat const char RENAME_SYMBOL_UNDER_CURSOR[] = "CppEditor.RenameSymbolUnderCursor"; const char FIND_USAGES[] = "CppEditor.FindUsages"; const char OPEN_PREPROCESSOR_DIALOG[] = "CppEditor.OpenPreprocessorDialog"; +const char ERRORS_IN_HEADER_FILES[] = "CppEditor.ErrorsInHeaderFiles"; const char M_REFACTORING_MENU_INSERTION_POINT[] = "CppEditor.RefactorGroup"; const char UPDATE_CODEMODEL[] = "CppEditor.UpdateCodeModel"; const char INSPECT_CPP_CODEMODEL[] = "CppEditor.InspectCppCodeModel"; diff --git a/src/plugins/cppeditor/cppeditordocument.h b/src/plugins/cppeditor/cppeditordocument.h index 953e24de3e..985e9a41b6 100644 --- a/src/plugins/cppeditor/cppeditordocument.h +++ b/src/plugins/cppeditor/cppeditordocument.h @@ -59,9 +59,13 @@ public: const QByteArray &defines); void scheduleProcessDocument(); +public: + using HeaderErrorDiagnosticWidgetCreator = std::function<QWidget*()>; + signals: void codeWarningsUpdated(unsigned contentsRevision, const QList<QTextEdit::ExtraSelection> selections, + const HeaderErrorDiagnosticWidgetCreator &creator, const TextEditor::RefactorMarkers &refactorMarkers); void ifdefedOutBlocksUpdated(unsigned contentsRevision, diff --git a/src/plugins/cpptools/baseeditordocumentprocessor.h b/src/plugins/cpptools/baseeditordocumentprocessor.h index da6a20ca94..3ac8a3524d 100644 --- a/src/plugins/cpptools/baseeditordocumentprocessor.h +++ b/src/plugins/cpptools/baseeditordocumentprocessor.h @@ -37,6 +37,8 @@ #include <QTextEdit> +#include <functional> + namespace TextEditor { class TextDocument; class QuickFixOperations; @@ -69,10 +71,15 @@ public: virtual void editorDocumentTimerRestarted(); +public: + using HeaderErrorDiagnosticWidgetCreator = std::function<QWidget*()>; + signals: + // Signal interface to implement void codeWarningsUpdated(unsigned revision, const QList<QTextEdit::ExtraSelection> selections, + const HeaderErrorDiagnosticWidgetCreator &creator, const TextEditor::RefactorMarkers &refactorMarkers); void ifdefedOutBlocksUpdated(unsigned revision, diff --git a/src/plugins/cpptools/builtineditordocumentprocessor.cpp b/src/plugins/cpptools/builtineditordocumentprocessor.cpp index a7a7ac1a33..284e1af8ae 100644 --- a/src/plugins/cpptools/builtineditordocumentprocessor.cpp +++ b/src/plugins/cpptools/builtineditordocumentprocessor.cpp @@ -310,7 +310,10 @@ void BuiltinEditorDocumentProcessor::onCodeWarningsUpdated( m_codeWarnings += toTextEditorSelections(codeWarnings, textDocument()); m_codeWarningsUpdated = true; - emit codeWarningsUpdated(revision(), m_codeWarnings, TextEditor::RefactorMarkers()); + emit codeWarningsUpdated(revision(), + m_codeWarnings, + HeaderErrorDiagnosticWidgetCreator(), + TextEditor::RefactorMarkers()); } SemanticInfo::Source BuiltinEditorDocumentProcessor::createSemanticInfoSource(bool force) const |