summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2016-10-04 16:23:42 +0200
committerNikolai Kosjar <nikolai.kosjar@qt.io>2016-10-11 14:01:14 +0000
commit9d55d8485cda7077d1280f3335102ffd036240b5 (patch)
tree5a0485198a1a72f23b2de4206bf40bb540208319 /src/plugins
parentcb24872f439a92e7ab0d6ed6919c9c253707c3d9 (diff)
downloadqt-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')
-rw-r--r--src/plugins/clangcodemodel/clangbackendipcintegration.cpp4
-rw-r--r--src/plugins/clangcodemodel/clangdiagnosticmanager.cpp1
-rw-r--r--src/plugins/clangcodemodel/clangdiagnostictooltipwidget.cpp65
-rw-r--r--src/plugins/clangcodemodel/clangdiagnostictooltipwidget.h10
-rw-r--r--src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp47
-rw-r--r--src/plugins/clangcodemodel/clangeditordocumentprocessor.h3
-rw-r--r--src/plugins/clangcodemodel/clangtextmark.cpp2
-rw-r--r--src/plugins/cppeditor/cppeditor.cpp67
-rw-r--r--src/plugins/cppeditor/cppeditor.h12
-rw-r--r--src/plugins/cppeditor/cppeditorconstants.h1
-rw-r--r--src/plugins/cppeditor/cppeditordocument.h4
-rw-r--r--src/plugins/cpptools/baseeditordocumentprocessor.h7
-rw-r--r--src/plugins/cpptools/builtineditordocumentprocessor.cpp5
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