81 static inline constexpr QLatin1String anonPrefix = QLatin1String(
"$anonymous$");
82 static inline constexpr QLatin1String internalPrefix = QLatin1String(
"$internal$");
83 static inline constexpr QLatin1String modulePrefix = QLatin1String(
"$module$");
86 static inline constexpr QLatin1String s_inProcessMarker = QLatin1String(
"$InProcess$");
88 struct ImportedTypes {
89 ImportedTypes(QQmlJS::ContextualTypes &&types, QList<QQmlJS::DiagnosticMessage> &&warnings)
90 : m_types(std::move(types)), m_warnings(std::move(warnings))
93 ImportedTypes(
const ImportedTypes &) =
default;
94 ImportedTypes(ImportedTypes &&) =
default;
95 ImportedTypes &operator=(
const ImportedTypes &) =
default;
96 ImportedTypes &operator=(ImportedTypes &&) =
default;
97 ~ImportedTypes() =
default;
101 m_types.clearTypes();
105 const QQmlJS::ContextualTypes &contextualTypes()
const {
return m_types; }
106 const QList<QQmlJS::DiagnosticMessage> &warnings()
const {
return m_warnings; };
108 void setCurrentFileSelector(
const QString &selector)
110 m_types.setCurrentFileSelector(selector);
113 bool isEmpty()
const {
return m_types.types().isEmpty(); }
115 bool hasType(
const QString &name)
const {
return m_types.hasType(name); }
116 QQmlJS::ImportedScope<QQmlJSScope::ConstPtr> type(
const QString &name)
const
118 return m_types.type(name);
120 QString name(
const QQmlJSScope::ConstPtr &type)
const {
return m_types.name(type); }
121 void setType(
const QString &name,
const QQmlJS::ContextualType &type)
123 m_types.setType(name, type);
125 bool isNullType(
const QString &name)
const {
return m_types.isNullType(name); }
126 const QHash<QString, QQmlJS::ContextualType> &types()
const {
return m_types.types(); }
127 const auto &names()
const {
return m_types.names(); }
129 void add(ImportedTypes &&other)
131 m_types.addTypes(std::move(other.m_types));
132 m_warnings.append(std::move(other.m_warnings));
135 void addWarnings(QList<QQmlJS::DiagnosticMessage> &&warnings)
137 m_warnings.append(std::move(warnings));
141 QQmlJS::ContextualTypes m_types;
142 QList<QQmlJS::DiagnosticMessage> m_warnings;
145 QQmlJSImporter(
const QStringList &importPaths, QQmlJSResourceFileMapper *mapper,
146 QQmlJSImporterFlags flags = QQmlJSImporterFlags{});
148 QQmlJSResourceFileMapper *resourceFileMapper()
const {
return m_mapper; }
149 void setResourceFileMapper(QQmlJSResourceFileMapper *mapper) { m_mapper = mapper; }
151 QQmlJSResourceFileMapper *metaDataMapper()
const {
return m_metaDataMapper; }
152 void setMetaDataMapper(QQmlJSResourceFileMapper *mapper) { m_metaDataMapper = mapper; }
154 ImportedTypes importHardCodedBuiltins();
155 QList<QQmlJS::DiagnosticMessage> importQmldirs(
const QStringList &qmltypesFiles);
157 QQmlJSScope::Ptr importFile(
const QString &file);
158 ImportedTypes importDirectory(
const QString &directory, quint8 precedence,
159 const QString &prefix = QString());
162 QHash<QString, QQmlJSScope::Ptr> importedFiles()
const {
return m_importedFiles; }
164 ImportedTypes importModule(
const QString &module, quint8 precedence,
165 const QString &prefix = QString(),
166 QTypeRevision version = QTypeRevision(),
167 QStringList *staticModuleList =
nullptr);
169 ImportedTypes builtinInternalNames();
171 QList<QQmlJS::DiagnosticMessage> takeGlobalWarnings()
173 const auto result = std::move(m_globalWarnings);
174 m_globalWarnings.clear();
178 QStringList importPaths()
const {
return m_importPaths; }
179 void setImportPaths(
const QStringList &importPaths);
183 QQmlJSScope::ConstPtr jsGlobalObject();
184 QString pathOfModule(
const QString &moduleName, QTypeRevision revision)
const
186 const auto it = m_seenImports.constFind({ moduleName, revision });
187 return it != m_seenImports.constEnd() ? *it : QString();
190 struct ImportVisitorPrerequisites
192 ImportVisitorPrerequisites(QQmlJSScope::Ptr target, QQmlJSLogger *logger,
193 const QString &implicitImportDirectory = {},
194 const QStringList &qmldirFiles = {})
197 m_implicitImportDirectory(implicitImportDirectory),
198 m_qmldirFiles(qmldirFiles)
200 Q_ASSERT(target && logger);
203 QQmlJSScope::Ptr m_target;
204 QQmlJSLogger *m_logger;
205 QString m_implicitImportDirectory;
206 QStringList m_qmldirFiles;
208 void runImportVisitor(QQmlJS::AST::Node *rootNode,
209 const ImportVisitorPrerequisites &prerequisites);
212
213
214
215
216
217
218 using ImportVisitor = std::function<
void(QQmlJS::AST::Node *rootNode, QQmlJSImporter *self,
219 const ImportVisitorPrerequisites &prerequisites)>;
221 void setImportVisitor(ImportVisitor visitor) { m_importVisitor = visitor; }
222 void setFlags(
const QQmlJSImporterFlags &flags) { m_flags = flags; }
223 QQmlJSImporterFlags flags()
const {
return m_flags; }
226 struct AvailableTypes
228 AvailableTypes(QQmlJS::ContextualTypes builtins)
229 : cppNames(std::move(builtins))
230 , qmlNames(QQmlJS::ContextualTypes::QML, {}, {}, cppNames.arrayType())
235 QQmlJS::ContextualTypes cppNames;
238 QQmlJS::ContextualTypes qmlNames;
241 QStringList staticModules;
244 QList<QQmlJS::DiagnosticMessage> warnings;
247 bool hasSystemModule =
false;
250 bool wasFound =
true;
254 enum Type :
bool { Directory, Qmldir };
257 bool isStaticModule =
false;
258 bool isSystemModule =
false;
259 Type type = Directory;
261 QList<QQmlJSExportedScope> objects;
262 QHash<QString, QQmlJSExportedScope> scripts;
263 QList<QQmlDirParser::Import> imports;
264 QList<QQmlDirParser::Import> dependencies;
267 QList<QQmlJS::DiagnosticMessage> warnings;
270 AvailableTypes builtinImportHelper();
271 bool importHelper(
const QString &module, AvailableTypes *types, quint8 precedence,
272 const QString &prefix = QString(), QTypeRevision version = QTypeRevision(),
273 bool isDependency =
false,
bool isFile =
false);
274 void processImport(
const QQmlJS::Import &importDescription,
const Import &import,
275 quint8 precedence, AvailableTypes *types);
276 static void insertAliases(
const QQmlJS::ContextualType &type,
277 QQmlJSImporter::AvailableTypes *types);
278 void insertExport(
const QQmlJS::ContextualType &type,
const QQmlJS::Export &valExport,
279 const QString &qmlName,
280 QHash<QString, QList<QQmlJSScope::Export>> *seenExports,
281 QQmlJSImporter::AvailableTypes *types)
const;
283 resolveConflictingExports(
const QQmlJS::Import &importDescription,
284 const QQmlJSExportedScope &val, quint8 precedence,
285 QHash<QString, QList<QQmlJSScope::Export>> *seenExports,
286 QQmlJSImporter::AvailableTypes *types);
287 enum SeenVersion { LowerVersion, SameVersion, HigherVersion };
288 void insertExportWithConflictingVersion(
const QQmlJSExportedScope &val, quint8 precedence,
289 const QString &qmlName,
290 const QQmlJSScope::Export &valExport,
291 const QQmlJSScope::ConstPtr &scope,
292 QHash<QString, QList<QQmlJSScope::Export>> *seenExports,
293 QQmlJSImporter::AvailableTypes *types,
294 SeenVersion seenVersion)
const;
295 SeenVersion computeSeenVersion(
const QQmlJS::Import &importDescription,
296 const QList<QQmlJS::Export> &existingExports,
297 QTypeRevision valExportVersion)
const;
298 void insertExports(
const QQmlJS::Import &importDescription,
const QQmlJSExportedScope &val,
299 const QString &cppName, quint8 precedence,
300 QHash<QString, QList<QQmlJSScope::Export>> *seenExports,
301 QQmlJSImporter::AvailableTypes *types);
302 void importDependencies(
const Import &import, quint8 precedence, AvailableTypes *types,
303 const QString &prefix = QString(),
304 QTypeRevision version = QTypeRevision(),
bool isDependency =
false);
305 QQmlDirParser createQmldirParserForFile(
const QString &filename, Import *import);
306 void readQmltypes(
const QString &filename, Import *result);
307 Import readQmldir(
const QString &dirname);
308 Import readDirectory(
const QString &directory);
310 QQmlJSScope::Ptr localFile2QQmlJSScope(
const QString &filePath);
311 static void setQualifiedNamesOn(
const Import &import);
313 QStringList m_importPaths;
315 QHash<std::pair<QString, QTypeRevision>, QString> m_seenImports;
316 QHash<QQmlJS::Import, QSharedPointer<AvailableTypes>> m_cachedImportTypes;
317 QHash<QString, Import> m_seenQmldirFilesAndDirectories;
319 QHash<QString, QQmlJSScope::Ptr> m_importedFiles;
320 QList<QQmlJS::DiagnosticMessage> m_globalWarnings;
321 std::optional<AvailableTypes> m_builtins;
323 QQmlJSResourceFileMapper *m_mapper =
nullptr;
324 QQmlJSResourceFileMapper *m_metaDataMapper =
nullptr;
325 QQmlJSImporterFlags m_flags;
326 bool useOptionalImports()
const {
return m_flags.testFlag(UseOptionalImports); };
327 bool preferQmlFilesFromSourceFolder()
const
329 return m_flags.testFlag(PreferQmlFilesFromSourceFolder);
332 ImportVisitor m_importVisitor;