Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmljsimporter_p.h
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#ifndef QQMLJSIMPORTER_P_H
5#define QQMLJSIMPORTER_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16
17#include <qtqmlcompilerexports.h>
18
20#include "qqmljsscope_p.h"
22#include <QtQml/private/qqmldirparser_p.h>
23#include <QtQml/private/qqmljsast_p.h>
24
25#include <memory>
26
28
29namespace QQmlJS {
30class Import
31{
32public:
33 Import() = default;
35
36 bool isValid() const;
37
38 QString prefix() const { return m_prefix; }
39 QString name() const { return m_name; }
40 QTypeRevision version() const { return m_version; }
41 bool isFile() const { return m_isFile; }
42 bool isDependency() const { return m_isDependency; }
43
44private:
45 QString m_prefix;
46 QString m_name;
47 QTypeRevision m_version;
48 bool m_isFile = false;
49 bool m_isDependency = false;
50
51 friend inline size_t qHash(const Import &key, size_t seed = 0) noexcept
52 {
53 return qHashMulti(seed, key.m_prefix, key.m_name, key.m_version,
54 key.m_isFile, key.m_isDependency);
55 }
56
57 friend inline bool operator==(const Import &a, const Import &b)
58 {
59 return a.m_prefix == b.m_prefix && a.m_name == b.m_name && a.m_version == b.m_version
60 && a.m_isFile == b.m_isFile && a.m_isDependency == b.m_isDependency;
61 }
62};
63}
64
66class QQmlJSLogger;
67class Q_QMLCOMPILER_EXPORT QQmlJSImporter
68{
69public:
71
73 bool useOptionalImports = false);
74
75 QQmlJSResourceFileMapper *resourceFileMapper() const { return m_mapper; }
77
78 QQmlJSResourceFileMapper *metaDataMapper() const { return m_metaDataMapper; }
80
81 ImportedTypes importBuiltins();
82 void importQmldirs(const QStringList &qmltypesFiles);
83
84 QQmlJSScope::Ptr importFile(const QString &file);
85 ImportedTypes importDirectory(const QString &directory, const QString &prefix = QString());
86
87 // ### qmltc needs this. once re-written, we no longer need to expose this
88 QHash<QString, QQmlJSScope::Ptr> importedFiles() const { return m_importedFiles; }
89
90 ImportedTypes importModule(const QString &module, const QString &prefix = QString(),
91 QTypeRevision version = QTypeRevision(),
92 QStringList *staticModuleList = nullptr);
93
94 ImportedTypes builtinInternalNames();
95
96 QList<QQmlJS::DiagnosticMessage> takeWarnings()
97 {
98 const auto result = std::move(m_warnings);
99 m_warnings.clear();
100 return result;
101 }
102
103 QList<QQmlJS::DiagnosticMessage> takeGlobalWarnings()
104 {
105 const auto result = std::move(m_globalWarnings);
106 m_globalWarnings.clear();
107 return result;
108 }
109
110 QStringList importPaths() const { return m_importPaths; }
111 void setImportPaths(const QStringList &importPaths);
112
113 void clearCache();
114
115 QQmlJSScope::ConstPtr jsGlobalObject() const;
116
118 {
120 const QString &implicitImportDirectory = {},
121 const QStringList &qmldirFiles = {})
122 : m_target(target),
123 m_logger(logger),
124 m_implicitImportDirectory(implicitImportDirectory),
125 m_qmldirFiles(qmldirFiles)
126 {
127 Q_ASSERT(target && logger);
128 }
129
134 };
135 void runImportVisitor(QQmlJS::AST::Node *rootNode,
136 const ImportVisitorPrerequisites &prerequisites);
137
145 using ImportVisitor = std::function<void(QQmlJS::AST::Node *rootNode, QQmlJSImporter *self,
146 const ImportVisitorPrerequisites &prerequisites)>;
147
148 void setImportVisitor(ImportVisitor visitor) { m_importVisitor = visitor; }
149
150private:
151 friend class QDeferredFactory<QQmlJSScope>;
152
153 struct AvailableTypes
154 {
155 AvailableTypes(ImportedTypes builtins)
156 : cppNames(std::move(builtins))
157 , qmlNames(QQmlJS::ContextualTypes::QML, {}, cppNames.arrayType())
158 {
159 }
160
161 // C++ names used in qmltypes files for non-composite types
162 ImportedTypes cppNames;
163
164 // Names the importing component sees, including any prefixes
165 ImportedTypes qmlNames;
166
167 // Static modules included here
168 QStringList staticModules;
169
170 // Whether a system module has been imported
171 bool hasSystemModule = false;
172 };
173
174 struct Import {
176 bool isStaticModule = false;
177 bool isSystemModule = false;
178
179 QList<QQmlJSExportedScope> objects;
180 QHash<QString, QQmlJSExportedScope> scripts;
181 QList<QQmlDirParser::Import> imports;
182 QList<QQmlDirParser::Import> dependencies;
183 };
184
185 AvailableTypes builtinImportHelper();
186 bool importHelper(const QString &module, AvailableTypes *types,
187 const QString &prefix = QString(), QTypeRevision version = QTypeRevision(),
188 bool isDependency = false, bool isFile = false);
189 void processImport(const QQmlJS::Import &importDescription, const Import &import,
190 AvailableTypes *types);
191 void importDependencies(const QQmlJSImporter::Import &import, AvailableTypes *types,
192 const QString &prefix = QString(),
193 QTypeRevision version = QTypeRevision(), bool isDependency = false);
194 QQmlDirParser createQmldirParserForFile(const QString &filename);
195 void readQmltypes(const QString &filename, QList<QQmlJSExportedScope> *objects,
196 QList<QQmlDirParser::Import> *dependencies);
197 Import readQmldir(const QString &dirname);
198 Import readDirectory(const QString &directory);
199
200 QQmlJSScope::Ptr localFile2ScopeTree(const QString &filePath);
201 static void setQualifiedNamesOn(const Import &import);
202
203 QStringList m_importPaths;
204
205 QHash<QPair<QString, QTypeRevision>, QString> m_seenImports;
206 QHash<QQmlJS::Import, QSharedPointer<AvailableTypes>> m_cachedImportTypes;
207 QHash<QString, Import> m_seenQmldirFiles;
208
209 QHash<QString, QQmlJSScope::Ptr> m_importedFiles;
210 QList<QQmlJS::DiagnosticMessage> m_globalWarnings;
211 QList<QQmlJS::DiagnosticMessage> m_warnings;
212 std::optional<AvailableTypes> m_builtins;
213
214 QQmlJSResourceFileMapper *m_mapper = nullptr;
215 QQmlJSResourceFileMapper *m_metaDataMapper = nullptr;
216 bool m_useOptionalImports;
217
218 ImportVisitor m_importVisitor;
219};
220
222
223#endif // QQMLJSIMPORTER_P_H
std::function< void(QQmlJS::AST::Node *rootNode, QQmlJSImporter *self, const ImportVisitorPrerequisites &prerequisites)> ImportVisitor
QStringList importPaths() const
QHash< QString, QQmlJSScope::Ptr > importedFiles() const
QList< QQmlJS::DiagnosticMessage > takeWarnings()
QList< QQmlJS::DiagnosticMessage > takeGlobalWarnings()
void setMetaDataMapper(QQmlJSResourceFileMapper *mapper)
void setResourceFileMapper(QQmlJSResourceFileMapper *mapper)
QQmlJSResourceFileMapper * resourceFileMapper() const
QQmlJSResourceFileMapper * metaDataMapper() const
Tracks the types for the QmlCompiler.
friend bool operator==(const Import &a, const Import &b)
QString prefix() const
bool isValid() const
QTypeRevision version() const
QString name() const
bool isDependency() const
Import()=default
bool isFile() const
friend size_t qHash(const Import &key, size_t seed=0) noexcept
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\inmodule QtCore
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
constexpr QtPrivate::QHashMultiReturnType< T... > qHashMulti(size_t seed, const T &... args) noexcept(std::conjunction_v< QtPrivate::QNothrowHashable< T >... >)
GLboolean GLboolean GLboolean b
GLuint64 key
GLboolean GLboolean GLboolean GLboolean a
[7]
GLsizei GLenum GLenum * types
GLenum target
GLuint name
GLuint64EXT * result
[6]
static Q_CONSTINIT QBasicAtomicInteger< unsigned > seed
Definition qrandom.cpp:196
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
QFile file
[0]
QDataWidgetMapper * mapper
[0]
ImportVisitorPrerequisites(QQmlJSScope::Ptr target, QQmlJSLogger *logger, const QString &implicitImportDirectory={}, const QStringList &qmldirFiles={})