diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2018-02-12 12:49:22 +0100 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2018-02-13 08:46:35 +0000 |
commit | 3874b6b6ece1904a6e2a5e2c920a59a399a64454 (patch) | |
tree | d1c4fd551d80fd2ffd6fd2c55989f3a7620c9922 /src/plugins | |
parent | d5c449575e47d846a3d7bc62719267a33779c49e (diff) | |
download | qt-creator-3874b6b6ece1904a6e2a5e2c920a59a399a64454.tar.gz |
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>
Diffstat (limited to 'src/plugins')
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); } |