forked from qt-creator/qt-creator
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>
This commit is contained in:
@@ -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();
|
||||
QList<TextEditor::TextMark *> textMarks;
|
||||
|
||||
return editorDocumentProcessorHasDiagnosticAt(m_errorDiagnostics, line, column, textDocument)
|
||||
|| editorDocumentProcessorHasDiagnosticAt(m_warningDiagnostics, line, column, textDocument);
|
||||
}
|
||||
for (ClangTextMark *textMark : m_clangTextMarks) {
|
||||
if (isDiagnosticAtLocation(textMark->diagnostic(), line, column, m_textDocument->document()))
|
||||
textMarks << textMark;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
return diagnostics;
|
||||
return textMarks;
|
||||
}
|
||||
|
||||
void ClangDiagnosticManager::invalidateDiagnostics()
|
||||
|
@@ -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();
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -72,15 +72,6 @@ BaseEditorDocumentProcessor::extraRefactoringOperations(const TextEditor::Assist
|
||||
return TextEditor::QuickFixOperations();
|
||||
}
|
||||
|
||||
bool BaseEditorDocumentProcessor::hasDiagnosticsAt(uint, uint) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void BaseEditorDocumentProcessor::addDiagnosticToolTipToLayout(uint, uint, QLayout *) const
|
||||
{
|
||||
}
|
||||
|
||||
void BaseEditorDocumentProcessor::editorDocumentTimerRestarted()
|
||||
{
|
||||
}
|
||||
|
@@ -81,8 +81,6 @@ public:
|
||||
extraRefactoringOperations(const TextEditor::AssistInterface &assistInterface);
|
||||
|
||||
virtual void invalidateDiagnostics();
|
||||
virtual bool hasDiagnosticsAt(uint line, uint column) const;
|
||||
virtual void addDiagnosticToolTipToLayout(uint line, uint column, QLayout *layout) const;
|
||||
|
||||
virtual void editorDocumentTimerRestarted();
|
||||
|
||||
|
@@ -3555,6 +3555,13 @@ QPoint TextEditorWidget::toolTipPosition(const QTextCursor &c) const
|
||||
return cursorPos + QPoint(d->m_extraArea->width(), HostOsInfo::isWindowsHost() ? -24 : -16);
|
||||
}
|
||||
|
||||
void TextEditorWidget::showTextMarksToolTip(const QPoint &pos,
|
||||
const TextMarks &marks,
|
||||
const TextMark *mainTextMark) const
|
||||
{
|
||||
d->showTextMarksToolTip(pos, marks, mainTextMark);
|
||||
}
|
||||
|
||||
void TextEditorWidgetPrivate::processTooltipRequest(const QTextCursor &c)
|
||||
{
|
||||
const QPoint toolTipPoint = q->toolTipPosition(c);
|
||||
|
@@ -59,6 +59,7 @@ class HighlightScrollBarController;
|
||||
|
||||
namespace TextEditor {
|
||||
class TextDocument;
|
||||
class TextMark;
|
||||
class BaseHoverHandler;
|
||||
class RefactorOverlay;
|
||||
struct RefactorMarker;
|
||||
@@ -68,6 +69,7 @@ class IAssistProvider;
|
||||
class ICodeStylePreferences;
|
||||
class CompletionAssistProvider;
|
||||
using RefactorMarkers = QList<RefactorMarker>;
|
||||
using TextMarks = QList<TextMark *>;
|
||||
|
||||
namespace Internal {
|
||||
class BaseTextEditorPrivate;
|
||||
@@ -274,6 +276,9 @@ public:
|
||||
QRegion translatedLineRegion(int lineStart, int lineEnd) const;
|
||||
|
||||
QPoint toolTipPosition(const QTextCursor &c) const;
|
||||
void showTextMarksToolTip(const QPoint &pos,
|
||||
const TextMarks &marks,
|
||||
const TextMark *mainTextMark = nullptr) const;
|
||||
|
||||
void invokeAssist(AssistKind assistKind, IAssistProvider *provider = nullptr);
|
||||
|
||||
|
Reference in New Issue
Block a user