summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Komissarov <abbapoh@gmail.com>2021-10-06 19:25:42 +0300
committerIvan Komissarov <ABBAPOH@gmail.com>2021-10-07 11:12:38 +0000
commita35ff56175cc8c993b54bb1d92ff71ba4532fc88 (patch)
treebc47c81a595c4d5afe83d5dc5cfa9c05cf197b92
parent5acd507e853fe67f1065dc69933d81e2564fb002 (diff)
downloadqbs-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.cpp23
-rw-r--r--src/lib/corelib/language/item.h8
-rw-r--r--src/lib/corelib/language/moduleloader.cpp17
-rw-r--r--src/lib/corelib/language/moduleproviderloader.cpp17
-rw-r--r--src/lib/corelib/language/moduleproviderloader.h5
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 &parameters,
+ 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 &parameters,
+ 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;
};