diff options
Diffstat (limited to 'src/lib/corelib/api/projectdata.cpp')
-rw-r--r-- | src/lib/corelib/api/projectdata.cpp | 91 |
1 files changed, 66 insertions, 25 deletions
diff --git a/src/lib/corelib/api/projectdata.cpp b/src/lib/corelib/api/projectdata.cpp index 750186539..628fe2a5d 100644 --- a/src/lib/corelib/api/projectdata.cpp +++ b/src/lib/corelib/api/projectdata.cpp @@ -40,15 +40,16 @@ #include "projectdata_p.h" #include "propertymap_p.h" +#include <language/builtindeclarations.h> #include <language/language.h> #include <language/propertymapinternal.h> +#include <loader/loaderutils.h> #include <tools/fileinfo.h> #include <tools/jsliterals.h> #include <tools/qbsassert.h> #include <tools/qttools.h> #include <tools/stlutils.h> #include <tools/stringconstants.h> -#include <tools/stringconstants.h> #include <QtCore/qdir.h> #include <QtCore/qjsonarray.h> @@ -74,7 +75,7 @@ static QVariant getModuleProperty(const PropertyMap &properties, const QString & { const int lastDotIndex = fullPropertyName.lastIndexOf(QLatin1Char('.')); if (lastDotIndex == -1) - return QVariant(); + return {}; return properties.getModuleProperty(fullPropertyName.left(lastDotIndex), fullPropertyName.mid(lastDotIndex + 1)); } @@ -558,7 +559,7 @@ const QString &ProductData::name() const */ QString ProductData::fullDisplayName() const { - return ResolvedProduct::fullDisplayName(name(), multiplexConfigurationId()); + return fullProductDisplayName(name(), multiplexConfigurationId()); } /*! @@ -635,14 +636,14 @@ const QList<ArtifactData> ProductData::targetArtifacts() const const QList<ArtifactData> ProductData::installableArtifacts() const { QList<ArtifactData> artifacts; - for (const GroupData &g : qAsConst(d->groups)) { + for (const GroupData &g : std::as_const(d->groups)) { const auto sourceArtifacts = g.allSourceArtifacts(); for (const ArtifactData &a : sourceArtifacts) { if (a.installData().isInstallable()) artifacts << a; } } - for (const ArtifactData &a : qAsConst(d->generatedArtifacts)) { + for (const ArtifactData &a : std::as_const(d->generatedArtifacts)) { if (a.installData().isInstallable()) artifacts << a; } @@ -731,21 +732,16 @@ bool operator==(const ProductData &lhs, const ProductData &rhs) if (!lhs.isValid() && !rhs.isValid()) return true; - return lhs.isValid() == rhs.isValid() - && lhs.name() == rhs.name() - && lhs.targetName() == rhs.targetName() - && lhs.type() == rhs.type() - && lhs.version() == rhs.version() - && lhs.dependencies() == rhs.dependencies() - && lhs.profile() == rhs.profile() - && lhs.multiplexConfigurationId() == rhs.multiplexConfigurationId() - && lhs.location() == rhs.location() - && lhs.groups() == rhs.groups() - && lhs.generatedArtifacts() == rhs.generatedArtifacts() - && lhs.properties() == rhs.properties() - && lhs.moduleProperties() == rhs.moduleProperties() - && lhs.isEnabled() == rhs.isEnabled() - && lhs.isMultiplexed() == rhs.isMultiplexed(); + return lhs.isValid() == rhs.isValid() && lhs.name() == rhs.name() + && lhs.targetName() == rhs.targetName() && lhs.type() == rhs.type() + && lhs.version() == rhs.version() && lhs.dependencies() == rhs.dependencies() + && lhs.profile() == rhs.profile() + && lhs.multiplexConfigurationId() == rhs.multiplexConfigurationId() + && lhs.location() == rhs.location() && lhs.groups() == rhs.groups() + && lhs.generatedArtifacts() == rhs.generatedArtifacts() + && qVariantMapsEqual(lhs.properties(), rhs.properties()) + && lhs.moduleProperties() == rhs.moduleProperties() && lhs.isEnabled() == rhs.isEnabled() + && lhs.isMultiplexed() == rhs.isMultiplexed(); } bool operator!=(const ProductData &lhs, const ProductData &rhs) @@ -867,7 +863,7 @@ const QList<ProjectData> &ProjectData::subProjects() const const QList<ProductData> ProjectData::allProducts() const { QList<ProductData> productList = products(); - for (const ProjectData &pd : qAsConst(d->subProjects)) + for (const ProjectData &pd : std::as_const(d->subProjects)) productList << pd.allProducts(); return productList; } @@ -953,6 +949,52 @@ QStringList PropertyMap::allProperties() const } /*! + * \brief Returns the names of all modules whose properties can be requested. + */ +QStringList PropertyMap::allModules() const +{ + QStringList modules; + for (auto it = d->m_map->value().constBegin(); it != d->m_map->value().constEnd(); ++it) { + if (it.value().canConvert<QVariantMap>()) + modules << it.key(); + } + return modules; +} + +/*! + * \brief Returns information about all properties of the given module. + */ +QList<PropertyMap::PropertyInfo> PropertyMap::allPropertiesForModule(const QString &module) const +{ + const QVariantMap moduleProps = d->m_map->value().value(module).toMap(); + QList<PropertyInfo> properties; + const auto builtinProps = transformed<QStringList>( + BuiltinDeclarations::instance().declarationsForType(ItemType::Module).properties(), + [](const PropertyDeclaration &decl) { return decl.name(); }); + for (auto it = moduleProps.begin(); it != moduleProps.end(); ++it) { + static const auto getType = [](const QVariant &v) -> QString { + switch (qVariantType(v)) { + case QMetaType::Bool: + return PropertyDeclaration::typeString(PropertyDeclaration::Boolean); + case QMetaType::Int: + return PropertyDeclaration::typeString(PropertyDeclaration::Integer); + case QMetaType::QVariantList: + return PropertyDeclaration::typeString(PropertyDeclaration::VariantList); + case QMetaType::QString: + return PropertyDeclaration::typeString(PropertyDeclaration::String); + case QMetaType::QStringList: + return PropertyDeclaration::typeString(PropertyDeclaration::StringList); + default: + return PropertyDeclaration::typeString(PropertyDeclaration::Variant); + } + }; + properties << PropertyInfo{ + it.key(), getType(it.value()), it.value(), builtinProps.contains(it.key())}; + } + return properties; +} + +/*! * \brief Returns the value of the given property of a product or group. */ QVariant PropertyMap::getProperty(const QString &name) const @@ -987,11 +1029,10 @@ QVariant PropertyMap::getModuleProperty(const QString &moduleName, static QString mapToString(const QVariantMap &map, const QString &prefix) { - QStringList keys(map.keys()); - std::sort(keys.begin(), keys.end()); QString stringRep; - for (const QString &key : qAsConst(keys)) { - const QVariant &val = map.value(key); + for (auto it = map.cbegin(), end = map.cend(); it != end; ++it) { + const QString &key = it.key(); + const QVariant &val = it.value(); if (val.userType() == QMetaType::QVariantMap) { stringRep += mapToString(val.value<QVariantMap>(), prefix + key + QLatin1Char('.')); } else { |