diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 7dd6ee92cd1..8238ebf762e 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -1507,10 +1507,9 @@ void ClangdClient::Private::setHelpItemForTooltip(const MessageId &token, mark = type; const HelpItem helpItem(helpIds, filePath, mark, category); + q->hoverHandler()->setHelpItem(token, helpItem); if (isTesting) - emit q->helpItemGathered(helpItem); - else - q->hoverHandler()->setHelpItem(token, helpItem); + emit q->helpItemGathered(helpItem, q->hoverHandler()->toolTip()); } // Unfortunately, clangd ignores almost everything except symbols when sending diff --git a/src/plugins/clangcodemodel/clangdclient.h b/src/plugins/clangcodemodel/clangdclient.h index 1b57ea4b66f..03ec41a9991 100644 --- a/src/plugins/clangcodemodel/clangdclient.h +++ b/src/plugins/clangcodemodel/clangdclient.h @@ -127,7 +127,7 @@ signals: void indexingFinished(); void foundReferences(const Utils::SearchResultItems &items); void findUsagesDone(); - void helpItemGathered(const Core::HelpItem &helpItem); + void helpItemGathered(const Core::HelpItem &helpItem, const QString &toolTip); void highlightingResultsReady(const TextEditor::HighlightingResults &results, const Utils::FilePath &file); void proposalReady(TextEditor::IAssistProposal *proposal); diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index b0662cfca64..3aa20b06670 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -670,14 +670,55 @@ public: ClangdTestTooltips() { setProjectFileName("tooltips.pro"); - setSourceFileNames({"tooltips.cpp"}); + setSourceFileNames({"main.cpp", "tooltips.cpp"}); } private slots: + void testTooltipFromIndex(); + void test_data(); void test(); }; +void ClangdTestTooltips::testTooltipFromIndex() +{ + TextEditor::TextDocument * const doc = document("main.cpp"); + QVERIFY(doc); + const auto editor = qobject_cast(EditorManager::openEditor(doc->filePath())); + QVERIFY(editor); + QCOMPARE(editor->document(), doc); + QVERIFY(editor->editorWidget()); + + QTimer timer; + timer.setSingleShot(true); + QEventLoop loop; + QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); + HelpItem helpItem; + QString tooltip; + const auto handler = [&helpItem, &tooltip, &loop](const HelpItem &h, const QString &t) { + helpItem = h; + tooltip = t; + loop.quit(); + }; + connect(client(), &ClangdClient::helpItemGathered, &loop, handler); + + QTextCursor cursor(doc->document()); + const int pos = Text::positionInText(doc->document(), 5, 5); + cursor.setPosition(pos); + editor->editorWidget()->processTooltipRequest(cursor); + + timer.start(10000); + loop.exec(); + QVERIFY(timer.isActive()); + timer.stop(); + + QCOMPARE(int(helpItem.category()), HelpItem::Function); + QCOMPARE(helpItem.helpIds(), {"funcWithDocInside"}); + if (client()->versionNumber().majorVersion() < 20) + QEXPECT_FAIL(nullptr, "Requires clangd >= 20", Continue); + QVERIFY2(tooltip.contains("Documentation in source file"), qPrintable(tooltip)); +} + void ClangdTestTooltips::test_data() { QTest::addColumn("line"); @@ -772,7 +813,7 @@ void ClangdTestTooltips::test() TextEditor::TextDocument * const doc = document("tooltips.cpp"); QVERIFY(doc); - const auto editor = TextEditor::BaseTextEditor::currentTextEditor(); + const auto editor = qobject_cast(EditorManager::openEditor(doc->filePath())); QVERIFY(editor); QCOMPARE(editor->document(), doc); QVERIFY(editor->editorWidget()); diff --git a/src/plugins/clangcodemodel/test/data/clangtestdata.qrc b/src/plugins/clangcodemodel/test/data/clangtestdata.qrc index 480d85fedc4..e36b3e2019f 100644 --- a/src/plugins/clangcodemodel/test/data/clangtestdata.qrc +++ b/src/plugins/clangcodemodel/test/data/clangtestdata.qrc @@ -64,5 +64,8 @@ indirect-changes/indirectheader.h indirect-changes/main.cpp indirect-changes/unrelatedheader.h + tooltips/main.cpp + tooltips/tooltipfromindex.cpp + tooltips/tooltipfromindex.h diff --git a/src/plugins/clangcodemodel/test/data/tooltips/main.cpp b/src/plugins/clangcodemodel/test/data/tooltips/main.cpp new file mode 100644 index 00000000000..2e51bedc46c --- /dev/null +++ b/src/plugins/clangcodemodel/test/data/tooltips/main.cpp @@ -0,0 +1,6 @@ +#include "tooltipfromindex.h" + +int main() +{ + funcWithDocInside(); +} diff --git a/src/plugins/clangcodemodel/test/data/tooltips/tooltipfromindex.cpp b/src/plugins/clangcodemodel/test/data/tooltips/tooltipfromindex.cpp new file mode 100644 index 00000000000..152ff29dc68 --- /dev/null +++ b/src/plugins/clangcodemodel/test/data/tooltips/tooltipfromindex.cpp @@ -0,0 +1,6 @@ +#include "tooltipfromindex.h" + +// Documentation in source file +void funcWithDocInside() +{ +} diff --git a/src/plugins/clangcodemodel/test/data/tooltips/tooltipfromindex.h b/src/plugins/clangcodemodel/test/data/tooltips/tooltipfromindex.h new file mode 100644 index 00000000000..b6299893447 --- /dev/null +++ b/src/plugins/clangcodemodel/test/data/tooltips/tooltipfromindex.h @@ -0,0 +1,3 @@ +#pragma one + +void funcWithDocInside(); diff --git a/src/plugins/clangcodemodel/test/data/tooltips/tooltips.pro b/src/plugins/clangcodemodel/test/data/tooltips/tooltips.pro index d5f7a749bf3..5cfffd77bd1 100644 --- a/src/plugins/clangcodemodel/test/data/tooltips/tooltips.pro +++ b/src/plugins/clangcodemodel/test/data/tooltips/tooltips.pro @@ -1,4 +1,5 @@ TEMPLATE = app CONFIG -= qt -SOURCES = tooltips.cpp +HEADERS = tooltipfromindex.h +SOURCES = main.cpp tooltipfromindex.cpp tooltips.cpp INCLUDEPATH += subdir diff --git a/src/plugins/texteditor/basehoverhandler.h b/src/plugins/texteditor/basehoverhandler.h index c24ae4a1df5..7e4df531991 100644 --- a/src/plugins/texteditor/basehoverhandler.h +++ b/src/plugins/texteditor/basehoverhandler.h @@ -33,6 +33,7 @@ public: void showToolTip(TextEditorWidget *widget, const QPoint &point); bool lastHelpItemAppliesTo(const TextEditorWidget *widget) const; + const QString &toolTip() const; protected: enum { @@ -46,7 +47,6 @@ protected: int priority() const; void setToolTip(const QString &tooltip, Qt::TextFormat format = Qt::PlainText); - const QString &toolTip() const; void setLastHelpItemIdentified(const Core::HelpItem &help); const Core::HelpItem &lastHelpItemIdentified() const;