31#include <QtCore/QMultiMap>
33#include <QtCore/QString>
34#include <QtCore/QStringView>
35#include <QtCore/QDebug>
36#include <QtCore/QDateTime>
37#include <QtCore/QMutex>
38#include <QtCore/QCborValue>
39#include <QtCore/QTimeZone>
40#include <QtQml/private/qqmljssourcelocation_p.h>
41#include <QtQmlCompiler/private/qqmljsscope_p.h>
103struct IsMultiMap : std::false_type
107template<
typename Key,
typename T>
108struct IsMultiMap<QMultiMap<Key, T>> : std::true_type
113struct IsMap : std::false_type
117template<
typename Key,
typename T>
118struct IsMap<QMap<Key, T>> : std::true_type
122template<
typename... Ts>
125template<
typename T,
typename =
void>
126struct IsDomObject : std::false_type
131struct IsDomObject<T, void_t<
decltype(T::kindValue)>> : std::true_type
135template<
typename T,
typename =
void>
136struct IsInlineDom : std::false_type
141struct IsInlineDom<T, void_t<
decltype(T::kindValue)>>
142 : std::integral_constant<
bool, domTypeCanBeInline(T::kindValue)>
147struct IsInlineDom<T *, void_t<
decltype(T::kindValue)>> : std::true_type
152struct IsInlineDom<std::shared_ptr<T>, void_t<
decltype(T::kindValue)>> : std::true_type
157struct IsSharedPointerToDomObject : std::false_type
162struct IsSharedPointerToDomObject<
std::shared_ptr<T>> : IsDomObject<T>
166template<
typename T,
typename =
void>
167struct IsList : std::false_type
172struct IsList<T, void_t<
typename T::value_type>> : std::true_type
184 T *
data() {
return reinterpret_cast<T *>(
this); }
185 const T *
data()
const {
return reinterpret_cast<
const T *>(
this); }
195 o.data()->copyTo(data());
218 DirectVisitor visitor)
const = 0;
223 virtual void dump(
const DomItem &,
const Sink &sink,
int indent, FilterT filter)
const;
249 return DomKind::Empty;
252 return DomKind::List;
255 case DomType::ConstantData:
256 return DomKind::Value;
258 return DomKind::Object;
279 void dump(
const DomItem &,
const Sink &s,
int indent,
280 function_ref<
bool(
const DomItem &,
const PathEls::PathComponent &,
const DomItem &)> filter)
296 Path m_pathFromOwner;
313 const Keys &keys,
const QString &targetType);
326 const Path &pathFromOwner,
const QMap<QString, T> &mmap,
331 const Path &pathFromOwner,
const QMap<FileLocationRegion, T> &map);
334 const Path &pathFromOwner,
const QMap<FileLocationRegion, QList<T>> &map);
337 template<
typename MapT>
338 static QSet<QString> fileRegionKeysFromMap(
const MapT &map);
341 QString m_targetType;
396 ListPBase(
const Path &pathFromOwner,
const QList<
const void *> &pList,
const QString &elType)
419 ListPT(
const Path &pathFromOwner,
const QList<T *> &pList,
const QString &elType = QString(),
422 (elType.isEmpty() ? QLatin1String(
typeid(T).name()) : elType))
424 static_assert(
sizeof(
ListPBase) ==
sizeof(ListPT),
425 "ListPT does not have the same size as ListPBase");
426 static_assert(
alignof(
ListPBase) ==
alignof(ListPT),
427 "ListPT does not have the same size as ListPBase");
428 m_pList.reserve(pList.size());
430 for (
const void *p : pList)
433 for (qsizetype i = pList.size(); i-- != 0;)
435 m_pList.append(pList.at(i));
452 ListP(
const Path &pathFromOwner,
const QList<T *> &pList,
const QString &elType = QString(),
480 const ConstantData *
operator->()
const {
return this; }
482 const ConstantData &
operator*()
const {
return *
this; }
505 template <
typename T>
508 if (m_options & SimpleWrapOption::ValueType) {
509 if (m_value.metaType() == QMetaType::fromType<T>())
510 return static_cast<
const T *>(m_value.constData());
513 return m_value.value<
const T *>();
527 friend class TestDomItem;
555 return asT()->iterateDirectSubpaths(self, visitor);
562 if constexpr (domTypeIsValueWrap(T::kindValue)) {
563 if (m_value.metaType() == QMetaType::fromType<T>())
564 return static_cast<
const T *>(m_value.constData());
566 }
else if constexpr (domTypeIsObjWrap(T::kindValue)) {
567 return m_value.value<
const T *>();
570 static_assert(!
std::is_same_v<T, T>,
"wrapping of unexpected type");
578 "Size mismatch in SimpleObjectWrapT");
580 "Size mismatch in SimpleObjectWrapT");
581 new (target) SimpleObjectWrapT(*
this);
587 "Size mismatch in SimpleObjectWrapT");
589 "Size mismatch in SimpleObjectWrapT");
590 new (target) SimpleObjectWrapT(
std::move(*
this));
594 quintptr idValue, SimpleWrapOptions o)
620 SimpleObjectWrap(
const Path &pathFromOwner, T &value)
622 using BaseT = std::decay_t<T>;
623 if constexpr (domTypeIsObjWrap(BaseT::kindValue)) {
624 new (wrap.data()) SimpleObjectWrapT<BaseT>(pathFromOwner, QVariant::fromValue(&value),
625 quintptr(&value), SimpleWrapOption::None);
626 }
else if constexpr (domTypeIsValueWrap(BaseT::kindValue)) {
627 new (wrap.data()) SimpleObjectWrapT<BaseT>(pathFromOwner, QVariant::fromValue(value),
628 quintptr(0), SimpleWrapOption::ValueType);
630 qCWarning(domLog) <<
"Unexpected object to wrap in SimpleObjectWrap: "
631 << domTypeToString(BaseT::kindValue);
632 Q_ASSERT_X(
false,
"SimpleObjectWrap",
633 "simple wrap of unexpected object");
635 SimpleObjectWrapT<BaseT>(pathFromOwner,
nullptr, 0, SimpleWrapOption::None);
655 const SourceLocation &loc = SourceLocation());
666 QList<Path> *visitedRefs =
nullptr)
const;
668 QList<Path> *visitedRefs =
nullptr)
const;
678
679
680
681
682
683
684
701 QQmlJSScope::ConstPtr m_scope;
705
706
707
711 template<
typename...
T>
714 template<
typename T,
typename Variant>
715 struct TypeIsInVariant;
717 template<
typename T,
typename... Ts>
718 struct TypeIsInVariant<T,
std::variant<Ts...>> :
public std::disjunction<
std::is_same<T, Ts>...>
733 static_assert(TypeIsInVariant<T, ScriptElementT>::value,
734 "Cannot construct ScriptElementVariant from T, as it is missing from the "
743 operator bool()
const {
return m_data.has_value(); }
749 std::visit(std::forward<F>(visitor), *m_data);
756 std::visit(std::forward<F>(visitor), *m_data);
759 void setData(
const ScriptElementT &data) { m_data = data; }
762 std::optional<ScriptElementT> m_data;
766
767
768
769
770
771
794 const DomEnvironment *,
const DomUniverse *,
const EnumDecl *,
796 const GlobalComponent *,
const GlobalScope *,
const JsFile *,
797 const JsResource *,
const LoadInfo *,
const MockObject *,
const MockOwner *,
798 const ModuleIndex *,
const ModuleScope *,
const QmlComponent *,
799 const QmlDirectory *,
const QmlFile *,
const QmlObject *,
const QmldirFile *,
804 std::shared_ptr<DomEnvironment>,
805 std::shared_ptr<DomUniverse>>;
810 std::shared_ptr<QmlDirectory>,
std::shared_ptr<QmldirFile>,
811 std::shared_ptr<JsFile>,
std::shared_ptr<QmlFile>,
812 std::shared_ptr<QmltypesFile>,
std::shared_ptr<GlobalScope>,
815 std::shared_ptr<DomEnvironment>,
std::shared_ptr<DomUniverse>>;
833 FileToLoad(
const std::weak_ptr<DomEnvironment> &environment,
const QString &canonicalPath,
838 const QString &path,
const QString &data);
840 const QString &canonicalPath);
850 std::weak_ptr<DomEnvironment> m_environment;
851 QString m_canonicalPath;
852 QString m_logicalPath;
875 return std::visit(f,
this->m_element);
885 if (m_kind == DomType::ConstantData)
886 return std::get<ConstantData>(m_element).domKind();
888 return kind2domKind(m_kind);
926 QString name()
const {
return field(Fields::name).value().toString(); }
929 QString idStr()
const {
return field(Fields::idStr).value().toString(); }
938 DomItem child(index_type i)
const {
return field(Fields::children).index(i); }
942 return field(Fields::annotations);
949 QList<Path> *visitedRefs =
nullptr)
const;
956 return (*
this)[QStringView(component)];
972 bool visitIndexes(function_ref<
bool(
const DomItem &)> visitor)
const;
977 DomItem key(QStringView name)
const {
return key(name.toString()); }
978 bool visitKeys(function_ref<
bool(
const QString &,
const DomItem &)> visitor)
const;
985 bool writeOut(
const QString &path,
int nBackups = 2,
989 bool visitTree(
const Path &basePath, ChildrenVisitor visitor,
996 const ErrorHandler &h =
nullptr, QSet<quintptr> *visited =
nullptr,
997 QList<Path> *visitedRefs =
nullptr)
const;
1000 const ErrorHandler &h =
nullptr, QSet<quintptr> *visited =
nullptr,
1001 QList<Path> *visitedRefs =
nullptr)
const;
1005 const ErrorHandler &h =
nullptr, QSet<quintptr> *visited =
nullptr,
1006 QList<Path> *visitedRefs =
nullptr)
const;
1008 bool visitUp(function_ref<
bool(
const DomItem &)> visitor)
const;
1011 const ErrorHandler &h =
nullptr, QSet<quintptr> *visited =
nullptr,
1012 QList<Path> *visitedRefs =
nullptr)
const;
1014 const QString &name, function_ref<
bool(
const DomItem &)> visitor)
const;
1016 const QString &symbolName, function_ref<
bool(
const DomItem &)> visitor,
1018 QSet<quintptr> *visited =
nullptr, QList<Path> *visitedRefs =
nullptr)
const;
1020 const QString &symbolName, function_ref<
bool(
const DomItem &)> visitor,
1022 const ErrorHandler &errorHandler =
nullptr, QSet<quintptr> *visited =
nullptr,
1023 QList<Path> *visitedRefs =
nullptr)
const;
1025 const QString &name, function_ref<
bool(
const DomItem &)> visitor)
const;
1027 const ErrorHandler &h =
nullptr, QList<Path> *visitedRefs =
nullptr)
const;
1039 bool commitToBase(
const std::shared_ptr<DomEnvironment> &validPtr =
nullptr)
const;
1043 void dumpPtr(
const Sink &sink)
const;
1044 void dump(
const Sink &,
int indent = 0,
1045 function_ref<
bool(
const DomItem &,
const PathEls::PathComponent &,
const DomItem &)> filter =
1048 dump(
const QString &path,
1049 function_ref<
bool(
const DomItem &,
const PathEls::PathComponent &,
const DomItem &)> filter =
noFilter,
1050 int nBackups = 2,
int indent = 0,
FileWriter *fw =
nullptr)
const;
1065 function_ref<
bool (
const DomItem &,
const ErrorMessage &)> visitor,
bool iterate,
1068 bool iterateSubOwners(function_ref<
bool(
const DomItem &owner)> visitor)
const;
1071 template<
typename T>
1074 template<
typename T>
1078 return subDataItem(
PathEls::Field(f), value, options);
1080 template<
typename T>
1083 template<
typename T>
1086 template<
typename T>
1090 return this->dvValue<T>(
std::move(visitor),
PathEls::Field(f), value, options);
1092 template<
typename F>
1095 template<
typename F>
1099 return this->dvValueLazy(
std::move(visitor),
PathEls::Field(f), valueF, options);
1103 return this->subDataItem(c, sourceLocationToQCborValue(loc));
1111 return dvItem(std::move(visitor), c, [c,
this, referencedObject]() {
1112 return this->subReferenceItem(c, referencedObject);
1118 return dvItem(std::move(visitor), c, [c,
this, paths]() {
1119 return this->subReferencesItem(c, paths);
1124 return dvReference(std::move(visitor), PathEls::Field(f), referencedObject);
1128 return dvReferences(std::move(visitor), PathEls::Field(f), paths);
1132 return visitor(c, it);
1134 bool dvItemField(DirectVisitor visitor, QStringView f, function_ref<DomItem()> it)
const
1136 return dvItem(std::move(visitor), PathEls::Field(f), it);
1142 return DomItem(m_top, m_owner, m_ownerPath, obj);
1148 return DomItem(m_top, m_owner, m_ownerPath, ScriptElementDomWrapper(obj));
1151 template<
typename Owner>
1154 if constexpr (domTypeIsUnattachedOwningItem(Owner::element_type::kindValue))
1155 return DomItem(m_top, o, canonicalPath().withComponent(c), o.get());
1157 return DomItem(m_top, o, Path(), o.get());
1159 template<
typename T>
1161 template<
typename T>
1164 return wrap<T>(
PathEls::Field(f), obj);
1166 template<
typename T>
1168 template<
typename T>
1171 return dvWrap<T>(
std::move(visitor),
PathEls::Field(f), obj);
1175 DomItem(
const std::shared_ptr<DomEnvironment> &);
1176 DomItem(
const std::shared_ptr<DomUniverse> &);
1187 template<
typename T,
typename std::enable_if<
std::is_base_of_v<
DomBase, T>,
bool>::type =
true>
1190 if (m_kind == T::kindValue) {
1191 if constexpr (domTypeIsObjWrap(T::kindValue) || domTypeIsValueWrap(T::kindValue))
1192 return std::get<SimpleObjectWrap>(m_element)->as<T>();
1194 return static_cast<T
const *>(base());
1199 template<
typename T,
typename std::enable_if<!
std::is_base_of_v<
DomBase, T>,
bool>::type =
true>
1202 if (m_kind == T::kindValue) {
1204 return std::get<SimpleObjectWrap>(m_element)->as<T>();
1209 template<
typename T>
1212 template<
typename Owner,
typename T>
1215 Q_ASSERT(!std::holds_alternative<std::monostate>(m_top));
1216 static_assert(IsInlineDom<std::decay_t<T>>::value,
"Expected an inline item or pointer");
1217 return DomItem(m_top, owner, ownerPath, base);
1220 template<
typename Owner>
1223 Q_ASSERT(!std::holds_alternative<std::monostate>(m_top));
1224 return DomItem(m_top, owner, ownerPath, owner.get());
1227 template<
typename T>
1230 Q_ASSERT(!std::holds_alternative<std::monostate>(m_top));
1231 using BaseT = std::decay_t<T>;
1232 static_assert(!std::is_same_v<BaseT, ElementT>,
1233 "variant not supported, pass in the stored types");
1234 static_assert(IsInlineDom<BaseT>::value || std::is_same_v<BaseT, std::monostate>,
1235 "expected either a pointer or an inline item");
1237 if constexpr (IsSharedPointerToDomObject<BaseT>::value)
1238 return DomItem(m_top, base, Path(), base.get());
1239 else if constexpr (IsInlineDom<BaseT>::value)
1240 return DomItem(m_top, m_owner, m_ownerPath, base);
1242 Q_UNREACHABLE_RETURN(DomItem(m_top, m_owner, m_ownerPath,
nullptr));
1246 enum class WriteOutCheckResult { Success, Failed };
1247 WriteOutCheckResult performWriteOutChecks(
const DomItem &, OutWriter &, WriteOutChecks)
const;
1250 template<
typename Env,
typename Owner>
1255 template<
typename Env,
typename Owner,
typename T,
1256 typename = std::enable_if_t<IsInlineDom<std::decay_t<T>>::value>>
1257 DomItem(Env env, Owner owner,
const Path &ownerPath,
const T &el)
1258 : m_top(env), m_owner(owner), m_ownerPath(ownerPath), m_element(el)
1260 using BaseT = std::decay_t<T>;
1261 if constexpr (std::is_pointer_v<BaseT>) {
1265 m_top = std::monostate();
1266 m_owner = std::monostate();
1267 m_ownerPath = Path();
1268 m_element = Empty();
1270 using DomT = std::remove_pointer_t<BaseT>;
1272 m_kind = DomT::kindValue;
1275 static_assert(!std::is_same_v<BaseT, ElementT>,
1276 "variant not supported, pass in the internal type");
1277 m_kind = el->kind();
1285 friend class DomUniverse;
1286 friend class DomEnvironment;
1293 friend class TestDomItem;
1311 const QMultiMap<QString, T> &mmap)
1313 auto it = mmap.find(key);
1314 auto end = mmap.cend();
1319 QList<
const T *> values;
1320 while (it != end && it.key() == key)
1321 values.append(&(*it++));
1324 return self.copy(ll);
1329Map Map::fromMultiMapRef(
const Path &pathFromOwner,
const QMultiMap<QString, T> &mmap)
1333 [&mmap](
const DomItem &self,
const QString &key) {
1334 return keyMultiMapHelper(self, key, mmap);
1336 [&mmap](
const DomItem &) {
return QSet<QString>(mmap.keyBegin(), mmap.keyEnd()); },
1337 QLatin1String(
typeid(T).name()));
1342 const Path &pathFromOwner,
const QMap<QString, T> &map,
1347 [&map, elWrapper](
const DomItem &self,
const QString &key) {
1348 const auto it = map.constFind(key);
1349 if (it == map.constEnd())
1351 return elWrapper(self,
PathEls::Key(key), it.value());
1353 [&map](
const DomItem &) {
return QSet<QString>(map.keyBegin(), map.keyEnd()); },
1354 QLatin1String(
typeid(T).name()));
1357template<
typename MapT>
1358QSet<QString>
Map::fileRegionKeysFromMap(
const MapT &map)
1361 std::transform(map.keyBegin(), map.keyEnd(), std::inserter(keys, keys.begin()), fileLocationRegionName);
1366Map Map::fromFileRegionMap(
const Path &pathFromOwner,
const QMap<FileLocationRegion, T> &map)
1370 [&map](
const DomItem &mapItem,
const QString &key) -> DomItem {
1371 auto it = map.constFind(fileLocationRegionValue(key));
1372 if (it == map.constEnd())
1375 return mapItem.wrap(PathEls::Key(key), *it);
1377 [&map](
const DomItem &) {
return fileRegionKeysFromMap(map); },
1378 QString::fromLatin1(
typeid(T).name()));
1384 const QMap<FileLocationRegion, QList<T>> &map)
1386 using namespace Qt::StringLiterals;
1389 [&map](
const DomItem &mapItem,
const QString &key) -> DomItem {
1390 const QList<SourceLocation> locations = map.value(fileLocationRegionValue(key));
1391 if (locations.empty())
1394 auto list = List::fromQList<SourceLocation>(
1395 mapItem.pathFromOwner(), locations,
1396 [](
const DomItem &self,
const PathEls::PathComponent &path,
1397 const SourceLocation &location) {
1398 return self.subLocationItem(path, location);
1400 return mapItem.subListItem(list);
1402 [&map](
const DomItem &) {
return fileRegionKeysFromMap(map); },
1403 u"QList<%1>"_s.arg(QString::fromLatin1(
typeid(T).name())));
1409 const Path &pathFromOwner,
const QList<T> &list,
1413 index_type len = list.size();
1417 [list, elWrapper](
const DomItem &self, index_type i)
mutable {
1418 if (i < 0 || i >= list.size())
1420 return elWrapper(self,
PathEls::Index(i), list[list.size() - i - 1]);
1422 [len](
const DomItem &) {
return len; },
nullptr, QLatin1String(
typeid(T).name()));
1426 [list, elWrapper](
const DomItem &self, index_type i)
mutable {
1427 if (i < 0 || i >= list.size())
1429 return elWrapper(self,
PathEls::Index(i), list[i]);
1431 [len](
const DomItem &) {
return len; },
nullptr, QLatin1String(
typeid(T).name()));
1437 const Path &pathFromOwner,
const QList<T> &list,
1444 [&list, elWrapper](
const DomItem &self, index_type i) {
1445 if (i < 0 || i >= list.size())
1447 return elWrapper(self,
PathEls::Index(i), list[list.size() - i - 1]);
1449 [&list](
const DomItem &) {
return list.size(); },
nullptr,
1450 QLatin1String(
typeid(T).name()));
1454 [&list, elWrapper](
const DomItem &self, index_type i) {
1455 if (i < 0 || i >= list.size())
1457 return elWrapper(self,
PathEls::Index(i), list[i]);
1459 [&list](
const DomItem &) {
return list.size(); },
nullptr,
1460 QLatin1String(
typeid(T).name()));
1471 OwningItem(
int derivedFrom,
const QDateTime &lastDataUpdateAt);
1490 virtual bool frozen()
const;
1500 function_ref<
bool(
const DomItem &source,
const ErrorMessage &msg)> visitor,
1503 QMutexLocker l(mutex());
1511 mutable QBasicMutex m_mutex;
1514 QDateTime m_createdAt;
1515 QDateTime m_lastDataUpdateAt;
1516 QDateTime m_frozenAt;
1517 QMultiMap<Path, ErrorMessage> m_errors;
1518 QMap<ErrorMessage, quint32> m_errorsCounts;
1524 if constexpr (domTypeIsOwningItem(T::kindValue)) {
1525 if (!std::holds_alternative<std::monostate>(m_owner)) {
1527 if (std::holds_alternative<std::shared_ptr<FileLocations::Node>>(m_owner))
1528 return std::static_pointer_cast<T>(
1529 std::get<std::shared_ptr<FileLocations::Node>>(m_owner));
1531 if (std::holds_alternative<std::shared_ptr<ExternalItemInfoBase>>(m_owner))
1532 return std::static_pointer_cast<T>(
1533 std::get<std::shared_ptr<ExternalItemInfoBase>>(m_owner));
1535 if (std::holds_alternative<std::shared_ptr<ExternalItemPairBase>>(m_owner))
1536 return std::static_pointer_cast<T>(
1537 std::get<std::shared_ptr<ExternalItemPairBase>>(m_owner));
1539 if (std::holds_alternative<std::shared_ptr<T>>(m_owner)) {
1540 return std::get<std::shared_ptr<T>>(m_owner);
1545 Q_ASSERT_X(
false,
"DomItem::ownerAs",
"unexpected non owning value in ownerAs");
1547 return std::shared_ptr<T> {};
1553 static_assert(I > 0,
"");
1562 ->
decltype(t.writeOut(self, lw))
1564 t.writeOut(self, lw);
1570 qCWarning(writeOutLog) <<
"Ignoring writeout to wrapped object not supporting it ("
1571 <<
typeid(T).name();
1576 writeOutWrap(t, self, lw, rank<1>());
1582 writeOutWrap<T>(*
asT(), self, lw);
1598 return bool(m_owner);
1607 if (m_pathFromOwner)
1608 return MutableDomItem(m_owner, m_pathFromOwner.split().pathToSource);
1610 DomItem cObj = m_owner.containingObject();
1617 if (m_pathFromOwner)
1618 return MutableDomItem(m_owner, m_pathFromOwner.dropTail());
1676 dump(
const Sink &s,
int indent = 0,
1677 function_ref<
bool(
const DomItem &,
const PathEls::PathComponent &,
const DomItem &)> filter =
noFilter)
1679 item().dump(s, indent, filter);
1683 function_ref<
bool(
const DomItem &,
const PathEls::PathComponent &,
const DomItem &)> filter =
noFilter,
1684 int nBackups = 2,
int indent = 0,
FileWriter *fw =
nullptr)
1686 return item().dump(path, filter, nBackups, indent, fw);
1752 template<
typename T>
1758 template <
typename T>
1760 Q_ASSERT(!m_owner || !m_owner.owningItemPtr()->frozen());
1763 if (self.m_kind != T::kindValue)
1766 const T *t =
nullptr;
1767 if constexpr (domTypeIsObjWrap(T::kindValue) || domTypeIsValueWrap(T::kindValue))
1769 else if constexpr (
std::is_base_of<
DomBase, T>::value)
1770 t =
static_cast<
const T *>(self.base());
1772 Q_UNREACHABLE_RETURN(
nullptr);
1775 return const_cast<T *>(t);
1778 template<
typename T>
1781 return m_owner.ownerAs<T>();
1788 return o1.m_owner == o2.m_owner && o1.m_pathFromOwner == o2.m_pathFromOwner;
1797 Path m_pathFromOwner;
1802template<
typename K,
typename T>
1805 T **valuePtr =
nullptr)
1808 auto it = mmap.find(key);
1809 if (it != mmap.end()) {
1812 if (++it != mmap.end() && it.key() == key) {
1813 qWarning() <<
" requested overwrite of " << key
1814 <<
" that contains aleready multiple entries in" << mapPathFromOwner;
1816 Path newPath = mapPathFromOwner.withKey(key).withIndex(0);
1817 v.updatePathFromOwner(newPath);
1823 mmap.insert(key, value);
1824 auto it = mmap.find(key);
1827 while (it2 != mmap.end() && it2.key() == key) {
1831 Path newPath = mapPathFromOwner.withKey(key).withIndex(nVal-1);
1833 v.updatePathFromOwner(newPath);
1843 int idx = list.size();
1845 Path newPath = listPathFromOwner.withIndex(idx);
1846 T &targetV = list[idx];
1847 targetV.updatePathFromOwner(newPath);
1853template <
typename T,
typename K =
QString>
1856 auto it = mmap.begin();
1857 auto end = mmap.end();
1862 if (i > 0 && name != it.key()) {
1863 Path pName = newPath.withKey(QString(name));
1865 el->updatePathFromOwner(pName.withIndex(--i));
1877 Path pName = newPath.withKey(name);
1879 el->updatePathFromOwner(pName.withIndex(--i));
1882template <
typename T>
1885 auto it = list.begin();
1886 auto end = list.end();
1889 (it++)->updatePathFromOwner(newPath.withIndex(i++));
2001 ConstantData::
Options options)
const
2003 using BaseT = std::remove_cv_t<std::remove_reference_t<T>>;
2007 BaseT> || std::is_base_of_v<QCborArray, BaseT> || std::is_base_of_v<QCborMap, BaseT>) {
2008 return DomItem(m_top, m_owner, m_ownerPath,
2009 ConstantData(pathFromOwner().withComponent(c), value, options));
2010 }
else if constexpr (std::is_same_v<DomItem, BaseT>) {
2013 }
else if constexpr (IsList<T>::value && !std::is_convertible_v<BaseT, QStringView>) {
2014 return subListItem(List::fromQList<
typename BaseT::value_type>(
2015 pathFromOwner().withComponent(c), value,
2016 [options](
const DomItem &list,
const PathEls::PathComponent &p,
2017 const typename T::value_type &v) {
return list.subValueItem(p, v, options); }));
2018 }
else if constexpr (IsSharedPointerToDomObject<BaseT>::value) {
2020 return subOwnerItem(c, value);
2022 return subDataItem(c, value, options);
2028 ConstantData::
Options options)
const
2030 using BaseT = std::remove_cv_t<std::remove_reference_t<T>>;
2031 if constexpr (std::is_same_v<BaseT, ConstantData>) {
2032 return this->copy(value);
2033 }
else if constexpr (std::is_base_of_v<QCborValue, BaseT>) {
2034 return DomItem(m_top, m_owner, m_ownerPath,
2035 ConstantData(pathFromOwner().withComponent(c), value, options));
2038 m_top, m_owner, m_ownerPath,
2039 ConstantData(pathFromOwner().withComponent(c), QCborValue(value), options));
2045 ConstantData::
Options options)
const
2047 auto lazyWrap = [
this, &c, &value, options]() {
2048 return this->subValueItem<T>(c, value, options);
2050 return visitor(c, lazyWrap);
2055 ConstantData::
Options options)
const
2057 auto lazyWrap = [
this, &c, &valueF, options]() {
2058 return this->subValueItem<
decltype(valueF())>(c, valueF(), options);
2060 return visitor(c, lazyWrap);
2066 using BaseT = std::decay_t<T>;
2067 if constexpr (std::is_same_v<QString, BaseT> || std::is_arithmetic_v<BaseT>) {
2068 return this->subDataItem(c, QCborValue(obj));
2069 }
else if constexpr (std::is_same_v<SourceLocation, BaseT>) {
2070 return this->subLocationItem(c, obj);
2071 }
else if constexpr (std::is_same_v<BaseT, Reference>) {
2072 Q_ASSERT_X(
false,
"DomItem::wrap",
2073 "wrapping a reference object, probably an error (wrap the target path instead)");
2074 return this->copy(obj);
2075 }
else if constexpr (std::is_same_v<BaseT, ConstantData>) {
2076 return this->subDataItem(c, obj);
2077 }
else if constexpr (std::is_same_v<BaseT, Map>) {
2079 }
else if constexpr (std::is_same_v<BaseT, List>) {
2081 }
else if constexpr (std::is_base_of_v<ListPBase, BaseT>) {
2083 }
else if constexpr (std::is_same_v<BaseT, SimpleObjectWrap>) {
2085 }
else if constexpr (IsDomObject<BaseT>::value) {
2086 if constexpr (domTypeIsObjWrap(BaseT::kindValue) || domTypeIsValueWrap(BaseT::kindValue)) {
2089 }
else if constexpr (domTypeIsDomElement(BaseT::kindValue)) {
2090 return this->copy(&obj);
2092 qCWarning(domLog) <<
"Unhandled object of type " << domTypeToString(BaseT::kindValue)
2093 <<
" in DomItem::wrap, not using a shared_ptr for an "
2094 <<
"OwningItem, or unexpected wrapped object?";
2097 }
else if constexpr (IsSharedPointerToDomObject<BaseT>::value) {
2098 if constexpr (domTypeIsOwningItem(BaseT::element_type::kindValue)) {
2099 return this->subOwnerItem(c, obj);
2101 Q_ASSERT_X(
false,
"DomItem::wrap",
"shared_ptr with non owning item");
2104 }
else if constexpr (IsMultiMap<BaseT>::value) {
2105 if constexpr (std::is_same_v<
typename BaseT::key_type, QString>) {
2106 return subMapItem(Map::fromMultiMapRef<
typename BaseT::mapped_type>(
2107 pathFromOwner().withComponent(c), obj));
2109 Q_ASSERT_X(
false,
"DomItem::wrap",
"non string keys not supported (try .toString()?)");
2111 }
else if constexpr (IsMap<BaseT>::value) {
2112 if constexpr (std::is_same_v<
typename BaseT::key_type, QString>) {
2113 return subMapItem(Map::fromMapRef<
typename BaseT::mapped_type>(
2114 pathFromOwner().withComponent(c), obj,
2115 [](
const DomItem &map,
const PathEls::PathComponent &p,
2116 const typename BaseT::mapped_type &el) {
return map.wrap(p, el); }));
2118 Q_ASSERT_X(
false,
"DomItem::wrap",
"non string keys not supported (try .toString()?)");
2120 }
else if constexpr (IsList<BaseT>::value) {
2121 if constexpr (IsDomObject<
typename BaseT::value_type>::value) {
2122 return subListItem(List::fromQListRef<
typename BaseT::value_type>(
2123 pathFromOwner().withComponent(c), obj,
2124 [](
const DomItem &list,
const PathEls::PathComponent &p,
2125 const typename BaseT::value_type &el) {
return list.wrap(p, el); }));
2127 Q_ASSERT_X(
false,
"DomItem::wrap",
"Unsupported list type T");
2131 qCWarning(domLog) <<
"Cannot wrap " <<
typeid(BaseT).name();
2132 Q_ASSERT_X(
false,
"DomItem::wrap",
"Do not know how to wrap type T");
2140 auto lazyWrap = [
this, &c, &obj]() {
return this->wrap<T>(c, obj); };
2141 return visitor(c, lazyWrap);
2147 index_type len = index_type(m_pList.size());
2148 for (index_type i = 0; i < len; ++i) {
2149 if (!v(
PathEls::Index(i), [
this, &self, i] {
return this->index(self, i); }))
2158 if (index >= 0 && index < m_pList.size())
2159 return self.wrap(PathEls::Index(index), *
static_cast<
const T *>(m_pList.value(index)));
2166 return kind2domKind(kind());
2178 return base
.path(source.pathToSource
);
2183 return quintptr(
this);
2188 return domTypeToString(kind());
2196 res.append(c.name());
2205 self.iterateDirectSubpaths(
2221 index_type i = c.index() + 1;
2233 self.iterateDirectSubpaths(
2249 res.insert(c.name());
2258 self.iterateDirectSubpaths(
2271 return DomItem(m_top, m_owner, m_ownerPath, list);
2276 return DomItem(m_top, m_owner, m_ownerPath, map);
void setSemanticScope(const QQmlJSScope::ConstPtr &scope)
QQmlJSScope::ConstPtr m_semanticScope
void updatePathFromOwner(const Path &newPath)
QQmlJSScope::ConstPtr semanticScope() const
QList< QmlObject > annotations
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)
bool isSignalHandler() const
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
QmlObject * objectValue()
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)
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->()
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
A value type that references any element of the Dom.
bool dvReferences(DirectVisitor visitor, const PathEls::PathComponent &c, const QList< Path > &paths) const
QDateTime createdAt() 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
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
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
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
bool iterateDirectSubpaths(DirectVisitor v) const
DomItem container() const
void clearErrors(const ErrorGroups &groups=ErrorGroups({}), bool iterate=true) 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.
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
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 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
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
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
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
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
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)
void setIsFlag(bool flag)
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
Represents a set of tags grouping a set of related error messages.
Represents an error message connected to the dom.
static Export fromString(const Path &source, QStringView exp, const Path &typePath, const ErrorHandler &h)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
static FieldFilter noFilter()
Represents a Node of FileLocations tree.
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
GlobalComponent(const Path &pathFromOwner=Path())
DomType kind() const override
static constexpr DomType kindValue
Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &ann, QmlObject **aPtr=nullptr)
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
Path importedPath() 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)
JsResource(const Path &pathFromOwner=Path())
DomType kind() const override
bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
static constexpr DomType kindValue
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
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
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
QList< QmlObject > annotations
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 environment()
MutableDomItem annotations()
MutableDomItem addChild(QmlObject child)
Path canonicalPath() 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)
MutableDomItem globalScope()
bool writeOut(const QString &path, int nBackups=2, const LineWriterOptions &opt=LineWriterOptions(), FileWriter *fw=nullptr)
QString internalKindStr()
friend bool operator==(const MutableDomItem &o1, const MutableDomItem &o2)
MutableDomItem bindings()
MutableDomItem addPropertyDef(const PropertyDefinition &propertyDef, AddOption option=AddOption::Overwrite)
bool commitToBase(const std::shared_ptr< DomEnvironment > &validEnvPtr=nullptr)
QString canonicalFilePath() const
MutableDomItem propertyDefs()
MutableDomItem fileObject(GoTo option=GoTo::Strict)
MutableDomItem operator[](const char16_t *component)
MutableDomItem key(QStringView name)
MutableDomItem operator[](const QString &component)
ErrorHandler errorHandler()
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()
MutableDomItem container()
MutableDomItem refreshed()
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)
QDateTime lastDataUpdateAt()
MutableDomItem children()
MutableDomItem(const DomItem &item)
std::shared_ptr< OwningItem > owningItemPtr()
MutableDomItem universe()
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)
static int nextRevision()
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)
Source split() const
Splits the path at the last field, root or current Component.
static Path fromRoot(PathRoot r)
Path withComponent(const PathEls::PathComponent &c)
Path operator[](int i) const
Path mid(int offset, int length) const
static Path fromCurrent(PathCurrent c)
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
bool isParametricType() 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
QList< DomItem > propertyDefs
QList< DomItem > bindings
QQmlDomAstCreatorBase(const MutableDomItem &qmlFile)
void endVisit(AST::UiProgram *) override
bool stackHasScriptList() const
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)
bool stackHasScriptVariant() const
void enableScriptExpressions(bool enable=true)
QQmlJSImportVisitor & scopeCreator()
virtual QQmlJSASTClassListToVisit void throwRecursionDepthError() override
QQmlDomAstCreatorWithQQmlJSScope(const QQmlJSScope::Ptr ¤t, MutableDomItem &qmlFile, QQmlJSLogger *logger, QQmlJSImporter *importer)
void enableScriptExpressions(bool enable=true)
void enableLoadFileLazily(bool enable=true)
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 nextComponentPath() 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
Path nextScopePath() 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
QUrl directoryUrl() 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 setHasCustomParser(bool v)
void setInterfaceNames(const QStringList &interfaces)
void setMetaRevisions(const QList< int > &metaRevisions)
QQmlJSScope::AccessSemantics accessSemantics() const
void setFileName(const QString &fileName)
QString elementTypeName() const
bool extensionIsJavaScript() const
static constexpr DomType kindValue
bool hasCustomParser() const
QQmlJSScope::ConstPtr semanticScope() const
void setAccessSemantics(QQmlJSScope::AccessSemantics v)
void setSemanticScope(const QQmlJSScope::ConstPtr &scope)
QString extensionTypeName() const
bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
bool extensionIsNamespace() const
void setExtensionTypeName(const QString &name)
void setExtensionIsJavaScript(bool v)
void setElementTypeName(const QString &name)
void setExtensionIsNamespace(bool v)
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
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
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 replaceKindForGenericChildren(DomType oldType, DomType newType)
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())
QString astRelocatableDump() const
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
SimpleWrapOptions m_options
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
SimpleObjectWrapBase()=delete
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)
SimpleObjectWrap()=delete
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
Provides entities to maintain mappings between elements and their location in a file.
Tree ensure(const Tree &base, const Path &basePath)
std::shared_ptr< Node > Tree
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)
constexpr bool domTypeIsOwningItem(DomType)
Path appendUpdatableElementInQList(const Path &listPathFromOwner, QList< T > &list, const T &value, T **vPtr=nullptr)
constexpr bool domTypeIsValueWrap(DomType k)
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
Path insertUpdatableElementInMultiMap(const Path &mapPathFromOwner, QMultiMap< K, T > &mmap, K key, const T &value, AddOption option=AddOption::KeepExisting, T **valuePtr=nullptr)
std::variant< std::monostate, std::shared_ptr< DomEnvironment >, std::shared_ptr< DomUniverse > > TopT
bool noFilter(const DomItem &, const PathEls::PathComponent &, const DomItem &)
QMLDOM_EXPORT QMap< DomKind, QString > domKindToStringMap()
QMLDOM_EXPORT QDebug operator<<(QDebug debug, const DomItem &c)
std::shared_ptr< ExternalOwningItem > getFileItemOwner(const DomItem &fileItem)
DomKind kind2domKind(DomType k)
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)
QMLDOM_EXPORT QDebug operator<<(QDebug debug, const MutableDomItem &c)
std::disjunction< std::is_same< U, V >... > IsInList
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)
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)
auto writeOutWrap(const T &t, const DomItem &self, OutWriter &lw) -> void
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 visitWithCustomListIteration(T *t, AST::Visitor *visitor)
std::function< void(const ErrorMessage &)> ErrorHandler
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)
constexpr bool domTypeIsObjWrap(DomType k)
@ ScriptVariableDeclarationEntry
@ ScriptContinueStatement
@ ScriptLabelledStatement
@ ScriptTemplateExpressionPart
@ ScriptParenthesizedExpression
@ ScriptNewMemberExpression
@ ScriptConditionalExpression
@ ScriptIdentifierExpression
@ ScriptTryCatchStatement
@ ScriptFunctionExpression
@ ScriptVariableDeclaration
@ ScriptTemplateStringPart
bool emptyChildrenVisitor(Path, const DomItem &, bool)
static ErrorGroups importErrors
Q_STATIC_LOGGING_CATEGORY(lcAccessibilityCore, "qt.accessibility.core")
#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)
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)
SubclassStorage(const T *el)