summaryrefslogtreecommitdiffstats
path: root/src/declarative/qml
diff options
context:
space:
mode:
authormae <qt-info@nokia.com>2009-04-19 15:06:05 (GMT)
committerRoberto Raggi <roberto.raggi@nokia.com>2009-04-24 07:52:34 (GMT)
commit89684b4e52d7fd0485ef12a4554f88439037e6bb (patch)
tree875234e758eb691ad67e74fab516ed857aa206f2 /src/declarative/qml
parentab83f16fd07300342d786f48a82b4d81f77f670d (diff)
downloadQt-89684b4e52d7fd0485ef12a4554f88439037e6bb.zip
Qt-89684b4e52d7fd0485ef12a4554f88439037e6bb.tar.gz
Qt-89684b4e52d7fd0485ef12a4554f88439037e6bb.tar.bz2
implement UiObjectBinding (UiObjectMember: UiQualifiedId T_COLON T_IDENTIFIER UiObjectInitializer)
Diffstat (limited to 'src/declarative/qml')
-rw-r--r--src/declarative/qml/qmlscriptparser.cpp68
1 files changed, 65 insertions, 3 deletions
diff --git a/src/declarative/qml/qmlscriptparser.cpp b/src/declarative/qml/qmlscriptparser.cpp
index 9f4ff05..2f62cfd 100644
--- a/src/declarative/qml/qmlscriptparser.cpp
+++ b/src/declarative/qml/qmlscriptparser.cpp
@@ -68,7 +68,10 @@ protected:
virtual void endVisit(AST::UiObjectDefinition *node);
virtual bool visit(AST::UiPublicMember *node);
+
virtual bool visit(AST::UiObjectBinding *node);
+ virtual void endVisit(AST::UiObjectBinding *node);
+
virtual bool visit(AST::UiScriptBinding *node);
virtual bool visit(AST::UiArrayBinding *node);
@@ -201,8 +204,67 @@ void ProcessAST::endVisit(AST::UiObjectDefinition *)
// UiObjectMember: UiQualifiedId T_COLON T_IDENTIFIER UiObjectInitializer ;
bool ProcessAST::visit(AST::UiObjectBinding *node)
{
- qWarning() << Q_FUNC_INFO << "not implemented";
- return false;
+// qWarning() << Q_FUNC_INFO << "not implemented";
+ const QString qualifiedId = asString(node->qualifiedId);
+ const QStringList str = qualifiedId.split(QLatin1Char('.'));
+ int line = node->colonToken.startLine;
+
+ for(int ii = 0; ii < str.count(); ++ii) {
+ const QString s = str.at(ii);
+ _stateStack.pushProperty(s, line);
+ }
+
+ const QString name = node->name->asString();
+ bool isType = name.at(0).isUpper() && !name.contains(QLatin1Char('.'));
+
+ _scope.append(name);
+
+ if (! isType) {
+ qWarning() << "bad name for a class"; // ### FIXME
+ return false;
+ }
+
+ // Class
+ const int typeId = _parser->findOrCreateTypeId(name);
+ line = node->identifierToken.startLine;
+
+ Object *obj = new Object;
+ obj->type = typeId;
+ obj->typeName = qualifiedNameId().toLatin1();
+ obj->line = line;
+
+ Property *prop = currentProperty();
+ Value *v = new Value;
+ v->object = obj;
+ v->line = line;
+ prop->addValue(v);
+
+ for(int ii = str.count() - 1; ii >= 0; --ii)
+ _stateStack.pop();
+
+ if (! _parser->tree()) {
+ _parser->setTree(obj);
+ _stateStack.pushObject(obj);
+ } else {
+ const State state = _stateStack.top();
+ Value *v = new Value;
+ v->object = obj;
+ v->line = line;
+ if(state.property)
+ state.property->addValue(v);
+ else
+ state.object->getDefaultProperty()->addValue(v);
+ _stateStack.pushObject(obj);
+ }
+
+ return true;
+}
+
+// UiObjectMember: UiQualifiedId T_COLON T_IDENTIFIER UiObjectInitializer ;
+void ProcessAST::endVisit(AST::UiObjectBinding *node)
+{
+ _stateStack.pop();
+ _scope.removeLast();
}
// UiObjectMember: UiQualifiedId T_COLON Statement ;
@@ -270,7 +332,7 @@ bool ProcessAST::visit(AST::UiScriptBinding *node)
for(int ii = str.count() - 1; ii >= 0; --ii)
_stateStack.pop();
- return false;
+ return true;
}
// UiObjectMember: UiQualifiedId T_COLON T_LBRACKET UiObjectMemberList T_RBRACKET ;