From edc08ba2bc2ca0e4853d1e8a5aaf25908f3d1b4e Mon Sep 17 00:00:00 2001
From: hjk <hjk121@nokiamail.com>
Date: Wed, 22 Oct 2014 09:16:55 +0200
Subject: [PATCH] Move uses of ProjectMacroExpander closer to build
 configuration

All static functions, can live closer to related code.

Change-Id: I54c5680256c78f1d09b4bee3e8843b2f4350b75a
Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
---
 .../cmakebuildconfiguration.cpp               | 44 +++++++++++-----
 .../cmakeprojectmanager/cmakeproject.cpp      | 15 ------
 .../cmakeprojectmanager/cmakeproject.h        |  3 --
 .../projectexplorer/buildconfiguration.cpp    | 51 ++++++-------------
 .../projectexplorer/projectexplorer.cpp       |  1 -
 .../projectexplorer/projectmacroexpander.cpp  |  6 +--
 .../projectexplorer/projectmacroexpander.h    |  2 +-
 .../qbsbuildconfiguration.cpp                 | 20 ++++++--
 src/plugins/qbsprojectmanager/qbsproject.cpp  | 11 ----
 src/plugins/qbsprojectmanager/qbsproject.h    |  4 --
 .../qmakebuildconfiguration.cpp               | 46 ++++++++++++-----
 .../qmakebuildconfiguration.h                 |  4 ++
 .../qmakeprojectmanager/qmakeproject.cpp      | 19 -------
 .../qmakeprojectmanager/qmakeproject.h        |  3 --
 .../qmakeprojectconfigwidget.cpp              |  6 +--
 .../qmakeprojectimporter.cpp                  |  2 +-
 16 files changed, 108 insertions(+), 129 deletions(-)

diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
index 8f5d8385e52..5326b27c9b4 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
@@ -35,31 +35,48 @@
 #include "cmakeproject.h"
 #include "cmakeprojectconstants.h"
 
+#include <coreplugin/documentmanager.h>
 #include <coreplugin/icore.h>
 #include <coreplugin/mimedatabase.h>
+
 #include <projectexplorer/buildsteplist.h>
 #include <projectexplorer/kit.h>
 #include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/projectmacroexpander.h>
 #include <projectexplorer/target.h>
 
 #include <utils/qtcassert.h>
 
 #include <QInputDialog>
 
-using namespace CMakeProjectManager;
-using namespace Internal;
+using namespace ProjectExplorer;
+using namespace Utils;
+
+namespace CMakeProjectManager {
+namespace Internal {
 
-namespace {
 const char USE_NINJA_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.UseNinja";
-} // namespace
+
+static QString shadowBuildDirectory(const QString &projectFilePath, const Kit *k, const QString &bcName)
+{
+    if (projectFilePath.isEmpty())
+        return QString();
+    QFileInfo info(projectFilePath);
+
+    const QString projectName = QFileInfo(info.absolutePath()).fileName();
+    ProjectMacroExpander expander(projectName, k, bcName);
+    QDir projectDir = QDir(Project::projectDirectory(FileName::fromString(projectFilePath)).toString());
+    QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
+    return QDir::cleanPath(projectDir.absoluteFilePath(buildPath));
+}
 
 CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent) :
     BuildConfiguration(parent, Core::Id(Constants::CMAKE_BC_ID)), m_useNinja(false)
 {
     CMakeProject *project = static_cast<CMakeProject *>(parent->project());
-    setBuildDirectory(Utils::FileName::fromString(project->shadowBuildDirectory(project->projectFilePath().toString(),
-                                                                                parent->kit(),
-                                                                                displayName())));
+    setBuildDirectory(Utils::FileName::fromString(shadowBuildDirectory(project->projectFilePath().toString(),
+                                                                       parent->kit(),
+                                                                       displayName())));
 }
 
 CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent,
@@ -156,9 +173,7 @@ QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableSet
     CMakeBuildInfo *info = createBuildInfo(k, ProjectExplorer::Project::projectDirectory(Utils::FileName::fromString(projectPath)).toString());
     //: The name of the build configuration created by default for a cmake project.
     info->displayName = tr("Default");
-    info->buildDirectory
-            = Utils::FileName::fromString(CMakeProject::shadowBuildDirectory(projectPath, k,
-                                                                             info->displayName));
+    info->buildDirectory = FileName::fromString(shadowBuildDirectory(projectPath, k, info->displayName));
     result << info;
     return result;
 }
@@ -174,10 +189,9 @@ ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(Proj
     CMakeProject *project = static_cast<CMakeProject *>(parent->project());
 
     if (copy.buildDirectory.isEmpty())
-        copy.buildDirectory
-                = Utils::FileName::fromString(project->shadowBuildDirectory(project->projectFilePath().toString(),
-                                                                            parent->kit(),
-                                                                            copy.displayName));
+        copy.buildDirectory = FileName::fromString(shadowBuildDirectory(project->projectFilePath().toString(),
+                                                                        parent->kit(),
+                                                                        copy.displayName));
 
     CMakeOpenProjectWizard copw(Core::ICore::mainWindow(), project->projectManager(), CMakeOpenProjectWizard::ChangeDirectory, &copy);
     if (copw.exec() != QDialog::Accepted)
@@ -295,3 +309,5 @@ ProjectExplorer::BuildConfiguration::BuildType CMakeBuildConfiguration::buildTyp
     return Unknown;
 }
 
+} // namespace Internal
+} // namespace CMakeProjectManager
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index ef0d75f94b0..f260b6a24c0 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -49,7 +49,6 @@
 #include <projectexplorer/target.h>
 #include <projectexplorer/deployconfiguration.h>
 #include <projectexplorer/deploymentdata.h>
-#include <projectexplorer/projectmacroexpander.h>
 #include <qtsupport/customexecutablerunconfiguration.h>
 #include <qtsupport/baseqtversion.h>
 #include <qtsupport/qtkitinformation.h>
@@ -62,7 +61,6 @@
 #include <utils/hostosinfo.h>
 #include <coreplugin/icore.h>
 #include <coreplugin/infobar.h>
-#include <coreplugin/documentmanager.h>
 #include <coreplugin/editormanager/editormanager.h>
 
 #include <QDebug>
@@ -177,19 +175,6 @@ void CMakeProject::changeBuildDirectory(CMakeBuildConfiguration *bc, const QStri
     parseCMakeLists();
 }
 
-QString CMakeProject::shadowBuildDirectory(const QString &projectFilePath, const Kit *k, const QString &bcName)
-{
-    if (projectFilePath.isEmpty())
-        return QString();
-    QFileInfo info(projectFilePath);
-
-    const QString projectName = QFileInfo(info.absolutePath()).fileName();
-    ProjectExplorer::ProjectMacroExpander expander(projectFilePath, projectName, k, bcName);
-    QDir projectDir = QDir(projectDirectory(Utils::FileName::fromString(projectFilePath)).toString());
-    QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
-    return QDir::cleanPath(projectDir.absoluteFilePath(buildPath));
-}
-
 QStringList CMakeProject::getCXXFlagsFor(const CMakeBuildTarget &buildTarget)
 {
     QString makeCommand = QDir::fromNativeSeparators(buildTarget.makeCommand);
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index 80a232e948a..cfb3d176a79 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -102,9 +102,6 @@ public:
 
     CMakeBuildTarget buildTargetForTitle(const QString &title);
 
-    static QString shadowBuildDirectory(const QString &projectFilePath, const ProjectExplorer::Kit *k,
-                                        const QString &bcName);
-
     bool isProjectFile(const QString &fileName);
 
     bool parseCMakeLists();
diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp
index bc339d98543..b48d21e7b3c 100644
--- a/src/plugins/projectexplorer/buildconfiguration.cpp
+++ b/src/plugins/projectexplorer/buildconfiguration.cpp
@@ -36,9 +36,9 @@
 #include "target.h"
 #include "project.h"
 #include "kit.h"
-#include "projectmacroexpander.h"
 
 #include <projectexplorer/buildenvironmentwidget.h>
+#include <projectexplorer/projectmacroexpander.h>
 #include <extensionsystem/pluginmanager.h>
 #include <coreplugin/idocument.h>
 
@@ -55,38 +55,6 @@ static const char USER_ENVIRONMENT_CHANGES_KEY[] = "ProjectExplorer.BuildConfigu
 static const char BUILDDIRECTORY_KEY[] = "ProjectExplorer.BuildConfiguration.BuildDirectory";
 
 namespace ProjectExplorer {
-namespace Internal {
-
-class BuildConfigMacroExpander : public ProjectMacroExpander
-{
-public:
-    explicit BuildConfigMacroExpander(const BuildConfiguration *bc)
-        : ProjectMacroExpander(bc->target()->project()->document()->filePath(),
-                               bc->target()->project()->displayName(),
-                               bc->target()->kit(),
-                               bc->displayName()),
-          m_bc(bc)
-    {}
-    virtual bool resolveMacro(const QString &name, QString *ret) const;
-private:
-    const BuildConfiguration *m_bc;
-};
-
-bool BuildConfigMacroExpander::resolveMacro(const QString &name, QString *ret) const
-{
-    // legacy variables
-    if (name == QLatin1String("sourceDir")) {
-        *ret = m_bc->target()->project()->projectDirectory().toUserOutput();
-        return true;
-    }
-    if (name == QLatin1String("buildDir")) {
-        *ret = m_bc->buildDirectory().toUserOutput();
-        return true;
-    }
-
-    return ProjectMacroExpander::resolveMacro(name, ret);
-}
-} // namespace Internal
 
 BuildConfiguration::BuildConfiguration(Target *target, Core::Id id) :
     ProjectConfiguration(target, id),
@@ -157,8 +125,21 @@ QList<NamedWidget *> BuildConfiguration::createSubConfigWidgets()
 
 Utils::MacroExpander *BuildConfiguration::macroExpander()
 {
-    if (!m_macroExpander)
-        m_macroExpander = new Internal::BuildConfigMacroExpander(this);
+    if (!m_macroExpander) {
+        m_macroExpander = new ProjectMacroExpander(target()->project()->displayName(),
+                                                   target()->kit(), displayName());
+
+        m_macroExpander->registerSubProvider(
+            [this]() { return target()->kit()->macroExpander(); });
+
+        // Legacy support.
+        m_macroExpander->registerVariable("sourceDir", tr("Source directory"),
+            [this]() { return target()->project()->projectDirectory().toUserOutput(); });
+
+        m_macroExpander->registerVariable("buildDir", tr("Build directory"),
+            [this]() { return buildDirectory().toUserOutput(); });
+    }
+
     return m_macroExpander;
 }
 
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index e5ade6852b2..aa1c75f4286 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -41,7 +41,6 @@
 #include "jsonwizard/jsonwizardpagefactory_p.h"
 #include "project.h"
 #include "projectexplorersettings.h"
-#include "projectmacroexpander.h"
 #include "removetaskhandler.h"
 #include "unconfiguredprojectpanel.h"
 #include "kitfeatureprovider.h"
diff --git a/src/plugins/projectexplorer/projectmacroexpander.cpp b/src/plugins/projectexplorer/projectmacroexpander.cpp
index bddd6250622..4a521b15fc9 100644
--- a/src/plugins/projectexplorer/projectmacroexpander.cpp
+++ b/src/plugins/projectexplorer/projectmacroexpander.cpp
@@ -38,9 +38,9 @@
 
 using namespace ProjectExplorer;
 
-ProjectMacroExpander::ProjectMacroExpander(const QString &projectFilePath, const QString &projectName,
-                                 const Kit *k, const QString &bcName)
-    : m_projectFile(projectFilePath), m_projectName(projectName), m_kit(k), m_bcName(bcName)
+ProjectMacroExpander::ProjectMacroExpander(const QString &projectName,
+                                           const Kit *k, const QString &bcName)
+    : m_projectName(projectName), m_kit(k), m_bcName(bcName)
 { }
 
 bool ProjectMacroExpander::resolveMacro(const QString &name, QString *ret) const
diff --git a/src/plugins/projectexplorer/projectmacroexpander.h b/src/plugins/projectexplorer/projectmacroexpander.h
index 365e9d2fa81..b33df8eda19 100644
--- a/src/plugins/projectexplorer/projectmacroexpander.h
+++ b/src/plugins/projectexplorer/projectmacroexpander.h
@@ -41,7 +41,7 @@ class Kit;
 class PROJECTEXPLORER_EXPORT ProjectMacroExpander : public Utils::MacroExpander
 {
 public:
-    ProjectMacroExpander(const QString &projectFilePath, const QString &projectName, const Kit *k, const QString &bcName);
+    ProjectMacroExpander(const QString &projectName, const Kit *k, const QString &bcName);
     bool resolveMacro(const QString &name, QString *ret) const;
 
 private:
diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
index dc55efcd43b..b06731e3e90 100644
--- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
+++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp
@@ -37,6 +37,7 @@
 #include "qbsproject.h"
 #include "qbsprojectmanagerconstants.h"
 
+#include <coreplugin/documentmanager.h>
 #include <coreplugin/icore.h>
 #include <coreplugin/mimedatabase.h>
 #include <utils/qtcassert.h>
@@ -44,6 +45,7 @@
 #include <projectexplorer/kit.h>
 #include <projectexplorer/kitinformation.h>
 #include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/projectmacroexpander.h>
 #include <projectexplorer/target.h>
 #include <projectexplorer/toolchain.h>
 
@@ -275,6 +277,16 @@ int QbsBuildConfigurationFactory::priority(const Kit *k, const QString &projectP
             .matchesType(QLatin1String(Constants::MIME_TYPE))) ? 0 : -1;
 }
 
+static Utils::FileName defaultBuildDirectory(const QString &projectFilePath, const Kit *k,
+                                             const QString &bcName)
+{
+    const QString projectName = QFileInfo(projectFilePath).completeBaseName();
+    ProjectMacroExpander expander(projectName, k, bcName);
+    QString projectDir = Project::projectDirectory(Utils::FileName::fromString(projectFilePath)).toString();
+    QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
+    return Utils::FileName::fromString(Utils::FileUtils::resolvePath(projectDir, buildPath));
+}
+
 QList<BuildInfo *> QbsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const
 {
     QList<BuildInfo *> result;
@@ -282,13 +294,13 @@ QList<BuildInfo *> QbsBuildConfigurationFactory::availableSetups(const Kit *k, c
     BuildInfo *info = createBuildInfo(k, BuildConfiguration::Debug);
     //: The name of the debug build configuration created by default for a qbs project.
     info->displayName = tr("Debug");
-    info->buildDirectory = QbsProject::defaultBuildDirectory(projectPath, k, info->displayName);
+    info->buildDirectory = defaultBuildDirectory(projectPath, k, info->displayName);
     result << info;
 
     info = createBuildInfo(k, BuildConfiguration::Release);
     //: The name of the release build configuration created by default for a qbs project.
     info->displayName = tr("Release");
-    info->buildDirectory = QbsProject::defaultBuildDirectory(projectPath, k, info->displayName);
+    info->buildDirectory = defaultBuildDirectory(projectPath, k, info->displayName);
     result << info;
 
     return result;
@@ -310,8 +322,8 @@ BuildConfiguration *QbsBuildConfigurationFactory::create(Target *parent, const B
 
     Utils::FileName buildDir = info->buildDirectory;
     if (buildDir.isEmpty())
-        buildDir = QbsProject::defaultBuildDirectory(parent->project()->projectDirectory().toString(),
-                                                     parent->kit(), info->displayName);
+        buildDir = defaultBuildDirectory(parent->project()->projectDirectory().toString(),
+                                         parent->kit(), info->displayName);
 
     BuildConfiguration *bc
             = QbsBuildConfiguration::setup(parent, info->displayName, info->displayName,
diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp
index 4399fa29c4b..ae4592b7891 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.cpp
+++ b/src/plugins/qbsprojectmanager/qbsproject.cpp
@@ -55,7 +55,6 @@
 #include <projectexplorer/kitinformation.h>
 #include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/projectexplorerconstants.h>
-#include <projectexplorer/projectmacroexpander.h>
 #include <projectexplorer/target.h>
 #include <projectexplorer/taskhub.h>
 #include <projectexplorer/toolchain.h>
@@ -397,16 +396,6 @@ bool QbsProject::hasParseResult() const
     return qbsProject().isValid();
 }
 
-Utils::FileName QbsProject::defaultBuildDirectory(const QString &projectFilePath, const Kit *k,
-                                                  const QString &bcName)
-{
-    const QString projectName = QFileInfo(projectFilePath).completeBaseName();
-    ProjectExplorer::ProjectMacroExpander expander(projectFilePath, projectName, k, bcName);
-    QString projectDir = projectDirectory(Utils::FileName::fromString(projectFilePath)).toString();
-    QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
-    return Utils::FileName::fromString(Utils::FileUtils::resolvePath(projectDir, buildPath));
-}
-
 qbs::Project QbsProject::qbsProject() const
 {
     return m_qbsProject;
diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h
index 902f80c9417..2d77c8e77f0 100644
--- a/src/plugins/qbsprojectmanager/qbsproject.h
+++ b/src/plugins/qbsprojectmanager/qbsproject.h
@@ -99,10 +99,6 @@ public:
 
     void registerQbsProjectParser(QbsProjectParser *p);
 
-    static Utils::FileName defaultBuildDirectory(const QString &projectFilePath,
-                                                 const ProjectExplorer::Kit *k,
-                                                 const QString &bcName);
-
     qbs::Project qbsProject() const;
     qbs::ProjectData qbsProjectData() const;
 
diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
index 26ef059cb68..83063dc2282 100644
--- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp
@@ -39,45 +39,67 @@
 #include "qmakestep.h"
 #include "makestep.h"
 
-#include <utils/qtcprocess.h>
-#include <utils/qtcassert.h>
-#include <limits>
+#include <coreplugin/documentmanager.h>
 #include <coreplugin/icore.h>
 #include <coreplugin/mimedatabase.h>
+
 #include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/kit.h>
 #include <projectexplorer/projectexplorerconstants.h>
+#include <projectexplorer/projectmacroexpander.h>
 #include <projectexplorer/target.h>
 #include <projectexplorer/toolchain.h>
 #include <projectexplorer/toolchainmanager.h>
 #include <qtsupport/qtkitinformation.h>
 #include <qtsupport/qtversionmanager.h>
 #include <utils/qtcassert.h>
-#include <QDebug>
+#include <utils/qtcprocess.h>
+#include <utils/qtcassert.h>
 #include <android/androidmanager.h>
 
+#include <QDebug>
 #include <QInputDialog>
 
+#include <limits>
+
+using namespace ProjectExplorer;
+using namespace QtSupport;
+using namespace Utils;
+using namespace QmakeProjectManager::Internal;
+
 namespace QmakeProjectManager {
 
 // --------------------------------------------------------------------
 // Helpers:
 // --------------------------------------------------------------------
 
+QString QmakeBuildConfiguration::shadowBuildDirectory(const QString &proFilePath, const Kit *k, const QString &suffix)
+{
+    if (proFilePath.isEmpty())
+        return QString();
+    QFileInfo info(proFilePath);
+
+    BaseQtVersion *version = QtKitInformation::qtVersion(k);
+    if (version && !version->supportsShadowBuilds())
+        return info.absolutePath();
+
+    const QString projectName = QFileInfo(proFilePath).completeBaseName();
+    ProjectMacroExpander expander(projectName, k, suffix);
+    QString projectDir = Project::projectDirectory(FileName::fromString(proFilePath)).toString();
+    QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
+    return FileUtils::resolvePath(projectDir, buildPath);
+}
+
 static Utils::FileName defaultBuildDirectory(bool supportsShadowBuild,
                                              const QString &projectPath,
                                              const ProjectExplorer::Kit *k,
                                              const QString &suffix)
 {
     if (supportsShadowBuild)
-        return Utils::FileName::fromString(QmakeProject::shadowBuildDirectory(projectPath, k, suffix));
+        return Utils::FileName::fromString(QmakeBuildConfiguration::shadowBuildDirectory(projectPath, k, suffix));
     return ProjectExplorer::Project::projectDirectory(Utils::FileName::fromString(projectPath));
 }
 
-using namespace Internal;
-using namespace ProjectExplorer;
-using namespace QtSupport;
-using namespace Utils;
-
 const char QMAKE_BC_ID[] = "Qt4ProjectManager.Qt4BuildConfiguration";
 const char USE_SHADOW_BUILD_KEY[] = "Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild";
 const char BUILD_CONFIGURATION_KEY[] = "Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration";
@@ -201,8 +223,8 @@ NamedWidget *QmakeBuildConfiguration::createConfigWidget()
 QString QmakeBuildConfiguration::defaultShadowBuildDirectory() const
 {
     // todo displayName isn't ideal
-    return QmakeProject::shadowBuildDirectory(target()->project()->projectFilePath().toString(),
-                                              target()->kit(), displayName());
+    return shadowBuildDirectory(target()->project()->projectFilePath().toString(),
+                                target()->kit(), displayName());
 }
 
 bool QmakeBuildConfiguration::supportsShadowBuilds()
diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h
index 549d9d8c2e5..3bb8758b49c 100644
--- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h
+++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h
@@ -68,6 +68,10 @@ public:
     QtSupport::BaseQtVersion::QmakeBuildConfigs qmakeBuildConfiguration() const;
     void setQMakeBuildConfiguration(QtSupport::BaseQtVersion::QmakeBuildConfigs config);
 
+    /// suffix should be unique
+    static QString shadowBuildDirectory(const QString &profilePath, const ProjectExplorer::Kit *k,
+                                 const QString &suffix);
+
     /// \internal for qmakestep
     // used by qmake step to notify that the qmake args have changed
     // not really nice, the build configuration should save the arguments
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
index c1de09cf08f..945a8d814dc 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
@@ -45,7 +45,6 @@
 #include <coreplugin/icontext.h>
 #include <coreplugin/icore.h>
 #include <coreplugin/progressmanager/progressmanager.h>
-#include <coreplugin/documentmanager.h>
 #include <cpptools/cppmodelmanager.h>
 #include <qmljs/qmljsmodelmanagerinterface.h>
 #include <projectexplorer/buildmanager.h>
@@ -55,7 +54,6 @@
 #include <projectexplorer/headerpath.h>
 #include <projectexplorer/target.h>
 #include <projectexplorer/projectexplorer.h>
-#include <projectexplorer/projectmacroexpander.h>
 #include <proparser/qmakevfs.h>
 #include <qtsupport/profilereader.h>
 #include <qtsupport/qtkitinformation.h>
@@ -1442,23 +1440,6 @@ QString QmakeProject::disabledReasonForRunConfiguration(const QString &proFilePa
             .arg(QFileInfo(proFilePath).fileName());
 }
 
-QString QmakeProject::shadowBuildDirectory(const QString &proFilePath, const Kit *k, const QString &suffix)
-{
-    if (proFilePath.isEmpty())
-        return QString();
-    QFileInfo info(proFilePath);
-
-    QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k);
-    if (version && !version->supportsShadowBuilds())
-        return info.absolutePath();
-
-    const QString projectName = QFileInfo(proFilePath).completeBaseName();
-    ProjectExplorer::ProjectMacroExpander expander(proFilePath, projectName, k, suffix);
-    QString projectDir = projectDirectory(Utils::FileName::fromString(proFilePath)).toString();
-    QString buildPath = expander.expand(Core::DocumentManager::buildDirectory());
-    return Utils::FileUtils::resolvePath(projectDir, buildPath);
-}
-
 QString QmakeProject::buildNameFor(const Kit *k)
 {
     if (!k)
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.h b/src/plugins/qmakeprojectmanager/qmakeproject.h
index 7eafa30decb..2e0892a1aa6 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.h
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.h
@@ -132,9 +132,6 @@ public:
     /// \internal
     QString disabledReasonForRunConfiguration(const QString &proFilePath);
 
-    /// suffix should be unique
-    static QString shadowBuildDirectory(const QString &profilePath, const ProjectExplorer::Kit *k,
-                                 const QString &suffix);
     /// used by the default implementation of shadowBuildDirectory
     static QString buildNameFor(const ProjectExplorer::Kit *k);
 
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp
index 4a32497ba02..dbaaca1812c 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectconfigwidget.cpp
@@ -51,9 +51,9 @@ QmakeProjectConfigWidget::QmakeProjectConfigWidget(QmakeBuildConfiguration *bc)
       m_ignoreChange(false)
 {
     m_defaultShadowBuildDir
-            = QmakeProject::shadowBuildDirectory(bc->target()->project()->projectFilePath().toString(),
-                                               bc->target()->kit(),
-                                               Utils::FileUtils::qmakeFriendlyName(bc->displayName()));
+            = QmakeBuildConfiguration::shadowBuildDirectory(bc->target()->project()->projectFilePath().toString(),
+                                                            bc->target()->kit(),
+                                                            Utils::FileUtils::qmakeFriendlyName(bc->displayName()));
 
     QVBoxLayout *vbox = new QVBoxLayout(this);
     vbox->setMargin(0);
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp
index 5417f95b2ce..6b846b401e8 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp
@@ -213,7 +213,7 @@ QStringList QmakeProjectImporter::importCandidates(const Utils::FileName &projec
 
     QList<ProjectExplorer::Kit *> kitList = ProjectExplorer::KitManager::kits();
     foreach (ProjectExplorer::Kit *k, kitList) {
-        QFileInfo fi(QmakeProject::shadowBuildDirectory(projectPath.toString(), k, QString()));
+        QFileInfo fi(QmakeBuildConfiguration::shadowBuildDirectory(projectPath.toString(), k, QString()));
         const QString baseDir = fi.absolutePath();
 
         foreach (const QString &dir, QDir(baseDir).entryList()) {
-- 
GitLab