From 6cf321a31681cfd4e8bf99958c444eb7e647510d Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 9 Nov 2012 11:23:32 +0100 Subject: [PATCH] QmlJS:SimpleReader: adding support for arrays Also adding test. Change-Id: Idaf0aeacbb6f78e5c8404db740c2a8b7b297dad2 Reviewed-by: Thomas Hartmann --- src/libs/qmljs/qmljssimplereader.cpp | 30 ++++++++++---- src/libs/qmljs/qmljssimplereader.h | 3 +- .../tst_qmljssimplereader.cpp | 39 +++++++++++++++++++ 3 files changed, 64 insertions(+), 8 deletions(-) diff --git a/src/libs/qmljs/qmljssimplereader.cpp b/src/libs/qmljs/qmljssimplereader.cpp index c7e2d5b6770..c4d60673e9b 100644 --- a/src/libs/qmljs/qmljssimplereader.cpp +++ b/src/libs/qmljs/qmljssimplereader.cpp @@ -232,12 +232,12 @@ void SimpleAbstractStreamReader::readProperty(AST::UiScriptBinding *uiScriptBind setSourceLocation(uiScriptBinding->firstSourceLocation()); const QString name = toString(uiScriptBinding->qualifiedId); - const QVariant value = parseProperty(uiScriptBinding); + const QVariant value = parsePropertyScriptBinding(uiScriptBinding); propertyDefinition(name, value); } -QVariant SimpleAbstractStreamReader::parseProperty(AST::UiScriptBinding *uiScriptBinding) +QVariant SimpleAbstractStreamReader::parsePropertyScriptBinding(AST::UiScriptBinding *uiScriptBinding) { Q_ASSERT(uiScriptBinding); @@ -247,23 +247,39 @@ QVariant SimpleAbstractStreamReader::parseProperty(AST::UiScriptBinding *uiScrip return QVariant(); } - AST::StringLiteral *stringLiteral = AST::cast(expStmt->expression); + return parsePropertyExpression(expStmt->expression); +} + +QVariant SimpleAbstractStreamReader::parsePropertyExpression(AST::ExpressionNode *expressionNode) +{ + Q_ASSERT(expressionNode); + + AST::ArrayLiteral *arrayLiteral = AST::cast(expressionNode); + + if (arrayLiteral) { + QList variantList; + for (AST::ElementList *it = arrayLiteral->elements; it; it = it->next) + variantList << parsePropertyExpression(it->expression); + return variantList; + } + + AST::StringLiteral *stringLiteral = AST::cast(expressionNode); if (stringLiteral) return stringLiteral->value.toString(); - AST::TrueLiteral *trueLiteral = AST::cast(expStmt->expression); + AST::TrueLiteral *trueLiteral = AST::cast(expressionNode); if (trueLiteral) return true; - AST::FalseLiteral *falseLiteral = AST::cast(expStmt->expression); + AST::FalseLiteral *falseLiteral = AST::cast(expressionNode); if (falseLiteral) return false; - AST::NumericLiteral *numericLiteral = AST::cast(expStmt->expression); + AST::NumericLiteral *numericLiteral = AST::cast(expressionNode); if (numericLiteral) return numericLiteral->value; - addError(tr("Expected expression statement to be a literal"), uiScriptBinding->statement->firstSourceLocation()); + addError(tr("Expected expression statement to be a literal"), expressionNode->firstSourceLocation()); return QVariant(); } diff --git a/src/libs/qmljs/qmljssimplereader.h b/src/libs/qmljs/qmljssimplereader.h index dd543354815..351b590326d 100644 --- a/src/libs/qmljs/qmljssimplereader.h +++ b/src/libs/qmljs/qmljssimplereader.h @@ -102,7 +102,8 @@ private: void readChild(AST::UiObjectDefinition *uiObjectDefinition); void readProperties(AST::UiObjectDefinition *ast); void readProperty(AST::UiScriptBinding *uiScriptBinding); - QVariant parseProperty(AST::UiScriptBinding *ast); + QVariant parsePropertyScriptBinding(AST::UiScriptBinding *ExpressionNode); + QVariant parsePropertyExpression(AST::ExpressionNode *expressionNode); void setSourceLocation(const AST::SourceLocation &sourceLocation); QStringList m_errors; diff --git a/tests/auto/qml/qmljssimplereader/tst_qmljssimplereader.cpp b/tests/auto/qml/qmljssimplereader/tst_qmljssimplereader.cpp index 13030e0d7c4..c44056e5419 100644 --- a/tests/auto/qml/qmljssimplereader/tst_qmljssimplereader.cpp +++ b/tests/auto/qml/qmljssimplereader/tst_qmljssimplereader.cpp @@ -44,6 +44,7 @@ private slots: void testWellFormed(); void testIllFormed01(); void testIllFormed02(); + void testArrays(); }; tst_SimpleReader::tst_SimpleReader() @@ -175,6 +176,44 @@ void tst_SimpleReader::testIllFormed02() QCOMPARE(firstChild->property("property01").toString(), QLatin1String("20")); } +void tst_SimpleReader::testArrays() +{ + char source[] = "RootNode {\n" + " propertyArray: [\"string01\", \"string02\" ]\n" + " ChildNode {\n" + " propertyArray: [\"string01\", \"string02\" ]\n" + " propertyArrayMixed: [\"string03\", [\"string01\", \"string02\"] ]\n" + " }\n" + "}\n"; + + QList variantList; + variantList << QVariant(QLatin1String("string01")) << QVariant(QLatin1String("string02")); + const QVariant variant = variantList; + + QmlJS::SimpleReader reader; + QmlJS::SimpleReaderNode::Ptr rootNode = reader.readFromSource(source); + + QVERIFY(rootNode); + QVERIFY(rootNode->isValid()); + QVERIFY(rootNode->isRoot()); + + QCOMPARE(rootNode->property("propertyArray"), variant); + + + QmlJS::SimpleReaderNode::Ptr firstChild = rootNode->children().at(0); + + QVERIFY(firstChild); + QVERIFY(firstChild->isValid()); + QVERIFY(!firstChild->isRoot()); + QCOMPARE(firstChild->property("propertyArray"), variant); + + QList variantList2; + variantList2 << QVariant(QLatin1String("string03")) << variant; + const QVariant variant2 = variantList2; + + QCOMPARE(firstChild->property("propertyArrayMixed"), variant2); +} + QTEST_MAIN(tst_SimpleReader); #include "tst_qmljssimplereader.moc"