76 struct ImportedTypes {
77 ImportedTypes(QQmlJS::ContextualTypes &&types, QList<QQmlJS::DiagnosticMessage> &&warnings)
78 : m_types(std::move(types)), m_warnings(std::move(warnings))
81 ImportedTypes(
const ImportedTypes &) =
default;
82 ImportedTypes(ImportedTypes &&) =
default;
83 ImportedTypes &operator=(
const ImportedTypes &) =
default;
84 ImportedTypes &operator=(ImportedTypes &&) =
default;
85 ~ImportedTypes() =
default;
93 const QQmlJS::ContextualTypes &contextualTypes()
const {
return m_types; }
94 const QList<QQmlJS::DiagnosticMessage> &warnings()
const {
return m_warnings; };
96 bool isEmpty()
const {
return m_types.types().isEmpty(); }
98 bool hasType(
const QString &name)
const {
return m_types.hasType(name); }
99 QQmlJS::ImportedScope<QQmlJSScope::ConstPtr> type(
const QString &name)
const
101 return m_types.type(name);
103 QString name(
const QQmlJSScope::ConstPtr &type)
const {
return m_types.name(type); }
104 void setType(
const QString &name,
const QQmlJS::ImportedScope<QQmlJSScope::ConstPtr> &type)
106 m_types.setType(name, type);
108 bool isNullType(
const QString &name)
const {
return m_types.isNullType(name); }
109 const QHash<QString, QQmlJS::ImportedScope<QQmlJSScope::ConstPtr>> &types()
const
111 return m_types.types();
114 void add(ImportedTypes &&other)
116 m_types.addTypes(std::move(other.m_types));
117 m_warnings.append(std::move(other.m_warnings));
120 void addWarnings(QList<QQmlJS::DiagnosticMessage> &&warnings)
122 m_warnings.append(std::move(warnings));
126 QQmlJS::ContextualTypes m_types;
127 QList<QQmlJS::DiagnosticMessage> m_warnings;
130 QQmlJSImporter(
const QStringList &importPaths, QQmlJSResourceFileMapper *mapper,
131 QQmlJSImporterFlags flags = QQmlJSImporterFlags{});
133 QQmlJSResourceFileMapper *resourceFileMapper()
const {
return m_mapper; }
134 void setResourceFileMapper(QQmlJSResourceFileMapper *mapper) { m_mapper = mapper; }
136 QQmlJSResourceFileMapper *metaDataMapper()
const {
return m_metaDataMapper; }
137 void setMetaDataMapper(QQmlJSResourceFileMapper *mapper) { m_metaDataMapper = mapper; }
139 ImportedTypes importHardCodedBuiltins();
140 QList<QQmlJS::DiagnosticMessage> importQmldirs(
const QStringList &qmltypesFiles);
142 bool registerScope(
const QQmlJSScope::Ptr &scope);
143 QQmlJSScope::Ptr importFile(
const QString &file);
144 ImportedTypes importDirectory(
const QString &directory,
const QString &prefix = QString());
147 QHash<QString, QQmlJSScope::Ptr> importedFiles()
const {
return m_importedFiles; }
149 ImportedTypes importModule(
const QString &module,
const QString &prefix = QString(),
150 QTypeRevision version = QTypeRevision(),
151 QStringList *staticModuleList =
nullptr);
153 ImportedTypes builtinInternalNames();
155 QList<QQmlJS::DiagnosticMessage> takeGlobalWarnings()
157 const auto result = std::move(m_globalWarnings);
158 m_globalWarnings.clear();
162 QStringList importPaths()
const {
return m_importPaths; }
163 void setImportPaths(
const QStringList &importPaths);
167 QQmlJSScope::ConstPtr jsGlobalObject();
168 QString pathOfModule(
const QString &moduleName, QTypeRevision revision)
const
170 const auto it = m_seenImports.constFind({ moduleName, revision });
171 return it != m_seenImports.constEnd() ? *it : QString();
174 struct ImportVisitorPrerequisites
176 ImportVisitorPrerequisites(QQmlJSScope::Ptr target, QQmlJSLogger *logger,
177 const QString &implicitImportDirectory = {},
178 const QStringList &qmldirFiles = {})
181 m_implicitImportDirectory(implicitImportDirectory),
182 m_qmldirFiles(qmldirFiles)
184 Q_ASSERT(target && logger);
187 QQmlJSScope::Ptr m_target;
188 QQmlJSLogger *m_logger;
189 QString m_implicitImportDirectory;
190 QStringList m_qmldirFiles;
192 void runImportVisitor(QQmlJS::AST::Node *rootNode,
193 const ImportVisitorPrerequisites &prerequisites);
196
197
198
199
200
201
202 using ImportVisitor = std::function<
void(QQmlJS::AST::Node *rootNode, QQmlJSImporter *self,
203 const ImportVisitorPrerequisites &prerequisites)>;
205 void setImportVisitor(ImportVisitor visitor) { m_importVisitor = visitor; }
208 friend class QDeferredFactory<QQmlJSScope>;
210 struct AvailableTypes
212 AvailableTypes(QQmlJS::ContextualTypes builtins)
213 : cppNames(std::move(builtins))
214 , qmlNames(QQmlJS::ContextualTypes::QML, {}, {}, cppNames.arrayType())
219 QQmlJS::ContextualTypes cppNames;
222 QQmlJS::ContextualTypes qmlNames;
225 QStringList staticModules;
228 QList<QQmlJS::DiagnosticMessage> warnings;
231 bool hasSystemModule =
false;
236 bool isStaticModule =
false;
237 bool isSystemModule =
false;
239 QList<QQmlJSExportedScope> objects;
240 QHash<QString, QQmlJSExportedScope> scripts;
241 QList<QQmlDirParser::Import> imports;
242 QList<QQmlDirParser::Import> dependencies;
245 QList<QQmlJS::DiagnosticMessage> warnings;
248 AvailableTypes builtinImportHelper();
249 bool importHelper(
const QString &module, AvailableTypes *types,
250 const QString &prefix = QString(), QTypeRevision version = QTypeRevision(),
251 bool isDependency =
false,
bool isFile =
false);
253 const QQmlJS::Import &importDescription,
const Import &import, AvailableTypes *types);
254 void importDependencies(
255 const Import &import, AvailableTypes *types,
const QString &prefix = QString(),
256 QTypeRevision version = QTypeRevision(),
bool isDependency =
false);
257 QQmlDirParser createQmldirParserForFile(
const QString &filename, Import *import);
258 void readQmltypes(
const QString &filename, Import *result);
259 Import readQmldir(
const QString &dirname);
260 Import readDirectory(
const QString &directory);
262 QQmlJSScope::Ptr localFile2QQmlJSScope(
const QString &filePath);
263 static void setQualifiedNamesOn(
const Import &import);
265 QStringList m_importPaths;
267 QHash<std::pair<QString, QTypeRevision>, QString> m_seenImports;
268 QHash<QQmlJS::Import, QSharedPointer<AvailableTypes>> m_cachedImportTypes;
269 QHash<QString, Import> m_seenQmldirFiles;
271 QHash<QString, QQmlJSScope::Ptr> m_importedFiles;
272 QList<QQmlJS::DiagnosticMessage> m_globalWarnings;
273 std::optional<AvailableTypes> m_builtins;
275 QQmlJSResourceFileMapper *m_mapper =
nullptr;
276 QQmlJSResourceFileMapper *m_metaDataMapper =
nullptr;
277 QQmlJSImporterFlags m_flags;
278 bool useOptionalImports()
const {
return m_flags.testFlag(UseOptionalImports); };
279 bool preferQmlFilesFromSourceFolder()
const
281 return m_flags.testFlag(PreferQmlFilesFromSourceFolder);
284 ImportVisitor m_importVisitor;