summaryrefslogtreecommitdiff
path: root/src/plugins/cmakeprojectmanager/servermodereader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cmakeprojectmanager/servermodereader.cpp')
-rw-r--r--src/plugins/cmakeprojectmanager/servermodereader.cpp104
1 files changed, 66 insertions, 38 deletions
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)