/****************************************************************************
**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/
**
** This file is part of the QtDeclarative module of the Qt Toolkit.
**
**
**
**
+**
** $QT_END_LICENSE$
**
****************************************************************************/
// We mean it.
//
-#include "private/qdeclarativerefcount_p.h"
-#include "private/qdeclarativecleanup_p.h"
-#include "private/qdeclarativemetatype_p.h"
-
-#include <private/qscriptdeclarativeclass_p.h>
+#include <private/qdeclarativerefcount_p.h>
+#include "qdeclarativecleanup_p.h"
+#include "qdeclarativemetatype_p.h"
#include <private/qhashedstring_p.h>
+#include <QtCore/qvector.h>
+
QT_BEGIN_NAMESPACE
class QDeclarativeType;
class QDeclarativeEngine;
-class QDeclarativeTypeNameCache : public QDeclarativeRefCount, public QDeclarativeCleanup
+class QDeclarativeTypeNameCache : public QDeclarativeRefCount
{
public:
- QDeclarativeTypeNameCache(QDeclarativeEngine *);
+ QDeclarativeTypeNameCache();
virtual ~QDeclarativeTypeNameCache();
- struct Data {
- inline Data();
- inline Data(const Data &);
- inline ~Data();
- inline Data &operator=(const Data &);
- QDeclarativeType *type;
- QDeclarativeTypeNameCache *typeNamespace;
- int importedScriptIndex;
- };
+ inline bool isEmpty() const;
- void add(const QString &, int);
- void add(const QString &, QDeclarativeType *);
- void add(const QString &, QDeclarativeTypeNameCache *);
+ void add(const QHashedString &name, int sciptIndex = -1, const QHashedString &nameSpace = QHashedString());
- Data *data(const QString &) const;
- inline Data *data(const QHashedV8String &) const;
- inline bool isEmpty() const;
+ struct Result {
+ inline Result();
+ inline Result(const void *importNamespace);
+ inline Result(QDeclarativeType *type);
+ inline Result(int scriptIndex);
+ inline Result(const Result &);
- inline QDeclarativeMetaType::ModuleApiInstance *moduleApi() const;
- void setModuleApi(QDeclarativeMetaType::ModuleApiInstance *);
+ inline bool isValid() const;
-protected:
- virtual void clear();
+ QDeclarativeType *type;
+ const void *importNamespace;
+ int scriptIndex;
+ };
+ Result query(const QHashedStringRef &);
+ Result query(const QHashedStringRef &, const void *importNamespace);
+ Result query(const QHashedV8String &);
+ Result query(const QHashedV8String &, const void *importNamespace);
+ QDeclarativeMetaType::ModuleApiInstance *moduleApi(const void *importNamespace);
private:
- typedef QStringHash<Data> StringCache;
+ friend class QDeclarativeImports;
- StringCache stringCache;
+ struct Import {
+ inline Import();
+ // Imported module
+ QDeclarativeMetaType::ModuleApiInstance *moduleApi;
+ QVector<QDeclarativeTypeModuleVersion> modules;
+
+ // Or, imported script
+ int scriptIndex;
+ };
+
+ template<typename Key>
+ Result query(const QStringHash<Import> &imports, Key key)
+ {
+ Import *i = imports.value(key);
+ if (i) {
+ if (i->scriptIndex != -1) {
+ return Result(i->scriptIndex);
+ } else {
+ return Result(static_cast<const void *>(i));
+ }
+ }
+
+ return Result();
+ }
+
+ template<typename Key>
+ Result typeSearch(const QVector<QDeclarativeTypeModuleVersion> &modules, Key key)
+ {
+ QVector<QDeclarativeTypeModuleVersion>::const_iterator end = modules.constEnd();
+ for (QVector<QDeclarativeTypeModuleVersion>::const_iterator it = modules.constBegin(); it != end; ++it) {
+ if (QDeclarativeType *type = it->type(key))
+ return Result(type);
+ }
+
+ return Result();
+ }
+
+ QStringHash<Import> m_namedImports;
+ QMap<const Import *, QStringHash<Import> > m_namespacedImports;
+ QVector<QDeclarativeTypeModuleVersion> m_anonymousImports;
QDeclarativeEngine *engine;
- QDeclarativeMetaType::ModuleApiInstance *m_moduleApi;
};
-QDeclarativeTypeNameCache::Data::Data()
-: type(0), typeNamespace(0), importedScriptIndex(-1)
+QDeclarativeTypeNameCache::Result::Result()
+: type(0), importNamespace(0), scriptIndex(-1)
{
}
-QDeclarativeTypeNameCache::Data::~Data()
+QDeclarativeTypeNameCache::Result::Result(const void *importNamespace)
+: type(0), importNamespace(importNamespace), scriptIndex(-1)
{
- if (typeNamespace) typeNamespace->release();
}
-bool QDeclarativeTypeNameCache::isEmpty() const
+QDeclarativeTypeNameCache::Result::Result(QDeclarativeType *type)
+: type(type), importNamespace(0), scriptIndex(-1)
{
- return stringCache.isEmpty();
}
-QDeclarativeTypeNameCache::Data::Data(const QDeclarativeTypeNameCache::Data &o)
-: type(o.type), typeNamespace(o.typeNamespace), importedScriptIndex(o.importedScriptIndex)
+QDeclarativeTypeNameCache::Result::Result(int scriptIndex)
+: type(0), importNamespace(0), scriptIndex(scriptIndex)
{
- if (typeNamespace) typeNamespace->addref();
}
-QDeclarativeTypeNameCache::Data &QDeclarativeTypeNameCache::Data::operator=(const QDeclarativeTypeNameCache::Data &o)
+QDeclarativeTypeNameCache::Result::Result(const Result &o)
+: type(o.type), importNamespace(o.importNamespace), scriptIndex(o.scriptIndex)
{
- if (o.typeNamespace) o.typeNamespace->addref();
- if (typeNamespace) typeNamespace->release();
- type = o.type;
- typeNamespace = o.typeNamespace;
- importedScriptIndex = o.importedScriptIndex;
- return *this;
}
-QDeclarativeMetaType::ModuleApiInstance *QDeclarativeTypeNameCache::moduleApi() const
+bool QDeclarativeTypeNameCache::Result::isValid() const
{
- return m_moduleApi;
+ return type || importNamespace || scriptIndex != -1;
}
-QDeclarativeTypeNameCache::Data *QDeclarativeTypeNameCache::data(const QHashedV8String &name) const
+QDeclarativeTypeNameCache::Import::Import()
+: moduleApi(0), scriptIndex(-1)
+{
+}
+
+bool QDeclarativeTypeNameCache::isEmpty() const
{
- return stringCache.value(name);
+ return m_namedImports.isEmpty() && m_anonymousImports.isEmpty();
}
QT_END_NAMESPACE