QmlJsEditor: Implement "Follow Symbol" for qrc paths in string literals

Task-number: QTCREATORBUG-28087
Change-Id: If1e706a96bb9cbb004f826c4d58d7d7f0c306b41
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Xavier BESSON
2022-11-30 18:40:05 +01:00
parent 31af32533e
commit 9f9c40b29f
2 changed files with 26 additions and 1 deletions

View File

@@ -882,7 +882,10 @@ bool CppEditorWidget::followQrcUrl(const QTextCursor &cursor,
if (!nodeForPath) if (!nodeForPath)
return false; return false;
processLinkCallback(Link(nodeForPath->filePath())); Link link(nodeForPath->filePath());
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; return true;
} }

View File

@@ -24,7 +24,10 @@
#include <qmljstools/qmljsindenter.h> #include <qmljstools/qmljsindenter.h>
#include <qmljstools/qmljstoolsconstants.h> #include <qmljstools/qmljstoolsconstants.h>
#include <projectexplorer/project.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/projectnodes.h>
#include <projectexplorer/projecttree.h>
#include <coreplugin/actionmanager/actioncontainer.h> #include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actionmanager.h>
@@ -767,6 +770,25 @@ void QmlJSEditorWidget::findLinkAt(const QTextCursor &cursor,
// string literals that could refer to a file link to them // string literals that could refer to a file link to them
if (auto literal = cast<const StringLiteral *>(node)) { if (auto literal = cast<const StringLiteral *>(node)) {
const QString &text = literal->value.toString(); const QString &text = literal->value.toString();
if (text.startsWith("qrc:/")) {
const ProjectExplorer::Project * const project = ProjectExplorer::ProjectTree::currentProject();
if (project && project->rootProjectNode()) {
const ProjectExplorer::Node * const nodeForPath = project->rootProjectNode()->findNode(
[qrcPath = text.mid(text.indexOf(':') + 1)](ProjectExplorer::Node *n) {
if (!n->asFileNode())
return false;
const auto qrcNode = dynamic_cast<ProjectExplorer::ResourceFileNode *>(n);
return qrcNode && qrcNode->qrcPath() == qrcPath;
});
if (nodeForPath) {
Link link(nodeForPath->filePath());
link.linkTextStart = literal->firstSourceLocation().begin();
link.linkTextEnd = literal->lastSourceLocation().end();
processLinkCallback(link);
return;
}
}
}
Utils::Link link; Utils::Link link;
link.linkTextStart = literal->literalToken.begin(); link.linkTextStart = literal->literalToken.begin();
link.linkTextEnd = literal->literalToken.end(); link.linkTextEnd = literal->literalToken.end();