diff options
author | Joerg Bornemann <joerg.bornemann@theqtcompany.com> | 2015-02-09 14:36:03 +0100 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@theqtcompany.com> | 2015-02-10 10:57:56 +0000 |
commit | 6cd2ec6266f29d08ed337357049faea7a93c1b7c (patch) | |
tree | 72432584e6ef7d8798303de9449abf348e75071b /src/lib/corelib/language | |
parent | aec6c77bb8ce33b6535106c78eeb9cd755398953 (diff) |
fix scalar property lookup some more
Let there be a product P that depends on module A. Module A depends on
module B.A sets B.foo to 1. Default value of B.foo is 0. The value of
product.moduleProperty("B", "foo") is 1.
Now add the direct dependency B to P. P does not overwrite the default
value of B.foo. The overwritten value of B.foo from A takes
precedence.
This semantics change is needed to make sure that adding/removing
modules to a product does not change property values in surprising
ways.
Task-number: QBS-736
Change-Id: I73152a24649bc670a9075e82998ef2b0d8709a84
Reviewed-by: Christian Kandeler <christian.kandeler@theqtcompany.com>
Diffstat (limited to 'src/lib/corelib/language')
-rw-r--r-- | src/lib/corelib/language/projectresolver.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp index 0bf8b5ed3..3117edd80 100644 --- a/src/lib/corelib/language/projectresolver.cpp +++ b/src/lib/corelib/language/projectresolver.cpp @@ -1079,6 +1079,21 @@ QVariantMap ProjectResolver::evaluateModuleValues(Item *item, bool lookupPrototy return result; } +static QStringList ownPropertiesSet(Item *item) +{ + QStringList names; + do { + names += item->properties().keys(); + item = item->prototype(); + } while (item && item->isModuleInstance()); + + std::sort(names.begin(), names.end()); + QStringList::iterator lastIt = std::unique(names.begin(), names.end()); + if (lastIt != names.end()) + names.erase(lastIt); + return names; +} + void ProjectResolver::evaluateModuleValues(Item *item, QVariantMap *modulesMap, bool lookupPrototype) const { @@ -1097,7 +1112,9 @@ void ProjectResolver::evaluateModuleValues(Item *item, QVariantMap *modulesMap, evaluateModuleValues(module.item, &depmods, lookupPrototype); QVariantMap dep = evaluateProperties(module.item, lookupPrototype); dep.insert(QLatin1String("modules"), depmods); - modulesMap->insert(ModuleLoader::fullModuleName(module.name), dep); + const QString fullName = ModuleLoader::fullModuleName(module.name); + modulesMap->insert(fullName, dep); + modulesMap->insert(QLatin1Char('@') + fullName, ownPropertiesSet(module.item)); } } |