File indexing completed on 2024-05-05 04:39:25
0001 /* 0002 SPDX-FileCopyrightText: 2020 Milian Wolff <mail@milianw.de> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "cmakefileapiimportjob.h" 0008 0009 using namespace KDevelop; 0010 0011 #include "cmakeprojectdata.h" 0012 #include "cmakefileapi.h" 0013 #include "cmakeutils.h" 0014 0015 #include <interfaces/iproject.h> 0016 #include <interfaces/ibuildsystemmanager.h> 0017 #include <project/projectmodel.h> 0018 #include <util/path.h> 0019 0020 #include <KLocalizedString> 0021 0022 #include <QtConcurrentRun> 0023 #include <QFile> 0024 #include <QJsonObject> 0025 0026 #include <utility> 0027 0028 namespace CMake { 0029 namespace FileApi { 0030 0031 ImportJob::ImportJob(KDevelop::IProject* project, QObject* parent) 0032 : KJob(parent) 0033 , m_project(project) 0034 { 0035 connect(&m_futureWatcher, &QFutureWatcher<CMakeProjectData>::finished, this, [this]() { 0036 auto data = m_futureWatcher.result(); 0037 if (m_emitInvalidData || data.compilationData.isValid) { 0038 emit dataAvailable(std::move(data)); 0039 } else { 0040 setError(InvalidProjectDataError); 0041 setErrorText(i18nc("error message", "invalid CMake file API project data")); 0042 } 0043 emitResult(); 0044 }); 0045 } 0046 0047 ImportJob::~ImportJob() = default; 0048 0049 void ImportJob::setInvalidateOutdatedData() 0050 { 0051 m_invalidateOutdatedData = true; 0052 } 0053 0054 void ImportJob::setEmitInvalidData() 0055 { 0056 m_emitInvalidData = true; 0057 } 0058 0059 void ImportJob::start() 0060 { 0061 const auto* bsm = m_project->buildSystemManager(); 0062 const auto sourceDirectory = m_project->path(); 0063 const auto buildDirectory = bsm->buildDirectory(m_project->projectItem()); 0064 0065 auto future = QtConcurrent::run( 0066 [sourceDirectory, buildDirectory, invalidateOutdatedData = m_invalidateOutdatedData]() -> CMakeProjectData { 0067 const auto replyIndex = findReplyIndexFile(buildDirectory.toLocalFile()); 0068 if (!replyIndex.isValid() || (invalidateOutdatedData && replyIndex.isOutdated())) { 0069 return {}; 0070 } 0071 0072 auto ret = parseReplyIndexFile(replyIndex, sourceDirectory, buildDirectory); 0073 if (invalidateOutdatedData && ret.isOutdated) { 0074 ret.compilationData.isValid = false; 0075 } 0076 if (!ret.compilationData.isValid) { 0077 return ret; 0078 } 0079 0080 ret.testSuites = CMake::importTestSuites(buildDirectory); 0081 return ret; 0082 }); 0083 m_futureWatcher.setFuture(future); 0084 } 0085 } 0086 } 0087 0088 #include "moc_cmakefileapiimportjob.cpp"