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
qqmldomexternalitems.cpp
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qqmldomtop_p.h"
6#include "qqmldomcomments_p.h"
7#include "qqmldommock_p.h"
8#include "qqmldomelements_p.h"
9#include "qqmldom_utils_p.h"
10
11#include <QtQml/private/qqmljslexer_p.h>
12#include <QtQml/private/qqmljsparser_p.h>
13#include <QtQml/private/qqmljsengine_p.h>
14#include <QtQml/private/qqmljsastvisitor_p.h>
15#include <QtQml/private/qqmljsast_p.h>
16#include <QtCore/QDir>
17#include <QtCore/QScopeGuard>
18#include <QtCore/QFileInfo>
19#include <QtCore/QRegularExpressionMatch>
20
21#include <algorithm>
22
24
25using namespace Qt::StringLiterals;
26
27namespace QQmlJS {
28namespace Dom {
29
31 const QString &filePath, const QDateTime &lastDataUpdateAt, const Path &path,
32 int derivedFrom, const QString &code)
33 : OwningItem(derivedFrom, lastDataUpdateAt),
34 m_canonicalFilePath(filePath),
35 m_code(code),
36 m_path(path)
37{}
38
43
48
50{
51 return m_path;
52}
53
58
60{
62 NewErrorGroup("Parsing") } };
63 return res;
64}
65
66std::shared_ptr<QmldirFile> QmldirFile::fromPathAndCode(const QString &path, const QString &code)
67{
69
71 auto res = std::make_shared<QmldirFile>(canonicalFilePath, code, dataUpdate);
72
73 if (canonicalFilePath.isEmpty() && !path.isEmpty())
74 res->addErrorLocal(
75 myParsingErrors().error(tr("QmldirFile started from invalid path '%1'").arg(path)));
76 res->parse();
77 return res;
78}
79
80void QmldirFile::parse()
81{
82 if (canonicalFilePath().isEmpty()) {
83 addErrorLocal(myParsingErrors().error(tr("canonicalFilePath is empty")));
84 setIsValid(false);
85 } else {
86 m_qmldir.parse(m_code);
87 setFromQmldir();
88 }
89}
90
91void QmldirFile::setFromQmldir()
92{
93 m_uri = QmlUri::fromUriString(m_qmldir.typeNamespace());
94 if (m_uri.isValid())
96 Path exportsPath = Path::Field(Fields::exports);
97 QDir baseDir = QFileInfo(canonicalFilePath()).dir();
98 int majorVersion = Version::Undefined;
99 bool ok;
100 int vNr = QFileInfo(baseDir.dirName()).suffix().toInt(&ok);
101 if (ok && vNr > 0) // accept 0?
102 majorVersion = vNr;
103 Path exportSource = canonicalPath();
104 for (auto const &el : m_qmldir.components()) {
105 QString exportFilePath = baseDir.filePath(el.fileName);
106 QString canonicalExportFilePath = QFileInfo(exportFilePath).canonicalFilePath();
107 if (canonicalExportFilePath.isEmpty()) // file does not exist (yet? assuming it might be
108 // created where we expect it)
109 canonicalExportFilePath = exportFilePath;
110 Export exp;
111 exp.exportSourcePath = exportSource;
112 exp.isSingleton = el.singleton;
113 exp.isInternal = el.internal;
114 exp.version =
115 Version((el.version.hasMajorVersion() ? el.version.majorVersion() : majorVersion),
116 el.version.hasMinorVersion() ? el.version.minorVersion() : 0);
117 exp.typeName = el.typeName;
118 exp.typePath = Paths::qmlFileObjectPath(canonicalExportFilePath);
119 exp.uri = uri().toString();
120 m_exports.insert(exp.typeName, exp);
121 if (exp.version.majorVersion > 0)
122 m_majorVersions.insert(exp.version.majorVersion);
123 }
124 for (auto const &el : m_qmldir.scripts()) {
125 QString exportFilePath = baseDir.filePath(el.fileName);
126 QString canonicalExportFilePath = QFileInfo(exportFilePath).canonicalFilePath();
127 if (canonicalExportFilePath.isEmpty()) // file does not exist (yet? assuming it might be
128 // created where we expect it)
129 canonicalExportFilePath = exportFilePath;
130 Export exp;
131 exp.exportSourcePath = exportSource;
132 exp.isSingleton = true;
133 exp.isInternal = false;
134 exp.version =
135 Version((el.version.hasMajorVersion() ? el.version.majorVersion() : majorVersion),
136 el.version.hasMinorVersion() ? el.version.minorVersion() : 0);
137 exp.typePath = Paths::jsFilePath(canonicalExportFilePath).field(Fields::rootComponent);
138 exp.uri = uri().toString();
139 exp.typeName = el.nameSpace;
140 m_exports.insert(exp.typeName, exp);
141 if (exp.version.majorVersion > 0)
142 m_majorVersions.insert(exp.version.majorVersion);
143 }
144 for (QQmlDirParser::Import const &imp : m_qmldir.imports()) {
145 QString uri = imp.module;
146 bool isAutoImport = imp.flags & QQmlDirParser::Import::Auto;
147 Version v;
148 if (isAutoImport)
149 v = Version(majorVersion, int(Version::Latest));
150 else {
151 v = Version((imp.version.hasMajorVersion() ? imp.version.majorVersion()
152 : int(Version::Latest)),
153 (imp.version.hasMinorVersion() ? imp.version.minorVersion()
154 : int(Version::Latest)));
155 }
156 m_imports.append(Import(QmlUri::fromUriString(uri), v));
157 m_autoExports.append(
158 ModuleAutoExport { Import(QmlUri::fromUriString(uri), v), isAutoImport });
159 }
160 for (QQmlDirParser::Import const &imp : m_qmldir.dependencies()) {
161 QString uri = imp.module;
162 if (imp.flags & QQmlDirParser::Import::Auto) {
163 qCDebug(QQmlJSDomImporting) << "QmldirFile::setFromQmlDir: ignoring initial version"
164 " 'auto' in depends command, using latest version"
165 " instead.";
166 }
167 Version v = Version(
168 (imp.version.hasMajorVersion() ? imp.version.majorVersion() : int(Version::Latest)),
169 (imp.version.hasMinorVersion() ? imp.version.minorVersion()
170 : int(Version::Latest)));
171 m_imports.append(Import(QmlUri::fromUriString(uri), v));
172 }
173 bool hasInvalidTypeinfo = false;
174 for (auto const &el : m_qmldir.typeInfos()) {
175 QString elStr = el;
176 QFileInfo elPath(elStr);
177 if (elPath.isRelative())
178 elPath = QFileInfo(baseDir.filePath(elStr));
179 QString typeInfoPath = elPath.canonicalFilePath();
180 if (typeInfoPath.isEmpty()) {
181 hasInvalidTypeinfo = true;
182 typeInfoPath = elPath.absoluteFilePath();
183 }
184 m_qmltypesFilePaths.append(Paths::qmltypesFilePath(typeInfoPath));
185 }
186 if (m_qmltypesFilePaths.isEmpty() || hasInvalidTypeinfo) {
187 // add all type info files in the directory...
188 for (QFileInfo const &entry :
189 baseDir.entryInfoList(QStringList({ QLatin1String("*.qmltypes") }),
191 Path p = Paths::qmltypesFilePath(entry.canonicalFilePath());
192 if (!m_qmltypesFilePaths.contains(p))
193 m_qmltypesFilePaths.append(p);
194 }
195 }
196 bool hasErrors = false;
197 for (auto const &el : m_qmldir.errors(uri().toString())) {
198 ErrorMessage msg = myParsingErrors().errorMessage(el);
199 if (msg.level == ErrorLevel::Error || msg.level == ErrorLevel::Fatal)
200 hasErrors = true;
201 addErrorLocal(std::move(msg));
202 }
203 setIsValid(!hasErrors); // consider it valid also with errors?
204 m_plugins = m_qmldir.plugins();
205}
206
207QList<ModuleAutoExport> QmldirFile::autoExports() const
208{
209 return m_autoExports;
210}
211
212void QmldirFile::setAutoExports(const QList<ModuleAutoExport> &autoExport)
213{
214 m_autoExports = autoExport;
215}
216
217void QmldirFile::ensureInModuleIndex(const DomItem &self, const QString &uri) const
218{
219 // ModuleIndex keeps the various sources of types from a given module uri import
220 // this method ensures that all major versions that are contained in this qmldir
221 // file actually have a ModuleIndex. This is required so that when importing the
222 // latest version the correct "lastest major version" is found, for example for
223 // qml only modules (qmltypes files also register their versions)
224 DomItem env = self.environment();
225 if (std::shared_ptr<DomEnvironment> envPtr = env.ownerAs<DomEnvironment>()) {
226 for (int majorV : m_majorVersions) {
227 auto mIndex = envPtr->moduleIndexWithUri(env, uri, majorV, EnvLookup::Normal,
229 }
230 }
231}
232
234{
236 for (const QString &n : cNames)
237 names.append(n);
238 return QCborMap({ { QCborValue(QStringView(Fields::name)), pl.name },
239 { QStringView(Fields::path), pl.path },
240 { QStringView(Fields::classNames), names } });
241}
242
244{
245 bool cont = ExternalOwningItem::iterateDirectSubpaths(self, visitor);
246 cont = cont && self.dvValueField(visitor, Fields::uri, uri().toString());
247 cont = cont && self.dvValueField(visitor, Fields::designerSupported, designerSupported());
248 cont = cont && self.dvReferencesField(visitor, Fields::qmltypesFiles, m_qmltypesFilePaths);
249 cont = cont && self.dvWrapField(visitor, Fields::exports, m_exports);
250 cont = cont && self.dvWrapField(visitor, Fields::imports, m_imports);
251 cont = cont && self.dvItemField(visitor, Fields::plugins, [this, &self]() {
252 QStringList cNames = classNames();
253 return self.subListItem(List::fromQListRef<QQmlDirParser::Plugin>(
254 self.pathFromOwner().field(Fields::plugins), m_plugins,
255 [cNames](const DomItem &list, const PathEls::PathComponent &p,
256 const QQmlDirParser::Plugin &plugin) {
257 return list.subDataItem(p, pluginData(plugin, cNames));
258 }));
259 });
260 // add qmlfiles as map because this way they are presented the same way as
261 // the qmlfiles in a directory
262 cont = cont && self.dvItemField(visitor, Fields::qmlFiles, [this, &self]() {
263 const QMap<QString, QString> typeFileMap = qmlFiles();
264 return self.subMapItem(Map(
265 self.pathFromOwner().field(Fields::qmlFiles),
266 [typeFileMap](const DomItem &map, const QString &typeV) {
267 QString path = typeFileMap.value(typeV);
268 if (path.isEmpty())
269 return DomItem();
270 else
271 return map.subReferencesItem(
272 PathEls::Key(typeV),
273 QList<Path>({ Paths::qmlFileObjectPath(path) }));
274 },
275 [typeFileMap](const DomItem &) {
276 return QSet<QString>(typeFileMap.keyBegin(), typeFileMap.keyEnd());
277 },
278 QStringLiteral(u"QList<Reference>")));
279 });
280 cont = cont && self.dvWrapField(visitor, Fields::autoExports, m_autoExports);
281 return cont;
282}
283
284QMap<QString, QString> QmldirFile::qmlFiles() const
285{
286 // add qmlfiles as map because this way they are presented the same way as
287 // the qmlfiles in a directory which gives them as fileName->list of references to files
288 // this is done only to ensure that they are loaded as dependencies
289 QMap<QString, QString> res;
290 for (const auto &e : m_exports)
291 res.insert(e.typeName + QStringLiteral(u"-") + e.version.stringValue(),
292 e.typePath[2].headName());
293 return res;
294}
295
296JsFile::JsFile(
297 const QString &filePath, const QString &code, const QDateTime &lastDataUpdateAt,
298 int derivedFrom)
299 : ExternalOwningItem(filePath, lastDataUpdateAt, Paths::qmlFilePath(filePath), derivedFrom,
300 code)
301{
302 m_engine = std::make_shared<QQmlJS::Engine>();
303 LegacyDirectivesCollector directivesCollector(*this);
304 m_engine->setDirectives(&directivesCollector);
305
306 QQmlJS::Lexer lexer(m_engine.get());
307 lexer.setCode(code, /*lineno = */ 1, /*qmlMode=*/false);
308 QQmlJS::Parser parser(m_engine.get());
309
310 bool isESM = filePath.endsWith(u".mjs", Qt::CaseInsensitive);
311 bool isValid = isESM ? parser.parseModule() : parser.parseProgram();
313
314 const auto diagnostics = parser.diagnosticMessages();
315 for (const DiagnosticMessage &msg : diagnostics) {
317 std::move(myParsingErrors().errorMessage(msg).withFile(filePath).withPath(m_path)));
318 }
319
320 auto astComments = std::make_shared<AstComments>(m_engine);
321
322 CommentCollector collector;
323 collector.collectComments(m_engine, parser.rootNode(), astComments);
324 m_script = std::make_shared<ScriptExpression>(code, m_engine, parser.rootNode(), astComments,
327}
328
330{
331 static ErrorGroups res = { { DomItem::domErrorGroup, NewErrorGroup("JsFile"),
332 NewErrorGroup("Parsing") } };
333 return res;
334}
335
337{
338 bool cont = ExternalOwningItem::iterateDirectSubpaths(self, visitor);
339 cont = cont && self.dvWrapField(visitor, Fields::fileLocationsTree, m_fileLocationsTree);
340 if (m_script)
341 cont = cont && self.dvItemField(visitor, Fields::expression, [this, &self]() {
342 return self.subOwnerItem(PathEls::Field(Fields::expression), m_script);
343 });
344 return cont;
345}
346
347void JsFile::writeOut(const DomItem &self, OutWriter &ow) const
348{
349 writeOutDirectives(ow);
350 ow.ensureNewline(2);
351 if (DomItem script = self.field(Fields::expression)) {
352 ow.ensureNewline();
353 script.writeOut(ow);
354 }
355}
356
357void JsFile::addFileImport(const QString &jsfile, const QString &module)
358{
359 LegacyImport import;
360 import.fileName = jsfile;
361 import.asIdentifier = module;
362 m_imports.append(std::move(import));
363}
364
365void JsFile::addModuleImport(const QString &uri, const QString &version, const QString &module)
366{
367 LegacyImport import;
368 import.uri = uri;
369 import.version = version;
370 import.asIdentifier = module;
371 m_imports.append(std::move(import));
372}
373
374void JsFile::LegacyPragmaLibrary::writeOut(OutWriter &lw) const
375{
376 lw.write(u".pragma").space().write(u"library").ensureNewline();
377}
378
379void JsFile::LegacyImport::writeOut(OutWriter &lw) const
380{
381 // either filename or module uri must be present
382 Q_ASSERT(!fileName.isEmpty() || !uri.isEmpty());
383
384 lw.write(u".import").space();
385 if (!uri.isEmpty()) {
386 lw.write(uri).space();
387 if (!version.isEmpty()) {
388 lw.write(version).space();
389 }
390 } else {
391 lw.write(u"\"").write(fileName).write(u"\"").space();
392 }
393 lw.writeRegion(AsTokenRegion).space().write(asIdentifier);
394
395 lw.ensureNewline();
396}
397
408void JsFile::writeOutDirectives(OutWriter &ow) const
409{
410 if (m_pragmaLibrary.has_value()) {
411 m_pragmaLibrary->writeOut(ow);
412 }
413 for (const auto &import : m_imports) {
414 import.writeOut(ow);
415 }
416}
417
418std::shared_ptr<OwningItem> QmlFile::doCopy(const DomItem &) const
419{
420 auto res = std::make_shared<QmlFile>(*this);
421 return res;
422}
423
443 const QString &filePath, const QString &code, const QDateTime &lastDataUpdateAt,
445 : ExternalOwningItem(filePath, lastDataUpdateAt, Paths::qmlFilePath(filePath), derivedFrom,
446 code),
447 m_engine(new QQmlJS::Engine)
448{
449 QQmlJS::Lexer lexer(m_engine.get());
450 lexer.setCode(code, /*lineno = */ 1, /*qmlMode=*/true);
451 QQmlJS::Parser parser(m_engine.get());
453 parser.setIdentifierInsertionEnabled(true);
454 parser.setIncompleteBindingsEnabled(true);
455 }
456 m_isValid = parser.parse();
457 const auto diagnostics = parser.diagnosticMessages();
458 for (const DiagnosticMessage &msg : diagnostics) {
460 std::move(myParsingErrors().errorMessage(msg).withFile(filePath).withPath(m_path)));
461 }
462 m_ast = parser.ast();
463}
464
466{
467 static ErrorGroups res = { { DomItem::domErrorGroup, NewErrorGroup("QmlFile"),
468 NewErrorGroup("Parsing") } };
469 return res;
470}
471
473{
474 auto &members = lazyMembers();
475 bool cont = ExternalOwningItem::iterateDirectSubpaths(self, visitor);
476 cont = cont && self.dvWrapField(visitor, Fields::components, members.m_components);
477 cont = cont && self.dvWrapField(visitor, Fields::pragmas, members.m_pragmas);
478 cont = cont && self.dvWrapField(visitor, Fields::imports, members.m_imports);
479 cont = cont && self.dvWrapField(visitor, Fields::importScope, members.m_importScope);
480 cont = cont
481 && self.dvWrapField(visitor, Fields::fileLocationsTree, members.m_fileLocationsTree);
482 cont = cont && self.dvWrapField(visitor, Fields::comments, members.m_comments);
483 cont = cont && self.dvWrapField(visitor, Fields::astComments, members.m_astComments);
484 return cont;
485}
486
488{
489 ensurePopulated();
490 if (name == Fields::components)
491 return self.wrapField(Fields::components, lazyMembers().m_components);
492 return DomBase::field(self, name);
493}
494
495void QmlFile::addError(const DomItem &self, ErrorMessage &&msg)
496{
497 self.containingObject().addError(std::move(msg));
498}
499
500void QmlFile::writeOut(const DomItem &self, OutWriter &ow) const
501{
502 ensurePopulated();
503 for (const DomItem &p : self.field(Fields::pragmas).values()) {
504 p.writeOut(ow);
505 }
506 for (auto i : self.field(Fields::imports).values()) {
507 i.writeOut(ow);
508 }
509 ow.ensureNewline(2);
510 DomItem mainC = self.field(Fields::components).key(QString()).index(0);
511 mainC.writeOut(ow);
512}
513
514std::shared_ptr<OwningItem> GlobalScope::doCopy(const DomItem &self) const
515{
516 auto res = std::make_shared<GlobalScope>(
518 return res;
519}
520
522{
523 bool cont = ExternalOwningItem::iterateDirectSubpaths(self, visitor);
524 return cont;
525}
526
528{
529 auto it = m_uris.begin();
530 auto end = m_uris.end();
531 DomItem env = self.environment();
532 if (std::shared_ptr<DomEnvironment> envPtr = env.ownerAs<DomEnvironment>()) {
533 while (it != end) {
534 QString uri = it.key();
535 for (int majorV : it.value()) {
536 auto mIndex = envPtr->moduleIndexWithUri(env, uri, majorV, EnvLookup::Normal,
538 mIndex->addQmltypeFilePath(self.canonicalPath());
539 }
540 ++it;
541 }
542 }
543}
544
546{
547 bool cont = ExternalOwningItem::iterateDirectSubpaths(self, visitor);
548 cont = cont && self.dvWrapField(visitor, Fields::components, m_components);
549 cont = cont && self.dvWrapField(visitor, Fields::exports, m_exports);
550 cont = cont && self.dvItemField(visitor, Fields::uris, [this, &self]() {
551 return self.subMapItem(Map::fromMapRef<QSet<int>>(
552 self.pathFromOwner().field(Fields::uris), m_uris,
553 [](const DomItem &map, const PathEls::PathComponent &p, const QSet<int> &el) {
554 QList<int> l(el.cbegin(), el.cend());
555 std::sort(l.begin(), l.end());
556 return map.subListItem(
557 List::fromQList<int>(map.pathFromOwner().appendComponent(p), l,
558 [](const DomItem &list, const PathEls::PathComponent &p,
559 int el) { return list.subDataItem(p, el); }));
560 }));
561 });
562 cont = cont && self.dvWrapField(visitor, Fields::imports, m_imports);
563 return cont;
564}
565
566QmlDirectory::QmlDirectory(
567 const QString &filePath, const QStringList &dirList, const QDateTime &lastDataUpdateAt,
568 int derivedFrom)
569 : ExternalOwningItem(filePath, lastDataUpdateAt, Paths::qmlDirectoryPath(filePath), derivedFrom,
570 dirList.join(QLatin1Char('\n')))
571{
572 for (const QString &f : dirList) {
574 }
575}
576
578{
579 bool cont = ExternalOwningItem::iterateDirectSubpaths(self, visitor);
580 cont = cont && self.dvWrapField(visitor, Fields::exports, m_exports);
581 cont = cont && self.dvItemField(visitor, Fields::qmlFiles, [this, &self]() -> DomItem {
582 QDir baseDir(canonicalFilePath());
583 return self.subMapItem(Map(
584 self.pathFromOwner().field(Fields::qmlFiles),
585 [this, baseDir](const DomItem &map, const QString &key) -> DomItem {
586 QList<Path> res;
587 auto it = m_qmlFiles.find(key);
588 while (it != m_qmlFiles.end() && it.key() == key) {
589 res.append(Paths::qmlFilePath(
590 QFileInfo(baseDir.filePath(it.value())).canonicalFilePath()));
591 ++it;
592 }
593 return map.subReferencesItem(PathEls::Key(key), res);
594 },
595 [this](const DomItem &) {
596 auto keys = m_qmlFiles.keys();
597 return QSet<QString>(keys.begin(), keys.end());
598 },
599 u"List<Reference>"_s));
600 });
601 return cont;
602}
603
604bool QmlDirectory::addQmlFilePath(const QString &relativePath)
605{
606 static const QRegularExpression qmlFileRegularExpression{
608 uR"((?<compName>[a-zA-z0-9_]+)\.(?:qml|qmlannotation|ui\.qml))")
609 };
610 QRegularExpressionMatch m = qmlFileRegularExpression.match(relativePath);
611 if (m.hasMatch() && !m_qmlFiles.values(m.captured(u"compName")).contains(relativePath)) {
612 m_qmlFiles.insert(m.captured(u"compName"), relativePath);
613 Export e;
615 QFileInfo fInfo(dir.filePath(relativePath));
617 e.typeName = m.captured(u"compName");
618 e.typePath = Paths::qmlFileObjectPath(fInfo.canonicalFilePath());
619 e.uri = QLatin1String("file://") + canonicalFilePath();
620 m_exports.insert(e.typeName, e);
621 return true;
622 }
623 return false;
624}
625
626} // end namespace Dom
627} // end namespace QQmlJS
628
\inmodule QtCore\reentrant
Definition qcborarray.h:20
void append(const QCborValue &value)
Definition qcborarray.h:244
\inmodule QtCore\reentrant
Definition qcbormap.h:21
\inmodule QtCore\reentrant
Definition qcborvalue.h:47
\inmodule QtCore\reentrant
Definition qdatetime.h:283
static QDateTime currentDateTimeUtc()
\inmodule QtCore
Definition qdir.h:20
@ Files
Definition qdir.h:23
@ Readable
Definition qdir.h:29
QString suffix() const
Returns the suffix (extension) of the file.
QString canonicalFilePath() const
Returns the file system entry's canonical path, including the entry's name, that is,...
QDir dir() const
Returns a QDir object representing the path of the parent directory of the file system entry that thi...
void append(parameter_type t)
Definition qlist.h:458
iterator begin()
Definition qmap.h:598
iterator end()
Definition qmap.h:602
QList< Key > keys() const
Definition qmap.h:1076
iterator insert(const Key &key, const T &value)
Definition qmap.h:1452
QList< T > values() const
Definition qmap.h:1105
bool parse(const QString &source)
url is used for generating errors.
QString typeNamespace() const
QList< Plugin > plugins() const
virtual DomItem field(const DomItem &self, QStringView name) const
Represents a consistent set of types organized in modules, it is the top level of the DOM.
static ErrorGroup domErrorGroup
std::shared_ptr< T > ownerAs() const
Represents a set of tags grouping a set of related error messages.
Represents an error message connected to the dom.
A OwningItem that refers to an external resource (file,...)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
ExternalOwningItem(const QString &filePath, const QDateTime &lastDataUpdateAt, const Path &pathFromTop, int derivedFrom=0, const QString &code=QString())
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
std::shared_ptr< OwningItem > doCopy(const DomItem &) const override
void addModuleImport(const QString &uri, const QString &version, const QString &module)
void addFileImport(const QString &jsfile, const QString &module)
static ErrorGroups myParsingErrors()
void writeOut(const DomItem &self, OutWriter &lw) const override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
OutWriter & ensureNewline(int nNewlines=1)
OutWriter & write(QStringView v, LineWriter::TextAddType t=LineWriter::TextAddType::Normal)
virtual QDateTime lastDataUpdateAt() const
virtual int revision() const
void addErrorLocal(ErrorMessage &&msg)
Path field(const QString &name) const
static Path Field(QStringView s=u"")
bool addQmlFilePath(const QString &relativePath)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
std::shared_ptr< OwningItem > doCopy(const DomItem &self) const override
void addError(const DomItem &self, ErrorMessage &&msg) override
static ErrorGroups myParsingErrors()
QmlFile(const QString &filePath=QString(), const QString &code=QString(), const QDateTime &lastDataUpdate=QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC), int derivedFrom=0, RecoveryOption option=DisableParserRecovery)
void writeOut(const DomItem &self, OutWriter &lw) const override
DomItem field(const DomItem &self, QStringView name) const override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
static QmlUri fromDirectoryString(const QString &importStr)
static QmlUri fromUriString(const QString &importStr)
bool isValid() const
QString toString() const
static ErrorGroups myParsingErrors()
const QList< Import > & imports() const &
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
QList< ModuleAutoExport > autoExports() const
void ensureInModuleIndex(const DomItem &self, const QString &uri) const
QMap< QString, QString > qmlFiles() const
void setAutoExports(const QList< ModuleAutoExport > &autoExport)
static std::shared_ptr< QmldirFile > fromPathAndCode(const QString &path, const QString &code)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
void ensureInModuleIndex(const DomItem &self) const
static constexpr qint32 Undefined
static constexpr qint32 Latest
void setCode(const QString &code, int lineno, bool qmlMode=true, CodeContinuation codeContinuation=CodeContinuation::Reset)
\inmodule QtCore \reentrant
\inmodule QtCore \reentrant
static QString anchoredPattern(const QString &expression)
iterator insert(const T &value)
Definition qset.h:155
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:78
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
int toInt(bool *ok=nullptr, int base=10) const
Returns the string converted to an int using base base, which is 10 by default and must be between 2 ...
Definition qstring.h:731
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
Definition qstring.cpp:5506
QString & insert(qsizetype i, QChar c)
Definition qstring.cpp:3132
QMap< QString, QString > map
[6]
QSet< QString >::iterator it
Path qmltypesFilePath(const QString &path)
Path jsFilePath(const QString &path)
Path qmlFileObjectPath(const QString &canonicalFilePath)
QCborValue pluginData(const QQmlDirParser::Plugin &pl, const QStringList &cNames)
static QString toString(const UiQualifiedId *qualifiedId, QChar delimiter=QLatin1Char('.'))
Combined button and popup list for selecting options.
@ CaseInsensitive
DBusConnection const char DBusError * error
#define qCDebug(category,...)
GLsizei const GLfloat * v
[13]
const GLfloat * m
GLuint64 key
GLint GLenum GLint components
GLuint index
[2]
GLuint GLuint end
GLfloat GLfloat f
GLuint name
GLfloat n
GLuint res
GLuint GLuint * names
GLuint entry
GLsizei const GLchar *const * path
GLfloat GLfloat p
[1]
GLuint GLenum option
#define NewErrorGroup(name)
Members members(const Members &candidates, QTypeRevision maxMajorVersion, Postprocess &&process)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
SSL_CTX int void * arg
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define QStringLiteral(str)
#define tr(X)
static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &errorSource, qsizetype errorPosition)
Definition qurl.cpp:3517
QList< int > list
[14]
QStringList keys
QCborValue(QCborTag(2), QByteArray("\x01\0\0\0\0\0\0\0\0", 9))
[0]
QString dir
[11]
QStringView el
\inmodule QtCore \reentrant
Definition qchar.h:18
bool contains(const AT &t) const noexcept
Definition qlist.h:45