diff options
Diffstat (limited to 'src/qmlcompiler/qqmljsimporter_p.h')
-rw-r--r-- | src/qmlcompiler/qqmljsimporter_p.h | 94 |
1 files changed, 78 insertions, 16 deletions
diff --git a/src/qmlcompiler/qqmljsimporter_p.h b/src/qmlcompiler/qqmljsimporter_p.h index 792e26a291..290ea71605 100644 --- a/src/qmlcompiler/qqmljsimporter_p.h +++ b/src/qmlcompiler/qqmljsimporter_p.h @@ -14,22 +14,60 @@ // // We mean it. -#include <private/qtqmlcompilerexports_p.h> +#include <qtqmlcompilerexports.h> +#include "qqmljscontextualtypes_p.h" #include "qqmljsscope_p.h" #include "qqmljsresourcefilemapper_p.h" #include <QtQml/private/qqmldirparser_p.h> +#include <QtQml/private/qqmljsast_p.h> #include <memory> QT_BEGIN_NAMESPACE +namespace QQmlJS { +class Import +{ +public: + Import() = default; + Import(QString prefix, QString name, QTypeRevision version, bool isFile, bool isDependency); + + bool isValid() const; + + QString prefix() const { return m_prefix; } + QString name() const { return m_name; } + QTypeRevision version() const { return m_version; } + bool isFile() const { return m_isFile; } + bool isDependency() const { return m_isDependency; } + +private: + QString m_prefix; + QString m_name; + QTypeRevision m_version; + bool m_isFile = false; + bool m_isDependency = false; + + friend inline size_t qHash(const Import &key, size_t seed = 0) noexcept + { + return qHashMulti(seed, key.m_prefix, key.m_name, key.m_version, + key.m_isFile, key.m_isDependency); + } + + friend inline bool operator==(const Import &a, const Import &b) + { + return a.m_prefix == b.m_prefix && a.m_name == b.m_name && a.m_version == b.m_version + && a.m_isFile == b.m_isFile && a.m_isDependency == b.m_isDependency; + } +}; +} + class QQmlJSImportVisitor; class QQmlJSLogger; -class Q_QMLCOMPILER_PRIVATE_EXPORT QQmlJSImporter +class Q_QMLCOMPILER_EXPORT QQmlJSImporter { public: - using ImportedTypes = QQmlJSScope::ContextualTypes; + using ImportedTypes = QQmlJS::ContextualTypes; QQmlJSImporter(const QStringList &importPaths, QQmlJSResourceFileMapper *mapper, bool useOptionalImports = false); @@ -76,14 +114,38 @@ public: QQmlJSScope::ConstPtr jsGlobalObject() const; - std::unique_ptr<QQmlJSImportVisitor> - makeImportVisitor(const QQmlJSScope::Ptr &target, QQmlJSImporter *importer, - QQmlJSLogger *logger, const QString &implicitImportDirectory, - const QStringList &qmldirFiles = QStringList()); - using ImportVisitorCreator = QQmlJSImportVisitor *(*)(const QQmlJSScope::Ptr &, - QQmlJSImporter *, QQmlJSLogger *, - const QString &, const QStringList &); - void setImportVisitorCreator(ImportVisitorCreator create) { m_createImportVisitor = create; } + struct ImportVisitorPrerequisites + { + ImportVisitorPrerequisites(QQmlJSScope::Ptr target, QQmlJSLogger *logger, + const QString &implicitImportDirectory = {}, + const QStringList &qmldirFiles = {}) + : m_target(target), + m_logger(logger), + m_implicitImportDirectory(implicitImportDirectory), + m_qmldirFiles(qmldirFiles) + { + Q_ASSERT(target && logger); + } + + QQmlJSScope::Ptr m_target; + QQmlJSLogger *m_logger; + QString m_implicitImportDirectory; + QStringList m_qmldirFiles; + }; + void runImportVisitor(QQmlJS::AST::Node *rootNode, + const ImportVisitorPrerequisites &prerequisites); + + /*! + \internal + When a qml file gets lazily loaded, it will be lexed and parsed and finally be constructed + via an ImportVisitor. By default, this is done via the QQmlJSImportVisitor, but can also be done + via other import visitors like QmltcVisitor, which is used by qmltc to compile a QML file, or + QQmlDomAstCreatorWithQQmlJSScope, which is used to construct the Dom of lazily loaded QML files. + */ + using ImportVisitor = std::function<void(QQmlJS::AST::Node *rootNode, QQmlJSImporter *self, + const ImportVisitorPrerequisites &prerequisites)>; + + void setImportVisitor(ImportVisitor visitor) { m_importVisitor = visitor; } private: friend class QDeferredFactory<QQmlJSScope>; @@ -92,8 +154,7 @@ private: { AvailableTypes(ImportedTypes builtins) : cppNames(std::move(builtins)) - , qmlNames(QQmlJSScope::ContextualTypes::QML, {}, - cppNames.intType(), cppNames.arrayType()) + , qmlNames(QQmlJS::ContextualTypes::QML, {}, cppNames.arrayType()) { } @@ -125,11 +186,12 @@ private: bool importHelper(const QString &module, AvailableTypes *types, const QString &prefix = QString(), QTypeRevision version = QTypeRevision(), bool isDependency = false, bool isFile = false); - void processImport(const QQmlJSScope::Import &importDescription, const Import &import, + void processImport(const QQmlJS::Import &importDescription, const Import &import, AvailableTypes *types); void importDependencies(const QQmlJSImporter::Import &import, AvailableTypes *types, const QString &prefix = QString(), QTypeRevision version = QTypeRevision(), bool isDependency = false); + QQmlDirParser createQmldirParserForFile(const QString &filename); void readQmltypes(const QString &filename, QList<QQmlJSExportedScope> *objects, QList<QQmlDirParser::Import> *dependencies); Import readQmldir(const QString &dirname); @@ -141,7 +203,7 @@ private: QStringList m_importPaths; QHash<QPair<QString, QTypeRevision>, QString> m_seenImports; - QHash<QQmlJSScope::Import, QSharedPointer<AvailableTypes>> m_cachedImportTypes; + QHash<QQmlJS::Import, QSharedPointer<AvailableTypes>> m_cachedImportTypes; QHash<QString, Import> m_seenQmldirFiles; QHash<QString, QQmlJSScope::Ptr> m_importedFiles; @@ -153,7 +215,7 @@ private: QQmlJSResourceFileMapper *m_metaDataMapper = nullptr; bool m_useOptionalImports; - ImportVisitorCreator m_createImportVisitor = nullptr; + ImportVisitor m_importVisitor; }; QT_END_NAMESPACE |