diff options
author | Joerg Bornemann <joerg.bornemann@qt.io> | 2018-06-05 12:31:00 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2018-06-06 08:02:04 +0000 |
commit | fadb41e330d92c03633c9a596eeb9ff125227426 (patch) | |
tree | 64b16c951cba82a185a9534289de2f034ea6d44b | |
parent | 0af8d1b7870d44e4a024669cae28593173687de1 (diff) |
Fix property values that are pure assignments of imports
Those were broken, because QScriptValue::toVariant() doesn't take
QScriptValue::prototype() into account, which we set for imports.
Change-Id: I571f7a4b63df08b1768f61bcc1d622f3730c2a73
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
5 files changed, 49 insertions, 1 deletions
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp index 8b129c98b..4af79a5ce 100644 --- a/src/lib/corelib/language/projectresolver.cpp +++ b/src/lib/corelib/language/projectresolver.cpp @@ -1670,7 +1670,21 @@ void ProjectResolver::evaluateProperty(const Item *item, const QString &propName // NOTE: Loses type information if scriptValue.isUndefined == true, // as such QScriptValues become invalid QVariants. - QVariant v = scriptValue.isFunction() ? scriptValue.toString() : scriptValue.toVariant(); + QVariant v; + if (scriptValue.isFunction()) { + v = scriptValue.toString(); + } else { + v = scriptValue.toVariant(); + QVariantMap m = v.toMap(); + if (m.contains(StringConstants::importScopeNamePropertyInternal())) { + QVariantMap tmp = m; + m = scriptValue.prototype().toVariant().toMap(); + for (auto it = tmp.begin(); it != tmp.end(); ++it) + m.insert(it.key(), it.value()); + v = m; + } + } + if (pd.type() == PropertyDeclaration::Path && v.isValid()) { v = v.toString(); } else if (pd.type() == PropertyDeclaration::PathList diff --git a/tests/auto/blackbox/testdata/import-assignment/import-assignment.qbs b/tests/auto/blackbox/testdata/import-assignment/import-assignment.qbs new file mode 100644 index 000000000..2bff00f35 --- /dev/null +++ b/tests/auto/blackbox/testdata/import-assignment/import-assignment.qbs @@ -0,0 +1,23 @@ +import qbs +import MyImport + +Product { + type: "outtype" + property var importValue: MyImport + Rule { + multiplex: true + Artifact { + fileTags: "outtype" + filePath: "dummy" + } + prepare: { + var cmd = new JavaScriptCommand; + cmd.silent = true; + cmd.sourceCode = function() { + console.info("key 1 = " + product.importValue.key1); + console.info("key 2 = " + product.importValue.key2); + }; + return cmd; + } + } +} diff --git a/tests/auto/blackbox/testdata/import-assignment/imports/MyImport/myimport.js b/tests/auto/blackbox/testdata/import-assignment/imports/MyImport/myimport.js new file mode 100644 index 000000000..5befd5151 --- /dev/null +++ b/tests/auto/blackbox/testdata/import-assignment/imports/MyImport/myimport.js @@ -0,0 +1,2 @@ +var key1 = "value1"; +var key2 = "value2"; diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index 3293c09de..0c3f8b1bc 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -6180,6 +6180,14 @@ void TestBlackbox::ico() } } +void TestBlackbox::importAssignment() +{ + QDir::setCurrent(testDataDir + "/import-assignment"); + QCOMPARE(runQbs(QStringList("project.qbsSearchPaths:" + QDir::currentPath())), 0); + QVERIFY2(m_qbsStdout.contains("key 1 = value1") && m_qbsStdout.contains("key 2 = value2"), + m_qbsStdout.constData()); +} + void TestBlackbox::importChangeTracking() { QDir::setCurrent(testDataDir + "/import-change-tracking"); diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h index e81551b26..70a950a84 100644 --- a/tests/auto/blackbox/tst_blackbox.h +++ b/tests/auto/blackbox/tst_blackbox.h @@ -115,6 +115,7 @@ private slots: void generator_data(); void groupsInModules(); void ico(); + void importAssignment(); void importChangeTracking(); void importInPropertiesCondition(); void importSearchPath(); |