Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmldomtop_p.h
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// Qt-Security score:significant
4
5#ifndef DOMTOP_H
6#define DOMTOP_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include "qqmldomitem_p.h"
22
23#include <QtCore/QQueue>
24#include <QtCore/QString>
25#include <QtCore/QDateTime>
26
27#include <QtCore/QCborValue>
28#include <QtCore/QCborMap>
29
30#include <memory>
31#include <optional>
32
33QT_BEGIN_NAMESPACE
34
35using namespace Qt::Literals::StringLiterals;
36
37namespace QQmlJS {
38namespace Dom {
39
40class QMLDOM_EXPORT ExternalItemPairBase: public OwningItem { // all access should have the lock of the DomUniverse containing this
42public:
44 DomType kind() const final override { return kindValue; }
46 const QDateTime &validExposedAt = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC),
47 const QDateTime &currentExposedAt = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC),
48 int derivedFrom = 0,
49 const QDateTime &lastDataUpdateAt = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC))
50 : OwningItem(derivedFrom, lastDataUpdateAt),
53 {}
57 virtual std::shared_ptr<ExternalOwningItem> validItem() const = 0;
58 virtual DomItem validItem(const DomItem &self) const = 0;
59 virtual std::shared_ptr<ExternalOwningItem> currentItem() const = 0;
60 virtual DomItem currentItem(const DomItem &self) const = 0;
61
62 QString canonicalFilePath(const DomItem &) const final override;
63 Path canonicalPath(const DomItem &self) const final override;
64 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const final override;
65 DomItem field(const DomItem &self, QStringView name) const final override
66 {
67 return OwningItem::field(self, name);
68 }
69
70 bool currentIsValid() const;
71
72 std::shared_ptr<ExternalItemPairBase> makeCopy(const DomItem &self) const
73 {
74 return std::static_pointer_cast<ExternalItemPairBase>(doCopy(self));
75 }
76
77 QDateTime lastDataUpdateAt() const final override
78 {
79 if (currentItem())
80 return currentItem()->lastDataUpdateAt();
81 return ExternalItemPairBase::lastDataUpdateAt();
82 }
83
84 void refreshedDataAt(QDateTime tNew) final override
85 {
86 if (currentItem())
87 currentItem()->refreshedDataAt(tNew);
88 return OwningItem::refreshedDataAt(tNew);
89 }
90
91 friend class DomUniverse;
92
95};
96
97template<class T>
98class QMLDOM_EXPORT ExternalItemPair final : public ExternalItemPairBase
99{ // all access should have the lock of the DomUniverse containing this
100protected:
101 std::shared_ptr<OwningItem> doCopy(const DomItem &) const override
102 {
103 return std::make_shared<ExternalItemPair>(*this);
104 }
105
106public:
108 friend class DomUniverse;
110 const std::shared_ptr<T> &valid = {}, const std::shared_ptr<T> &current = {},
111 const QDateTime &validExposedAt = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC),
112 const QDateTime &currentExposedAt = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC),
113 int derivedFrom = 0,
114 const QDateTime &lastDataUpdateAt = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC))
115 : ExternalItemPairBase(validExposedAt, currentExposedAt, derivedFrom, lastDataUpdateAt),
116 valid(valid),
117 current(current)
118 {}
119 ExternalItemPair(const ExternalItemPair &o):
121 {
122 }
123 std::shared_ptr<ExternalOwningItem> validItem() const override { return valid; }
124 DomItem validItem(const DomItem &self) const override { return self.copy(valid); }
125 std::shared_ptr<ExternalOwningItem> currentItem() const override { return current; }
126 DomItem currentItem(const DomItem &self) const override { return self.copy(current); }
127 std::shared_ptr<ExternalItemPair> makeCopy(const DomItem &self) const
128 {
129 return std::static_pointer_cast<ExternalItemPair>(doCopy(self));
130 }
131
132 std::shared_ptr<T> valid;
133 std::shared_ptr<T> current;
134};
135
137public:
138 DomTop(QMap<QString, OwnerT> extraOwningItems = {}, int derivedFrom = 0)
139 : OwningItem(derivedFrom), m_extraOwningItems(extraOwningItems)
140 {}
141 DomTop(const DomTop &o):
143 {
145 {
148 }
149 }
151
152 virtual Path canonicalPath() const = 0;
153
154 Path canonicalPath(const DomItem &) const override;
155 DomItem containingObject(const DomItem &) const override;
156 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override;
157 template<typename T>
158 void setExtraOwningItem(const QString &fieldName, const std::shared_ptr<T> &item)
159 {
160 QMutexLocker l(mutex());
161 if (!item)
162 m_extraOwningItems.remove(fieldName);
163 else
164 m_extraOwningItems.insert(fieldName, item);
165 }
166
169
170private:
172};
173
174class QMLDOM_EXPORT DomUniverse final : public DomTop,
175 public std::enable_shared_from_this<DomUniverse>
176{
177 Q_GADGET
178 Q_DECLARE_TR_FUNCTIONS(DomUniverse);
179protected:
180 std::shared_ptr<OwningItem> doCopy(const DomItem &self) const override;
181
182public:
184 DomType kind() const override { return kindValue; }
185
186 static ErrorGroups myErrors();
187
188 DomUniverse(const QString &universeName);
189 DomUniverse(const DomUniverse &) = delete;
190 static std::shared_ptr<DomUniverse> guaranteeUniverse(const std::shared_ptr<DomUniverse> &univ);
191 static DomItem create(const QString &universeName);
192
193 Path canonicalPath() const override;
194 using DomTop::canonicalPath;
195 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override;
196 std::shared_ptr<DomUniverse> makeCopy(const DomItem &self) const
197 {
198 return std::static_pointer_cast<DomUniverse>(doCopy(self));
199 }
200
201 // Helper structure reflecting the change in the map once loading && parsing is completed
202 // formerItem - DomItem representing value (ExternalItemPair) existing in the map before the
203 // loading && parsing. Might be empty (if didn't exist / failure) or equal to currentItem
204 // currentItem - DomItem representing current map value
210
211 LoadResult loadFile(const FileToLoad &file, DomType fileType,
212 DomCreationOption creationOption = {});
213
214 void removePath(const QString &dir);
215
216 std::shared_ptr<ExternalItemPair<GlobalScope>> globalScopeWithName(const QString &name) const
217 {
218 QMutexLocker l(mutex());
219 return m_globalScopeWithName.value(name);
220 }
221
222 std::shared_ptr<ExternalItemPair<GlobalScope>> ensureGlobalScopeWithName(const QString &name)
223 {
224 if (auto current = globalScopeWithName(name))
225 return current;
226 auto newScope = std::make_shared<GlobalScope>(name);
227 auto newValue = std::make_shared<ExternalItemPair<GlobalScope>>(
228 newScope, newScope);
229 QMutexLocker l(mutex());
230 if (auto current = m_globalScopeWithName.value(name))
231 return current;
232 m_globalScopeWithName.insert(name, newValue);
233 return newValue;
234 }
235
237 {
238 QMap<QString, std::shared_ptr<ExternalItemPair<GlobalScope>>> map;
239 {
240 QMutexLocker l(mutex());
241 map = m_globalScopeWithName;
242 }
243 return QSet<QString>(map.keyBegin(), map.keyEnd());
244 }
245
246 std::shared_ptr<ExternalItemPair<QmlDirectory>> qmlDirectoryWithPath(const QString &path) const
247 {
248 QMutexLocker l(mutex());
249 return m_qmlDirectoryWithPath.value(path);
250 }
252 {
253 QMap<QString, std::shared_ptr<ExternalItemPair<QmlDirectory>>> map;
254 {
255 QMutexLocker l(mutex());
256 map = m_qmlDirectoryWithPath;
257 }
258 return QSet<QString>(map.keyBegin(), map.keyEnd());
259 }
260
261 std::shared_ptr<ExternalItemPair<QmldirFile>> qmldirFileWithPath(const QString &path) const
262 {
263 QMutexLocker l(mutex());
264 return m_qmldirFileWithPath.value(path);
265 }
267 {
268 QMap<QString, std::shared_ptr<ExternalItemPair<QmldirFile>>> map;
269 {
270 QMutexLocker l(mutex());
271 map = m_qmldirFileWithPath;
272 }
273 return QSet<QString>(map.keyBegin(), map.keyEnd());
274 }
275
276 std::shared_ptr<ExternalItemPair<QmlFile>> qmlFileWithPath(const QString &path) const
277 {
278 QMutexLocker l(mutex());
279 return m_qmlFileWithPath.value(path);
280 }
282 {
283 QMap<QString, std::shared_ptr<ExternalItemPair<QmlFile>>> map;
284 {
285 QMutexLocker l(mutex());
286 map = m_qmlFileWithPath;
287 }
288 return QSet<QString>(map.keyBegin(), map.keyEnd());
289 }
290
291 std::shared_ptr<ExternalItemPair<JsFile>> jsFileWithPath(const QString &path) const
292 {
293 QMutexLocker l(mutex());
294 return m_jsFileWithPath.value(path);
295 }
297 {
298 QMap<QString, std::shared_ptr<ExternalItemPair<JsFile>>> map;
299 {
300 QMutexLocker l(mutex());
301 map = m_jsFileWithPath;
302 }
303 return QSet<QString>(map.keyBegin(), map.keyEnd());
304 }
305
306 std::shared_ptr<ExternalItemPair<QmltypesFile>> qmltypesFileWithPath(const QString &path) const
307 {
308 QMutexLocker l(mutex());
309 return m_qmltypesFileWithPath.value(path);
310 }
312 {
313 QMap<QString, std::shared_ptr<ExternalItemPair<QmltypesFile>>> map;
314 {
315 QMutexLocker l(mutex());
316 map = m_qmltypesFileWithPath;
317 }
318 return QSet<QString>(map.keyBegin(), map.keyEnd());
319 }
320
321 QString name() const {
322 return m_name;
323 }
324
325private:
326 struct ContentWithDate
327 {
328 QString content;
329 QDateTime date;
330 };
331 // contains either Content with the timestamp when it was read or an Error
332 using ReadResult = std::variant<ContentWithDate, ErrorMessage>;
333 ReadResult readFileContent(const QString &canonicalPath) const;
334
335 LoadResult load(const ContentWithDate &codeWithDate, const FileToLoad &file, DomType fType,
336 DomCreationOption creationOption = {});
337
338 // contains either Content to be parsed or LoadResult if loading / parsing is not needed
339 using PreloadResult = std::variant<ContentWithDate, LoadResult>;
340 PreloadResult preload(const DomItem &univ, const FileToLoad &file, DomType fType) const;
341
342 std::shared_ptr<QmlFile> parseQmlFile(const QString &code, const FileToLoad &file,
343 const QDateTime &contentDate,
344 DomCreationOption creationOption);
345 std::shared_ptr<JsFile> parseJsFile(const QString &code, const FileToLoad &file,
346 const QDateTime &contentDate);
347 std::shared_ptr<ExternalItemPairBase> getPathValueOrNull(DomType fType,
348 const QString &path) const;
349 std::optional<DomItem> getItemIfMostRecent(const DomItem &univ, DomType fType,
350 const QString &path) const;
351 std::optional<DomItem> getItemIfHasSameCode(const DomItem &univ, DomType fType,
352 const QString &canonicalPath,
353 const ContentWithDate &codeWithDate) const;
354 static bool valueHasMostRecentItem(const ExternalItemPairBase *value,
355 const QDateTime &lastModified);
356 static bool valueHasSameContent(const ExternalItemPairBase *value, const QString &content);
357
358 // TODO better name / consider proper public get/set
359 template <typename T>
360 QMap<QString, std::shared_ptr<ExternalItemPair<T>>> &getMutableRefToMap()
361 {
362 Q_ASSERT(!mutex()->tryLock());
363 if constexpr (std::is_same_v<T, QmlDirectory>) {
364 return m_qmlDirectoryWithPath;
365 }
366 if constexpr (std::is_same_v<T, QmldirFile>) {
367 return m_qmldirFileWithPath;
368 }
369 if constexpr (std::is_same_v<T, QmlFile>) {
370 return m_qmlFileWithPath;
371 }
372 if constexpr (std::is_same_v<T, JsFile>) {
373 return m_jsFileWithPath;
374 }
375 if constexpr (std::is_same_v<T, QmltypesFile>) {
376 return m_qmltypesFileWithPath;
377 }
378 if constexpr (std::is_same_v<T, GlobalScope>) {
379 return m_globalScopeWithName;
380 }
381 Q_UNREACHABLE();
382 }
383
384 // Inserts or updates an entry reflecting ExternalItem in the corresponding map
385 // Returns a pair of:
386 // - current ExternalItemPair, current value in the map (might be empty, or equal to curValue)
387 // - new current ExternalItemPair, value in the map after after the execution of this function
388 template <typename T>
389 std::pair<std::shared_ptr<ExternalItemPair<T>>, std::shared_ptr<ExternalItemPair<T>>>
390 insertOrUpdateEntry(std::shared_ptr<T> newItem)
391 {
392 std::shared_ptr<ExternalItemPair<T>> curValue;
393 std::shared_ptr<ExternalItemPair<T>> newCurValue;
394 QString canonicalPath = newItem->canonicalFilePath();
395 QDateTime now = QDateTime::currentDateTimeUtc();
396 {
397 QMutexLocker l(mutex());
398 auto &map = getMutableRefToMap<T>();
399 auto it = map.find(canonicalPath);
400 if (it != map.cend() && (*it) && (*it)->current) {
401 curValue = *it;
402 if (valueHasSameContent(curValue.get(), newItem->code())) {
403 // value in the map has same content as newItem, a.k.a. most recent
404 newCurValue = curValue;
405 if (newCurValue->current->lastDataUpdateAt() < newItem->lastDataUpdateAt()) {
406 // update timestamp in the current, as if its content was refreshed by
407 // NewItem
408 newCurValue->current->refreshedDataAt(newItem->lastDataUpdateAt());
409 }
410 } else if (curValue->current->lastDataUpdateAt() > newItem->lastDataUpdateAt()) {
411 // value in the map is more recent than newItem, nothing to update
412 newCurValue = curValue;
413 } else {
414 // perform update with newItem
415 curValue->current = std::move(newItem);
416 curValue->currentExposedAt = now;
417 if (curValue->current->isValid()) {
418 curValue->valid = curValue->current;
419 curValue->validExposedAt = std::move(now);
420 }
421 newCurValue = curValue;
422 }
423 } else {
424 // not found / invalid, just insert
425 newCurValue = std::make_shared<ExternalItemPair<T>>(
426 (newItem->isValid() ? newItem : std::shared_ptr<T>()), newItem, now, now);
427 map.insert(canonicalPath, newCurValue);
428 }
429 }
430 return std::make_pair(curValue, newCurValue);
431 }
432
433 // Inserts or updates an entry reflecting ExternalItem in the corresponding map
434 // returns LoadResult reflecting the change made to the map
435 template <typename T>
436 LoadResult insertOrUpdateExternalItem(std::shared_ptr<T> extItem)
437 {
438 auto change = insertOrUpdateEntry<T>(std::move(extItem));
439 DomItem univ(shared_from_this());
440 return { univ.copy(change.first), univ.copy(change.second) };
441 }
442
443private:
444 QString m_name;
445 QMap<QString, std::shared_ptr<ExternalItemPair<GlobalScope>>> m_globalScopeWithName;
446 QMap<QString, std::shared_ptr<ExternalItemPair<QmlDirectory>>> m_qmlDirectoryWithPath;
447 QMap<QString, std::shared_ptr<ExternalItemPair<QmldirFile>>> m_qmldirFileWithPath;
448 QMap<QString, std::shared_ptr<ExternalItemPair<QmlFile>>> m_qmlFileWithPath;
449 QMap<QString, std::shared_ptr<ExternalItemPair<JsFile>>> m_jsFileWithPath;
450 QMap<QString, std::shared_ptr<ExternalItemPair<QmltypesFile>>> m_qmltypesFileWithPath;
451};
452
455public:
457 DomType kind() const final override { return kindValue; }
459 const Path &canonicalPath,
460 const QDateTime &currentExposedAt = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC),
461 int derivedFrom = 0,
462 const QDateTime &lastDataUpdateAt = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC))
463 : OwningItem(derivedFrom, lastDataUpdateAt),
466 {}
468
469 virtual std::shared_ptr<ExternalOwningItem> currentItem() const = 0;
470 virtual DomItem currentItem(const DomItem &) const = 0;
471
472 QString canonicalFilePath(const DomItem &) const final override;
473 Path canonicalPath() const { return m_canonicalPath; }
474 Path canonicalPath(const DomItem &) const final override { return canonicalPath(); }
475 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const final override;
476 DomItem field(const DomItem &self, QStringView name) const final override
477 {
478 return OwningItem::field(self, name);
479 }
480
481 int currentRevision(const DomItem &self) const;
482 int lastRevision(const DomItem &self) const;
483 int lastValidRevision(const DomItem &self) const;
484
485 std::shared_ptr<ExternalItemInfoBase> makeCopy(const DomItem &self) const
486 {
487 return std::static_pointer_cast<ExternalItemInfoBase>(doCopy(self));
488 }
489
490 QDateTime lastDataUpdateAt() const final override
491 {
492 if (currentItem())
493 return currentItem()->lastDataUpdateAt();
494 return OwningItem::lastDataUpdateAt();
495 }
496
497 void refreshedDataAt(QDateTime tNew) final override
498 {
499 if (currentItem())
500 currentItem()->refreshedDataAt(tNew);
501 return OwningItem::refreshedDataAt(tNew);
502 }
503
504 void ensureLogicalFilePath(const QString &path) {
505 QMutexLocker l(mutex());
506 if (!m_logicalFilePaths.contains(path))
507 m_logicalFilePaths.append(path);
508 }
509
511 QMutexLocker l(mutex()); // should not be needed, as it should not change...
512 return m_currentExposedAt;
513 }
514
515 void setCurrentExposedAt(QDateTime d) {
516 QMutexLocker l(mutex()); // should not be needed, as it should not change...
517 m_currentExposedAt = d;
518 }
519
520
522 QMutexLocker l(mutex());
523 return m_logicalFilePaths;
524 }
525
526 private:
527 friend class DomEnvironment;
528 Path m_canonicalPath;
529 QDateTime m_currentExposedAt;
530 QStringList m_logicalFilePaths;
531};
532
533template<typename T>
534class ExternalItemInfo final : public ExternalItemInfoBase
535{
536protected:
537 std::shared_ptr<OwningItem> doCopy(const DomItem &) const override
538 {
539 return std::make_shared<ExternalItemInfo>(*this);
540 }
541
542public:
545 const std::shared_ptr<T> &current = std::shared_ptr<T>(),
546 const QDateTime &currentExposedAt = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC),
547 int derivedFrom = 0,
548 const QDateTime &lastDataUpdateAt = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC))
549 : ExternalItemInfoBase(current->canonicalPath().dropTail(), currentExposedAt, derivedFrom,
550 lastDataUpdateAt),
551 current(current)
552 {}
553 ExternalItemInfo(const QString &canonicalPath) : current(new T(canonicalPath)) { }
554 ExternalItemInfo(const ExternalItemInfo &o):
556 {
557 }
558
559 std::shared_ptr<ExternalItemInfo> makeCopy(const DomItem &self) const
560 {
561 return std::static_pointer_cast<ExternalItemInfo>(doCopy(self));
562 }
563
564 std::shared_ptr<ExternalOwningItem> currentItem() const override {
565 return current;
566 }
567 DomItem currentItem(const DomItem &self) const override { return self.copy(current); }
568
569 std::shared_ptr<T> current;
570};
571
573{ // internal, should be cleaned, but nobody should use this...
574public:
575 bool operator==(Dependency const &o) const
576 {
577 return uri == o.uri && version.majorVersion == o.version.majorVersion
578 && version.minorVersion == o.version.minorVersion && filePath == o.filePath;
579 }
580 QString uri; // either dotted uri or file:, http: https: uri
582 QString filePath; // for file deps
584};
585
586class QMLDOM_EXPORT LoadInfo final : public OwningItem
587{
588 Q_DECLARE_TR_FUNCTIONS(LoadInfo);
589
590protected:
591 std::shared_ptr<OwningItem> doCopy(const DomItem &self) const override;
592
593public:
595 DomType kind() const override { return kindValue; }
596
597 enum class Status {
598 NotStarted, // dependencies non checked yet
599 Starting, // adding deps
600 InProgress, // waiting for all deps to be loaded
601 CallingCallbacks, // calling callbacks
602 Done // fully loaded
603 };
604
605 LoadInfo(const Path &elPath = Path(), Status status = Status::NotStarted, int nLoaded = 0,
606 int derivedFrom = 0,
607 const QDateTime &lastDataUpdateAt = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC))
608 : OwningItem(derivedFrom, lastDataUpdateAt),
610 m_status(status),
611 m_nLoaded(nLoaded)
612 {
613 }
615 {
616 {
617 QMutexLocker l(o.mutex());
618 m_status = o.m_status;
619 m_nLoaded = o.m_nLoaded;
620 m_toDo = o.m_toDo;
621 m_inProgress = o.m_inProgress;
622 m_endCallbacks = o.m_endCallbacks;
623 }
624 }
625
626 Path canonicalPath(const DomItem &self) const override;
627
628 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override;
629 std::shared_ptr<LoadInfo> makeCopy(const DomItem &self) const
630 {
631 return std::static_pointer_cast<LoadInfo>(doCopy(self));
632 }
633 void addError(const DomItem &self, ErrorMessage &&msg) override
634 {
636 }
637
638 void addEndCallback(const DomItem &self, std::function<void(Path, const DomItem &, const DomItem &)> callback);
639
640 void advanceLoad(const DomItem &self);
641 void finishedLoadingDep(const DomItem &self, const Dependency &d);
642 void execEnd(const DomItem &self);
643
645 {
646 QMutexLocker l(mutex());
647 return m_status;
648 }
649
650 int nLoaded() const
651 {
652 QMutexLocker l(mutex());
653 return m_nLoaded;
654 }
655
657 {
658 QMutexLocker l(mutex()); // we should never change this, remove lock?
659 return m_elementCanonicalPath;
660 }
661
662 int nNotDone() const
663 {
664 QMutexLocker l(mutex());
665 return m_toDo.size() + m_inProgress.size();
666 }
667
669 {
670 QMutexLocker l(mutex());
671 return m_inProgress;
672 }
673
675 {
676 QMutexLocker l(mutex());
677 return m_toDo;
678 }
679
680 int nCallbacks() const
681 {
682 QMutexLocker l(mutex());
683 return m_endCallbacks.size();
684 }
685
686private:
687 void doAddDependencies(const DomItem &self);
688 void addDependency(const DomItem &self, const Dependency &dep);
689
690 Path m_elementCanonicalPath;
691 Status m_status;
692 int m_nLoaded;
693 QQueue<Dependency> m_toDo;
694 QList<Dependency> m_inProgress;
695 QList<std::function<void(Path, const DomItem &, const DomItem &)>> m_endCallbacks;
696};
697
699
701
703{
705public:
706 enum class Cached { None, First, All };
707 Q_ENUM(Cached)
708
709 static RefCacheEntry forPath(const DomItem &el, const Path &canonicalPath);
710 static bool addForPath(const DomItem &el, const Path &canonicalPath, const RefCacheEntry &entry,
712
715};
716
717class QMLDOM_EXPORT DomEnvironment final : public DomTop,
718 public std::enable_shared_from_this<DomEnvironment>
719{
720 Q_GADGET
721 Q_DECLARE_TR_FUNCTIONS(DomEnvironment);
722protected:
723 std::shared_ptr<OwningItem> doCopy(const DomItem &self) const override;
724
725private:
726 struct TypeReader
727 {
728 TypeReader(const std::weak_ptr<DomEnvironment> &env, const QStringList &importPaths)
729 : m_env(env), m_importPaths(importPaths)
730 {
731 }
732
733 std::weak_ptr<DomEnvironment> m_env;
734 QStringList m_importPaths;
735
736 QList<QQmlJS::DiagnosticMessage>
737 operator()(QQmlJSImporter *importer, const QString &filePath,
738 const QSharedPointer<QQmlJSScope> &scopeToPopulate);
739 };
740
741public:
742 enum class Option {
743 Default = 0x0,
744 KeepValid = 0x1, // if there is a previous valid version, use that instead of the latest
745 Exported = 0x2, // the current environment is accessible by multiple threads, one should only modify whole OwningItems, and in general load and do other operations in other (Child) environments
746 NoReload = 0x4, // never reload something that was already loaded by the parent environment
747 WeakLoad = 0x8, // load only the names of the available types, not the types (qml files) themselves
748 SingleThreaded = 0x10, // do all operations in a single thread
749 NoDependencies = 0x20 // will not load dependencies (useful when editing)
750 };
751 Q_ENUM(Option)
752 Q_DECLARE_FLAGS(Options, Option);
753
754 static ErrorGroups myErrors();
756 DomType kind() const override;
757
758 Path canonicalPath() const override;
759 using DomTop::canonicalPath;
760 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override;
761 DomItem field(const DomItem &self, QStringView name) const final override;
762
763 std::shared_ptr<DomEnvironment> makeCopy(const DomItem &self) const;
764
765 void loadFile(const FileToLoad &file, const Callback &callback,
766 std::optional<DomType> fileType = std::optional<DomType>(),
767 const ErrorHandler &h = nullptr /* used only in loadPendingDependencies*/);
768 void loadBuiltins(const Callback &callback = nullptr, const ErrorHandler &h = nullptr);
769 void loadModuleDependency(const QString &uri, Version v, const Callback &callback = nullptr,
770 const ErrorHandler & = nullptr);
771
772 void removePath(const QString &path);
773
774 std::shared_ptr<DomUniverse> universe() const;
775
776 QSet<QString> moduleIndexUris(const DomItem &self, EnvLookup lookup = EnvLookup::Normal) const;
777 QSet<int> moduleIndexMajorVersions(const DomItem &self, const QString &uri,
778 EnvLookup lookup = EnvLookup::Normal) const;
779 std::shared_ptr<ModuleIndex> moduleIndexWithUri(const DomItem &self, const QString &uri, int majorVersion,
780 EnvLookup lookup, Changeable changeable,
781 const ErrorHandler &errorHandler = nullptr);
782 std::shared_ptr<ModuleIndex> moduleIndexWithUri(const DomItem &self, const QString &uri, int majorVersion,
783 EnvLookup lookup = EnvLookup::Normal) const;
784 std::shared_ptr<ExternalItemInfo<QmlDirectory>>
785 qmlDirectoryWithPath(const DomItem &self, const QString &path, EnvLookup options = EnvLookup::Normal) const;
786 QSet<QString> qmlDirectoryPaths(const DomItem &self, EnvLookup options = EnvLookup::Normal) const;
787 std::shared_ptr<ExternalItemInfo<QmldirFile>>
788 qmldirFileWithPath(const DomItem &self, const QString &path, EnvLookup options = EnvLookup::Normal) const;
789 QSet<QString> qmldirFilePaths(const DomItem &self, EnvLookup options = EnvLookup::Normal) const;
790 std::shared_ptr<ExternalItemInfoBase>
791 qmlDirWithPath(const DomItem &self, const QString &path, EnvLookup options = EnvLookup::Normal) const;
792 QSet<QString> qmlDirPaths(const DomItem &self, EnvLookup options = EnvLookup::Normal) const;
793 std::shared_ptr<ExternalItemInfo<QmlFile>>
794 qmlFileWithPath(const DomItem &self, const QString &path, EnvLookup options = EnvLookup::Normal) const;
795 QSet<QString> qmlFilePaths(const DomItem &self, EnvLookup lookup = EnvLookup::Normal) const;
796 std::shared_ptr<ExternalItemInfo<JsFile>>
797 jsFileWithPath(const DomItem &self, const QString &path, EnvLookup options = EnvLookup::Normal) const;
798 QSet<QString> jsFilePaths(const DomItem &self, EnvLookup lookup = EnvLookup::Normal) const;
799 std::shared_ptr<ExternalItemInfo<QmltypesFile>>
800 qmltypesFileWithPath(const DomItem &self, const QString &path, EnvLookup options = EnvLookup::Normal) const;
801 QSet<QString> qmltypesFilePaths(const DomItem &self, EnvLookup lookup = EnvLookup::Normal) const;
802 std::shared_ptr<ExternalItemInfo<GlobalScope>>
803 globalScopeWithName(const DomItem &self, const QString &name, EnvLookup lookup = EnvLookup::Normal) const;
804 std::shared_ptr<ExternalItemInfo<GlobalScope>>
805 ensureGlobalScopeWithName(const DomItem &self, const QString &name, EnvLookup lookup = EnvLookup::Normal);
806 QSet<QString> globalScopeNames(const DomItem &self, EnvLookup lookup = EnvLookup::Normal) const;
807
808 explicit DomEnvironment(const QStringList &loadPaths, Options options = Option::SingleThreaded,
809 DomCreationOption domCreationOption = Default,
810 const std::shared_ptr<DomUniverse> &universe = nullptr);
811 explicit DomEnvironment(const std::shared_ptr<DomEnvironment> &parent,
812 const QStringList &loadPaths, Options options = Option::SingleThreaded,
813 DomCreationOption domCreationOption = Default);
814 DomEnvironment(const DomEnvironment &o) = delete;
815 static std::shared_ptr<DomEnvironment>
816 create(const QStringList &loadPaths, Options options = Option::SingleThreaded,
818 const DomItem &universe = DomItem::empty);
819
820 // TODO AddOption can easily be removed later. KeepExisting option only used in one
821 // place which will be removed in https://codereview.qt-project.org/c/qt/qtdeclarative/+/523217
822 void addQmlFile(const std::shared_ptr<QmlFile> &file,
824 void addQmlDirectory(const std::shared_ptr<QmlDirectory> &file,
826 void addQmldirFile(const std::shared_ptr<QmldirFile> &file,
828 void addQmltypesFile(const std::shared_ptr<QmltypesFile> &file,
830 void addJsFile(const std::shared_ptr<JsFile> &file, AddOption option = AddOption::KeepExisting);
831 void addGlobalScope(const std::shared_ptr<GlobalScope> &file,
833
834 bool commitToBase(
835 const DomItem &self, const std::shared_ptr<DomEnvironment> &validEnv = nullptr);
836
837 void addDependenciesToLoad(const Path &path);
838 void addLoadInfo(
839 const DomItem &self, const std::shared_ptr<LoadInfo> &loadInfo);
840 std::shared_ptr<LoadInfo> loadInfo(const Path &path) const;
841 QList<Path> loadInfoPaths() const;
844 bool finishLoadingDependencies(int waitMSec = 30000);
845 void addWorkForLoadInfo(const Path &elementCanonicalPath);
846
847 Options options() const;
848
849 std::shared_ptr<DomEnvironment> base() const;
850
851 QStringList loadPaths() const;
852 QStringList qmldirFiles() const;
853
854 QString globalScopeName() const;
855
858
859 void addAllLoadedCallback(const DomItem &self, Callback c);
860
861 void clearReferenceCache();
862 void setLoadPaths(const QStringList &v);
863
864 // Helper structure reflecting the change in the map once loading / fetching is completed
865 // formerItem - DomItem representing value (ExternalItemInfo) existing in the map before the
866 // loading && parsing. Might be empty (if didn't exist / failure) or equal to currentItem
867 // currentItem - DomItem representing current map value
873 // TODO(QTBUG-121171)
874 template <typename T>
875 LoadResult insertOrUpdateExternalItemInfo(const QString &path, std::shared_ptr<T> extItem)
876 {
877 // maybe in the next revision this all can be just substituted by the addExternalItem
878 DomItem env(shared_from_this());
879 // try to fetch from the current env.
880 if (auto curValue = lookup<T>(path, EnvLookup::NoBase)) {
881 // found in the "initial" env
882 return { env.copy(curValue), env.copy(curValue) };
883 }
884 std::shared_ptr<ExternalItemInfo<T>> newCurValue;
885 // try to fetch from the base env
886 auto valueInBase = lookup<T>(path, EnvLookup::BaseOnly);
887 if (!valueInBase) {
888 // Nothing found. Just create an externalItemInfo which will be inserted
889 newCurValue = std::make_shared<ExternalItemInfo<T>>(std::move(extItem),
890 QDateTime::currentDateTimeUtc());
891 } else {
892 // prepare updated value as a copy of the value from the Base to be inserted
893 newCurValue = valueInBase->makeCopy(env);
894 if (newCurValue->current != extItem) {
895 newCurValue->current = std::move(extItem);
896 newCurValue->setCurrentExposedAt(QDateTime::currentDateTimeUtc());
897 }
898 }
899 // Before inserting new or updated value, check one more time, if ItemInfo is already
900 // present
901 // lookup<> can't be used here because of the data-race
902 {
903 QMutexLocker l(mutex());
904 auto &map = getMutableRefToMap<T>();
905 const auto &it = map.find(path);
906 if (it != map.end())
907 return { env.copy(*it), env.copy(*it) };
908 // otherwise insert
909 map.insert(path, newCurValue);
910 }
911 return { env.copy(valueInBase), env.copy(newCurValue) };
912 }
913
914 template <typename T>
915 void addExternalItemInfo(const DomItem &newExtItem, const Callback &loadCallback,
916 const Callback &endCallback)
917 {
918 // get either Valid "file" from the ExternalItemPair or the current (wip) "file"
919 std::shared_ptr<T> newItemPtr;
920 if (options() & DomEnvironment::Option::KeepValid)
921 newItemPtr = newExtItem.field(Fields::validItem).ownerAs<T>();
922 if (!newItemPtr)
923 newItemPtr = newExtItem.field(Fields::currentItem).ownerAs<T>();
924 Q_ASSERT(newItemPtr && "envCallbackForFile reached without current file");
925
926 auto loadResult = insertOrUpdateExternalItemInfo(newExtItem.canonicalFilePath(),
927 std::move(newItemPtr));
928 Path p = loadResult.currentItem.canonicalPath();
929 {
930 auto depLoad = qScopeGuard([p, this, endCallback] {
932 // add EndCallback to the queue, which should be called once all dependencies are
933 // loaded
934 if (endCallback) {
935 DomItem env = DomItem(shared_from_this());
936 addAllLoadedCallback(
937 env, [p, endCallback](Path, const DomItem &, const DomItem &env) {
938 DomItem el = env.path(p);
939 endCallback(p, el, el);
940 });
941 }
942 });
943 // call loadCallback
944 if (loadCallback) {
945 loadCallback(p, loadResult.formerItem, loadResult.currentItem);
946 }
947 }
948 }
949 void populateFromQmlFile(MutableDomItem &&qmlFile);
950 DomCreationOption domCreationOption() const { return m_domCreationOption; }
951
952private:
953 friend class RefCacheEntry;
954
955 void loadFile(const FileToLoad &file, const Callback &loadCallback, const Callback &endCallback,
956 std::optional<DomType> fileType = std::optional<DomType>(),
957 const ErrorHandler &h = nullptr);
958
959 void loadModuleDependency(
960 const DomItem &self, const QString &uri, Version v, const Callback &loadCallback = nullptr,
961 const Callback &endCallback = nullptr, const ErrorHandler & = nullptr);
962
963 template <typename T>
964 QSet<QString> getStrings(function_ref<QSet<QString>()> getBase, const QMap<QString, T> &selfMap,
965 EnvLookup lookup) const;
966
967 template <typename T>
968 const QMap<QString, std::shared_ptr<ExternalItemInfo<T>>> &getConstRefToMap() const
969 {
970 Q_ASSERT(!mutex()->tryLock());
971 if constexpr (std::is_same_v<T, GlobalScope>) {
972 return m_globalScopeWithName;
973 }
974 if constexpr (std::is_same_v<T, QmlDirectory>) {
975 return m_qmlDirectoryWithPath;
976 }
977 if constexpr (std::is_same_v<T, QmldirFile>) {
978 return m_qmldirFileWithPath;
979 }
980 if constexpr (std::is_same_v<T, QmlFile>) {
981 return m_qmlFileWithPath;
982 }
983 if constexpr (std::is_same_v<T, JsFile>) {
984 return m_jsFileWithPath;
985 }
986 if constexpr (std::is_same_v<T, QmltypesFile>) {
987 return m_qmltypesFileWithPath;
988 }
989 Q_UNREACHABLE();
990 }
991
992 template <typename T>
993 std::shared_ptr<ExternalItemInfo<T>> lookup(const QString &path, EnvLookup options) const
994 {
995 if (options != EnvLookup::BaseOnly) {
996 QMutexLocker l(mutex());
997 const auto &map = getConstRefToMap<T>();
998 const auto &it = map.find(path);
999 if (it != map.end())
1000 return *it;
1001 }
1002 if (options != EnvLookup::NoBase && m_base)
1003 return m_base->lookup<T>(path, options);
1004 return {};
1005 }
1006
1007 template <typename T>
1008 QMap<QString, std::shared_ptr<ExternalItemInfo<T>>> &getMutableRefToMap()
1009 {
1010 Q_ASSERT(!mutex()->tryLock());
1011 if constexpr (std::is_same_v<T, QmlDirectory>) {
1012 return m_qmlDirectoryWithPath;
1013 }
1014 if constexpr (std::is_same_v<T, QmldirFile>) {
1015 return m_qmldirFileWithPath;
1016 }
1017 if constexpr (std::is_same_v<T, QmlFile>) {
1018 return m_qmlFileWithPath;
1019 }
1020 if constexpr (std::is_same_v<T, JsFile>) {
1021 return m_jsFileWithPath;
1022 }
1023 if constexpr (std::is_same_v<T, QmltypesFile>) {
1024 return m_qmltypesFileWithPath;
1025 }
1026 if constexpr (std::is_same_v<T, GlobalScope>) {
1027 return m_globalScopeWithName;
1028 }
1029 Q_UNREACHABLE();
1030 }
1031
1032 template <typename T>
1033 void addExternalItem(std::shared_ptr<T> file, QString key, AddOption option)
1034 {
1035 if (!file)
1036 return;
1037
1038 auto eInfo = std::make_shared<ExternalItemInfo<T>>(file, QDateTime::currentDateTimeUtc());
1039 // Lookup helper can't be used here, because it introduces data-race otherwise
1040 // (other modifications might happen between the lookup and the insert)
1041 QMutexLocker l(mutex());
1042 auto &map = getMutableRefToMap<T>();
1043 const auto &it = map.find(key);
1044 if (it != map.end() && option == AddOption::KeepExisting)
1045 return;
1046 map.insert(key, eInfo);
1047 }
1048
1049 using FetchResult =
1050 std::pair<std::shared_ptr<ExternalItemInfoBase>, std::shared_ptr<ExternalItemInfoBase>>;
1051 // This function tries to get an Info object about the ExternalItem from the current env
1052 // and depending on the result and options tries to fetch it from the Parent env,
1053 // saving a copy with an updated timestamp
1054 template <typename T>
1055 FetchResult fetchFileFromEnvs(const FileToLoad &file)
1056 {
1057 const auto &path = file.canonicalPath();
1058 // lookup only in the current env
1059 if (auto value = lookup<T>(path, EnvLookup::NoBase)) {
1060 return std::make_pair(value, value);
1061 }
1062 // try to find the file in the base(parent) Env and insert if found
1063 if (options() & Option::NoReload) {
1064 if (auto baseV = lookup<T>(path, EnvLookup::BaseOnly)) {
1065 // Watch out! QTBUG-121171
1066 // It's possible between the lookup and creation of curVal, baseV && baseV->current
1067 // might have changed
1068 // Prepare a value to be inserted as copy of the value from Base
1069 auto curV = std::make_shared<ExternalItemInfo<T>>(
1070 baseV->current, QDateTime::currentDateTimeUtc(), baseV->revision(),
1071 baseV->lastDataUpdateAt());
1072 // Lookup one more time if the value was already inserted to the current env
1073 // Lookup can't be used here because of the data-race
1074 {
1075 QMutexLocker l(mutex());
1076 auto &map = getMutableRefToMap<T>();
1077 const auto &it = map.find(path);
1078 if (it != map.end())
1079 return std::make_pair(*it, *it);
1080 // otherwise insert
1081 map.insert(path, curV);
1082 }
1083 return std::make_pair(baseV, curV);
1084 }
1085 }
1086 return std::make_pair(nullptr, nullptr);
1087 }
1088
1089 Callback getLoadCallbackFor(DomType fileType, const Callback &loadCallback);
1090
1091 std::shared_ptr<ModuleIndex> lookupModuleInEnv(const QString &uri, int majorVersion) const;
1092 // ModuleLookupResult contains the ModuleIndex pointer, and an indicator whether it was found
1093 // in m_base or in m_moduleIndexWithUri
1094 struct ModuleLookupResult {
1095 enum Origin : bool {FromBase, FromGlobal};
1096 std::shared_ptr<ModuleIndex> module;
1097 Origin fromBase = FromGlobal;
1098 };
1099 // helper function used by the moduleIndexWithUri methods
1100 ModuleLookupResult moduleIndexWithUriHelper(const DomItem &self, const QString &uri, int majorVersion,
1101 EnvLookup lookup = EnvLookup::Normal) const;
1102
1103 const Options m_options;
1104 const std::shared_ptr<DomEnvironment> m_base;
1105 std::shared_ptr<DomEnvironment> m_lastValidBase;
1106 const std::shared_ptr<DomUniverse> m_universe;
1107 QStringList m_loadPaths; // paths for qml
1108 QString m_globalScopeName;
1109 QMap<QString, QMap<int, std::shared_ptr<ModuleIndex>>> m_moduleIndexWithUri;
1110 QMap<QString, std::shared_ptr<ExternalItemInfo<GlobalScope>>> m_globalScopeWithName;
1111 QMap<QString, std::shared_ptr<ExternalItemInfo<QmlDirectory>>> m_qmlDirectoryWithPath;
1112 QMap<QString, std::shared_ptr<ExternalItemInfo<QmldirFile>>> m_qmldirFileWithPath;
1113 QMap<QString, std::shared_ptr<ExternalItemInfo<QmlFile>>> m_qmlFileWithPath;
1114 QMap<QString, std::shared_ptr<ExternalItemInfo<JsFile>>> m_jsFileWithPath;
1115 QMap<QString, std::shared_ptr<ExternalItemInfo<QmltypesFile>>> m_qmltypesFileWithPath;
1116 QQueue<Path> m_loadsWithWork;
1117 QQueue<Path> m_inProgress;
1118 QHash<Path, std::shared_ptr<LoadInfo>> m_loadInfos;
1119 QList<Import> m_implicitImports;
1120 QList<Callback> m_allLoadedCallback;
1121 QHash<Path, RefCacheEntry> m_referenceCache;
1122 DomCreationOption m_domCreationOption;
1123
1124 struct SemanticAnalysis
1125 {
1126 SemanticAnalysis(const QStringList &loadPaths);
1127 void updateLoadPaths(const QStringList &loadPaths);
1128
1129 std::shared_ptr<QQmlJSResourceFileMapper> m_mapper;
1130 std::shared_ptr<QQmlJSImporter> m_importer;
1131 };
1132 std::optional<SemanticAnalysis> m_semanticAnalysis;
1133public:
1134 SemanticAnalysis semanticAnalysis();
1135};
1136Q_DECLARE_OPERATORS_FOR_FLAGS(DomEnvironment::Options)
1137
1138} // end namespace Dom
1139} // end namespace QQmlJS
1140QT_END_NAMESPACE
1141#endif // DOMTOP_H
DomType kind() const override
Path canonicalPath(const DomItem &self) const override
const CommentedElement * commentForNode(AST::Node *n, CommentAnchor location) const
AstComments(const std::shared_ptr< Engine > &e)
std::pair< AST::Node *, CommentAnchor > CommentKey
AstComments(const AstComments &o)
std::shared_ptr< AstComments > makeCopy(const DomItem &self) const
std::shared_ptr< OwningItem > doCopy(const DomItem &) const override
static constexpr DomType kindValue
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
void setSemanticScope(const QQmlJSScope::ConstPtr &scope)
QQmlJSScope::ConstPtr m_semanticScope
void updatePathFromOwner(const Path &newPath)
QQmlJSScope::ConstPtr semanticScope() const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &annotation, QmlObject **aPtr=nullptr)
BindingValue(const QList< QmlObject > &l)
void updatePathFromOwner(const Path &newPath)
BindingValue(const std::shared_ptr< ScriptExpression > &o)
BindingValue(const BindingValue &o)
DomItem value(const DomItem &binding) const
BindingValue & operator=(const BindingValue &o)
std::shared_ptr< ScriptExpression > scriptExpression
BindingValue(const QmlObject &o)
void setValue(std::unique_ptr< BindingValue > &&value)
BindingType bindingType() const
std::shared_ptr< ScriptExpression > scriptExpressionValue() const
RegionComments & comments()
Binding & operator=(const Binding &)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
void setBindingIdentifiers(const ScriptElementVariant &bindingIdentifiers)
Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &a, QmlObject **aPtr=nullptr)
QList< QmlObject > annotations() const
void updatePathFromOwner(const Path &newPath)
static QString preCodeForName(QStringView n)
QmlObject const * objectValue() const
DomItem valueItem(const DomItem &self) const
QList< QmlObject > * arrayValue()
Binding(const Binding &o)
QList< QmlObject > const * arrayValue() const
static QString postCodeForName(QStringView)
void setAnnotations(const QList< QmlObject > &annotations)
Binding & operator=(Binding &&)=default
void writeOut(const DomItem &self, OutWriter &lw) const
Binding(const QString &m_name, const QString &scriptCode, BindingType bindingType=BindingType::Normal)
const RegionComments & comments() const
Binding(const QString &m_name, std::unique_ptr< BindingValue > &&value, BindingType bindingType=BindingType::Normal)
void writeOutValue(const DomItem &self, OutWriter &lw) const
Binding(const QString &m_name=QString())
static constexpr DomType kindValue
Binding(const QString &m_name, const QmlObject &value, BindingType bindingType=BindingType::Normal)
Binding(Binding &&o)=default
std::shared_ptr< ScriptExpression > scriptExpressionValue()
ScriptElementVariant bindingIdentifiers() const
BindingValueKind valueKind() const
Binding(const QString &m_name, const std::shared_ptr< ScriptExpression > &value, BindingType bindingType=BindingType::Normal)
CommentCollector(MutableDomItem item)
void collectComments(const std::shared_ptr< Engine > &engine, AST::Node *rootNode, const std::shared_ptr< AstComments > &astComments)
Collects and associates comments with javascript AST::Node pointers or with MutableDomItem.
Extracts various pieces and information out of a rawComment string.
QStringView postWhitespace() const
QStringView comment() const
QQmlJS::SourceLocation sourceLocation() const
QQmlJS::SourceLocation commentLocation
QStringView preWhitespace() const
QStringView commentContent() const
Represents a comment.
static constexpr DomType kindValue
CommentType type() const
void write(OutWriter &lw) const
QQmlJS::SourceLocation sourceLocation() const
QStringView rawComment() const
Comment(QStringView c, const QQmlJS::SourceLocation &loc, int newlinesBefore=1, CommentType type=Pre)
friend bool operator==(const Comment &c1, const Comment &c2)
friend bool operator!=(const Comment &c1, const Comment &c2)
CommentInfo info() const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
Expose attributes to the Dom.
Comment(const QString &c, const QQmlJS::SourceLocation &loc, int newlinesBefore=1, CommentType type=Pre)
const RegionComments & comments() const
CommentableDomElement & operator=(const CommentableDomElement &o)=default
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
CommentableDomElement(const CommentableDomElement &o)
CommentableDomElement(const Path &pathFromOwner=Path())
Keeps the comment associated with an element.
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
friend bool operator!=(const CommentedElement &c1, const CommentedElement &c2)
void writePre(OutWriter &lw) const
QList< Comment > preComments() const
void writePost(OutWriter &lw) const
static constexpr DomType kindValue
friend bool operator==(const CommentedElement &c1, const CommentedElement &c2)
void addComment(const Comment &comment)
QList< Comment > postComments() const
void setIsSingleton(bool isSingleton)
void updatePathFromOwner(const Path &newPath) override
Component(const Path &pathFromOwner=Path())
void setIsComposite(bool isComposite)
Component & operator=(const Component &)=default
void setIsCreatable(bool isCreatable)
void setObjects(const QList< QmlObject > &objects)
const QMultiMap< QString, EnumDecl > & enumerations() const &
Component(const Component &o)=default
Path addObject(const QmlObject &object, QmlObject **oPtr=nullptr)
void setName(const QString &name)
Path attachedTypePath(const DomItem &) const
void setEnumerations(const QMultiMap< QString, EnumDecl > &enumerations)
DomItem field(const DomItem &self, QStringView name) const override
Path addEnumeration(const EnumDecl &enumeration, AddOption option=AddOption::Overwrite, EnumDecl **ePtr=nullptr)
void setAttachedTypeName(const QString &name)
bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
QString attachedTypeName() const
Component(const QString &name)
void setAttachedTypePath(const Path &p)
const QList< QmlObject > & objects() const &
DomKind domKind() const override
ConstantData(const Path &pathFromOwner, const QCborValue &value, Options options=Options::MapIsMap)
QCborValue value() const override
quintptr id() const override
static constexpr DomType kindValue
DomType kind() const override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
ConstantData & operator*()
const ConstantData & operator*() const
const ConstantData * operator->() const
ConstantData * operator->()
bool operator==(Dependency const &o) const
QString typeName() const
virtual DomType kind() const =0
virtual DomKind domKind() const
virtual Path canonicalPath(const DomItem &self) const =0
virtual Path pathFromOwner() const =0
virtual QList< QString > fields(const DomItem &self) const
virtual bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const =0
virtual index_type indexes(const DomItem &self) const
const DomBase * domBase() const
virtual DomItem containingObject(const DomItem &self) const
virtual void writeOut(const DomItem &self, OutWriter &lw) const
virtual QSet< QString > const keys(const DomItem &self) const
virtual DomItem field(const DomItem &self, QStringView name) const
virtual quintptr id() const
virtual QCborValue value() const
virtual QString canonicalFilePath(const DomItem &self) const
virtual ~DomBase()=default
virtual void dump(const DomItem &, const Sink &sink, int indent, FilterT filter) const
virtual DomItem key(const DomItem &self, const QString &name) const
virtual DomItem index(const DomItem &self, index_type index) const
DomElement & operator=(const DomElement &)=default
virtual void updatePathFromOwner(const Path &newPath)
Path canonicalPath(const DomItem &self) const override
Path pathFromOwner() const override
DomElement(const DomElement &o)=default
DomElement(const Path &pathFromOwner=Path())
DomItem containingObject(const DomItem &self) const override
SemanticAnalysis semanticAnalysis()
DomEnvironment(const DomEnvironment &o)=delete
QString globalScopeName() const
void addQmlFile(const std::shared_ptr< QmlFile > &file, AddOption option=AddOption::KeepExisting)
static std::shared_ptr< DomEnvironment > create(const QStringList &loadPaths, Options options=Option::SingleThreaded, DomCreationOption creationOption=DomCreationOption::Default, const DomItem &universe=DomItem::empty)
bool finishLoadingDependencies(int waitMSec=30000)
QStringList qmldirFiles() const
std::shared_ptr< ExternalItemInfo< QmlFile > > qmlFileWithPath(const DomItem &self, const QString &path, EnvLookup options=EnvLookup::Normal) const
QSet< QString > moduleIndexUris(const DomItem &self, EnvLookup lookup=EnvLookup::Normal) const
void addGlobalScope(const std::shared_ptr< GlobalScope > &file, AddOption option=AddOption::KeepExisting)
LoadResult insertOrUpdateExternalItemInfo(const QString &path, std::shared_ptr< T > extItem)
void populateFromQmlFile(MutableDomItem &&qmlFile)
void addQmlDirectory(const std::shared_ptr< QmlDirectory > &file, AddOption option=AddOption::KeepExisting)
void addQmldirFile(const std::shared_ptr< QmldirFile > &file, AddOption option=AddOption::KeepExisting)
std::shared_ptr< LoadInfo > loadInfo(const Path &path) const
void addExternalItemInfo(const DomItem &newExtItem, const Callback &loadCallback, const Callback &endCallback)
void addDependenciesToLoad(const Path &path)
std::shared_ptr< ModuleIndex > moduleIndexWithUri(const DomItem &self, const QString &uri, int majorVersion, EnvLookup lookup, Changeable changeable, const ErrorHandler &errorHandler=nullptr)
Path canonicalPath() const override
std::shared_ptr< ExternalItemInfoBase > qmlDirWithPath(const DomItem &self, const QString &path, EnvLookup options=EnvLookup::Normal) const
void addJsFile(const std::shared_ptr< JsFile > &file, AddOption option=AddOption::KeepExisting)
DomItem field(const DomItem &self, QStringView name) const final override
void removePath(const QString &path)
bool commitToBase(const DomItem &self, const std::shared_ptr< DomEnvironment > &validEnv=nullptr)
QSet< QString > qmlFilePaths(const DomItem &self, EnvLookup lookup=EnvLookup::Normal) const
DomEnvironment(const std::shared_ptr< DomEnvironment > &parent, const QStringList &loadPaths, Options options=Option::SingleThreaded, DomCreationOption domCreationOption=Default)
std::shared_ptr< ExternalItemInfo< QmlDirectory > > qmlDirectoryWithPath(const DomItem &self, const QString &path, EnvLookup options=EnvLookup::Normal) const
std::shared_ptr< ExternalItemInfo< GlobalScope > > globalScopeWithName(const DomItem &self, const QString &name, EnvLookup lookup=EnvLookup::Normal) const
QSet< QString > qmlDirPaths(const DomItem &self, EnvLookup options=EnvLookup::Normal) const
std::shared_ptr< ExternalItemInfo< GlobalScope > > ensureGlobalScopeWithName(const DomItem &self, const QString &name, EnvLookup lookup=EnvLookup::Normal)
static ErrorGroups myErrors()
QSet< int > moduleIndexMajorVersions(const DomItem &self, const QString &uri, EnvLookup lookup=EnvLookup::Normal) const
static QList< Import > defaultImplicitImports()
QSet< QString > qmldirFilePaths(const DomItem &self, EnvLookup options=EnvLookup::Normal) const
void setLoadPaths(const QStringList &v)
QSet< QString > globalScopeNames(const DomItem &self, EnvLookup lookup=EnvLookup::Normal) const
std::shared_ptr< DomEnvironment > base() const
std::shared_ptr< DomEnvironment > makeCopy(const DomItem &self) const
void loadBuiltins(const Callback &callback=nullptr, const ErrorHandler &h=nullptr)
std::shared_ptr< ModuleIndex > moduleIndexWithUri(const DomItem &self, const QString &uri, int majorVersion, EnvLookup lookup=EnvLookup::Normal) const
QSet< QString > qmlDirectoryPaths(const DomItem &self, EnvLookup options=EnvLookup::Normal) const
QList< Path > loadInfoPaths() const
void addQmltypesFile(const std::shared_ptr< QmltypesFile > &file, AddOption option=AddOption::KeepExisting)
std::shared_ptr< ExternalItemInfo< JsFile > > jsFileWithPath(const DomItem &self, const QString &path, EnvLookup options=EnvLookup::Normal) const
void addWorkForLoadInfo(const Path &elementCanonicalPath)
std::shared_ptr< OwningItem > doCopy(const DomItem &self) const override
std::shared_ptr< ExternalItemInfo< QmltypesFile > > qmltypesFileWithPath(const DomItem &self, const QString &path, EnvLookup options=EnvLookup::Normal) const
static constexpr DomType kindValue
void addLoadInfo(const DomItem &self, const std::shared_ptr< LoadInfo > &loadInfo)
DomEnvironment(const QStringList &loadPaths, Options options=Option::SingleThreaded, DomCreationOption domCreationOption=Default, const std::shared_ptr< DomUniverse > &universe=nullptr)
void loadFile(const FileToLoad &file, const Callback &callback, std::optional< DomType > fileType=std::optional< DomType >(), const ErrorHandler &h=nullptr)
void loadModuleDependency(const QString &uri, Version v, const Callback &callback=nullptr, const ErrorHandler &=nullptr)
std::shared_ptr< DomUniverse > universe() const
DomCreationOption domCreationOption() const
QList< Import > implicitImports() const
QHash< Path, std::shared_ptr< LoadInfo > > loadInfos() const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
std::shared_ptr< ExternalItemInfo< QmldirFile > > qmldirFileWithPath(const DomItem &self, const QString &path, EnvLookup options=EnvLookup::Normal) const
QSet< QString > qmltypesFilePaths(const DomItem &self, EnvLookup lookup=EnvLookup::Normal) const
DomType kind() const override
void addAllLoadedCallback(const DomItem &self, Callback c)
QStringList loadPaths() const
QSet< QString > jsFilePaths(const DomItem &self, EnvLookup lookup=EnvLookup::Normal) const
A value type that references any element of the Dom.
DomItem bindings() const
DomItem top() const
bool dvReferences(DirectVisitor visitor, const PathEls::PathComponent &c, const QList< Path > &paths) const
DomItem goUp(int) const
QDateTime createdAt() const
T const * as() const
bool resolve(const Path &path, Visitor visitor, const ErrorHandler &errorHandler, ResolveOptions options=ResolveOption::None, const Path &fullPath=Path(), QList< Path > *visitedRefs=nullptr) const
std::shared_ptr< OwningItem > owningItemPtr() const
DomItem operator[](const QString &component) const
QString toString() const
void writeOutPost(OutWriter &lw) const
bool visitTree(const Path &basePath, ChildrenVisitor visitor, VisitOptions options=VisitOption::Default, ChildrenVisitor openingVisitor=emptyChildrenVisitor, ChildrenVisitor closingVisitor=emptyChildrenVisitor, const FieldFilter &filter=FieldFilter::noFilter()) const
Visits recursively all the children of this item using the given visitors.
DomItem path(const Path &p, const ErrorHandler &h=&defaultErrorHandler) const
DomItem containingFile() const
DomItem filterUp(function_ref< bool(DomType k, const DomItem &)> filter, FilterUpOptions options) const
DomItem methods() const
QString internalKindStr() const
DomItem scope(FilterUpOptions options=FilterUpOptions::ReturnOuter) const
DomItem enumerations() const
DomItem subOwnerItem(const PathEls::PathComponent &c, Owner o) const
bool visitLookup1(const QString &symbolName, function_ref< bool(const DomItem &)> visitor, LookupOptions=LookupOption::Normal, const ErrorHandler &h=nullptr, QSet< quintptr > *visited=nullptr, QList< Path > *visitedRefs=nullptr) const
DomItem child(index_type i) const
bool dvValue(DirectVisitor visitor, const PathEls::PathComponent &c, const T &value, ConstantData::Options options=ConstantData::Options::MapIsMap) const
DomItem key(QStringView name) const
std::shared_ptr< T > ownerAs() const
DomItem get(const ErrorHandler &h=nullptr, QList< Path > *visitedRefs=nullptr) const
static ErrorGroups myErrors()
DomItem operator[](const char16_t *component) const
bool visitUp(function_ref< bool(const DomItem &)> visitor) const
Let the visitor visit the Dom Tree hierarchy of this DomItem.
index_type indexes() const
bool hasAnnotations() const
bool iterateSubOwners(function_ref< bool(const DomItem &owner)> visitor) const
MutableDomItem makeCopy(CopyOption option=CopyOption::EnvConnected) const
DomItem refreshed() const
function< void(const Path &, const DomItem &, const DomItem &)> Callback
bool iterateErrors(function_ref< bool(const DomItem &, const ErrorMessage &)> visitor, bool iterate, Path inPath=Path()) const
DomItem pragmas() const
bool dvItem(DirectVisitor visitor, const PathEls::PathComponent &c, function_ref< DomItem()> it) const
DomItem proceedToScope(const ErrorHandler &h=nullptr, QList< Path > *visitedRefs=nullptr) const
Dereference DomItems pointing to other DomItems.
QList< DomItem > values() const
DomItem universe() const
bool iterateDirectSubpaths(DirectVisitor v) const
DomItem container() const
void clearErrors(const ErrorGroups &groups=ErrorGroups({}), bool iterate=true) const
quintptr id() const
QList< QString > fields() const
DomItem globalScope() const
static DomItem fromCode(const QString &code, DomType fileType=DomType::QmlFile)
Creates a new document with the given code.
QString idStr() const
DomItem(const std::shared_ptr< DomEnvironment > &)
bool dvReferenceField(DirectVisitor visitor, QStringView f, const Path &referencedObject) const
bool dvWrapField(DirectVisitor visitor, QStringView f, T &obj) const
DomItem subDataItemField(QStringView f, const T &value, ConstantData::Options options=ConstantData::Options::MapIsMap) const
DomItem copy(const T &base) const
bool visitScopeChain(function_ref< bool(const DomItem &)> visitor, LookupOptions=LookupOption::Normal, const ErrorHandler &h=nullptr, QSet< quintptr > *visited=nullptr, QList< Path > *visitedRefs=nullptr) const
Let the visitor visit the QML scope hierarchy of this DomItem.
std::shared_ptr< DomTop > topPtr() const
QCborValue value() const
index_type size() const
bool dvReferencesField(DirectVisitor visitor, QStringView f, const QList< Path > &paths) const
QDateTime frozenAt() const
DomItem subListItem(const List &list) const
DomItem component(GoTo option=GoTo::Strict) const
bool visitLookup(const QString &symbolName, function_ref< bool(const DomItem &)> visitor, LookupType type=LookupType::Symbol, LookupOptions=LookupOption::Normal, const ErrorHandler &errorHandler=nullptr, QSet< quintptr > *visited=nullptr, QList< Path > *visitedRefs=nullptr) const
void writeOutPre(OutWriter &lw) const
DomItem lookupFirst(const QString &symbolName, LookupType type=LookupType::Symbol, LookupOptions=LookupOption::Normal, const ErrorHandler &errorHandler=nullptr) const
bool visitIndexes(function_ref< bool(const DomItem &)> visitor) const
DomItem fileObject(GoTo option=GoTo::Strict) const
bool dvReference(DirectVisitor visitor, const PathEls::PathComponent &c, const Path &referencedObject) const
bool visitKeys(function_ref< bool(const QString &, const DomItem &)> visitor) const
bool visitStaticTypePrototypeChains(function_ref< bool(const DomItem &)> visitor, VisitPrototypesOptions options=VisitPrototypesOption::Normal, const ErrorHandler &h=nullptr, QSet< quintptr > *visited=nullptr, QList< Path > *visitedRefs=nullptr) const
DomItem::visitStaticTypePrototypeChains.
QQmlJSScope::ConstPtr semanticScope() const
bool writeOutForFile(OutWriter &ow, WriteOutChecks extraChecks) const
bool commitToBase(const std::shared_ptr< DomEnvironment > &validPtr=nullptr) const
DomItem ids() const
DomItem copy(const Owner &owner, const Path &ownerPath) const
bool dvItemField(DirectVisitor visitor, QStringView f, function_ref< DomItem()> it) const
FileWriter::Status dump(const QString &path, function_ref< bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter=noFilter, int nBackups=2, int indent=0, FileWriter *fw=nullptr) const
bool visitSubSymbolsNamed(const QString &name, function_ref< bool(const DomItem &)> visitor) const
bool dvValueLazyField(DirectVisitor visitor, QStringView f, F valueF, ConstantData::Options options=ConstantData::Options::MapIsMap) const
DomItem wrap(const PathEls::PathComponent &c, const T &obj) const
bool dvWrap(DirectVisitor visitor, const PathEls::PathComponent &c, T &obj) const
QList< DomItem > lookup(const QString &symbolName, LookupType type=LookupType::Symbol, LookupOptions=LookupOption::Normal, const ErrorHandler &errorHandler=nullptr) const
void dump(const Sink &, int indent=0, function_ref< bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter=noFilter) const
bool dvValueLazy(DirectVisitor visitor, const PathEls::PathComponent &c, F valueF, ConstantData::Options options=ConstantData::Options::MapIsMap) const
friend QMLDOM_EXPORT bool operator==(const DomItem &, const DomItem &)
DomItem wrapField(QStringView f, const T &obj) const
QSet< QString > propertyInfoNames() const
static ErrorGroups myResolveErrors()
bool visitDirectAccessibleScopes(function_ref< bool(const DomItem &)> visitor, VisitPrototypesOptions options=VisitPrototypesOption::Normal, const ErrorHandler &h=nullptr, QSet< quintptr > *visited=nullptr, QList< Path > *visitedRefs=nullptr) const
DomItem environment() const
bool isCanonicalChild(const DomItem &child) const
index_type length() const
DomItem operator[](QStringView component) const
DomItem rootQmlObject(GoTo option=GoTo::Strict) const
DomItem subValueItem(const PathEls::PathComponent &c, const T &value, ConstantData::Options options=ConstantData::Options::MapIsMap) const
DomItem directParent() const
DomItem annotations() const
Path canonicalPath() const
QStringList sortedKeys() const
void addError(ErrorMessage &&msg) const
DomItem containingObject() const
DomItem containingScriptExpression() const
QList< DomItem > getAll(const ErrorHandler &h=nullptr, QList< Path > *visitedRefs=nullptr) const
bool visitPrototypeChain(function_ref< bool(const DomItem &)> visitor, VisitPrototypesOptions options=VisitPrototypesOption::Normal, const ErrorHandler &h=nullptr, QSet< quintptr > *visited=nullptr, QList< Path > *visitedRefs=nullptr) const
DomKind domKind() const
bool isContainer() const
DomItem index(index_type) const
DomItem subReferencesItem(const PathEls::PathComponent &c, const QList< Path > &paths) const
bool dvValueField(DirectVisitor visitor, QStringView f, const T &value, ConstantData::Options options=ConstantData::Options::MapIsMap) const
DomItem subMapItem(const Map &map) const
bool visitLocalSymbolsNamed(const QString &name, function_ref< bool(const DomItem &)> visitor) const
bool isExternalItem() const
DomItem subReferenceItem(const PathEls::PathComponent &c, const Path &referencedObject) const
void dumpPtr(const Sink &sink) const
auto visitEl(F f) const
InternalKind internalKind() const
DomItem path(const QString &p, const ErrorHandler &h=&defaultErrorHandler) const
bool isOwningItem() const
DomItem owner() const
The owner of an element, for an qmlObject this is the containing qml file.
ErrorHandler errorHandler() const
DomItem operator[](const Path &path) const
DomItem subObjectWrapItem(SimpleObjectWrap obj) const
static DomItem empty
DomItem subDataItem(const PathEls::PathComponent &c, const T &value, ConstantData::Options options=ConstantData::Options::MapIsMap) const
QQmlJSScope::ConstPtr nearestSemanticScope() const
QString canonicalFilePath() const
void writeOut(OutWriter &lw) const
bool writeOut(const QString &path, int nBackups=2, const LineWriterOptions &opt=LineWriterOptions(), FileWriter *fw=nullptr, WriteOutChecks extraChecks=WriteOutCheck::Default) const
Path pathFromOwner() const
DomItem qmlObject(GoTo option=GoTo::Strict, FilterUpOptions options=FilterUpOptions::ReturnOuter) const
Returns the QmlObject that this belongs to.
DomItem subScriptElementWrapperItem(const ScriptElementVariant &obj) const
DomItem path(QStringView p, const ErrorHandler &h=&defaultErrorHandler) const
DomItem copy(const Owner &owner, const Path &ownerPath, const T &base) const
DomItem key(const QString &name) const
PropertyInfo propertyInfoWithName(const QString &name) const
QSet< QString > keys() const
QString name() const
DomItem children() const
DomItem field(QStringView name) const
DomItem propertyDefs() const
DomItem subLocationItem(const PathEls::PathComponent &c, SourceLocation loc) const
DomItem goToFile(const QString &filePath) const
QDateTime lastDataUpdateAt() const
DomItem(const std::shared_ptr< DomUniverse > &)
static ErrorGroup domErrorGroup
DomItem propertyInfos() const
Path canonicalPath(const DomItem &) const override
QQml::Dom::DomTop::loadFile.
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
QMap< QString, OwnerT > extraOwningItems() const
virtual Path canonicalPath() const =0
DomItem containingObject(const DomItem &) const override
void setExtraOwningItem(const QString &fieldName, const std::shared_ptr< T > &item)
QSet< QString > globalScopeNames() const
static DomItem create(const QString &universeName)
std::shared_ptr< ExternalItemPair< GlobalScope > > ensureGlobalScopeWithName(const QString &name)
std::shared_ptr< ExternalItemPair< JsFile > > jsFileWithPath(const QString &path) const
static ErrorGroups myErrors()
QSet< QString > qmltypesFilePaths() const
std::shared_ptr< OwningItem > doCopy(const DomItem &self) const override
static std::shared_ptr< DomUniverse > guaranteeUniverse(const std::shared_ptr< DomUniverse > &univ)
std::shared_ptr< ExternalItemPair< QmldirFile > > qmldirFileWithPath(const QString &path) const
void removePath(const QString &dir)
DomUniverse(const QString &universeName)
DomUniverse(const DomUniverse &)=delete
std::shared_ptr< ExternalItemPair< GlobalScope > > globalScopeWithName(const QString &name) const
std::shared_ptr< ExternalItemPair< QmlFile > > qmlFileWithPath(const QString &path) const
QSet< QString > qmlDirectoryPaths() const
LoadResult loadFile(const FileToLoad &file, DomType fileType, DomCreationOption creationOption={})
QSet< QString > jsFilePaths() const
std::shared_ptr< ExternalItemPair< QmltypesFile > > qmltypesFileWithPath(const QString &path) const
QSet< QString > qmldirFilePaths() const
std::shared_ptr< ExternalItemPair< QmlDirectory > > qmlDirectoryWithPath(const QString &path) const
DomType kind() const override
static constexpr DomType kindValue
Path canonicalPath() const override
std::shared_ptr< DomUniverse > makeCopy(const DomItem &self) const
QSet< QString > qmlFilePaths() const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
Helper class to accept eithe a string or a dumper (a function that writes to a sink)
void operator()(const Sink &s) const
void dump(const DomItem &, const Sink &s, int indent, function_ref< bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter) const override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
static constexpr DomType kindValue
Path pathFromOwner() const override
Path canonicalPath(const DomItem &self) const override
const Empty & operator*() const
const Empty * operator->() const
DomType kind() const override
DomItem containingObject(const DomItem &self) const override
quintptr id() const override
const QList< QmlObject > & annotations() const &
const QList< EnumItem > & values() const &
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void setAlias(const QString &aliasName)
void setAnnotations(const QList< QmlObject > &annotations)
EnumDecl(const QString &name=QString(), const QList< EnumItem > &values=QList< EnumItem >(), const Path &pathFromOwner=Path())
void writeOut(const DomItem &self, OutWriter &lw) const override
void updatePathFromOwner(const Path &newP) override
void setName(const QString &name)
Path addAnnotation(const QmlObject &child, QmlObject **cPtr=nullptr)
Path addValue(const EnumItem &value)
static constexpr DomType kindValue
void setValues(const QList< EnumItem > &values)
DomType kind() const override
EnumItem(const QString &name=QString(), int value=0, ValueKind valueKind=ValueKind::ImplicitValue)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
const RegionComments & comments() const
RegionComments & comments()
void writeOut(const DomItem &self, OutWriter &lw) const
static constexpr DomType kindValue
convenience macro creating a new ErrorGroup and registering its groupId as translatable string
QLatin1String groupId() const
void dumpId(const Sink &sink) const
Represents a set of tags grouping a set of related error messages.
ErrorMessage debug(const Dumper &message) const
ErrorMessage error(const QString &message) const
ErrorMessage errorMessage(const DiagnosticMessage &msg, const Path &element=Path(), const QString &canonicalFilePath=QString()) const
ErrorMessage warning(const Dumper &message) const
QVector< ErrorGroup > groups
static int cmp(const ErrorGroups &g1, const ErrorGroups &g2)
ErrorMessage debug(const QString &message) const
void dumpId(const Sink &sink) const
ErrorMessage info(const QString &message) const
ErrorMessage warning(const QString &message) const
ErrorMessage errorMessage(const Dumper &msg, ErrorLevel level, const Path &element=Path(), const QString &canonicalFilePath=QString(), SourceLocation location=SourceLocation()) const
ErrorMessage info(const Dumper &message) const
void fatal(const Dumper &msg, const Path &element=Path(), QStringView canonicalFilePath=u"", SourceLocation location=SourceLocation()) const
ErrorMessage error(const Dumper &message) const
Represents an error message connected to the dom.
ErrorMessage & withPath(const Path &)
ErrorMessage & withErrorId(QLatin1String errorId)
ErrorMessage(const ErrorGroups &errorGroups, const DiagnosticMessage &msg, const Path &path=Path(), const QString &file=QString(), QLatin1String errorId=QLatin1String(""))
static QLatin1String msg(QLatin1String errorId, ErrorMessage &&err)
ErrorMessage & withLocation(SourceLocation)
ErrorMessage handle(const ErrorHandler &errorHandler=nullptr)
static QLatin1String msg(const char *errorId, ErrorMessage &&err)
ErrorMessage & withFile(const QString &)
ErrorMessage & withItem(const DomItem &)
static ErrorMessage load(const char *errorId)
static ErrorMessage load(QLatin1String errorId, T... args)
ErrorMessage(const QString &message, const ErrorGroups &errorGroups, Level level=Level::Warning, const Path &path=Path(), const QString &file=QString(), SourceLocation location=SourceLocation(), QLatin1String errorId=QLatin1String(""))
void dump(const Sink &s) const
ErrorMessage & withFile(QStringView)
static ErrorMessage load(QLatin1String errorId)
friend int compare(const ErrorMessage &msg1, const ErrorMessage &msg2)
static void visitRegisteredMessages(function_ref< bool(const ErrorMessage &)> visitor)
static Export fromString(const Path &source, QStringView exp, const Path &typePath, const ErrorHandler &h)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
QString canonicalFilePath(const DomItem &) const final override
ExternalItemInfoBase(const ExternalItemInfoBase &o)=default
void setCurrentExposedAt(QDateTime d)
std::shared_ptr< ExternalItemInfoBase > makeCopy(const DomItem &self) const
DomType kind() const final override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const final override
int lastValidRevision(const DomItem &self) const
ExternalItemInfoBase(const Path &canonicalPath, const QDateTime &currentExposedAt=QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC), int derivedFrom=0, const QDateTime &lastDataUpdateAt=QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC))
QStringList logicalFilePaths() const
int lastRevision(const DomItem &self) const
virtual std::shared_ptr< ExternalOwningItem > currentItem() const =0
DomItem field(const DomItem &self, QStringView name) const final override
Path canonicalPath(const DomItem &) const final override
int currentRevision(const DomItem &self) const
static constexpr DomType kindValue
void refreshedDataAt(QDateTime tNew) final override
virtual DomItem currentItem(const DomItem &) const =0
void ensureLogicalFilePath(const QString &path)
QDateTime lastDataUpdateAt() const final override
std::shared_ptr< OwningItem > doCopy(const DomItem &) const override
static constexpr DomType kindValue
ExternalItemInfo(const std::shared_ptr< T > &current=std::shared_ptr< T >(), const QDateTime &currentExposedAt=QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC), int derivedFrom=0, const QDateTime &lastDataUpdateAt=QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC))
std::shared_ptr< T > current
ExternalItemInfo(const QString &canonicalPath)
std::shared_ptr< ExternalItemInfo > makeCopy(const DomItem &self) const
DomItem currentItem(const DomItem &self) const override
ExternalItemInfo(const ExternalItemInfo &o)
std::shared_ptr< ExternalOwningItem > currentItem() const override
ExternalItemPairBase(const ExternalItemPairBase &o)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const final override
DomType kind() const final override
QString canonicalFilePath(const DomItem &) const final override
void refreshedDataAt(QDateTime tNew) final override
Path canonicalPath(const DomItem &self) const final override
virtual DomItem validItem(const DomItem &self) const =0
ExternalItemPairBase(const QDateTime &validExposedAt=QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC), const QDateTime &currentExposedAt=QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC), int derivedFrom=0, const QDateTime &lastDataUpdateAt=QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC))
QDateTime lastDataUpdateAt() const final override
std::shared_ptr< ExternalItemPairBase > makeCopy(const DomItem &self) const
virtual std::shared_ptr< ExternalOwningItem > currentItem() const =0
virtual std::shared_ptr< ExternalOwningItem > validItem() const =0
virtual DomItem currentItem(const DomItem &self) const =0
DomItem field(const DomItem &self, QStringView name) const final override
static constexpr DomType kindValue
std::shared_ptr< T > valid
static constexpr DomType kindValue
std::shared_ptr< T > current
std::shared_ptr< OwningItem > doCopy(const DomItem &) const override
std::shared_ptr< ExternalOwningItem > validItem() const override
DomItem validItem(const DomItem &self) const override
DomItem currentItem(const DomItem &self) const override
ExternalItemPair(const ExternalItemPair &o)
ExternalItemPair(const std::shared_ptr< T > &valid={}, const std::shared_ptr< T > &current={}, const QDateTime &validExposedAt=QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC), const QDateTime &currentExposedAt=QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC), int derivedFrom=0, const QDateTime &lastDataUpdateAt=QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC))
std::shared_ptr< ExternalOwningItem > currentItem() const override
std::shared_ptr< ExternalItemPair > makeCopy(const DomItem &self) const
static FieldFilter noLocationFilter()
const QMultiMap< QString, QString > & fieldFilterAdd() const
bool operator()(const DomItem &, const Path &, const DomItem &) const
bool addFilter(const QString &f)
bool operator()(const DomItem &, const PathEls::PathComponent &c, const DomItem &) const
static FieldFilter compareNoCommentsFilter()
static FieldFilter defaultFilter()
static FieldFilter compareFilter()
static FieldFilter noFilter()
FieldFilter(const QMultiMap< QString, QString > &fieldFilterAdd={}, const QMultiMap< QString, QString > &fieldFilterRemove={})
QMultiMap< QString, QString > fieldFilterRemove() const
Represents a Node of FileLocations tree.
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
std::shared_ptr< OwningItem > doCopy(const DomItem &) const override
Node::Ptr makeCopy(const DomItem &self) const
Path canonicalPath(const DomItem &self) const override
static Ptr instantiate(const Ptr &parent=nullptr, const Path &p=Path())
QString logicalPath() const
QString canonicalPath() const
void setCanonicalPath(const QString &canonicalPath)
void setLogicalPath(const QString &logicalPath)
std::optional< InMemoryContents > content() const
static FileToLoad fromFileSystem(const std::weak_ptr< DomEnvironment > &environment, const QString &canonicalPath)
static FileToLoad fromMemory(const std::weak_ptr< DomEnvironment > &environment, const QString &path, const QString &data)
FileToLoad(const std::weak_ptr< DomEnvironment > &environment, const QString &canonicalPath, const QString &logicalPath, const std::optional< InMemoryContents > &content)
std::weak_ptr< DomEnvironment > environment() const
Status write(const QString &targetFile, function_ref< bool(QTextStream &)> write, int nBk=2)
GlobalComponent(const Path &pathFromOwner=Path())
DomType kind() const override
static constexpr DomType kindValue
Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &ann, QmlObject **aPtr=nullptr)
RegionComments comments
std::shared_ptr< ScriptExpression > value
static constexpr DomType kindValue
Id(const QString &idName=QString(), const Path &referredObject=Path())
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
void updatePathFromOwner(const Path &pathFromOwner)
QList< QmlObject > annotations
const QList< Path > & importSourcePaths() const &
const QMap< QString, ImportScope > & subImports() const &
QList< DomItem > importedItemsWithName(const DomItem &self, const QString &name) const
QList< Export > importedExportsWithName(const DomItem &self, const QString &name) const
QSet< QString > importedNames(const DomItem &self) const
void addImport(const QStringList &p, const Path &targetExports)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
QList< Path > allSources(const DomItem &self) const
Import(const QmlUri &uri=QmlUri(), Version version=Version(), const QString &importId=QString())
Import baseImport() const
friend bool operator==(const Import &i1, const Import &i2)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
static QRegularExpression importRe()
void writeOut(const DomItem &self, OutWriter &ow) const
static Import fromFileString(const QString &importStr, const QString &importId=QString(), const ErrorHandler &handler=nullptr)
friend bool operator!=(const Import &i1, const Import &i2)
static Import fromUriString(const QString &importStr, Version v=Version(), const QString &importId=QString(), const ErrorHandler &handler=nullptr)
IndentInfo(QStringView line, int tabSize, int initialColumn=0)
JsResource(const Path &pathFromOwner=Path())
DomType kind() const override
bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
static constexpr DomType kindValue
const QString & currentLine() const
LineWriter & write(QStringView v, TextAddType tType=TextAddType::Normal)
LineWriter & ensureSemicolon(TextAddType t=TextAddType::Extra)
void handleTrailingSpace(LineWriterOptions::TrailingSpace s)
LineWriter & ensureNewline(int nNewlines=1, TextAddType t=TextAddType::Extra)
QMap< int, std::function< bool(LineWriter &, TextAddType)> > m_textAddCallbacks
LineWriter & ensureSpace(TextAddType t=TextAddType::Extra)
const LineWriterOptions & options() const
void eof(bool ensureNewline=true)
void addInnerSink(const SinkF &s)
std::function< void(QStringView)> sink()
int addNewlinesAutospacerCallback(int nLines)
virtual void reindentAndSplit(const QString &eol, bool eof=false)
void commitLine(const QString &eol, TextAddType t=TextAddType::Normal, int untilChar=-1)
SourceLocation currentSourceLocation() const
LineWriter & ensureSpace(QStringView space, TextAddType t=TextAddType::Extra)
SourceLocation committedLocation() const
void setLineIndent(int indentAmount)
int addTextAddCallback(std::function< bool(LineWriter &, TextAddType)> callback)
void textAddCallback(TextAddType t)
LineWriter(const SinkF &innerSink, const QString &fileName, const LineWriterOptions &options=LineWriterOptions(), int lineNr=0, int columnNr=0, int utf16Offset=0, const QString &currentLine=QString())
quintptr id() const override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor v) const override
void writeOut(const DomItem &self, OutWriter &ow, bool compact) const
static constexpr DomType kindValue
index_type indexes(const DomItem &) const override
virtual void copyTo(ListPBase *) const
virtual void moveTo(ListPBase *) const
void writeOut(const DomItem &self, OutWriter &ow) const override
DomType kind() const override
QList< const void * > m_pList
ListPBase(const Path &pathFromOwner, const QList< const void * > &pList, const QString &elType)
void moveTo(ListPBase *t) const override
ListPT(const Path &pathFromOwner, const QList< T * > &pList, const QString &elType=QString(), ListOptions options=ListOptions::Normal)
DomItem index(const DomItem &self, index_type index) const override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor v) const override
void copyTo(ListPBase *t) const override
static constexpr DomType kindValue
static constexpr DomType kindValue
ListPBase & operator*()
ListPBase * operator->()
const ListPBase * operator->() const
ListP(const Path &pathFromOwner, const QList< T * > &pList, const QString &elType=QString(), ListOptions options=ListOptions::Normal)
const ListPBase & operator*() const
void writeOut(const DomItem &self, OutWriter &ow, bool compact) const
List(const Path &pathFromOwner, const LookupFunction &lookup, const Length &length, const IteratorFunction &iterator, const QString &elType)
DomType kind() const override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
const List & operator*() const
static List fromQList(const Path &pathFromOwner, const QList< T > &list, const std::function< DomItem(const DomItem &, const PathEls::PathComponent &, const T &)> &elWrapper, ListOptions options=ListOptions::Normal)
std::function< bool(const DomItem &, function_ref< bool(index_type, function_ref< DomItem()>)>)> IteratorFunction
static List fromQListRef(const Path &pathFromOwner, const QList< T > &list, const std::function< DomItem(const DomItem &, const PathEls::PathComponent &, const T &)> &elWrapper, ListOptions options=ListOptions::Normal)
void dump(const DomItem &, const Sink &s, int indent, function_ref< bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)>) const override
std::function< DomItem(const DomItem &, index_type)> LookupFunction
void writeOut(const DomItem &self, OutWriter &ow) const override
quintptr id() const override
static constexpr DomType kindValue
const List * operator->() const
index_type indexes(const DomItem &self) const override
DomItem index(const DomItem &self, index_type index) const override
std::function< index_type(const DomItem &)> Length
void addEndCallback(const DomItem &self, std::function< void(Path, const DomItem &, const DomItem &)> callback)
void finishedLoadingDep(const DomItem &self, const Dependency &d)
Status status() const
void addError(const DomItem &self, ErrorMessage &&msg) override
DomType kind() const override
LoadInfo(const Path &elPath=Path(), Status status=Status::NotStarted, int nLoaded=0, int derivedFrom=0, const QDateTime &lastDataUpdateAt=QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC))
static constexpr DomType kindValue
void execEnd(const DomItem &self)
void advanceLoad(const DomItem &self)
std::shared_ptr< OwningItem > doCopy(const DomItem &self) const override
Path canonicalPath(const DomItem &self) const override
Path elementCanonicalPath() const
QList< Dependency > toDo() const
std::shared_ptr< LoadInfo > makeCopy(const DomItem &self) const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
LoadInfo(const LoadInfo &o)
QList< Dependency > inProgress() const
std::function< DomItem(const DomItem &, QString)> LookupFunction
static Map fromMultiMapRef(const Path &pathFromOwner, const QMultiMap< QString, T > &mmap)
const Map * operator->() const
static Map fromFileRegionMap(const Path &pathFromOwner, const QMap< FileLocationRegion, T > &map)
static Map fromFileRegionListMap(const Path &pathFromOwner, const QMap< FileLocationRegion, QList< T > > &map)
Map(const Path &pathFromOwner, const LookupFunction &lookup, const Keys &keys, const QString &targetType)
const Map & operator*() const
static Map fromMapRef(const Path &pathFromOwner, const QMap< QString, T > &mmap, const std::function< DomItem(const DomItem &, const PathEls::PathComponent &, const T &)> &elWrapper)
static Map fromMultiMap(const Path &pathFromOwner, const QMultiMap< QString, T > &mmap)
std::function< QSet< QString >(const DomItem &)> Keys
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
QSet< QString > const keys(const DomItem &self) const override
quintptr id() const override
DomItem key(const DomItem &self, const QString &name) const override
static constexpr DomType kindValue
DomType kind() const override
std::shared_ptr< ScriptExpression > body
Path typePath(const DomItem &) const
QList< MethodParameter > parameters
std::shared_ptr< ScriptExpression > returnType
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
void writeOut(const DomItem &self, OutWriter &ow) const
void writePre(const DomItem &self, OutWriter &ow) const
QString signature(const DomItem &self) const
std::shared_ptr< ScriptExpression > defaultValue
void writeOut(const DomItem &self, OutWriter &ow) const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
void writeOutSignal(const DomItem &self, OutWriter &ow) const
TypeAnnotationStyle typeAnnotationStyle
static constexpr DomType kindValue
std::shared_ptr< ScriptExpression > value
QMap< QString, QMap< QString, MockObject > > subMaps
friend bool operator==(const ModuleAutoExport &i1, const ModuleAutoExport &i2)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
friend bool operator!=(const ModuleAutoExport &i1, const ModuleAutoExport &i2)
static constexpr DomType kindValue
std::shared_ptr< T > ownerAs() const
MutableDomItem addChild(QmlObject child)
FileWriter::Status dump(const QString &path, function_ref< bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter=noFilter, int nBackups=2, int indent=0, FileWriter *fw=nullptr)
bool writeOut(const QString &path, int nBackups=2, const LineWriterOptions &opt=LineWriterOptions(), FileWriter *fw=nullptr)
friend bool operator==(const MutableDomItem &o1, const MutableDomItem &o2)
MutableDomItem addPropertyDef(const PropertyDefinition &propertyDef, AddOption option=AddOption::Overwrite)
bool commitToBase(const std::shared_ptr< DomEnvironment > &validEnvPtr=nullptr)
QString canonicalFilePath() const
MutableDomItem fileObject(GoTo option=GoTo::Strict)
MutableDomItem operator[](const char16_t *component)
MutableDomItem key(QStringView name)
MutableDomItem operator[](const QString &component)
MutableDomItem addMethod(const MethodInfo &functionDef, AddOption option=AddOption::Overwrite)
MutableDomItem field(QStringView name)
void dump(const Sink &s, int indent=0, function_ref< bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter=noFilter)
void writeOut(OutWriter &lw)
MutableDomItem(const DomItem &owner, const Path &pathFromOwner)
MutableDomItem containingObject()
void addError(ErrorMessage &&msg)
MutableDomItem path(const QString &p)
std::shared_ptr< DomTop > topPtr()
MutableDomItem key(const QString &name)
QSet< QString > const keys()
MutableDomItem qmlObject(GoTo option=GoTo::Strict, FilterUpOptions fOptions=FilterUpOptions::ReturnOuter)
QList< QString > const fields()
MutableDomItem component(GoTo option=GoTo::Strict)
MutableDomItem path(const Path &p)
MutableDomItem makeCopy(CopyOption option=CopyOption::EnvConnected)
MutableDomItem operator[](const Path &path)
MutableDomItem index(index_type i)
MutableDomItem child(index_type i)
MutableDomItem(const DomItem &item)
std::shared_ptr< OwningItem > owningItemPtr()
friend bool operator!=(const MutableDomItem &o1, const MutableDomItem &o2)
MutableDomItem rootQmlObject(GoTo option=GoTo::Strict)
DomItem::CopyOption CopyOption
MutableDomItem operator[](QStringView component)
MutableDomItem path(QStringView p)
MutableDomItem addBinding(Binding binding, AddOption option=AddOption::Overwrite)
A DomItem that owns other DomItems and is managed through a shared pointer.
QDateTime createdAt() const
virtual bool iterateSubOwners(const DomItem &self, function_ref< bool(const DomItem &owner)> visitor)
virtual int revision() const
QBasicMutex * mutex() const
DomItem containingObject(const DomItem &self) const override
virtual std::shared_ptr< OwningItem > doCopy(const DomItem &self) const =0
std::shared_ptr< OwningItem > makeCopy(const DomItem &self) const
Path pathFromOwner() const override final
OwningItem(const OwningItem &&)=delete
bool iterateErrors(const DomItem &self, function_ref< bool(const DomItem &source, const ErrorMessage &msg)> visitor, const Path &inPath=Path())
virtual void addError(const DomItem &self, ErrorMessage &&msg)
QDateTime frozenAt() const
void addErrorLocal(ErrorMessage &&msg)
virtual QDateTime lastDataUpdateAt() const
void clearErrors(const ErrorGroups &groups=ErrorGroups({}))
Path canonicalPath(const DomItem &self) const override=0
QMultiMap< Path, ErrorMessage > localErrors() const
OwningItem & operator=(const OwningItem &&)=delete
OwningItem(int derivedFrom, const QDateTime &lastDataUpdateAt)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
virtual bool frozen() const
virtual void refreshedDataAt(QDateTime tNew)
OwningItem(int derivedFrom=0)
OwningItem(const OwningItem &o)
void dump(const Sink &sink) const
bool checkName(QStringView s) const
index_type index(index_type defaultValue=-1) const
QStringView stringView() const
void dump(const Sink &sink, const QString &name, bool hasSquareBrackets) const
void dump(const Sink &sink) const
QStringView stringView() const
bool checkName(QStringView s) const
void dump(const Sink &sink) const
bool checkName(QStringView s) const
bool checkName(QStringView s) const
QStringView stringView() const
void dump(const Sink &sink) const
bool checkName(QStringView s) const
void dump(const Sink &sink) const
Filter(const std::function< bool(const DomItem &)> &f, QStringView filterDescription=u"<native code filter>")
QStringView stringView() const
std::function< bool(const DomItem &)> filterFunction
index_type index(index_type=-1) const
bool checkName(QStringView s) const
void dump(const Sink &sink) const
void dump(const Sink &sink) const
bool checkName(QStringView s) const
QStringView stringView() const
bool checkName(QStringView s) const
static int cmp(const PathComponent &p1, const PathComponent &p2)
PathComponent & operator=(PathComponent &&)=default
PathComponent & operator=(const PathComponent &)=default
index_type index(index_type defaultValue=-1) const
PathComponent(const PathComponent &)=default
PathComponent(PathComponent &&)=default
void dump(const Sink &sink) const
const Current * asCurrent() const
PathData(const QStringList &strData, const QVector< PathComponent > &components, const std::shared_ptr< PathData > &parent)
QVector< PathComponent > components
PathData(const QStringList &strData, const QVector< PathComponent > &components)
std::shared_ptr< PathData > parent
void dump(const Sink &sink) const
QStringView stringView() const
bool checkName(QStringView s) const
bool operator==(const PathIterator &o) const
PathIterator operator++(int)
bool operator!=(const PathIterator &o) const
Path withCurrent(const QString &s) const
PathCurrent headCurrent() const
Path dropTail(int n=1) const
Path withEmpty() const
index_type headIndex(index_type defaultValue=-1) const
Path withIndex(index_type i) const
static int cmp(const Path &p1, const Path &p2)
static Path fromField(const QString &s)
static Path fromField(QStringView s=u"")
static Path fromRoot(QStringView s=u"")
Path expandBack() const
Expand a path suffix hidden by slicing.
Path withKey(QStringView name) const
Path withPath(const Path &toAdd, bool avoidToAddAsBase=false) const
Returns a copy of this with toAdd appended to it.
static Path fromString(QStringView s, const ErrorHandler &errorHandler=nullptr)
QString headName() const
Source split() const
Splits the path at the last field, root or current Component.
const Component * pointer
PathIterator begin() const
PathEls::Kind Kind
static Path fromRoot(PathRoot r)
static Path fromCurrent(const QString &s)
Path withComponent(const PathEls::PathComponent &c)
static ErrorGroups myErrors()
Path withAny() const
bool checkHeadName(QStringView name) const
Path operator[](int i) const
static Path fromCurrent(QStringView s=u"")
Path withKey(const QString &name) const
Path head() const
Path withCurrent(QStringView s=u"") const
Path mid(int offset, int length) const
Path expandFront() const
Expand a path prefix hidden by slicing.
Path withFilter(const std::function< bool(const DomItem &)> &, QStringView desc=u"<native code filter>") const
Path withCurrent(PathCurrent s) const
void dump(const Sink &sink) const
Path last() const
Kind headKind() const
Path withFilter(const std::function< bool(const DomItem &)> &, const QString &) const
Path mid(int offset) const
const Path & reference
static Path fromString(const QString &s, const ErrorHandler &errorHandler=nullptr)
QString toString() const
static Path fromKey(const QString &s)
PathIterator end() const
Path withField(QStringView name) const
std::function< bool(const DomItem &)> headFilter() const
Path dropFront(int n=1) const
Path withField(const QString &name) const
static Path fromRoot(const QString &s)
PathEls::PathComponent Component
static Path fromCurrent(PathCurrent c)
PathRoot headRoot() const
static Path fromKey(QStringView s=u"")
Path(const PathEls::PathComponent &c)
static Path fromIndex(index_type i)
std::forward_iterator_tag iterator_category
Pragma(const QString &pragmaName=QString(), const QStringList &pragmaValues={})
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
void writeOut(const DomItem &self, OutWriter &ow) const
static constexpr DomType kindValue
static constexpr DomType kindValue
ScriptElementVariant m_nameIdentifiers
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
void writeOut(const DomItem &self, OutWriter &lw) const
ScriptElementVariant nameIdentifiers() const
void setNameIdentifiers(const ScriptElementVariant &name)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
static constexpr DomType kindValue
QQmlDomAstCreatorBase(const MutableDomItem &qmlFile)
void endVisit(AST::UiProgram *) override
void throwRecursionDepthError() override
void endVisitHelper(AST::PatternElement *pe, const std::shared_ptr< ScriptElements::GenericScriptElement > &element)
void loadAnnotations(AST::UiObjectMember *el)
bool visit(AST::UiProgram *program) override
void enableLoadFileLazily(bool enable=true)
void enableScriptExpressions(bool enable=true)
virtual QQmlJSASTClassListToVisit void throwRecursionDepthError() override
QQmlDomAstCreatorWithQQmlJSScope(const QQmlJSScope::Ptr &current, MutableDomItem &qmlFile, QQmlJSLogger *logger, QQmlJSImporter *importer)
QQmlJSScope::ConstPtr semanticScope() const
void setIds(const QMultiMap< QString, Id > &ids)
void setNextComponentPath(const Path &p)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
QList< DomItem > subComponents(const DomItem &self) const
const QMultiMap< QString, Id > & ids() const &
void updatePathFromOwner(const Path &newPath) override
void setNameIdentifiers(const ScriptElementVariant &name)
static constexpr DomType kindValue
void writeOut(const DomItem &self, OutWriter &) const override
void setSemanticScope(const QQmlJSScope::ConstPtr &scope)
QmlComponent(const QString &name=QString())
QList< QString > subComponentsNames(const DomItem &self) const
Path addId(const Id &id, AddOption option=AddOption::Overwrite, Id **idPtr=nullptr)
ScriptElementVariant nameIdentifiers() const
DomType kind() const override
QList< QString > fields(const DomItem &) const override
void setNameIdentifiers(const ScriptElementVariant &name)
Path addChild(const QmlObject &child, QmlObject **cPtr=nullptr)
MutableDomItem addBinding(MutableDomItem &self, const Binding &binding, AddOption option)
void setMethods(const QMultiMap< QString, MethodInfo > &functionDefs)
void writeOut(const DomItem &self, OutWriter &ow, const QString &onTarget) const
ScriptElementVariant nameIdentifiers() const
void setName(const QString &name)
QList< std::pair< SourceLocation, DomItem > > orderOfAttributes(const DomItem &self, const DomItem &component) const
bool iterateSubOwners(const DomItem &self, function_ref< bool(const DomItem &owner)> visitor) const
MutableDomItem addChild(MutableDomItem &self, const QmlObject &child)
void setAnnotations(const QList< QmlObject > &annotations)
const QMultiMap< QString, Binding > & bindings() const &
DomType kind() const override
void setNextScopePath(const Path &nextScopePath)
void updatePathFromOwner(const Path &newPath) override
void setChildren(const QList< QmlObject > &children)
Path addBinding(const Binding &binding, AddOption option, Binding **bPtr=nullptr)
static constexpr DomType kindValue
Path addAnnotation(const QmlObject &annotation, QmlObject **aPtr=nullptr)
void writeOutSortedEnumerations(const DomItem &component, OutWriter &ow) const
LocallyResolvedAlias resolveAlias(const DomItem &self, std::shared_ptr< ScriptExpression > accessSequence) const
void writeOutId(const DomItem &self, OutWriter &ow) const
QList< QmlObject > children() const
LocallyResolvedAlias resolveAlias(const DomItem &self, const QStringList &accessSequence) const
const QList< Path > & prototypePaths() const &
void writeOutSortedPropertyDefinition(const DomItem &self, OutWriter &ow, QSet< QString > &mergedDefBinding) const
Path addPropertyDef(const PropertyDefinition &propertyDef, AddOption option, PropertyDefinition **pDef=nullptr)
const QMultiMap< QString, MethodInfo > & methods() const &
MutableDomItem addPropertyDef(MutableDomItem &self, const PropertyDefinition &propertyDef, AddOption option)
DomItem field(const DomItem &self, QStringView name) const override
void setBindings(const QMultiMap< QString, Binding > &bindings)
QString localDefaultPropertyName() const
QString defaultPropertyName(const DomItem &self) const
void setPropertyDefs(const QMultiMap< QString, PropertyDefinition > &propertyDefs)
QmlObject(const Path &pathFromOwner=Path())
void writeOutSortedAttributes(const DomItem &self, OutWriter &ow, const DomItem &component) const
MutableDomItem addMethod(MutableDomItem &self, const MethodInfo &functionDef, AddOption option)
void writeOutAttributes(const DomItem &self, OutWriter &ow, const DomItem &component, const QString &code) const
void setIdStr(const QString &id)
QQmlJSScope::ConstPtr semanticScope() const
const QMultiMap< QString, PropertyDefinition > & propertyDefs() const &
void writeOut(const DomItem &self, OutWriter &lw) const override
Path addPrototypePath(const Path &prototypePath)
void setSemanticScope(const QQmlJSScope::ConstPtr &scope)
void setDefaultPropertyName(const QString &name)
void setPrototypePaths(const QList< Path > &prototypePaths)
QList< QmlObject > annotations() const
QList< QString > fields() const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
Path addMethod(const MethodInfo &functionDef, AddOption option, MethodInfo **mPtr=nullptr)
bool iterateBaseDirectSubpaths(const DomItem &self, DirectVisitor) const
static QmlUri fromString(const QString &importStr)
QString absoluteLocalPath(const QString &basePath=QString()) const
QString directoryString() const
static QmlUri fromUriString(const QString &importStr)
QString localPath() const
QString moduleUri() const
friend bool operator==(const QmlUri &i1, const QmlUri &i2)
static QmlUri fromDirectoryString(const QString &importStr)
friend bool operator!=(const QmlUri &i1, const QmlUri &i2)
void setInterfaceNames(const QStringList &interfaces)
void setMetaRevisions(const QList< int > &metaRevisions)
QQmlJSScope::AccessSemantics accessSemantics() const
void setFileName(const QString &fileName)
static constexpr DomType kindValue
QQmlJSScope::ConstPtr semanticScope() const
void setAccessSemantics(QQmlJSScope::AccessSemantics v)
void setSemanticScope(const QQmlJSScope::ConstPtr &scope)
bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
void setExtensionTypeName(const QString &name)
void setElementTypeName(const QString &name)
const QList< int > & metaRevisions() const &
const QList< Export > & exports() const &
void setExports(const QList< Export > &exports)
void addExport(const Export &exportedEntry)
const QStringList & interfaceNames() const &
QmltypesComponent(const Path &pathFromOwner=Path())
DomType kind() const override
static bool addForPath(const DomItem &el, const Path &canonicalPath, const RefCacheEntry &entry, AddOption addOption=AddOption::KeepExisting)
QList< QString > fields(const DomItem &self) const override
quintptr id() const override
static constexpr DomType kindValue
const Reference & operator*() const
DomItem index(const DomItem &, index_type) const override
DomItem field(const DomItem &self, QStringView name) const override
DomItem get(const DomItem &self, const ErrorHandler &h=nullptr, QList< Path > *visitedRefs=nullptr) const
QList< DomItem > getAll(const DomItem &self, const ErrorHandler &h=nullptr, QList< Path > *visitedRefs=nullptr) const
index_type indexes(const DomItem &) const override
DomType kind() const override
QSet< QString > const keys(const DomItem &) const override
const Reference * operator->() const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
Reference(const Path &referredObject=Path(), const Path &pathFromOwner=Path(), const SourceLocation &loc=SourceLocation())
DomItem key(const DomItem &, const QString &) const override
Keeps the comments associated with a DomItem.
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
friend bool operator!=(const RegionComments &c1, const RegionComments &c2)
const QMap< FileLocationRegion, CommentedElement > & regionComments() const
friend bool operator==(const RegionComments &c1, const RegionComments &c2)
Path addComment(const Comment &comment, FileLocationRegion region)
static constexpr DomType kindValue
const DomBase & operator*() const
const DomBase * operator->() const
static constexpr DomType kindValue
ScriptElementVariant element() const
ScriptElementDomWrapper(const ScriptElementVariant &element)
Use this to contain any script element.
void visitConst(F &&visitor) const
std::optional< ScriptElementT > data()
ScriptElement::PointerType< ScriptElement > base() const
Returns a pointer to the virtual base for virtual method calls.
static ScriptElementVariant fromElement(const T &element)
void setData(const ScriptElementT &data)
void setLeft(const ScriptElementVariant &newLeft)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void createFileLocations(const FileLocations::Tree &base) override
void setRight(const ScriptElementVariant &newRight)
void createFileLocations(const FileLocations::Tree &base) override
void setStatements(const ScriptList &statements)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void setInitializer(const ScriptElementVariant &newInitializer)
void setExpression(const ScriptElementVariant &newExpression)
void setCondition(const ScriptElementVariant &newCondition)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void createFileLocations(const FileLocations::Tree &base) override
void setDeclarations(const ScriptElementVariant &newDeclaration)
void setBody(const ScriptElementVariant &newBody)
void createFileLocations(const FileLocations::Tree &base) override
void insertValue(QStringView name, const QCborValue &v)
std::variant< ScriptElementVariant, ScriptList > VariantT
decltype(auto) insertChild(QStringView name, VariantT v)
ScriptElementVariant elementChild(const QQmlJS::Dom::FieldType &field)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void setCondition(const ScriptElementVariant &condition)
void setConsequence(const ScriptElementVariant &consequence)
void setAlternative(const ScriptElementVariant &alternative)
void createFileLocations(const FileLocations::Tree &base) override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void createFileLocations(const FileLocations::Tree &base) override
void setExpression(ScriptElementVariant expression)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void setMainRegionLocation(const QQmlJS::SourceLocation &location)
ScriptElementBase(QQmlJS::SourceLocation combinedLocation=QQmlJS::SourceLocation{})
void addLocation(FileLocationRegion region, QQmlJS::SourceLocation location)
void createFileLocations(const FileLocations::Tree &base) override
QQmlJS::SourceLocation mainRegionLocation() const
All of the following overloads are only required for optimization purposes.
std::vector< std::pair< FileLocationRegion, QQmlJS::SourceLocation > > m_locations
ScriptElementBase(QQmlJS::SourceLocation first, QQmlJS::SourceLocation last)
void createFileLocations(const FileLocations::Tree &base) override
void replaceKindForGenericChildren(DomType oldType, DomType newType)
void append(const ScriptElementVariant &statement)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
const QList< ScriptElementVariant > & qList() const
void createFileLocations(const FileLocations::Tree &base) override
void setIdentifier(const ScriptElementVariant &identifier)
void setInitializer(const ScriptElementVariant &initializer)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void createFileLocations(const FileLocations::Tree &base) override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
QStringView loc2Str(const SourceLocation &) const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
DomType kind() const override
std::shared_ptr< AstComments > astComments() const
std::shared_ptr< QQmlJS::Engine > engine() const
ScriptExpression(const QString &code, ExpressionType expressionType)
static constexpr DomType kindValue
SourceLocation locationToLocal(const SourceLocation &x) const
std::shared_ptr< ScriptExpression > makeCopy(const DomItem &self) const
ScriptExpression(const ScriptExpression &e)
ExpressionType expressionType() const
void writeOut(const DomItem &self, OutWriter &lw) const override
SourceLocation globalLocation(const DomItem &self) const
ScriptExpression(QStringView code, const std::shared_ptr< QQmlJS::Engine > &engine, AST::Node *ast, const std::shared_ptr< AstComments > &comments, ExpressionType expressionType, const SourceLocation &localOffset=SourceLocation())
void setScriptElement(const ScriptElementVariant &p)
std::shared_ptr< OwningItem > doCopy(const DomItem &) const override
ScriptElementVariant scriptElement()
void astDumper(const Sink &s, AstDumperOptions options) const
SourceLocation localOffset() const
Path canonicalPath(const DomItem &self) const override
static constexpr DomType kindValue
bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
SimpleObjectWrapBase(const Path &pathFromOwner, const QVariant &value, quintptr idValue, DomType kind=kindValue, SimpleWrapOptions options=SimpleWrapOption::None)
virtual void moveTo(SimpleObjectWrapBase *) const
DomKind domKind() const final override
virtual void copyTo(SimpleObjectWrapBase *) const
DomType kind() const final override
quintptr id() const final override
SimpleObjectWrapT(const Path &pathFromOwner, const QVariant &v, quintptr idValue, SimpleWrapOptions o)
void moveTo(SimpleObjectWrapBase *target) const override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
static constexpr DomType kindValue
void writeOut(const DomItem &self, OutWriter &lw) const override
void copyTo(SimpleObjectWrapBase *target) const override
const SimpleObjectWrapBase & operator*() const
SimpleObjectWrapBase & operator*()
static SimpleObjectWrap fromObjectRef(const Path &pathFromOwner, T &value)
const SimpleObjectWrapBase * operator->() const
static constexpr DomType kindValue
SimpleObjectWrapBase * operator->()
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
QString majorString() const
static constexpr DomType kindValue
Version(qint32 majorVersion=Undefined, qint32 minorVersion=Undefined)
QString minorString() const
int compare(Version o) const
static Version fromString(QStringView v)
QString stringValue() const
static constexpr qint32 Undefined
static constexpr qint32 Latest
QString majorSymbolicString() const
A vistor that visits all the AST:Node.
bool visit(AST::UiPublicMember *el) override
void throwRecursionDepthError() override
static QSet< int > uiKinds()
returns a set with all Ui* Nodes (i.e.
void endVisit(AST::UiImport *el) override
Provides entities to maintain mappings between elements and their location in a file.
void addRegion(const Tree &fLoc, FileLocationRegion region, SourceLocation loc)
Tree createTree(const Path &basePath)
QString canonicalPathForTesting(const Tree &base)
QQmlJS::SourceLocation region(const Tree &fLoc, FileLocationRegion region)
bool visitTree(const Tree &base, function_ref< bool(const Path &, const Tree &)> visitor, const Path &basePath=Path())
Tree ensure(const Tree &base, const Path &basePath)
Tree find(const Tree &self, const Path &p)
bool operator>=(const PathComponent &lhs, const PathComponent &rhs)
bool operator<=(const PathComponent &lhs, const PathComponent &rhs)
bool operator==(const PathComponent &lhs, const PathComponent &rhs)
bool operator!=(const PathComponent &lhs, const PathComponent &rhs)
bool operator>(const PathComponent &lhs, const PathComponent &rhs)
bool operator<(const PathComponent &lhs, const PathComponent &rhs)
Path lookupTypePath(const QString &name)
Path loadInfoPath(const Path &el)
Path moduleScopePath(const QString &uri, const ErrorHandler &errorHandler=nullptr)
Path qmltypesFilePath(const QString &path)
Path jsFilePath(const QString &path)
Path lookupCppTypePath(const QString &name)
Path qmlFileInfoPath(const QString &canonicalFilePath)
Path moduleIndexPath(const QString &uri, int majorVersion, const ErrorHandler &errorHandler=nullptr)
Path qmlFilePath(const QString &canonicalFilePath)
Path globalScopePath(const QString &name)
Path moduleScopePath(const QString &uri, const QString &version, const ErrorHandler &errorHandler=nullptr)
Path lookupSymbolPath(const QString &name)
Path jsFileInfoPath(const QString &path)
Path lookupPropertyPath(const QString &name)
Path moduleScopePath(const QString &uri, Version version, const ErrorHandler &errorHandler=nullptr)
Path qmlDirPath(const QString &path)
Path qmlDirectoryPath(const QString &path)
Path qmldirFilePath(const QString &path)
Path qmlDirectoryInfoPath(const QString &path)
Path qmltypesFileInfoPath(const QString &path)
Path qmldirFileInfoPath(const QString &path)
Path qmlDirInfoPath(const QString &path)
Path qmlFileObjectPath(const QString &canonicalFilePath)
Path globalScopeInfoPath(const QString &name)
bool operator>(Version v1, Version v2)
QMLDOM_EXPORT bool domTypeIsContainer(DomType k)
bool operator==(Version v1, Version v2)
QMLDOM_EXPORT void dumperToQDebug(const Dumper &dumper, QDebug debug)
void devNull(QStringView)
QMLDOM_EXPORT void errorToQDebug(const ErrorMessage &)
writes an ErrorMessage to QDebug
constexpr bool domTypeIsOwningItem(DomType)
Path appendUpdatableElementInQList(const Path &listPathFromOwner, QList< T > &list, const T &value, T **vPtr=nullptr)
bool operator<=(const ErrorMessage &e1, const ErrorMessage &e2)
QMLDOM_EXPORT void dumpErrorLevel(const Sink &s, ErrorLevel level)
Dumps a string describing the given error level (ErrorLevel::Error -> Error,...)
constexpr bool domTypeIsValueWrap(DomType k)
void sinkInt(const Sink &s, T i)
std::variant< ConstantData, Empty, List, ListP, Map, Reference, ScriptElementDomWrapper, SimpleObjectWrap, const AstComments *, const FileLocations::Node *, const DomEnvironment *, const DomUniverse *, const EnumDecl *, const ExternalItemInfoBase *, const ExternalItemPairBase *, const GlobalComponent *, const GlobalScope *, const JsFile *, const JsResource *, const LoadInfo *, const MockObject *, const MockOwner *, const ModuleIndex *, const ModuleScope *, const QmlComponent *, const QmlDirectory *, const QmlFile *, const QmlObject *, const QmldirFile *, const QmltypesComponent *, const QmltypesFile *, const ScriptExpression * > ElementT
QMLDOM_EXPORT void silentError(const ErrorMessage &)
Error handler that ignores all errors (excluding fatal ones)
Path insertUpdatableElementInMultiMap(const Path &mapPathFromOwner, QMultiMap< K, T > &mmap, K key, const T &value, AddOption option=AddOption::KeepExisting, T **valuePtr=nullptr)
size_t qHash(const CommentAnchor &key, size_t seed=0) noexcept
std::variant< std::monostate, std::shared_ptr< DomEnvironment >, std::shared_ptr< DomUniverse > > TopT
bool noFilter(const DomItem &, const PathEls::PathComponent &, const DomItem &)
QMLDOM_EXPORT void dumperToQDebug(const Dumper &dumper, ErrorLevel level=ErrorLevel::Debug)
writes the dumper to the QDebug object corrsponding to the given error level
QMLDOM_EXPORT void sinkNewline(const Sink &s, int indent=0)
sinks a neline and indents by the given amount
bool operator>=(const ErrorGroups &lhs, const ErrorGroups &rhs)
QMLDOM_EXPORT void setDefaultErrorHandler(const ErrorHandler &h)
Sets the default error handler.
QMLDOM_EXPORT ErrorLevel errorLevelFromQtMsgType(QtMsgType msgType)
QMLDOM_EXPORT QMap< DomKind, QString > domKindToStringMap()
size_t qHash(const Path &, size_t)
QMLDOM_EXPORT QDebug operator<<(QDebug debug, const DomItem &c)
std::shared_ptr< ExternalOwningItem > getFileItemOwner(const DomItem &fileItem)
DomKind kind2domKind(DomType k)
bool operator==(const ErrorGroups &lhs, const ErrorGroups &rhs)
static DomItem keyMultiMapHelper(const DomItem &self, const QString &key, const QMultiMap< QString, T > &mmap)
bool operator!=(const DomItem &o1, const DomItem &o2)
QMLDOM_EXPORT bool domTypeIsExternalItem(DomType k)
constexpr bool domTypeIsUnattachedOwningItem(DomType)
QMLDOM_EXPORT QMap< DomType, QString > domTypeToStringMap()
QMLDOM_EXPORT bool domTypeIsScope(DomType k)
bool operator!=(const ErrorMessage &e1, const ErrorMessage &e2)
bool operator<=(const Path &lhs, const Path &rhs)
bool operator==(const ErrorMessage &e1, const ErrorMessage &e2)
QMLDOM_EXPORT QDebug operator<<(QDebug debug, const MutableDomItem &c)
std::disjunction< std::is_same< U, V >... > IsInList
bool operator>(const Path &lhs, const Path &rhs)
bool operator<(const ErrorMessage &e1, const ErrorMessage &e2)
QMLDOM_EXPORT QString domTypeToString(DomType k)
std::variant< std::monostate, std::shared_ptr< ModuleIndex >, std::shared_ptr< MockOwner >, std::shared_ptr< ExternalItemInfoBase >, std::shared_ptr< ExternalItemPairBase >, std::shared_ptr< QmlDirectory >, std::shared_ptr< QmldirFile >, std::shared_ptr< JsFile >, std::shared_ptr< QmlFile >, std::shared_ptr< QmltypesFile >, std::shared_ptr< GlobalScope >, std::shared_ptr< ScriptExpression >, std::shared_ptr< AstComments >, std::shared_ptr< LoadInfo >, std::shared_ptr< FileLocations::Node >, std::shared_ptr< DomEnvironment >, std::shared_ptr< DomUniverse > > OwnerT
auto writeOutWrap(const T &, const DomItem &, OutWriter &, rank< 0 >) -> void
constexpr bool domTypeIsScriptElement(DomType)
QMLDOM_EXPORT QString domKindToString(DomKind k)
bool operator>=(const ErrorMessage &e1, const ErrorMessage &e2)
constexpr bool domTypeIsDomElement(DomType)
void updatePathFromOwnerQList(QList< T > &list, const Path &newPath)
constexpr bool domTypeCanBeInline(DomType k)
bool operator<(Version v1, Version v2)
bool operator<=(Version v1, Version v2)
bool operator!=(const ErrorGroups &lhs, const ErrorGroups &rhs)
QMLDOM_EXPORT QDebug operator<<(QDebug d, const Dumper &dumper)
auto writeOutWrap(const T &t, const DomItem &self, OutWriter &lw) -> void
QDebug operator<<(QDebug debug, const Path &p)
bool operator>=(const Path &lhs, const Path &rhs)
auto writeOutWrap(const T &t, const DomItem &self, OutWriter &lw, rank< 1 >) -> decltype(t.writeOut(self, lw))
bool operator!=(Version v1, Version v2)
bool operator>=(Version v1, Version v2)
bool operator<=(const ErrorGroups &lhs, const ErrorGroups &rhs)
bool operator!=(const Path &lhs, const Path &rhs)
bool operator<(const Path &lhs, const Path &rhs)
bool visitWithCustomListIteration(T *t, AST::Visitor *visitor)
std::function< void(const ErrorMessage &)> ErrorHandler
QMLDOM_EXPORT void sinkIndent(const Sink &s, int indent)
sinks the requested amount of spaces
bool operator>(const ErrorGroups &lhs, const ErrorGroups &rhs)
QMLDOM_EXPORT bool domTypeIsTopItem(DomType k)
QMLDOM_EXPORT void defaultErrorHandler(const ErrorMessage &)
Calls the default error handler (by default errorToQDebug)
void updatePathFromOwnerMultiMap(QMultiMap< K, T > &mmap, const Path &newPath)
bool operator<(const ErrorGroups &lhs, const ErrorGroups &rhs)
constexpr bool domTypeIsObjWrap(DomType k)
QMLDOM_EXPORT void sinkEscaped(const Sink &sink, QStringView s, EscapeOptions options=EscapeOptions::OuterQuotes)
dumps a string as quoted string (escaping things like quotes or newlines)
bool operator==(const Path &lhs, const Path &rhs)
bool operator>(const ErrorMessage &e1, const ErrorMessage &e2)
bool emptyChildrenVisitor(Path, const DomItem &, bool)
QMLDOM_EXPORT QString dumperToString(const Dumper &writer)
Converts a dumper to a string.
static ErrorGroups importErrors
Q_STATIC_LOGGING_CATEGORY(lcAccessibilityCore, "qt.accessibility.core")
#define QMLDOM_EXPORT
#define Q_SCRIPTELEMENT_EXIT_IF(check)
#define Q_SCRIPTELEMENT_DISABLE()
#define NewErrorGroup(name)
QT_BEGIN_NAMESPACE QT_DECLARE_EXPORTED_QT_LOGGING_CATEGORY(writeOutLog, QMLDOM_EXPORT)
#define QMLDOM_FIELD(name)
#define QMLDOM_USTRING(s)
friend bool comparesEqual(const CommentAnchor &a, const CommentAnchor &b) noexcept
static CommentAnchor from(const SourceLocation &sl)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
QMap< FileLocationRegion, SourceLocation > regions
A common base class for all the script elements.
void setSemanticScope(const QQmlJSScope::ConstPtr &scope)
virtual void createFileLocations(const std::shared_ptr< FileLocations::Node > &fileLocationOfOwner)=0
std::shared_ptr< T > PointerType
QQmlJSScope::ConstPtr semanticScope()
SubclassStorage & operator=(const SubclassStorage &o)
SubclassStorage(const SubclassStorage &&o)
SubclassStorage(const SubclassStorage &o)