79 static inline constexpr QLatin1String anonPrefix = QLatin1String(
"$anonymous$");
80 static inline constexpr QLatin1String internalPrefix = QLatin1String(
"$internal$");
81 static inline constexpr QLatin1String modulePrefix = QLatin1String(
"$module$");
84 struct ImportedTypes {
85 ImportedTypes(QQmlJS::ContextualTypes &&types, QList<QQmlJS::DiagnosticMessage> &&warnings)
86 : m_types(std::move(types)), m_warnings(std::move(warnings))
89 ImportedTypes(
const ImportedTypes &) =
default;
90 ImportedTypes(ImportedTypes &&) =
default;
91 ImportedTypes &operator=(
const ImportedTypes &) =
default;
92 ImportedTypes &operator=(ImportedTypes &&) =
default;
93 ~ImportedTypes() =
default;
101 const QQmlJS::ContextualTypes &contextualTypes()
const {
return m_types; }
102 const QList<QQmlJS::DiagnosticMessage> &warnings()
const {
return m_warnings; };
104 bool isEmpty()
const {
return m_types.types().isEmpty(); }
106 bool hasType(
const QString &name)
const {
return m_types.hasType(name); }
107 QQmlJS::ImportedScope<QQmlJSScope::ConstPtr> type(
const QString &name)
const
109 return m_types.type(name);
111 QString name(
const QQmlJSScope::ConstPtr &type)
const {
return m_types.name(type); }
112 void setType(
const QString &name,
const QQmlJS::ContextualType &type)
114 m_types.setType(name, type);
116 bool isNullType(
const QString &name)
const {
return m_types.isNullType(name); }
117 const QHash<QString, QQmlJS::ContextualType> &types()
const {
return m_types.types(); }
118 const auto &names()
const {
return m_types.names(); }
120 void add(ImportedTypes &&other)
122 m_types.addTypes(std::move(other.m_types));
123 m_warnings.append(std::move(other.m_warnings));
126 void addWarnings(QList<QQmlJS::DiagnosticMessage> &&warnings)
128 m_warnings.append(std::move(warnings));
132 QQmlJS::ContextualTypes m_types;
133 QList<QQmlJS::DiagnosticMessage> m_warnings;
136 QQmlJSImporter(
const QStringList &importPaths, QQmlJSResourceFileMapper *mapper,
137 QQmlJSImporterFlags flags = QQmlJSImporterFlags{});
139 QQmlJSResourceFileMapper *resourceFileMapper()
const {
return m_mapper; }
140 void setResourceFileMapper(QQmlJSResourceFileMapper *mapper) { m_mapper = mapper; }
142 QQmlJSResourceFileMapper *metaDataMapper()
const {
return m_metaDataMapper; }
143 void setMetaDataMapper(QQmlJSResourceFileMapper *mapper) { m_metaDataMapper = mapper; }
145 ImportedTypes importHardCodedBuiltins();
146 QList<QQmlJS::DiagnosticMessage> importQmldirs(
const QStringList &qmltypesFiles);
148 bool registerScope(
const QQmlJSScope::Ptr &scope);
149 QQmlJSScope::Ptr importFile(
const QString &file);
150 ImportedTypes importDirectory(
const QString &directory, quint8 precedence,
151 const QString &prefix = QString());
154 QHash<QString, QQmlJSScope::Ptr> importedFiles()
const {
return m_importedFiles; }
156 ImportedTypes importModule(
const QString &module, quint8 precedence,
157 const QString &prefix = QString(),
158 QTypeRevision version = QTypeRevision(),
159 QStringList *staticModuleList =
nullptr);
161 ImportedTypes builtinInternalNames();
163 QList<QQmlJS::DiagnosticMessage> takeGlobalWarnings()
165 const auto result = std::move(m_globalWarnings);
166 m_globalWarnings.clear();
170 QStringList importPaths()
const {
return m_importPaths; }
171 void setImportPaths(
const QStringList &importPaths);
175 QQmlJSScope::ConstPtr jsGlobalObject();
176 QString pathOfModule(
const QString &moduleName, QTypeRevision revision)
const
178 const auto it = m_seenImports.constFind({ moduleName, revision });
179 return it != m_seenImports.constEnd() ? *it : QString();
182 struct ImportVisitorPrerequisites
184 ImportVisitorPrerequisites(QQmlJSScope::Ptr target, QQmlJSLogger *logger,
185 const QString &implicitImportDirectory = {},
186 const QStringList &qmldirFiles = {})
189 m_implicitImportDirectory(implicitImportDirectory),
190 m_qmldirFiles(qmldirFiles)
192 Q_ASSERT(target && logger);
195 QQmlJSScope::Ptr m_target;
196 QQmlJSLogger *m_logger;
197 QString m_implicitImportDirectory;
198 QStringList m_qmldirFiles;
200 void runImportVisitor(QQmlJS::AST::Node *rootNode,
201 const ImportVisitorPrerequisites &prerequisites);
204
205
206
207
208
209
210 using ImportVisitor = std::function<
void(QQmlJS::AST::Node *rootNode, QQmlJSImporter *self,
211 const ImportVisitorPrerequisites &prerequisites)>;
213 void setImportVisitor(ImportVisitor visitor) { m_importVisitor = visitor; }
216 friend class QDeferredFactory<QQmlJSScope>;
218 struct AvailableTypes
220 AvailableTypes(QQmlJS::ContextualTypes builtins)
221 : cppNames(std::move(builtins))
222 , qmlNames(QQmlJS::ContextualTypes::QML, {}, {}, cppNames.arrayType())
227 QQmlJS::ContextualTypes cppNames;
230 QQmlJS::ContextualTypes qmlNames;
233 QStringList staticModules;
236 QList<QQmlJS::DiagnosticMessage> warnings;
239 bool hasSystemModule =
false;
244 bool isStaticModule =
false;
245 bool isSystemModule =
false;
247 QList<QQmlJSExportedScope> objects;
248 QHash<QString, QQmlJSExportedScope> scripts;
249 QList<QQmlDirParser::Import> imports;
250 QList<QQmlDirParser::Import> dependencies;
253 QList<QQmlJS::DiagnosticMessage> warnings;
256 AvailableTypes builtinImportHelper();
257 bool importHelper(
const QString &module, AvailableTypes *types, quint8 precedence,
258 const QString &prefix = QString(), QTypeRevision version = QTypeRevision(),
259 bool isDependency =
false,
bool isFile =
false);
260 void processImport(
const QQmlJS::Import &importDescription,
const Import &import,
261 quint8 precedence, AvailableTypes *types);
262 static void insertAliases(
const QQmlJS::ContextualType &type,
263 QQmlJSImporter::AvailableTypes *types);
264 void insertExports(
const QQmlJS::Import &importDescription,
const QQmlJSExportedScope &val,
265 const QString &cppName, quint8 precedence,
266 QHash<QString, QList<QQmlJSScope::Export>> *seenExports,
267 QQmlJSImporter::AvailableTypes *types);
268 void importDependencies(
const Import &import, quint8 precedence, AvailableTypes *types,
269 const QString &prefix = QString(),
270 QTypeRevision version = QTypeRevision(),
bool isDependency =
false);
271 QQmlDirParser createQmldirParserForFile(
const QString &filename, Import *import);
272 void readQmltypes(
const QString &filename, Import *result);
273 Import readQmldir(
const QString &dirname);
274 Import readDirectory(
const QString &directory);
276 QQmlJSScope::Ptr localFile2QQmlJSScope(
const QString &filePath);
277 static void setQualifiedNamesOn(
const Import &import);
279 QStringList m_importPaths;
281 QHash<std::pair<QString, QTypeRevision>, QString> m_seenImports;
282 QHash<QQmlJS::Import, QSharedPointer<AvailableTypes>> m_cachedImportTypes;
283 QHash<QString, Import> m_seenQmldirFiles;
285 QHash<QString, QQmlJSScope::Ptr> m_importedFiles;
286 QList<QQmlJS::DiagnosticMessage> m_globalWarnings;
287 std::optional<AvailableTypes> m_builtins;
289 QQmlJSResourceFileMapper *m_mapper =
nullptr;
290 QQmlJSResourceFileMapper *m_metaDataMapper =
nullptr;
291 QQmlJSImporterFlags m_flags;
292 bool useOptionalImports()
const {
return m_flags.testFlag(UseOptionalImports); };
293 bool preferQmlFilesFromSourceFolder()
const
295 return m_flags.testFlag(PreferQmlFilesFromSourceFolder);
298 ImportVisitor m_importVisitor;