aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIvan Komissarov <ABBAPOH@gmail.com>2020-06-13 16:35:35 +0200
committerIvan Komissarov <ABBAPOH@gmail.com>2020-07-16 08:43:54 +0000
commita9d789723053a33649d520913a89839774024f0b (patch)
treec44d77a84b0489564b0fe90c8beaf79064ab41c1 /src
parent6fa78d83517308a193f4a57818acfb51a4da0652 (diff)
Fix loading optional transitive dependencies
If optional module B depends on an invalid module A (i.e. whos validate script throws an exception), module B should be not present as well. Fix that by remembering the initial value of the "required" property in the Depends item. Change-Id: Ia21587b3f5a8bd49c12b9f31b65e009fb2eeafb9 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/lib/corelib/language/item.h1
-rw-r--r--src/lib/corelib/language/moduleloader.cpp16
2 files changed, 14 insertions, 3 deletions
diff --git a/src/lib/corelib/language/item.h b/src/lib/corelib/language/item.h
index c5d8ef980..2d676a7f7 100644
--- a/src/lib/corelib/language/item.h
+++ b/src/lib/corelib/language/item.h
@@ -78,6 +78,7 @@ public:
QualifiedId name;
Item *item;
bool isProduct;
+ bool requiredValue = true; // base value of the required prop
bool required;
QVariantMap parameters;
VersionRange versionRange;
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp
index 935f18f9e..09bfb00e8 100644
--- a/src/lib/corelib/language/moduleloader.cpp
+++ b/src/lib/corelib/language/moduleloader.cpp
@@ -1489,6 +1489,13 @@ void ModuleLoader::handleProduct(ModuleLoader::ProductContext *productContext)
continue;
try {
m_evaluator->boolValue(module.item, StringConstants::validateProperty());
+ for (const auto &dep : module.item->modules()) {
+ if (dep.requiredValue && !dep.item->isPresentModule()) {
+ throw ErrorInfo(Tr::tr("Module '%1' depends on module '%2', which was not "
+ "loaded successfully")
+ .arg(module.name.toString(), dep.name.toString()));
+ }
+ }
} catch (const ErrorInfo &error) {
handleModuleSetupError(productContext, module, error);
if (productContext->info.delayedError.hasError())
@@ -2665,8 +2672,10 @@ void ModuleLoader::resolveDependsItem(DependsContext *dependsContext, Item *pare
return;
}
+ const bool isRequiredValue =
+ m_evaluator->boolValue(dependsItem, StringConstants::requiredProperty());
const bool isRequired = !productTypesIsSet
- && m_evaluator->boolValue(dependsItem, StringConstants::requiredProperty())
+ && isRequiredValue
&& !contains(m_requiredChain, false);
const Version minVersion = Version::fromString(
m_evaluator->stringValue(dependsItem,
@@ -2686,8 +2695,8 @@ void ModuleLoader::resolveDependsItem(DependsContext *dependsContext, Item *pare
const auto it = std::find_if(moduleResults->begin(), moduleResults->end(),
[moduleName](const Item::Module &m) { return m.name == moduleName; });
if (it != moduleResults->end()) {
- if (isRequired)
- it->required = true;
+ it->required = it->required || isRequired;
+ it->requiredValue = it->requiredValue || isRequiredValue;
it->versionRange.narrowDown(versionRange);
continue;
}
@@ -2720,6 +2729,7 @@ void ModuleLoader::resolveDependsItem(DependsContext *dependsContext, Item *pare
qCDebug(lcModuleLoader) << "module loaded:" << moduleName.toString();
result.name = moduleName;
result.item = moduleItem;
+ result.requiredValue = isRequiredValue;
result.required = isRequired;
result.parameters = defaultParameters;
result.versionRange = versionRange;