diff options
author | Eike Ziller <eike.ziller@qt.io> | 2021-05-31 15:09:28 +0200 |
---|---|---|
committer | Cristian Adam <cristian.adam@qt.io> | 2021-06-01 12:35:25 +0000 |
commit | 58d03f3f2f977b81b4c9224a3cfdca7802d89ff0 (patch) | |
tree | 44111cc58e230d01fbbd946a37d29d2beb2fe0f9 | |
parent | 392bda1160d3578861b74d87167e70f10287b323 (diff) |
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.cpp | 24 | ||||
-rw-r--r-- | src/plugins/cmakeprojectmanager/fileapiparser.h | 7 | ||||
-rw-r--r-- | src/plugins/cmakeprojectmanager/fileapireader.cpp | 11 |
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, |