aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler/qqmljsimporter_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmlcompiler/qqmljsimporter_p.h')
-rw-r--r--src/qmlcompiler/qqmljsimporter_p.h94
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