diff options
author | David E. Narvaez <david.narvaez@computer.org> | 2015-06-21 22:24:39 -0400 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@theqtcompany.com> | 2015-07-29 07:51:22 +0000 |
commit | d17eba9d34f412e592c3b049c6c14fd9ccada87b (patch) | |
tree | 32f16a5ae2272b7d5dfa6c25b53b8aa06cf98330 /src/xmlpatterns/expr | |
parent | 69c539045191d02a07ff3471bd37486ccf226b18 (diff) | |
download | qtxmlpatterns-d17eba9d34f412e592c3b049c6c14fd9ccada87b.tar.gz |
Iterate Over the Items (Not the Operands) of a Literal Sequence
The current code iterates over the (empty) list of operands of a Literal
Sequence, ignoring any items in it, so Literal Sequences are always
ignored in the ExpressionSequence.
Task-number: QTBUG-35897
Change-Id: I60341ac21c8e3b77bf6d8dfeebdbafe010844406
Reviewed-by: Erik Verbruggen <erik.verbruggen@theqtcompany.com>
Diffstat (limited to 'src/xmlpatterns/expr')
-rw-r--r-- | src/xmlpatterns/expr/qexpression_p.h | 7 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qexpressionsequence.cpp | 9 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qliteralsequence.cpp | 2 |
3 files changed, 16 insertions, 2 deletions
diff --git a/src/xmlpatterns/expr/qexpression_p.h b/src/xmlpatterns/expr/qexpression_p.h index c799725..7a7899f 100644 --- a/src/xmlpatterns/expr/qexpression_p.h +++ b/src/xmlpatterns/expr/qexpression_p.h @@ -375,11 +375,16 @@ namespace QPatternist IDExistsFN, /** - * Identifies ExpressionSequence and LiteralSequence. + * Identifies ExpressionSequence. */ IDExpressionSequence, /** + * Identifies LiteralSequence. + */ + IDLiteralSequence, + + /** * Identifies GeneralComparison. */ IDGeneralComparison, diff --git a/src/xmlpatterns/expr/qexpressionsequence.cpp b/src/xmlpatterns/expr/qexpressionsequence.cpp index 4ff8082..c71beb9 100644 --- a/src/xmlpatterns/expr/qexpressionsequence.cpp +++ b/src/xmlpatterns/expr/qexpressionsequence.cpp @@ -34,6 +34,8 @@ #include "qcardinalityverifier_p.h" #include "qcommonsequencetypes_p.h" #include "qemptysequence_p.h" +#include "qabstractxmlforwarditerator_p.h" +#include "qliteral_p.h" #include "qsequencemappingiterator_p.h" #include "qexpressionsequence_p.h" @@ -106,6 +108,13 @@ Expression::Ptr ExpressionSequence::compress(const StaticContext::Ptr &context) for(; seqIt != seqEnd; ++seqIt) result.append(*seqIt); + } else if (Id == IDLiteralSequence) { + /* Rewrite "(1, (2, 3), 4)" into "(1, 2, 3, 4)" */ + // Note: LiteralSequence does not use the dynamic context, so we pass in a nullptr. + Item::Iterator::Ptr seqIt = (*it)->evaluateSequence(DynamicContext::Ptr(Q_NULLPTR)); + + while (!seqIt->next().isNull()) + result.append(Literal::Ptr(new Literal(seqIt->current()))); } else result.append(*it); diff --git a/src/xmlpatterns/expr/qliteralsequence.cpp b/src/xmlpatterns/expr/qliteralsequence.cpp index e0b610d..8c920d3 100644 --- a/src/xmlpatterns/expr/qliteralsequence.cpp +++ b/src/xmlpatterns/expr/qliteralsequence.cpp @@ -73,7 +73,7 @@ ExpressionVisitorResult::Ptr LiteralSequence::accept(const ExpressionVisitor::Pt Expression::ID LiteralSequence::id() const { - return IDExpressionSequence; + return IDLiteralSequence; } Expression::Properties LiteralSequence::properties() const |