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"