diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2019-02-07 17:41:20 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2019-02-13 14:59:51 +0000 |
commit | 55b0cc7814f27ca204d692c858a3f62cb42fd57b (patch) | |
tree | 8fe7585a7da413f0a9472d2bafdc81725c71e023 /src/libs/utils/fileinprojectfinder.cpp | |
parent | dc2e8472e349b7c80c9b4bec40324a640fff3cff (diff) |
FileInProjectFinder: Proper lookup of qrc URLs
Parse the project's qrc files to map a qrc URL to the actual file in the
project, rather than employing a heuristic.
Fixes: QTCREATORBUG-20207
Change-Id: I4fc9e11c20a36e9d477bb3dc43a787d81e067886
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Diffstat (limited to 'src/libs/utils/fileinprojectfinder.cpp')
-rw-r--r-- | src/libs/utils/fileinprojectfinder.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/libs/utils/fileinprojectfinder.cpp b/src/libs/utils/fileinprojectfinder.cpp index 2be64260e8a..90be2416961 100644 --- a/src/libs/utils/fileinprojectfinder.cpp +++ b/src/libs/utils/fileinprojectfinder.cpp @@ -24,8 +24,11 @@ ****************************************************************************/ #include "fileinprojectfinder.h" + +#include "algorithm.h" #include "fileutils.h" #include "hostosinfo.h" +#include "qrcparser.h" #include "qtcassert.h" #include <QDebug> @@ -102,6 +105,7 @@ void FileInProjectFinder::setProjectFiles(const FileNameList &projectFiles) m_projectFiles = projectFiles; m_cache.clear(); + m_qrcUrlFinder.setProjectFiles(projectFiles); } void FileInProjectFinder::setSysroot(const FileName &sysroot) @@ -140,6 +144,13 @@ QString FileInProjectFinder::findFile(const QUrl &fileUrl, bool *success) const { qCDebug(finderLog) << "FileInProjectFinder: trying to find file" << fileUrl.toString() << "..."; + if (fileUrl.scheme() == "qrc" || fileUrl.toString().startsWith(':')) { + const QString result = m_qrcUrlFinder.find(fileUrl); + if (success) + *success = !result.isEmpty(); + return result; + } + QString originalPath = fileUrl.toLocalFile(); if (originalPath.isEmpty()) // e.g. qrc:// originalPath = fileUrl.path(); @@ -421,4 +432,34 @@ FileInProjectFinder::PathMappingNode::~PathMappingNode() qDeleteAll(children); } +QString FileInProjectFinder::QrcUrlFinder::find(const QUrl &fileUrl) const +{ + QString result; + const auto fileIt = m_fileCache.constFind(fileUrl); + if (fileIt != m_fileCache.cend()) + return fileIt.value(); + for (const FileName &f : m_allQrcFiles) { + QrcParser::Ptr &qrcParser = m_parserCache[f]; + if (!qrcParser) + qrcParser = QrcParser::parseQrcFile(f.toString(), QString()); + if (!qrcParser->isValid()) + continue; + QStringList hits; + qrcParser->collectFilesAtPath(QrcParser::normalizedQrcFilePath(fileUrl.toString()), &hits); + if (!hits.empty()) { + result = hits.first(); + break; + } + } + m_fileCache.insert(fileUrl, result); + return result; +} + +void FileInProjectFinder::QrcUrlFinder::setProjectFiles(const FileNameList &projectFiles) +{ + m_allQrcFiles = filtered(projectFiles, [](const FileName &f) { return f.endsWith(".qrc"); }); + m_fileCache.clear(); + m_parserCache.clear(); +} + } // namespace Utils |