RunConfigurationFactories: Fix crash opening non-qmake based projects

Make sure the Qnx RCs only get triggered for qmake-based projects and defend
against broken set-ups using QTC_ASSERT.

Task-number: QTCREATORBUG-19755
Change-Id: If64b73de49b0199308f767151d68909dc8b1bc53
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Tobias Hunger
2018-03-07 10:35:08 +01:00
parent 23e48fe207
commit 6e419d642a
7 changed files with 20 additions and 9 deletions

View File

@@ -241,7 +241,8 @@ CMakeRunConfigurationFactory::CMakeRunConfigurationFactory(QObject *parent) :
QList<BuildTargetInfo> QList<BuildTargetInfo>
CMakeRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode) const CMakeRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode) const
{ {
CMakeProject *project = static_cast<CMakeProject *>(parent->project()); CMakeProject *project = qobject_cast<CMakeProject *>(parent->project());
QTC_ASSERT(project, return {});
const QStringList titles = project->buildTargetTitles(true); const QStringList titles = project->buildTargetTitles(true);
return Utils::transform(titles, [project](const QString &title) { return Utils::transform(titles, [project](const QString &title) {
BuildTargetInfo bti; BuildTargetInfo bti;

View File

@@ -62,7 +62,8 @@ bool IosRunConfigurationFactory::canCreateHelper(Target *parent, const QString &
QList<BuildTargetInfo> QList<BuildTargetInfo>
IosRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const IosRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const
{ {
auto project = static_cast<QmakeProject *>(parent->project()); auto project = qobject_cast<QmakeProject *>(parent->project());
QTC_ASSERT(project, return {});
return project->buildTargets(mode, {ProjectType::ApplicationTemplate, return project->buildTargets(mode, {ProjectType::ApplicationTemplate,
ProjectType::SharedLibraryTemplate, ProjectType::SharedLibraryTemplate,
ProjectType::AuxTemplate}); ProjectType::AuxTemplate});

View File

@@ -388,7 +388,7 @@ QList<BuildTargetInfo> QbsRunConfigurationFactory::availableBuildTargets(Target
{ {
QList<qbs::ProductData> products; QList<qbs::ProductData> products;
QbsProject *project = static_cast<QbsProject *>(parent->project()); QbsProject *project = qobject_cast<QbsProject *>(parent->project());
if (!project || !project->qbsProject().isValid()) if (!project || !project->qbsProject().isValid())
return {}; return {};

View File

@@ -59,7 +59,8 @@ QmakeAndroidRunConfigurationFactory::QmakeAndroidRunConfigurationFactory(QObject
QList<BuildTargetInfo> QList<BuildTargetInfo>
QmakeAndroidRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const QmakeAndroidRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const
{ {
auto project = static_cast<QmakeProject *>(parent->project()); auto project = qobject_cast<QmakeProject *>(parent->project());
QTC_ASSERT(project, return {});
return project->buildTargets(mode, {ProjectType::ApplicationTemplate, ProjectType::SharedLibraryTemplate}); return project->buildTargets(mode, {ProjectType::ApplicationTemplate, ProjectType::SharedLibraryTemplate});
} }

View File

@@ -439,14 +439,16 @@ DesktopQmakeRunConfigurationFactory::DesktopQmakeRunConfigurationFactory(QObject
bool DesktopQmakeRunConfigurationFactory::canCreateHelper(Target *parent, const QString &buildTarget) const bool DesktopQmakeRunConfigurationFactory::canCreateHelper(Target *parent, const QString &buildTarget) const
{ {
QmakeProject *project = static_cast<QmakeProject *>(parent->project()); QmakeProject *project = qobject_cast<QmakeProject *>(parent->project());
QTC_ASSERT(project, return {});
return project->hasApplicationProFile(Utils::FileName::fromString(buildTarget)); return project->hasApplicationProFile(Utils::FileName::fromString(buildTarget));
} }
QList<BuildTargetInfo> QList<BuildTargetInfo>
DesktopQmakeRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const DesktopQmakeRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const
{ {
QmakeProject *project = static_cast<QmakeProject *>(parent->project()); QmakeProject *project = qobject_cast<QmakeProject *>(parent->project());
QTC_ASSERT(project, return {});
return project->buildTargets(mode); return project->buildTargets(mode);
} }

View File

@@ -32,6 +32,7 @@
#include <projectexplorer/kitinformation.h> #include <projectexplorer/kitinformation.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <qmakeprojectmanager/qmakeproject.h> #include <qmakeprojectmanager/qmakeproject.h>
#include <qmakeprojectmanager/qmakeprojectmanagerconstants.h>
using namespace ProjectExplorer; using namespace ProjectExplorer;
@@ -41,14 +42,17 @@ namespace Internal {
QnxRunConfigurationFactory::QnxRunConfigurationFactory(QObject *parent) : QnxRunConfigurationFactory::QnxRunConfigurationFactory(QObject *parent) :
ProjectExplorer::IRunConfigurationFactory(parent) ProjectExplorer::IRunConfigurationFactory(parent)
{ {
registerRunConfiguration<QnxRunConfiguration>(Constants::QNX_QNX_RUNCONFIGURATION_PREFIX); registerRunConfiguration<QnxRunConfiguration>(Qnx::Constants::QNX_QNX_RUNCONFIGURATION_PREFIX);
setSupportedTargetDeviceTypes({Constants::QNX_QNX_OS_TYPE}); setSupportedTargetDeviceTypes({Qnx::Constants::QNX_QNX_OS_TYPE});
addSupportedProjectType(QmakeProjectManager::Constants::QMAKEPROJECT_ID);
} }
QList<ProjectExplorer::BuildTargetInfo> QList<ProjectExplorer::BuildTargetInfo>
QnxRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const QnxRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const
{ {
auto project = qobject_cast<QmakeProjectManager::QmakeProject *>(parent->project()); auto project = qobject_cast<QmakeProjectManager::QmakeProject *>(parent->project());
QTC_ASSERT(project, return {});
const QList<BuildTargetInfo> buildTargets = project->buildTargets(mode); const QList<BuildTargetInfo> buildTargets = project->buildTargets(mode);
return Utils::transform(buildTargets, [](BuildTargetInfo bti) { return Utils::transform(buildTargets, [](BuildTargetInfo bti) {
bti.displayName = tr("%1 on QNX Device").arg(QFileInfo(bti.targetName).completeBaseName()); bti.displayName = tr("%1 on QNX Device").arg(QFileInfo(bti.targetName).completeBaseName());
@@ -60,6 +64,7 @@ bool QnxRunConfigurationFactory::canCreateHelper(ProjectExplorer::Target *parent
const QString &buildTarget) const const QString &buildTarget) const
{ {
auto project = qobject_cast<QmakeProjectManager::QmakeProject *>(parent->project()); auto project = qobject_cast<QmakeProjectManager::QmakeProject *>(parent->project());
QTC_ASSERT(project, return false);
return project->hasApplicationProFile(Utils::FileName::fromString(buildTarget)); return project->hasApplicationProFile(Utils::FileName::fromString(buildTarget));
} }

View File

@@ -53,7 +53,8 @@ WinRtRunConfigurationFactory::WinRtRunConfigurationFactory()
QList<BuildTargetInfo> QList<BuildTargetInfo>
WinRtRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const WinRtRunConfigurationFactory::availableBuildTargets(Target *parent, CreationMode mode) const
{ {
QmakeProject *project = static_cast<QmakeProject *>(parent->project()); QmakeProject *project = qobject_cast<QmakeProject *>(parent->project());
QTC_ASSERT(project, return {});
const QList<BuildTargetInfo> buildTargets = project->buildTargets(mode); const QList<BuildTargetInfo> buildTargets = project->buildTargets(mode);
return Utils::transform(buildTargets, [](BuildTargetInfo bti) { return Utils::transform(buildTargets, [](BuildTargetInfo bti) {
bti.displayName = tr("Run App Package"); bti.displayName = tr("Run App Package");