summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-04-08 16:13:23 +0200
committerChristian Kandeler <christian.kandeler@digia.com>2013-04-10 12:23:26 +0200
commit35710e2ebe7e3f0a2ada05bedb0868ed2edda14f (patch)
treeb7e825ff13fc9117e613e9e4e8de32b43384501d
parent47d695cce4e5515578dad2232e0dffcb9889cfcc (diff)
downloadqbs-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.cpp24
-rw-r--r--src/lib/language/moduleloader.cpp10
-rw-r--r--src/lib/language/moduleloader.h1
-rw-r--r--src/lib/language/tst_language.cpp1
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);
}