src/declarative/qml/qdeclarativedom.cpp
changeset 30 5dc02b23752f
child 33 3e2da88830cd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/declarative/qml/qdeclarativedom.cpp	Tue Jul 06 15:10:48 2010 +0300
@@ -0,0 +1,1850 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "private/qdeclarativedom_p.h"
+#include "private/qdeclarativedom_p_p.h"
+
+#include "private/qdeclarativecompositetypedata_p.h"
+#include "private/qdeclarativecompiler_p.h"
+#include "private/qdeclarativeengine_p.h"
+#include "private/qdeclarativescriptparser_p.h"
+#include "private/qdeclarativeglobal_p.h"
+
+#include <QtCore/QByteArray>
+#include <QtCore/QDebug>
+#include <QtCore/QString>
+
+QT_BEGIN_NAMESPACE
+
+QDeclarativeDomDocumentPrivate::QDeclarativeDomDocumentPrivate()
+: root(0)
+{
+}
+
+QDeclarativeDomDocumentPrivate::~QDeclarativeDomDocumentPrivate()
+{
+    if (root) root->release();
+}
+
+/*!
+    \class QDeclarativeDomDocument
+    \internal
+    \brief The QDeclarativeDomDocument class represents the root of a QML document
+
+    A QML document is a self-contained snippet of QML, usually contained in a
+    single file. Each document has a root object, accessible through
+    QDeclarativeDomDocument::rootObject().
+
+    The QDeclarativeDomDocument class allows the programmer to inspect a QML document by
+    calling QDeclarativeDomDocument::load().
+
+    The following example loads a QML file from disk, and prints out its root
+    object type and the properties assigned in the root object.
+    \code
+    QFile file(inputFileName);
+    file.open(QIODevice::ReadOnly);
+    QByteArray xmlData = file.readAll();
+
+    QDeclarativeDomDocument document;
+    document.load(qmlengine, xmlData);
+
+    QDeclarativeDomObject rootObject = document.rootObject();
+    qDebug() << rootObject.objectType();
+    foreach(QDeclarativeDomProperty property, rootObject.properties())
+        qDebug() << property.propertyName();
+    \endcode
+*/
+
+/*!
+    Construct an empty QDeclarativeDomDocument.
+*/
+QDeclarativeDomDocument::QDeclarativeDomDocument()
+: d(new QDeclarativeDomDocumentPrivate)
+{
+}
+
+/*!
+    Create a copy of \a other QDeclarativeDomDocument.
+*/
+QDeclarativeDomDocument::QDeclarativeDomDocument(const QDeclarativeDomDocument &other)
+: d(other.d)
+{
+}
+
+/*!
+    Destroy the QDeclarativeDomDocument
+*/
+QDeclarativeDomDocument::~QDeclarativeDomDocument()
+{
+}
+
+/*!
+    Assign \a other to this QDeclarativeDomDocument.
+*/
+QDeclarativeDomDocument &QDeclarativeDomDocument::operator=(const QDeclarativeDomDocument &other)
+{
+    d = other.d;
+    return *this;
+}
+
+/*!
+    Returns all import statements in qml.
+*/
+QList<QDeclarativeDomImport> QDeclarativeDomDocument::imports() const
+{
+    return d->imports;
+}
+
+/*!
+    Loads a QDeclarativeDomDocument from \a data.  \a data should be valid QML
+    data.  On success, true is returned.  If the \a data is malformed, false
+    is returned and QDeclarativeDomDocument::errors() contains an error description.
+
+    \sa QDeclarativeDomDocument::loadError()
+*/
+bool QDeclarativeDomDocument::load(QDeclarativeEngine *engine, const QByteArray &data, const QUrl &url)
+{
+    d->errors.clear();
+    d->imports.clear();
+
+    QDeclarativeCompiledData *component = new QDeclarativeCompiledData(engine);
+    QDeclarativeCompiler compiler;
+
+    QDeclarativeCompositeTypeData *td = ((QDeclarativeEnginePrivate *)QDeclarativeEnginePrivate::get(engine))->typeManager.getImmediate(data, url);
+
+    if(td->status == QDeclarativeCompositeTypeData::Error) {
+        d->errors = td->errors;
+        td->release();
+        component->release();
+        return false;
+    } else if(td->status == QDeclarativeCompositeTypeData::Waiting ||
+              td->status == QDeclarativeCompositeTypeData::WaitingResources) {
+        QDeclarativeError error;
+        error.setDescription(QLatin1String("QDeclarativeDomDocument supports local types only"));
+        d->errors << error;
+        td->release();
+        component->release();
+        return false;
+    }
+
+    compiler.compile(engine, td, component);
+
+    if (compiler.isError()) {
+        d->errors = compiler.errors();
+        td->release();
+        component->release();
+        return false;
+    }
+
+    for (int i = 0; i < td->data.imports().size(); ++i) {
+        QDeclarativeScriptParser::Import parserImport = td->data.imports().at(i);
+        QDeclarativeDomImport domImport;
+        domImport.d->type = static_cast<QDeclarativeDomImportPrivate::Type>(parserImport.type);
+        domImport.d->uri = parserImport.uri;
+        domImport.d->qualifier = parserImport.qualifier;
+        domImport.d->version = parserImport.version;
+        d->imports += domImport;
+    }
+
+    if (td->data.tree()) {
+        d->root = td->data.tree();
+        d->root->addref();
+    }
+
+    component->release();
+    return true;
+}
+
+/*!
+    Returns the last load errors.  The load errors will be reset after a
+    successful call to load().
+
+    \sa load()
+*/
+QList<QDeclarativeError> QDeclarativeDomDocument::errors() const
+{
+    return d->errors;
+}
+
+/*!
+    Returns the document's root object, or an invalid QDeclarativeDomObject if the
+    document has no root.
+
+    In the sample QML below, the root object will be the QDeclarativeItem type.
+    \qml
+Item {
+    Text {
+        text: "Hello World"
+    }
+}
+    \endqml
+*/
+QDeclarativeDomObject QDeclarativeDomDocument::rootObject() const
+{
+    QDeclarativeDomObject rv;
+    rv.d->object = d->root;
+    if (rv.d->object) rv.d->object->addref();
+    return rv;
+}
+
+QDeclarativeDomPropertyPrivate::QDeclarativeDomPropertyPrivate()
+: property(0)
+{
+}
+
+QDeclarativeDomPropertyPrivate::~QDeclarativeDomPropertyPrivate()
+{
+    if (property) property->release();
+}
+
+QDeclarativeDomDynamicPropertyPrivate::QDeclarativeDomDynamicPropertyPrivate():
+        valid(false)
+{
+}
+
+QDeclarativeDomDynamicPropertyPrivate::~QDeclarativeDomDynamicPropertyPrivate()
+{
+    if (valid && property.defaultValue) property.defaultValue->release();
+}
+
+/*!
+    \class QDeclarativeDomProperty
+    \internal
+    \brief The QDeclarativeDomProperty class represents one property assignment in the
+    QML DOM tree
+
+    Properties in QML can be assigned QML \l {QDeclarativeDomValue}{values}.
+
+    \sa QDeclarativeDomObject
+*/
+
+/*!
+    Construct an invalid QDeclarativeDomProperty.
+*/
+QDeclarativeDomProperty::QDeclarativeDomProperty()
+: d(new QDeclarativeDomPropertyPrivate)
+{
+}
+
+/*!
+    Create a copy of \a other QDeclarativeDomProperty.
+*/
+QDeclarativeDomProperty::QDeclarativeDomProperty(const QDeclarativeDomProperty &other)
+: d(other.d)
+{
+}
+
+/*!
+    Destroy the QDeclarativeDomProperty.
+*/
+QDeclarativeDomProperty::~QDeclarativeDomProperty()
+{
+}
+
+/*!
+    Assign \a other to this QDeclarativeDomProperty.
+*/
+QDeclarativeDomProperty &QDeclarativeDomProperty::operator=(const QDeclarativeDomProperty &other)
+{
+    d = other.d;
+    return *this;
+}
+
+/*!
+    Returns true if this is a valid QDeclarativeDomProperty, false otherwise.
+*/
+bool QDeclarativeDomProperty::isValid() const
+{
+    return d->property != 0;
+}
+
+
+/*!
+    Return the name of this property.
+
+    \qml
+Text {
+    x: 10
+    y: 10
+    font.bold: true
+}
+    \endqml
+
+    As illustrated above, a property name can be a simple string, such as "x" or
+    "y", or a more complex "dot property", such as "font.bold".  In both cases
+    the full name is returned ("x", "y" and "font.bold") by this method.
+
+    For dot properties, a split version of the name can be accessed by calling
+    QDeclarativeDomProperty::propertyNameParts().
+
+    \sa QDeclarativeDomProperty::propertyNameParts()
+*/
+QByteArray QDeclarativeDomProperty::propertyName() const
+{
+    return d->propertyName;
+}
+
+/*!
+    Return the name of this property, split into multiple parts in the case
+    of dot properties.
+
+    \qml
+Text {
+    x: 10
+    y: 10
+    font.bold: true
+}
+    \endqml
+
+    For each of the properties shown above, this method would return ("x"),
+    ("y") and ("font", "bold").
+
+    \sa QDeclarativeDomProperty::propertyName()
+*/
+QList<QByteArray> QDeclarativeDomProperty::propertyNameParts() const
+{
+    if (d->propertyName.isEmpty()) return QList<QByteArray>();
+    else return d->propertyName.split('.');
+}
+
+/*!
+    Return true if this property is used as a default property in the QML
+    document.
+
+    \qml
+<Text text="hello"/>
+<Text>hello</Text>
+    \endqml
+
+    The above two examples return the same DOM tree, except that the second has
+    the default property flag set on the text property.  Observe that whether
+    or not a property has isDefaultProperty set is determined by how the
+    property is used, and not only by whether the property is the types default
+    property.
+*/
+bool QDeclarativeDomProperty::isDefaultProperty() const
+{
+    return d->property && d->property->isDefault;
+}
+
+/*!
+    Returns the QDeclarativeDomValue that is assigned to this property, or an invalid
+    QDeclarativeDomValue if no value is assigned.
+*/
+QDeclarativeDomValue QDeclarativeDomProperty::value() const
+{
+    QDeclarativeDomValue rv;
+    if (d->property) {
+        rv.d->property = d->property;
+        if (d->property->values.count())
+            rv.d->value = d->property->values.at(0);
+        else
+            rv.d->value = d->property->onValues.at(0);
+        rv.d->property->addref();
+        rv.d->value->addref();
+    }
+    return rv;
+}
+
+/*!
+    Returns the position in the input data where the property ID startd, or -1 if
+ the property is invalid.
+*/
+int QDeclarativeDomProperty::position() const
+{
+    if (d && d->property) {
+        return d->property->location.range.offset;
+    } else
+        return -1;
+}
+
+/*!
+    Returns the length in the input data from where the property ID started upto
+ the end of it, or -1 if the property is invalid.
+*/
+int QDeclarativeDomProperty::length() const
+{
+    if (d && d->property)
+        return d->property->location.range.length;
+    else
+        return -1;
+}
+
+/*!
+    Construct an invalid QDeclarativeDomDynamicProperty.
+*/
+QDeclarativeDomDynamicProperty::QDeclarativeDomDynamicProperty():
+        d(new QDeclarativeDomDynamicPropertyPrivate)
+{
+}
+
+/*!
+    Create a copy of \a other QDeclarativeDomDynamicProperty.
+*/
+QDeclarativeDomDynamicProperty::QDeclarativeDomDynamicProperty(const QDeclarativeDomDynamicProperty &other):
+        d(other.d)
+{
+}
+
+/*!
+    Destroy the QDeclarativeDomDynamicProperty.
+*/
+QDeclarativeDomDynamicProperty::~QDeclarativeDomDynamicProperty()
+{
+}
+
+/*!
+    Assign \a other to this QDeclarativeDomDynamicProperty.
+*/
+QDeclarativeDomDynamicProperty &QDeclarativeDomDynamicProperty::operator=(const QDeclarativeDomDynamicProperty &other)
+{
+    d = other.d;
+    return *this;
+}
+
+bool QDeclarativeDomDynamicProperty::isValid() const
+{
+    return d && d->valid;
+}
+
+/*!
+    Return the name of this dynamic property.
+
+    \qml
+Item {
+    property int count: 10;
+}
+    \endqml
+
+    As illustrated above, a dynamic property name can have a name and a
+    default value ("10").
+*/
+QByteArray QDeclarativeDomDynamicProperty::propertyName() const
+{
+    if (isValid())
+        return d->property.name;
+    else
+        return QByteArray();
+}
+
+/*!
+   Returns the type of the dynamic property. Note that when the property is an
+   alias property, this will return -1. Use QDeclarativeDomProperty::isAlias() to check
+   if the property is an alias.
+*/
+int QDeclarativeDomDynamicProperty::propertyType() const
+{
+    if (isValid()) {
+        switch (d->property.type) {
+            case QDeclarativeParser::Object::DynamicProperty::Bool:
+                return QMetaType::type("bool");
+
+            case QDeclarativeParser::Object::DynamicProperty::Color:
+                return QMetaType::type("QColor");
+
+            case QDeclarativeParser::Object::DynamicProperty::Time:
+                return QMetaType::type("QTime");
+
+            case QDeclarativeParser::Object::DynamicProperty::Date:
+                return QMetaType::type("QDate");
+
+            case QDeclarativeParser::Object::DynamicProperty::DateTime:
+                return QMetaType::type("QDateTime");
+
+            case QDeclarativeParser::Object::DynamicProperty::Int:
+                return QMetaType::type("int");
+
+            case QDeclarativeParser::Object::DynamicProperty::Real:
+                return QMetaType::type("double");
+
+            case QDeclarativeParser::Object::DynamicProperty::String:
+                return QMetaType::type("QString");
+
+            case QDeclarativeParser::Object::DynamicProperty::Url:
+                return QMetaType::type("QUrl");
+
+            case QDeclarativeParser::Object::DynamicProperty::Variant:
+                return QMetaType::type("QVariant");
+
+            default:
+                break;
+        }
+    }
+
+    return -1;
+}
+
+QByteArray QDeclarativeDomDynamicProperty::propertyTypeName() const
+{
+    if (isValid())
+        return d->property.customType;
+
+    return QByteArray();
+}
+
+/*!
+    Return true if this property is used as a default property in the QML
+    document.
+
+    \qml
+<Text text="hello"/>
+<Text>hello</Text>
+    \endqml
+
+    The above two examples return the same DOM tree, except that the second has
+    the default property flag set on the text property.  Observe that whether
+    or not a property has isDefaultProperty set is determined by how the
+    property is used, and not only by whether the property is the types default
+    property.
+*/
+bool QDeclarativeDomDynamicProperty::isDefaultProperty() const
+{
+    if (isValid())
+        return d->property.isDefaultProperty;
+    else
+        return false;
+}
+
+/*!
+    Returns the default value as a QDeclarativeDomProperty.
+*/
+QDeclarativeDomProperty QDeclarativeDomDynamicProperty::defaultValue() const
+{
+    QDeclarativeDomProperty rp;
+
+    if (isValid() && d->property.defaultValue) {
+        rp.d->property = d->property.defaultValue;
+        rp.d->propertyName = propertyName();
+        rp.d->property->addref();
+    }
+
+    return rp;
+}
+
+/*!
+    Returns true if this dynamic property is an alias for another property,
+    false otherwise.
+*/
+bool QDeclarativeDomDynamicProperty::isAlias() const
+{
+    if (isValid())
+        return d->property.type == QDeclarativeParser::Object::DynamicProperty::Alias;
+    else
+        return false;
+}
+
+/*!
+    Returns the position in the input data where the property ID startd, or 0 if
+ the property is invalid.
+*/
+int QDeclarativeDomDynamicProperty::position() const
+{
+    if (isValid()) {
+        return d->property.location.range.offset;
+    } else
+        return -1;
+}
+
+/*!
+    Returns the length in the input data from where the property ID started upto
+ the end of it, or 0 if the property is invalid.
+*/
+int QDeclarativeDomDynamicProperty::length() const
+{
+    if (isValid())
+        return d->property.location.range.length;
+    else
+        return -1;
+}
+
+QDeclarativeDomObjectPrivate::QDeclarativeDomObjectPrivate()
+: object(0)
+{
+}
+
+QDeclarativeDomObjectPrivate::~QDeclarativeDomObjectPrivate()
+{
+    if (object) object->release();
+}
+
+QDeclarativeDomObjectPrivate::Properties
+QDeclarativeDomObjectPrivate::properties() const
+{
+    Properties rv;
+
+    for (QHash<QByteArray, QDeclarativeParser::Property *>::ConstIterator iter =
+            object->properties.begin();
+            iter != object->properties.end();
+            ++iter) {
+
+        rv << properties(*iter);
+
+    }
+    return rv;
+}
+
+QDeclarativeDomObjectPrivate::Properties
+QDeclarativeDomObjectPrivate::properties(QDeclarativeParser::Property *property) const
+{
+    Properties rv;
+
+    if (property->value) {
+
+        for (QHash<QByteArray, QDeclarativeParser::Property *>::ConstIterator iter =
+                property->value->properties.begin();
+                iter != property->value->properties.end();
+                ++iter) {
+
+            rv << properties(*iter);
+
+        }
+
+        QByteArray name(property->name + '.');
+        for (Properties::Iterator iter = rv.begin(); iter != rv.end(); ++iter)
+            iter->second.prepend(name);
+
+    } else {
+        rv << qMakePair(property, property->name);
+    }
+
+    return rv;
+}
+
+/*!
+    \class QDeclarativeDomObject
+    \internal
+    \brief The QDeclarativeDomObject class represents an object instantiation.
+
+    Each object instantiated in a QML file has a corresponding QDeclarativeDomObject
+    node in the QML DOM.
+
+    In addition to the type information that determines the object to
+    instantiate, QDeclarativeDomObject's also have a set of associated QDeclarativeDomProperty's.
+    Each QDeclarativeDomProperty represents a QML property assignment on the instantiated
+    object.  For example,
+
+    \qml
+QGraphicsWidget {
+    opacity: 0.5
+    size: "100x100"
+}
+    \endqml
+
+    describes a single QDeclarativeDomObject - "QGraphicsWidget" - with two properties,
+    "opacity" and "size".  Obviously QGraphicsWidget has many more properties than just
+    these two, but the QML DOM representation only contains those assigned
+    values (or bindings) in the QML file.
+*/
+
+/*!
+    Construct an invalid QDeclarativeDomObject.
+*/
+QDeclarativeDomObject::QDeclarativeDomObject()
+: d(new QDeclarativeDomObjectPrivate)
+{
+}
+
+/*!
+    Create a copy of \a other QDeclarativeDomObject.
+*/
+QDeclarativeDomObject::QDeclarativeDomObject(const QDeclarativeDomObject &other)
+: d(other.d)
+{
+}
+
+/*!
+    Destroy the QDeclarativeDomObject.
+*/
+QDeclarativeDomObject::~QDeclarativeDomObject()
+{
+}
+
+/*!
+    Assign \a other to this QDeclarativeDomObject.
+*/
+QDeclarativeDomObject &QDeclarativeDomObject::operator=(const QDeclarativeDomObject &other)
+{
+    d = other.d;
+    return *this;
+}
+
+/*!
+    Returns true if this is a valid QDeclarativeDomObject, false otherwise.
+*/
+bool QDeclarativeDomObject::isValid() const
+{
+    return d->object != 0;
+}
+
+/*!
+    Returns the fully-qualified type name of this object.
+
+    For example, the type of this object would be "Qt/4.6/Rectangle".
+    \qml
+Rectangle { }
+    \endqml
+*/
+QByteArray QDeclarativeDomObject::objectType() const
+{
+    if (d->object) return d->object->typeName;
+    else return QByteArray();
+}
+
+/*!
+    Returns the type name as referenced in the qml file.
+
+    For example, the type of this object would be "Rectangle".
+    \qml
+Rectangle { }
+    \endqml
+*/
+QByteArray QDeclarativeDomObject::objectClassName() const
+{
+    if (d->object)
+        return d->object->className;
+    else
+        return QByteArray();
+}
+
+int QDeclarativeDomObject::objectTypeMajorVersion() const
+{
+    if (d->object)
+        return d->object->majorVersion;
+    else
+        return -1;
+}
+
+int QDeclarativeDomObject::objectTypeMinorVersion() const
+{
+    if (d->object)
+        return d->object->minorVersion;
+    else
+        return -1;
+}
+
+/*!
+    Returns the QML id assigned to this object, or an empty QByteArray if no id
+    has been assigned.
+
+    For example, the object id of this object would be "MyText".
+    \qml
+Text { id: myText }
+    \endqml
+*/
+QString QDeclarativeDomObject::objectId() const
+{
+    if (d->object) {
+        return d->object->id;
+    } else {
+        return QString();
+    }
+}
+
+/*!
+    Returns the list of assigned properties on this object.
+
+    In the following example, "text" and "x" properties would be returned.
+    \qml
+Text {
+    text: "Hello world!"
+    x: 100
+}
+    \endqml
+*/
+QList<QDeclarativeDomProperty> QDeclarativeDomObject::properties() const
+{
+    QList<QDeclarativeDomProperty> rv;
+
+    if (!d->object || isComponent())
+        return rv;
+
+    QDeclarativeDomObjectPrivate::Properties properties = d->properties();
+    for (int ii = 0; ii < properties.count(); ++ii) {
+
+        QDeclarativeDomProperty domProperty;
+        domProperty.d->property = properties.at(ii).first;
+        domProperty.d->property->addref();
+        domProperty.d->propertyName = properties.at(ii).second;
+        rv << domProperty;
+
+    }
+
+    if (d->object->defaultProperty) {
+        QDeclarativeDomProperty domProperty;
+        domProperty.d->property = d->object->defaultProperty;
+        domProperty.d->property->addref();
+        domProperty.d->propertyName = d->object->defaultProperty->name;
+        rv << domProperty;
+    }
+
+    return rv;
+}
+
+/*!
+    Returns the object's \a name property if a value has been assigned to
+    it, or an invalid QDeclarativeDomProperty otherwise.
+
+    In the example below, \c {object.property("source")} would return a valid
+    QDeclarativeDomProperty, and \c {object.property("tile")} an invalid QDeclarativeDomProperty.
+
+    \qml
+Image { source: "sample.jpg" }
+    \endqml
+*/
+QDeclarativeDomProperty QDeclarativeDomObject::property(const QByteArray &name) const
+{
+    QList<QDeclarativeDomProperty> props = properties();
+    for (int ii = 0; ii < props.count(); ++ii)
+        if (props.at(ii).propertyName() == name)
+            return props.at(ii);
+    return QDeclarativeDomProperty();
+}
+
+QList<QDeclarativeDomDynamicProperty> QDeclarativeDomObject::dynamicProperties() const
+{
+    QList<QDeclarativeDomDynamicProperty> properties;
+
+    for (int i = 0; i < d->object->dynamicProperties.size(); ++i) {
+        QDeclarativeDomDynamicProperty p;
+        p.d = new QDeclarativeDomDynamicPropertyPrivate;
+        p.d->property = d->object->dynamicProperties.at(i);
+        p.d->valid = true;
+
+        if (p.d->property.defaultValue)
+            p.d->property.defaultValue->addref();
+
+        properties.append(p);
+    }
+
+    return properties;
+}
+
+QDeclarativeDomDynamicProperty QDeclarativeDomObject::dynamicProperty(const QByteArray &name) const
+{
+    QDeclarativeDomDynamicProperty p;
+
+    if (!isValid())
+        return p;
+
+    for (int i = 0; i < d->object->dynamicProperties.size(); ++i) {
+        if (d->object->dynamicProperties.at(i).name == name) {
+            p.d = new QDeclarativeDomDynamicPropertyPrivate;
+            p.d->property = d->object->dynamicProperties.at(i);
+            if (p.d->property.defaultValue) p.d->property.defaultValue->addref();
+            p.d->valid = true;
+        }
+    }
+
+    return p;
+}
+
+/*!
+    Returns true if this object is a custom type.  Custom types are special
+    types that allow embeddeding non-QML data, such as SVG or HTML data,
+    directly into QML files.
+
+    \note Currently this method will always return false, and is a placekeeper
+    for future functionality.
+
+    \sa QDeclarativeDomObject::customTypeData()
+*/
+bool QDeclarativeDomObject::isCustomType() const
+{
+    return false;
+}
+
+/*!
+    If this object represents a custom type, returns the data associated with
+    the custom type, otherwise returns an empty QByteArray().
+    QDeclarativeDomObject::isCustomType() can be used to check if this object represents
+    a custom type.
+*/
+QByteArray QDeclarativeDomObject::customTypeData() const
+{
+    return QByteArray();
+}
+
+/*!
+    Returns true if this object is a sub-component object.  Sub-component
+    objects can be converted into QDeclarativeDomComponent instances by calling
+    QDeclarativeDomObject::toComponent().
+
+    \sa QDeclarativeDomObject::toComponent()
+*/
+bool QDeclarativeDomObject::isComponent() const
+{
+    return (d->object && d->object->typeName == "Qt/Component");
+}
+
+/*!
+    Returns a QDeclarativeDomComponent for this object if it is a sub-component, or
+    an invalid QDeclarativeDomComponent if not.  QDeclarativeDomObject::isComponent() can be used
+    to check if this object represents a sub-component.
+
+    \sa QDeclarativeDomObject::isComponent()
+*/
+QDeclarativeDomComponent QDeclarativeDomObject::toComponent() const
+{
+    QDeclarativeDomComponent rv;
+    if (isComponent())
+        rv.d = d;
+    return rv;
+}
+
+/*!
+    Returns the position in the input data where the property assignment started
+, or -1 if the property is invalid.
+*/
+int QDeclarativeDomObject::position() const
+{
+    if (d && d->object)
+        return d->object->location.range.offset;
+    else
+        return -1;
+}
+
+/*!
+    Returns the length in the input data from where the property assignment star
+ted upto the end of it, or -1 if the property is invalid.
+*/
+int QDeclarativeDomObject::length() const
+{
+    if (d && d->object)
+        return d->object->location.range.length;
+    else
+        return -1;
+}
+
+// Returns the URL of the type, if it is an external type, or an empty URL if
+// not
+QUrl QDeclarativeDomObject::url() const
+{
+    if (d && d->object)
+        return d->object->url;
+    else
+        return QUrl();
+}
+
+QDeclarativeDomBasicValuePrivate::QDeclarativeDomBasicValuePrivate()
+: value(0)
+{
+}
+
+QDeclarativeDomBasicValuePrivate::~QDeclarativeDomBasicValuePrivate()
+{
+    if (value) value->release();
+}
+
+/*!
+    \class QDeclarativeDomValueLiteral
+    \internal
+    \brief The QDeclarativeDomValueLiteral class represents a literal value.
+
+    A literal value is a simple value, written inline with the QML.  In the
+    example below, the "x", "y" and "color" properties are being assigned
+    literal values.
+
+    \qml
+Rectangle {
+    x: 10
+    y: 10
+    color: "red"
+}
+    \endqml
+*/
+
+/*!
+    Construct an empty QDeclarativeDomValueLiteral.
+*/
+QDeclarativeDomValueLiteral::QDeclarativeDomValueLiteral():
+    d(new QDeclarativeDomBasicValuePrivate)
+{
+}
+
+/*!
+    Create a copy of \a other QDeclarativeDomValueLiteral.
+*/
+QDeclarativeDomValueLiteral::QDeclarativeDomValueLiteral(const QDeclarativeDomValueLiteral &other)
+: d(other.d)
+{
+}
+
+/*!
+    Destroy the QDeclarativeDomValueLiteral.
+*/
+QDeclarativeDomValueLiteral::~QDeclarativeDomValueLiteral()
+{
+}
+
+/*!
+    Assign \a other to this QDeclarativeDomValueLiteral.
+*/
+QDeclarativeDomValueLiteral &QDeclarativeDomValueLiteral::operator=(const QDeclarativeDomValueLiteral &other)
+{
+    d = other.d;
+    return *this;
+}
+
+/*!
+    Return the literal value.
+
+    In the example below, the literal value will be the string "10".
+    \qml
+Rectangle { x: 10 }
+    \endqml
+*/
+QString QDeclarativeDomValueLiteral::literal() const
+{
+    if (d->value) return d->value->primitive();
+    else return QString();
+}
+
+/*!
+    \class QDeclarativeDomValueBinding
+    \internal
+    \brief The QDeclarativeDomValueBinding class represents a property binding.
+
+    A property binding is an ECMAScript expression assigned to a property.  In
+    the example below, the "x" property is being assigned a property binding.
+
+    \qml
+Rectangle { x: Other.x }
+    \endqml
+*/
+
+/*!
+    Construct an empty QDeclarativeDomValueBinding.
+*/
+QDeclarativeDomValueBinding::QDeclarativeDomValueBinding():
+        d(new QDeclarativeDomBasicValuePrivate)
+{
+}
+
+/*!
+    Create a copy of \a other QDeclarativeDomValueBinding.
+*/
+QDeclarativeDomValueBinding::QDeclarativeDomValueBinding(const QDeclarativeDomValueBinding &other)
+: d(other.d)
+{
+}
+
+/*!
+    Destroy the QDeclarativeDomValueBinding.
+*/
+QDeclarativeDomValueBinding::~QDeclarativeDomValueBinding()
+{
+}
+
+/*!
+    Assign \a other to this QDeclarativeDomValueBinding.
+*/
+QDeclarativeDomValueBinding &QDeclarativeDomValueBinding::operator=(const QDeclarativeDomValueBinding &other)
+{
+    d = other.d;
+    return *this;
+}
+
+/*!
+    Return the binding expression.
+
+    In the example below, the string "Other.x" will be returned.
+    \qml
+Rectangle { x: Other.x }
+    \endqml
+*/
+QString QDeclarativeDomValueBinding::binding() const
+{
+    if (d->value)
+        return d->value->value.asScript();
+    else
+        return QString();
+}
+
+/*!
+    \class QDeclarativeDomValueValueSource
+    \internal
+    \brief The QDeclarativeDomValueValueSource class represents a value source assignment value.
+
+    In QML, value sources are special value generating types that may be
+    assigned to properties.  Value sources inherit the QDeclarativePropertyValueSource
+    class.  In the example below, the "x" property is being assigned the
+    NumberAnimation value source.
+
+    \qml
+Rectangle {
+    x: NumberAnimation {
+        from: 0
+        to: 100
+        loops: Animation.Infinite
+    }
+}
+    \endqml
+*/
+
+/*!
+    Construct an empty QDeclarativeDomValueValueSource.
+*/
+QDeclarativeDomValueValueSource::QDeclarativeDomValueValueSource():
+        d(new QDeclarativeDomBasicValuePrivate)
+{
+}
+
+/*!
+    Create a copy of \a other QDeclarativeDomValueValueSource.
+*/
+QDeclarativeDomValueValueSource::QDeclarativeDomValueValueSource(const QDeclarativeDomValueValueSource &other)
+: d(other.d)
+{
+}
+
+/*!
+    Destroy the QDeclarativeDomValueValueSource.
+*/
+QDeclarativeDomValueValueSource::~QDeclarativeDomValueValueSource()
+{
+}
+
+/*!
+    Assign \a other to this QDeclarativeDomValueValueSource.
+*/
+QDeclarativeDomValueValueSource &QDeclarativeDomValueValueSource::operator=(const QDeclarativeDomValueValueSource &other)
+{
+    d = other.d;
+    return *this;
+}
+
+/*!
+    Return the value source object.
+
+    In the example below, an object representing the NumberAnimation will be
+    returned.
+    \qml
+Rectangle {
+    x: NumberAnimation {
+        from: 0
+        to: 100
+        loops: Animation.Infinite
+    }
+}
+    \endqml
+*/
+QDeclarativeDomObject QDeclarativeDomValueValueSource::object() const
+{
+    QDeclarativeDomObject rv;
+    if (d->value) {
+        rv.d->object = d->value->object;
+        rv.d->object->addref();
+    }
+    return rv;
+}
+
+/*!
+    \class QDeclarativeDomValueValueInterceptor
+    \internal
+    \brief The QDeclarativeDomValueValueInterceptor class represents a value interceptor assignment value.
+
+    In QML, value interceptor are special write-intercepting types that may be
+    assigned to properties.  Value interceptor inherit the QDeclarativePropertyValueInterceptor
+    class.  In the example below, the "x" property is being assigned the
+    Behavior value interceptor.
+
+    \qml
+Rectangle {
+    Behavior on x { NumberAnimation { duration: 500 } }
+}
+    \endqml
+*/
+
+/*!
+    Construct an empty QDeclarativeDomValueValueInterceptor.
+*/
+QDeclarativeDomValueValueInterceptor::QDeclarativeDomValueValueInterceptor():
+        d(new QDeclarativeDomBasicValuePrivate)
+{
+}
+
+/*!
+    Create a copy of \a other QDeclarativeDomValueValueInterceptor.
+*/
+QDeclarativeDomValueValueInterceptor::QDeclarativeDomValueValueInterceptor(const QDeclarativeDomValueValueInterceptor &other)
+: d(other.d)
+{
+}
+
+/*!
+    Destroy the QDeclarativeDomValueValueInterceptor.
+*/
+QDeclarativeDomValueValueInterceptor::~QDeclarativeDomValueValueInterceptor()
+{
+}
+
+/*!
+    Assign \a other to this QDeclarativeDomValueValueInterceptor.
+*/
+QDeclarativeDomValueValueInterceptor &QDeclarativeDomValueValueInterceptor::operator=(const QDeclarativeDomValueValueInterceptor &other)
+{
+    d = other.d;
+    return *this;
+}
+
+/*!
+    Return the value interceptor object.
+
+    In the example below, an object representing the Behavior will be
+    returned.
+    \qml
+Rectangle {
+    Behavior on x { NumberAnimation { duration: 500 } }
+}
+    \endqml
+*/
+QDeclarativeDomObject QDeclarativeDomValueValueInterceptor::object() const
+{
+    QDeclarativeDomObject rv;
+    if (d->value) {
+        rv.d->object = d->value->object;
+        rv.d->object->addref();
+    }
+    return rv;
+}
+
+QDeclarativeDomValuePrivate::QDeclarativeDomValuePrivate()
+: property(0), value(0)
+{
+}
+
+QDeclarativeDomValuePrivate::~QDeclarativeDomValuePrivate()
+{
+    if (property) property->release();
+    if (value) value->release();
+}
+
+/*!
+    \class QDeclarativeDomValue
+    \internal
+    \brief The QDeclarativeDomValue class represents a generic Qml value.
+
+    QDeclarativeDomValue's can be assigned to QML \l {QDeclarativeDomProperty}{properties}.  In
+    QML, properties can be assigned various different values, including basic
+    literals, property bindings, property value sources, objects and lists of
+    values.  The QDeclarativeDomValue class allows a programmer to determine the specific
+    value type being assigned and access more detailed information through a
+    corresponding value type class.
+
+    For example, in the following example,
+
+    \qml
+Text {
+    text: "Hello World!"
+    y: Other.y
+}
+    \endqml
+
+    The text property is being assigned a literal, and the y property a property
+    binding.  To output the values assigned to the text and y properties in the
+    above example from C++,
+
+    \code
+    QDeclarativeDomDocument document;
+    QDeclarativeDomObject root = document.rootObject();
+
+    QDeclarativeDomProperty text = root.property("text");
+    if (text.value().isLiteral()) {
+        QDeclarativeDomValueLiteral literal = text.value().toLiteral();
+        qDebug() << literal.literal();
+    }
+
+    QDeclarativeDomProperty y = root.property("y");
+    if (y.value().isBinding()) {
+        QDeclarativeDomValueBinding binding = y.value().toBinding();
+        qDebug() << binding.binding();
+    }
+    \endcode
+*/
+
+/*!
+    Construct an invalid QDeclarativeDomValue.
+*/
+QDeclarativeDomValue::QDeclarativeDomValue()
+: d(new QDeclarativeDomValuePrivate)
+{
+}
+
+/*!
+    Create a copy of \a other QDeclarativeDomValue.
+*/
+QDeclarativeDomValue::QDeclarativeDomValue(const QDeclarativeDomValue &other)
+: d(other.d)
+{
+}
+
+/*!
+    Destroy the QDeclarativeDomValue
+*/
+QDeclarativeDomValue::~QDeclarativeDomValue()
+{
+}
+
+/*!
+    Assign \a other to this QDeclarativeDomValue.
+*/
+QDeclarativeDomValue &QDeclarativeDomValue::operator=(const QDeclarativeDomValue &other)
+{
+    d = other.d;
+    return *this;
+}
+
+/*!
+    \enum QDeclarativeDomValue::Type
+
+    The type of the QDeclarativeDomValue node.
+
+    \value Invalid The QDeclarativeDomValue is invalid.
+    \value Literal The QDeclarativeDomValue is a literal value assignment.  Use QDeclarativeDomValue::toLiteral() to access the type instance.
+    \value PropertyBinding The QDeclarativeDomValue is a property binding.  Use QDeclarativeDomValue::toBinding() to access the type instance.
+    \value ValueSource The QDeclarativeDomValue is a property value source.  Use QDeclarativeDomValue::toValueSource() to access the type instance.
+    \value ValueInterceptor The QDeclarativeDomValue is a property value interceptor.  Use QDeclarativeDomValue::toValueInterceptor() to access the type instance.
+    \value Object The QDeclarativeDomValue is an object assignment.  Use QDeclarativeDomValue::toObject() to access the type instnace.
+    \value List The QDeclarativeDomValue is a list of other values.  Use QDeclarativeDomValue::toList() to access the type instance.
+*/
+
+/*!
+    Returns the type of this QDeclarativeDomValue.
+*/
+QDeclarativeDomValue::Type QDeclarativeDomValue::type() const
+{
+    if (d->property)
+        if (QDeclarativeMetaType::isList(d->property->type) ||
+           (d->property && (d->property->values.count() + d->property->onValues.count()) > 1))
+            return List;
+
+    QDeclarativeParser::Value *value = d->value;
+    if (!value && !d->property)
+        return Invalid;
+
+    switch(value->type) {
+    case QDeclarativeParser::Value::Unknown:
+        return Invalid;
+    case QDeclarativeParser::Value::Literal:
+        return Literal;
+    case QDeclarativeParser::Value::PropertyBinding:
+        return PropertyBinding;
+    case QDeclarativeParser::Value::ValueSource:
+        return ValueSource;
+    case QDeclarativeParser::Value::ValueInterceptor:
+        return ValueInterceptor;
+    case QDeclarativeParser::Value::CreatedObject:
+        return Object;
+    case QDeclarativeParser::Value::SignalObject:
+        return Invalid;
+    case QDeclarativeParser::Value::SignalExpression:
+        return Literal;
+    case QDeclarativeParser::Value::Id:
+        return Literal;
+    }
+    return Invalid;
+}
+
+/*!
+    Returns true if this is an invalid value, otherwise false.
+*/
+bool QDeclarativeDomValue::isInvalid() const
+{
+    return type() == Invalid;
+}
+
+/*!
+    Returns true if this is a literal value, otherwise false.
+*/
+bool QDeclarativeDomValue::isLiteral() const
+{
+    return type() == Literal;
+}
+
+/*!
+    Returns true if this is a property binding value, otherwise false.
+*/
+bool QDeclarativeDomValue::isBinding() const
+{
+    return type() == PropertyBinding;
+}
+
+/*!
+    Returns true if this is a value source value, otherwise false.
+*/
+bool QDeclarativeDomValue::isValueSource() const
+{
+    return type() == ValueSource;
+}
+
+/*!
+    Returns true if this is a value interceptor value, otherwise false.
+*/
+bool QDeclarativeDomValue::isValueInterceptor() const
+{
+    return type() == ValueInterceptor;
+}
+
+/*!
+    Returns true if this is an object value, otherwise false.
+*/
+bool QDeclarativeDomValue::isObject() const
+{
+    return type() == Object;
+}
+
+/*!
+    Returns true if this is a list value, otherwise false.
+*/
+bool QDeclarativeDomValue::isList() const
+{
+    return type() == List;
+}
+
+/*!
+    Returns a QDeclarativeDomValueLiteral if this value is a literal type, otherwise
+    returns an invalid QDeclarativeDomValueLiteral.
+
+    \sa QDeclarativeDomValue::type()
+*/
+QDeclarativeDomValueLiteral QDeclarativeDomValue::toLiteral() const
+{
+    QDeclarativeDomValueLiteral rv;
+    if (type() == Literal) {
+        rv.d->value = d->value;
+        rv.d->value->addref();
+    }
+    return rv;
+}
+
+/*!
+    Returns a QDeclarativeDomValueBinding if this value is a property binding type,
+    otherwise returns an invalid QDeclarativeDomValueBinding.
+
+    \sa QDeclarativeDomValue::type()
+*/
+QDeclarativeDomValueBinding QDeclarativeDomValue::toBinding() const
+{
+    QDeclarativeDomValueBinding rv;
+    if (type() == PropertyBinding) {
+        rv.d->value = d->value;
+        rv.d->value->addref();
+    }
+    return rv;
+}
+
+/*!
+    Returns a QDeclarativeDomValueValueSource if this value is a property value source
+    type, otherwise returns an invalid QDeclarativeDomValueValueSource.
+
+    \sa QDeclarativeDomValue::type()
+*/
+QDeclarativeDomValueValueSource QDeclarativeDomValue::toValueSource() const
+{
+    QDeclarativeDomValueValueSource rv;
+    if (type() == ValueSource) {
+        rv.d->value = d->value;
+        rv.d->value->addref();
+    }
+    return rv;
+}
+
+/*!
+    Returns a QDeclarativeDomValueValueInterceptor if this value is a property value interceptor
+    type, otherwise returns an invalid QDeclarativeDomValueValueInterceptor.
+
+    \sa QDeclarativeDomValue::type()
+*/
+QDeclarativeDomValueValueInterceptor QDeclarativeDomValue::toValueInterceptor() const
+{
+    QDeclarativeDomValueValueInterceptor rv;
+    if (type() == ValueInterceptor) {
+        rv.d->value = d->value;
+        rv.d->value->addref();
+    }
+    return rv;
+}
+
+/*!
+    Returns a QDeclarativeDomObject if this value is an object assignment type, otherwise
+    returns an invalid QDeclarativeDomObject.
+
+    \sa QDeclarativeDomValue::type()
+*/
+QDeclarativeDomObject QDeclarativeDomValue::toObject() const
+{
+    QDeclarativeDomObject rv;
+    if (type() == Object) {
+        rv.d->object = d->value->object;
+        rv.d->object->addref();
+    }
+    return rv;
+}
+
+/*!
+    Returns a QDeclarativeDomList if this value is a list type, otherwise returns an
+    invalid QDeclarativeDomList.
+
+    \sa QDeclarativeDomValue::type()
+*/
+QDeclarativeDomList QDeclarativeDomValue::toList() const
+{
+    QDeclarativeDomList rv;
+    if (type() == List) {
+        rv.d = d;
+    }
+    return rv;
+}
+
+/*!
+    Returns the position in the input data where the property value startd, or -1
+ if the value is invalid.
+*/
+int QDeclarativeDomValue::position() const
+{
+    if (type() == Invalid)
+        return -1;
+    else
+        return d->value->location.range.offset;
+}
+
+/*!
+    Returns the length in the input data from where the property value started u
+pto the end of it, or -1 if the value is invalid.
+*/
+int QDeclarativeDomValue::length() const
+{
+    if (type() == Invalid)
+        return -1;
+    else
+        return d->value->location.range.length;
+}
+
+/*!
+    \class QDeclarativeDomList
+    \internal
+    \brief The QDeclarativeDomList class represents a list of values assigned to a QML property.
+
+    Lists of values can be assigned to properties.  For example, the following
+    example assigns multiple objects to Item's "children" property
+    \qml
+Item {
+    children: [
+        Text { },
+        Rectangle { }
+    ]
+}
+    \endqml
+
+    Lists can also be implicitly created by assigning multiple
+    \l {QDeclarativeDomValueValueSource}{value sources} or constants to a property.
+    \qml
+Item {
+    x: 10
+    x: NumberAnimation {
+        running: false
+        from: 0
+        to: 100
+    }
+}
+    \endqml
+*/
+
+/*!
+    Construct an empty QDeclarativeDomList.
+*/
+QDeclarativeDomList::QDeclarativeDomList()
+{
+}
+
+/*!
+    Create a copy of \a other QDeclarativeDomList.
+*/
+QDeclarativeDomList::QDeclarativeDomList(const QDeclarativeDomList &other)
+: d(other.d)
+{
+}
+
+/*!
+    Destroy the QDeclarativeDomList.
+*/
+QDeclarativeDomList::~QDeclarativeDomList()
+{
+}
+
+/*!
+    Assign \a other to this QDeclarativeDomList.
+*/
+QDeclarativeDomList &QDeclarativeDomList::operator=(const QDeclarativeDomList &other)
+{
+    d = other.d;
+    return *this;
+}
+
+/*!
+    Returns the list of QDeclarativeDomValue's.
+*/
+QList<QDeclarativeDomValue> QDeclarativeDomList::values() const
+{
+    QList<QDeclarativeDomValue> rv;
+    if (!d->property)
+        return rv;
+
+    for (int ii = 0; ii < d->property->values.count(); ++ii) {
+        QDeclarativeDomValue v;
+        v.d->value = d->property->values.at(ii);
+        v.d->value->addref();
+        rv << v;
+    }
+
+    for (int ii = 0; ii < d->property->onValues.count(); ++ii) {
+        QDeclarativeDomValue v;
+        v.d->value = d->property->onValues.at(ii);
+        v.d->value->addref();
+        rv << v;
+    }
+
+    return rv;
+}
+
+/*!
+    Returns the position in the input data where the list started, or -1 if
+ the property is invalid.
+*/
+int QDeclarativeDomList::position() const
+{
+    if (d && d->property) {
+        return d->property->listValueRange.offset;
+    } else
+        return -1;
+}
+
+/*!
+    Returns the length in the input data from where the list started upto
+ the end of it, or 0 if the property is invalid.
+*/
+int QDeclarativeDomList::length() const
+{
+    if (d && d->property)
+        return d->property->listValueRange.length;
+    else
+        return -1;
+}
+
+/*!
+  Returns a list of positions of the commas in the QML file.
+*/
+QList<int> QDeclarativeDomList:: commaPositions() const
+{
+    if (d && d->property)
+        return d->property->listCommaPositions;
+    else
+        return QList<int>();
+}
+
+/*!
+    \class QDeclarativeDomComponent
+    \internal
+    \brief The QDeclarativeDomComponent class represents sub-component within a QML document.
+
+    Sub-components are QDeclarativeComponents defined within a QML document.  The
+    following example shows the definition of a sub-component with the id
+    "listDelegate".
+
+    \qml
+Item {
+    Component {
+        id: listDelegate
+        Text {
+            text: modelData.text
+        }
+    }
+}
+    \endqml
+
+    Like QDeclarativeDomDocument's, components contain a single root object.
+*/
+
+/*!
+    Construct an empty QDeclarativeDomComponent.
+*/
+QDeclarativeDomComponent::QDeclarativeDomComponent()
+{
+}
+
+/*!
+    Create a copy of \a other QDeclarativeDomComponent.
+*/
+QDeclarativeDomComponent::QDeclarativeDomComponent(const QDeclarativeDomComponent &other)
+: QDeclarativeDomObject(other)
+{
+}
+
+/*!
+    Destroy the QDeclarativeDomComponent.
+*/
+QDeclarativeDomComponent::~QDeclarativeDomComponent()
+{
+}
+
+/*!
+    Assign \a other to this QDeclarativeDomComponent.
+*/
+QDeclarativeDomComponent &QDeclarativeDomComponent::operator=(const QDeclarativeDomComponent &other)
+{
+    static_cast<QDeclarativeDomObject &>(*this) = other;
+    return *this;
+}
+
+/*!
+    Returns the component's root object.
+
+    In the example below, the root object is the "Text" object.
+    \qml
+Item {
+    Component {
+        id: listDelegate
+        Text {
+            text: modelData.text
+        }
+    }
+}
+    \endqml
+*/
+QDeclarativeDomObject QDeclarativeDomComponent::componentRoot() const
+{
+    QDeclarativeDomObject rv;
+    if (d->object) {
+        QDeclarativeParser::Object *obj = 0;
+        if (d->object->defaultProperty &&
+           d->object->defaultProperty->values.count() == 1 &&
+           d->object->defaultProperty->values.at(0)->object)
+            obj = d->object->defaultProperty->values.at(0)->object;
+
+        if (obj) {
+            rv.d->object = obj;
+            rv.d->object->addref();
+        }
+    }
+
+    return rv;
+}
+
+QDeclarativeDomImportPrivate::QDeclarativeDomImportPrivate()
+: type(File)
+{
+}
+
+QDeclarativeDomImportPrivate::~QDeclarativeDomImportPrivate()
+{
+}
+
+/*!
+    \class QDeclarativeDomImport
+    \internal
+    \brief The QDeclarativeDomImport class represents an import statement.
+*/
+
+/*!
+    Construct an empty QDeclarativeDomImport.
+*/
+QDeclarativeDomImport::QDeclarativeDomImport()
+: d(new QDeclarativeDomImportPrivate)
+{
+}
+
+/*!
+    Create a copy of \a other QDeclarativeDomImport.
+*/
+QDeclarativeDomImport::QDeclarativeDomImport(const QDeclarativeDomImport &other)
+: d(other.d)
+{
+}
+
+/*!
+    Destroy the QDeclarativeDomImport.
+*/
+QDeclarativeDomImport::~QDeclarativeDomImport()
+{
+}
+
+/*!
+    Assign \a other to this QDeclarativeDomImport.
+*/
+QDeclarativeDomImport &QDeclarativeDomImport::operator=(const QDeclarativeDomImport &other)
+{
+    d = other.d;
+    return *this;
+}
+
+/*!
+  Returns the type of the import.
+  */
+QDeclarativeDomImport::Type QDeclarativeDomImport::type() const
+{
+    return static_cast<QDeclarativeDomImport::Type>(d->type);
+}
+
+/*!
+  Returns the URI of the import (e.g. 'subdir' or 'com.nokia.Qt')
+  */
+QString QDeclarativeDomImport::uri() const
+{
+    return d->uri;
+}
+
+/*!
+  Returns the version specified by the import. An empty string if no version was specified.
+  */
+QString QDeclarativeDomImport::version() const
+{
+    return d->version;
+}
+
+/*!
+  Returns the (optional) qualifier string (the token following the 'as' keyword) of the import.
+  */
+QString QDeclarativeDomImport::qualifier() const
+{
+    return d->qualifier;
+}
+
+QT_END_NAMESPACE