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();
169 struct ImportVisitorPrerequisites
171 ImportVisitorPrerequisites(QQmlJSScope::Ptr target, QQmlJSLogger *logger,
172 const QString &implicitImportDirectory = {},
173 const QStringList &qmldirFiles = {})
176 m_implicitImportDirectory(implicitImportDirectory),
177 m_qmldirFiles(qmldirFiles)
179 Q_ASSERT(target && logger);
182 QQmlJSScope::Ptr m_target;
183 QQmlJSLogger *m_logger;
184 QString m_implicitImportDirectory;
185 QStringList m_qmldirFiles;
187 void runImportVisitor(QQmlJS::AST::Node *rootNode,
188 const ImportVisitorPrerequisites &prerequisites);
191
192
193
194
195
196
197 using ImportVisitor = std::function<
void(QQmlJS::AST::Node *rootNode, QQmlJSImporter *self,
198 const ImportVisitorPrerequisites &prerequisites)>;
200 void setImportVisitor(ImportVisitor visitor) { m_importVisitor = visitor; }
203 friend class QDeferredFactory<QQmlJSScope>;
205 struct AvailableTypes
207 AvailableTypes(QQmlJS::ContextualTypes builtins)
208 : cppNames(std::move(builtins))
209 , qmlNames(QQmlJS::ContextualTypes::QML, {}, {}, cppNames.arrayType())
214 QQmlJS::ContextualTypes cppNames;
217 QQmlJS::ContextualTypes qmlNames;
220 QStringList staticModules;
223 QList<QQmlJS::DiagnosticMessage> warnings;
226 bool hasSystemModule =
false;
231 bool isStaticModule =
false;
232 bool isSystemModule =
false;
234 QList<QQmlJSExportedScope> objects;
235 QHash<QString, QQmlJSExportedScope> scripts;
236 QList<QQmlDirParser::Import> imports;
237 QList<QQmlDirParser::Import> dependencies;
240 QList<QQmlJS::DiagnosticMessage> warnings;
243 AvailableTypes builtinImportHelper();
244 bool importHelper(
const QString &module, AvailableTypes *types,
245 const QString &prefix = QString(), QTypeRevision version = QTypeRevision(),
246 bool isDependency =
false,
bool isFile =
false);
248 const QQmlJS::Import &importDescription,
const Import &import, AvailableTypes *types);
249 void importDependencies(
250 const Import &import, AvailableTypes *types,
const QString &prefix = QString(),
251 QTypeRevision version = QTypeRevision(),
bool isDependency =
false);
252 QQmlDirParser createQmldirParserForFile(
const QString &filename, Import *import);
253 void readQmltypes(
const QString &filename, Import *result);
254 Import readQmldir(
const QString &dirname);
255 Import readDirectory(
const QString &directory);
257 QQmlJSScope::Ptr localFile2QQmlJSScope(
const QString &filePath);
258 static void setQualifiedNamesOn(
const Import &import);
260 QStringList m_importPaths;
262 QHash<std::pair<QString, QTypeRevision>, QString> m_seenImports;
263 QHash<QQmlJS::Import, QSharedPointer<AvailableTypes>> m_cachedImportTypes;
264 QHash<QString, Import> m_seenQmldirFiles;
266 QHash<QString, QQmlJSScope::Ptr> m_importedFiles;
267 QList<QQmlJS::DiagnosticMessage> m_globalWarnings;
268 std::optional<AvailableTypes> m_builtins;
270 QQmlJSResourceFileMapper *m_mapper =
nullptr;
271 QQmlJSResourceFileMapper *m_metaDataMapper =
nullptr;
272 QQmlJSImporterFlags m_flags;
273 bool useOptionalImports()
const {
return m_flags.testFlag(UseOptionalImports); };
274 bool preferQmlFilesFromSourceFolder()
const
276 return m_flags.testFlag(PreferQmlFilesFromSourceFolder);
279 ImportVisitor m_importVisitor;