summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2021-05-31 15:09:28 +0200
committerCristian Adam <cristian.adam@qt.io>2021-06-01 12:35:25 +0000
commit58d03f3f2f977b81b4c9224a3cfdca7802d89ff0 (patch)
tree44111cc58e230d01fbbd946a37d29d2beb2fe0f9
parent392bda1160d3578861b74d87167e70f10287b323 (diff)
downloadqt-creator-58d03f3f2f977b81b4c9224a3cfdca7802d89ff0.tar.gz
CMake: cancel file api parsing
Change-Id: Ie59370fa4329f92dd28bf3e147b2828cbd75330b Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Eike Ziller <eike.ziller@qt.io>
-rw-r--r--src/plugins/cmakeprojectmanager/fileapiparser.cpp24
-rw-r--r--src/plugins/cmakeprojectmanager/fileapiparser.h7
-rw-r--r--src/plugins/cmakeprojectmanager/fileapireader.cpp11
3 files changed, 34 insertions, 8 deletions
diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.cpp b/src/plugins/cmakeprojectmanager/fileapiparser.cpp
index 909636c2df..78a3a59941 100644
--- a/src/plugins/cmakeprojectmanager/fileapiparser.cpp
+++ b/src/plugins/cmakeprojectmanager/fileapiparser.cpp
@@ -870,7 +870,9 @@ static QStringList uniqueTargetFiles(const Configuration &config)
return files;
}
-FileApiData FileApiParser::parseData(const QFileInfo &replyFileInfo, const QString &cmakeBuildType,
+FileApiData FileApiParser::parseData(QFutureInterface<std::shared_ptr<FileApiQtcData>> &fi,
+ const QFileInfo &replyFileInfo,
+ const QString &cmakeBuildType,
QString &errorMessage)
{
QTC_CHECK(errorMessage.isEmpty());
@@ -878,16 +880,29 @@ FileApiData FileApiParser::parseData(const QFileInfo &replyFileInfo, const QStri
FileApiData result;
+ const auto cancelCheck = [&fi, &errorMessage]() -> bool {
+ if (fi.isCanceled()) {
+ errorMessage = FileApiParser::tr("CMake parsing was cancelled.");
+ return true;
+ }
+ return false;
+ };
+
result.replyFile = readReplyFile(replyFileInfo, errorMessage);
+ if (cancelCheck())
+ return {};
result.cache = readCacheFile(result.replyFile.jsonFile("cache", replyDir), errorMessage);
+ if (cancelCheck())
+ return {};
result.cmakeFiles = readCMakeFilesFile(result.replyFile.jsonFile("cmakeFiles", replyDir),
errorMessage);
+ if (cancelCheck())
+ return {};
auto codeModels = readCodemodelFile(result.replyFile.jsonFile("codemodel", replyDir),
errorMessage);
if (codeModels.size() == 0) {
errorMessage = "No CMake configuration found!";
- qWarning() << errorMessage;
return result;
}
@@ -911,14 +926,17 @@ FileApiData FileApiParser::parseData(const QFileInfo &replyFileInfo, const QStri
.arg(cmakeBuildType)
.arg(buildTypes.join(", "));
}
- qWarning() << errorMessage;
return result;
}
result.codemodel = std::move(*it);
+ if (cancelCheck())
+ return {};
const QStringList targetFiles = uniqueTargetFiles(result.codemodel);
for (const QString &targetFile : targetFiles) {
+ if (cancelCheck())
+ return {};
QString targetErrorMessage;
TargetDetails td = readTargetFile(replyDir.absoluteFilePath(targetFile), targetErrorMessage);
if (targetErrorMessage.isEmpty()) {
diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.h b/src/plugins/cmakeprojectmanager/fileapiparser.h
index 6650d5e75a..850a3de859 100644
--- a/src/plugins/cmakeprojectmanager/fileapiparser.h
+++ b/src/plugins/cmakeprojectmanager/fileapiparser.h
@@ -27,6 +27,8 @@
#include "cmakeconfigitem.h"
+#include "fileapidataextractor.h"
+
#include <projectexplorer/headerpath.h>
#include <projectexplorer/projectmacro.h>
@@ -34,6 +36,7 @@
#include <utils/fileutils.h>
#include <QDir>
+#include <QFutureInterface>
#include <QString>
#include <QVector>
@@ -247,7 +250,9 @@ class FileApiParser
{
Q_DECLARE_TR_FUNCTIONS(FileApiParser)
public:
- static FileApiData parseData(const QFileInfo &replyFileInfo, const QString& cmakeBuildType,
+ static FileApiData parseData(QFutureInterface<std::shared_ptr<FileApiQtcData>> &fi,
+ const QFileInfo &replyFileInfo,
+ const QString &cmakeBuildType,
QString &errorMessage);
static bool setupCMakeFileApi(const Utils::FilePath &buildDirectory,
diff --git a/src/plugins/cmakeprojectmanager/fileapireader.cpp b/src/plugins/cmakeprojectmanager/fileapireader.cpp
index 303503eccc..1171b9d548 100644
--- a/src/plugins/cmakeprojectmanager/fileapireader.cpp
+++ b/src/plugins/cmakeprojectmanager/fileapireader.cpp
@@ -265,11 +265,14 @@ void FileApiReader::endState(const QFileInfo &replyFi)
m_lastReplyTimestamp = replyFi.lastModified();
m_future = runAsync(ProjectExplorerPlugin::sharedThreadPool(),
- [replyFi, sourceDirectory, buildDirectory, topCmakeFile, cmakeBuildType]() {
+ [replyFi, sourceDirectory, buildDirectory, topCmakeFile, cmakeBuildType](
+ QFutureInterface<std::shared_ptr<FileApiQtcData>> &fi) {
auto result = std::make_shared<FileApiQtcData>();
- FileApiData data = FileApiParser::parseData(replyFi, cmakeBuildType, result->errorMessage);
+ FileApiData data = FileApiParser::parseData(fi,
+ replyFi,
+ cmakeBuildType,
+ result->errorMessage);
if (!result->errorMessage.isEmpty()) {
- qWarning() << result->errorMessage;
*result = generateFallbackData(topCmakeFile,
sourceDirectory,
buildDirectory,
@@ -281,7 +284,7 @@ void FileApiReader::endState(const QFileInfo &replyFi)
qWarning() << result->errorMessage;
}
- return result;
+ fi.reportResult(result);
});
onResultReady(m_future.value(),
this,