diff options
author | Joerg Bornemann <joerg.bornemann@theqtcompany.com> | 2015-07-30 18:02:53 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@theqtcompany.com> | 2015-07-31 14:28:44 +0200 |
commit | 9058897fde28138a7480ed544870f2587fbc01cb (patch) | |
tree | b169cd51c6006774c3c8695f69eb6c28522c3954 | |
parent | 33c9a2721b76e8a7affa19e924cbaf4e4c91060b (diff) | |
download | qbs-egon-via-deps.tar.gz |
***egon-via-depsegon-via-deps
Change-Id: I54fa3e5b369a071435968c4a2b96763deb3ef944
-rw-r--r-- | src/lib/corelib/language/evaluatorscriptclass.cpp | 53 | ||||
-rw-r--r-- | src/lib/corelib/language/evaluatorscriptclass.h | 2 | ||||
-rw-r--r-- | src/lib/corelib/language/item.cpp | 8 | ||||
-rw-r--r-- | src/lib/corelib/language/item.h | 3 | ||||
-rw-r--r-- | src/lib/corelib/language/tst_language.cpp | 43 | ||||
-rw-r--r-- | src/lib/corelib/language/tst_language.h | 2 | ||||
-rw-r--r-- | src/lib/qtprofilesetup/templates/core.qbs | 1 |
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"] |