From 4e3f44504e09c4a38298e3eeed84083c577363b2 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 22 May 2019 17:50:02 +0200 Subject: Fix module provider bug in IDE mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When re-resolving a project with an existing in-memory build graph, we must make sure that the old project object does not remove the generated modules from the build directory in its destructor. This fixes the following bug in Qt Creator: - Open a project initially (but do not build). - Edit the project file and re-resolve. - Build the project. This now fails, because the generated modules were erroneously removed in step 2. Change-Id: If6c1c1ed986e8f00e4d89ba5525bac7e032388d9 Reviewed-by: Jörg Bornemann --- src/lib/corelib/api/internaljobs.cpp | 5 ++++- src/lib/corelib/language/language.cpp | 11 +++++++++-- src/lib/corelib/language/language.h | 2 ++ 3 files changed, 15 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/lib/corelib/api/internaljobs.cpp b/src/lib/corelib/api/internaljobs.cpp index 4d06821fd..f07927c71 100644 --- a/src/lib/corelib/api/internaljobs.cpp +++ b/src/lib/corelib/api/internaljobs.cpp @@ -268,8 +268,11 @@ void InternalSetupProjectJob::start() deleteLocker = true; } execute(); - if (m_existingProject) + if (m_existingProject) { + if (m_existingProject != m_newProject) + m_existingProject->makeModuleProvidersNonTransient(); m_existingProject->bgLocker = nullptr; + } m_newProject->bgLocker = bgLocker; deleteLocker = false; } catch (const ErrorInfo &error) { diff --git a/src/lib/corelib/language/language.cpp b/src/lib/corelib/language/language.cpp index 239eddf1f..f21f724f1 100644 --- a/src/lib/corelib/language/language.cpp +++ b/src/lib/corelib/language/language.cpp @@ -622,6 +622,12 @@ QString TopLevelProject::profile() const return projectProperties().value(StringConstants::profileProperty()).toString(); } +void TopLevelProject::makeModuleProvidersNonTransient() +{ + for (ModuleProviderInfo &m : moduleProviderInfo) + m.transientOutput = false; +} + QString TopLevelProject::buildGraphFilePath() const { return ProjectBuildData::deriveBuildGraphFilePath(buildDirectory, id()); @@ -637,8 +643,9 @@ void TopLevelProject::store(Logger logger) qCDebug(lcBuildGraph) << "build graph is unchanged in project" << id(); return; } - for (ModuleProviderInfo &m : moduleProviderInfo) - m.transientOutput = false; + + makeModuleProvidersNonTransient(); + const QString fileName = buildGraphFilePath(); qCDebug(lcBuildGraph) << "storing:" << fileName; PersistentPool pool(logger); diff --git a/src/lib/corelib/language/language.h b/src/lib/corelib/language/language.h index 82d9f94a2..297fedf1c 100644 --- a/src/lib/corelib/language/language.h +++ b/src/lib/corelib/language/language.h @@ -711,6 +711,8 @@ public: const QVariantMap &buildConfiguration() const { return m_buildConfiguration; } QString id() const { return m_id; } QString profile() const; + void makeModuleProvidersNonTransient(); + QVariantMap profileConfigs; QVariantMap overriddenValues; -- cgit v1.2.3