aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@qt.io>2018-02-12 12:49:22 +0100
committerTobias Hunger <tobias.hunger@qt.io>2018-02-13 08:46:35 +0000
commit3874b6b6ece1904a6e2a5e2c920a59a399a64454 (patch)
treed1c4fd551d80fd2ffd6fd2c55989f3a7620c9922
parentd5c449575e47d846a3d7bc62719267a33779c49e (diff)
KitInformation: Improve robustness to nullptr passed as kit
All the KitInformation methods need to gracefully handle a kit that is a nullptr. Ensure this is indeed the case. This might fix the actual trigger for QTCREATORBUG-19469. Change-Id: Id78ac8a26c1be908f41a425ff1935b86888e4b8b Reviewed-by: hjk <hjk@qt.io>
-rw-r--r--src/plugins/android/androidgdbserverkitinformation.cpp4
-rw-r--r--src/plugins/cmakeprojectmanager/cmakekitinformation.cpp12
-rw-r--r--src/plugins/debugger/debuggerkitinformation.cpp8
-rw-r--r--src/plugins/projectexplorer/kitinformation.cpp54
-rw-r--r--src/plugins/qbsprojectmanager/qbskitinformation.cpp4
-rw-r--r--src/plugins/qmakeprojectmanager/qmakekitinformation.cpp2
-rw-r--r--src/plugins/qtsupport/qtkitinformation.cpp7
7 files changed, 68 insertions, 23 deletions
diff --git a/src/plugins/android/androidgdbserverkitinformation.cpp b/src/plugins/android/androidgdbserverkitinformation.cpp
index cb0ad4d401..d4a7e17d85 100644
--- a/src/plugins/android/androidgdbserverkitinformation.cpp
+++ b/src/plugins/android/androidgdbserverkitinformation.cpp
@@ -29,6 +29,7 @@
#include <utils/pathchooser.h>
#include <utils/elidinglabel.h>
+#include <utils/qtcassert.h>
#include <QDialogButtonBox>
#include <QLabel>
@@ -73,6 +74,7 @@ KitInformation::ItemList AndroidGdbServerKitInformation::toUserOutput(const Kit
KitConfigWidget *AndroidGdbServerKitInformation::createConfigWidget(Kit *kit) const
{
+ QTC_ASSERT(kit, return nullptr);
return new AndroidGdbServerKitInformationWidget(kit, this);
}
@@ -94,11 +96,13 @@ bool AndroidGdbServerKitInformation::isAndroidKit(const Kit *kit)
FileName AndroidGdbServerKitInformation::gdbServer(const Kit *kit)
{
+ QTC_ASSERT(kit, return FileName());
return FileName::fromString(kit->value(AndroidGdbServerKitInformation::id()).toString());
}
void AndroidGdbServerKitInformation::setGdbSever(Kit *kit, const FileName &gdbServerCommand)
{
+ QTC_ASSERT(kit, return);
kit->setValue(AndroidGdbServerKitInformation::id(), gdbServerCommand.toString());
}
diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp
index b59fb5e235..7a8d22ac28 100644
--- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp
@@ -86,7 +86,7 @@ Core::Id CMakeKitInformation::id()
CMakeTool *CMakeKitInformation::cmakeTool(const Kit *k)
{
if (!k)
- return 0;
+ return nullptr;
const QVariant id = k->value(TOOL_ID);
return CMakeToolManager::findById(Core::Id::fromSetting(id));
@@ -142,11 +142,13 @@ KitInformation::ItemList CMakeKitInformation::toUserOutput(const Kit *k) const
KitConfigWidget *CMakeKitInformation::createConfigWidget(Kit *k) const
{
+ QTC_ASSERT(k, return nullptr);
return new Internal::CMakeKitConfigWidget(k, this);
}
void CMakeKitInformation::addToMacroExpander(Kit *k, Utils::MacroExpander *expander) const
{
+ QTC_ASSERT(k, return);
expander->registerFileVariables("CMake:Executable", tr("Path to the cmake executable"),
[k]() -> QString {
CMakeTool *tool = CMakeKitInformation::cmakeTool(k);
@@ -304,6 +306,8 @@ QStringList CMakeGeneratorKitInformation::generatorArguments(const Kit *k)
QVariant CMakeGeneratorKitInformation::defaultValue(const Kit *k) const
{
+ QTC_ASSERT(k, return QVariant());
+
CMakeTool *tool = CMakeKitInformation::cmakeTool(k);
if (!tool)
return QVariant();
@@ -426,6 +430,8 @@ void CMakeGeneratorKitInformation::fix(Kit *k)
void CMakeGeneratorKitInformation::upgrade(Kit *k)
{
+ QTC_ASSERT(k, return);
+
const QVariant value = k->value(GENERATOR_ID);
if (value.type() != QVariant::Map) {
GeneratorInfo info;
@@ -545,6 +551,8 @@ QVariant CMakeConfigurationKitInformation::defaultValue(const Kit *k) const
QList<Task> CMakeConfigurationKitInformation::validate(const Kit *k) const
{
+ QTC_ASSERT(k, return QList<Task>());
+
const QtSupport::BaseQtVersion *const version = QtSupport::QtKitInformation::qtVersion(k);
const ToolChain *const tcC = ToolChainKitInformation::toolChain(k, ProjectExplorer::Constants::C_LANGUAGE_ID);
const ToolChain *const tcCxx = ToolChainKitInformation::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID);
@@ -659,7 +667,7 @@ KitInformation::ItemList CMakeConfigurationKitInformation::toUserOutput(const Ki
KitConfigWidget *CMakeConfigurationKitInformation::createConfigWidget(Kit *k) const
{
if (!k)
- return 0;
+ return nullptr;
return new Internal::CMakeConfigurationKitConfigWidget(k, this);
}
diff --git a/src/plugins/debugger/debuggerkitinformation.cpp b/src/plugins/debugger/debuggerkitinformation.cpp
index d1a4e84b10..5bdd0272d4 100644
--- a/src/plugins/debugger/debuggerkitinformation.cpp
+++ b/src/plugins/debugger/debuggerkitinformation.cpp
@@ -77,6 +77,8 @@ QVariant DebuggerKitInformation::defaultValue(const Kit *k) const
void DebuggerKitInformation::setup(Kit *k)
{
+ QTC_ASSERT(k, return);
+
// This can be anything (Id, binary path, "auto")
// With 3.0 we have:
// <value type="QString" key="Debugger.Information">{75ecf347-f221-44c3-b613-ea1d29929cd4}</value>
@@ -158,6 +160,8 @@ void DebuggerKitInformation::setup(Kit *k)
// This handles the upgrade path from 2.8 to 3.0
void DebuggerKitInformation::fix(Kit *k)
{
+ QTC_ASSERT(k, return);
+
// This can be Id, binary path, but not "auto" anymore.
const QVariant rawId = k->value(DebuggerKitInformation::id());
@@ -238,7 +242,7 @@ DebuggerKitInformation::ConfigurationErrors DebuggerKitInformation::configuratio
const DebuggerItem *DebuggerKitInformation::debugger(const Kit *kit)
{
- QTC_ASSERT(kit, return 0);
+ QTC_ASSERT(kit, return nullptr);
const QVariant id = kit->value(DebuggerKitInformation::id());
return DebuggerItemManager::findById(id);
}
@@ -299,6 +303,7 @@ KitConfigWidget *DebuggerKitInformation::createConfigWidget(Kit *k) const
void DebuggerKitInformation::addToMacroExpander(Kit *kit, MacroExpander *expander) const
{
+ QTC_ASSERT(kit, return);
expander->registerVariable("Debugger:Name", tr("Name of Debugger"),
[kit]() -> QString {
const DebuggerItem *item = debugger(kit);
@@ -353,6 +358,7 @@ void DebuggerKitInformation::setDebugger(Kit *k, const QVariant &id)
{
// Only register reasonably complete debuggers.
QTC_ASSERT(DebuggerItemManager::findById(id), return);
+ QTC_ASSERT(k, return);
k->setValue(DebuggerKitInformation::id(), id);
}
diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp
index 195fa66293..e34c4d1359 100644
--- a/src/plugins/projectexplorer/kitinformation.cpp
+++ b/src/plugins/projectexplorer/kitinformation.cpp
@@ -93,6 +93,8 @@ QList<Task> SysRootKitInformation::validate(const Kit *k) const
KitConfigWidget *SysRootKitInformation::createConfigWidget(Kit *k) const
{
+ QTC_ASSERT(k, return nullptr);
+
return new Internal::SysRootInformationConfigWidget(k, this);
}
@@ -103,6 +105,8 @@ KitInformation::ItemList SysRootKitInformation::toUserOutput(const Kit *k) const
void SysRootKitInformation::addToMacroExpander(Kit *kit, Utils::MacroExpander *expander) const
{
+ QTC_ASSERT(kit, return);
+
expander->registerFileVariables("SysRoot", tr("Sys Root"), [kit]() -> QString {
return SysRootKitInformation::sysRoot(kit).toString();
});
@@ -202,6 +206,8 @@ QList<Task> ToolChainKitInformation::validate(const Kit *k) const
void ToolChainKitInformation::upgrade(Kit *k)
{
+ QTC_ASSERT(k, return);
+
const Core::Id oldIdV1 = KITINFORMATION_ID_V1;
const Core::Id oldIdV2 = KITINFORMATION_ID_V2;
@@ -285,6 +291,8 @@ static Core::Id findLanguage(const QString &ls)
void ToolChainKitInformation::setup(Kit *k)
{
QTC_ASSERT(ToolChainManager::isLoaded(), return);
+ QTC_ASSERT(k, return);
+
const QVariantMap value = k->value(ToolChainKitInformation::id()).toMap();
for (auto i = value.constBegin(); i != value.constEnd(); ++i) {
@@ -312,6 +320,7 @@ void ToolChainKitInformation::setup(Kit *k)
KitConfigWidget *ToolChainKitInformation::createConfigWidget(Kit *k) const
{
+ QTC_ASSERT(k, return nullptr);
return new Internal::ToolChainInformationConfigWidget(k, this);
}
@@ -336,6 +345,8 @@ void ToolChainKitInformation::addToEnvironment(const Kit *k, Utils::Environment
void ToolChainKitInformation::addToMacroExpander(Kit *kit, Utils::MacroExpander *expander) const
{
+ QTC_ASSERT(kit, return);
+
// Compatibility with Qt Creator < 4.2:
expander->registerVariable("Compiler:Name", tr("Compiler"),
[kit]() -> QString {
@@ -365,9 +376,7 @@ void ToolChainKitInformation::addToMacroExpander(Kit *kit, Utils::MacroExpander
IOutputParser *ToolChainKitInformation::createOutputParser(const Kit *k) const
{
ToolChain *tc = toolChain(k, Constants::CXX_LANGUAGE_ID);
- if (tc)
- return tc->outputParser();
- return 0;
+ return tc ? tc->outputParser() : nullptr;
}
QSet<Core::Id> ToolChainKitInformation::availableFeatures(const Kit *k) const
@@ -385,9 +394,9 @@ Core::Id ToolChainKitInformation::id()
ToolChain *ToolChainKitInformation::toolChain(const Kit *k, Core::Id language)
{
- QTC_ASSERT(ToolChainManager::isLoaded(), return 0);
+ QTC_ASSERT(ToolChainManager::isLoaded(), return nullptr);
if (!k)
- return 0;
+ return nullptr;
QVariantMap value = k->value(ToolChainKitInformation::id()).toMap();
const QByteArray id = value.value(language.toString(), QByteArray()).toByteArray();
return ToolChainManager::findToolChain(id);
@@ -395,6 +404,8 @@ ToolChain *ToolChainKitInformation::toolChain(const Kit *k, Core::Id language)
QList<ToolChain *> ToolChainKitInformation::toolChains(const Kit *k)
{
+ QTC_ASSERT(k, return QList<ToolChain *>());
+
const QVariantMap value = k->value(ToolChainKitInformation::id()).toMap();
const QList<ToolChain *> tcList
= Utils::transform(ToolChainManager::allLanguages().toList(),
@@ -407,6 +418,7 @@ QList<ToolChain *> ToolChainKitInformation::toolChains(const Kit *k)
void ToolChainKitInformation::setToolChain(Kit *k, ToolChain *tc)
{
QTC_ASSERT(tc, return);
+ QTC_ASSERT(k, return);
QVariantMap result = k->value(ToolChainKitInformation::id()).toMap();
result.insert(tc->language().toString(), tc->id());
@@ -426,6 +438,7 @@ void ToolChainKitInformation::setToolChain(Kit *k, ToolChain *tc)
void ToolChainKitInformation::setAllToolChainsToMatch(Kit *k, ToolChain *tc)
{
QTC_ASSERT(tc, return);
+ QTC_ASSERT(k, return);
const QList<ToolChain *> allTcList = ToolChainManager::toolChains();
QTC_ASSERT(allTcList.contains(tc), return);
@@ -464,6 +477,7 @@ void ToolChainKitInformation::setAllToolChainsToMatch(Kit *k, ToolChain *tc)
void ToolChainKitInformation::clearToolChain(Kit *k, Core::Id language)
{
QTC_ASSERT(language.isValid(), return);
+ QTC_ASSERT(k, return);
QVariantMap result = k->value(ToolChainKitInformation::id()).toMap();
result.insert(language.toString(), QByteArray());
@@ -557,11 +571,13 @@ QList<Task> DeviceTypeKitInformation::validate(const Kit *k) const
KitConfigWidget *DeviceTypeKitInformation::createConfigWidget(Kit *k) const
{
+ QTC_ASSERT(k, return nullptr);
return new Internal::DeviceTypeInformationConfigWidget(k, this);
}
KitInformation::ItemList DeviceTypeKitInformation::toUserOutput(const Kit *k) const
{
+ QTC_ASSERT(k, return {});
Core::Id type = deviceTypeId(k);
QString typeDisplayName = tr("Unknown device type");
if (type.isValid()) {
@@ -588,6 +604,7 @@ const Core::Id DeviceTypeKitInformation::deviceTypeId(const Kit *k)
void DeviceTypeKitInformation::setDeviceTypeId(Kit *k, Core::Id type)
{
+ QTC_ASSERT(k, return);
k->setValue(DeviceTypeKitInformation::id(), type.toSetting());
}
@@ -676,6 +693,7 @@ void DeviceKitInformation::setup(Kit *k)
KitConfigWidget *DeviceKitInformation::createConfigWidget(Kit *k) const
{
+ QTC_ASSERT(k, return nullptr);
return new Internal::DeviceInformationConfigWidget(k, this);
}
@@ -693,6 +711,7 @@ KitInformation::ItemList DeviceKitInformation::toUserOutput(const Kit *k) const
void DeviceKitInformation::addToMacroExpander(Kit *kit, Utils::MacroExpander *expander) const
{
+ QTC_ASSERT(kit, return);
expander->registerVariable("Device:HostAddress", tr("Host address"),
[kit]() -> QString {
const IDevice::ConstPtr device = DeviceKitInformation::device(kit);
@@ -743,6 +762,7 @@ void DeviceKitInformation::setDevice(Kit *k, IDevice::ConstPtr dev)
void DeviceKitInformation::setDeviceId(Kit *k, Core::Id id)
{
+ QTC_ASSERT(k, return);
k->setValue(DeviceKitInformation::id(), id.toSetting());
}
@@ -802,6 +822,8 @@ QVariant EnvironmentKitInformation::defaultValue(const Kit *k) const
QList<Task> EnvironmentKitInformation::validate(const Kit *k) const
{
QList<Task> result;
+ QTC_ASSERT(k, return result);
+
const QVariant variant = k->value(EnvironmentKitInformation::id());
if (!variant.isNull() && !variant.canConvert(QVariant::List)) {
result.append(Task(Task::Error, tr("The environment setting value is invalid."),
@@ -812,6 +834,8 @@ QList<Task> EnvironmentKitInformation::validate(const Kit *k) const
void EnvironmentKitInformation::fix(Kit *k)
{
+ QTC_ASSERT(k, return);
+
const QVariant variant = k->value(EnvironmentKitInformation::id());
if (!variant.isNull() && !variant.canConvert(QVariant::List)) {
qWarning("Kit \"%s\" has a wrong environment value set.", qPrintable(k->displayName()));
@@ -821,28 +845,22 @@ void EnvironmentKitInformation::fix(Kit *k)
void EnvironmentKitInformation::addToEnvironment(const Kit *k, Utils::Environment &env) const
{
- const QVariant envValue = k->value(EnvironmentKitInformation::id());
- if (envValue.isValid()) {
- const QStringList values = Utils::transform(envValue.toStringList(), [k](const QString &v) {
- return k->macroExpander()->expand(v);
- });
- env.modify(Utils::EnvironmentItem::fromStringList(values));
- }
+ const QStringList values
+ = Utils::transform(Utils::EnvironmentItem::toStringList(environmentChanges(k)),
+ [k](const QString &v) { return k->macroExpander()->expand(v); });
+ env.modify(Utils::EnvironmentItem::fromStringList(values));
}
KitConfigWidget *EnvironmentKitInformation::createConfigWidget(Kit *k) const
{
+ QTC_ASSERT(k, return nullptr);
return new Internal::KitEnvironmentConfigWidget(k, this);
}
KitInformation::ItemList EnvironmentKitInformation::toUserOutput(const Kit *k) const
{
- ItemList retVal;
- QVariant envValue = k->value(EnvironmentKitInformation::id());
- if (envValue.isValid())
- retVal << qMakePair(QLatin1Literal("Environment"), envValue.toStringList().join(QLatin1Literal("<br>")));
-
- return retVal;
+ return { qMakePair(tr("Environment"),
+ Utils::EnvironmentItem::toStringList(environmentChanges(k)).join("<br>")) };
}
Core::Id EnvironmentKitInformation::id()
diff --git a/src/plugins/qbsprojectmanager/qbskitinformation.cpp b/src/plugins/qbsprojectmanager/qbskitinformation.cpp
index b949d9325d..7cdf47d32e 100644
--- a/src/plugins/qbsprojectmanager/qbskitinformation.cpp
+++ b/src/plugins/qbsprojectmanager/qbskitinformation.cpp
@@ -30,6 +30,8 @@
#include <projectexplorer/kitconfigwidget.h>
#include <projectexplorer/kitmanager.h>
+#include <utils/qtcassert.h>
+
#include <qbs.h>
#include <QLabel>
@@ -89,11 +91,13 @@ QString QbsKitInformation::representation(const Kit *kit)
QVariantMap QbsKitInformation::properties(const Kit *kit)
{
+ QTC_ASSERT(kit, return QVariantMap());
return kit->value(id()).toMap();
}
void QbsKitInformation::setProperties(Kit *kit, const QVariantMap &properties)
{
+ QTC_ASSERT(kit, return);
kit->setValue(id(), properties);
}
diff --git a/src/plugins/qmakeprojectmanager/qmakekitinformation.cpp b/src/plugins/qmakeprojectmanager/qmakekitinformation.cpp
index 57550e2e52..4946c2e8ed 100644
--- a/src/plugins/qmakeprojectmanager/qmakekitinformation.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakekitinformation.cpp
@@ -34,6 +34,7 @@
#include <qtsupport/qtkitinformation.h>
#include <utils/algorithm.h>
+#include <utils/qtcassert.h>
using namespace ProjectExplorer;
using namespace Utils;
@@ -143,6 +144,7 @@ FileName QmakeKitInformation::effectiveMkspec(const Kit *k)
void QmakeKitInformation::setMkspec(Kit *k, const FileName &fn)
{
+ QTC_ASSERT(k, return);
k->setValue(QmakeKitInformation::id(), fn == defaultMkspec(k) ? QString() : fn.toString());
}
diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp
index 3437ed7116..1653b48a16 100644
--- a/src/plugins/qtsupport/qtkitinformation.cpp
+++ b/src/plugins/qtsupport/qtkitinformation.cpp
@@ -93,6 +93,7 @@ void QtKitInformation::fix(ProjectExplorer::Kit *k)
ProjectExplorer::KitConfigWidget *QtKitInformation::createConfigWidget(ProjectExplorer::Kit *k) const
{
+ QTC_ASSERT(k, return nullptr);
return new Internal::QtKitConfigWidget(k, this);
}
@@ -120,15 +121,16 @@ ProjectExplorer::IOutputParser *QtKitInformation::createOutputParser(const Proje
{
if (qtVersion(k))
return new QtParser;
- return 0;
+ return nullptr;
}
void QtKitInformation::addToMacroExpander(Kit *kit, MacroExpander *expander) const
{
+ QTC_ASSERT(kit, return);
expander->registerSubProvider(
[kit]() -> MacroExpander * {
BaseQtVersion *version = qtVersion(kit);
- return version ? version->macroExpander() : 0;
+ return version ? version->macroExpander() : nullptr;
});
expander->registerVariable("Qt:Name", tr("Name of Qt Version"),
@@ -171,6 +173,7 @@ int QtKitInformation::qtVersionId(const ProjectExplorer::Kit *k)
void QtKitInformation::setQtVersionId(ProjectExplorer::Kit *k, const int id)
{
+ QTC_ASSERT(k, return);
k->setValue(QtKitInformation::id(), id);
}