diff options
author | Tobias Hunger <tobias.hunger@digia.com> | 2013-06-11 18:10:42 +0200 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@digia.com> | 2013-06-17 18:35:39 +0200 |
commit | dce41176d8bcdf0c06179953da150deb12e25be8 (patch) | |
tree | 69f743c45fb3e6733078f8d20428ed21c314ac43 /src | |
parent | 57f125192223cd296ab6f7e8f6a16d6b21b7cdbe (diff) | |
download | qt-creator-dce41176d8bcdf0c06179953da150deb12e25be8.tar.gz |
Qbs: Avoid useless reparsing when possible
Do not trigger a reparsing when e.g. changing environment variables
that qbs does not access.
Change-Id: Ieda4f68112d372c561d99c8dffe016af0d31ad41
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsproject.cpp | 49 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsproject.h | 2 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsprojectfile.cpp | 2 | ||||
m--------- | src/shared/qbs | 0 |
4 files changed, 45 insertions, 8 deletions
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 0e7e5969e4..99bd14f8f4 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -103,9 +103,11 @@ QbsProject::QbsProject(QbsManager *manager, const QString &fileName) : m_rootProjectNode(0), m_qbsSetupProjectJob(0), m_qbsUpdateFutureInterface(0), + m_currentProgressBase(0), + m_forceParsing(false), m_currentBc(0) { - m_parsingDelay.setInterval(1000); // delay (some) parsing by 1s. + m_parsingDelay.setInterval(1000); // delay parsing by 1s. setProjectContext(Core::Context(Constants::PROJECT_ID)); setProjectLanguages(Core::Context(ProjectExplorer::Constants::LANG_CXX)); @@ -310,8 +312,8 @@ void QbsProject::handleQbsParsingTaskSetup(const QString &description, int maxim void QbsProject::targetWasAdded(ProjectExplorer::Target *t) { connect(t, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), - this, SLOT(delayParsing())); - connect(t, SIGNAL(buildDirectoryChanged()), this, SLOT(delayParsing())); + this, SLOT(delayForcedParsing())); + connect(t, SIGNAL(buildDirectoryChanged()), this, SLOT(delayForcedParsing())); } void QbsProject::changeActiveTarget(ProjectExplorer::Target *t) @@ -341,6 +343,12 @@ void QbsProject::delayParsing() m_parsingDelay.start(); } +void QbsProject::delayForcedParsing() +{ + m_forceParsing = true; + delayParsing(); +} + void QbsProject::parseCurrentBuildConfiguration() { m_parsingDelay.stop(); @@ -383,12 +391,33 @@ void QbsProject::generateErrors(const qbs::Error &e) void QbsProject::parse(const QVariantMap &config, const Utils::Environment &env, const QString &dir) { QTC_ASSERT(!dir.isNull(), return); - prepareForParsing(); - - QTC_ASSERT(!m_qbsSetupProjectJob, return); qbs::SetupProjectParameters params; params.setBuildConfiguration(config); + qbs::Error err = params.expandBuildConfiguration(m_manager->settings()); + if (!err.entries().isEmpty()) { + generateErrors(err); + return; + } + + // Avoid useless reparsing: + const qbs::Project *currentProject = qbsProject(); + if (!m_forceParsing + && currentProject + && currentProject->projectConfiguration() == params.buildConfiguration()) { + QHash<QString, QString> usedEnv = currentProject->usedEnvironment(); + bool canSkip = true; + for (QHash<QString, QString>::const_iterator i = usedEnv.constBegin(); + i != usedEnv.constEnd(); ++i) { + if (env.value(i.key()) != i.value()) { + canSkip = false; + break; + } + } + if (canSkip) + return; + } + params.setBuildRoot(dir); params.setProjectFilePath(m_fileName); params.setIgnoreDifferentProjectFilePath(false); @@ -398,8 +427,12 @@ void QbsProject::parse(const QVariantMap &config, const Utils::Environment &env, params.setSearchPaths(prefs->searchPaths(buildDir)); params.setPluginPaths(prefs->pluginPaths(buildDir)); + // Do the parsing: + prepareForParsing(); + QTC_ASSERT(!m_qbsSetupProjectJob, return); + m_qbsSetupProjectJob - = qbs::Project::setupProject(params, m_manager->settings(), m_manager->logSink(), 0); + = qbs::Project::setupProject(params, m_manager->logSink(), 0); connect(m_qbsSetupProjectJob, SIGNAL(finished(bool,qbs::AbstractJob*)), this, SLOT(handleQbsParsingDone(bool))); @@ -413,6 +446,8 @@ void QbsProject::parse(const QVariantMap &config, const Utils::Environment &env, void QbsProject::prepareForParsing() { + m_forceParsing = false; + taskHub()->clearTasks(ProjectExplorer::Constants::TASK_CATEGORY_COMPILE); if (m_qbsUpdateFutureInterface) m_qbsUpdateFutureInterface->reportCanceled(); diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index 49419e004c..f6ca85e489 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -100,6 +100,7 @@ public slots: void invalidate(); void parseCurrentBuildConfiguration(); void delayParsing(); + void delayForcedParsing(); signals: void projectParsingStarted(); @@ -136,6 +137,7 @@ private: QFutureInterface<void> *m_qbsUpdateFutureInterface; int m_currentProgressBase; + bool m_forceParsing; QFuture<void> m_codeModelFuture; diff --git a/src/plugins/qbsprojectmanager/qbsprojectfile.cpp b/src/plugins/qbsprojectmanager/qbsprojectfile.cpp index f6c3ddef99..14ea3b3e96 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectfile.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectfile.cpp @@ -96,7 +96,7 @@ bool QbsProjectFile::reload(QString *errorString, ReloadFlag flag, ChangeType ty Q_UNUSED(flag) if (type == TypePermissions) return true; - m_project->delayParsing(); + m_project->delayForcedParsing(); return true; } diff --git a/src/shared/qbs b/src/shared/qbs -Subproject f8b65305729e5806b14e25172a1ee5bc9f7df4e +Subproject c1b431e5389eda2f6952077e917f3118f98a6db |