summaryrefslogtreecommitdiffstats
path: root/src/declarative
diff options
context:
space:
mode:
authorMartin Jones <martin.jones@nokia.com>2009-08-24 23:11:26 (GMT)
committerMartin Jones <martin.jones@nokia.com>2009-08-24 23:11:26 (GMT)
commit6d57d71824ba67cfed07bcb27ab62349ee7d4c6e (patch)
treea55d522d56ca64c7a970da861ffc4b48b33623ef /src/declarative
parenta33e3d8a7fefc3d2ad254dcb76a127b068b7c63d (diff)
parent9e2114fa326be128b03268865b39ddb2731e0173 (diff)
downloadQt-6d57d71824ba67cfed07bcb27ab62349ee7d4c6e.zip
Qt-6d57d71824ba67cfed07bcb27ab62349ee7d4c6e.tar.gz
Qt-6d57d71824ba67cfed07bcb27ab62349ee7d4c6e.tar.bz2
Merge branch 'kinetic-declarativeui' of git@scm.dev.nokia.troll.no:qt/kinetic into kinetic-declarativeui
Diffstat (limited to 'src/declarative')
-rw-r--r--src/declarative/qml/qmlcompositetypemanager.cpp19
-rw-r--r--src/declarative/qml/qmldom.cpp150
-rw-r--r--src/declarative/qml/qmldom.h16
-rw-r--r--src/declarative/qml/qmlengine.cpp111
-rw-r--r--src/declarative/qml/qmlengine_p.h18
-rw-r--r--src/declarative/qml/qmlparser.cpp2
-rw-r--r--src/declarative/qml/qmlparser_p.h5
-rw-r--r--src/declarative/qml/qmlscriptparser.cpp12
8 files changed, 167 insertions, 166 deletions
diff --git a/src/declarative/qml/qmlcompositetypemanager.cpp b/src/declarative/qml/qmlcompositetypemanager.cpp
index 0fb6c86..5bf2dc0 100644
--- a/src/declarative/qml/qmlcompositetypemanager.cpp
+++ b/src/declarative/qml/qmlcompositetypemanager.cpp
@@ -327,8 +327,23 @@ void QmlCompositeTypeManager::compile(QmlCompositeTypeData *unit)
}
QUrl url;
- if (!QmlEnginePrivate::get(engine)->resolveType(unit->imports, typeName, &ref.type, &url)) {
- // XXX could produce error message here.
+ QmlEnginePrivate::ImportedNamespace *s;
+ QByteArray localTypeName;
+
+ QmlEnginePrivate::get(engine)->resolveNamespace(unit->imports, typeName, &s, &localTypeName);
+ if (QmlEnginePrivate::get(engine)->resolveTypeInNamespace(s, localTypeName, &ref.type, &url)) {
+ int majorVersion;
+ int minorVersion;
+ if (s->getTypeInfo(localTypeName, 0, &majorVersion, &minorVersion)) {
+ foreach (QmlParser::Object *obj, parserRef->refObjects) {
+ // store namespace for DOM
+ obj->majorVersion = majorVersion;
+ obj->minorVersion = minorVersion;
+ }
+ }
+ } else {
+ // try base url
+ url = unit->imports.baseUrl().resolved(QUrl(QLatin1String(typeName + ".qml")));
}
if (ref.type) {
diff --git a/src/declarative/qml/qmldom.cpp b/src/declarative/qml/qmldom.cpp
index 22a8e49..2aaf492 100644
--- a/src/declarative/qml/qmldom.cpp
+++ b/src/declarative/qml/qmldom.cpp
@@ -76,15 +76,11 @@ QmlDomDocumentPrivate::~QmlDomDocumentPrivate()
\brief The QmlDomDocument 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 version number, accessible through
- QmlDomDocument::version(), and a root object, accessible through
+ single file. Each document has a root object, accessible through
QmlDomDocument::rootObject().
- The QmlDomDocument class allows the programmer to load a QML document, by
- calling QmlDomDocument::load(), manipulate it and save it to textual form
- by calling QmlDomDocument::save(). By using the QML DOM API, editors can
- non-destructively modify a QML document even if they only understand a
- subset of the total QML functionality.
+ The QmlDomDocument class allows the programmer to inspect a QML document by
+ calling QmlDomDocument::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.
@@ -136,15 +132,6 @@ QmlDomDocument &QmlDomDocument::operator=(const QmlDomDocument &other)
}
/*!
- Return the version number of the Qml document. Currently only version
- 1 exists.
-*/
-int QmlDomDocument::version() const
-{
- return 1;
-}
-
-/*!
Returns all import statements in qml.
*/
QList<QmlDomImport> QmlDomDocument::imports() const
@@ -157,7 +144,7 @@ QList<QmlDomImport> QmlDomDocument::imports() const
data. On success, true is returned. If the \a data is malformed, false
is returned and QmlDomDocument::loadError() contains an error description.
- \sa QmlDomDocument::save() QmlDomDocument::loadError()
+ \sa QmlDomDocument::loadError()
*/
bool QmlDomDocument::load(QmlEngine *engine, const QByteArray &data, const QUrl &url)
{
@@ -224,17 +211,6 @@ QList<QmlError> QmlDomDocument::errors() const
}
/*!
- Return a saved copy of the QmlDomDocument. The returned data will be valid
- QML XML data.
-
- \sa load()
-*/
-QByteArray QmlDomDocument::save() const
-{
- return QByteArray();
-}
-
-/*!
Returns the document's root object, or an invalid QmlDomObject if the
document has no root.
@@ -417,15 +393,6 @@ QmlDomValue QmlDomProperty::value() const
}
/*!
- Sets the QmlDomValue that is assigned to this property to \a value.
-*/
-void QmlDomProperty::setValue(const QmlDomValue &value)
-{
- Q_UNUSED(value);
- qWarning("QmlDomProperty::setValue(const QmlDomValue &): Not Implemented");
-}
-
-/*!
Returns the position in the input data where the property ID startd, or -1 if
the property is invalid.
*/
@@ -689,11 +656,6 @@ QGraphicsWidget {
"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.
-
- The DOM tree can be modified to include new property assignments by calling
- QmlDomObject::addProperty(). Existing property assignments can be modified
- through the QmlDomProperty::setValue() method, or removed entirely by
- calling QmlDomObject::removeProperty().
*/
/*!
@@ -776,6 +738,21 @@ QByteArray QmlDomObject::objectClassName() const
return QByteArray();
}
+int QmlDomObject::objectTypeMajorVersion() const
+{
+ if (d->object)
+ return d->object->majorVersion;
+ else
+ return -1;
+}
+
+int QmlDomObject::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
@@ -793,17 +770,6 @@ QString QmlDomObject::objectId() const
}
/*!
- Set the object \a id. If any other object within the DOM tree has the same
- id, the other object's id will be cleared.
-*/
-void QmlDomObject::setObjectId(const QByteArray &id)
-{
- Q_UNUSED(id);
- qWarning("QmlDomObject::setObjectId(const QByteArray &): Not implemented");
-}
-
-
-/*!
Returns the list of assigned properties on this object.
In the following example, "text" and "x" properties would be returned.
@@ -863,27 +829,6 @@ QmlDomProperty QmlDomObject::property(const QByteArray &name) const
return QmlDomProperty();
}
-/*!
- Remove the property \a name from this object, if it exists. Otherwise does
- nothing.
-*/
-void QmlDomObject::removeProperty(const QByteArray &name)
-{
- Q_UNUSED(name);
- qWarning("QmlDomObject::removeProperty(const QByteArray &): Not implemented");
-}
-
-/*!
- Adds the property \a name with the specified \a value to this object. If
- a property by \a name already exists, it will be removed.
-*/
-void QmlDomObject::addProperty(const QByteArray &name, const QmlDomValue &value)
-{
- Q_UNUSED(name);
- Q_UNUSED(value);
- qWarning("QmlDomObject::addProperty(const QByteArray &, const QmlDomValue &): Not implemented");
-}
-
QList<QmlDomDynamicProperty> QmlDomObject::dynamicProperties() const
{
QList<QmlDomDynamicProperty> properties;
@@ -935,18 +880,6 @@ bool QmlDomObject::isCustomType() const
}
/*!
- Sets the custom type \a data. If this type is not a custom type, this
- method does nothing.
-
- \sa QmlDomObject::isCustomType() QmlDomObject::customTypeData()
-*/
-void QmlDomObject::setCustomTypeData(const QByteArray &data)
-{
- Q_UNUSED(data);
- qWarning("QmlDomObject::setCustomTypeData(const QByteArray &): Not implemented");
-}
-
-/*!
If this object represents a custom type, returns the data associated with
the custom type, otherwise returns an empty QByteArray().
QmlDomObject::isCustomType() can be used to check if this object represents
@@ -1101,15 +1034,6 @@ QString QmlDomValueLiteral::literal() const
}
/*!
- Sets the literal \a value.
-*/
-void QmlDomValueLiteral::setLiteral(const QString &value)
-{
- Q_UNUSED(value);
- qWarning("QmlDomValueLiteral::setLiteral(const QString &): Not implemented");
-}
-
-/*!
\class QmlDomValueBinding
\internal
\brief The QmlDomValueBinding class represents a property binding.
@@ -1171,15 +1095,6 @@ QString QmlDomValueBinding::binding() const
}
/*!
- Sets the binding \a expression.
-*/
-void QmlDomValueBinding::setBinding(const QString &expression)
-{
- Q_UNUSED(expression);
- qWarning("QmlDomValueBinding::setBinding(const QString &): Not implemented");
-}
-
-/*!
\class QmlDomValueValueSource
\internal
\brief The QmlDomValueValueSource class represents a value source assignment value.
@@ -1259,14 +1174,6 @@ QmlDomObject QmlDomValueValueSource::object() const
return rv;
}
-/*!
- Sets the value source \a object.
-*/
-void QmlDomValueValueSource::setObject(const QmlDomObject &object)
-{
- Q_UNUSED(object);
- qWarning("QmlDomValueValueSource::setObject(const QmlDomObject &): Not implemented");
-}
QmlDomValuePrivate::QmlDomValuePrivate()
: property(0), value(0)
@@ -1644,15 +1551,6 @@ QList<QmlDomValue> QmlDomList::values() const
}
/*!
- Set the list of QmlDomValue's to \a values.
-*/
-void QmlDomList::setValues(const QList<QmlDomValue> &values)
-{
- Q_UNUSED(values);
- qWarning("QmlDomList::setValues(const QList<QmlDomValue> &): Not implemented");
-}
-
-/*!
Returns the position in the input data where the list started, or -1 if
the property is invalid.
*/
@@ -1778,16 +1676,6 @@ QmlDomObject QmlDomComponent::componentRoot() const
return rv;
}
-/*!
- Set the component's \a root object.
-*/
-void QmlDomComponent::setComponentRoot(const QmlDomObject &root)
-{
- Q_UNUSED(root);
- qWarning("QmlDomComponent::setComponentRoot(const QmlDomObject &): Not implemented");
-}
-
-
QmlDomImportPrivate::QmlDomImportPrivate()
: type(File)
{
diff --git a/src/declarative/qml/qmldom.h b/src/declarative/qml/qmldom.h
index 32ed2da..f344bb2 100644
--- a/src/declarative/qml/qmldom.h
+++ b/src/declarative/qml/qmldom.h
@@ -72,12 +72,10 @@ public:
~QmlDomDocument();
QmlDomDocument &operator=(const QmlDomDocument &);
- int version() const;
QList<QmlDomImport> imports() const;
QList<QmlError> errors() const;
bool load(QmlEngine *, const QByteArray &, const QUrl & = QUrl());
- QByteArray save() const;
QmlDomObject rootObject() const;
@@ -100,7 +98,6 @@ public:
bool isDefaultProperty() const;
QmlDomValue value() const;
- void setValue(const QmlDomValue &);
int position() const;
int length() const;
@@ -152,21 +149,19 @@ public:
QByteArray objectType() const;
QByteArray objectClassName() const;
+ int objectTypeMajorVersion() const;
+ int objectTypeMinorVersion() const;
+
QString objectId() const;
- void setObjectId(const QByteArray &);
QList<QmlDomProperty> properties() const;
QmlDomProperty property(const QByteArray &) const;
- void removeProperty(const QByteArray &);
- void addProperty(const QByteArray &, const QmlDomValue &);
-
QList<QmlDomDynamicProperty> dynamicProperties() const;
QmlDomDynamicProperty dynamicProperty(const QByteArray &) const;
bool isCustomType() const;
QByteArray customTypeData() const;
- void setCustomTypeData(const QByteArray &);
bool isComponent() const;
QmlDomComponent toComponent() const;
@@ -194,7 +189,6 @@ public:
QmlDomValueLiteral &operator=(const QmlDomValueLiteral &);
QString literal() const;
- void setLiteral(const QString &);
private:
friend class QmlDomValue;
@@ -210,7 +204,6 @@ public:
QmlDomValueBinding &operator=(const QmlDomValueBinding &);
QString binding() const;
- void setBinding(const QString &);
private:
friend class QmlDomValue;
@@ -226,7 +219,6 @@ public:
QmlDomValueValueSource &operator=(const QmlDomValueValueSource &);
QmlDomObject object() const;
- void setObject(const QmlDomObject &);
private:
friend class QmlDomValue;
@@ -242,7 +234,6 @@ public:
QmlDomComponent &operator=(const QmlDomComponent &);
QmlDomObject componentRoot() const;
- void setComponentRoot(const QmlDomObject &);
};
class Q_DECLARATIVE_EXPORT QmlDomValue
@@ -295,7 +286,6 @@ public:
QmlDomList &operator=(const QmlDomList &);
QList<QmlDomValue> values() const;
- void setValues(const QList<QmlDomValue> &);
int position() const;
int length() const;
diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp
index 351bd8a..fd18b26 100644
--- a/src/declarative/qml/qmlengine.cpp
+++ b/src/declarative/qml/qmlengine.cpp
@@ -1072,7 +1072,7 @@ void QmlObjectScriptClass::setProperty(QScriptValue &object,
}
-struct QmlEnginePrivate::ImportedNamespace {
+struct QmlImportedNamespacePrivate {
QStringList urls;
QList<int> majversions;
QList<int> minversions;
@@ -1177,10 +1177,10 @@ public:
} else {
url = base.resolved(QUrl(url)).toString();
}
- s->urls.append(url);
- s->majversions.append(vmaj);
- s->minversions.append(vmin);
- s->isLibrary.append(importType == QmlScriptParser::Import::Library);
+ s->d->urls.append(url);
+ s->d->majversions.append(vmaj);
+ s->d->minversions.append(vmin);
+ s->d->isLibrary.append(importType == QmlScriptParser::Import::Library);
return true;
}
@@ -1202,7 +1202,7 @@ public:
}
QString unqualifiedtype = type.mid(slash+1);
if (s)
- return s->find(unqualifiedtype);
+ return s->d->find(unqualifiedtype);
else
return QUrl();
}
@@ -1226,16 +1226,37 @@ public:
}
QByteArray unqualifiedtype = slash < 0 ? type : type.mid(slash+1); // common-case opt (QString::mid works fine, but slower)
if (s)
- return s->findBuiltin(unqualifiedtype,found);
+ return s->d->findBuiltin(unqualifiedtype,found);
else
return 0;
- }
+ }
QmlEnginePrivate::ImportedNamespace *findNamespace(const QString& type)
{
return set.value(type);
}
+ void resolveNamespace(const QByteArray &type, QmlEnginePrivate::ImportedNamespace **ns, QByteArray *unqualifiedType)
+ {
+ QmlEnginePrivate::ImportedNamespace *s = 0;
+ int slash = type.indexOf('/');
+ if (slash >= 0) {
+ while (!s) {
+ s = set.value(QString::fromLatin1(type.left(slash)));
+ int nslash = type.indexOf('/',slash+1);
+ if (nslash > 0)
+ slash = nslash;
+ else
+ break;
+ }
+ } else {
+ s = &unqualifiedset;
+ }
+
+ *ns = s;
+ *unqualifiedType = slash < 0 ? type : type.mid(slash+1); // common-case opt (QString::mid works fine, but slower)
+ }
+
private:
QmlEnginePrivate::ImportedNamespace unqualifiedset;
QHash<QString,QmlEnginePrivate::ImportedNamespace* > set;
@@ -1258,6 +1279,37 @@ void QmlEnginePrivate::Imports::setBaseUrl(const QUrl& url)
base = url;
}
+QmlEnginePrivate::ImportedNamespace::ImportedNamespace()
+ : d(new QmlImportedNamespacePrivate)
+{
+}
+
+QmlEnginePrivate::ImportedNamespace::~ImportedNamespace()
+{
+ delete d;
+}
+
+bool QmlEnginePrivate::ImportedNamespace::getTypeInfo(const QByteArray &typeName, QString *uri, int *majorVersion, int *minorVersion)
+{
+ for (int i=0; i<d->urls.count(); ++i) {
+ int vmaj = d->majversions.at(i);
+ int vmin = d->minversions.at(i);
+ QByteArray qt = d->urls.at(i).toLatin1();
+ qt += "/";
+ qt += typeName;
+ if (QmlMetaType::qmlType(qt,vmaj,vmin)) {
+ if (uri)
+ *uri = d->urls.at(i);
+ if (majorVersion)
+ *majorVersion = d->majversions.at(i);
+ if (minorVersion)
+ *minorVersion = d->minversions.at(i);
+ return true;
+ }
+ }
+ return false;
+}
+
/*!
Adds \a path as a directory where installed QML components are
defined in a URL-based directory structure.
@@ -1312,11 +1364,6 @@ bool QmlEnginePrivate::addToImport(Imports* imports, const QString& uri, const Q
*/
bool QmlEnginePrivate::resolveType(const Imports& imports, const QByteArray& type, QmlType** type_return, QUrl* url_return, ImportedNamespace** ns_return) const
{
- if (ns_return) {
- *ns_return = imports.d->findNamespace(QLatin1String(type));
- if (*ns_return)
- return true;
- }
if (type_return) {
QmlType* t = imports.d->findBuiltin(type);
if (!t) t = QmlMetaType::qmlType(type,0,0); // Try global namespace
@@ -1339,6 +1386,11 @@ bool QmlEnginePrivate::resolveType(const Imports& imports, const QByteArray& typ
return true;
}
}
+ if (ns_return) {
+ *ns_return = imports.d->findNamespace(QLatin1String(type));
+ if (*ns_return)
+ return true;
+ }
if (qmlImportTrace())
qDebug() << "QmlEngine::resolveType" << type << " not found";
return false;
@@ -1347,6 +1399,16 @@ bool QmlEnginePrivate::resolveType(const Imports& imports, const QByteArray& typ
/*!
\internal
+ Splits a fully qualified type name into the namespace and the unqualified type name.
+*/
+void QmlEnginePrivate::resolveNamespace(const Imports& imports, const QByteArray &type, ImportedNamespace **ns, QByteArray *unqualifiedType) const
+{
+ imports.d->resolveNamespace(type, ns, unqualifiedType);
+}
+
+/*!
+ \internal
+
Searching \e only in the namespace \a ns (previously returned in a call to
resolveType(), \a type is found and returned to either
a QmlType stored at \a type_return, or
@@ -1354,14 +1416,31 @@ bool QmlEnginePrivate::resolveType(const Imports& imports, const QByteArray& typ
If either return pointer is 0, the corresponding search is not done.
*/
-void QmlEnginePrivate::resolveTypeInNamespace(ImportedNamespace* ns, const QByteArray& type, QmlType** type_return, QUrl* url_return ) const
+bool QmlEnginePrivate::resolveTypeInNamespace(ImportedNamespace* ns, const QByteArray& type, QmlType** type_return, QUrl* url_return ) const
{
+ if (!ns)
+ return false;
+
if (type_return) {
- *type_return = ns->findBuiltin(type);
+ QmlType* t = ns->d->findBuiltin(type);
+ if (!t) t = QmlMetaType::qmlType(type,0,0); // Try global namespace
+ if (t) {
+ *type_return = t;
+ if (qmlImportTrace())
+ qDebug() << "QmlEngine::resolveTypeInNamespace" << type << "= (builtin)";
+ return true;
+ }
}
if (url_return) {
- *url_return = ns->find(QLatin1String(type));
+ QUrl url = ns->d->find(QLatin1String(type));
+ if (url.isValid()) {
+ if (url_return) *url_return = url;
+ if (qmlImportTrace())
+ qDebug() << "QmlEngine::resolveType" << type << "=" << url;
+ return true;
+ }
}
+ return false;
}
QT_END_NAMESPACE
diff --git a/src/declarative/qml/qmlengine_p.h b/src/declarative/qml/qmlengine_p.h
index 4142872..c84b3b5 100644
--- a/src/declarative/qml/qmlengine_p.h
+++ b/src/declarative/qml/qmlengine_p.h
@@ -195,10 +195,24 @@ public:
QUrl base;
QmlImportsPrivate *d;
};
- struct ImportedNamespace;
+
+ struct ImportedNamespace {
+ ImportedNamespace();
+ ~ImportedNamespace();
+
+ bool getTypeInfo(const QByteArray &typeName, QString *uri, int *vmaj, int *vmin);
+ private:
+ friend class QmlImportsPrivate;
+ friend class QmlEnginePrivate;
+ class QmlImportedNamespacePrivate *d;
+ };
+
bool addToImport(Imports*, const QString& uri, const QString& prefix, int vmaj, int vmin, QmlScriptParser::Import::Type importType) const;
+
bool resolveType(const Imports&, const QByteArray& type, QmlType** type_return, QUrl* url_return, ImportedNamespace** ns_return=0) const;
- void resolveTypeInNamespace(ImportedNamespace*, const QByteArray& type, QmlType** type_return, QUrl* url_return ) const;
+
+ void resolveNamespace(const Imports& imports, const QByteArray &type, ImportedNamespace **s, QByteArray *unqualifiedType) const;
+ bool resolveTypeInNamespace(ImportedNamespace*, const QByteArray& type, QmlType** type_return, QUrl* url_return ) const;
static QScriptValue qmlScriptObject(QObject*, QmlEngine*);
diff --git a/src/declarative/qml/qmlparser.cpp b/src/declarative/qml/qmlparser.cpp
index 2a67c92..0f2a282 100644
--- a/src/declarative/qml/qmlparser.cpp
+++ b/src/declarative/qml/qmlparser.cpp
@@ -61,7 +61,7 @@ QT_BEGIN_NAMESPACE
using namespace QmlParser;
QmlParser::Object::Object()
-: type(-1), idIndex(-1), metatype(0), defaultProperty(0), parserStatusCast(-1)
+: type(-1), majorVersion(-1), minorVersion(-1), idIndex(-1), metatype(0), defaultProperty(0), parserStatusCast(-1)
{
}
diff --git a/src/declarative/qml/qmlparser_p.h b/src/declarative/qml/qmlparser_p.h
index 120af75..8a92a9f 100644
--- a/src/declarative/qml/qmlparser_p.h
+++ b/src/declarative/qml/qmlparser_p.h
@@ -115,6 +115,11 @@ namespace QmlParser
int type;
// The url of this object if it is an external type. Used by the DOM
QUrl url;
+
+ // version information if type is defined in library or C++
+ int majorVersion;
+ int minorVersion;
+
// The fully-qualified name of this type
QByteArray typeName;
// The class name
diff --git a/src/declarative/qml/qmlscriptparser.cpp b/src/declarative/qml/qmlscriptparser.cpp
index 187f640..ca2d295 100644
--- a/src/declarative/qml/qmlscriptparser.cpp
+++ b/src/declarative/qml/qmlscriptparser.cpp
@@ -432,8 +432,17 @@ bool ProcessAST::visit(AST::UiImport *node)
AST::SourceLocation startLoc = node->importToken;
AST::SourceLocation endLoc = node->semicolonToken;
- if (node->importId)
+ if (node->importId) {
import.qualifier = node->importId->asString();
+ if (!import.qualifier.at(0).isUpper()) {
+ QmlError error;
+ error.setDescription(QLatin1String("Invalid import qualifier ID"));
+ error.setLine(node->importIdToken.startLine);
+ error.setColumn(node->importIdToken.startColumn);
+ _parser->_errors << error;
+ return false;
+ }
+ }
if (node->versionToken.isValid())
import.version = textAt(node->versionToken);
@@ -831,6 +840,7 @@ void QmlScriptParser::clear()
root->release();
root = 0;
}
+ _imports.clear();
qDeleteAll(_refTypes);
_refTypes.clear();
_errors.clear();