diff options
author | Tim Jenssen <tim.jenssen@qt.io> | 2017-10-19 07:43:05 +0200 |
---|---|---|
committer | Tim Jenssen <tim.jenssen@qt.io> | 2017-10-26 11:32:03 +0000 |
commit | 2f3acee4e0e3a3a8aac173047635500c54842fef (patch) | |
tree | 333603a3bfc2fa4da614d2c27480ae12e7215efb /src/plugins/projectexplorer/jsonwizard | |
parent | 2382824d7bbd28256d9f01bacfd17f456aaacbcb (diff) |
Wizards: add a warning about unsupported keys
- parseData methods check that there is no unknown key is used
- showing the name and type might be useful in warning and error messages
Change-Id: I1371bb3af1ad48ed4b85260f3b1309cdba1cb71f
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src/plugins/projectexplorer/jsonwizard')
3 files changed, 121 insertions, 57 deletions
diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp index bb625cf889..6cf29aaff8 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp @@ -61,6 +61,31 @@ const char DATA_KEY[] = "data"; const char IS_COMPLETE_KEY[] = "isComplete"; const char IS_COMPLETE_MESSAGE_KEY[] = "trIncompleteMessage"; +namespace { +QVariant consumeValue(QVariantMap &map, const QString &key, const QVariant &defaultValue = QVariant()) +{ + QVariantMap::iterator i = map.find(key); + if (i != map.end()) { + QVariant value = i.value(); + map.erase(i); + return value; + } + return defaultValue; +} + +void warnAboutUnsupportedKeys(const QVariantMap &map, const QString &name, const QString &type = QString()) +{ + if (!map.isEmpty()) { + + QString typeAndName = name; + if (!type.isEmpty() && !name.isEmpty()) + typeAndName = QString("%1(\"%2\")").arg(type, name); + + qWarning().noquote() << QString("Field %1 has unsupported keys: %2").arg(typeAndName, map.keys().join(", ")); + } +} +} // namespace + namespace ProjectExplorer { // -------------------------------------------------------------------- @@ -120,6 +145,11 @@ JsonFieldPage::Field::~Field() delete d; } +QString JsonFieldPage::Field::type() +{ + return d->m_type; +} + JsonFieldPage::Field *JsonFieldPage::Field::parse(const QVariant &input, QString *errorMessage) { if (input.type() != QVariant::Map) { @@ -129,13 +159,13 @@ JsonFieldPage::Field *JsonFieldPage::Field::parse(const QVariant &input, QString } QVariantMap tmp = input.toMap(); - const QString name = tmp.value(NAME_KEY).toString(); + const QString name = consumeValue(tmp, NAME_KEY).toString(); if (name.isEmpty()) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", "Field has no name."); return 0; } - const QString type = tmp.value(TYPE_KEY).toString(); + const QString type = consumeValue(tmp, TYPE_KEY).toString(); if (type.isEmpty()) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", "Field \"%1\" has no type.").arg(name); @@ -150,17 +180,17 @@ JsonFieldPage::Field *JsonFieldPage::Field::parse(const QVariant &input, QString return 0; } data->setTexts(name, - JsonWizardFactory::localizedString(tmp.value(DISPLAY_NAME_KEY).toString()), - tmp.value(TOOLTIP_KEY).toString()); + JsonWizardFactory::localizedString(consumeValue(tmp, DISPLAY_NAME_KEY).toString()), + consumeValue(tmp, TOOLTIP_KEY).toString()); - data->setVisibleExpression(tmp.value(VISIBLE_KEY, true)); - data->setEnabledExpression(tmp.value(ENABLED_KEY, true)); - data->setIsMandatory(tmp.value(MANDATORY_KEY, true).toBool()); - data->setHasSpan(tmp.value(SPAN_KEY, false).toBool()); - data->setIsCompleteExpando(tmp.value(IS_COMPLETE_KEY, true), - tmp.value(IS_COMPLETE_MESSAGE_KEY).toString()); + data->setVisibleExpression(consumeValue(tmp, VISIBLE_KEY, true)); + data->setEnabledExpression(consumeValue(tmp, ENABLED_KEY, true)); + data->setIsMandatory(consumeValue(tmp, MANDATORY_KEY, true).toBool()); + data->setHasSpan(consumeValue(tmp, SPAN_KEY, false).toBool()); + data->setIsCompleteExpando(consumeValue(tmp, IS_COMPLETE_KEY, true), + consumeValue(tmp, IS_COMPLETE_MESSAGE_KEY).toString()); - QVariant dataVal = tmp.value(DATA_KEY); + QVariant dataVal = consumeValue(tmp, DATA_KEY); if (!data->parseData(dataVal, errorMessage)) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", "When parsing Field \"%1\": %2") @@ -169,6 +199,7 @@ JsonFieldPage::Field *JsonFieldPage::Field::parse(const QVariant &input, QString return 0; } + warnAboutUnsupportedKeys(tmp, name); return data; } @@ -217,6 +248,11 @@ void JsonFieldPage::Field::setVisible(bool v) d->m_widget->setVisible(v); } +void JsonFieldPage::Field::setType(const QString &type) +{ + d->m_type = type; +} + bool JsonFieldPage::Field::validate(MacroExpander *expander, QString *message) { if (!JsonWizard::boolFromVariant(d->m_isCompleteExpando, expander)) { @@ -322,21 +358,23 @@ bool LabelField::parseData(const QVariant &data, QString *errorMessage) { if (data.type() != QVariant::Map) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "Label data is not an object."); + "Label(\"%1\") data is not an object.") + .arg(name()); return false; } QVariantMap tmp = data.toMap(); - m_wordWrap = tmp.value("wordWrap", false).toBool(); - m_text = JsonWizardFactory::localizedString(tmp.value("trText")); + m_wordWrap = consumeValue(tmp, "wordWrap", false).toBool(); + m_text = JsonWizardFactory::localizedString(consumeValue(tmp, "trText")); if (m_text.isEmpty()) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "No text given for Label."); + "Label(\"%1\") has no trText.") + .arg(name()); return false; } - + warnAboutUnsupportedKeys(tmp, name(), type()); return true; } @@ -361,20 +399,23 @@ bool SpacerField::parseData(const QVariant &data, QString *errorMessage) if (data.type() != QVariant::Map) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "Spacer data is not an object."); + "Spacer(\"%1\") data is not an object.") + .arg(name()); return false; } QVariantMap tmp = data.toMap(); bool ok; - m_factor = tmp.value("factor", 1).toInt(&ok); + m_factor = consumeValue(tmp, "factor", 1).toInt(&ok); if (!ok) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "\"factor\" is no integer value."); + "Spacer(\"%1\") property \"factor\" is no integer value.") + .arg(name()); return false; } + warnAboutUnsupportedKeys(tmp, name(), type()); return true; } @@ -403,30 +444,33 @@ bool LineEditField::parseData(const QVariant &data, QString *errorMessage) if (data.type() != QVariant::Map) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "LineEdit data is not an object."); + "LineEdit(\"%1\") data is not an object.") + .arg(name()); return false; } QVariantMap tmp = data.toMap(); - m_isPassword = tmp.value("isPassword", false).toBool(); - m_defaultText = JsonWizardFactory::localizedString(tmp.value("trText").toString()); - m_disabledText = JsonWizardFactory::localizedString(tmp.value("trDisabledText").toString()); - m_placeholderText = JsonWizardFactory::localizedString(tmp.value("trPlaceholder").toString()); - m_historyId = tmp.value("historyId").toString(); - m_restoreLastHistoryItem = tmp.value("restoreLastHistoyItem", false).toBool(); - QString pattern = tmp.value("validator").toString(); + m_isPassword = consumeValue(tmp, "isPassword", false).toBool(); + m_defaultText = JsonWizardFactory::localizedString(consumeValue(tmp, "trText").toString()); + m_disabledText = JsonWizardFactory::localizedString(consumeValue(tmp, "trDisabledText").toString()); + m_placeholderText = JsonWizardFactory::localizedString(consumeValue(tmp, "trPlaceholder").toString()); + m_historyId = consumeValue(tmp, "historyId").toString(); + m_restoreLastHistoryItem = consumeValue(tmp, "restoreLastHistoyItem", false).toBool(); + QString pattern = consumeValue(tmp, "validator").toString(); if (!pattern.isEmpty()) { m_validatorRegExp = QRegularExpression(pattern); if (!m_validatorRegExp.isValid()) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "Invalid regular expression \"%1\" in \"validator\".") - .arg(pattern); + "LineEdit(\"%1\") has an invalid regular expression \"%1\" in \"validator\".") + .arg(name(), pattern); m_validatorRegExp = QRegularExpression(); return false; } } - m_fixupExpando = tmp.value("fixup").toString(); + m_fixupExpando = consumeValue(tmp, "fixup").toString(); + + warnAboutUnsupportedKeys(tmp, name(), type()); return true; } @@ -515,16 +559,18 @@ bool TextEditField::parseData(const QVariant &data, QString *errorMessage) if (data.type() != QVariant::Map) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "TextEdit data is not an object."); + "TextEdit(\"%1\") data is not an object.") + .arg(name()); return false; } QVariantMap tmp = data.toMap(); - m_defaultText = JsonWizardFactory::localizedString(tmp.value("trText").toString()); - m_disabledText = JsonWizardFactory::localizedString(tmp.value("trDisabledText").toString()); - m_acceptRichText = tmp.value("richText", true).toBool(); + m_defaultText = JsonWizardFactory::localizedString(consumeValue(tmp, "trText").toString()); + m_disabledText = JsonWizardFactory::localizedString(consumeValue(tmp, "trDisabledText").toString()); + m_acceptRichText = consumeValue(tmp, "richText", true).toBool(); + warnAboutUnsupportedKeys(tmp, name(), type()); return true; } @@ -589,11 +635,11 @@ bool PathChooserField::parseData(const QVariant &data, QString *errorMessage) QVariantMap tmp = data.toMap(); - m_path = tmp.value("path").toString(); - m_basePath = tmp.value("basePath").toString(); - m_historyId = tmp.value("historyId").toString(); + m_path = consumeValue(tmp, "path").toString(); + m_basePath = consumeValue(tmp, "basePath").toString(); + m_historyId = consumeValue(tmp, "historyId").toString(); - QString kindStr = tmp.value("kind", "existingDirectory").toString(); + QString kindStr = consumeValue(tmp, "kind", "existingDirectory").toString(); if (kindStr == "existingDirectory") { m_kind = PathChooser::ExistingDirectory; } else if (kindStr == "directory") { @@ -617,6 +663,7 @@ bool PathChooserField::parseData(const QVariant &data, QString *errorMessage) return false; } + warnAboutUnsupportedKeys(tmp, name(), type()); return true; } @@ -680,21 +727,24 @@ bool CheckBoxField::parseData(const QVariant &data, QString *errorMessage) if (data.type() != QVariant::Map) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "CheckBox data is not an object."); + "CheckBox(\"%1\") data is not an object.") + .arg(name()); return false; } QVariantMap tmp = data.toMap(); - m_checkedValue = tmp.value("checkedValue", true).toString(); - m_uncheckedValue = tmp.value("uncheckedValue", false).toString(); + m_checkedValue = consumeValue(tmp, "checkedValue", true).toString(); + m_uncheckedValue = consumeValue(tmp, "uncheckedValue", false).toString(); if (m_checkedValue == m_uncheckedValue) { *errorMessage= QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "CheckBox values for checked and unchecked state are identical."); + "CheckBox(\"%1\") values for checked and unchecked state are identical.") + .arg(name()); return false; } - m_checkedExpression = tmp.value("checked", false); + m_checkedExpression = consumeValue(tmp, "checked", false); + warnAboutUnsupportedKeys(tmp, name(), type()); return true; } @@ -763,9 +813,9 @@ ComboBoxItem parseComboBoxItem(const QVariant &item, QString *errorMessage) return ComboBoxItem(); } else if (item.type() == QVariant::Map) { QVariantMap tmp = item.toMap(); - QString key = JsonWizardFactory::localizedString(tmp.value(QLatin1String("trKey"), QString()).toString()); - QString value = tmp.value(QLatin1String("value"), QString()).toString(); - QVariant condition = tmp.value(QLatin1String("condition"), true); + QString key = JsonWizardFactory::localizedString(consumeValue(tmp, QLatin1String("trKey"), QString()).toString()); + QString value = consumeValue(tmp, QLatin1String("value"), QString()).toString(); + QVariant condition = consumeValue(tmp, QLatin1String("condition"), true); if (key.isNull() || key.isEmpty()) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", "No \"key\" found in ComboBox items."); @@ -791,28 +841,32 @@ bool ComboBoxField::parseData(const QVariant &data, QString *errorMessage) QVariantMap tmp = data.toMap(); bool ok; - m_index = tmp.value("index", 0).toInt(&ok); + m_index = consumeValue(tmp, "index", 0).toInt(&ok); if (!ok) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "ComboBox \"index\" is not an integer value."); + "ComboBox(\"%1\") \"index\" is not an integer value.") + .arg(name()); return false; } - m_disabledIndex = tmp.value("disabledIndex", -1).toInt(&ok); + m_disabledIndex = consumeValue(tmp, "disabledIndex", -1).toInt(&ok); if (!ok) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "ComboBox \"disabledIndex\" is not an integer value."); + "ComboBox(\"%1\") \"disabledIndex\" is not an integer value.") + .arg(name()); return false; } - QVariant value = tmp.value("items"); + QVariant value = consumeValue(tmp, "items"); if (value.isNull()) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "ComboBox \"items\" missing."); + "ComboBox(\"%1\") \"items\" missing.") + .arg(name()); return false; } if (value.type() != QVariant::List) { *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "ComboBox \"items\" is not a list."); + "ComboBox(\"%1\") \"items\" is not a list.") + .arg(name()); return false; } @@ -831,10 +885,11 @@ bool ComboBoxField::parseData(const QVariant &data, QString *errorMessage) m_itemDataList.clear(); m_itemList.clear(); *errorMessage = QCoreApplication::translate("ProjectExplorer::JsonFieldPage", - "Internal Error: ComboBox items lists got mixed up."); + "Internal Error: ComboBox(\"%1\") items lists got mixed up.") + .arg(name()); return false; } - + warnAboutUnsupportedKeys(tmp, name(), type()); return true; } @@ -1010,8 +1065,11 @@ MacroExpander *JsonFieldPage::expander() JsonFieldPage::Field *JsonFieldPage::createFieldData(const QString &type) { - if (auto factory = m_factories.value(type)) - return factory(); + if (auto factory = m_factories.value(type)) { + JsonFieldPage::Field *field = factory(); + field->setType(type); + return field; + } return nullptr; } diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h index f21d3a7d46..fb23876c76 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.h @@ -68,6 +68,8 @@ public: virtual void setEnabled(bool e); void setVisible(bool v); + void setType(const QString &type); + virtual bool validate(Utils::MacroExpander *expander, QString *message); void initialize(Utils::MacroExpander *expander); @@ -91,6 +93,8 @@ public: virtual void setup(JsonFieldPage *page, const QString &name) { Q_UNUSED(page); Q_UNUSED(name); } + QString type(); + private: void setTexts(const QString &n, const QString &dn, const QString &tt); void setIsMandatory(bool b); diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage_p.h b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage_p.h index 13cab66ccf..e7c2cf156c 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage_p.h +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage_p.h @@ -55,6 +55,8 @@ public: QLabel *m_label = nullptr; QWidget *m_widget = nullptr; + + QString m_type; }; // -------------------------------------------------------------------- |