diff options
| author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-04-08 16:13:23 +0200 |
|---|---|---|
| committer | Christian Kandeler <christian.kandeler@digia.com> | 2013-04-10 12:23:26 +0200 |
| commit | 35710e2ebe7e3f0a2ada05bedb0868ed2edda14f (patch) | |
| tree | b7e825ff13fc9117e613e9e4e8de32b43384501d | |
| parent | 47d695cce4e5515578dad2232e0dffcb9889cfcc (diff) | |
| download | qbs-35710e2ebe7e3f0a2ada05bedb0868ed2edda14f.tar.gz | |
correct scope behavior
The scope of an item object must not affect the visibility of
properties.
This fixes TestLanguage::itemScope.
Change-Id: If72b4bfdc6b30870d94aaf05cc704b7eb9beaddc
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
| -rw-r--r-- | src/lib/language/evaluatorscriptclass.cpp | 24 | ||||
| -rw-r--r-- | src/lib/language/moduleloader.cpp | 10 | ||||
| -rw-r--r-- | src/lib/language/moduleloader.h | 1 | ||||
| -rw-r--r-- | src/lib/language/tst_language.cpp | 1 |
4 files changed, 22 insertions, 14 deletions
diff --git a/src/lib/language/evaluatorscriptclass.cpp b/src/lib/language/evaluatorscriptclass.cpp index 7b88495e6..8404e5384 100644 --- a/src/lib/language/evaluatorscriptclass.cpp +++ b/src/lib/language/evaluatorscriptclass.cpp @@ -95,6 +95,15 @@ private: } } + void pushItemScopes(const Item *item) + { + const ItemConstPtr scope = item->scope(); + if (scope) { + pushItemScopes(scope.data()); + pushScope(data->evaluator->scriptValue(scope)); + } + } + void popScopes() { for (; pushedScopesCount-- > 0;) @@ -117,10 +126,12 @@ private: conditionFileScope = data->evaluator->fileScope(conditionScopeItem->file()); } engine->currentContext()->pushScope(conditionFileScope); + pushItemScopes(conditionScopeItem.data()); engine->currentContext()->pushScope(conditionScope); const QScriptValue cr = engine->evaluate(alternative->condition); engine->currentContext()->popScope(); engine->currentContext()->popScope(); + popScopes(); if (cr.isError()) { *result = cr; return; @@ -159,6 +170,7 @@ private: data->evaluator->property(outerItem, *propertyName)); pushScope(data->evaluator->fileScope(value->file())); + pushItemScopes(data->item); scriptContext->pushScope(*object); pushScope(extraScope); *result = engine->evaluate(value->sourceCode()); @@ -247,18 +259,6 @@ QScriptClass::QueryFlags EvaluatorScriptClass::queryItemProperty(const Evaluatio } } - if (!data->item->scope().isNull()) { - if (debugProperties) - m_logger.qbsTrace() << "[SC] queryProperty: query scope"; - EvaluationData scopedata = *data; - scopedata.item = data->item->scope().data(); - const QueryFlags qf = queryItemProperty(&scopedata, name, true); - if (qf.testFlag(HandlesReadAccess)) { - m_queryResult.data = data; - return qf; - } - } - if (!ignoreParent && !data->item->parent().isNull()) { if (debugProperties) m_logger.qbsTrace() << "[SC] queryProperty: query parent"; diff --git a/src/lib/language/moduleloader.cpp b/src/lib/language/moduleloader.cpp index 5516587e4..dc6655031 100644 --- a/src/lib/language/moduleloader.cpp +++ b/src/lib/language/moduleloader.cpp @@ -163,11 +163,11 @@ void ModuleLoader::handleProduct(ProjectContext *projectContext, const ItemPtr & DependsContext dependsContext; dependsContext.product = &productContext; dependsContext.productDependencies = &productContext.info.usedProducts; + setScopeForDescendants(item, productContext.scope); resolveDependencies(&dependsContext, item); createAdditionalModuleInstancesInProduct(&productContext); foreach (const ItemPtr &child, item->children()) { - child->setScope(productContext.scope); if (child->typeName() == QLatin1String("Group")) handleGroup(&productContext, child); else if (child->typeName() == QLatin1String("Artifact")) @@ -725,6 +725,14 @@ void ModuleLoader::copyProperty(const QString &propertyName, const ItemConstPtr destination->setProperty(propertyName, source->property(propertyName)); } +void ModuleLoader::setScopeForDescendants(const ItemPtr &item, const ItemPtr &scope) +{ + foreach (const ItemPtr &child, item->children()) { + child->setScope(scope); + setScopeForDescendants(child, scope); + } +} + QString ModuleLoader::fullModuleName(const QStringList &moduleName) { // Currently the same as the module sub directory. diff --git a/src/lib/language/moduleloader.h b/src/lib/language/moduleloader.h index 2bfe77423..f43435828 100644 --- a/src/lib/language/moduleloader.h +++ b/src/lib/language/moduleloader.h @@ -151,6 +151,7 @@ private: static ItemPtr wrapWithProject(const ItemPtr &item); static QString moduleSubDir(const QStringList &moduleName); static void copyProperty(const QString &propertyName, const ItemConstPtr &source, const ItemPtr &destination); + static void setScopeForDescendants(const ItemPtr &item, const ItemPtr &scope); ScriptEngine *m_engine; Logger m_logger; diff --git a/src/lib/language/tst_language.cpp b/src/lib/language/tst_language.cpp index 6c545973f..4f34683bb 100644 --- a/src/lib/language/tst_language.cpp +++ b/src/lib/language/tst_language.cpp @@ -530,7 +530,6 @@ void TestLanguage::itemScope() Evaluator evaluator(m_engine, m_logger); QCOMPARE(evaluator.property(scope1, "x").toVariant().toInt(), 1); QCOMPARE(evaluator.property(scope2, "y").toVariant().toInt(), 2); - QEXPECT_FAIL("", "FIXME", Abort); QVERIFY(!evaluator.property(scope2, "x").isValid()); QCOMPARE(evaluator.property(item, "z").toVariant().toInt(), 3); } |
