summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2009-06-10 10:02:29 (GMT)
committerErik Verbruggen <erik.verbruggen@nokia.com>2009-06-10 10:02:29 (GMT)
commitc0bbe44ab6290dee088138c01724779026d2c033 (patch)
treef6344fcf5fc9cd5fe58754afbac3c68c3438d33a /src/declarative/qml
parentbf750d1df7e1474ffddc547205f7f20520559ea7 (diff)
downloadQt-c0bbe44ab6290dee088138c01724779026d2c033.zip
Qt-c0bbe44ab6290dee088138c01724779026d2c033.tar.gz
Qt-c0bbe44ab6290dee088138c01724779026d2c033.tar.bz2
Changed the QML parser and the AST to store the position of comma tokens
of QML arrays. Also exposed these positions through the QML DOM.
Diffstat (limited to 'src/declarative/qml')
-rw-r--r--src/declarative/qml/parser/javascript.g9
-rw-r--r--src/declarative/qml/parser/javascriptast.cpp12
-rw-r--r--src/declarative/qml/parser/javascriptast_p.h37
-rw-r--r--src/declarative/qml/parser/javascriptastfwd_p.h1
-rw-r--r--src/declarative/qml/parser/javascriptastvisitor_p.h2
-rw-r--r--src/declarative/qml/parser/javascriptparser.cpp9
-rw-r--r--src/declarative/qml/parser/javascriptparser_p.h1
-rw-r--r--src/declarative/qml/qmldom.cpp10
-rw-r--r--src/declarative/qml/qmldom.h2
-rw-r--r--src/declarative/qml/qmlparser_p.h1
-rw-r--r--src/declarative/qml/qmlscriptparser.cpp18
11 files changed, 90 insertions, 12 deletions
diff --git a/src/declarative/qml/parser/javascript.g b/src/declarative/qml/parser/javascript.g
index 8cabeea..884d814 100644
--- a/src/declarative/qml/parser/javascript.g
+++ b/src/declarative/qml/parser/javascript.g
@@ -568,15 +568,16 @@ case $rule_number: {
UiArrayMemberList: UiObjectDefinition ;
/.
case $rule_number: {
- sym(1).Node = makeAstNode<AST::UiObjectMemberList> (driver->nodePool(), sym(1).UiObjectMember);
+ sym(1).Node = makeAstNode<AST::UiArrayMemberList> (driver->nodePool(), sym(1).UiObjectMember);
} break;
./
UiArrayMemberList: UiArrayMemberList T_COMMA UiObjectDefinition ;
/.
case $rule_number: {
- AST::UiObjectMemberList *node = makeAstNode<AST:: UiObjectMemberList> (driver->nodePool(),
- sym(1).UiObjectMemberList, sym(3).UiObjectMember);
+ AST::UiArrayMemberList *node = makeAstNode<AST::UiArrayMemberList> (driver->nodePool(),
+ sym(1).UiArrayMemberList, sym(3).UiObjectMember);
+ node->commaToken = loc(2);
sym(1).Node = node;
} break;
./
@@ -616,7 +617,7 @@ UiObjectMember: UiQualifiedId T_COLON T_LBRACKET UiArrayMemberList T_RBRACKET ;
/.
case $rule_number: {
AST::UiArrayBinding *node = makeAstNode<AST::UiArrayBinding> (driver->nodePool(), sym(1).UiQualifiedId->finish(),
- sym(4).UiObjectMemberList->finish());
+ sym(4).UiArrayMemberList->finish());
node->colonToken = loc(2);
node->lbracketToken = loc(3);
node->rbracketToken = loc(5);
diff --git a/src/declarative/qml/parser/javascriptast.cpp b/src/declarative/qml/parser/javascriptast.cpp
index 130229b..ada19d5 100644
--- a/src/declarative/qml/parser/javascriptast.cpp
+++ b/src/declarative/qml/parser/javascriptast.cpp
@@ -893,7 +893,7 @@ void UiArrayBinding::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
acceptChild(qualifiedId, visitor);
- for (UiObjectMemberList *it = members; it; it = it->next)
+ for (UiArrayMemberList *it = members; it; it = it->next)
acceptChild(it->member, visitor);
}
@@ -910,6 +910,16 @@ void UiObjectMemberList::accept0(Visitor *visitor)
visitor->endVisit(this);
}
+void UiArrayMemberList::accept0(Visitor *visitor)
+{
+ if (visitor->visit(this)) {
+ for (UiArrayMemberList *it = this; it; it = it->next)
+ acceptChild(it->member, visitor);
+ }
+
+ visitor->endVisit(this);
+}
+
void UiQualifiedId::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
diff --git a/src/declarative/qml/parser/javascriptast_p.h b/src/declarative/qml/parser/javascriptast_p.h
index 23d59e5..8c1e2bc 100644
--- a/src/declarative/qml/parser/javascriptast_p.h
+++ b/src/declarative/qml/parser/javascriptast_p.h
@@ -207,6 +207,7 @@ public:
Kind_UiObjectDefinition,
Kind_UiObjectInitializer,
Kind_UiObjectMemberList,
+ Kind_UiArrayMemberList,
Kind_UiProgram,
Kind_UiPublicMember,
Kind_UiQualifiedId,
@@ -2301,6 +2302,38 @@ public:
UiObjectMember *member;
};
+class UiArrayMemberList: public Node
+{
+public:
+ JAVASCRIPT_DECLARE_AST_NODE(UiArrayMemberList)
+
+ UiArrayMemberList(UiObjectMember *member)
+ : next(this), member(member)
+ { kind = K; }
+
+ UiArrayMemberList(UiArrayMemberList *previous, UiObjectMember *member)
+ : member(member)
+ {
+ kind = K;
+ next = previous->next;
+ previous->next = this;
+ }
+
+ virtual void accept0(Visitor *visitor);
+
+ UiArrayMemberList *finish()
+ {
+ UiArrayMemberList *head = next;
+ next = 0;
+ return head;
+ }
+
+// attributes
+ UiArrayMemberList *next;
+ UiObjectMember *member;
+ SourceLocation commaToken;
+};
+
class UiObjectInitializer: public Node
{
public:
@@ -2481,7 +2514,7 @@ public:
JAVASCRIPT_DECLARE_AST_NODE(UiArrayBinding)
UiArrayBinding(UiQualifiedId *qualifiedId,
- UiObjectMemberList *members)
+ UiArrayMemberList *members)
: qualifiedId(qualifiedId),
members(members)
{ kind = K; }
@@ -2496,7 +2529,7 @@ public:
// attributes
UiQualifiedId *qualifiedId;
- UiObjectMemberList *members;
+ UiArrayMemberList *members;
SourceLocation colonToken;
SourceLocation lbracketToken;
SourceLocation rbracketToken;
diff --git a/src/declarative/qml/parser/javascriptastfwd_p.h b/src/declarative/qml/parser/javascriptastfwd_p.h
index 822a2d7..23270e5 100644
--- a/src/declarative/qml/parser/javascriptastfwd_p.h
+++ b/src/declarative/qml/parser/javascriptastfwd_p.h
@@ -174,6 +174,7 @@ class UiSourceElement;
class UiArrayBinding;
class UiObjectMember;
class UiObjectMemberList;
+class UiArrayMemberList;
class UiQualifiedId;
} } // namespace AST
diff --git a/src/declarative/qml/parser/javascriptastvisitor_p.h b/src/declarative/qml/parser/javascriptastvisitor_p.h
index 81df364..7c73e43 100644
--- a/src/declarative/qml/parser/javascriptastvisitor_p.h
+++ b/src/declarative/qml/parser/javascriptastvisitor_p.h
@@ -80,6 +80,7 @@ public:
virtual bool visit(UiScriptBinding *) { return true; }
virtual bool visit(UiArrayBinding *) { return true; }
virtual bool visit(UiObjectMemberList *) { return true; }
+ virtual bool visit(UiArrayMemberList *) { return true; }
virtual bool visit(UiQualifiedId *) { return true; }
virtual void endVisit(UiProgram *) {}
@@ -93,6 +94,7 @@ public:
virtual void endVisit(UiScriptBinding *) {}
virtual void endVisit(UiArrayBinding *) {}
virtual void endVisit(UiObjectMemberList *) {}
+ virtual void endVisit(UiArrayMemberList *) {}
virtual void endVisit(UiQualifiedId *) {}
// JavaScript
diff --git a/src/declarative/qml/parser/javascriptparser.cpp b/src/declarative/qml/parser/javascriptparser.cpp
index 34ecd0e..bbffc4f 100644
--- a/src/declarative/qml/parser/javascriptparser.cpp
+++ b/src/declarative/qml/parser/javascriptparser.cpp
@@ -239,12 +239,13 @@ case 10: {
} break;
case 11: {
- sym(1).Node = makeAstNode<AST::UiObjectMemberList> (driver->nodePool(), sym(1).UiObjectMember);
+ sym(1).Node = makeAstNode<AST::UiArrayMemberList> (driver->nodePool(), sym(1).UiObjectMember);
} break;
case 12: {
- AST::UiObjectMemberList *node = makeAstNode<AST:: UiObjectMemberList> (driver->nodePool(),
- sym(1).UiObjectMemberList, sym(3).UiObjectMember);
+ AST::UiArrayMemberList *node = makeAstNode<AST::UiArrayMemberList> (driver->nodePool(),
+ sym(1).UiArrayMemberList, sym(3).UiObjectMember);
+ node->commaToken = loc(2);
sym(1).Node = node;
} break;
@@ -270,7 +271,7 @@ case 15: {
case 17: {
AST::UiArrayBinding *node = makeAstNode<AST::UiArrayBinding> (driver->nodePool(), sym(1).UiQualifiedId->finish(),
- sym(4).UiObjectMemberList->finish());
+ sym(4).UiArrayMemberList->finish());
node->colonToken = loc(2);
node->lbracketToken = loc(3);
node->rbracketToken = loc(5);
diff --git a/src/declarative/qml/parser/javascriptparser_p.h b/src/declarative/qml/parser/javascriptparser_p.h
index 2ae4c34..b6a2432 100644
--- a/src/declarative/qml/parser/javascriptparser_p.h
+++ b/src/declarative/qml/parser/javascriptparser_p.h
@@ -117,6 +117,7 @@ public:
AST::UiArrayBinding *UiArrayBinding;
AST::UiObjectMember *UiObjectMember;
AST::UiObjectMemberList *UiObjectMemberList;
+ AST::UiArrayMemberList *UiArrayMemberList;
AST::UiQualifiedId *UiQualifiedId;
};
diff --git a/src/declarative/qml/qmldom.cpp b/src/declarative/qml/qmldom.cpp
index e06afb5..d2608c8 100644
--- a/src/declarative/qml/qmldom.cpp
+++ b/src/declarative/qml/qmldom.cpp
@@ -1449,6 +1449,16 @@ int QmlDomList::length() const
return 0;
}
+/*!
+ Returns a list of positions of the commas in the QML file.
+*/
+QList<int> QmlDomList:: commaPositions() const
+{
+ if (d && d->property)
+ return d->property->listCommaPositions;
+ else
+ return QList<int>();
+}
/*!
\class QmlDomComponent
diff --git a/src/declarative/qml/qmldom.h b/src/declarative/qml/qmldom.h
index 442a4fc..fde35a8 100644
--- a/src/declarative/qml/qmldom.h
+++ b/src/declarative/qml/qmldom.h
@@ -268,6 +268,8 @@ public:
int position() const;
int length() const;
+ QList<int> commaPositions() const;
+
private:
friend class QmlDomValue;
QSharedDataPointer<QmlDomValuePrivate> d;
diff --git a/src/declarative/qml/qmlparser_p.h b/src/declarative/qml/qmlparser_p.h
index 7989933..1481391 100644
--- a/src/declarative/qml/qmlparser_p.h
+++ b/src/declarative/qml/qmlparser_p.h
@@ -277,6 +277,7 @@ namespace QmlParser
LocationSpan location;
LocationRange listValueRange;
+ QList<int> listCommaPositions;
void dump(int = 0) const;
};
diff --git a/src/declarative/qml/qmlscriptparser.cpp b/src/declarative/qml/qmlscriptparser.cpp
index cab7915..ee2981e 100644
--- a/src/declarative/qml/qmlscriptparser.cpp
+++ b/src/declarative/qml/qmlscriptparser.cpp
@@ -649,7 +649,20 @@ bool ProcessAST::visit(AST::ExpressionStatement *node)
return true;
}
-// UiObjectMember: UiQualifiedId T_COLON T_LBRACKET UiObjectMemberList T_RBRACKET ;
+static QList<int> collectCommas(AST::UiArrayMemberList *members)
+{
+ QList<int> commas;
+
+ if (members) {
+ for (AST::UiArrayMemberList *it = members->next; it; it = it->next) {
+ commas.append(it->commaToken.offset);
+ }
+ }
+
+ return commas;
+}
+
+// UiObjectMember: UiQualifiedId T_COLON T_LBRACKET UiArrayMemberList T_RBRACKET ;
bool ProcessAST::visit(AST::UiArrayBinding *node)
{
int propertyCount = 0;
@@ -667,6 +680,9 @@ bool ProcessAST::visit(AST::UiArrayBinding *node)
prop->listValueRange.offset = node->lbracketToken.offset;
prop->listValueRange.length = node->rbracketToken.offset + node->rbracketToken.length - node->lbracketToken.offset;
+ // Store the positions of the comma token too, again for the DOM to be able to retreive it.
+ prop->listCommaPositions = collectCommas(node->members);
+
while (propertyCount--)
_stateStack.pop();