TextEditors: Implement "Follow Symbol" for HTTP urls in string literals

Task-number: QTCREATORBUG-14967
Change-Id: I30923aa94d761b06edb1f67007fd7e2a67065ef0
Reviewed-by: Xavier BESSON <developer@xavi-b.fr>
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Xavier BESSON
2022-11-30 18:32:04 +01:00
parent e603116abb
commit 3f554f3837
4 changed files with 28 additions and 3 deletions

View File

@@ -848,7 +848,7 @@ void CppEditorWidget::followSymbolToType(bool inNextSplit)
CppModelManager::followSymbolToType(cursor, callback, inNextSplit);
}
bool CppEditorWidget::followQrcUrl(const QTextCursor &cursor,
bool CppEditorWidget::followUrl(const QTextCursor &cursor,
const Utils::LinkHandler &processLinkCallback)
{
if (!isSemanticInfoValidExceptLocalUses())
@@ -869,6 +869,15 @@ bool CppEditorWidget::followQrcUrl(const QTextCursor &cursor,
if (!literal)
return false;
const QString theString = QString::fromUtf8(literal->chars(), literal->size());
if (theString.startsWith("https:/") || theString.startsWith("http:/")) {
Utils::Link link = FilePath::fromPathPart(theString);
link.linkTextStart = d->m_lastSemanticInfo.doc->translationUnit()->getTokenPositionInDocument(literalAst->literal_token, document());
link.linkTextEnd = d->m_lastSemanticInfo.doc->translationUnit()->getTokenEndPositionInDocument(literalAst->literal_token, document());
processLinkCallback(link);
return true;
}
if (!theString.startsWith("qrc:/") && !theString.startsWith(":/"))
return false;
@@ -897,7 +906,7 @@ void CppEditorWidget::findLinkAt(const QTextCursor &cursor,
if (!d->m_modelManager)
return processLinkCallback(Utils::Link());
if (followQrcUrl(cursor, processLinkCallback))
if (followUrl(cursor, processLinkCallback))
return;
const Utils::FilePath &filePath = textDocument()->filePath();

View File

@@ -123,7 +123,7 @@ private:
unsigned documentRevision() const;
bool isOldStyleSignalOrSlot() const;
bool followQrcUrl(const QTextCursor &cursor, const Utils::LinkHandler &processLinkCallback);
bool followUrl(const QTextCursor &cursor, const Utils::LinkHandler &processLinkCallback);
QMenu *createRefactorMenu(QWidget *parent) const;

View File

@@ -789,6 +789,15 @@ void QmlJSEditorWidget::findLinkAt(const QTextCursor &cursor,
}
}
}
if (text.startsWith("https:/") || text.startsWith("http:/")) {
Link link = Link::fromFilePath(FilePath::fromPathPart(text));
link.linkTextStart = literal->literalToken.begin();
link.linkTextEnd = literal->literalToken.end();
processLinkCallback(link);
return;
}
Utils::Link link;
link.linkTextStart = literal->literalToken.begin();
link.linkTextEnd = literal->literalToken.end();

View File

@@ -72,6 +72,7 @@
#include <QCoreApplication>
#include <QComboBox>
#include <QDebug>
#include <QDesktopServices>
#include <QFutureWatcher>
#include <QGridLayout>
#include <QKeyEvent>
@@ -6341,6 +6342,12 @@ bool TextEditorWidget::openLink(const Utils::Link &link, bool inNextSplit)
if (!link.hasValidTarget())
return false;
QString url = link.targetFilePath.toString();
if (url.startsWith(u"https://"_qs) || url.startsWith(u"http://"_qs)) {
QDesktopServices::openUrl(url);
return true;
}
if (!inNextSplit && textDocument()->filePath() == link.targetFilePath) {
EditorManager::addCurrentPositionToNavigationHistory();
gotoLine(link.targetLine, link.targetColumn, true, true);