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>
This commit is contained in:
Tobias Hunger
2013-06-11 18:10:42 +02:00
parent 57f1251922
commit dce41176d8
4 changed files with 46 additions and 9 deletions

View File

@@ -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();