aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/fileinprojectfinder.cpp
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2019-02-07 17:41:20 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2019-02-13 14:59:51 +0000
commit55b0cc7814f27ca204d692c858a3f62cb42fd57b (patch)
tree8fe7585a7da413f0a9472d2bafdc81725c71e023 /src/libs/utils/fileinprojectfinder.cpp
parentdc2e8472e349b7c80c9b4bec40324a640fff3cff (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.cpp41
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