aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/clangcodemodel
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2019-01-31 13:16:44 +0100
committerNikolai Kosjar <nikolai.kosjar@qt.io>2019-02-05 11:22:27 +0000
commitc5e43d86d12ce51c9035159a8acd86800fdf69bc (patch)
tree90030cd07fa47a25705cf485c333d06a90462660 /src/plugins/clangcodemodel
parent1a58a30685a7acb386989f8edbcd497d9472acf1 (diff)
Clang: Make diagnostic tooltips consistent
Fix that triggering a diagnostic tooltip from the diagnostic location/range itself (underlined text) did not show the icon on the left and the actions/toolbuttons on the right in the tooltip. Instead of showing the tooltip content itself, request the tooltip for the corresponding text mark to get the extra decoration and actions. Change-Id: I5e94aca117a761f7a798d4f4b33db6e386e54d84 Reviewed-by: David Schulz <david.schulz@qt.io> Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
Diffstat (limited to 'src/plugins/clangcodemodel')
-rw-r--r--src/plugins/clangcodemodel/clangdiagnosticmanager.cpp52
-rw-r--r--src/plugins/clangcodemodel/clangdiagnosticmanager.h3
-rw-r--r--src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp28
-rw-r--r--src/plugins/clangcodemodel/clangeditordocumentprocessor.h4
-rw-r--r--src/plugins/clangcodemodel/clanghoverhandler.cpp42
-rw-r--r--src/plugins/clangcodemodel/clangtextmark.h2
6 files changed, 31 insertions, 100 deletions
diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp
index 72049242dc..8bc0b925c2 100644
--- a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp
+++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp
@@ -210,36 +210,6 @@ bool isDiagnosticAtLocation(const ClangBackEnd::DiagnosticContainer &diagnostic,
return isDiagnosticRelatedToLocation(diagnostic, {cursorRange}, line, column);
}
-QVector<ClangBackEnd::DiagnosticContainer>
-filteredDiagnosticsAtLocation(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics,
- uint line,
- uint column,
- QTextDocument *textDocument)
-{
- QVector<ClangBackEnd::DiagnosticContainer> filteredDiagnostics;
-
- foreach (const auto &diagnostic, diagnostics) {
- if (isDiagnosticAtLocation(diagnostic, line, column, textDocument))
- filteredDiagnostics.append(diagnostic);
- }
-
- return filteredDiagnostics;
-}
-
-bool editorDocumentProcessorHasDiagnosticAt(
- const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics,
- uint line,
- uint column,
- QTextDocument *textDocument)
-{
- foreach (const auto &diagnostic, diagnostics) {
- if (isDiagnosticAtLocation(diagnostic, line, column, textDocument))
- return true;
- }
-
- return false;
-}
-
QTextCursor cursorAtLastPositionOfLine(QTextDocument *textDocument, int lineNumber)
{
const QTextBlock textBlock = textDocument->findBlockByNumber(lineNumber - 1);
@@ -399,24 +369,16 @@ TextEditor::RefactorMarkers ClangDiagnosticManager::takeFixItAvailableMarkers()
return fixItAvailableMarkers;
}
-bool ClangDiagnosticManager::hasDiagnosticsAt(uint line, uint column) const
+TextEditor::TextMarks ClangDiagnosticManager::diagnosticTextMarksAt(uint line, uint column) const
{
- QTextDocument *textDocument = m_textDocument->document();
-
- return editorDocumentProcessorHasDiagnosticAt(m_errorDiagnostics, line, column, textDocument)
- || editorDocumentProcessorHasDiagnosticAt(m_warningDiagnostics, line, column, textDocument);
-}
+ QList<TextEditor::TextMark *> textMarks;
-QVector<ClangBackEnd::DiagnosticContainer>
-ClangDiagnosticManager::diagnosticsAt(uint line, uint column) const
-{
- QTextDocument *textDocument = m_textDocument->document();
-
- QVector<ClangBackEnd::DiagnosticContainer> diagnostics;
- diagnostics += filteredDiagnosticsAtLocation(m_errorDiagnostics, line, column, textDocument);
- diagnostics += filteredDiagnosticsAtLocation(m_warningDiagnostics, line, column, textDocument);
+ for (ClangTextMark *textMark : m_clangTextMarks) {
+ if (isDiagnosticAtLocation(textMark->diagnostic(), line, column, m_textDocument->document()))
+ textMarks << textMark;
+ }
- return diagnostics;
+ return textMarks;
}
void ClangDiagnosticManager::invalidateDiagnostics()
diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.h b/src/plugins/clangcodemodel/clangdiagnosticmanager.h
index d0c31bf68b..2996936ed0 100644
--- a/src/plugins/clangcodemodel/clangdiagnosticmanager.h
+++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.h
@@ -57,8 +57,7 @@ public:
QList<QTextEdit::ExtraSelection> takeExtraSelections();
TextEditor::RefactorMarkers takeFixItAvailableMarkers();
- bool hasDiagnosticsAt(uint line, uint column) const;
- QVector<ClangBackEnd::DiagnosticContainer> diagnosticsAt(uint line, uint column) const;
+ QList<TextEditor::TextMark *> diagnosticTextMarksAt(uint line, uint column) const;
void invalidateDiagnostics();
void clearDiagnosticsWithFixIts();
diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
index 8e1d06da6c..40d7e4e63f 100644
--- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
+++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
@@ -48,7 +48,6 @@
#include <cpptools/cppworkingcopy.h>
#include <cpptools/editordocumenthandle.h>
-#include <texteditor/displaysettings.h>
#include <texteditor/fontsettings.h>
#include <texteditor/texteditor.h>
#include <texteditor/texteditorconstants.h>
@@ -292,27 +291,6 @@ TextEditor::QuickFixOperations ClangEditorDocumentProcessor::extraRefactoringOpe
return extractor.extract(assistInterface.fileName(), currentLine(assistInterface));
}
-bool ClangEditorDocumentProcessor::hasDiagnosticsAt(uint line, uint column) const
-{
- return m_diagnosticManager.hasDiagnosticsAt(line, column);
-}
-
-void ClangEditorDocumentProcessor::addDiagnosticToolTipToLayout(uint line,
- uint column,
- QLayout *target) const
-{
- using Internal::ClangDiagnosticWidget;
-
- const QVector<ClangBackEnd::DiagnosticContainer> diagnostics
- = m_diagnosticManager.diagnosticsAt(line, column);
-
- target->addWidget(
- ClangDiagnosticWidget::createWidget(diagnostics, ClangDiagnosticWidget::ToolTip));
- auto link = TextEditor::DisplaySettings::createAnnotationSettingsLink();
- target->addWidget(link);
- target->setAlignment(link, Qt::AlignRight);
-}
-
void ClangEditorDocumentProcessor::editorDocumentTimerRestarted()
{
m_updateBackendDocumentTimer.stop(); // Wait for the next call to run().
@@ -323,6 +301,12 @@ void ClangEditorDocumentProcessor::invalidateDiagnostics()
m_diagnosticManager.invalidateDiagnostics();
}
+TextEditor::TextMarks ClangEditorDocumentProcessor::diagnosticTextMarksAt(uint line,
+ uint column) const
+{
+ return m_diagnosticManager.diagnosticTextMarksAt(line, column);
+}
+
void ClangEditorDocumentProcessor::setParserConfig(
const CppTools::BaseEditorDocumentParser::Configuration &config)
{
diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h
index a7da1bb2e1..8e0ee003d3 100644
--- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h
+++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h
@@ -83,8 +83,8 @@ public:
extraRefactoringOperations(const TextEditor::AssistInterface &assistInterface) override;
void invalidateDiagnostics() override;
- bool hasDiagnosticsAt(uint line, uint column) const override;
- void addDiagnosticToolTipToLayout(uint line, uint column, QLayout *target) const override;
+
+ TextEditor::TextMarks diagnosticTextMarksAt(uint line, uint column) const;
void editorDocumentTimerRestarted() override;
diff --git a/src/plugins/clangcodemodel/clanghoverhandler.cpp b/src/plugins/clangcodemodel/clanghoverhandler.cpp
index da9f974adb..58f414d9f1 100644
--- a/src/plugins/clangcodemodel/clanghoverhandler.cpp
+++ b/src/plugins/clangcodemodel/clanghoverhandler.cpp
@@ -25,8 +25,9 @@
#include "clanghoverhandler.h"
+#include "clangeditordocumentprocessor.h"
+
#include <coreplugin/helpmanager.h>
-#include <cpptools/baseeditordocumentprocessor.h>
#include <cpptools/cppmodelmanager.h>
#include <cpptools/cpptoolsreuse.h>
#include <cpptools/editordocumenthandle.h>
@@ -61,32 +62,17 @@ static CppTools::BaseEditorDocumentProcessor *editorDocumentProcessor(TextEditor
return nullptr;
}
-static bool editorDocumentProcessorHasDiagnosticAt(TextEditorWidget *editorWidget, int pos)
+static TextMarks diagnosticTextMarksAt(TextEditorWidget *editorWidget, int position)
{
- if (CppTools::BaseEditorDocumentProcessor *processor = editorDocumentProcessor(editorWidget)) {
- int line, column;
- if (Utils::Text::convertPosition(editorWidget->document(), pos, &line, &column))
- return processor->hasDiagnosticsAt(line, column);
- }
+ const auto processor = qobject_cast<ClangEditorDocumentProcessor *>(
+ editorDocumentProcessor(editorWidget));
+ QTC_ASSERT(processor, return TextMarks());
- return false;
-}
+ int line, column;
+ const bool ok = Utils::Text::convertPosition(editorWidget->document(), position, &line, &column);
+ QTC_ASSERT(ok, return TextMarks());
-static void processWithEditorDocumentProcessor(TextEditorWidget *editorWidget,
- const QPoint &point,
- int position,
- const Core::HelpItem &helpItem)
-{
- if (CppTools::BaseEditorDocumentProcessor *processor = editorDocumentProcessor(editorWidget)) {
- int line, column;
- if (Utils::Text::convertPosition(editorWidget->document(), position, &line, &column)) {
- auto layout = new QVBoxLayout;
- layout->setContentsMargins(0, 0, 0, 0);
- layout->setSpacing(2);
- processor->addDiagnosticToolTipToLayout(line, column, layout);
- Utils::ToolTip::show(point, layout, editorWidget, qVariantFromValue(helpItem));
- }
- }
+ return processor->diagnosticTextMarksAt(line, column);
}
static QFuture<CppTools::ToolTipInfo> editorDocumentHandlesToolTipInfo(
@@ -189,7 +175,7 @@ void ClangHoverHandler::identifyMatch(TextEditorWidget *editorWidget,
m_cursorPosition = -1;
// Check for diagnostics (sync)
- if (!isContextHelpRequest() && editorDocumentProcessorHasDiagnosticAt(editorWidget, pos)) {
+ if (!isContextHelpRequest() && !diagnosticTextMarksAt(editorWidget, pos).isEmpty()) {
qCDebug(hoverLog) << "Checking for diagnostic at" << pos;
setPriority(Priority_Diagnostic);
m_cursorPosition = pos;
@@ -275,10 +261,8 @@ void ClangHoverHandler::operateTooltip(TextEditor::TextEditorWidget *editorWidge
const QPoint &point)
{
if (priority() == Priority_Diagnostic) {
- processWithEditorDocumentProcessor(editorWidget,
- point,
- m_cursorPosition,
- lastHelpItemIdentified());
+ const TextMarks textMarks = diagnosticTextMarksAt(editorWidget, m_cursorPosition);
+ editorWidget->showTextMarksToolTip(point, textMarks);
return;
}
diff --git a/src/plugins/clangcodemodel/clangtextmark.h b/src/plugins/clangcodemodel/clangtextmark.h
index 1301cd200b..00cadfb5c8 100644
--- a/src/plugins/clangcodemodel/clangtextmark.h
+++ b/src/plugins/clangcodemodel/clangtextmark.h
@@ -44,7 +44,9 @@ public:
const RemovedFromEditorHandler &removedHandler,
bool fullVisualization);
+ ClangBackEnd::DiagnosticContainer diagnostic() const { return m_diagnostic; }
void updateIcon(bool valid = true);
+
private:
bool addToolTipContent(QLayout *target) const override;
void removedFromEditor() override;