diff options
Diffstat (limited to 'src')
4 files changed, 71 insertions, 40 deletions
diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 27ac6a4504..db703727dc 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -356,8 +356,6 @@ QList<CMakeBuildTarget> BuildDirManager::takeBuildTargets() const CMakeConfig BuildDirManager::takeCMakeConfiguration() const { - QTC_ASSERT(!m_isHandlingError, return {}); - if (!m_reader) return CMakeConfig(); diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index aeed2af7ea..b55d48481c 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -106,6 +106,7 @@ CMakeProject::CMakeProject(const FileName &fileName) : Project(Constants::CMAKEM CMakeBuildConfiguration *bc = activeBc(this); if (bc && bc == m_buildDirManager.buildConfiguration()) { bc->setError(msg); + bc->setConfigurationFromCMake(m_buildDirManager.takeCMakeConfiguration()); handleParsingError(bc); } }); diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 097840072f..b0fd84118b 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -196,6 +196,7 @@ void ServerModeReader::parse(bool forceConfiguration) tr("Configuring \"%1\"").arg(m_parameters.projectName), "CMake.Configure"); + m_delayedErrorMessage.clear(); m_cmakeServer->sendRequest(CONFIGURE_TYPE, extra); } @@ -386,42 +387,49 @@ void ServerModeReader::updateCodeModel(CppTools::RawProjectParts &rpps) void ServerModeReader::handleReply(const QVariantMap &data, const QString &inReplyTo) { - Q_UNUSED(data); - if (inReplyTo == CONFIGURE_TYPE) { - m_cmakeServer->sendRequest(COMPUTE_TYPE); - if (m_future) - m_future->setProgressValue(1000); - m_progressStepMinimum = m_progressStepMaximum; - m_progressStepMaximum = 1100; - } else if (inReplyTo == COMPUTE_TYPE) { - m_cmakeServer->sendRequest(CODEMODEL_TYPE); - if (m_future) - m_future->setProgressValue(1100); - m_progressStepMinimum = m_progressStepMaximum; - m_progressStepMaximum = 1200; - } else if (inReplyTo == CODEMODEL_TYPE) { - extractCodeModelData(data); - m_cmakeServer->sendRequest(CMAKE_INPUTS_TYPE); - if (m_future) - m_future->setProgressValue(1200); - m_progressStepMinimum = m_progressStepMaximum; - m_progressStepMaximum = 1300; - } else if (inReplyTo == CMAKE_INPUTS_TYPE) { - extractCMakeInputsData(data); - m_cmakeServer->sendRequest(CACHE_TYPE); - if (m_future) - m_future->setProgressValue(1300); - m_progressStepMinimum = m_progressStepMaximum; - m_progressStepMaximum = 1400; - } else if (inReplyTo == CACHE_TYPE) { - extractCacheData(data); - if (m_future) { - m_future->setProgressValue(MAX_PROGRESS); - m_future->reportFinished(); - m_future.reset(); + if (!m_delayedErrorMessage.isEmpty()) { + // Handle reply to cache after error: + if (inReplyTo == CACHE_TYPE) + extractCacheData(data); + reportError(); + } else { + // No error yet: + if (inReplyTo == CONFIGURE_TYPE) { + m_cmakeServer->sendRequest(COMPUTE_TYPE); + if (m_future) + m_future->setProgressValue(1000); + m_progressStepMinimum = m_progressStepMaximum; + m_progressStepMaximum = 1100; + } else if (inReplyTo == COMPUTE_TYPE) { + m_cmakeServer->sendRequest(CODEMODEL_TYPE); + if (m_future) + m_future->setProgressValue(1100); + m_progressStepMinimum = m_progressStepMaximum; + m_progressStepMaximum = 1200; + } else if (inReplyTo == CODEMODEL_TYPE) { + extractCodeModelData(data); + m_cmakeServer->sendRequest(CMAKE_INPUTS_TYPE); + if (m_future) + m_future->setProgressValue(1200); + m_progressStepMinimum = m_progressStepMaximum; + m_progressStepMaximum = 1300; + } else if (inReplyTo == CMAKE_INPUTS_TYPE) { + extractCMakeInputsData(data); + m_cmakeServer->sendRequest(CACHE_TYPE); + if (m_future) + m_future->setProgressValue(1300); + m_progressStepMinimum = m_progressStepMaximum; + m_progressStepMaximum = 1400; + } else if (inReplyTo == CACHE_TYPE) { + extractCacheData(data); + if (m_future) { + m_future->setProgressValue(MAX_PROGRESS); + m_future->reportFinished(); + m_future.reset(); + } + Core::MessageManager::write(tr("CMake Project was parsed successfully.")); + emit dataAvailable(); } - Core::MessageManager::write(tr("CMake Project was parsed successfully.")); - emit dataAvailable(); } } @@ -429,9 +437,17 @@ void ServerModeReader::handleError(const QString &message) { TaskHub::addTask(Task::Error, message, ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM, Utils::FileName(), -1); - stop(); - Core::MessageManager::write(tr("CMake Project parsing failed.")); - emit errorOccured(message); + if (!m_delayedErrorMessage.isEmpty()) { + reportError(); + return; + } + + m_delayedErrorMessage = message; + + // Always try to read CMakeCache, even after an error! + m_cmakeServer->sendRequest(CACHE_TYPE); + if (m_future) + m_future->setProgressValue(1300); } void ServerModeReader::handleProgress(int min, int cur, int max, const QString &inReplyTo) @@ -452,6 +468,18 @@ void ServerModeReader::handleSignal(const QString &signal, const QVariantMap &da emit dirty(); } +void ServerModeReader::reportError() +{ + stop(); + Core::MessageManager::write(tr("CMake Project parsing failed.")); + emit errorOccured(m_delayedErrorMessage); + + if (m_future) + m_future->reportCanceled(); + + m_delayedErrorMessage.clear(); +} + int ServerModeReader::calculateProgress(const int minRange, const int min, const int cur, const int max, const int maxRange) { if (minRange == maxRange || min == max) diff --git a/src/plugins/cmakeprojectmanager/servermodereader.h b/src/plugins/cmakeprojectmanager/servermodereader.h index 35515fb139..9c29f2dcca 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.h +++ b/src/plugins/cmakeprojectmanager/servermodereader.h @@ -68,6 +68,8 @@ private: void handleProgress(int min, int cur, int max, const QString &inReplyTo); void handleSignal(const QString &signal, const QVariantMap &data); + void reportError(); + int calculateProgress(const int minRange, const int min, const int cur, const int max, const int maxRange); @@ -166,6 +168,8 @@ private: int m_progressStepMinimum = 0; int m_progressStepMaximum = 1000; + QString m_delayedErrorMessage; + CMakeConfig m_cmakeConfiguration; QSet<Utils::FileName> m_cmakeFiles; |