diff --git a/src/plugins/cmakeprojectmanager/fileapiparser.cpp b/src/plugins/cmakeprojectmanager/fileapiparser.cpp index 909636c2dfc..78a3a599410 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> &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 6650d5e75ae..850a3de859f 100644 --- a/src/plugins/cmakeprojectmanager/fileapiparser.h +++ b/src/plugins/cmakeprojectmanager/fileapiparser.h @@ -27,6 +27,8 @@ #include "cmakeconfigitem.h" +#include "fileapidataextractor.h" + #include #include @@ -34,6 +36,7 @@ #include #include +#include #include #include @@ -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> &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 303503eccc2..1171b9d5480 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> &fi) { auto result = std::make_shared(); - 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,