diff options
author | Ivan Komissarov <abbapoh@gmail.com> | 2021-10-06 19:25:42 +0300 |
---|---|---|
committer | Ivan Komissarov <ABBAPOH@gmail.com> | 2021-10-07 11:12:38 +0000 |
commit | a35ff56175cc8c993b54bb1d92ff71ba4532fc88 (patch) | |
tree | bc47c81a595c4d5afe83d5dc5cfa9c05cf197b92 | |
parent | 5acd507e853fe67f1065dc69933d81e2564fb002 (diff) | |
download | qbs-a35ff56175cc8c993b54bb1d92ff71ba4532fc88.tar.gz |
Use common function for property overriding
...in Module and ModuleProvider loaders
Change-Id: I3d60ec1efb9e655decf599179ddec77624186521
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r-- | src/lib/corelib/language/item.cpp | 23 | ||||
-rw-r--r-- | src/lib/corelib/language/item.h | 8 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 17 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleproviderloader.cpp | 17 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleproviderloader.h | 5 |
5 files changed, 41 insertions, 29 deletions
diff --git a/src/lib/corelib/language/item.cpp b/src/lib/corelib/language/item.cpp index fa33a264d..2f23de210 100644 --- a/src/lib/corelib/language/item.cpp +++ b/src/lib/corelib/language/item.cpp @@ -387,5 +387,28 @@ void Item::setPropertyDeclarations(const Item::PropertyDeclarationMap &decls) m_propertyDeclarations = decls; } +void Item::overrideProperties( + const QVariantMap &overridden, + const QualifiedId &namePrefix, + const SetupProjectParameters ¶meters, + Logger &logger) +{ + if (overridden.isEmpty()) + return; + for (QVariantMap::const_iterator it = overridden.constBegin(); it != overridden.constEnd(); + ++it) { + const PropertyDeclaration decl = propertyDeclaration(it.key()); + if (!decl.isValid()) { + ErrorInfo error(Tr::tr("Unknown property: %1.%2"). + arg(namePrefix.toString(), it.key())); + handlePropertyError(error, parameters, logger); + continue; + } + setProperty(it.key(), + VariantValue::create(PropertyDeclaration::convertToPropertyType( + it.value(), decl.type(), namePrefix, it.key()))); + } +} + } // namespace Internal } // namespace qbs diff --git a/src/lib/corelib/language/item.h b/src/lib/corelib/language/item.h index 2d676a7f7..16dd2016c 100644 --- a/src/lib/corelib/language/item.h +++ b/src/lib/corelib/language/item.h @@ -55,6 +55,9 @@ #include <vector> namespace qbs { + +class SetupProjectParameters; + namespace Internal { class ItemObserver; class ItemPool; @@ -142,6 +145,11 @@ public: bool isPresentModule() const; void setupForBuiltinType(Logger &logger); void copyProperty(const QString &propertyName, Item *target) const; + void overrideProperties( + const QVariantMap &config, + const QualifiedId &namePrefix, + const SetupProjectParameters ¶meters, + Logger &logger); private: ItemValuePtr itemProperty(const QString &name, const Item *itemTemplate, diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index 3ffd0736e..3435238a7 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -257,7 +257,8 @@ ModuleLoader::ModuleLoader(Evaluator *evaluator, Logger &logger) , m_progressObserver(nullptr) , m_reader(std::make_unique<ItemReader>(logger)) , m_evaluator(evaluator) - , m_moduleProviderLoader(std::make_unique<ModuleProviderLoader>(m_reader.get(), m_evaluator)) + , m_moduleProviderLoader( + std::make_unique<ModuleProviderLoader>(m_reader.get(), m_evaluator, m_logger)) { } @@ -3755,19 +3756,7 @@ void ModuleLoader::overrideItemProperties(Item *item, const QString &buildConfig const QVariant buildConfigValue = buildConfig.value(buildConfigKey); if (buildConfigValue.isNull()) return; - const QVariantMap overridden = buildConfigValue.toMap(); - for (QVariantMap::const_iterator it = overridden.constBegin(); it != overridden.constEnd(); - ++it) { - const PropertyDeclaration decl = item->propertyDeclaration(it.key()); - if (!decl.isValid()) { - ErrorInfo error(Tr::tr("Unknown property: %1.%2").arg(buildConfigKey, it.key())); - handlePropertyError(error, m_parameters, m_logger); - continue; - } - item->setProperty(it.key(), - VariantValue::create(PropertyDeclaration::convertToPropertyType( - it.value(), decl.type(), QStringList(buildConfigKey), it.key()))); - } + item->overrideProperties(buildConfigValue.toMap(), buildConfigKey, m_parameters, m_logger); } void ModuleLoader::collectAllModules(Item *item, std::vector<Item::Module> *modules) diff --git a/src/lib/corelib/language/moduleproviderloader.cpp b/src/lib/corelib/language/moduleproviderloader.cpp index d8acad651..86246b0d6 100644 --- a/src/lib/corelib/language/moduleproviderloader.cpp +++ b/src/lib/corelib/language/moduleproviderloader.cpp @@ -60,9 +60,10 @@ namespace qbs { namespace Internal { -ModuleProviderLoader::ModuleProviderLoader(ItemReader *reader, Evaluator *evaluator) +ModuleProviderLoader::ModuleProviderLoader(ItemReader *reader, Evaluator *evaluator, Logger &logger) : m_reader(reader) , m_evaluator(evaluator) + , m_logger(logger) { } @@ -302,19 +303,7 @@ QStringList ModuleProviderLoader::getProviderSearchPaths( BuiltinDeclarations::instance().nameForType(ItemType::ModuleProvider))); } providerItem->setParent(product.item); - - // TODO: this looks like ModuleLoader::overrideItemProperties(), merge them? - for (auto it = moduleConfig.begin(); it != moduleConfig.end(); ++it) { - const PropertyDeclaration decl = providerItem->propertyDeclaration(it.key()); - if (!decl.isValid()) { - throw ErrorInfo(Tr::tr("No such property '%1' in module provider '%2'.") - .arg(it.key(), name.toString())); - } - VariantValuePtr v = VariantValue::create( - PropertyDeclaration::convertToPropertyType(it.value(), decl.type(), - QStringList(name), it.key())); - providerItem->setProperty(it.key(), v); - } + providerItem->overrideProperties(moduleConfig, name.toString(), m_parameters, m_logger); EvalContextSwitcher contextSwitcher(m_evaluator->engine(), EvalContext::ModuleProvider); return m_evaluator->stringListValue(providerItem, QStringLiteral("searchPaths")); } diff --git a/src/lib/corelib/language/moduleproviderloader.h b/src/lib/corelib/language/moduleproviderloader.h index 4b3115cfb..13eddc2b0 100644 --- a/src/lib/corelib/language/moduleproviderloader.h +++ b/src/lib/corelib/language/moduleproviderloader.h @@ -50,12 +50,14 @@ namespace qbs { namespace Internal { +class Logger; + class ModuleProviderLoader { public: using ProductContext = ModuleLoader::ProductContext; using FallbackMode = ModuleLoader::FallbackMode; - explicit ModuleProviderLoader(ItemReader *itemReader, Evaluator *evaluator); + explicit ModuleProviderLoader(ItemReader *itemReader, Evaluator *evaluator, Logger &logger); enum class ModuleProviderLookup { Scoped, Named, Fallback }; @@ -118,6 +120,7 @@ private: Evaluator *const m_evaluator{nullptr}; SetupProjectParameters m_parameters; + Logger &m_logger; StoredModuleProviderInfo m_storedModuleProviderInfo; Set<QString> m_tempQbsFiles; }; |