diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp index b09a1b156f891ea70a46aba6fe89738b437f95dc..11fe8afdcf51a5c0d2e923e48cbffb3d5a08ff55 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp @@ -89,31 +89,28 @@ AutotoolsBuildConfigurationFactory::AutotoolsBuildConfigurationFactory(QObject * { } -bool AutotoolsBuildConfigurationFactory::canCreate(const Target *parent) const +int AutotoolsBuildConfigurationFactory::priority(const Target *parent) const { - return canHandle(parent); + return canHandle(parent) ? 0 : -1; } QList<BuildInfo *> AutotoolsBuildConfigurationFactory::availableBuilds(const Target *parent) const { QList<BuildInfo *> result; - QTC_ASSERT(canCreate(parent), return result); - result << createBuildInfo(parent->kit(), Utils::FileName::fromString(parent->project()->projectDirectory())); return result; } -bool AutotoolsBuildConfigurationFactory::canSetup(const Kit *k, const QString &projectPath) const +int AutotoolsBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const { - return k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) - .matchesType(QLatin1String(Constants::MAKEFILE_MIMETYPE)); + return (k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) + .matchesType(QLatin1String(Constants::MAKEFILE_MIMETYPE))) ? 0 : -1; } QList<BuildInfo *> AutotoolsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { QList<BuildInfo *> result; - QTC_ASSERT(canSetup(k, projectPath), return result); BuildInfo *info = createBuildInfo(k, Utils::FileName::fromString(AutotoolsProject::defaultBuildDirectory(projectPath))); //: The name of the build configuration created by default for a autotools project. diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h index 3375cd3428df7e2326b23f5bdd3525971d8fde0a..2aedd932460617e9105165e522e70bf497401b4d 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h @@ -69,9 +69,9 @@ class AutotoolsBuildConfigurationFactory : public ProjectExplorer::IBuildConfigu public: explicit AutotoolsBuildConfigurationFactory(QObject *parent = 0); - bool canCreate(const ProjectExplorer::Target *parent) const; + int priority(const ProjectExplorer::Target *parent) const; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const; - bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const; + int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const; ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 9d7179dc6c7e4d230f8e3284b99445523eaa2758..9a63ccb8287097174d5f73ddd13ae35f47ea9dac 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -122,15 +122,14 @@ CMakeBuildConfigurationFactory::~CMakeBuildConfigurationFactory() { } -bool CMakeBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent) const +int CMakeBuildConfigurationFactory::priority(const ProjectExplorer::Target *parent) const { - return canHandle(parent); + return canHandle(parent) ? 0 : -1; } QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableBuilds(const ProjectExplorer::Target *parent) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canCreate(parent), return result); CMakeBuildInfo *info = createBuildInfo(parent->kit(), parent->project()->projectDirectory()); @@ -138,18 +137,16 @@ QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableBui return result; } -bool CMakeBuildConfigurationFactory::canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const +int CMakeBuildConfigurationFactory::priority(const ProjectExplorer::Kit *k, const QString &projectPath) const { - return k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) - .matchesType(QLatin1String(Constants::CMAKEMIMETYPE)); + return (k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) + .matchesType(QLatin1String(Constants::CMAKEMIMETYPE))) ? 0 : -1; } QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canSetup(k, projectPath), return result); - CMakeBuildInfo *info = createBuildInfo(k, ProjectExplorer::Project::projectDirectory(projectPath)); //: The name of the build configuration created by default for a cmake project. info->displayName = tr("Default"); @@ -163,7 +160,6 @@ QList<ProjectExplorer::BuildInfo *> CMakeBuildConfigurationFactory::availableSet ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const ProjectExplorer::BuildInfo *info) const { - QTC_ASSERT(canCreate(parent), return 0); QTC_ASSERT(info->factory() == this, return 0); QTC_ASSERT(info->kitId == parent->kit()->id(), return 0); QTC_ASSERT(!info->displayName.isEmpty(), return 0); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index de7ab612d33a680e4427bb0702baa00f2b95c294..41de9c0bee393e7015de8f0c82eac40dc88a5964 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -85,9 +85,9 @@ public: CMakeBuildConfigurationFactory(QObject *parent = 0); ~CMakeBuildConfigurationFactory(); - bool canCreate(const ProjectExplorer::Target *parent) const; + int priority(const ProjectExplorer::Target *parent) const; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const; - bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const; + int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const; ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp index f130f327b4261f4433df1817bed8cf71e7c2c62f..b43b6505d99ed7fa661338dade71c173520d916f 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp @@ -87,31 +87,28 @@ GenericBuildConfigurationFactory::~GenericBuildConfigurationFactory() { } -bool GenericBuildConfigurationFactory::canCreate(const Target *parent) const +int GenericBuildConfigurationFactory::priority(const Target *parent) const { - return canHandle(parent); + return canHandle(parent) ? 0 : -1; } QList<BuildInfo *> GenericBuildConfigurationFactory::availableBuilds(const Target *parent) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canCreate(parent), return result); - BuildInfo *info = createBuildInfo(parent->kit(), Utils::FileName::fromString(parent->project()->projectDirectory())); result << info; return result; } -bool GenericBuildConfigurationFactory::canSetup(const Kit *k, const QString &projectPath) const +int GenericBuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const { - return k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) - .matchesType(QLatin1String(Constants::GENERICMIMETYPE)); + return (k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) + .matchesType(QLatin1String(Constants::GENERICMIMETYPE))) ? 0 : -1; } QList<BuildInfo *> GenericBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { QList<BuildInfo *> result; - QTC_ASSERT(canSetup(k, projectPath), return result); BuildInfo *info = createBuildInfo(k, Utils::FileName::fromString(ProjectExplorer::Project::projectDirectory(projectPath))); //: The name of the build configuration created by default for a generic project. info->displayName = tr("Default"); @@ -121,7 +118,6 @@ QList<BuildInfo *> GenericBuildConfigurationFactory::availableSetups(const Kit * BuildConfiguration *GenericBuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const { - QTC_ASSERT(canCreate(parent), return 0); QTC_ASSERT(info->factory() == this, return 0); QTC_ASSERT(info->kitId == parent->kit()->id(), return 0); QTC_ASSERT(!info->displayName.isEmpty(), return 0); diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h index aca2452d65803c97dd6f31546cbe24a027223795..d2f1880f48b39805d4cb1246973f5db7e473fca9 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h @@ -72,9 +72,9 @@ public: explicit GenericBuildConfigurationFactory(QObject *parent = 0); ~GenericBuildConfigurationFactory(); - bool canCreate(const ProjectExplorer::Target *parent) const; + int priority(const ProjectExplorer::Target *parent) const; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const; - bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const; + int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const; ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index 8366ff00f0f8b643f81dbfa418c5fd5439341103..fb1f5a32c62203a567162b7ef395c8ecd192edd0 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -346,11 +346,16 @@ IBuildConfigurationFactory *IBuildConfigurationFactory::find(Kit *k, const QStri { QList<IBuildConfigurationFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<IBuildConfigurationFactory>(); - foreach (IBuildConfigurationFactory *factory, factories) { - if (factory->canSetup(k, projectPath)) - return factory; + IBuildConfigurationFactory *factory = 0; + int priority = -1; + foreach (IBuildConfigurationFactory *i, factories) { + int iPriority = i->priority(k, projectPath); + if (iPriority > priority) { + factory = i; + priority = iPriority; + } } - return 0; + return factory; } // create @@ -358,11 +363,16 @@ IBuildConfigurationFactory * IBuildConfigurationFactory::find(Target *parent) { QList<IBuildConfigurationFactory *> factories = ExtensionSystem::PluginManager::getObjects<IBuildConfigurationFactory>(); - foreach (IBuildConfigurationFactory *factory, factories) { - if (factory->canCreate(parent)) - return factory; + IBuildConfigurationFactory *factory = 0; + int priority = -1; + foreach (IBuildConfigurationFactory *i, factories) { + int iPriority = i->priority(parent); + if (iPriority > priority) { + factory = i; + priority = iPriority; + } } - return 0; + return factory; } // clone diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index 52bca21090a2bede29bce22493530b46f726245b..452a73f4857b50eb762a747b608df2c608c4828a 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -128,15 +128,15 @@ public: explicit IBuildConfigurationFactory(QObject *parent = 0); virtual ~IBuildConfigurationFactory(); - // Used to see whether any BuildInfo is available on this factory for a given target. - virtual bool canCreate(const Target *parent) const = 0; + // The priority is negative if this factory can not create anything for the target. + // It is 0 for the "default" factory that wants to handle the target. + // Add 100 for each specialization. + virtual int priority(const Target *parent) const = 0; // List of build information that can be used to create a new build configuration via // "Add Build Configuration" button. virtual QList<BuildInfo *> availableBuilds(const Target *parent) const = 0; - // Used to see whether this factory can produce any BuildConfigurations for a kit when - // setting up the given project. - virtual bool canSetup(const Kit *k, const QString &projectPath) const = 0; + virtual int priority(const Kit *k, const QString &projectPath) const = 0; // List of build information that can be used to initially set up a new build configuration. virtual QList<BuildInfo *> availableSetups(const Kit *k, const QString &projectPath) const = 0; diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index fd54f2d3e8cf7ef9f8af1b3fb2abff14b22729dc..bbde8ddbee3db74fab8243e32c8bed47e538dcfb 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -254,15 +254,14 @@ ProjectExplorer::BuildInfo *QbsBuildConfigurationFactory::createBuildInfo(const return info; } -bool QbsBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent) const +int QbsBuildConfigurationFactory::priority(const ProjectExplorer::Target *parent) const { - return canHandle(parent); + return canHandle(parent) ? 0 : -1; } QList<ProjectExplorer::BuildInfo *> QbsBuildConfigurationFactory::availableBuilds(const ProjectExplorer::Target *parent) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canCreate(parent), return result); const Utils::FileName buildDirectory = QbsProject::defaultBuildDirectory(parent->project()->projectFilePath()); @@ -273,16 +272,15 @@ QList<ProjectExplorer::BuildInfo *> QbsBuildConfigurationFactory::availableBuild return result; } -bool QbsBuildConfigurationFactory::canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const +int QbsBuildConfigurationFactory::priority(const ProjectExplorer::Kit *k, const QString &projectPath) const { - return k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) - .matchesType(QLatin1String(Constants::MIME_TYPE)); + return (k && Core::ICore::findByFile(QFileInfo(projectPath)) + .matchesType(QLatin1String(Constants::MIME_TYPE))) ? 0 : -1; } QList<ProjectExplorer::BuildInfo *> QbsBuildConfigurationFactory::availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canSetup(k, projectPath), return result); const Utils::FileName buildDirectory = QbsProject::defaultBuildDirectory(projectPath); @@ -302,7 +300,6 @@ QList<ProjectExplorer::BuildInfo *> QbsBuildConfigurationFactory::availableSetup ProjectExplorer::BuildConfiguration *QbsBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const ProjectExplorer::BuildInfo *info) const { - QTC_ASSERT(canCreate(parent), return 0); QTC_ASSERT(info->factory() == this, return 0); QTC_ASSERT(info->kitId == parent->kit()->id(), return 0); QTC_ASSERT(!info->displayName.isEmpty(), return 0); diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h index 61bde2f9c3393b057342f0262a8d418f13af9c45..14c1efbbe1515bd11e0848d396455a724554fc40 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h @@ -112,9 +112,9 @@ public: explicit QbsBuildConfigurationFactory(QObject *parent = 0); ~QbsBuildConfigurationFactory(); - bool canCreate(const ProjectExplorer::Target *parent) const; + int priority(const ProjectExplorer::Target *parent) const; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const; - bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const; + int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const; ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp index 4b683b251762494bc1dbfbc9f8f5a3dec3c0b047..6e8b302dffbea72c9339d862ab3de8a4b721b453 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.cpp @@ -569,16 +569,14 @@ QmakeBuildInfo *Qt4BuildConfigurationFactory::createBuildInfo(const Kit *k, return info; } -bool Qt4BuildConfigurationFactory::canCreate(const Target *parent) const +int Qt4BuildConfigurationFactory::priority(const Target *parent) const { - return canHandle(parent); + return canHandle(parent) ? 0 : -1; } QList<BuildInfo *> Qt4BuildConfigurationFactory::availableBuilds(const Target *parent) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canCreate(parent), return result); - QmakeBuildInfo *info = createBuildInfo(parent->kit(), parent->project()->projectFilePath(), BuildConfiguration::Debug); info->displayName.clear(); // ask for a name @@ -588,18 +586,15 @@ QList<BuildInfo *> Qt4BuildConfigurationFactory::availableBuilds(const Target *p return result; } -bool Qt4BuildConfigurationFactory::canSetup(const Kit *k, const QString &projectPath) const +int Qt4BuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const { - return k && QtSupport::QtKitInformation::qtVersion(k) - && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) - .matchesType(QLatin1String(Constants::PROFILE_MIMETYPE)); + return (k && Core::MimeDatabase::findByFile(QFileInfo(projectPath)) + .matchesType(QLatin1String(Constants::PROFILE_MIMETYPE))) ? 0 : -1; } QList<BuildInfo *> Qt4BuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { QList<ProjectExplorer::BuildInfo *> result; - QTC_ASSERT(canSetup(k, projectPath), return result); - result << createBuildInfo(k, projectPath, ProjectExplorer::BuildConfiguration::Debug); result << createBuildInfo(k, projectPath, ProjectExplorer::BuildConfiguration::Release); @@ -608,7 +603,6 @@ QList<BuildInfo *> Qt4BuildConfigurationFactory::availableSetups(const Kit *k, c BuildConfiguration *Qt4BuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const { - QTC_ASSERT(canCreate(parent), return 0); QTC_ASSERT(info->factory() == this, return 0); QTC_ASSERT(info->kitId == parent->kit()->id(), return 0); QTC_ASSERT(!info->displayName.isEmpty(), return 0); diff --git a/src/plugins/qt4projectmanager/qt4buildconfiguration.h b/src/plugins/qt4projectmanager/qt4buildconfiguration.h index a78d47d15d91a2fca7e76fa4ccca390b9169c6b6..17e519b530c3af9097fb64e4226bb67de4287d0c 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4buildconfiguration.h @@ -163,9 +163,9 @@ public: explicit Qt4BuildConfigurationFactory(QObject *parent = 0); ~Qt4BuildConfigurationFactory(); - bool canCreate(const ProjectExplorer::Target *parent) const; + int priority(const ProjectExplorer::Target *parent) const; QList<ProjectExplorer::BuildInfo *> availableBuilds(const ProjectExplorer::Target *parent) const; - bool canSetup(const ProjectExplorer::Kit *k, const QString &projectPath) const; + int priority(const ProjectExplorer::Kit *k, const QString &projectPath) const; QList<ProjectExplorer::BuildInfo *> availableSetups(const ProjectExplorer::Kit *k, const QString &projectPath) const; ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent,