summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@theqtcompany.com>2015-07-30 18:02:53 +0200
committerChristian Kandeler <christian.kandeler@theqtcompany.com>2015-07-31 14:28:44 +0200
commit9058897fde28138a7480ed544870f2587fbc01cb (patch)
treeb169cd51c6006774c3c8695f69eb6c28522c3954
parent33c9a2721b76e8a7affa19e924cbaf4e4c91060b (diff)
downloadqbs-egon-via-deps.tar.gz
***egon-via-depsegon-via-deps
Change-Id: I54fa3e5b369a071435968c4a2b96763deb3ef944
-rw-r--r--src/lib/corelib/language/evaluatorscriptclass.cpp53
-rw-r--r--src/lib/corelib/language/evaluatorscriptclass.h2
-rw-r--r--src/lib/corelib/language/item.cpp8
-rw-r--r--src/lib/corelib/language/item.h3
-rw-r--r--src/lib/corelib/language/tst_language.cpp43
-rw-r--r--src/lib/corelib/language/tst_language.h2
-rw-r--r--src/lib/qtprofilesetup/templates/core.qbs1
7 files changed, 110 insertions, 2 deletions
diff --git a/src/lib/corelib/language/evaluatorscriptclass.cpp b/src/lib/corelib/language/evaluatorscriptclass.cpp
index e9e6d8d36..a26b954ee 100644
--- a/src/lib/corelib/language/evaluatorscriptclass.cpp
+++ b/src/lib/corelib/language/evaluatorscriptclass.cpp
@@ -52,6 +52,36 @@
namespace qbs {
namespace Internal {
+class DepsClass : public QScriptClass
+{
+ QScriptValue m_result;
+public:
+ DepsClass(QScriptEngine *e)
+ : QScriptClass(e)
+ {}
+
+ QueryFlags queryProperty(const QScriptValue &object, const QScriptString &name, QueryFlags flags, uint *id);
+ QScriptValue property(const QScriptValue &object, const QScriptString &name, uint id);
+};
+
+QScriptClass::QueryFlags DepsClass::queryProperty(const QScriptValue &object, const QScriptString &name, QScriptClass::QueryFlags flags, uint *id)
+{
+ EvaluationData *edata = attachedPointer<EvaluationData>(object);
+ const QString nameString = name.toString();
+ const QualifiedId nameId = QualifiedId::fromString(nameString);
+ Item::Module m = edata->item->moduleByName(nameId);
+ if (!m.isValid() || !m.item->prototype() || !m.item->prototype()->prototype())
+ return QueryFlags();
+ m_result = edata->evaluator->scriptValue(m.item->prototype()->prototype());
+ return HandlesReadAccess;
+}
+
+QScriptValue DepsClass::property(const QScriptValue &object, const QScriptString &name, uint id)
+{
+ return m_result;
+}
+
+
class SVConverter : ValueHandler
{
EvaluatorScriptClass * const scriptClass;
@@ -258,7 +288,8 @@ bool debugProperties = false;
enum QueryPropertyType
{
QPTDefault,
- QPTParentProperty
+ QPTParentProperty,
+ QPTDependenciesProperty
};
EvaluatorScriptClass::EvaluatorScriptClass(ScriptEngine *scriptEngine, const Logger &logger)
@@ -266,6 +297,7 @@ EvaluatorScriptClass::EvaluatorScriptClass(ScriptEngine *scriptEngine, const Log
, m_logger(logger)
, m_valueCacheEnabled(false)
{
+ m_depsClass = new DepsClass(scriptEngine);
m_getNativeSettingBuiltin = scriptEngine->newFunction(js_getNativeSetting, 3);
m_getEnvBuiltin = scriptEngine->newFunction(js_getEnv, 1);
m_currentEnvBuiltin = scriptEngine->newFunction(js_currentEnv, 0);
@@ -274,6 +306,11 @@ EvaluatorScriptClass::EvaluatorScriptClass(ScriptEngine *scriptEngine, const Log
m_getHashBuiltin = scriptEngine->newFunction(js_getHash, 1);
}
+EvaluatorScriptClass::~EvaluatorScriptClass()
+{
+ delete m_depsClass;
+}
+
QScriptClass::QueryFlags EvaluatorScriptClass::queryProperty(const QScriptValue &object,
const QScriptString &name,
QScriptClass::QueryFlags flags,
@@ -296,6 +333,12 @@ QScriptClass::QueryFlags EvaluatorScriptClass::queryProperty(const QScriptValue
return QScriptClass::HandlesReadAccess;
}
+ if (data->item->isModuleInstance() && nameString == QLatin1String("dependencies")) {
+ m_queryResult.data = data;
+ *id = QPTDependenciesProperty;
+ return HandlesReadAccess;
+ }
+
*id = QPTDefault;
if (!data) {
if (debugProperties)
@@ -471,7 +514,6 @@ QScriptValue EvaluatorScriptClass::property(const QScriptValue &object, const QS
ValuePtr value;
m_queryResult.value.swap(value);
- QBS_ASSERT(value, return QScriptValue());
QBS_ASSERT(m_queryResult.isNull(), return QScriptValue());
if (debugProperties)
@@ -487,6 +529,13 @@ QScriptValue EvaluatorScriptClass::property(const QScriptValue &object, const QS
}
}
+ if (qpt == QPTDependenciesProperty) {
+ QScriptValue deps = engine()->newObject(m_depsClass);
+ attachPointerTo(deps, data);
+ return deps;
+ }
+
+ QBS_ASSERT(value, return QScriptValue());
if (value->next() && !m_currentNextChain.contains(value.data())) {
collectValuesFromNextChain(data, &result, name.toString(), value);
} else {
diff --git a/src/lib/corelib/language/evaluatorscriptclass.h b/src/lib/corelib/language/evaluatorscriptclass.h
index 7dcda5619..4e5cfe400 100644
--- a/src/lib/corelib/language/evaluatorscriptclass.h
+++ b/src/lib/corelib/language/evaluatorscriptclass.h
@@ -52,6 +52,7 @@ class EvaluatorScriptClass : public QScriptClass
{
public:
EvaluatorScriptClass(ScriptEngine *scriptEngine, const Logger &logger);
+ ~EvaluatorScriptClass();
QueryFlags queryProperty(const QScriptValue &object,
const QScriptString &name,
@@ -103,6 +104,7 @@ private:
QScriptValue m_getHashBuiltin;
QStack<JSSourceValue *> m_sourceValueStack;
QSet<Value *> m_currentNextChain;
+ QScriptClass *m_depsClass;
};
} // namespace Internal
diff --git a/src/lib/corelib/language/item.cpp b/src/lib/corelib/language/item.cpp
index 57ea4742b..a57594f25 100644
--- a/src/lib/corelib/language/item.cpp
+++ b/src/lib/corelib/language/item.cpp
@@ -158,6 +158,14 @@ PropertyDeclaration Item::propertyDeclaration(const QString &name) const
return (!decl.isValid() && m_prototype) ? m_prototype->propertyDeclaration(name) : decl;
}
+Item::Module Item::moduleByName(const QualifiedId &id) const
+{
+ foreach (const Module &m, m_modules)
+ if (m.name == id)
+ return m;
+ return Module();
+}
+
void Item::addModule(const Item::Module &module)
{
const auto it = std::lower_bound(m_modules.begin(), m_modules.end(), module);
diff --git a/src/lib/corelib/language/item.h b/src/lib/corelib/language/item.h
index bf926dae4..c27049b7f 100644
--- a/src/lib/corelib/language/item.h
+++ b/src/lib/corelib/language/item.h
@@ -64,6 +64,8 @@ public:
: item(0), isProduct(false), required(true)
{}
+ bool isValid() const { return item; }
+
QualifiedId name;
Item *item;
bool isProduct;
@@ -92,6 +94,7 @@ public:
const PropertyDeclarationMap &propertyDeclarations() const { return m_propertyDeclarations; }
PropertyDeclaration propertyDeclaration(const QString &name) const;
const Modules &modules() const { return m_modules; }
+ Module moduleByName(const QualifiedId &id) const;
void addModule(const Module &module);
void removeModules() { m_modules.clear(); }
void setModules(const Modules &modules) { m_modules = modules; }
diff --git a/src/lib/corelib/language/tst_language.cpp b/src/lib/corelib/language/tst_language.cpp
index d07af317a..946d4497f 100644
--- a/src/lib/corelib/language/tst_language.cpp
+++ b/src/lib/corelib/language/tst_language.cpp
@@ -354,6 +354,49 @@ void qbs::Internal::TestLanguage::dependencyOnAllProfiles()
QCOMPARE(exceptionCaught, false);
}
+void TestLanguage::defaultValue()
+{
+ bool exceptionCaught = false;
+ try {
+ SetupProjectParameters params = defaultParameters;
+ params.setProjectFilePath(testProject("defaultvalue/egon.qbs"));
+ QFETCH(QString, prop1Value);
+ params.setOverriddenValues(QVariantMap({{"lower.prop1", prop1Value}}));
+ TopLevelProjectPtr project = loader->loadProject(params);
+ QVERIFY(project);
+ QHash<QString, ResolvedProductPtr> products = productsFromProject(project);
+ QCOMPARE(products.count(), 1);
+ const ResolvedProductPtr product = products.value("egon");
+ QVERIFY(product);
+ QStringList propertyName = QStringList() << "modules" << "lower" << "prop2";
+ QVariant propertyValue = getConfigProperty(product->moduleProperties->value(), propertyName);
+ QFETCH(QVariant, expectedProp2Value);
+ QCOMPARE(propertyValue, expectedProp2Value);
+ propertyName = QStringList() << "modules" << "lower" << "listProp";
+ propertyValue = getConfigProperty(product->moduleProperties->value(), propertyName);
+ QFETCH(QVariant, expectedListPropValue);
+ QCOMPARE(propertyValue, expectedListPropValue);
+ }
+ catch (const ErrorInfo &e) {
+ exceptionCaught = true;
+ qDebug() << e.toString();
+ }
+ QCOMPARE(exceptionCaught, false);
+}
+
+void TestLanguage::defaultValue_data()
+{
+ QTest::addColumn<QString>("prop1Value");
+ QTest::addColumn<QVariant>("expectedProp2Value");
+ QTest::addColumn<QVariant>("expectedListPropValue");
+ QTest::newRow("controlling property with random value") << "random" << QVariant("withoutBlubb")
+ << QVariant(QStringList({"other", "other"}));
+ QTest::newRow("controlling property with blubb value") << "blubb" << QVariant("withBlubb")
+ << QVariant(QStringList({"blubb", "other", "blubb", "other"}));
+ QTest::newRow("controlling property with egon value") << "egon" << QVariant("withEgon")
+ << QVariant(QStringList({"egon", "other"}));
+}
+
void TestLanguage::environmentVariable()
{
bool exceptionCaught = false;
diff --git a/src/lib/corelib/language/tst_language.h b/src/lib/corelib/language/tst_language.h
index 624f5428b..4d4597c53 100644
--- a/src/lib/corelib/language/tst_language.h
+++ b/src/lib/corelib/language/tst_language.h
@@ -71,6 +71,8 @@ private slots:
void builtinFunctionInSearchPathsProperty();
void canonicalArchitecture();
void conditionalDepends();
+ void defaultValue();
+ void defaultValue_data();
void dependencyOnAllProfiles();
void environmentVariable();
void erroneousFiles_data();
diff --git a/src/lib/qtprofilesetup/templates/core.qbs b/src/lib/qtprofilesetup/templates/core.qbs
index 844a58784..55d7bc027 100644
--- a/src/lib/qtprofilesetup/templates/core.qbs
+++ b/src/lib/qtprofilesetup/templates/core.qbs
@@ -144,6 +144,7 @@ Module {
if (qbs.targetOS.contains('darwin') && qbs.toolchain.contains('clang')
&& config.contains('c++11'))
return "libc++";
+ return dependencies.cpp.cxxStandardLibrary;
}
additionalProductTypes: ["qm"]