diff options
31 files changed, 1186 insertions, 1213 deletions
diff --git a/src/qmldom/qqmldomattachedinfo.cpp b/src/qmldom/qqmldomattachedinfo.cpp index 06927f4eb4..3b939597aa 100644 --- a/src/qmldom/qqmldomattachedinfo.cpp +++ b/src/qmldom/qqmldomattachedinfo.cpp @@ -26,7 +26,7 @@ Attributes: \sa QQmlJs::Dom::AttachedInfo */ -bool FileLocations::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool FileLocations::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; #ifdef QmlDomAddCodeStr @@ -46,7 +46,7 @@ bool FileLocations::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) cont = cont && self.dvItemField(visitor, Fields::regions, [this, &self, &loc2str]() { return self.subMapItem(Map::fromMapRef<SourceLocation>( self.pathFromOwner().field(Fields::regions), regions, - [&loc2str](DomItem &map, const PathEls::PathComponent &key, SourceLocation &el) { + [&loc2str](const DomItem &map, const PathEls::PathComponent &key, const SourceLocation &el) { return map.subLocationItem(key, el, loc2str(el)); })); }); @@ -55,12 +55,12 @@ bool FileLocations::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return self.subMapItem(Map::fromMapRef<QList<SourceLocation>>( self.pathFromOwner().field(Fields::preCommentLocations), preCommentLocations, - [&loc2str](DomItem &map, const PathEls::PathComponent &key, - QList<SourceLocation> &el) { + [&loc2str](const DomItem &map, const PathEls::PathComponent &key, + const QList<SourceLocation> &el) { return map.subListItem(List::fromQListRef<SourceLocation>( map.pathFromOwner().appendComponent(key), el, - [&loc2str](DomItem &list, const PathEls::PathComponent &idx, - SourceLocation &el) { + [&loc2str](const DomItem &list, const PathEls::PathComponent &idx, + const SourceLocation &el) { return list.subLocationItem(idx, el, loc2str(el)); })); })); @@ -70,12 +70,12 @@ bool FileLocations::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return self.subMapItem(Map::fromMapRef<QList<SourceLocation>>( self.pathFromOwner().field(Fields::postCommentLocations), postCommentLocations, - [&loc2str](DomItem &map, const PathEls::PathComponent &key, - QList<SourceLocation> &el) { + [&loc2str](const DomItem &map, const PathEls::PathComponent &key, + const QList<SourceLocation> &el) { return map.subListItem(List::fromQListRef<SourceLocation>( map.pathFromOwner().appendComponent(key), el, - [&loc2str](DomItem &list, const PathEls::PathComponent &idx, - SourceLocation &el) { + [&loc2str](const DomItem &list, const PathEls::PathComponent &idx, + const SourceLocation &el) { return list.subLocationItem(idx, el, loc2str(el)); })); })); @@ -100,7 +100,7 @@ FileLocations::Tree FileLocations::ensure(FileLocations::Tree base, Path basePat } AttachedInfoLookupResult<FileLocations::Tree> -FileLocations::findAttachedInfo(DomItem &item, AttachedInfo::FindOptions options) +FileLocations::findAttachedInfo(const DomItem &item, AttachedInfo::FindOptions options) { return AttachedInfoT<FileLocations>::findAttachedInfo(item, Fields::fileLocationsTree, options); } @@ -109,7 +109,7 @@ FileLocations::findAttachedInfo(DomItem &item, AttachedInfo::FindOptions options \internal Returns the tree corresponding to a DomItem. */ -FileLocations::Tree FileLocations::treeOf(DomItem &item) +FileLocations::Tree FileLocations::treeOf(const DomItem &item) { return AttachedInfoT<FileLocations>::treePtr(item, Fields::fileLocationsTree); } @@ -118,7 +118,7 @@ FileLocations::Tree FileLocations::treeOf(DomItem &item) \internal Returns the filelocation Info corresponding to a DomItem. */ -const FileLocations *FileLocations::fileLocationsOf(DomItem &item) +const FileLocations *FileLocations::fileLocationsOf(const DomItem &item) { if (FileLocations::Tree t = treeOf(item)) return &(t->info()); @@ -168,7 +168,7 @@ Attributes: \sa QQmlJs::Dom::AttachedInfo */ -bool AttachedInfo::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool AttachedInfo::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; if (Ptr p = parent()) @@ -180,11 +180,11 @@ bool AttachedInfo::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) cont = cont && self.dvItemField(visitor, Fields::subItems, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::subItems), - [this](DomItem &map, QString key) { + [this](const DomItem &map, QString key) { Path p = Path::fromString(key); return map.copy(m_subItems.value(p), map.canonicalPath().key(key)); }, - [this](DomItem &) { + [this](const DomItem &) { QSet<QString> res; for (auto p : m_subItems.keys()) res.insert(p.toString()); @@ -257,7 +257,7 @@ AttachedInfo::Ptr AttachedInfo::find(AttachedInfo::Ptr self, Path p, AttachedInf } AttachedInfoLookupResult<AttachedInfo::Ptr> -AttachedInfo::findAttachedInfo(DomItem &item, QStringView fieldName, +AttachedInfo::findAttachedInfo(const DomItem &item, QStringView fieldName, AttachedInfo::FindOptions options) { Path p; @@ -295,7 +295,7 @@ AttachedInfo::findAttachedInfo(DomItem &item, QStringView fieldName, return res; } -bool UpdatedScriptExpression::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool UpdatedScriptExpression::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvWrapField(visitor, Fields::expr, expr); @@ -315,18 +315,18 @@ UpdatedScriptExpression::Tree UpdatedScriptExpression::ensure(UpdatedScriptExpre } AttachedInfoLookupResult<UpdatedScriptExpression::Tree> -UpdatedScriptExpression::findAttachedInfo(DomItem &item, AttachedInfo::FindOptions options) +UpdatedScriptExpression::findAttachedInfo(const DomItem &item, AttachedInfo::FindOptions options) { return AttachedInfoT<UpdatedScriptExpression>::findAttachedInfo( item, Fields::updatedScriptExpressions, options); } -UpdatedScriptExpression::Tree UpdatedScriptExpression::treePtr(DomItem &item) +UpdatedScriptExpression::Tree UpdatedScriptExpression::treePtr(const DomItem &item) { return AttachedInfoT<UpdatedScriptExpression>::treePtr(item, Fields::updatedScriptExpressions); } -const UpdatedScriptExpression *UpdatedScriptExpression::exprPtr(DomItem &item) +const UpdatedScriptExpression *UpdatedScriptExpression::exprPtr(const DomItem &item) { if (UpdatedScriptExpression::Tree t = treePtr(item)) return &(t->info()); diff --git a/src/qmldom/qqmldomattachedinfo_p.h b/src/qmldom/qqmldomattachedinfo_p.h index 2edf6fb368..a5f813e55b 100644 --- a/src/qmldom/qqmldomattachedinfo_p.h +++ b/src/qmldom/qqmldomattachedinfo_p.h @@ -66,10 +66,10 @@ public: using Ptr = std::shared_ptr<AttachedInfo>; DomType kind() const override { return kindValue; } - Path canonicalPath(DomItem &self) const override { return self.m_ownerPath; } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + Path canonicalPath(const DomItem &self) const override { return self.m_ownerPath; } + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; - AttachedInfo::Ptr makeCopy(DomItem &self) const + AttachedInfo::Ptr makeCopy(const DomItem &self) const { return std::static_pointer_cast<AttachedInfo>(doCopy(self)); } @@ -84,14 +84,14 @@ public: static Ptr ensure(Ptr self, Path path, PathType pType = PathType::Relative); static Ptr find(Ptr self, Path p, PathType pType = PathType::Relative); static AttachedInfoLookupResult<Ptr> - findAttachedInfo(DomItem &item, QStringView treeFieldName, + findAttachedInfo(const DomItem &item, QStringView treeFieldName, FindOptions options = AttachedInfo::FindOption::None); - static Ptr treePtr(DomItem &item, QStringView fieldName) + static Ptr treePtr(const DomItem &item, QStringView fieldName) { return findAttachedInfo(item, fieldName, FindOption::None).foundTree; } - DomItem itemAtPath(DomItem &self, Path p, PathType pType = PathType::Relative) const + DomItem itemAtPath(const DomItem &self, Path p, PathType pType = PathType::Relative) const { if (Ptr resPtr = find(self.ownerAs<AttachedInfo>(), p, pType)) { if (pType == PathType::Canonical) @@ -105,7 +105,7 @@ public: return DomItem(); } - DomItem infoAtPath(DomItem &self, Path p, PathType pType = PathType::Relative) const + DomItem infoAtPath(const DomItem &self, Path p, PathType pType = PathType::Relative) const { return itemAtPath(self, p, pType).field(Fields::infoItem); } @@ -132,11 +132,7 @@ public: } virtual AttachedInfo::Ptr instantiate(AttachedInfo::Ptr parent, Path p = Path()) const = 0; - virtual DomItem infoItem(DomItem &self) = 0; - DomItem infoItem(DomItem &self) const - { - return const_cast<AttachedInfo *>(this)->infoItem(self); - } + virtual DomItem infoItem(const DomItem &self) const = 0; QMap<Path, Ptr> subItems() const { return m_subItems; } @@ -183,13 +179,13 @@ public: return std::static_pointer_cast<AttachedInfoT>(AttachedInfo::find(self, p, pType)); } - static AttachedInfoLookupResult<Ptr> findAttachedInfo(DomItem &item, QStringView fieldName, + static AttachedInfoLookupResult<Ptr> findAttachedInfo(const DomItem &item, QStringView fieldName, AttachedInfo::FindOptions options) { return AttachedInfo::findAttachedInfo(item, fieldName, options) .template as<AttachedInfoT>(); } - static Ptr treePtr(DomItem &item, QStringView fieldName) + static Ptr treePtr(const DomItem &item, QStringView fieldName) { return std::static_pointer_cast<AttachedInfoT>(AttachedInfo::treePtr(item, fieldName)); } @@ -214,9 +210,9 @@ public: AttachedInfo::Ptr instantiate(AttachedInfo::Ptr parent, Path p = Path()) const override { return Ptr(new AttachedInfoT(std::static_pointer_cast<AttachedInfoT>(parent), p)); } - DomItem infoItem(DomItem &self) override { return self.wrapField(Fields::infoItem, m_info); } + DomItem infoItem(const DomItem &self) const override { return self.wrapField(Fields::infoItem, m_info); } - Ptr makeCopy(DomItem &self) const + Ptr makeCopy(const DomItem &self) const { return std::static_pointer_cast<AttachedInfoT>(doCopy(self)); } @@ -226,7 +222,7 @@ public: const Info &info() const { return m_info; } Info &info() { return m_info; } protected: - std::shared_ptr<OwningItem> doCopy(DomItem &) const override + std::shared_ptr<OwningItem> doCopy(const DomItem &) const override { return Ptr(new AttachedInfoT(*this)); } @@ -240,7 +236,7 @@ public: using Tree = std::shared_ptr<AttachedInfoT<FileLocations>>; constexpr static DomType kindValue = DomType::FileLocations; DomType kind() const { return kindValue; } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const; void ensureCommentLocations(QList<QString> keys); static Tree createTree(Path basePath); @@ -254,10 +250,10 @@ public: // returns the path looked up and the found tree when looking for the info attached to item static AttachedInfoLookupResult<Tree> - findAttachedInfo(DomItem &item, + findAttachedInfo(const DomItem &item, AttachedInfo::FindOptions options = AttachedInfo::FindOption::Default); - static FileLocations::Tree treeOf(DomItem &); - static const FileLocations *fileLocationsOf(DomItem &); + static FileLocations::Tree treeOf(const DomItem &); + static const FileLocations *fileLocationsOf(const DomItem &); static void updateFullLocation(Tree fLoc, SourceLocation loc); static void addRegion(Tree fLoc, QString locName, SourceLocation loc); @@ -276,19 +272,19 @@ public: using Tree = std::shared_ptr<AttachedInfoT<UpdatedScriptExpression>>; constexpr static DomType kindValue = DomType::UpdatedScriptExpression; DomType kind() const { return kindValue; } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const; static Tree createTree(Path basePath); static Tree ensure(Tree base, Path basePath, AttachedInfo::PathType pType); // returns the path looked up and the found tree when looking for the info attached to item static AttachedInfoLookupResult<Tree> - findAttachedInfo(DomItem &item, + findAttachedInfo(const DomItem &item, AttachedInfo::FindOptions options = AttachedInfo::FindOption::Default); // convenience: find FileLocations::Tree attached to the given item - static Tree treePtr(DomItem &); + static Tree treePtr(const DomItem &); // convenience: find FileLocations* attached to the given item (if there is one) - static const UpdatedScriptExpression *exprPtr(DomItem &); + static const UpdatedScriptExpression *exprPtr(const DomItem &); static bool visitTree(Tree base, function_ref<bool(Path, Tree)> visitor, Path basePath = Path()); diff --git a/src/qmldom/qqmldomcomments.cpp b/src/qmldom/qqmldomcomments.cpp index 7a7405f4b1..e75a36510b 100644 --- a/src/qmldom/qqmldomcomments.cpp +++ b/src/qmldom/qqmldomcomments.cpp @@ -190,7 +190,7 @@ A comment has methods to write it out again (write) and expose it to the Dom /*! \brief Expose attributes to the Dom */ -bool Comment::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool Comment::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvValueField(visitor, Fields::rawComment, rawComment()); @@ -235,7 +235,7 @@ Every region has a name, and should be written out using the OutWriter.writeRegi startRegion/ EndRegion). Region comments keeps a mapping containing them. */ -bool CommentedElement::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool CommentedElement::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvWrapField(visitor, Fields::preComments, preComments); @@ -432,12 +432,12 @@ const QSet<int> AstRangesVisitor::kindsToSkip() \brief Stores the comments associated with javascript AST::Node pointers */ -bool AstComments::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool AstComments::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = self.dvItemField(visitor, Fields::commentedElements, [this, &self]() { return self.subMapItem(Map( self.pathFromOwner().field(Fields::commentedElements), - [this](DomItem &map, QString key) { + [this](const DomItem &map, QString key) { bool ok; // we expose the comments as map just for debugging purposes, // as key we use the address hex value as key (keys must be strings) @@ -448,7 +448,7 @@ bool AstComments::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return map.wrap(PathEls::Key(key), m_commentedElements[n]); return DomItem(); }, - [this](DomItem &) { + [this](const DomItem &) { QSet<QString> res; for (AST::Node *n : m_commentedElements.keys()) { QString name; @@ -673,7 +673,7 @@ void AstComments::collectComments(std::shared_ptr<Engine> engine, AST::Node *n, else cEl.postComments.append(comment); } else if (commentEl.element.index() == 1) { - DomItem rComments = rootItem.item() + MutableDomItem rComments = rootItem.item() .path(std::get<1>(commentEl.element).path) .field(Fields::comments); if (RegionComments *rCommentsPtr = rComments.mutableAs<RegionComments>()) { @@ -728,7 +728,7 @@ QMultiMap<quint32, const QList<Comment> *> AstComments::allCommentsInNode(AST::N return v.nodeComments; } -bool RegionComments::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool RegionComments::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; if (!regionComments.isEmpty()) diff --git a/src/qmldom/qqmldomcomments_p.h b/src/qmldom/qqmldomcomments_p.h index e4f85fa3e3..e987644343 100644 --- a/src/qmldom/qqmldomcomments_p.h +++ b/src/qmldom/qqmldomcomments_p.h @@ -82,7 +82,7 @@ public: { } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const; int newlinesBefore() const { return m_newlinesBefore; } void setNewlinesBefore(int n) { m_newlinesBefore = n; } QStringView rawComment() const { return m_comment; } @@ -107,7 +107,7 @@ public: constexpr static DomType kindValue = DomType::CommentedElement; DomType kind() const { return kindValue; } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const; void writePre(OutWriter &lw, QList<SourceLocation> *locations = nullptr) const; void writePost(OutWriter &lw, QList<SourceLocation> *locations = nullptr) const; QMultiMap<quint32, const QList<Comment> *> commentGroups(SourceLocation elLocation) const; @@ -131,7 +131,7 @@ public: constexpr static DomType kindValue = DomType::RegionComments; DomType kind() const { return kindValue; } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const; friend bool operator==(const RegionComments &c1, const RegionComments &c2) { @@ -170,7 +170,7 @@ public: class QMLDOM_EXPORT AstComments final : public OwningItem { protected: - std::shared_ptr<OwningItem> doCopy(DomItem &) const override + std::shared_ptr<OwningItem> doCopy(const DomItem &) const override { return std::make_shared<AstComments>(*this); } @@ -178,13 +178,13 @@ protected: public: constexpr static DomType kindValue = DomType::AstComments; DomType kind() const override { return kindValue; } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; - std::shared_ptr<AstComments> makeCopy(DomItem &self) const + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; + std::shared_ptr<AstComments> makeCopy(const DomItem &self) const { return std::static_pointer_cast<AstComments>(doCopy(self)); } - Path canonicalPath(DomItem &self) const override { return self.m_ownerPath; } + Path canonicalPath(const DomItem &self) const override { return self.m_ownerPath; } static void collectComments(MutableDomItem &item); static void collectComments(std::shared_ptr<Engine> engine, AST::Node *n, std::shared_ptr<AstComments> collectComments, diff --git a/src/qmldom/qqmldomcompare.cpp b/src/qmldom/qqmldomcompare.cpp index 1d0e6fdfbc..3793a1a853 100644 --- a/src/qmldom/qqmldomcompare.cpp +++ b/src/qmldom/qqmldomcompare.cpp @@ -8,8 +8,8 @@ QT_BEGIN_NAMESPACE namespace QQmlJS { namespace Dom { -bool domCompare(DomItem &i1, DomItem &i2, function_ref<bool(Path, DomItem &, DomItem &)> change, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)> filter, +bool domCompare(const DomItem &i1, const DomItem &i2, function_ref<bool(Path, const DomItem &, const DomItem &)> change, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter, Path basePath) { DomKind k1 = i1.domKind(); @@ -155,15 +155,15 @@ bool domCompare(DomItem &i1, DomItem &i2, function_ref<bool(Path, DomItem &, Dom } QStringList -domCompareStrList(DomItem &i1, DomItem &i2, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &) const> filter, +domCompareStrList(const DomItem &i1, const DomItem &i2, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &) const> filter, DomCompareStrList stopAtFirstDiff) { QStringList res; bool hasDiff = false; domCompare( i1, i2, - [&res, &hasDiff, stopAtFirstDiff](Path p, DomItem &j1, DomItem &j2) { + [&res, &hasDiff, stopAtFirstDiff](Path p, const DomItem &j1, const DomItem &j2) { hasDiff = true; if (!j1) { res.append(QStringLiteral("- %1\n").arg(p.toString())); diff --git a/src/qmldom/qqmldomcompare_p.h b/src/qmldom/qqmldomcompare_p.h index fcb5246c6f..651486d7a9 100644 --- a/src/qmldom/qqmldomcompare_p.h +++ b/src/qmldom/qqmldomcompare_p.h @@ -26,20 +26,20 @@ namespace QQmlJS { namespace Dom { bool domCompare( - DomItem &i1, DomItem &i2, function_ref<bool(Path, DomItem &, DomItem &)> change, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)> filter = noFilter, + const DomItem &i1, const DomItem &i2, function_ref<bool(Path, const DomItem &, const DomItem &)> change, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter = noFilter, Path p = Path()); enum DomCompareStrList { FirstDiff, AllDiffs }; QMLDOM_EXPORT QStringList domCompareStrList( - DomItem &i1, DomItem &i2, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &) const> filter = noFilter, + const DomItem &i1, const DomItem &i2, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &) const> filter = noFilter, DomCompareStrList stopAtFirstDiff = DomCompareStrList::FirstDiff); inline QStringList domCompareStrList( - MutableDomItem &i1, DomItem &i2, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &) const> filter = noFilter, + MutableDomItem &i1, const DomItem &i2, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &) const> filter = noFilter, DomCompareStrList stopAtFirstDiff = DomCompareStrList::FirstDiff) { DomItem ii1 = i1.item(); @@ -47,8 +47,8 @@ inline QStringList domCompareStrList( } inline QStringList domCompareStrList( - DomItem &i1, MutableDomItem &i2, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &) const> filter = noFilter, + const DomItem &i1, MutableDomItem &i2, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &) const> filter = noFilter, DomCompareStrList stopAtFirstDiff = DomCompareStrList::FirstDiff) { DomItem ii2 = i2.item(); @@ -57,7 +57,7 @@ inline QStringList domCompareStrList( inline QStringList domCompareStrList( MutableDomItem &i1, MutableDomItem &i2, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &) const> filter = noFilter, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &) const> filter = noFilter, DomCompareStrList stopAtFirstDiff = DomCompareStrList::FirstDiff) { DomItem ii1 = i1.item(); diff --git a/src/qmldom/qqmldomelements.cpp b/src/qmldom/qqmldomelements.cpp index fe4fc19f8f..1dd5dba140 100644 --- a/src/qmldom/qqmldomelements.cpp +++ b/src/qmldom/qqmldomelements.cpp @@ -86,7 +86,7 @@ static ErrorGroups domParsingErrors() return res; } -bool CommentableDomElement::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool CommentableDomElement::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvWrapField(visitor, Fields::comments, m_comments); @@ -104,7 +104,7 @@ Component::Component(QString name) : CommentableDomElement(Path()), m_name(name) Component::Component(Path pathFromOwner) : CommentableDomElement(pathFromOwner) { } -bool Component::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool Component::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = CommentableDomElement::iterateDirectSubpaths(self, visitor); cont = cont && self.dvValueField(visitor, Fields::name, name()); @@ -118,7 +118,7 @@ bool Component::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -DomItem Component::field(DomItem &self, QStringView name) +DomItem Component::field(const DomItem &self, QStringView name) const { switch (name.size()) { case 4: @@ -141,7 +141,7 @@ Path Component::addObject(const QmlObject &object, QmlObject **oPtr) oPtr); } -bool QmlComponent::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool QmlComponent::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = Component::iterateDirectSubpaths(self, visitor); cont = cont && self.dvWrapField(visitor, Fields::ids, m_ids); @@ -157,7 +157,7 @@ void QmlComponent::updatePathFromOwner(Path newPath) updatePathFromOwnerMultiMap(m_ids, newPath.field(Fields::annotations)); } -void QmlComponent::writeOut(DomItem &self, OutWriter &lw) const +void QmlComponent::writeOut(const DomItem &self, OutWriter &lw) const { if (name().contains(QLatin1Char('.'))) { // inline component @@ -171,7 +171,7 @@ void QmlComponent::writeOut(DomItem &self, OutWriter &lw) const self.field(Fields::objects).index(0).writeOut(lw); } -QList<QString> QmlComponent::subComponentsNames(DomItem &self) const +QList<QString> QmlComponent::subComponentsNames(const DomItem &self) const { DomItem components = self.owner().field(Fields::components); QSet<QString> cNames = components.keys(); @@ -188,7 +188,7 @@ QList<QString> QmlComponent::subComponentsNames(DomItem &self) const return subNames; } -QList<DomItem> QmlComponent::subComponents(DomItem &self) const +QList<DomItem> QmlComponent::subComponents(const DomItem &self) const { DomItem components = self.owner().field(Fields::components); QList<DomItem> res; @@ -245,7 +245,7 @@ QString Version::stringValue() const return QString::number(majorVersion) + QChar::fromLatin1('.') + QString::number(minorVersion); } -bool Version::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool Version::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvWrapField(visitor, Fields::majorVersion, majorVersion); @@ -298,7 +298,7 @@ Import Import::fromFileString(QString importStr, QString importId, ErrorHandler) return Import(QmlUri::fromDirectoryString(importStr), Version(), importId); } -bool Import::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool Import::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvValueField(visitor, Fields::uri, uri.toString()); @@ -311,7 +311,7 @@ bool Import::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -void Import::writeOut(DomItem &, OutWriter &ow) const +void Import::writeOut(const DomItem &, OutWriter &ow) const { if (implicit) return; @@ -329,7 +329,7 @@ void Import::writeOut(DomItem &, OutWriter &ow) const Id::Id(QString idName, Path referredObject) : name(idName), referredObjectPath(referredObject) { } -bool Id::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool Id::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvValueField(visitor, Fields::name, name); @@ -353,7 +353,7 @@ Path Id::addAnnotation(Path selfPathFromOwner, const QmlObject &annotation, QmlO QmlObject::QmlObject(Path pathFromOwner) : CommentableDomElement(pathFromOwner) { } -bool QmlObject::iterateBaseDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool QmlObject::iterateBaseDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = CommentableDomElement::iterateDirectSubpaths(self, visitor); if (!idStr().isEmpty()) @@ -371,11 +371,11 @@ bool QmlObject::iterateBaseDirectSubpaths(DomItem &self, DirectVisitor visitor) cont = cont && self.dvItemField(visitor, Fields::propertyInfos, [this, &self]() { return self.subMapItem(Map( pathFromOwner().field(Fields::propertyInfos), - [&self](DomItem &map, QString k) { + [&self](const DomItem &map, QString k) { auto pInfo = self.propertyInfoWithName(k); return map.wrap(PathEls::Key(k), pInfo); }, - [&self](DomItem &) { return self.propertyInfoNames(); }, + [&self](const DomItem &) { return self.propertyInfoNames(); }, QLatin1String("PropertyInfo"))); }); return cont; @@ -393,7 +393,7 @@ QList<QString> QmlObject::fields() const return myFields; } -bool QmlObject::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool QmlObject::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = iterateBaseDirectSubpaths(self, visitor); cont = cont && self.dvValueLazyField(visitor, Fields::defaultPropertyName, [this, &self]() { @@ -402,7 +402,7 @@ bool QmlObject::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -DomItem QmlObject::field(DomItem &self, QStringView name) +DomItem QmlObject::field(const DomItem &self, QStringView name) const { switch (name.size()) { case 4: @@ -464,11 +464,11 @@ DomItem QmlObject::field(DomItem &self, QStringView name) if (name == Fields::propertyInfos) return self.subMapItem(Map( pathFromOwner().field(Fields::propertyInfos), - [self](DomItem &map, QString k) mutable { + [self](const DomItem &map, QString k) mutable { auto pInfo = self.propertyInfoWithName(k); return map.wrap(PathEls::Key(k), pInfo); }, - [self](DomItem &) mutable { return self.propertyInfoNames(); }, + [self](const DomItem &) mutable { return self.propertyInfoNames(); }, QLatin1String("PropertyInfo"))); break; case 19: @@ -506,14 +506,14 @@ QString QmlObject::localDefaultPropertyName() const return QString(); } -QString QmlObject::defaultPropertyName(DomItem &self) const +QString QmlObject::defaultPropertyName(const DomItem &self) const { QString dProp = localDefaultPropertyName(); if (!dProp.isEmpty()) return dProp; QString res = QStringLiteral(u"data"); self.visitPrototypeChain( - [&res](DomItem &obj) { + [&res](const DomItem &obj) { if (const QmlObject *objPtr = obj.as<QmlObject>()) { QString dProp = objPtr->localDefaultPropertyName(); if (!dProp.isEmpty()) { @@ -527,10 +527,10 @@ QString QmlObject::defaultPropertyName(DomItem &self) const return res; } -bool QmlObject::iterateSubOwners(DomItem &self, function_ref<bool(DomItem &)> visitor) const +bool QmlObject::iterateSubOwners(const DomItem &self, function_ref<bool(const DomItem &)> visitor) const { - bool cont = self.field(Fields::bindings).visitKeys([visitor](QString, DomItem &bs) { - return bs.visitIndexes([visitor](DomItem &b) { + bool cont = self.field(Fields::bindings).visitKeys([visitor](QString, const DomItem &bs) { + return bs.visitIndexes([visitor](const DomItem &b) { DomItem v = b.field(Fields::value); if (std::shared_ptr<ScriptExpression> vPtr = v.ownerAs<ScriptExpression>()) { if (!visitor(v)) @@ -540,7 +540,7 @@ bool QmlObject::iterateSubOwners(DomItem &self, function_ref<bool(DomItem &)> vi return true; }); }); - cont = cont && self.field(Fields::children).visitIndexes([visitor](DomItem &qmlObj) { + cont = cont && self.field(Fields::children).visitIndexes([visitor](const DomItem &qmlObj) { if (const QmlObject *qmlObjPtr = qmlObj.as<QmlObject>()) { return qmlObjPtr->iterateSubOwners(qmlObj, visitor); } @@ -576,14 +576,14 @@ static QStringList dotExpressionToList(std::shared_ptr<ScriptExpression> expr) return res; } -LocallyResolvedAlias QmlObject::resolveAlias(DomItem &self, +LocallyResolvedAlias QmlObject::resolveAlias(const DomItem &self, std::shared_ptr<ScriptExpression> accessSequence) const { QStringList accessSequenceList = dotExpressionToList(accessSequence); return resolveAlias(self, accessSequenceList); } -LocallyResolvedAlias QmlObject::resolveAlias(DomItem &self, const QStringList &accessSequence) const +LocallyResolvedAlias QmlObject::resolveAlias(const DomItem &self, const QStringList &accessSequence) const { LocallyResolvedAlias res; QSet<QString> visitedAlias; @@ -699,7 +699,7 @@ MutableDomItem QmlObject::addMethod(MutableDomItem &self, MethodInfo functionDef return self.owner().path(p); } -void QmlObject::writeOut(DomItem &self, OutWriter &ow, QString onTarget) const +void QmlObject::writeOut(const DomItem &self, OutWriter &ow, QString onTarget) const { const quint32 posOfNewElements = std::numeric_limits<quint32>::max(); bool isRootObject = pathFromOwner().length() == 5 @@ -748,7 +748,7 @@ void QmlObject::writeOut(DomItem &self, OutWriter &ow, QString onTarget) const FileLocations::Tree componentLoc; if (isRootObject && objLoc.foundTree) componentLoc = objLoc.foundTree->parent()->parent(); - auto addMMap = [&attribs, &startLoc](DomItem &base, FileLocations::Tree baseLoc) { + auto addMMap = [&attribs, &startLoc](const DomItem &base, FileLocations::Tree baseLoc) { if (!base) return; for (auto els : base.values()) { @@ -765,7 +765,7 @@ void QmlObject::writeOut(DomItem &self, OutWriter &ow, QString onTarget) const DomItem base = this->field(self, fieldName); addMMap(base, FileLocations::find(objLoc.foundTree, base.pathFromOwner().last())); }; - auto addSingleLevel = [&attribs, &startLoc](DomItem &base, FileLocations::Tree baseLoc) { + auto addSingleLevel = [&attribs, &startLoc](const DomItem &base, FileLocations::Tree baseLoc) { if (!base) return; for (auto el : base.values()) { @@ -785,7 +785,7 @@ void QmlObject::writeOut(DomItem &self, OutWriter &ow, QString onTarget) const FileLocations::find(objLoc.foundTree, children.pathFromOwner().last())); if (isRootObject) { DomItem subCs = component.field(Fields::subComponents); - for (DomItem &c : subCs.values()) { + for (const DomItem &c : subCs.values()) { AttachedInfoLookupResult<FileLocations::Tree> subLoc = FileLocations::findAttachedInfo(c); Q_ASSERT(subLoc.foundTree); @@ -877,7 +877,7 @@ void QmlObject::writeOut(DomItem &self, OutWriter &ow, QString onTarget) const DomItem b; bool uniqueDeclarationWithThisName = pDefs.size() == 1; if (uniqueDeclarationWithThisName && !pDefPtr->isRequired) - bindings.key(pDef.name()).visitIndexes([&b, pDefPtr](DomItem &el) { + bindings.key(pDef.name()).visitIndexes([&b, pDefPtr](const DomItem &el) { const Binding *elPtr = el.as<Binding>(); if (elPtr && elPtr->bindingType() == BindingType::Normal) { switch (elPtr->valueKind()) { @@ -1072,7 +1072,7 @@ Binding &Binding::operator=(const Binding &o) return *this; } -bool Binding::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool Binding::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvValueField(visitor, Fields::name, m_name); @@ -1095,7 +1095,7 @@ bool Binding::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -DomItem Binding::valueItem(DomItem &self) const +DomItem Binding::valueItem(const DomItem &self) const { if (!m_value) return DomItem(); @@ -1165,7 +1165,7 @@ void Binding::updatePathFromOwner(Path newPath) updatePathFromOwnerQList(m_annotations, newPath.field(Fields::annotations)); } -void Binding::writeOut(DomItem &self, OutWriter &lw) const +void Binding::writeOut(const DomItem &self, OutWriter &lw) const { lw.ensureNewline(); if (m_bindingType == BindingType::Normal) { @@ -1185,7 +1185,7 @@ void Binding::writeOut(DomItem &self, OutWriter &lw) const } } -void Binding::writeOutValue(DomItem &self, OutWriter &lw) const +void Binding::writeOutValue(const DomItem &self, OutWriter &lw) const { DomItem v = valueItem(self); switch (valueKind()) { @@ -1207,7 +1207,7 @@ void Binding::writeOutValue(DomItem &self, OutWriter &lw) const } } -bool QmltypesComponent::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool QmltypesComponent::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = Component::iterateDirectSubpaths(self, visitor); cont = cont && self.dvWrapField(visitor, Fields::exports, m_exports); @@ -1246,7 +1246,7 @@ Export Export::fromString(Path source, QStringView exp, Path typePath, ErrorHand return res; } -bool AttributeInfo::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool AttributeInfo::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvValueField(visitor, Fields::name, name); @@ -1272,7 +1272,7 @@ void AttributeInfo::updatePathFromOwner(Path newPath) updatePathFromOwnerQList(annotations, newPath.field(Fields::annotations)); } -bool EnumDecl::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool EnumDecl::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = CommentableDomElement::iterateDirectSubpaths(self, visitor); cont = cont && self.dvValueField(visitor, Fields::name, name()); @@ -1298,7 +1298,7 @@ Path EnumDecl::addAnnotation(const QmlObject &annotation, QmlObject **aPtr) annotation, aPtr); } -void EnumDecl::writeOut(DomItem &self, OutWriter &ow) const +void EnumDecl::writeOut(const DomItem &self, OutWriter &ow) const { ow.writeRegion(u"enum", u"enum") .space() @@ -1314,7 +1314,7 @@ void EnumDecl::writeOut(DomItem &self, OutWriter &ow) const ow.ensureNewline().writeRegion(u"rbrace", u"}"); } -QList<Path> ImportScope::allSources(DomItem &self) const +QList<Path> ImportScope::allSources(const DomItem &self) const { DomItem top = self.top(); DomItem env = top.environment(); @@ -1366,14 +1366,14 @@ QList<Path> ImportScope::allSources(DomItem &self) const return res; } -bool ImportScope::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool ImportScope::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvReferencesField(visitor, Fields::importSources, m_importSourcePaths); cont = cont && self.dvItemField(visitor, Fields::allSources, [this, &self]() -> DomItem { return self.subListItem(List::fromQList<Path>( self.pathFromOwner().field(Fields::allSources), allSources(self), - [](DomItem &list, const PathEls::PathComponent &p, const Path &el) { + [](const DomItem &list, const PathEls::PathComponent &p, const Path &el) { return list.subDataItem(p, el.toString()); })); }); @@ -1381,20 +1381,20 @@ bool ImportScope::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) cont = cont && self.dvItemField(visitor, Fields::imported, [this, &self]() -> DomItem { return self.subMapItem(Map( self.pathFromOwner().field(Fields::imported), - [this, &self](DomItem &map, QString key) { + [this, &self](const DomItem &map, QString key) { return map.subListItem(List::fromQList<DomItem>( map.pathFromOwner().key(key), importedItemsWithName(self, key), - [](DomItem &, const PathEls::PathComponent &, DomItem &el) { + [](const DomItem &, const PathEls::PathComponent &, const DomItem &el) { return el; })); }, - [this, &self](DomItem &) { return this->importedNames(self); }, + [this, &self](const DomItem &) { return this->importedNames(self); }, QLatin1String("List<Export>"))); }); return cont; } -bool PropertyInfo::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool PropertyInfo::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvValueField(visitor, Fields::propertyDefs, propertyDefs); @@ -1460,7 +1460,7 @@ BindingValue &BindingValue::operator=(const BindingValue &o) return *this; } -DomItem BindingValue::value(DomItem &binding) +DomItem BindingValue::value(const DomItem &binding) const { switch (kind) { case BindingValueKind::Empty: @@ -1472,7 +1472,7 @@ DomItem BindingValue::value(DomItem &binding) case BindingValueKind::Array: return binding.subListItem(List::fromQListRef<QmlObject>( binding.pathFromOwner().field(u"value"), array, - [binding](DomItem &self, const PathEls::PathComponent &, QmlObject &obj) { + [binding](const DomItem &self, const PathEls::PathComponent &, const QmlObject &obj) { return self.copy(&obj); })); } @@ -1549,7 +1549,7 @@ ScriptExpression::ScriptExpression(const ScriptExpression &e) : OwningItem(e) m_astComments = e.m_astComments; } -std::shared_ptr<ScriptExpression> ScriptExpression::copyWithUpdatedCode(DomItem &self, +std::shared_ptr<ScriptExpression> ScriptExpression::copyWithUpdatedCode(const DomItem &self, QString code) const { std::shared_ptr<ScriptExpression> copy = makeCopy(self); @@ -1560,7 +1560,7 @@ std::shared_ptr<ScriptExpression> ScriptExpression::copyWithUpdatedCode(DomItem return copy; } -bool ScriptExpression::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool ScriptExpression::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = OwningItem::iterateDirectSubpaths(self, visitor); cont = cont && self.dvValueField(visitor, Fields::code, code()); @@ -1695,7 +1695,7 @@ QString ScriptExpression::astRelocatableDump() const }); } -void ScriptExpression::writeOut(DomItem &self, OutWriter &lw) const +void ScriptExpression::writeOut(const DomItem &self, OutWriter &lw) const { OutWriter *ow = &lw; @@ -1721,7 +1721,7 @@ void ScriptExpression::writeOut(DomItem &self, OutWriter &lw) const lw.lineWriter.endSourceLocation(*codeLoc); } -SourceLocation ScriptExpression::globalLocation(DomItem &self) const +SourceLocation ScriptExpression::globalLocation(const DomItem &self) const { if (const FileLocations *fLocPtr = FileLocations::fileLocationsOf(self)) { return fLocPtr->regions.value(QString(), fLocPtr->fullRegion); @@ -1734,7 +1734,7 @@ bool PropertyDefinition::isParametricType() const return typeName.contains(QChar(u'<')); } -void PropertyDefinition::writeOut(DomItem &, OutWriter &lw) const +void PropertyDefinition::writeOut(const DomItem &, OutWriter &lw) const { lw.ensureNewline(); if (isDefaultMember) @@ -1750,7 +1750,7 @@ void PropertyDefinition::writeOut(DomItem &, OutWriter &lw) const lw.writeRegion(u"name", name); } -bool MethodInfo::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool MethodInfo::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = AttributeInfo::iterateDirectSubpaths(self, visitor); cont = cont && self.dvWrapField(visitor, Fields::parameters, parameters); @@ -1773,7 +1773,7 @@ bool MethodInfo::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -QString MethodInfo::preCode(DomItem &self) const +QString MethodInfo::preCode(const DomItem &self) const { QString res; LineWriter lw([&res](QStringView s) { res.append(s); }, QLatin1String("*preCode*")); @@ -1800,12 +1800,12 @@ QString MethodInfo::preCode(DomItem &self) const return res; } -QString MethodInfo::postCode(DomItem &) const +QString MethodInfo::postCode(const DomItem &) const { return QLatin1String("\n}\n"); } -void MethodInfo::writeOut(DomItem &self, OutWriter &ow) const +void MethodInfo::writeOut(const DomItem &self, OutWriter &ow) const { switch (methodType) { case MethodType::Signal: { @@ -1860,7 +1860,7 @@ void MethodInfo::writeOut(DomItem &self, OutWriter &ow) const } } -bool MethodParameter::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool MethodParameter::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvValueField(visitor, Fields::name, name); @@ -1884,7 +1884,7 @@ bool MethodParameter::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor return cont; } -void MethodParameter::writeOut(DomItem &self, OutWriter &ow) const +void MethodParameter::writeOut(const DomItem &self, OutWriter &ow) const { if (!name.isEmpty()) { if (isRestElement) @@ -1903,7 +1903,7 @@ void MethodParameter::writeOut(DomItem &self, OutWriter &ow) const } } -void MethodParameter::writeOutSignal(DomItem &self, OutWriter &ow) const +void MethodParameter::writeOutSignal(const DomItem &self, OutWriter &ow) const { self.writeOutPre(ow); if (!typeName.isEmpty()) @@ -1912,7 +1912,7 @@ void MethodParameter::writeOutSignal(DomItem &self, OutWriter &ow) const self.writeOutPost(ow); } -void Pragma::writeOut(DomItem &, OutWriter &ow) const +void Pragma::writeOut(const DomItem &, OutWriter &ow) const { ow.ensureNewline(); ow.writeRegion(u"pragma").space().writeRegion(u"name", name); @@ -1932,7 +1932,7 @@ void Pragma::writeOut(DomItem &, OutWriter &ow) const ow.ensureNewline(); } -bool EnumItem::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool EnumItem::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvValueField(visitor, Fields::name, name()); @@ -1941,7 +1941,7 @@ bool EnumItem::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -void EnumItem::writeOut(DomItem &self, OutWriter &ow) const +void EnumItem::writeOut(const DomItem &self, OutWriter &ow) const { ow.ensureNewline(); ow.writeRegion(u"name", name()); diff --git a/src/qmldom/qqmldomelements_p.h b/src/qmldom/qqmldomelements_p.h index 67ba7edb56..0e0a5ffc81 100644 --- a/src/qmldom/qqmldomelements_p.h +++ b/src/qmldom/qqmldomelements_p.h @@ -145,7 +145,7 @@ public: { } CommentableDomElement &operator=(const CommentableDomElement &o) = default; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; RegionComments &comments() { return m_comments; } const RegionComments &comments() const { return m_comments; } @@ -163,7 +163,7 @@ public: Version(qint32 majorVersion = Undefined, qint32 minorVersion = Undefined); static Version fromString(QStringView v); - bool iterateDirectSubpaths(DomItem &self, DirectVisitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const; bool isLatest() const; bool isValid() const; @@ -272,7 +272,7 @@ public: { } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const; Path importedPath() const { if (uri.isDirectory()) { @@ -296,7 +296,7 @@ public: } friend bool operator!=(const Import &i1, const Import &i2) { return !(i1 == i2); } - void writeOut(DomItem &self, OutWriter &ow) const; + void writeOut(const DomItem &self, OutWriter &ow) const; static QRegularExpression importRe(); @@ -312,7 +312,7 @@ class QMLDOM_EXPORT ModuleAutoExport public: constexpr static DomType kindValue = DomType::ModuleAutoExport; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvWrapField(visitor, Fields::import, import); @@ -343,7 +343,7 @@ public: { } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = self.dvValueField(visitor, Fields::name, name); cont = cont && self.dvValueField(visitor, Fields::values, values); @@ -351,7 +351,7 @@ public: return cont; } - void writeOut(DomItem &self, OutWriter &ow) const; + void writeOut(const DomItem &self, OutWriter &ow) const; QString name; QStringList values; @@ -365,7 +365,7 @@ public: Id(QString idName = QString(), Path referredObject = Path()); - bool iterateDirectSubpaths(DomItem &self, DirectVisitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const; void updatePathFromOwner(Path pathFromOwner); Path addAnnotation(Path selfPathFromOwner, const QmlObject &ann, QmlObject **aPtr = nullptr); @@ -416,16 +416,16 @@ public: ScriptExpression(const ScriptExpression &e); - std::shared_ptr<ScriptExpression> makeCopy(DomItem &self) const + std::shared_ptr<ScriptExpression> makeCopy(const DomItem &self) const { return std::static_pointer_cast<ScriptExpression>(doCopy(self)); } - std::shared_ptr<ScriptExpression> copyWithUpdatedCode(DomItem &self, QString code) const; + std::shared_ptr<ScriptExpression> copyWithUpdatedCode(const DomItem &self, QString code) const; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; - Path canonicalPath(DomItem &self) const override { return self.m_ownerPath; } + Path canonicalPath(const DomItem &self) const override { return self.m_ownerPath; } // parsed and created if not available AST::Node *ast() const { return m_ast; } // dump of the ast (without locations) @@ -457,8 +457,8 @@ public: return m_engine; } std::shared_ptr<AstComments> astComments() const { return m_astComments; } - void writeOut(DomItem &self, OutWriter &lw) const override; - SourceLocation globalLocation(DomItem &self) const; + void writeOut(const DomItem &self, OutWriter &lw) const override; + SourceLocation globalLocation(const DomItem &self) const; SourceLocation localOffset() const { return m_localOffset; } QStringView preCode() const { return m_preCode; } QStringView postCode() const { return m_postCode; } @@ -466,12 +466,12 @@ public: ScriptElementVariant scriptElement() { return m_element; } protected: - std::shared_ptr<OwningItem> doCopy(DomItem &) const override + std::shared_ptr<OwningItem> doCopy(const DomItem &) const override { return std::make_shared<ScriptExpression>(*this); } - std::function<SourceLocation(SourceLocation)> locationToGlobalF(DomItem &self) const + std::function<SourceLocation(SourceLocation)> locationToGlobalF(const DomItem &self) const { SourceLocation loc = globalLocation(self); return [loc, this](SourceLocation x) { @@ -492,7 +492,7 @@ protected: : x.startColumn)); // are line and column 1 based? then we should + 1 } - std::function<SourceLocation(SourceLocation)> locationToLocalF(DomItem &) const + std::function<SourceLocation(SourceLocation)> locationToLocalF(const DomItem &) const { return [this](SourceLocation x) { return locationToLocal(x); }; } @@ -532,8 +532,8 @@ public: Binding &operator=(const Binding &); Binding &operator=(Binding &&) = default; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor); - DomItem valueItem(DomItem &self) const; // ### REVISIT: consider replacing return value with variant + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const; + DomItem valueItem(const DomItem &self) const; // ### REVISIT: consider replacing return value with variant BindingValueKind valueKind() const; QString name() const { return m_name; } BindingType bindingType() const { return m_bindingType; } @@ -550,8 +550,8 @@ public: const RegionComments &comments() const { return m_comments; } RegionComments &comments() { return m_comments; } void updatePathFromOwner(Path newPath); - void writeOut(DomItem &self, OutWriter &lw) const; - void writeOutValue(DomItem &self, OutWriter &lw) const; + void writeOut(const DomItem &self, OutWriter &lw) const; + void writeOutValue(const DomItem &self, OutWriter &lw) const; bool isSignalHandler() const { QString baseName = m_name.split(QLatin1Char('.')).last(); @@ -579,7 +579,7 @@ class QMLDOM_EXPORT AttributeInfo public: enum Access { Private, Protected, Public }; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const; Path addAnnotation(Path selfPathFromOwner, const QmlObject &annotation, QmlObject **aPtr = nullptr); @@ -620,7 +620,7 @@ class QMLDOM_EXPORT PropertyDefinition : public AttributeInfo public: constexpr static DomType kindValue = DomType::PropertyDefinition; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = AttributeInfo::iterateDirectSubpaths(self, visitor); cont = cont && self.dvValueField(visitor, Fields::isPointer, isPointer); @@ -640,7 +640,7 @@ public: bool isAlias() const { return typeName == u"alias"; } bool isParametricType() const; - void writeOut(DomItem &self, OutWriter &lw) const; + void writeOut(const DomItem &self, OutWriter &lw) const; QString read; QString write; @@ -658,7 +658,7 @@ class QMLDOM_EXPORT PropertyInfo public: constexpr static DomType kindValue = DomType::PropertyInfo; // used to get the correct kind in ObjectWrapper - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const; QList<DomItem> propertyDefs; QList<DomItem> bindings; @@ -669,10 +669,10 @@ class QMLDOM_EXPORT MethodParameter public: constexpr static DomType kindValue = DomType::MethodParameter; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const; - void writeOut(DomItem &self, OutWriter &ow) const; - void writeOutSignal(DomItem &self, OutWriter &ow) const; + void writeOut(const DomItem &self, OutWriter &ow) const; + void writeOutSignal(const DomItem &self, OutWriter &ow) const; QString name; QString typeName; @@ -700,16 +700,16 @@ public: constexpr static DomType kindValue = DomType::MethodInfo; - Path typePath(DomItem &) const + Path typePath(const DomItem &) const { return (typeName.isEmpty() ? Path() : Paths::lookupTypePath(typeName)); } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor); - QString preCode(DomItem &) const; // ### REVISIT, might be simplified by using different toplevel production rules at usage site - QString postCode(DomItem &) const; - void writePre(DomItem &self, OutWriter &ow) const; - void writeOut(DomItem &self, OutWriter &ow) const; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const; + QString preCode(const DomItem &) const; // ### REVISIT, might be simplified by using different toplevel production rules at usage site + QString postCode(const DomItem &) const; + void writePre(const DomItem &self, OutWriter &ow) const; + void writeOut(const DomItem &self, OutWriter &ow) const; void setCode(QString code) { body = std::make_shared<ScriptExpression>( @@ -736,13 +736,13 @@ public: EnumItem(QString name = QString(), int value = 0) : m_name(name), m_value(value) { } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const; QString name() const { return m_name; } double value() const { return m_value; } RegionComments &comments() { return m_comments; } const RegionComments &comments() const { return m_comments; } - void writeOut(DomItem &self, OutWriter &lw) const; + void writeOut(const DomItem &self, OutWriter &lw) const; private: QString m_name; @@ -762,7 +762,7 @@ public: { } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; QString name() const { return m_name; } void setName(QString name) { m_name = name; } @@ -782,7 +782,7 @@ public: const QList<QmlObject> &annotations() const & { return m_annotations; } void setAnnotations(QList<QmlObject> annotations); Path addAnnotation(const QmlObject &child, QmlObject **cPtr = nullptr); - void writeOut(DomItem &self, OutWriter &lw) const override; + void writeOut(const DomItem &self, OutWriter &lw) const override; private: QString m_name; @@ -800,19 +800,15 @@ public: DomType kind() const override { return kindValue; } QmlObject(Path pathFromOwner = Path()); - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; - bool iterateBaseDirectSubpaths(DomItem &self, DirectVisitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; + bool iterateBaseDirectSubpaths(const DomItem &self, DirectVisitor) const; QList<QString> fields() const; - QList<QString> fields(DomItem &) const override { return fields(); } - DomItem field(DomItem &self, QStringView name); - DomItem field(DomItem &self, QStringView name) const override - { - return const_cast<QmlObject *>(this)->field(self, name); - } + QList<QString> fields(const DomItem &) const override { return fields(); } + DomItem field(const DomItem &self, QStringView name) const override; void updatePathFromOwner(Path newPath) override; QString localDefaultPropertyName() const; - QString defaultPropertyName(DomItem &self) const; - virtual bool iterateSubOwners(DomItem &self, function_ref<bool(DomItem &owner)> visitor) const; + QString defaultPropertyName(const DomItem &self) const; + virtual bool iterateSubOwners(const DomItem &self, function_ref<bool(const DomItem &owner)> visitor) const; QString idStr() const { return m_idStr; } QString name() const { return m_name; } @@ -893,12 +889,12 @@ public: return appendUpdatableElementInQList(pathFromOwner().field(Fields::annotations), m_annotations, annotation, aPtr); } - void writeOut(DomItem &self, OutWriter &ow, QString onTarget) const; - void writeOut(DomItem &self, OutWriter &lw) const override { writeOut(self, lw, QString()); } + void writeOut(const DomItem &self, OutWriter &ow, QString onTarget) const; + void writeOut(const DomItem &self, OutWriter &lw) const override { writeOut(self, lw, QString()); } - LocallyResolvedAlias resolveAlias(DomItem &self, + LocallyResolvedAlias resolveAlias(const DomItem &self, std::shared_ptr<ScriptExpression> accessSequence) const; - LocallyResolvedAlias resolveAlias(DomItem &self, const QStringList &accessSequence) const; + LocallyResolvedAlias resolveAlias(const DomItem &self, const QStringList &accessSequence) const; std::optional<QQmlJSScope::Ptr> semanticScope() const { return m_scope; } void setSemanticScope(const QQmlJSScope::Ptr &scope) { m_scope = scope; } @@ -924,7 +920,7 @@ class Export public: constexpr static DomType kindValue = DomType::Export; static Export fromString(Path source, QStringView exp, Path typePath, ErrorHandler h); - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvValueField(visitor, Fields::uri, uri); @@ -956,13 +952,9 @@ public: Component(const Component &o) = default; Component &operator=(const Component &) = default; - bool iterateDirectSubpaths(DomItem &, DirectVisitor) override; + bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override; void updatePathFromOwner(Path newPath) override; - DomItem field(DomItem &self, QStringView name) const override - { - return const_cast<Component *>(this)->field(self, name); - } - DomItem field(DomItem &self, QStringView name); + DomItem field(const DomItem &self, QStringView name) const override; QString name() const { return m_name; } const QMultiMap<QString, EnumDecl> &enumerations() const & { return m_enumerations; } @@ -971,7 +963,7 @@ public: bool isCreatable() const { return m_isCreatable; } bool isComposite() const { return m_isComposite; } QString attachedTypeName() const { return m_attachedTypeName; } - Path attachedTypePath(DomItem &) const { return m_attachedTypePath; } + Path attachedTypePath(const DomItem &) const { return m_attachedTypePath; } void setName(QString name) { m_name = name; } void setEnumerations(QMultiMap<QString, EnumDecl> enumerations) @@ -1012,7 +1004,7 @@ public: DomType kind() const override { return kindValue; } JsResource(Path pathFromOwner = Path()) : Component(pathFromOwner) { } - bool iterateDirectSubpaths(DomItem &, DirectVisitor) override + bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override { // to do: complete return true; } @@ -1026,7 +1018,7 @@ public: DomType kind() const override { return kindValue; } QmltypesComponent(Path pathFromOwner = Path()) : Component(pathFromOwner) { } - bool iterateDirectSubpaths(DomItem &, DirectVisitor) override; + bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override; const QList<Export> &exports() const & { return m_exports; } QString fileName() const { return m_fileName; } void setExports(QList<Export> exports) { m_exports = exports; } @@ -1076,7 +1068,7 @@ public: } QmlComponent &operator=(const QmlComponent &) = default; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; const QMultiMap<QString, Id> &ids() const & { return m_ids; } Path nextComponentPath() const { return m_nextComponentPath; } @@ -1089,12 +1081,12 @@ public: return insertUpdatableElementInMultiMap(pathFromOwner().field(Fields::ids), m_ids, id.name, id, option, idPtr); } - void writeOut(DomItem &self, OutWriter &) const override; - QList<QString> subComponentsNames(DomItem &self) const; - QList<DomItem> subComponents(DomItem &self) const; + void writeOut(const DomItem &self, OutWriter &) const override; + QList<QString> subComponentsNames(const DomItem &self) const; + QList<DomItem> subComponents(const DomItem &self) const; void setSemanticScope(const QQmlJSScope::Ptr &scope) { m_semanticScope = scope; } - std::optional<QQmlJSScope::Ptr> semanticScope() { return m_semanticScope; } + std::optional<QQmlJSScope::Ptr> semanticScope() const { return m_semanticScope; } private: friend class QQmlDomAstCreator; @@ -1127,9 +1119,9 @@ public: const QMap<QString, ImportScope> &subImports() const & { return m_subImports; } - QList<Path> allSources(DomItem &self) const; + QList<Path> allSources(const DomItem &self) const; - QSet<QString> importedNames(DomItem &self) const + QSet<QString> importedNames(const DomItem &self) const { QSet<QString> res; for (Path p : allSources(self)) { @@ -1139,7 +1131,7 @@ public: return res; } - QList<DomItem> importedItemsWithName(DomItem &self, QString name) const + QList<DomItem> importedItemsWithName(const DomItem &self, QString name) const { QList<DomItem> res; for (Path p : allSources(self)) { @@ -1157,10 +1149,10 @@ public: return res; } - QList<Export> importedExportsWithName(DomItem &self, QString name) const + QList<Export> importedExportsWithName(const DomItem &self, QString name) const { QList<Export> res; - for (DomItem &i : importedItemsWithName(self, name)) + for (const DomItem &i : importedItemsWithName(self, name)) if (const Export *e = i.as<Export>()) res.append(*e); else @@ -1169,7 +1161,7 @@ public: return res; } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor); + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const; void addImport(QStringList p, Path targetExports) { @@ -1197,7 +1189,7 @@ public: BindingValue(const BindingValue &o); BindingValue &operator=(const BindingValue &o); - DomItem value(DomItem &binding); + DomItem value(const DomItem &binding) const; void updatePathFromOwner(Path newPath); private: diff --git a/src/qmldom/qqmldomexternalitems.cpp b/src/qmldom/qqmldomexternalitems.cpp index 0015ea0aca..1a44ef5596 100644 --- a/src/qmldom/qqmldomexternalitems.cpp +++ b/src/qmldom/qqmldomexternalitems.cpp @@ -36,7 +36,7 @@ ExternalOwningItem::ExternalOwningItem(QString filePath, QDateTime lastDataUpdat m_path(path) {} -QString ExternalOwningItem::canonicalFilePath(DomItem &) const +QString ExternalOwningItem::canonicalFilePath(const DomItem &) const { return m_canonicalFilePath; } @@ -46,7 +46,7 @@ QString ExternalOwningItem::canonicalFilePath() const return m_canonicalFilePath; } -Path ExternalOwningItem::canonicalPath(DomItem &) const +Path ExternalOwningItem::canonicalPath(const DomItem &) const { return m_path; } @@ -214,7 +214,7 @@ void QmldirFile::setAutoExports(const QList<ModuleAutoExport> &autoExport) m_autoExports = autoExport; } -void QmldirFile::ensureInModuleIndex(DomItem &self, QString uri) +void QmldirFile::ensureInModuleIndex(const DomItem &self, QString uri) const { // ModuleIndex keeps the various sources of types from a given module uri import // this method ensures that all major versions that are contained in this qmldir @@ -230,7 +230,7 @@ void QmldirFile::ensureInModuleIndex(DomItem &self, QString uri) } } -QCborValue pluginData(QQmlDirParser::Plugin &pl, QStringList cNames) +QCborValue pluginData(const QQmlDirParser::Plugin &pl, QStringList cNames) { QCborArray names; for (QString n : cNames) @@ -240,7 +240,7 @@ QCborValue pluginData(QQmlDirParser::Plugin &pl, QStringList cNames) { QStringView(Fields::classNames), names } }); } -bool QmldirFile::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool QmldirFile::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = ExternalOwningItem::iterateDirectSubpaths(self, visitor); cont = cont && self.dvValueField(visitor, Fields::uri, uri().toString()); @@ -252,8 +252,8 @@ bool QmldirFile::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) QStringList cNames = classNames(); return self.subListItem(List::fromQListRef<QQmlDirParser::Plugin>( self.pathFromOwner().field(Fields::plugins), m_plugins, - [cNames](DomItem &list, const PathEls::PathComponent &p, - QQmlDirParser::Plugin &plugin) { + [cNames](const DomItem &list, const PathEls::PathComponent &p, + const QQmlDirParser::Plugin &plugin) { return list.subDataItem(p, pluginData(plugin, cNames)); })); }); @@ -263,7 +263,7 @@ bool QmldirFile::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) const QMap<QString, QString> typeFileMap = qmlFiles(); return self.subMapItem(Map( self.pathFromOwner().field(Fields::qmlFiles), - [typeFileMap](DomItem &map, QString typeV) { + [typeFileMap](const DomItem &map, QString typeV) { QString path = typeFileMap.value(typeV); if (path.isEmpty()) return DomItem(); @@ -272,7 +272,7 @@ bool QmldirFile::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) PathEls::Key(typeV), QList<Path>({ Paths::qmlFileObjectPath(path) })); }, - [typeFileMap](DomItem &) { + [typeFileMap](const DomItem &) { return QSet<QString>(typeFileMap.keyBegin(), typeFileMap.keyEnd()); }, QStringLiteral(u"QList<Reference>"))); @@ -293,7 +293,7 @@ QMap<QString, QString> QmldirFile::qmlFiles() const return res; } -std::shared_ptr<OwningItem> QmlFile::doCopy(DomItem &) const +std::shared_ptr<OwningItem> QmlFile::doCopy(const DomItem &) const { auto res = std::make_shared<QmlFile>(*this); return res; @@ -338,7 +338,7 @@ ErrorGroups QmlFile::myParsingErrors() return res; } -bool QmlFile::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool QmlFile::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = ExternalOwningItem::iterateDirectSubpaths(self, visitor); cont = cont && self.dvWrapField(visitor, Fields::components, m_components); @@ -351,21 +351,21 @@ bool QmlFile::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -DomItem QmlFile::field(DomItem &self, QStringView name) +DomItem QmlFile::field(const DomItem &self, QStringView name) const { if (name == Fields::components) return self.wrapField(Fields::components, m_components); return DomBase::field(self, name); } -void QmlFile::addError(DomItem &self, ErrorMessage msg) +void QmlFile::addError(const DomItem &self, ErrorMessage msg) { self.containingObject().addError(msg); } -void QmlFile::writeOut(DomItem &self, OutWriter &ow) const +void QmlFile::writeOut(const DomItem &self, OutWriter &ow) const { - for (DomItem &p : self.field(Fields::pragmas).values()) { + for (const DomItem &p : self.field(Fields::pragmas).values()) { p.writeOut(ow); } for (auto i : self.field(Fields::imports).values()) { @@ -376,20 +376,20 @@ void QmlFile::writeOut(DomItem &self, OutWriter &ow) const mainC.writeOut(ow); } -std::shared_ptr<OwningItem> GlobalScope::doCopy(DomItem &self) const +std::shared_ptr<OwningItem> GlobalScope::doCopy(const DomItem &self) const { auto res = std::make_shared<GlobalScope>( canonicalFilePath(self), lastDataUpdateAt(), revision()); return res; } -bool GlobalScope::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool GlobalScope::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = ExternalOwningItem::iterateDirectSubpaths(self, visitor); return cont; } -void QmltypesFile::ensureInModuleIndex(DomItem &self) +void QmltypesFile::ensureInModuleIndex(const DomItem &self) const { auto it = m_uris.begin(); auto end = m_uris.end(); @@ -407,7 +407,7 @@ void QmltypesFile::ensureInModuleIndex(DomItem &self) } } -bool QmltypesFile::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool QmltypesFile::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = ExternalOwningItem::iterateDirectSubpaths(self, visitor); cont = cont && self.dvWrapField(visitor, Fields::components, m_components); @@ -415,13 +415,13 @@ bool QmltypesFile::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) cont = cont && self.dvItemField(visitor, Fields::uris, [this, &self]() { return self.subMapItem(Map::fromMapRef<QSet<int>>( self.pathFromOwner().field(Fields::uris), m_uris, - [](DomItem &map, const PathEls::PathComponent &p, QSet<int> &el) { + [](const DomItem &map, const PathEls::PathComponent &p, const QSet<int> &el) { QList<int> l(el.cbegin(), el.cend()); std::sort(l.begin(), l.end()); return map.subListItem( List::fromQList<int>(map.pathFromOwner().appendComponent(p), l, - [](DomItem &list, const PathEls::PathComponent &p, - int &el) { return list.subDataItem(p, el); })); + [](const DomItem &list, const PathEls::PathComponent &p, + int el) { return list.subDataItem(p, el); })); })); }); cont = cont && self.dvWrapField(visitor, Fields::imports, m_imports); @@ -438,7 +438,7 @@ QmlDirectory::QmlDirectory(QString filePath, QStringList dirList, QDateTime last } } -bool QmlDirectory::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool QmlDirectory::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = ExternalOwningItem::iterateDirectSubpaths(self, visitor); cont = cont && self.dvWrapField(visitor, Fields::exports, m_exports); @@ -446,7 +446,7 @@ bool QmlDirectory::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) QDir baseDir(canonicalFilePath()); return self.subMapItem(Map( self.pathFromOwner().field(Fields::qmlFiles), - [this, baseDir](DomItem &map, QString key) -> DomItem { + [this, baseDir](const DomItem &map, QString key) -> DomItem { QList<Path> res; auto it = m_qmlFiles.find(key); while (it != m_qmlFiles.end() && it.key() == key) { @@ -456,7 +456,7 @@ bool QmlDirectory::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) } return map.subReferencesItem(PathEls::Key(key), res); }, - [this](DomItem &) { + [this](const DomItem &) { auto keys = m_qmlFiles.keys(); return QSet<QString>(keys.begin(), keys.end()); }, diff --git a/src/qmldom/qqmldomexternalitems_p.h b/src/qmldom/qqmldomexternalitems_p.h index 2ade396963..b217108c9f 100644 --- a/src/qmldom/qqmldomexternalitems_p.h +++ b/src/qmldom/qqmldomexternalitems_p.h @@ -51,11 +51,11 @@ public: ExternalOwningItem(QString filePath, QDateTime lastDataUpdateAt, Path pathFromTop, int derivedFrom = 0, QString code = QString()); ExternalOwningItem(const ExternalOwningItem &o) = default; - QString canonicalFilePath(DomItem &) const override; + QString canonicalFilePath(const DomItem &) const override; QString canonicalFilePath() const; - Path canonicalPath(DomItem &) const override; + Path canonicalPath(const DomItem &) const override; Path canonicalPath() const; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override { bool cont = OwningItem::iterateDirectSubpaths(self, visitor); cont = cont && self.dvValueLazyField(visitor, Fields::canonicalFilePath, [this]() { @@ -69,12 +69,12 @@ public: return cont; } - bool iterateSubOwners(DomItem &self, function_ref<bool(DomItem &owner)> visitor) override + bool iterateSubOwners(const DomItem &self, function_ref<bool(const DomItem &owner)> visitor) override { bool cont = OwningItem::iterateSubOwners(self, visitor); - cont = cont && self.field(Fields::components).visitKeys([visitor](QString, DomItem &comps) { - return comps.visitIndexes([visitor](DomItem &comp) { - return comp.field(Fields::objects).visitIndexes([visitor](DomItem &qmlObj) { + cont = cont && self.field(Fields::components).visitKeys([visitor](QString, const DomItem &comps) { + return comps.visitIndexes([visitor](const DomItem &comp) { + return comp.field(Fields::objects).visitIndexes([visitor](const DomItem &qmlObj) { if (const QmlObject *qmlObjPtr = qmlObj.as<QmlObject>()) return qmlObjPtr->iterateSubOwners(qmlObj, visitor); Q_ASSERT(false); @@ -106,7 +106,7 @@ protected: class QMLDOM_EXPORT QmlDirectory final : public ExternalOwningItem { protected: - std::shared_ptr<OwningItem> doCopy(DomItem &) const override + std::shared_ptr<OwningItem> doCopy(const DomItem &) const override { return std::make_shared<QmlDirectory>(*this); } @@ -119,12 +119,12 @@ public: int derivedFrom = 0); QmlDirectory(const QmlDirectory &o) = default; - std::shared_ptr<QmlDirectory> makeCopy(DomItem &self) const + std::shared_ptr<QmlDirectory> makeCopy(const DomItem &self) const { return std::static_pointer_cast<QmlDirectory>(doCopy(self)); } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; const QMultiMap<QString, Export> &exports() const & { return m_exports; } @@ -141,7 +141,7 @@ class QMLDOM_EXPORT QmldirFile final : public ExternalOwningItem { Q_DECLARE_TR_FUNCTIONS(QmldirFile) protected: - std::shared_ptr<OwningItem> doCopy(DomItem &) const override + std::shared_ptr<OwningItem> doCopy(const DomItem &) const override { auto copy = std::make_shared<QmldirFile>(*this); return copy; @@ -164,12 +164,12 @@ public: static std::shared_ptr<QmldirFile> fromPathAndCode(const QString &path, const QString &code); - std::shared_ptr<QmldirFile> makeCopy(DomItem &self) const + std::shared_ptr<QmldirFile> makeCopy(const DomItem &self) const { return std::static_pointer_cast<QmldirFile>(doCopy(self)); } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; QmlUri uri() const { return m_uri; } @@ -190,7 +190,7 @@ public: QList<ModuleAutoExport> autoExports() const; void setAutoExports(const QList<ModuleAutoExport> &autoExport); - void ensureInModuleIndex(DomItem &self, QString uri); + void ensureInModuleIndex(const DomItem &self, QString uri) const; private: void parse(); @@ -209,7 +209,7 @@ private: class QMLDOM_EXPORT JsFile final : public ExternalOwningItem { protected: - std::shared_ptr<OwningItem> doCopy(DomItem &) const override + std::shared_ptr<OwningItem> doCopy(const DomItem &) const override { auto copy = std::make_shared<JsFile>(*this); return copy; @@ -226,7 +226,7 @@ public: } JsFile(const JsFile &o) = default; - std::shared_ptr<JsFile> makeCopy(DomItem &self) const + std::shared_ptr<JsFile> makeCopy(const DomItem &self) const { return std::static_pointer_cast<JsFile>(doCopy(self)); } @@ -242,7 +242,7 @@ private: class QMLDOM_EXPORT QmlFile final : public ExternalOwningItem { protected: - std::shared_ptr<OwningItem> doCopy(DomItem &self) const override; + std::shared_ptr<OwningItem> doCopy(const DomItem &self) const override; public: constexpr static DomType kindValue = DomType::QmlFile; @@ -253,18 +253,14 @@ public: QDateTime lastDataUpdate = QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC), int derivedFrom = 0); static ErrorGroups myParsingErrors(); - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; // iterates the *direct* subpaths, returns false if a quick end was requested - DomItem field(DomItem &self, QStringView name) const override - { - return const_cast<QmlFile *>(this)->field(self, name); - } - DomItem field(DomItem &self, QStringView name); - std::shared_ptr<QmlFile> makeCopy(DomItem &self) const + DomItem field(const DomItem &self, QStringView name) const override; + std::shared_ptr<QmlFile> makeCopy(const DomItem &self) const { return std::static_pointer_cast<QmlFile>(doCopy(self)); } - void addError(DomItem &self, ErrorMessage msg) override; + void addError(const DomItem &self, ErrorMessage msg) override; const QMultiMap<QString, QmlComponent> &components() const & { return m_components; } void setComponents(const QMultiMap<QString, QmlComponent> &components) @@ -280,7 +276,7 @@ public: component, option, cPtr); } - void writeOut(DomItem &self, OutWriter &lw) const override; + void writeOut(const DomItem &self, OutWriter &lw) const override; AST::UiProgram *ast() const { @@ -350,7 +346,7 @@ private: class QMLDOM_EXPORT QmltypesFile final : public ExternalOwningItem { protected: - std::shared_ptr<OwningItem> doCopy(DomItem &) const override + std::shared_ptr<OwningItem> doCopy(const DomItem &) const override { auto res = std::make_shared<QmltypesFile>(*this); return res; @@ -370,10 +366,10 @@ public: QmltypesFile(const QmltypesFile &o) = default; - void ensureInModuleIndex(DomItem &self); + void ensureInModuleIndex(const DomItem &self) const; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; - std::shared_ptr<QmltypesFile> makeCopy(DomItem &self) const + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; + std::shared_ptr<QmltypesFile> makeCopy(const DomItem &self) const { return std::static_pointer_cast<QmltypesFile>(doCopy(self)); } @@ -422,7 +418,7 @@ private: class QMLDOM_EXPORT GlobalScope final : public ExternalOwningItem { protected: - std::shared_ptr<OwningItem> doCopy(DomItem &) const override; + std::shared_ptr<OwningItem> doCopy(const DomItem &) const override; public: constexpr static DomType kindValue = DomType::GlobalScope; @@ -437,8 +433,8 @@ public: setIsValid(true); } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; - std::shared_ptr<GlobalScope> makeCopy(DomItem &self) const + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; + std::shared_ptr<GlobalScope> makeCopy(const DomItem &self) const { return std::static_pointer_cast<GlobalScope>(doCopy(self)); } diff --git a/src/qmldom/qqmldomfieldfilter.cpp b/src/qmldom/qqmldomfieldfilter.cpp index 17529de4e9..2fa401e004 100644 --- a/src/qmldom/qqmldomfieldfilter.cpp +++ b/src/qmldom/qqmldomfieldfilter.cpp @@ -61,7 +61,7 @@ QString FieldFilter::describeFieldsFilter() const return fieldFilterStr; } -bool FieldFilter::operator()(DomItem &obj, Path p, DomItem &i) const +bool FieldFilter::operator()(const DomItem &obj, Path p, const DomItem &i) const { if (p) return this->operator()(obj, p.component(0), i); @@ -69,7 +69,7 @@ bool FieldFilter::operator()(DomItem &obj, Path p, DomItem &i) const return this->operator()(obj, PathEls::Empty(), i); } -bool FieldFilter::operator()(DomItem &base, const PathEls::PathComponent &c, DomItem &obj) const +bool FieldFilter::operator()(const DomItem &base, const PathEls::PathComponent &c, const DomItem &obj) const { DomType baseK = base.internalKind(); if (c.kind() == Path::Kind::Field) { diff --git a/src/qmldom/qqmldomfieldfilter_p.h b/src/qmldom/qqmldomfieldfilter_p.h index e40ce4459e..9221dc08bc 100644 --- a/src/qmldom/qqmldomfieldfilter_p.h +++ b/src/qmldom/qqmldomfieldfilter_p.h @@ -33,8 +33,8 @@ class QMLDOM_EXPORT FieldFilter public: QString describeFieldsFilter() const; bool addFilter(QString f); - bool operator()(DomItem &, Path, DomItem &) const; - bool operator()(DomItem &, const PathEls::PathComponent &c, DomItem &) const; + bool operator()(const DomItem &, Path, const DomItem &) const; + bool operator()(const DomItem &, const PathEls::PathComponent &c, const DomItem &) const; static FieldFilter defaultFilter(); static FieldFilter noLocationFilter(); static FieldFilter compareFilter(); diff --git a/src/qmldom/qqmldomitem.cpp b/src/qmldom/qqmldomitem.cpp index a7e5e58b5f..23cc37ddec 100644 --- a/src/qmldom/qqmldomitem.cpp +++ b/src/qmldom/qqmldomitem.cpp @@ -104,18 +104,18 @@ The minimal overload set to be usable consists of following methods: \li \c{pathFromOwner()} returns the path from the owner to the current element \code - Path pathFromOwner(DomItem &self) const override; + Path pathFromOwner(const DomItem &self) const override; \endcode \li \c{canonicalPath()} returns the path \code - Path canonicalPath(DomItem &self) const override; + Path canonicalPath(const DomItem &self) const override; \endcode \li \c{iterateDirectSubpaths} iterates the *direct* subpaths/children and returns false if a quick end was requested: \code -bool iterateDirectSubpaths(DomItem &self, function_ref<bool(Path, DomItem)>) const = 0; +bool iterateDirectSubpaths(const DomItem &self, function_ref<bool(Path, DomItem)>) const = 0; \endcode \endlist @@ -238,7 +238,7 @@ QCborValue locationToData(SourceLocation loc, QStringView strValue) return res; } -QString DomBase::canonicalFilePath(DomItem &self) const +QString DomBase::canonicalFilePath(const DomItem &self) const { auto parent = containingObject(self); if (parent) @@ -246,7 +246,7 @@ QString DomBase::canonicalFilePath(DomItem &self) const return QString(); } -void DomBase::writeOut(DomItem &self, OutWriter &) const +void DomBase::writeOut(const DomItem &self, OutWriter &) const { qCWarning(writeOutLog) << "Ignoring unsupported writeOut for " << domTypeToString(kind()) << ":" << self.canonicalPath(); @@ -256,7 +256,7 @@ ConstantData::ConstantData(Path pathFromOwner, QCborValue value, Options options : DomElement(pathFromOwner), m_value(value), m_options(options) {} -bool ConstantData::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool ConstantData::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { static QHash<QString, QString> knownFields; static QBasicMutex m; @@ -399,7 +399,7 @@ ErrorGroups DomItem::myResolveErrors() return res; } -Path DomItem::canonicalPath() +Path DomItem::canonicalPath() const { Path res = visitEl([this](auto &&el) { return el->canonicalPath(*this); }); if (!(!res || res.headKind() == Path::Kind::Root)) { @@ -410,7 +410,7 @@ Path DomItem::canonicalPath() } -DomItem DomItem::containingObject() +DomItem DomItem::containingObject() const { return visitEl([this](auto &&el) { return el->containingObject(*this); }); } @@ -421,9 +421,9 @@ DomItem DomItem::containingObject() qmlObject() might also return the object of a component if GoTo:MostLikely is used. */ -DomItem DomItem::qmlObject(GoTo options, FilterUpOptions filterOptions) +DomItem DomItem::qmlObject(GoTo options, FilterUpOptions filterOptions) const { - if (DomItem res = filterUp([](DomType k, DomItem &) { return k == DomType::QmlObject; }, + if (DomItem res = filterUp([](DomType k, const DomItem &) { return k == DomType::QmlObject; }, filterOptions)) return res; if (options == GoTo::MostLikely) { @@ -433,7 +433,7 @@ DomItem DomItem::qmlObject(GoTo options, FilterUpOptions filterOptions) return DomItem(); } -DomItem DomItem::fileObject(GoTo options) +DomItem DomItem::fileObject(GoTo options) const { DomItem res = *this; DomType k = res.internalKind(); @@ -456,9 +456,9 @@ DomItem DomItem::fileObject(GoTo options) return res; } -DomItem DomItem::rootQmlObject(GoTo options) +DomItem DomItem::rootQmlObject(GoTo options) const { - if (DomItem res = filterUp([](DomType k, DomItem &) { return k == DomType::QmlObject; }, + if (DomItem res = filterUp([](DomType k, const DomItem &) { return k == DomType::QmlObject; }, FilterUpOptions::ReturnInner)) return res; if (options == GoTo::MostLikely) { @@ -468,7 +468,7 @@ DomItem DomItem::rootQmlObject(GoTo options) return DomItem(); } -DomItem DomItem::container() +DomItem DomItem::container() const { Path path = pathFromOwner(); if (!path) @@ -479,7 +479,7 @@ DomItem DomItem::container() return containingObject(); } -DomItem DomItem::globalScope() +DomItem DomItem::globalScope() const { if (internalKind() == DomType::GlobalScope) return *this; @@ -495,7 +495,7 @@ DomItem DomItem::globalScope() \internal \brief The owner of an element, for an qmlObject this is the containing qml file. */ -DomItem DomItem::owner() +DomItem DomItem::owner() const { if (domTypeIsOwningItem(m_kind) || m_kind == DomType::Empty) return *this; @@ -504,14 +504,14 @@ DomItem DomItem::owner() *m_owner); } -DomItem DomItem::top() +DomItem DomItem::top() const { if (domTypeIsTopItem(m_kind) || m_kind == DomType::Empty) return *this; return std::visit([](auto &&el) { return DomItem(el, el, Path(), el.get()); }, *m_top); } -DomItem DomItem::environment() +DomItem DomItem::environment() const { DomItem res = top(); if (res.internalKind() == DomType::DomEnvironment) @@ -519,7 +519,7 @@ DomItem DomItem::environment() return DomItem(); // we are in the universe, and cannot go back to the environment... } -DomItem DomItem::universe() +DomItem DomItem::universe() const { DomItem res = top(); if (res.internalKind() == DomType::DomUniverse) @@ -535,9 +535,9 @@ DomItem DomItem::universe() Returns an empty DomItem if the item is not defined in a QML file. \sa goToFile() */ -DomItem DomItem::containingFile() +DomItem DomItem::containingFile() const { - if (DomItem res = filterUp([](DomType k, DomItem &) { return k == DomType::QmlFile; }, + if (DomItem res = filterUp([](DomType k, const DomItem &) { return k == DomType::QmlFile; }, FilterUpOptions::ReturnOuter)) return res; return DomItem(); @@ -548,7 +548,7 @@ DomItem DomItem::containingFile() Shorthand to obtain the QmlFile DomItem from a canonicalPath. \sa containingFile() */ -DomItem DomItem::goToFile(const QString &canonicalPath) +DomItem DomItem::goToFile(const QString &canonicalPath) const { Q_UNUSED(canonicalPath); DomItem file = @@ -560,7 +560,7 @@ DomItem DomItem::goToFile(const QString &canonicalPath) \internal In the DomItem hierarchy, go \c n levels up. */ -DomItem DomItem::goUp(int n) +DomItem DomItem::goUp(int n) const { DomItem parent = owner().path(pathFromOwner().dropTail(n)); return parent; @@ -570,12 +570,12 @@ DomItem DomItem::goUp(int n) \internal In the DomItem hierarchy, go 1 level up to get the direct parent. */ -DomItem DomItem::directParent() +DomItem DomItem::directParent() const { return goUp(1); } -DomItem DomItem::filterUp(function_ref<bool(DomType k, DomItem &)> filter, FilterUpOptions options) +DomItem DomItem::filterUp(function_ref<bool(DomType k, const DomItem &)> filter, FilterUpOptions options) const { DomItem it = *this; DomType k = it.internalKind(); @@ -635,30 +635,30 @@ DomItem DomItem::filterUp(function_ref<bool(DomType k, DomItem &)> filter, Filte return DomItem(); } -DomItem DomItem::scope(FilterUpOptions options) +DomItem DomItem::scope(FilterUpOptions options) const { - DomItem res = filterUp([](DomType, DomItem &el) { return el.isScope(); }, options); + DomItem res = filterUp([](DomType, const DomItem &el) { return el.isScope(); }, options); return res; } -std::optional<QQmlJSScope::Ptr> DomItem::nearestSemanticScope() +std::optional<QQmlJSScope::Ptr> DomItem::nearestSemanticScope() const { std::optional<QQmlJSScope::Ptr> scope; - visitUp([&scope](DomItem &item) { + visitUp([&scope](const DomItem &item) { scope = item.semanticScope(); return !scope; // stop when scope was true }); return scope; } -std::optional<QQmlJSScope::Ptr> DomItem::semanticScope() +std::optional<QQmlJSScope::Ptr> DomItem::semanticScope() const { std::optional<QQmlJSScope::Ptr> scope = std::visit( [](auto &&e) -> std::optional<QQmlJSScope::Ptr> { using T = std::remove_cv_t<std::remove_reference_t<decltype(e)>>; - if constexpr (std::is_same_v<T, QmlObject *>) { + if constexpr (std::is_same_v<T, const QmlObject *>) { return e->semanticScope(); - } else if constexpr (std::is_same_v<T, QmlComponent *>) { + } else if constexpr (std::is_same_v<T, const QmlComponent *>) { return e->semanticScope(); } else if constexpr (std::is_same_v<T, SimpleObjectWrap>) { if (const MethodInfo *mi = e->template as<MethodInfo>()) { @@ -673,25 +673,25 @@ std::optional<QQmlJSScope::Ptr> DomItem::semanticScope() return scope; } -DomItem DomItem::get(ErrorHandler h, QList<Path> *visitedRefs) +DomItem DomItem::get(ErrorHandler h, QList<Path> *visitedRefs) const { if (const Reference *refPtr = as<Reference>()) return refPtr->get(*this, h, visitedRefs); return DomItem(); } -QList<DomItem> DomItem::getAll(ErrorHandler h, QList<Path> *visitedRefs) +QList<DomItem> DomItem::getAll(ErrorHandler h, QList<Path> *visitedRefs) const { if (const Reference *refPtr = as<Reference>()) return refPtr->getAll(*this, h, visitedRefs); return {}; } -PropertyInfo DomItem::propertyInfoWithName(QString name) +PropertyInfo DomItem::propertyInfoWithName(QString name) const { PropertyInfo pInfo; - visitPrototypeChain([&pInfo, name](DomItem &obj) { - return obj.visitLocalSymbolsNamed(name, [&pInfo, name](DomItem &el) { + visitPrototypeChain([&pInfo, name](const DomItem &obj) { + return obj.visitLocalSymbolsNamed(name, [&pInfo, name](const DomItem &el) { switch (el.internalKind()) { case DomType::Binding: pInfo.bindings.append(el); @@ -708,10 +708,10 @@ PropertyInfo DomItem::propertyInfoWithName(QString name) return pInfo; } -QSet<QString> DomItem::propertyInfoNames() +QSet<QString> DomItem::propertyInfoNames() const { QSet<QString> res; - visitPrototypeChain([&res](DomItem &obj) { + visitPrototypeChain([&res](const DomItem &obj) { res += obj.propertyDefs().keys(); res += obj.bindings().keys(); return true; @@ -719,10 +719,10 @@ QSet<QString> DomItem::propertyInfoNames() return res; } -DomItem DomItem::component(GoTo options) +DomItem DomItem::component(GoTo options) const { if (DomItem res = filterUp( - [](DomType kind, DomItem &) { + [](DomType kind, const DomItem &) { return kind == DomType::QmlComponent || kind == DomType::QmltypesComponent || kind == DomType::GlobalComponent; }, @@ -768,7 +768,7 @@ static QMap<LookupType, QString> lookupTypeToStringMap() } bool DomItem::resolve(Path path, DomItem::Visitor visitor, ErrorHandler errorHandler, - ResolveOptions options, Path fullPath, QList<Path> *visitedRefs) + ResolveOptions options, Path fullPath, QList<Path> *visitedRefs) const { QList<Path> vRefs; Path fPath = fullPath; @@ -865,7 +865,7 @@ bool DomItem::resolve(Path path, DomItem::Visitor visitor, ErrorHandler errorHan DomItem resolveRes; it.resolve( toResolve, - [&resolveRes](Path, DomItem &r) { + [&resolveRes](Path, const DomItem &r) { resolveRes = r; return false; }, @@ -902,7 +902,7 @@ bool DomItem::resolve(Path path, DomItem::Visitor visitor, ErrorHandler errorHan if (!branchExhausted) visitTree( Path(), - [toFind, &toDos, iPath](Path, DomItem &item, bool) { + [toFind, &toDos, iPath](Path, const DomItem &item, bool) { // avoid non directly attached? DomItem newItem = item[toFind]; if (newItem) @@ -930,7 +930,7 @@ bool DomItem::resolve(Path path, DomItem::Visitor visitor, ErrorHandler errorHan break; case PathCurrent::ObjChain: { bool cont = it.visitPrototypeChain( - [&toDos, iPath](DomItem &subEl) { + [&toDos, iPath](const DomItem &subEl) { toDos.append({ subEl, iPath }); return true; }, @@ -943,7 +943,7 @@ bool DomItem::resolve(Path path, DomItem::Visitor visitor, ErrorHandler errorHan } case PathCurrent::ScopeChain: { bool cont = it.visitScopeChain( - [&toDos, iPath](DomItem &subEl) { + [&toDos, iPath](const DomItem &subEl) { toDos.append({ subEl, iPath }); return true; }, @@ -1073,7 +1073,7 @@ bool DomItem::resolve(Path path, DomItem::Visitor visitor, ErrorHandler errorHan } it.visitLookup( target, - [&toDos, iPath](DomItem &subEl) { + [&toDos, iPath](const DomItem &subEl) { toDos.append({ subEl, iPath }); return true; }, @@ -1087,7 +1087,7 @@ bool DomItem::resolve(Path path, DomItem::Visitor visitor, ErrorHandler errorHan case Path::Kind::Any: visitTree( Path(), - [&toDos, iPath](Path, DomItem &item, bool) { + [&toDos, iPath](Path, const DomItem &item, bool) { toDos.append({ item, iPath }); return true; }, @@ -1107,7 +1107,7 @@ bool DomItem::resolve(Path path, DomItem::Visitor visitor, ErrorHandler errorHan return true; } -DomItem DomItem::path(Path p, ErrorHandler errorHandler) +DomItem DomItem::path(Path p, ErrorHandler errorHandler) const { if (!p) return *this; @@ -1119,37 +1119,37 @@ DomItem DomItem::path(Path p, ErrorHandler errorHandler) return res; } -DomItem DomItem::path(QString p, ErrorHandler errorHandler) +DomItem DomItem::path(QString p, ErrorHandler errorHandler) const { return path(Path::fromString(p, errorHandler)); } -DomItem DomItem::path(QStringView p, ErrorHandler errorHandler) +DomItem DomItem::path(QStringView p, ErrorHandler errorHandler) const { return path(Path::fromString(p, errorHandler)); } -QList<QString> DomItem::fields() +QList<QString> DomItem::fields() const { return visitEl([this](auto &&el) { return el->fields(*this); }); } -DomItem DomItem::field(QStringView name) +DomItem DomItem::field(QStringView name) const { return visitEl([this, name](auto &&el) { return el->field(*this, name); }); } -index_type DomItem::indexes() +index_type DomItem::indexes() const { return visitEl([this](auto &&el) { return el->indexes(*this); }); } -DomItem DomItem::index(index_type i) +DomItem DomItem::index(index_type i) const { return visitEl([this, i](auto &&el) { return el->index(*this, i); }); } -bool DomItem::visitIndexes(function_ref<bool(DomItem &)> visitor) +bool DomItem::visitIndexes(function_ref<bool(const DomItem &)> visitor) const { // use iterateDirectSubpathsConst instead? int nIndexes = indexes(); @@ -1161,12 +1161,12 @@ bool DomItem::visitIndexes(function_ref<bool(DomItem &)> visitor) return true; } -QSet<QString> DomItem::keys() +QSet<QString> DomItem::keys() const { return visitEl([this](auto &&el) { return el->keys(*this); }); } -QStringList DomItem::sortedKeys() +QStringList DomItem::sortedKeys() const { QSet<QString> ks = keys(); QStringList sortedKs(ks.begin(), ks.end()); @@ -1174,12 +1174,12 @@ QStringList DomItem::sortedKeys() return sortedKs; } -DomItem DomItem::key(QString name) +DomItem DomItem::key(QString name) const { return visitEl([this, name](auto &&el) { return el->key(*this, name); }); } -bool DomItem::visitKeys(function_ref<bool(QString, DomItem &)> visitor) +bool DomItem::visitKeys(function_ref<bool(QString, const DomItem &)> visitor) const { // use iterateDirectSubpathsConst instead? for (auto k : sortedKeys()) { @@ -1190,10 +1190,10 @@ bool DomItem::visitKeys(function_ref<bool(QString, DomItem &)> visitor) return true; } -QList<DomItem> DomItem::values() +QList<DomItem> DomItem::values() const { QList<DomItem> res; - visitEl([this, &res](auto &&el) { + visitEl([this, &res](const auto &el) { return el->iterateDirectSubpathsConst( *this, [&res](const PathEls::PathComponent &, function_ref<DomItem()> item) { res.append(item()); @@ -1203,7 +1203,7 @@ QList<DomItem> DomItem::values() return res; } -void DomItem::writeOutPre(OutWriter &ow) +void DomItem::writeOutPre(OutWriter &ow) const { if (hasAnnotations()) { DomItem anns = field(Fields::annotations); @@ -1222,24 +1222,24 @@ void DomItem::writeOutPre(OutWriter &ow) ow.itemStart(*this); } -void DomItem::writeOut(OutWriter &ow) +void DomItem::writeOut(OutWriter &ow) const { writeOutPre(ow); visitEl([this, &ow](auto &&el) { el->writeOut(*this, ow); }); writeOutPost(ow); } -void DomItem::writeOutPost(OutWriter &ow) +void DomItem::writeOutPost(OutWriter &ow) const { ow.itemEnd(*this); } -DomItem::WriteOutCheckResult DomItem::performWriteOutChecks(DomItem &original, DomItem &reformatted, +DomItem::WriteOutCheckResult DomItem::performWriteOutChecks(const DomItem &original, const DomItem &reformatted, OutWriter &ow, - WriteOutChecks extraChecks) + WriteOutChecks extraChecks) const { QStringList dumped; - auto maybeDump = [&ow, extraChecks, &dumped](DomItem &obj, QStringView objName) { + auto maybeDump = [&ow, extraChecks, &dumped](const DomItem &obj, QStringView objName) { QString objDumpPath; if (extraChecks & WriteOutCheck::DumpOnFailure) { objDumpPath = QDir(QDir::tempPath()) @@ -1260,8 +1260,8 @@ DomItem::WriteOutCheckResult DomItem::performWriteOutChecks(DomItem &original, D sinkEscaped(s, dumpPath); } }; - auto compare = [&maybeDump, &dumpedDumper, this](DomItem &obj1, QStringView obj1Name, - DomItem &obj2, QStringView obj2Name, + auto compare = [&maybeDump, &dumpedDumper, this](const DomItem &obj1, QStringView obj1Name, + const DomItem &obj2, QStringView obj2Name, const FieldFilter &filter) { const auto diffList = domCompareStrList(obj1, obj2, filter, DomCompareStrList::AllDiffs); if (!diffList.isEmpty()) { @@ -1275,7 +1275,7 @@ DomItem::WriteOutCheckResult DomItem::performWriteOutChecks(DomItem &original, D return true; }; auto checkStability = [&maybeDump, &dumpedDumper, &dumped, &ow, - this](QString expected, DomItem &obj, QStringView objName) { + this](QString expected, const DomItem &obj, QStringView objName) { LineWriter lw2([](QStringView) {}, ow.lineWriter.fileName(), ow.lineWriter.options()); OutWriter ow2(lw2); ow2.indentNextlines = true; @@ -1348,7 +1348,7 @@ DomItem::WriteOutCheckResult DomItem::performWriteOutChecks(DomItem &original, D return WriteOutCheckResult::Success; } -DomItem DomItem::writeOutForFile(OutWriter &ow, WriteOutChecks extraChecks) +DomItem DomItem::writeOutForFile(OutWriter &ow, WriteOutChecks extraChecks) const { ow.indentNextlines = true; writeOut(ow); @@ -1362,7 +1362,7 @@ DomItem DomItem::writeOutForFile(OutWriter &ow, WriteOutChecks extraChecks) } DomItem DomItem::writeOut(QString path, int nBackups, const LineWriterOptions &options, - FileWriter *fw, WriteOutChecks extraChecks) + FileWriter *fw, WriteOutChecks extraChecks) const { DomItem res = *this; DomItem copy; @@ -1390,7 +1390,7 @@ DomItem DomItem::writeOut(QString path, int nBackups, const LineWriterOptions &o return res; } -bool DomItem::isCanonicalChild(DomItem &item) +bool DomItem::isCanonicalChild(const DomItem &item) const { bool isChild = false; if (item.isOwningItem()) { @@ -1403,7 +1403,7 @@ bool DomItem::isCanonicalChild(DomItem &item) return isChild; } -bool DomItem::hasAnnotations() +bool DomItem::hasAnnotations() const { bool hasAnnotations = false; DomType iKind = internalKind(); @@ -1453,7 +1453,7 @@ bool DomItem::hasAnnotations() */ bool DomItem::visitTree(Path basePath, DomItem::ChildrenVisitor visitor, VisitOptions options, DomItem::ChildrenVisitor openingVisitor, - DomItem::ChildrenVisitor closingVisitor) + DomItem::ChildrenVisitor closingVisitor) const { if (!*this) return true; @@ -1497,10 +1497,10 @@ bool DomItem::visitTree(Path basePath, DomItem::ChildrenVisitor visitor, VisitOp }); }); } -static bool visitPrototypeIndex(QList<DomItem> &toDo, DomItem ¤t, - DomItem &derivedFromPrototype, ErrorHandler h, +static bool visitPrototypeIndex(QList<DomItem> &toDo, const DomItem ¤t, + const DomItem &derivedFromPrototype, ErrorHandler h, QList<Path> *visitedRefs, VisitPrototypesOptions options, - DomItem &prototype) + const DomItem &prototype) { Path elId = prototype.canonicalPath(); if (visitedRefs->contains(elId)) @@ -1523,7 +1523,7 @@ static bool visitPrototypeIndex(QList<DomItem> &toDo, DomItem ¤t, } else { if (protos.size() > 1) { QStringList protoPaths; - for (DomItem &p : protos) + for (const DomItem &p : protos) protoPaths.append(p.canonicalPath().toString()); derivedFromPrototype.myErrors() .warning(derivedFromPrototype @@ -1563,9 +1563,9 @@ static bool visitPrototypeIndex(QList<DomItem> &toDo, DomItem ¤t, return true; } -bool DomItem::visitPrototypeChain(function_ref<bool(DomItem &)> visitor, +bool DomItem::visitPrototypeChain(function_ref<bool(const DomItem &)> visitor, VisitPrototypesOptions options, ErrorHandler h, - QSet<quintptr> *visited, QList<Path> *visitedRefs) + QSet<quintptr> *visited, QList<Path> *visitedRefs) const { QSet<quintptr> visitedLocal; if (!visited) @@ -1601,16 +1601,16 @@ bool DomItem::visitPrototypeChain(function_ref<bool(DomItem &)> visitor, return false; shouldVisit = true; current.field(Fields::prototypes) - .visitIndexes([&toDo, ¤t, this, &h, visitedRefs, options](DomItem &el) { + .visitIndexes([&toDo, ¤t, this, &h, visitedRefs, options](const DomItem &el) { return visitPrototypeIndex(toDo, current, *this, h, visitedRefs, options, el); }); } return true; } -bool DomItem::visitDirectAccessibleScopes(function_ref<bool(DomItem &)> visitor, +bool DomItem::visitDirectAccessibleScopes(function_ref<bool(const DomItem &)> visitor, VisitPrototypesOptions options, ErrorHandler h, - QSet<quintptr> *visited, QList<Path> *visitedRefs) + QSet<quintptr> *visited, QList<Path> *visitedRefs) const { // these are the scopes one can access with the . operator from the current location // but currently not the attached types, which we should @@ -1655,9 +1655,9 @@ bool DomItem::visitDirectAccessibleScopes(function_ref<bool(DomItem &)> visitor, * visit the values JS reaches accessing a type directly: the values if it is a singleton or the * attached type */ -bool DomItem::visitStaticTypePrototypeChains(function_ref<bool(DomItem &)> visitor, +bool DomItem::visitStaticTypePrototypeChains(function_ref<bool(const DomItem &)> visitor, VisitPrototypesOptions options, ErrorHandler h, - QSet<quintptr> *visited, QList<Path> *visitedRefs) + QSet<quintptr> *visited, QList<Path> *visitedRefs) const { QSet<quintptr> visitedLocal; if (!visited) @@ -1678,7 +1678,7 @@ bool DomItem::visitStaticTypePrototypeChains(function_ref<bool(DomItem &)> visit /*! \brief Let the visitor visit the Dom Tree hierarchy of this DomItem. */ -bool DomItem::visitUp(function_ref<bool(DomItem &)> visitor) +bool DomItem::visitUp(function_ref<bool(const DomItem &)> visitor) const { Path p = canonicalPath(); while (p.length() > 0) { @@ -1693,8 +1693,8 @@ bool DomItem::visitUp(function_ref<bool(DomItem &)> visitor) /*! \brief Let the visitor visit the QML scope hierarchy of this DomItem. */ -bool DomItem::visitScopeChain(function_ref<bool(DomItem &)> visitor, LookupOptions options, - ErrorHandler h, QSet<quintptr> *visited, QList<Path> *visitedRefs) +bool DomItem::visitScopeChain(function_ref<bool(const DomItem &)> visitor, LookupOptions options, + ErrorHandler h, QSet<quintptr> *visited, QList<Path> *visitedRefs) const { QSet<quintptr> visitedLocal; if (!visited) @@ -1808,7 +1808,7 @@ bool DomItem::visitScopeChain(function_ref<bool(DomItem &)> visitor, LookupOptio return true; } -QSet<QString> DomItem::localSymbolNames(LocalSymbolsTypes typeFilter) +QSet<QString> DomItem::localSymbolNames(LocalSymbolsTypes typeFilter) const { QSet<QString> res; if (typeFilter == LocalSymbolsType::None) @@ -1878,7 +1878,7 @@ QSet<QString> DomItem::localSymbolNames(LocalSymbolsTypes typeFilter) case DomType::MethodInfo: { if (typeFilter & LocalSymbolsType::MethodParameters) { DomItem params = field(Fields::parameters); - params.visitIndexes([&res](DomItem &p) { + params.visitIndexes([&res](const DomItem &p) { const MethodParameter *pPtr = p.as<MethodParameter>(); res.insert(pPtr->name); return true; @@ -1892,14 +1892,14 @@ QSet<QString> DomItem::localSymbolNames(LocalSymbolsTypes typeFilter) return res; } -bool DomItem::visitLookup1(QString symbolName, function_ref<bool(DomItem &)> visitor, +bool DomItem::visitLookup1(QString symbolName, function_ref<bool(const DomItem &)> visitor, LookupOptions opts, ErrorHandler h, QSet<quintptr> *visited, - QList<Path> *visitedRefs) + QList<Path> *visitedRefs) const { return visitScopeChain( - [symbolName, visitor](DomItem &obj) { + [symbolName, visitor](const DomItem &obj) { return obj.visitLocalSymbolsNamed(symbolName, - [visitor](DomItem &el) { return visitor(el); }); + [visitor](const DomItem &el) { return visitor(el); }); }, opts, h, visited, visitedRefs); } @@ -1950,7 +1950,7 @@ public: }; static bool visitForLookupType(DomItem el, LookupType lookupType, - function_ref<bool(DomItem &)> visitor) + function_ref<bool(const DomItem &)> visitor) { bool correctType = false; DomType iType = el.internalKind(); @@ -1980,7 +1980,7 @@ static bool visitForLookupType(DomItem el, LookupType lookupType, } static bool visitQualifiedNameLookup(DomItem newIt, QStringList &subpath, - function_ref<bool(DomItem &)> visitor, LookupType lookupType, + function_ref<bool(const DomItem &)> visitor, LookupType lookupType, ErrorHandler &errorHandler, QList<Path> *visitedRefs) { QVector<ResolveToDo> lookupToDos( @@ -2004,9 +2004,9 @@ static bool visitQualifiedNameLookup(DomItem newIt, QStringList &subpath, } if (scope.internalKind() == DomType::QmlObject) scope.visitDirectAccessibleScopes( - [&lookupToDos, subPathNow, iSubPath](DomItem &el) { + [&lookupToDos, subPathNow, iSubPath](const DomItem &el) { return el.visitLocalSymbolsNamed( - subPathNow, [&lookupToDos, iSubPath](DomItem &subEl) { + subPathNow, [&lookupToDos, iSubPath](const DomItem &subEl) { lookupToDos.append({ subEl, iSubPath }); return true; }); @@ -2015,12 +2015,12 @@ static bool visitQualifiedNameLookup(DomItem newIt, QStringList &subpath, visitedRefs); } else { bool cont = scope.visitDirectAccessibleScopes( - [&visitor, subPathNow, lookupType](DomItem &el) -> bool { + [&visitor, subPathNow, lookupType](const DomItem &el) -> bool { if (lookupType == LookupType::Symbol) return el.visitLocalSymbolsNamed(subPathNow, visitor); else return el.visitLocalSymbolsNamed( - subPathNow, [lookupType, &visitor](DomItem &el) -> bool { + subPathNow, [lookupType, &visitor](const DomItem &el) -> bool { return visitForLookupType(el, lookupType, visitor); }); }, @@ -2033,9 +2033,9 @@ static bool visitQualifiedNameLookup(DomItem newIt, QStringList &subpath, return true; } -bool DomItem::visitLookup(QString target, function_ref<bool(DomItem &)> visitor, +bool DomItem::visitLookup(QString target, function_ref<bool(const DomItem &)> visitor, LookupType lookupType, LookupOptions opts, ErrorHandler errorHandler, - QSet<quintptr> *visited, QList<Path> *visitedRefs) + QSet<quintptr> *visited, QList<Path> *visitedRefs) const { if (target.isEmpty()) return true; @@ -2053,7 +2053,7 @@ bool DomItem::visitLookup(QString target, function_ref<bool(DomItem &)> visitor, return visitLookup1( subpath.at(0), [&subpath, visitor, lookupType, &errorHandler, - visitedRefs](DomItem &newIt) -> bool { + visitedRefs](const DomItem &newIt) -> bool { return visitQualifiedNameLookup(newIt, subpath, visitor, lookupType, errorHandler, visitedRefs); }, @@ -2070,8 +2070,8 @@ bool DomItem::visitLookup(QString target, function_ref<bool(DomItem &)> visitor, } if (localQmltypes) { if (DomItem localTypes = localQmltypes.field(Fields::components).key(baseTarget)) { - bool cont = localTypes.visitIndexes([&visitor](DomItem &els) { - return els.visitIndexes([&visitor](DomItem &el) { + bool cont = localTypes.visitIndexes([&visitor](const DomItem &els) { + return els.visitIndexes([&visitor](const DomItem &el) { if (DomItem obj = el.field(Fields::objects).index(0)) return visitor(obj); return true; @@ -2082,10 +2082,10 @@ bool DomItem::visitLookup(QString target, function_ref<bool(DomItem &)> visitor, } } DomItem qmltypes = environment().field(Fields::qmltypesFileWithPath); - return qmltypes.visitKeys([baseTarget, &visitor](QString, DomItem &els) { + return qmltypes.visitKeys([baseTarget, &visitor](QString, const DomItem &els) { DomItem comps = els.field(Fields::currentItem).field(Fields::components).key(baseTarget); - return comps.visitIndexes([&visitor](DomItem &el) { + return comps.visitIndexes([&visitor](const DomItem &el) { if (DomItem obj = el.field(Fields::objects).index(0)) return visitor(obj); return true; @@ -2106,7 +2106,7 @@ bool DomItem::visitLookup(QString target, function_ref<bool(DomItem &)> visitor, Also does multiple rounds of resolving for nested DomItems. Prefer this over \l {DomItem::get}. */ -DomItem DomItem::proceedToScope(ErrorHandler h, QList<Path> *visitedRefs) +DomItem DomItem::proceedToScope(ErrorHandler h, QList<Path> *visitedRefs) const { // follow references, resolve exports DomItem current = *this; @@ -2132,12 +2132,12 @@ DomItem DomItem::proceedToScope(ErrorHandler h, QList<Path> *visitedRefs) } QList<DomItem> DomItem::lookup(QString symbolName, LookupType type, LookupOptions opts, - ErrorHandler errorHandler) + ErrorHandler errorHandler) const { QList<DomItem> res; visitLookup( symbolName, - [&res](DomItem &el) { + [&res](const DomItem &el) { res.append(el); return true; }, @@ -2146,12 +2146,12 @@ QList<DomItem> DomItem::lookup(QString symbolName, LookupType type, LookupOption } DomItem DomItem::lookupFirst(QString symbolName, LookupType type, LookupOptions opts, - ErrorHandler errorHandler) + ErrorHandler errorHandler) const { DomItem res; visitLookup( symbolName, - [&res](DomItem &el) { + [&res](const DomItem &el) { res = el; return false; }, @@ -2159,22 +2159,22 @@ DomItem DomItem::lookupFirst(QString symbolName, LookupType type, LookupOptions return res; } -quintptr DomItem::id() +quintptr DomItem::id() const { return visitEl([](auto &&b) { return b->id(); }); } -Path DomItem::pathFromOwner() +Path DomItem::pathFromOwner() const { return visitEl([this](auto &&e) { return e->pathFromOwner(*this); }); } -QString DomItem::canonicalFilePath() +QString DomItem::canonicalFilePath() const { return visitEl([this](auto &&e) { return e->canonicalFilePath(*this); }); } -DomItem DomItem::fileLocationsTree() +DomItem DomItem::fileLocationsTree() const { if (DomItem l = field(Fields::fileLocationsTree)) return l; @@ -2185,12 +2185,12 @@ DomItem DomItem::fileLocationsTree() return DomItem(); } -DomItem DomItem::fileLocations() +DomItem DomItem::fileLocations() const { return fileLocationsTree().field(Fields::infoItem); } -MutableDomItem DomItem::makeCopy(DomItem::CopyOption option) +MutableDomItem DomItem::makeCopy(DomItem::CopyOption option) const { if (m_kind == DomType::Empty) return MutableDomItem(); @@ -2210,8 +2210,8 @@ MutableDomItem DomItem::makeCopy(DomItem::CopyOption option) newEnvPtr = std::make_shared<DomEnvironment>( envPtr, envPtr->loadPaths(), envPtr->options()); DomBase *eBase = envPtr.get(); - if (std::holds_alternative<DomEnvironment *>(m_element) && eBase - && std::get<DomEnvironment *>(m_element) == eBase) + if (std::holds_alternative<const DomEnvironment *>(m_element) && eBase + && std::get<const DomEnvironment *>(m_element) == eBase) return MutableDomItem(DomItem(newEnvPtr)); } else if (std::shared_ptr<DomUniverse> univPtr = top().ownerAs<DomUniverse>()) { newEnvPtr = std::make_shared<DomEnvironment>( @@ -2268,7 +2268,7 @@ MutableDomItem DomItem::makeCopy(DomItem::CopyOption option) return MutableDomItem(newItem.path(pathFromOwner())); } -bool DomItem::commitToBase(std::shared_ptr<DomEnvironment> validEnvPtr) +bool DomItem::commitToBase(std::shared_ptr<DomEnvironment> validEnvPtr) const { DomItem env = environment(); if (std::shared_ptr<DomEnvironment> envPtr = env.ownerAs<DomEnvironment>()) { @@ -2277,7 +2277,7 @@ bool DomItem::commitToBase(std::shared_ptr<DomEnvironment> validEnvPtr) return false; } -bool DomItem::visitLocalSymbolsNamed(QString name, function_ref<bool(DomItem &)> visitor) +bool DomItem::visitLocalSymbolsNamed(QString name, function_ref<bool(const DomItem &)> visitor) const { if (name.isEmpty()) // no empty symbol return true; @@ -2320,7 +2320,7 @@ bool DomItem::visitLocalSymbolsNamed(QString name, function_ref<bool(DomItem &)> break; case DomType::MethodInfo: { DomItem params = field(Fields::parameters); - if (!params.visitIndexes([name, visitor](DomItem &p) { + if (!params.visitIndexes([name, visitor](const DomItem &p) { const MethodParameter *pPtr = p.as<MethodParameter>(); if (pPtr->name == name && !visitor(p)) return false; @@ -2354,31 +2354,31 @@ bool DomItem::visitLocalSymbolsNamed(QString name, function_ref<bool(DomItem &)> return true; } -DomItem DomItem::operator[](const QString &cName) +DomItem DomItem::operator[](const QString &cName) const { if (internalKind() == DomType::Map) return key(cName); return field(cName); } -DomItem DomItem::operator[](QStringView cName) +DomItem DomItem::operator[](QStringView cName) const { if (internalKind() == DomType::Map) return key(cName.toString()); return field(cName); } -DomItem DomItem::operator[](Path p) +DomItem DomItem::operator[](Path p) const { return path(p); } -QCborValue DomItem::value() +QCborValue DomItem::value() const { return base()->value(); } -void DomItem::dumpPtr(Sink sink) +void DomItem::dumpPtr(Sink sink) const { sink(u"DomItem{ topPtr:"); sink(QString::number((quintptr)topPtr().get(), 16)); @@ -2392,15 +2392,15 @@ void DomItem::dumpPtr(Sink sink) } void DomItem::dump(Sink s, int indent, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)> filter) + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter) const { visitEl([this, s, indent, filter](auto &&e) { e->dump(*this, s, indent, filter); }); } FileWriter::Status DomItem::dump(QString path, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)> filter, - int nBackups, int indent, FileWriter *fw) + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter, + int nBackups, int indent, FileWriter *fw) const { FileWriter localFw; if (!fw) @@ -2423,19 +2423,19 @@ DomItem::dump(QString path, return fw->status; } -QString DomItem::toString() +QString DomItem::toString() const { return dumperToString([this](Sink s){ dump(s); }); } -int DomItem::derivedFrom() +int DomItem::derivedFrom() const { if (m_owner) return std::visit([](auto &&ow) { return ow->derivedFrom(); }, *m_owner); return 0; } -int DomItem::revision() +int DomItem::revision() const { if (m_owner) return std::visit([](auto &&ow) { return ow->revision(); }, *m_owner); @@ -2443,7 +2443,7 @@ int DomItem::revision() return -1; } -QDateTime DomItem::createdAt() +QDateTime DomItem::createdAt() const { if (m_owner) return std::visit([](auto &&ow) { return ow->createdAt(); }, *m_owner); @@ -2451,7 +2451,7 @@ QDateTime DomItem::createdAt() return QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC); } -QDateTime DomItem::frozenAt() +QDateTime DomItem::frozenAt() const { if (m_owner) return std::visit([](auto &&ow) { return ow->frozenAt(); }, *m_owner); @@ -2459,7 +2459,7 @@ QDateTime DomItem::frozenAt() return QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC); } -QDateTime DomItem::lastDataUpdateAt() +QDateTime DomItem::lastDataUpdateAt() const { if (m_owner) return std::visit([](auto &&ow) { return ow->lastDataUpdateAt(); }, *m_owner); @@ -2467,7 +2467,7 @@ QDateTime DomItem::lastDataUpdateAt() return QDateTime::fromMSecsSinceEpoch(0, QTimeZone::UTC); } -void DomItem::addError(ErrorMessage msg) +void DomItem::addError(ErrorMessage msg) const { if (m_owner) { DomItem myOwner = owner(); @@ -2478,13 +2478,13 @@ void DomItem::addError(ErrorMessage msg) defaultErrorHandler(msg.withItem(*this)); } -ErrorHandler DomItem::errorHandler() +ErrorHandler DomItem::errorHandler() const { DomItem self = *this; return [self](ErrorMessage m) mutable { self.addError(m); }; } -void DomItem::clearErrors(ErrorGroups groups, bool iterate) +void DomItem::clearErrors(ErrorGroups groups, bool iterate) const { if (m_owner) { std::visit([&groups](auto &&ow) { ow->clearErrors(groups); }, *m_owner); @@ -2496,8 +2496,8 @@ void DomItem::clearErrors(ErrorGroups groups, bool iterate) } } -bool DomItem::iterateErrors(function_ref<bool(DomItem, ErrorMessage)> visitor, bool iterate, - Path inPath) +bool DomItem::iterateErrors(function_ref<bool(const DomItem &, ErrorMessage)> visitor, bool iterate, + Path inPath) const { if (m_owner) { DomItem ow = owner(); @@ -2505,7 +2505,7 @@ bool DomItem::iterateErrors(function_ref<bool(DomItem, ErrorMessage)> visitor, b inPath](auto &&el) { return el->iterateErrors(ow, visitor, inPath); }, *m_owner)) return false; - if (iterate && !iterateSubOwners([inPath, visitor](DomItem &i) { + if (iterate && !iterateSubOwners([inPath, visitor](const DomItem &i) { return i.iterateErrors(visitor, true, inPath); })) return false; @@ -2513,7 +2513,7 @@ bool DomItem::iterateErrors(function_ref<bool(DomItem, ErrorMessage)> visitor, b return true; } -bool DomItem::iterateSubOwners(function_ref<bool(DomItem &)> visitor) +bool DomItem::iterateSubOwners(function_ref<bool(const DomItem &)> visitor) const { if (m_owner) { DomItem ow = owner(); @@ -2523,22 +2523,22 @@ bool DomItem::iterateSubOwners(function_ref<bool(DomItem &)> visitor) return true; } -bool DomItem::iterateDirectSubpaths(DirectVisitor v) +bool DomItem::iterateDirectSubpaths(DirectVisitor v) const { - return visitMutableEl( - [this, v](auto &&el) mutable { return el->iterateDirectSubpaths(*this, v); }); + return visitEl( + [this, v](auto &&el) { return el->iterateDirectSubpaths(*this, v); }); } -DomItem DomItem::subReferencesItem(const PathEls::PathComponent &c, QList<Path> paths) +DomItem DomItem::subReferencesItem(const PathEls::PathComponent &c, QList<Path> paths) const { return subListItem( List::fromQList<Path>(pathFromOwner().appendComponent(c), paths, - [](DomItem &list, const PathEls::PathComponent &p, Path &el) { + [](const DomItem &list, const PathEls::PathComponent &p, const Path &el) { return list.subReferenceItem(p, el); })); } -DomItem DomItem::subReferenceItem(const PathEls::PathComponent &c, Path referencedObject) +DomItem DomItem::subReferenceItem(const PathEls::PathComponent &c, Path referencedObject) const { if (domTypeIsOwningItem(internalKind())) { return DomItem(m_top, m_owner, m_ownerPath, Reference(referencedObject, Path(c))); @@ -2548,14 +2548,14 @@ DomItem DomItem::subReferenceItem(const PathEls::PathComponent &c, Path referenc } } -shared_ptr<DomTop> DomItem::topPtr() +shared_ptr<DomTop> DomItem::topPtr() const { if (m_top) return std::visit([](auto &&el) -> shared_ptr<DomTop> { return el; }, *m_top); return {}; } -shared_ptr<OwningItem> DomItem::owningItemPtr() +shared_ptr<OwningItem> DomItem::owningItemPtr() const { if (m_owner) return std::visit([](auto &&el) -> shared_ptr<OwningItem> { return el; }, *m_owner); @@ -2571,15 +2571,6 @@ const DomBase *DomItem::base() const return visitEl([](auto &&el) -> const DomBase * { return el->domBase(); }); } -/*! - \internal - Returns a pointer to the virtual base pointer to a DomBase. -*/ -DomBase *DomItem::mutableBase() -{ - return visitMutableEl([](auto &&el) -> DomBase * { return el->domBase(); }); -} - DomItem::DomItem(std::shared_ptr<DomEnvironment> envPtr): DomItem(envPtr, envPtr, Path(), envPtr.get()) { @@ -2591,7 +2582,7 @@ DomItem::DomItem(std::shared_ptr<DomUniverse> universePtr): } void DomItem::loadFile(const FileToLoad &file, DomTop::Callback callback, LoadOptions loadOptions, - std::optional<DomType> fileType) + std::optional<DomType> fileType) const { DomItem topEl = top(); if (topEl.internalKind() == DomType::DomEnvironment @@ -2614,8 +2605,8 @@ void DomItem::loadFile(const FileToLoad &file, DomTop::Callback callback, LoadOp } void DomItem::loadModuleDependency(QString uri, Version version, - std::function<void(Path, DomItem &, DomItem &)> callback, - ErrorHandler errorHandler) + std::function<void(Path, const DomItem &, const DomItem &)> callback, + ErrorHandler errorHandler) const { DomItem topEl = top(); if (topEl.internalKind() == DomType::DomEnvironment) { @@ -2632,7 +2623,7 @@ void DomItem::loadModuleDependency(QString uri, Version version, } } -void DomItem::loadBuiltins(std::function<void(Path, DomItem &, DomItem &)> callback, ErrorHandler h) +void DomItem::loadBuiltins(std::function<void(Path, const DomItem &, const DomItem &)> callback, ErrorHandler h) const { DomItem env = environment(); if (std::shared_ptr<DomEnvironment> envPtr = env.ownerAs<DomEnvironment>()) @@ -2641,7 +2632,7 @@ void DomItem::loadBuiltins(std::function<void(Path, DomItem &, DomItem &)> callb myErrors().error(tr("Cannot load builtins without DomEnvironment")).handle(h); } -void DomItem::loadPendingDependencies() +void DomItem::loadPendingDependencies() const { DomItem env = environment(); if (std::shared_ptr<DomEnvironment> envPtr = env.ownerAs<DomEnvironment>()) @@ -2680,28 +2671,28 @@ DomItem DomItem::fromCode(QString code, DomType fileType) Empty::Empty() {} -Path Empty::pathFromOwner(DomItem &) const +Path Empty::pathFromOwner(const DomItem &) const { return Path(); } -Path Empty::canonicalPath(DomItem &) const +Path Empty::canonicalPath(const DomItem &) const { return Path(); } -bool Empty::iterateDirectSubpaths(DomItem &, DirectVisitor) +bool Empty::iterateDirectSubpaths(const DomItem &, DirectVisitor) const { return true; } -DomItem Empty::containingObject(DomItem &self) const +DomItem Empty::containingObject(const DomItem &self) const { return self; } -void Empty::dump(DomItem &, Sink s, int, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)>) const +void Empty::dump(const DomItem &, Sink s, int, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)>) const { s(u"null"); } @@ -2715,7 +2706,7 @@ quintptr Map::id() const return quintptr(0); } -bool Map::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool Map::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { QSet<QString> ksSet = keys(self); QStringList ksList = QStringList(ksSet.begin(), ksSet.end()); @@ -2727,19 +2718,19 @@ bool Map::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return true; } -const QSet<QString> Map::keys(DomItem &self) const +const QSet<QString> Map::keys(const DomItem &self) const { return m_keys(self); } -DomItem Map::key(DomItem &self, QString name) const +DomItem Map::key(const DomItem &self, QString name) const { return m_lookup(self, name); } void DomBase::dump( - DomItem &self, Sink sink, int indent, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)> filter) const + const DomItem &self, Sink sink, int indent, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter) const { bool comma = false; DomKind dK = self.domKind(); @@ -2869,12 +2860,12 @@ quintptr List::id() const } void List::dump( - DomItem &self, Sink sink, int indent, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)> filter) const + const DomItem &self, Sink sink, int indent, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter) const { bool first = true; sink(u"["); - const_cast<List *>(this)->iterateDirectSubpaths( + iterateDirectSubpaths( self, [&self, indent, &first, sink, filter](const PathEls::PathComponent &c, function_ref<DomItem()> itemF) { @@ -2892,7 +2883,7 @@ void List::dump( sink(u"]"); } -bool List::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool List::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { if (m_iterator) { return m_iterator(self, [visitor](index_type i, function_ref<DomItem()> itemF) { @@ -2907,22 +2898,22 @@ bool List::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return true; } -index_type List::indexes(DomItem &self) const +index_type List::indexes(const DomItem &self) const { return m_length(self); } -DomItem List::index(DomItem &self, index_type index) const +DomItem List::index(const DomItem &self, index_type index) const { return m_lookup(self, index); } -void List::writeOut(DomItem &self, OutWriter &ow, bool compact) const +void List::writeOut(const DomItem &self, OutWriter &ow, bool compact) const { ow.writeRegion(u"leftSquareBrace", u"["); int baseIndent = ow.increaseIndent(1); bool first = true; - const_cast<List *>(this)->iterateDirectSubpaths( + iterateDirectSubpaths( self, [&ow, &first, compact](const PathEls::PathComponent &, function_ref<DomItem()> elF) { if (first) @@ -2943,19 +2934,19 @@ void List::writeOut(DomItem &self, OutWriter &ow, bool compact) const DomElement::DomElement(Path pathFromOwner) : m_pathFromOwner(pathFromOwner) { } -Path DomElement::pathFromOwner(DomItem &) const +Path DomElement::pathFromOwner(const DomItem &) const { Q_ASSERT(m_pathFromOwner && "uninitialized DomElement"); return m_pathFromOwner; } -Path DomElement::canonicalPath(DomItem &self) const +Path DomElement::canonicalPath(const DomItem &self) const { Q_ASSERT(m_pathFromOwner && "uninitialized DomElement"); return self.owner().canonicalPath().path(m_pathFromOwner); } -DomItem DomElement::containingObject(DomItem &self) const +DomItem DomElement::containingObject(const DomItem &self) const { Q_ASSERT(m_pathFromOwner && "uninitialized DomElement"); return DomBase::containingObject(self); @@ -3004,7 +2995,7 @@ quintptr Reference::id() const return quintptr(0); } -bool Reference::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool Reference::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvValueLazyField(visitor, Fields::referredObjectPath, [this]() { @@ -3015,7 +3006,7 @@ bool Reference::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -DomItem Reference::field(DomItem &self, QStringView name) const +DomItem Reference::field(const DomItem &self, QStringView name) const { if (Fields::referredObjectPath == name) return self.subDataItemField(Fields::referredObjectPath, referredObjectPath.toString()); @@ -3024,22 +3015,22 @@ DomItem Reference::field(DomItem &self, QStringView name) const return DomItem(); } -QList<QString> Reference::fields(DomItem &) const +QList<QString> Reference::fields(const DomItem &) const { return QList<QString>({QString::fromUtf16(Fields::referredObjectPath), QString::fromUtf16(Fields::get)}); } -DomItem Reference::index(DomItem &, index_type) const +DomItem Reference::index(const DomItem &, index_type) const { return DomItem(); } -DomItem Reference::key(DomItem &, QString) const +DomItem Reference::key(const DomItem &, QString) const { return DomItem(); } -DomItem Reference::get(DomItem &self, ErrorHandler h, QList<Path> *visitedRefs) const +DomItem Reference::get(const DomItem &self, ErrorHandler h, QList<Path> *visitedRefs) const { DomItem res; if (referredObjectPath) { @@ -3075,7 +3066,7 @@ DomItem Reference::get(DomItem &self, ErrorHandler h, QList<Path> *visitedRefs) QList<Path> visitedRefsLocal; self.resolve( referredObjectPath, - [&res](Path, DomItem &el) { + [&res](Path, const DomItem &el) { res = el; return false; }, @@ -3088,7 +3079,7 @@ DomItem Reference::get(DomItem &self, ErrorHandler h, QList<Path> *visitedRefs) return res; } -QList<DomItem> Reference::getAll(DomItem &self, ErrorHandler h, QList<Path> *visitedRefs) const +QList<DomItem> Reference::getAll(const DomItem &self, ErrorHandler h, QList<Path> *visitedRefs) const { QList<DomItem> res; if (referredObjectPath) { @@ -3130,7 +3121,7 @@ QList<DomItem> Reference::getAll(DomItem &self, ErrorHandler h, QList<Path> *vis } self.resolve( referredObjectPath, - [&res](Path, DomItem &el) { + [&res](Path, const DomItem &el) { res.append(el); return true; }, @@ -3210,14 +3201,14 @@ int OwningItem::nextRevision() return ++nextRev; } -bool OwningItem::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool OwningItem::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvItemField(visitor, Fields::errors, [&self, this]() { QMultiMap<Path, ErrorMessage> myErrors = localErrors(); return self.subMapItem(Map( self.pathFromOwner().field(Fields::errors), - [myErrors](DomItem &map, QString key) { + [myErrors](const DomItem &map, QString key) { auto it = myErrors.find(Path::fromString(key)); if (it != myErrors.end()) return map.subDataItem(PathEls::Key(key), it->toCbor(), @@ -3225,7 +3216,7 @@ bool OwningItem::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) else return DomItem(); }, - [myErrors](DomItem &) { + [myErrors](const DomItem &) { QSet<QString> res; auto it = myErrors.keyBegin(); auto end = myErrors.keyEnd(); @@ -3238,7 +3229,7 @@ bool OwningItem::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -DomItem OwningItem::containingObject(DomItem &self) const +DomItem OwningItem::containingObject(const DomItem &self) const { Source s = self.canonicalPath().split(); if (s.pathFromSource) { @@ -3296,7 +3287,7 @@ void OwningItem::refreshedDataAt(QDateTime tNew) m_lastDataUpdateAt = tNew; } -void OwningItem::addError(DomItem &, ErrorMessage msg) +void OwningItem::addError(const DomItem &, ErrorMessage msg) { addErrorLocal(msg); } @@ -3322,8 +3313,9 @@ void OwningItem::clearErrors(ErrorGroups groups) } } -bool OwningItem::iterateErrors(DomItem &self, function_ref<bool(DomItem, ErrorMessage)> visitor, - Path inPath) +bool OwningItem::iterateErrors( + const DomItem &self, function_ref<bool(const DomItem &, ErrorMessage)> visitor, + Path inPath) { QMultiMap<Path, ErrorMessage> myErrors; { @@ -3339,7 +3331,7 @@ bool OwningItem::iterateErrors(DomItem &self, function_ref<bool(DomItem, ErrorMe return true; } -bool OwningItem::iterateSubOwners(DomItem &self, function_ref<bool(DomItem &owner)> visitor) +bool OwningItem::iterateSubOwners(const DomItem &self, function_ref<bool(const DomItem &owner)> visitor) { return self.iterateDirectSubpaths( [&self, visitor](const PathEls::PathComponent &, function_ref<DomItem()> iF) { @@ -3353,13 +3345,11 @@ bool OwningItem::iterateSubOwners(DomItem &self, function_ref<bool(DomItem &owne }); } -bool operator==(const DomItem &o1c, const DomItem &o2c) +bool operator==(const DomItem &o1, const DomItem &o2) { - DomItem &o1 = *const_cast<DomItem *>(&o1c); - DomItem &o2 = *const_cast<DomItem *>(&o2c); if (o1.m_kind != o2.m_kind) return false; - return o1.visitMutableEl([&o1, &o2](auto &&el1) { + return o1.visitEl([&o1, &o2](auto &&el1) { auto &&el2 = std::get<std::decay_t<decltype(el1)>>(o2.m_element); auto id1 = el1->id(); auto id2 = el2->id(); @@ -3658,7 +3648,7 @@ MutableDomItem MutableDomItem::addPostComment(const Comment &comment, QString re QDebug operator<<(QDebug debug, const DomItem &c) { - dumperToQDebug([&c](Sink s) { const_cast<DomItem *>(&c)->dump(s); }, debug); + dumperToQDebug([&c](Sink s) { c.dump(s); }, debug); return debug; } @@ -3669,7 +3659,7 @@ QDebug operator<<(QDebug debug, const MutableDomItem &c) << ", " << cc.canonicalPath().toString() << ")"; } -bool ListPBase::iterateDirectSubpaths(DomItem &self, DirectVisitor v) +bool ListPBase::iterateDirectSubpaths(const DomItem &self, DirectVisitor v) const { index_type len = index_type(m_pList.size()); for (index_type i = 0; i < len; ++i) { @@ -3679,7 +3669,7 @@ bool ListPBase::iterateDirectSubpaths(DomItem &self, DirectVisitor v) return true; } -void ListPBase::writeOut(DomItem &self, OutWriter &ow, bool compact) const +void ListPBase::writeOut(const DomItem &self, OutWriter &ow, bool compact) const { ow.writeRegion(u"leftSquareBrace", u"["); int baseIndent = ow.increaseIndent(1); @@ -3710,6 +3700,26 @@ void ScriptElement::setSemanticScope(const QQmlJSScope::Ptr &scope) m_scope = scope; } +/*! + \internal + \brief Returns a pointer to the virtual base for virtual method calls. + + A helper to call virtual methods without having to call std::visit(...). + */ +ScriptElement::PointerType<ScriptElement> ScriptElementVariant::base() const +{ + if (!m_data) + return nullptr; + + return std::visit( + [](auto &&e) { + // std::reinterpret_pointer_cast does not exist on qnx it seems... + return std::shared_ptr<ScriptElement>( + e, static_cast<ScriptElement *>(e.get())); + }, + *m_data); +} + } // end namespace Dom } // end namespace QQmlJS diff --git a/src/qmldom/qqmldomitem_p.h b/src/qmldom/qqmldomitem_p.h index 2f4999d31e..d3b2c2e29c 100644 --- a/src/qmldom/qqmldomitem_p.h +++ b/src/qmldom/qqmldomitem_p.h @@ -90,13 +90,13 @@ QMLDOM_EXPORT QString domKindToString(DomKind k); QMLDOM_EXPORT QCborValue locationToData(SourceLocation loc, QStringView strValue=u""); -inline bool noFilter(DomItem &, const PathEls::PathComponent &, DomItem &) +inline bool noFilter(const DomItem &, const PathEls::PathComponent &, const DomItem &) { return true; } using DirectVisitor = function_ref<bool(const PathEls::PathComponent &, function_ref<DomItem()>)>; -// using DirectVisitor = function_ref<bool(Path, DomItem &)>; +// using DirectVisitor = function_ref<bool(Path, const DomItem &)>; namespace { template<typename T> @@ -179,8 +179,11 @@ template<typename T> union SubclassStorage { int i; T lp; + + // TODO: these are extremely nasty. What is this int doing in here? T *data() { return reinterpret_cast<T *>(this); } const T *data() const { return reinterpret_cast<const T *>(this); } + SubclassStorage() { } SubclassStorage(T &&el) { el.moveTo(data()); } SubclassStorage(const T *el) { el->copyTo(data()); } @@ -198,43 +201,44 @@ union SubclassStorage { class QMLDOM_EXPORT DomBase { public: - using FilterT = function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)>; + using FilterT = function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)>; virtual ~DomBase() = default; - DomBase *domBase() { return static_cast<DomBase *>(this); } + DomBase *domBase() { return this; } const DomBase *domBase() const { return this; } // minimal overload set: virtual DomType kind() const = 0; virtual DomKind domKind() const; - virtual Path pathFromOwner(DomItem &self) const = 0; - virtual Path canonicalPath(DomItem &self) const = 0; + virtual Path pathFromOwner(const DomItem &self) const = 0; + virtual Path canonicalPath(const DomItem &self) const = 0; virtual bool - iterateDirectSubpaths(DomItem &self, - DirectVisitor visitor) = 0; // iterates the *direct* subpaths, returns - // false if a quick end was requested - bool iterateDirectSubpathsConst(DomItem &self, DirectVisitor) + iterateDirectSubpaths(const DomItem &self, + DirectVisitor visitor) const = 0; // iterates the *direct* subpaths, returns + // false if a quick end was requested + + bool iterateDirectSubpathsConst(const DomItem &self, DirectVisitor) const; // iterates the *direct* subpaths, returns false if a quick end was requested virtual DomItem containingObject( - DomItem &self) const; // the DomItem corresponding to the canonicalSource source - virtual void dump(DomItem &, Sink sink, int indent, FilterT filter) const; + const DomItem &self) const; // the DomItem corresponding to the canonicalSource source + virtual void dump(const DomItem &, Sink sink, int indent, FilterT filter) const; virtual quintptr id() const; QString typeName() const; - virtual QList<QString> fields(DomItem &self) const; - virtual DomItem field(DomItem &self, QStringView name) const; + virtual QList<QString> fields(const DomItem &self) const; + virtual DomItem field(const DomItem &self, QStringView name) const; - virtual index_type indexes(DomItem &self) const; - virtual DomItem index(DomItem &self, index_type index) const; + virtual index_type indexes(const DomItem &self) const; + virtual DomItem index(const DomItem &self, index_type index) const; - virtual QSet<QString> const keys(DomItem &self) const; - virtual DomItem key(DomItem &self, QString name) const; + virtual QSet<QString> const keys(const DomItem &self) const; + virtual DomItem key(const DomItem &self, QString name) const; - virtual QString canonicalFilePath(DomItem &self) const; + virtual QString canonicalFilePath(const DomItem &self) const; - virtual void writeOut(DomItem &self, OutWriter &lw) const; + virtual void writeOut(const DomItem &self, OutWriter &lw) const; virtual QCborValue value() const { return QCborValue(); @@ -271,12 +275,12 @@ public: Empty(); quintptr id() const override { return ~quintptr(0); } - Path pathFromOwner(DomItem &self) const override; - Path canonicalPath(DomItem &self) const override; - DomItem containingObject(DomItem &self) const override; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; - void dump(DomItem &, Sink s, int indent, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)> filter) + Path pathFromOwner(const DomItem &self) const override; + Path canonicalPath(const DomItem &self) const override; + DomItem containingObject(const DomItem &self) const override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; + void dump(const DomItem &, Sink s, int indent, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter) const override; }; @@ -286,10 +290,10 @@ protected: public: DomElement(Path pathFromOwner = Path()); DomElement(const DomElement &o) = default; - Path pathFromOwner(DomItem &self) const override; + Path pathFromOwner(const DomItem &self) const override; Path pathFromOwner() const { return m_pathFromOwner; } - Path canonicalPath(DomItem &self) const override; - DomItem containingObject(DomItem &self) const override; + Path canonicalPath(const DomItem &self) const override; + DomItem containingObject(const DomItem &self) const override; virtual void updatePathFromOwner(Path newPath); private: @@ -307,20 +311,20 @@ public: Map &operator*() { return *this; } const Map &operator*() const { return *this; } - using LookupFunction = std::function<DomItem(DomItem &, QString)>; - using Keys = std::function<QSet<QString>(DomItem &)>; + using LookupFunction = std::function<DomItem(const DomItem &, QString)>; + using Keys = std::function<QSet<QString>(const DomItem &)>; Map(Path pathFromOwner, LookupFunction lookup, Keys keys, QString targetType); quintptr id() const override; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; - QSet<QString> const keys(DomItem &self) const override; - DomItem key(DomItem &self, QString name) const override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; + QSet<QString> const keys(const DomItem &self) const override; + DomItem key(const DomItem &self, QString name) const override; template<typename T> - static Map fromMultiMapRef(Path pathFromOwner, QMultiMap<QString, T> &mmap); + static Map fromMultiMapRef(Path pathFromOwner, const QMultiMap<QString, T> &mmap); template<typename T> static Map - fromMapRef(Path pathFromOwner, QMap<QString, T> &mmap, - std::function<DomItem(DomItem &, const PathEls::PathComponent &, T &)> elWrapper); + fromMapRef(Path pathFromOwner, const QMap<QString, T> &mmap, + std::function<DomItem(const DomItem &, const PathEls::PathComponent &, const T &)> elWrapper); private: LookupFunction m_lookup; @@ -339,32 +343,32 @@ public: List &operator*() { return *this; } const List &operator*() const { return *this; } - using LookupFunction = std::function<DomItem(DomItem &, index_type)>; - using Length = std::function<index_type(DomItem &)>; + using LookupFunction = std::function<DomItem(const DomItem &, index_type)>; + using Length = std::function<index_type(const DomItem &)>; using IteratorFunction = - std::function<bool(DomItem &, function_ref<bool(index_type, function_ref<DomItem()>)>)>; + std::function<bool(const DomItem &, function_ref<bool(index_type, function_ref<DomItem()>)>)>; List(Path pathFromOwner, LookupFunction lookup, Length length, IteratorFunction iterator, QString elType); quintptr id() const override; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; void - dump(DomItem &, Sink s, int indent, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)>) const override; - index_type indexes(DomItem &self) const override; - DomItem index(DomItem &self, index_type index) const override; + dump(const DomItem &, Sink s, int indent, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)>) const override; + index_type indexes(const DomItem &self) const override; + DomItem index(const DomItem &self, index_type index) const override; template<typename T> static List fromQList(Path pathFromOwner, QList<T> list, - std::function<DomItem(DomItem &, const PathEls::PathComponent &, T &)> elWrapper, + std::function<DomItem(const DomItem &, const PathEls::PathComponent &, const T &)> elWrapper, ListOptions options = ListOptions::Normal); template<typename T> static List - fromQListRef(Path pathFromOwner, QList<T> &list, - std::function<DomItem(DomItem &, const PathEls::PathComponent &, T &)> elWrapper, + fromQListRef(Path pathFromOwner, const QList<T> &list, + std::function<DomItem(const DomItem &, const PathEls::PathComponent &, const T &)> elWrapper, ListOptions options = ListOptions::Normal); - void writeOut(DomItem &self, OutWriter &ow, bool compact) const; - void writeOut(DomItem &self, OutWriter &ow) const override { writeOut(self, ow, true); } + void writeOut(const DomItem &self, OutWriter &ow, bool compact) const; + void writeOut(const DomItem &self, OutWriter &ow) const override { writeOut(self, ow, true); } private: LookupFunction m_lookup; @@ -379,20 +383,20 @@ public: constexpr static DomType kindValue = DomType::ListP; DomType kind() const override { return kindValue; } - ListPBase(Path pathFromOwner, const QList<void *> &pList, QString elType) + ListPBase(Path pathFromOwner, const QList<const void *> &pList, QString elType) : DomElement(pathFromOwner), m_pList(pList), m_elType(elType) { } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor v) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor v) const override; virtual void copyTo(ListPBase *) const { Q_ASSERT(false); }; virtual void moveTo(ListPBase *) const { Q_ASSERT(false); }; quintptr id() const override { return quintptr(0); } - index_type indexes(DomItem &) const override { return index_type(m_pList.size()); } - void writeOut(DomItem &self, OutWriter &ow, bool compact) const; - void writeOut(DomItem &self, OutWriter &ow) const override { writeOut(self, ow, true); } + index_type indexes(const DomItem &) const override { return index_type(m_pList.size()); } + void writeOut(const DomItem &self, OutWriter &ow, bool compact) const; + void writeOut(const DomItem &self, OutWriter &ow) const override { writeOut(self, ow, true); } protected: - QList<void *> m_pList; + QList<const void *> m_pList; QString m_elType; }; @@ -413,7 +417,7 @@ public: "ListPT does not have the same size as ListPBase"); m_pList.reserve(pList.size()); if (options == ListOptions::Normal) { - for (void *p : pList) + for (const void *p : pList) m_pList.append(p); } else if (options == ListOptions::Reverse) { for (qsizetype i = pList.size(); i-- != 0;) @@ -425,9 +429,9 @@ public: } void copyTo(ListPBase *t) const override { new (t) ListPT(*this); } void moveTo(ListPBase *t) const override { new (t) ListPT(std::move(*this)); } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor v) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor v) const override; - DomItem index(DomItem &self, index_type index) const override; + DomItem index(const DomItem &self, index_type index) const override; }; class QMLDOM_EXPORT ListP @@ -468,7 +472,7 @@ public: const ConstantData &operator*() const { return *this; } ConstantData(Path pathFromOwner, QCborValue value, Options options = Options::MapIsMap); - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; quintptr id() const override; DomKind domKind() const override; QCborValue value() const override { return m_value; } @@ -492,29 +496,17 @@ public: { if (m_options & SimpleWrapOption::ValueType) { if (m_value.metaType() == QMetaType::fromType<T>()) - return reinterpret_cast<const T *>(m_value.constData()); - return nullptr; - } else { - return m_value.value<T *>(); - } - } - - template <typename T> - T *mutableAs() - { - if (m_options & SimpleWrapOption::ValueType) { - if (m_value.metaType() == QMetaType::fromType<T>()) - return reinterpret_cast<T *>(m_value.data()); + return static_cast<const T *>(m_value.constData()); return nullptr; } else { - return m_value.value<T *>(); + return m_value.value<const T *>(); } } SimpleObjectWrapBase() = delete; virtual void copyTo(SimpleObjectWrapBase *) const { Q_ASSERT(false); } virtual void moveTo(SimpleObjectWrapBase *) const { Q_ASSERT(false); } - bool iterateDirectSubpaths(DomItem &, DirectVisitor) override + bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override { Q_ASSERT(false); return true; @@ -547,21 +539,21 @@ class SimpleObjectWrapT final : public SimpleObjectWrapBase public: constexpr static DomType kindValue = DomType::SimpleObjectWrap; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override { - return mutableAsT()->iterateDirectSubpaths(self, visitor); + return asT()->iterateDirectSubpaths(self, visitor); } - void writeOut(DomItem &self, OutWriter &lw) const override; + void writeOut(const DomItem &self, OutWriter &lw) const override; - T const *asT() const + const T *asT() const { if constexpr (domTypeIsValueWrap(T::kindValue)) { if (m_value.metaType() == QMetaType::fromType<T>()) - return reinterpret_cast<const T *>(m_value.constData()); + return static_cast<const T *>(m_value.constData()); return nullptr; } else if constexpr (domTypeIsObjWrap(T::kindValue)) { - return m_value.value<T *>(); + return m_value.value<const T *>(); } else { // need dependent static assert to not unconditially trigger static_assert(!std::is_same_v<T, T>, "wrapping of unexpected type"); @@ -569,20 +561,6 @@ public: } } - T *mutableAsT() - { - if (domTypeIsValueWrap(T::kindValue)) { - if (m_value.metaType() == QMetaType::fromType<T>()) - return reinterpret_cast<T *>(m_value.data()); - return nullptr; - } else if constexpr (domTypeIsObjWrap(T::kindValue)) { - return m_value.value<T *>(); - } else { - Q_ASSERT_X(false, "SimpleObjectWrap", "wrapping of unexpected type"); - return nullptr; - } - } - void copyTo(SimpleObjectWrapBase *target) const override { static_assert(sizeof(SimpleObjectWrapBase) == sizeof(SimpleObjectWrapT), @@ -663,16 +641,16 @@ public: bool shouldCache() const; Reference(Path referredObject = Path(), Path pathFromOwner = Path(), const SourceLocation & loc = SourceLocation()); quintptr id() const override; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; - DomItem field(DomItem &self, QStringView name) const override; - QList<QString> fields(DomItem &self) const override; - index_type indexes(DomItem &) const override { return 0; } - DomItem index(DomItem &, index_type) const override; - QSet<QString> const keys(DomItem &) const override { return {}; } - DomItem key(DomItem &, QString) const override; - - DomItem get(DomItem &self, ErrorHandler h = nullptr, QList<Path> *visitedRefs = nullptr) const; - QList<DomItem> getAll(DomItem &self, ErrorHandler h = nullptr, + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; + DomItem field(const DomItem &self, QStringView name) const override; + QList<QString> fields(const DomItem &self) const override; + index_type indexes(const DomItem &) const override { return 0; } + DomItem index(const DomItem &, index_type) const override; + QSet<QString> const keys(const DomItem &) const override { return {}; } + DomItem key(const DomItem &, QString) const override; + + DomItem get(const DomItem &self, ErrorHandler h = nullptr, QList<Path> *visitedRefs = nullptr) const; + QList<DomItem> getAll(const DomItem &self, ErrorHandler h = nullptr, QList<Path> *visitedRefs = nullptr) const; Path referredObjectPath; @@ -745,24 +723,7 @@ public: return p; } - /*! - \internal - \brief Returns a pointer to the virtual base for virtual method calls. - - A helper to call virtual methods without having to call std::visit(...). - */ - ScriptElement::PointerType<ScriptElement> base() const - { - if (m_data) - return std::visit( - [](auto &&e) { - // std::reinterpret_pointer_cast does not exist on qnx it seems... - return std::shared_ptr<ScriptElement>( - e, reinterpret_cast<ScriptElement *>(e.get())); - }, - *m_data); - return nullptr; - } + ScriptElement::PointerType<ScriptElement> base() const; operator bool() const { return m_data.has_value(); } @@ -805,7 +766,7 @@ public: DomBase &operator*() { return *m_element.base(); } const DomBase &operator*() const { return *m_element.base(); } - ScriptElementVariant element() { return m_element; } + ScriptElementVariant element() const { return m_element; } private: ScriptElementVariant m_element; @@ -813,13 +774,40 @@ private: // TODO: create more "groups" to simplify this variant? Maybe into Internal, ScriptExpression, ??? using ElementT = - std::variant<Empty, Map, List, ListP, ConstantData, SimpleObjectWrap, Reference, - ScriptElementDomWrapper, GlobalComponent *, JsResource *, QmlComponent *, - QmltypesComponent *, EnumDecl *, MockObject *, ModuleScope *, AstComments *, - AttachedInfo *, DomEnvironment *, DomUniverse *, ExternalItemInfoBase *, - ExternalItemPairBase *, GlobalScope *, JsFile *, QmlDirectory *, QmlFile *, - QmldirFile *, QmlObject *, QmltypesFile *, LoadInfo *, MockOwner *, - ModuleIndex *, ScriptExpression *>; + std::variant< + ConstantData, + Empty, + List, + ListP, + Map, + Reference, + ScriptElementDomWrapper, + SimpleObjectWrap, + const AstComments *, + const AttachedInfo *, + 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 * + >; using TopT = std::variant<std::shared_ptr<DomEnvironment>, std::shared_ptr<DomUniverse>>; @@ -833,7 +821,7 @@ using OwnerT = std::shared_ptr<LoadInfo>, std::shared_ptr<AttachedInfo>, std::shared_ptr<DomEnvironment>, std::shared_ptr<DomUniverse>>; -inline bool emptyChildrenVisitor(Path, DomItem &, bool) +inline bool emptyChildrenVisitor(Path, const DomItem &, bool) { return true; } @@ -886,11 +874,11 @@ private: class QMLDOM_EXPORT DomItem { Q_DECLARE_TR_FUNCTIONS(DomItem); public: - using Callback = function<void(Path, DomItem &, DomItem &)>; + using Callback = function<void(Path, const DomItem &, const DomItem &)>; using InternalKind = DomType; - using Visitor = function_ref<bool(Path, DomItem &)>; - using ChildrenVisitor = function_ref<bool(Path, DomItem &, bool)>; + using Visitor = function_ref<bool(Path, const DomItem &)>; + using ChildrenVisitor = function_ref<bool(Path, const DomItem &, bool)>; static ErrorGroup domErrorGroup; static ErrorGroups myErrors(); @@ -900,11 +888,6 @@ public: enum class CopyOption { EnvConnected, EnvDisconnected }; template<typename F> - auto visitMutableEl(F f) - { - return std::visit(f, this->m_element); - } - template<typename F> auto visitEl(F f) const { return std::visit(f, this->m_element); @@ -923,54 +906,54 @@ public: return kind2domKind(m_kind); } - Path canonicalPath(); + Path canonicalPath() const; - DomItem filterUp(function_ref<bool(DomType k, DomItem &)> filter, FilterUpOptions options); - DomItem containingObject(); - DomItem container(); - DomItem owner(); - DomItem top(); - DomItem environment(); - DomItem universe(); - DomItem containingFile(); - DomItem goToFile(const QString &filePath); - DomItem goUp(int); - DomItem directParent(); + DomItem filterUp(function_ref<bool(DomType k, const DomItem &)> filter, FilterUpOptions options) const; + DomItem containingObject() const; + DomItem container() const; + DomItem owner() const; + DomItem top() const; + DomItem environment() const; + DomItem universe() const; + DomItem containingFile() const; + DomItem goToFile(const QString &filePath) const; + DomItem goUp(int) const; + DomItem directParent() const; DomItem qmlObject(GoTo option = GoTo::Strict, - FilterUpOptions options = FilterUpOptions::ReturnOuter); - DomItem fileObject(GoTo option = GoTo::Strict); - DomItem rootQmlObject(GoTo option = GoTo::Strict); - DomItem globalScope(); - DomItem component(GoTo option = GoTo::Strict); - DomItem scope(FilterUpOptions options = FilterUpOptions::ReturnOuter); - std::optional<QQmlJSScope::Ptr> nearestSemanticScope(); - std::optional<QQmlJSScope::Ptr> semanticScope(); + FilterUpOptions options = FilterUpOptions::ReturnOuter) const; + DomItem fileObject(GoTo option = GoTo::Strict) const; + DomItem rootQmlObject(GoTo option = GoTo::Strict) const; + DomItem globalScope() const; + DomItem component(GoTo option = GoTo::Strict) const; + DomItem scope(FilterUpOptions options = FilterUpOptions::ReturnOuter) const; + std::optional<QQmlJSScope::Ptr> nearestSemanticScope() const; + std::optional<QQmlJSScope::Ptr> semanticScope() const; // convenience getters - DomItem get(ErrorHandler h = nullptr, QList<Path> *visitedRefs = nullptr); - QList<DomItem> getAll(ErrorHandler h = nullptr, QList<Path> *visitedRefs = nullptr); - bool isOwningItem() { return domTypeIsOwningItem(internalKind()); } - bool isExternalItem() { return domTypeIsExternalItem(internalKind()); } - bool isTopItem() { return domTypeIsTopItem(internalKind()); } - bool isContainer() { return domTypeIsContainer(internalKind()); } - bool isScope() { return domTypeIsScope(internalKind()); } - bool isCanonicalChild(DomItem &child); - bool hasAnnotations(); - QString name() { return field(Fields::name).value().toString(); } - DomItem pragmas() { return field(Fields::pragmas); } - DomItem ids() { return field(Fields::ids); } - QString idStr() { return field(Fields::idStr).value().toString(); } - DomItem propertyInfos() { return field(Fields::propertyInfos); } - PropertyInfo propertyInfoWithName(QString name); - QSet<QString> propertyInfoNames(); - DomItem propertyDefs() { return field(Fields::propertyDefs); } - DomItem bindings() { return field(Fields::bindings); } - DomItem methods() { return field(Fields::methods); } - DomItem enumerations() { return field(Fields::enumerations); } - DomItem children() { return field(Fields::children); } - DomItem child(index_type i) { return field(Fields::children).index(i); } - DomItem annotations() + DomItem get(ErrorHandler h = nullptr, QList<Path> *visitedRefs = nullptr) const; + QList<DomItem> getAll(ErrorHandler h = nullptr, QList<Path> *visitedRefs = nullptr) const; + bool isOwningItem() const { return domTypeIsOwningItem(internalKind()); } + bool isExternalItem() const { return domTypeIsExternalItem(internalKind()); } + bool isTopItem() const { return domTypeIsTopItem(internalKind()); } + bool isContainer() const { return domTypeIsContainer(internalKind()); } + bool isScope() const { return domTypeIsScope(internalKind()); } + bool isCanonicalChild(const DomItem &child) const; + bool hasAnnotations() const; + QString name() const { return field(Fields::name).value().toString(); } + DomItem pragmas() const { return field(Fields::pragmas); } + DomItem ids() const { return field(Fields::ids); } + QString idStr() const { return field(Fields::idStr).value().toString(); } + DomItem propertyInfos() const { return field(Fields::propertyInfos); } + PropertyInfo propertyInfoWithName(QString name) const; + QSet<QString> propertyInfoNames() const; + DomItem propertyDefs() const { return field(Fields::propertyDefs); } + DomItem bindings() const { return field(Fields::bindings); } + DomItem methods() const { return field(Fields::methods); } + DomItem enumerations() const { return field(Fields::enumerations); } + DomItem children() const { return field(Fields::children); } + DomItem child(index_type i) const { return field(Fields::children).index(i); } + DomItem annotations() const { if (hasAnnotations()) return field(Fields::annotations); @@ -980,207 +963,203 @@ public: bool resolve(Path path, Visitor visitor, ErrorHandler errorHandler, ResolveOptions options = ResolveOption::None, Path fullPath = Path(), - QList<Path> *visitedRefs = nullptr); + QList<Path> *visitedRefs = nullptr) const; - DomItem operator[](Path path); - DomItem operator[](QStringView component); - DomItem operator[](const QString &component); - DomItem operator[](const char16_t *component) + DomItem operator[](Path path) const; + DomItem operator[](QStringView component) const; + DomItem operator[](const QString &component) const; + DomItem operator[](const char16_t *component) const { return (*this)[QStringView(component)]; } // to avoid clash with stupid builtin ptrdiff_t[DomItem&], coming from C - DomItem operator[](index_type i) { return index(i); } - DomItem operator[](int i) { return index(i); } - index_type size() { return indexes() + keys().size(); } - index_type length() { return size(); } - - DomItem path(Path p, ErrorHandler h = &defaultErrorHandler); - DomItem path(QString p, ErrorHandler h = &defaultErrorHandler); - DomItem path(QStringView p, ErrorHandler h = &defaultErrorHandler); - - QList<QString> fields(); - DomItem field(QStringView name); - - index_type indexes(); - DomItem index(index_type); - bool visitIndexes(function_ref<bool(DomItem &)> visitor); - - QSet<QString> keys(); - QStringList sortedKeys(); - DomItem key(QString name); - DomItem key(QStringView name) { return key(name.toString()); } - bool visitKeys(function_ref<bool(QString, DomItem &)> visitor); - - QList<DomItem> values(); - void writeOutPre(OutWriter &lw); - void writeOut(OutWriter &lw); - void writeOutPost(OutWriter &lw); - DomItem writeOutForFile(OutWriter &ow, WriteOutChecks extraChecks); + DomItem operator[](index_type i) const { return index(i); } + DomItem operator[](int i) const { return index(i); } + index_type size() const { return indexes() + keys().size(); } + index_type length() const { return size(); } + + DomItem path(Path p, ErrorHandler h = &defaultErrorHandler) const; + DomItem path(QString p, ErrorHandler h = &defaultErrorHandler) const; + DomItem path(QStringView p, ErrorHandler h = &defaultErrorHandler) const; + + QList<QString> fields() const; + DomItem field(QStringView name) const; + + index_type indexes() const; + DomItem index(index_type) const; + bool visitIndexes(function_ref<bool(const DomItem &)> visitor) const; + + QSet<QString> keys() const; + QStringList sortedKeys() const; + DomItem key(QString name) const; + DomItem key(QStringView name) const { return key(name.toString()); } + bool visitKeys(function_ref<bool(QString, const DomItem &)> visitor) const; + + QList<DomItem> values() const; + void writeOutPre(OutWriter &lw) const; + void writeOut(OutWriter &lw) const; + void writeOutPost(OutWriter &lw) const; + DomItem writeOutForFile(OutWriter &ow, WriteOutChecks extraChecks) const; DomItem writeOut(QString path, int nBackups = 2, const LineWriterOptions &opt = LineWriterOptions(), FileWriter *fw = nullptr, - WriteOutChecks extraChecks = WriteOutCheck::Default); + WriteOutChecks extraChecks = WriteOutCheck::Default) const; bool visitTree(Path basePath, ChildrenVisitor visitor, VisitOptions options = VisitOption::Default, ChildrenVisitor openingVisitor = emptyChildrenVisitor, - ChildrenVisitor closingVisitor = emptyChildrenVisitor); - bool visitPrototypeChain(function_ref<bool(DomItem &)> visitor, + ChildrenVisitor closingVisitor = emptyChildrenVisitor) const; + bool visitPrototypeChain(function_ref<bool(const DomItem &)> visitor, VisitPrototypesOptions options = VisitPrototypesOption::Normal, ErrorHandler h = nullptr, QSet<quintptr> *visited = nullptr, - QList<Path> *visitedRefs = nullptr); - bool visitDirectAccessibleScopes(function_ref<bool(DomItem &)> visitor, + QList<Path> *visitedRefs = nullptr) const; + bool visitDirectAccessibleScopes(function_ref<bool(const DomItem &)> visitor, VisitPrototypesOptions options = VisitPrototypesOption::Normal, ErrorHandler h = nullptr, QSet<quintptr> *visited = nullptr, - QList<Path> *visitedRefs = nullptr); + QList<Path> *visitedRefs = nullptr) const; bool - visitStaticTypePrototypeChains(function_ref<bool(DomItem &)> visitor, + visitStaticTypePrototypeChains(function_ref<bool(const DomItem &)> visitor, VisitPrototypesOptions options = VisitPrototypesOption::Normal, ErrorHandler h = nullptr, QSet<quintptr> *visited = nullptr, - QList<Path> *visitedRefs = nullptr); + QList<Path> *visitedRefs = nullptr) const; - bool visitUp(function_ref<bool(DomItem &)> visitor); - bool visitScopeChain(function_ref<bool(DomItem &)> visitor, + bool visitUp(function_ref<bool(const DomItem &)> visitor) const; + bool visitScopeChain(function_ref<bool(const DomItem &)> visitor, LookupOptions = LookupOption::Normal, ErrorHandler h = nullptr, - QSet<quintptr> *visited = nullptr, QList<Path> *visitedRefs = nullptr); - bool visitLocalSymbolsNamed(QString name, function_ref<bool(DomItem &)> visitor); - QSet<QString> localSymbolNames(LocalSymbolsTypes lTypes = LocalSymbolsType::All); - bool visitLookup1(QString symbolName, function_ref<bool(DomItem &)> visitor, + QSet<quintptr> *visited = nullptr, QList<Path> *visitedRefs = nullptr) const; + bool visitLocalSymbolsNamed(QString name, function_ref<bool(const DomItem &)> visitor) const; + QSet<QString> localSymbolNames(LocalSymbolsTypes lTypes = LocalSymbolsType::All) const; + bool visitLookup1(QString symbolName, function_ref<bool(const DomItem &)> visitor, LookupOptions = LookupOption::Normal, ErrorHandler h = nullptr, - QSet<quintptr> *visited = nullptr, QList<Path> *visitedRefs = nullptr); - bool visitLookup(QString symbolName, function_ref<bool(DomItem &)> visitor, + QSet<quintptr> *visited = nullptr, QList<Path> *visitedRefs = nullptr) const; + bool visitLookup(QString symbolName, function_ref<bool(const DomItem &)> visitor, LookupType type = LookupType::Symbol, LookupOptions = LookupOption::Normal, ErrorHandler errorHandler = nullptr, QSet<quintptr> *visited = nullptr, - QList<Path> *visitedRefs = nullptr); - bool visitSubSymbolsNamed(QString name, function_ref<bool(DomItem &)> visitor); - DomItem proceedToScope(ErrorHandler h = nullptr, QList<Path> *visitedRefs = nullptr); + QList<Path> *visitedRefs = nullptr) const; + bool visitSubSymbolsNamed(QString name, function_ref<bool(const DomItem &)> visitor) const; + DomItem proceedToScope(ErrorHandler h = nullptr, QList<Path> *visitedRefs = nullptr) const; QList<DomItem> lookup(QString symbolName, LookupType type = LookupType::Symbol, LookupOptions = LookupOption::Normal, - ErrorHandler errorHandler = nullptr); + ErrorHandler errorHandler = nullptr) const; DomItem lookupFirst(QString symbolName, LookupType type = LookupType::Symbol, - LookupOptions = LookupOption::Normal, ErrorHandler errorHandler = nullptr); - - quintptr id(); - Path pathFromOwner(); - QString canonicalFilePath(); - DomItem fileLocationsTree(); - DomItem fileLocations(); - MutableDomItem makeCopy(CopyOption option = CopyOption::EnvConnected); - bool commitToBase(std::shared_ptr<DomEnvironment> validPtr = nullptr); - DomItem refreshed() { return top().path(canonicalPath()); } - QCborValue value(); - - void dumpPtr(Sink sink); + LookupOptions = LookupOption::Normal, ErrorHandler errorHandler = nullptr) const; + + quintptr id() const; + Path pathFromOwner() const; + QString canonicalFilePath() const; + DomItem fileLocationsTree() const; + DomItem fileLocations() const; + MutableDomItem makeCopy(CopyOption option = CopyOption::EnvConnected) const; + bool commitToBase(std::shared_ptr<DomEnvironment> validPtr = nullptr) const; + DomItem refreshed() const { return top().path(canonicalPath()); } + QCborValue value() const; + + void dumpPtr(Sink sink) const; void dump(Sink, int indent = 0, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)> filter = - noFilter); + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter = + noFilter) const; FileWriter::Status dump(QString path, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)> filter = noFilter, - int nBackups = 2, int indent = 0, FileWriter *fw = nullptr); - QString toString(); - QString toString() const - { - DomItem self = *this; - return self.toString(); - } + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter = noFilter, + int nBackups = 2, int indent = 0, FileWriter *fw = nullptr) const; + QString toString() const; // OwnigItem elements - int derivedFrom(); - int revision(); - QDateTime createdAt(); - QDateTime frozenAt(); - QDateTime lastDataUpdateAt(); + int derivedFrom() const; + int revision() const; + QDateTime createdAt() const; + QDateTime frozenAt() const; + QDateTime lastDataUpdateAt() const; - void addError(ErrorMessage msg); - ErrorHandler errorHandler(); - void clearErrors(ErrorGroups groups = ErrorGroups({}), bool iterate = true); + void addError(ErrorMessage msg) const; + ErrorHandler errorHandler() const; + void clearErrors(ErrorGroups groups = ErrorGroups({}), bool iterate = true) const; // return false if a quick exit was requested - bool iterateErrors(function_ref<bool(DomItem source, ErrorMessage msg)> visitor, bool iterate, - Path inPath = Path()); + bool iterateErrors( + function_ref<bool(const DomItem &source, ErrorMessage msg)> visitor, bool iterate, + Path inPath = Path()) const; - bool iterateSubOwners(function_ref<bool(DomItem &owner)> visitor); - bool iterateDirectSubpaths(DirectVisitor v); + bool iterateSubOwners(function_ref<bool(const DomItem &owner)> visitor) const; + bool iterateDirectSubpaths(DirectVisitor v) const; template<typename T> DomItem subDataItem(const PathEls::PathComponent &c, T value, - ConstantData::Options options = ConstantData::Options::MapIsMap); + ConstantData::Options options = ConstantData::Options::MapIsMap) const; template<typename T> DomItem subDataItemField(QStringView f, T value, - ConstantData::Options options = ConstantData::Options::MapIsMap) + ConstantData::Options options = ConstantData::Options::MapIsMap) const { return subDataItem(PathEls::Field(f), value, options); } template<typename T> DomItem subValueItem(const PathEls::PathComponent &c, T value, - ConstantData::Options options = ConstantData::Options::MapIsMap); + ConstantData::Options options = ConstantData::Options::MapIsMap) const; template<typename T> bool dvValue(DirectVisitor visitor, const PathEls::PathComponent &c, T value, - ConstantData::Options options = ConstantData::Options::MapIsMap); + ConstantData::Options options = ConstantData::Options::MapIsMap) const; template<typename T> bool dvValueField(DirectVisitor visitor, QStringView f, T value, - ConstantData::Options options = ConstantData::Options::MapIsMap) + ConstantData::Options options = ConstantData::Options::MapIsMap) const { return this->dvValue<T>(visitor, PathEls::Field(f), value, options); } template<typename F> bool dvValueLazy(DirectVisitor visitor, const PathEls::PathComponent &c, F valueF, - ConstantData::Options options = ConstantData::Options::MapIsMap); + ConstantData::Options options = ConstantData::Options::MapIsMap) const; template<typename F> bool dvValueLazyField(DirectVisitor visitor, QStringView f, F valueF, - ConstantData::Options options = ConstantData::Options::MapIsMap) + ConstantData::Options options = ConstantData::Options::MapIsMap) const { return this->dvValueLazy(visitor, PathEls::Field(f), valueF, options); } DomItem subLocationItem(const PathEls::PathComponent &c, SourceLocation loc, - QStringView code = QStringView()) + QStringView code = QStringView()) const { return this->subDataItem(c, locationToData(loc, code)); } // bool dvSubReference(DirectVisitor visitor, const PathEls::PathComponent &c, Path // referencedObject); - DomItem subReferencesItem(const PathEls::PathComponent &c, QList<Path> paths); - DomItem subReferenceItem(const PathEls::PathComponent &c, Path referencedObject); - bool dvReference(DirectVisitor visitor, const PathEls::PathComponent &c, Path referencedObject) + DomItem subReferencesItem(const PathEls::PathComponent &c, QList<Path> paths) const; + DomItem subReferenceItem(const PathEls::PathComponent &c, Path referencedObject) const; + bool dvReference(DirectVisitor visitor, const PathEls::PathComponent &c, Path referencedObject) const { return dvItem(visitor, c, [c, this, referencedObject]() { return this->subReferenceItem(c, referencedObject); }); } - bool dvReferences(DirectVisitor visitor, const PathEls::PathComponent &c, QList<Path> paths) + bool dvReferences(DirectVisitor visitor, const PathEls::PathComponent &c, QList<Path> paths) const { return dvItem(visitor, c, [c, this, paths]() { return this->subReferencesItem(c, paths); }); } - bool dvReferenceField(DirectVisitor visitor, QStringView f, Path referencedObject) + bool dvReferenceField(DirectVisitor visitor, QStringView f, Path referencedObject) const { return dvReference(visitor, PathEls::Field(f), referencedObject); } - bool dvReferencesField(DirectVisitor visitor, QStringView f, QList<Path> paths) + bool dvReferencesField(DirectVisitor visitor, QStringView f, QList<Path> paths) const { return dvReferences(visitor, PathEls::Field(f), paths); } - bool dvItem(DirectVisitor visitor, const PathEls::PathComponent &c, function_ref<DomItem()> it) + bool dvItem(DirectVisitor visitor, const PathEls::PathComponent &c, function_ref<DomItem()> it) const { return visitor(c, it); } - bool dvItemField(DirectVisitor visitor, QStringView f, function_ref<DomItem()> it) + bool dvItemField(DirectVisitor visitor, QStringView f, function_ref<DomItem()> it) const { return dvItem(visitor, PathEls::Field(f), it); } - DomItem subListItem(const List &list); - DomItem subMapItem(const Map &map); - DomItem subObjectWrapItem(SimpleObjectWrap obj) + DomItem subListItem(const List &list) const; + DomItem subMapItem(const Map &map) const; + DomItem subObjectWrapItem(SimpleObjectWrap obj) const { return DomItem(m_top, m_owner, m_ownerPath, obj); } - DomItem subScriptElementWrapperItem(const ScriptElementVariant &obj) + DomItem subScriptElementWrapperItem(const ScriptElementVariant &obj) const { Q_ASSERT(obj); return DomItem(m_top, m_owner, m_ownerPath, ScriptElementDomWrapper(obj)); } template<typename Owner> - DomItem subOwnerItem(const PathEls::PathComponent &c, Owner o) + DomItem subOwnerItem(const PathEls::PathComponent &c, Owner o) const { if constexpr (domTypeIsUnattachedOwningItem(Owner::element_type::kindValue)) return DomItem(m_top, o, canonicalPath().appendComponent(c), o.get()); @@ -1188,16 +1167,16 @@ public: return DomItem(m_top, o, Path(), o.get()); } template<typename T> - DomItem wrap(const PathEls::PathComponent &c, T &obj); + DomItem wrap(const PathEls::PathComponent &c, const T &obj) const; template<typename T> - DomItem wrapField(QStringView f, T &obj) + DomItem wrapField(QStringView f, const T &obj) const { return wrap<T>(PathEls::Field(f), obj); } template<typename T> - bool dvWrap(DirectVisitor visitor, const PathEls::PathComponent &c, T &obj); + bool dvWrap(DirectVisitor visitor, const PathEls::PathComponent &c, T &obj) const; template<typename T> - bool dvWrapField(DirectVisitor visitor, QStringView f, T &obj) + bool dvWrapField(DirectVisitor visitor, QStringView f, T &obj) const { return dvWrap<T>(visitor, PathEls::Field(f), obj); } @@ -1207,24 +1186,24 @@ public: DomItem(std::shared_ptr<DomUniverse>); static DomItem fromCode(QString code, DomType fileType = DomType::QmlFile); - void loadFile(const FileToLoad &file, std::function<void(Path, DomItem &, DomItem &)> callback, + void loadFile(const FileToLoad &file, std::function<void(Path, const DomItem &, const DomItem &)> callback, LoadOptions loadOptions, - std::optional<DomType> fileType = std::optional<DomType>()); + std::optional<DomType> fileType = std::optional<DomType>()) const; void loadModuleDependency(QString uri, Version v, - std::function<void(Path, DomItem &, DomItem &)> callback = nullptr, - ErrorHandler = nullptr); - void loadBuiltins(std::function<void(Path, DomItem &, DomItem &)> callback = nullptr, - ErrorHandler = nullptr); - void loadPendingDependencies(); + std::function<void(Path, const DomItem &, const DomItem &)> callback = nullptr, + ErrorHandler = nullptr) const; + void loadBuiltins(std::function<void(Path, const DomItem &, const DomItem &)> callback = nullptr, + ErrorHandler = nullptr) const; + void loadPendingDependencies() const; // --- start of potentially dangerous stuff, make private? --- - std::shared_ptr<DomTop> topPtr(); - std::shared_ptr<OwningItem> owningItemPtr(); + std::shared_ptr<DomTop> topPtr() const; + std::shared_ptr<OwningItem> owningItemPtr() const; // keep the DomItem around to ensure that it doesn't get deleted template<typename T, typename std::enable_if<std::is_base_of_v<DomBase, T>, bool>::type = true> - T const *as() + T const *as() const { if (m_kind == T::kindValue) { if constexpr (domTypeIsObjWrap(T::kindValue) || domTypeIsValueWrap(T::kindValue)) @@ -1236,7 +1215,7 @@ public: } template<typename T, typename std::enable_if<!std::is_base_of_v<DomBase, T>, bool>::type = true> - T const *as() + T const *as() const { if (m_kind == T::kindValue) { Q_ASSERT(domTypeIsObjWrap(m_kind) || domTypeIsValueWrap(m_kind)); @@ -1246,10 +1225,10 @@ public: } template<typename T> - std::shared_ptr<T> ownerAs(); + std::shared_ptr<T> ownerAs() const; template<typename Owner, typename T> - DomItem copy(Owner owner, Path ownerPath, T base) + DomItem copy(Owner owner, Path ownerPath, T base) const { Q_ASSERT(m_top); static_assert(IsInlineDom<std::decay_t<T>>::value, "Expected an inline item or pointer"); @@ -1257,14 +1236,14 @@ public: } template<typename Owner> - DomItem copy(Owner owner, Path ownerPath) + DomItem copy(Owner owner, Path ownerPath) const { Q_ASSERT(m_top); return DomItem(m_top, owner, ownerPath, owner.get()); } template<typename T> - DomItem copy(T base) + DomItem copy(T base) const { Q_ASSERT(m_top); using BaseT = std::decay_t<T>; @@ -1280,28 +1259,8 @@ public: private: enum class WriteOutCheckResult { Success, Failed }; - WriteOutCheckResult performWriteOutChecks(DomItem &, DomItem &, OutWriter &, WriteOutChecks); - DomBase const *base() const; - template <typename T, typename std::enable_if<std::is_base_of<DomBase, T>::value, bool>::type = true> - T *mutableAs() { - if (m_kind == T::kindValue) { - if constexpr (domTypeIsObjWrap(T::kindValue) || domTypeIsValueWrap(T::kindValue)) - return static_cast<SimpleObjectWrapBase *>(mutableBase())->mutableAs<T>(); - else - return static_cast<T *>(mutableBase()); - } - return nullptr; - } - - template <typename T, typename std::enable_if<!std::is_base_of<DomBase, T>::value, bool>::type = true> - T *mutableAs() { - if (m_kind == T::kindValue) { - Q_ASSERT(domTypeIsObjWrap(m_kind) || domTypeIsValueWrap(m_kind)); - return static_cast<SimpleObjectWrapBase *>(mutableBase())->mutableAs<T>(); - } - return nullptr; - } - DomBase *mutableBase(); + WriteOutCheckResult performWriteOutChecks(const DomItem &, const DomItem &, OutWriter &, WriteOutChecks) const; + const DomBase *base() const; template<typename Env, typename Owner> DomItem(Env, Owner, Path, std::nullptr_t) : DomItem() @@ -1363,18 +1322,18 @@ inline bool operator!=(const DomItem &o1, const DomItem &o2) } template<typename T> -Map Map::fromMultiMapRef(Path pathFromOwner, QMultiMap<QString, T> &mmap) +Map Map::fromMultiMapRef(Path pathFromOwner, const QMultiMap<QString, T> &mmap) { return Map( pathFromOwner, - [&mmap](DomItem &self, QString key) { + [&mmap](const DomItem &self, QString key) { auto it = mmap.find(key); auto end = mmap.cend(); if (it == end) return DomItem(); else { // special case single element (++it == end || it.key() != key)? - QList<T *> values; + QList<const T *> values; while (it != end && it.key() == key) values.append(&(*it++)); ListP ll(self.pathFromOwner().appendComponent(PathEls::Key(key)), values, @@ -1382,88 +1341,87 @@ Map Map::fromMultiMapRef(Path pathFromOwner, QMultiMap<QString, T> &mmap) return self.copy(ll); } }, - [&mmap](DomItem &) { return QSet<QString>(mmap.keyBegin(), mmap.keyEnd()); }, + [&mmap](const DomItem &) { return QSet<QString>(mmap.keyBegin(), mmap.keyEnd()); }, QLatin1String(typeid(T).name())); } template<typename T> Map Map::fromMapRef( - Path pathFromOwner, QMap<QString, T> &map, - std::function<DomItem(DomItem &, const PathEls::PathComponent &, T &)> elWrapper) + Path pathFromOwner, const QMap<QString, T> &map, + std::function<DomItem(const DomItem &, const PathEls::PathComponent &, const T &)> elWrapper) { return Map( pathFromOwner, - [&map, elWrapper](DomItem &self, QString key) { - if (!map.contains(key)) + [&map, elWrapper](const DomItem &self, QString key) { + const auto it = map.constFind(key); + if (it == map.constEnd()) return DomItem(); - else { - return elWrapper(self, PathEls::Key(key), map[key]); - } + return elWrapper(self, PathEls::Key(key), it.value()); }, - [&map](DomItem &) { return QSet<QString>(map.keyBegin(), map.keyEnd()); }, + [&map](const DomItem &) { return QSet<QString>(map.keyBegin(), map.keyEnd()); }, QLatin1String(typeid(T).name())); } template<typename T> List List::fromQList( Path pathFromOwner, QList<T> list, - std::function<DomItem(DomItem &, const PathEls::PathComponent &, T &)> elWrapper, + std::function<DomItem(const DomItem &, const PathEls::PathComponent &, const T &)> elWrapper, ListOptions options) { index_type len = list.size(); if (options == ListOptions::Reverse) { return List( pathFromOwner, - [list, elWrapper](DomItem &self, index_type i) mutable { + [list, elWrapper](const DomItem &self, index_type i) mutable { if (i < 0 || i >= list.size()) return DomItem(); return elWrapper(self, PathEls::Index(i), list[list.size() - i - 1]); }, - [len](DomItem &) { return len; }, nullptr, QLatin1String(typeid(T).name())); + [len](const DomItem &) { return len; }, nullptr, QLatin1String(typeid(T).name())); } else { return List( pathFromOwner, - [list, elWrapper](DomItem &self, index_type i) mutable { + [list, elWrapper](const DomItem &self, index_type i) mutable { if (i < 0 || i >= list.size()) return DomItem(); return elWrapper(self, PathEls::Index(i), list[i]); }, - [len](DomItem &) { return len; }, nullptr, QLatin1String(typeid(T).name())); + [len](const DomItem &) { return len; }, nullptr, QLatin1String(typeid(T).name())); } } template<typename T> List List::fromQListRef( - Path pathFromOwner, QList<T> &list, - std::function<DomItem(DomItem &, const PathEls::PathComponent &, T &)> elWrapper, + Path pathFromOwner, const QList<T> &list, + std::function<DomItem(const DomItem &, const PathEls::PathComponent &, const T &)> elWrapper, ListOptions options) { if (options == ListOptions::Reverse) { return List( pathFromOwner, - [&list, elWrapper](DomItem &self, index_type i) { + [&list, elWrapper](const DomItem &self, index_type i) { if (i < 0 || i >= list.size()) return DomItem(); return elWrapper(self, PathEls::Index(i), list[list.size() - i - 1]); }, - [&list](DomItem &) { return list.size(); }, nullptr, + [&list](const DomItem &) { return list.size(); }, nullptr, QLatin1String(typeid(T).name())); } else { return List( pathFromOwner, - [&list, elWrapper](DomItem &self, index_type i) { + [&list, elWrapper](const DomItem &self, index_type i) { if (i < 0 || i >= list.size()) return DomItem(); return elWrapper(self, PathEls::Index(i), list[i]); }, - [&list](DomItem &) { return list.size(); }, nullptr, + [&list](const DomItem &) { return list.size(); }, nullptr, QLatin1String(typeid(T).name())); } } class QMLDOM_EXPORT OwningItem: public DomBase { protected: - virtual std::shared_ptr<OwningItem> doCopy(DomItem &self) const = 0; + virtual std::shared_ptr<OwningItem> doCopy(const DomItem &self) const = 0; public: OwningItem(const OwningItem &o); @@ -1473,13 +1431,13 @@ public: OwningItem &operator=(const OwningItem &&) = delete; static int nextRevision(); - Path canonicalPath(DomItem &self) const override = 0; + Path canonicalPath(const DomItem &self) const override = 0; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; - std::shared_ptr<OwningItem> makeCopy(DomItem &self) const { return doCopy(self); } + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; + std::shared_ptr<OwningItem> makeCopy(const DomItem &self) const { return doCopy(self); } Path pathFromOwner() const { return Path(); } - Path pathFromOwner(DomItem &) const override final { return Path(); } - DomItem containingObject(DomItem &self) const override; + Path pathFromOwner(const DomItem &) const override final { return Path(); } + DomItem containingObject(const DomItem &self) const override; int derivedFrom() const; virtual int revision() const; @@ -1492,18 +1450,20 @@ public: virtual bool freeze(); QDateTime frozenAt() const; - virtual void addError(DomItem &self, ErrorMessage msg); + virtual void addError(const DomItem &self, ErrorMessage msg); void addErrorLocal(ErrorMessage msg); void clearErrors(ErrorGroups groups = ErrorGroups({})); // return false if a quick exit was requested - bool iterateErrors(DomItem &self, function_ref<bool(DomItem source, ErrorMessage msg)> visitor, - Path inPath = Path()); + bool iterateErrors( + const DomItem &self, + function_ref<bool(const DomItem &source, ErrorMessage msg)> visitor, + Path inPath = Path()); QMultiMap<Path, ErrorMessage> localErrors() const { QMutexLocker l(mutex()); return m_errors; } - virtual bool iterateSubOwners(DomItem &self, function_ref<bool(DomItem &owner)> visitor); + virtual bool iterateSubOwners(const DomItem &self, function_ref<bool(const DomItem &owner)> visitor); QBasicMutex *mutex() const { return &m_mutex; } private: @@ -1518,7 +1478,7 @@ private: }; template<typename T> -std::shared_ptr<T> DomItem::ownerAs() +std::shared_ptr<T> DomItem::ownerAs() const { if constexpr (domTypeIsOwningItem(T::kindValue)) { if (m_owner) { @@ -1557,26 +1517,26 @@ struct rank<0> }; template<typename T> -auto writeOutWrap(const T &t, DomItem &self, OutWriter &lw, rank<1>) +auto writeOutWrap(const T &t, const DomItem &self, OutWriter &lw, rank<1>) -> decltype(t.writeOut(self, lw)) { t.writeOut(self, lw); } template<typename T> -auto writeOutWrap(const T &, DomItem &, OutWriter &, rank<0>) -> void +auto writeOutWrap(const T &, const DomItem &, OutWriter &, rank<0>) -> void { qCWarning(writeOutLog) << "Ignoring writeout to wrapped object not supporting it (" << typeid(T).name(); } template<typename T> -auto writeOutWrap(const T &t, DomItem &self, OutWriter &lw) -> void +auto writeOutWrap(const T &t, const DomItem &self, OutWriter &lw) -> void { writeOutWrap(t, self, lw, rank<1>()); } template<typename T> -void SimpleObjectWrapT<T>::writeOut(DomItem &self, OutWriter &lw) const +void SimpleObjectWrapT<T>::writeOut(const DomItem &self, OutWriter &lw) const { writeOutWrap<T>(*asT(), self, lw); } @@ -1595,7 +1555,7 @@ public: QString internalKindStr() { return domTypeToString(internalKind()); } DomKind domKind() { return kind2domKind(internalKind()); } - Path canonicalPath() { return m_owner.canonicalPath().path(m_pathFromOwner); } + Path canonicalPath() const { return m_owner.canonicalPath().path(m_pathFromOwner); } MutableDomItem containingObject() { if (m_pathFromOwner) @@ -1668,13 +1628,13 @@ public: void dump(Sink s, int indent = 0, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)> filter = noFilter) + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter = noFilter) { item().dump(s, indent, filter); } FileWriter::Status dump(QString path, - function_ref<bool(DomItem &, const PathEls::PathComponent &, DomItem &)> filter = noFilter, + function_ref<bool(const DomItem &, const PathEls::PathComponent &, const DomItem &)> filter = noFilter, int nBackups = 2, int indent = 0, FileWriter *fw = nullptr) { return item().dump(path, filter, nBackups, indent, fw); @@ -1696,7 +1656,7 @@ public: { return item().commitToBase(validEnvPtr); } - QString canonicalFilePath() { return item().canonicalFilePath(); } + QString canonicalFilePath() const { return item().canonicalFilePath(); } MutableDomItem refreshed() { return MutableDomItem(item().refreshed()); } @@ -1775,16 +1735,30 @@ public: template <typename T> T *mutableAs() { Q_ASSERT(!m_owner || !m_owner.owningItemPtr()->frozen()); - return item().mutableAs<T>(); + + DomItem self = item(); + if (self.m_kind != T::kindValue) + return nullptr; + + const T *t = nullptr; + if constexpr (domTypeIsObjWrap(T::kindValue) || domTypeIsValueWrap(T::kindValue)) + t = static_cast<const SimpleObjectWrapBase *>(self.base())->as<T>(); + else if constexpr (std::is_base_of<DomBase, T>::value) + t = static_cast<const T *>(self.base()); + else + Q_UNREACHABLE_RETURN(nullptr); + + // Nasty. But since ElementT has to store the const pointers, we allow it in this one place. + return const_cast<T *>(t); } template<typename T> - std::shared_ptr<T> ownerAs() + std::shared_ptr<T> ownerAs() const { return m_owner.ownerAs<T>(); } // it is dangerous to assume it stays valid when updates are preformed... - DomItem item() { return m_owner.path(m_pathFromOwner); } + DomItem item() const { return m_owner.path(m_pathFromOwner); } friend bool operator==(const MutableDomItem o1, const MutableDomItem &o2) { @@ -2002,7 +1976,7 @@ constexpr bool domTypeIsScriptElement(DomType k) template<typename T> DomItem DomItem::subValueItem(const PathEls::PathComponent &c, T value, - ConstantData::Options options) + ConstantData::Options options) const { using BaseT = std::remove_cv_t<std::remove_reference_t<T>>; if constexpr ( @@ -2017,8 +1991,8 @@ DomItem DomItem::subValueItem(const PathEls::PathComponent &c, T value, } else if constexpr (IsList<T>::value && !std::is_convertible_v<BaseT, QStringView>) { return subListItem(List::fromQList<typename BaseT::value_type>( pathFromOwner().appendComponent(c), value, - [options](DomItem &list, const PathEls::PathComponent &p, - typename T::value_type &v) { return list.subValueItem(p, v, options); })); + [options](const DomItem &list, const PathEls::PathComponent &p, + const typename T::value_type &v) { return list.subValueItem(p, v, options); })); } else if constexpr (IsSharedPointerToDomObject<BaseT>::value) { Q_UNUSED(options); return subOwnerItem(c, value); @@ -2029,7 +2003,7 @@ DomItem DomItem::subValueItem(const PathEls::PathComponent &c, T value, template<typename T> DomItem DomItem::subDataItem(const PathEls::PathComponent &c, T value, - ConstantData::Options options) + ConstantData::Options options) const { using BaseT = std::remove_cv_t<std::remove_reference_t<T>>; if constexpr (std::is_same_v<BaseT, ConstantData>) { @@ -2046,7 +2020,7 @@ DomItem DomItem::subDataItem(const PathEls::PathComponent &c, T value, template<typename T> bool DomItem::dvValue(DirectVisitor visitor, const PathEls::PathComponent &c, T value, - ConstantData::Options options) + ConstantData::Options options) const { auto lazyWrap = [this, &c, &value, options]() { return this->subValueItem<T>(c, value, options); @@ -2056,7 +2030,7 @@ bool DomItem::dvValue(DirectVisitor visitor, const PathEls::PathComponent &c, T template<typename F> bool DomItem::dvValueLazy(DirectVisitor visitor, const PathEls::PathComponent &c, F valueF, - ConstantData::Options options) + ConstantData::Options options) const { auto lazyWrap = [this, &c, &valueF, options]() { return this->subValueItem<decltype(valueF())>(c, valueF(), options); @@ -2065,7 +2039,7 @@ bool DomItem::dvValueLazy(DirectVisitor visitor, const PathEls::PathComponent &c } template<typename T> -DomItem DomItem::wrap(const PathEls::PathComponent &c, T &obj) +DomItem DomItem::wrap(const PathEls::PathComponent &c, const T &obj) const { using BaseT = std::decay_t<T>; if constexpr (std::is_same_v<QString, BaseT> || std::is_arithmetic_v<BaseT>) { @@ -2116,8 +2090,8 @@ DomItem DomItem::wrap(const PathEls::PathComponent &c, T &obj) if constexpr (std::is_same_v<typename BaseT::key_type, QString>) { return subMapItem(Map::fromMapRef<typename BaseT::mapped_type>( pathFromOwner().appendComponent(c), obj, - [](DomItem &map, const PathEls::PathComponent &p, - typename BaseT::mapped_type &el) { return map.wrap(p, el); })); + [](const DomItem &map, const PathEls::PathComponent &p, + const typename BaseT::mapped_type &el) { return map.wrap(p, el); })); } else { Q_ASSERT_X(false, "DomItem::wrap", "non string keys not supported (try .toString()?)"); } @@ -2125,8 +2099,8 @@ DomItem DomItem::wrap(const PathEls::PathComponent &c, T &obj) if constexpr (IsDomObject<typename BaseT::value_type>::value) { return subListItem(List::fromQListRef<typename BaseT::value_type>( pathFromOwner().appendComponent(c), obj, - [](DomItem &list, const PathEls::PathComponent &p, - typename BaseT::value_type &el) { return list.wrap(p, el); })); + [](const DomItem &list, const PathEls::PathComponent &p, + const typename BaseT::value_type &el) { return list.wrap(p, el); })); } else { Q_ASSERT_X(false, "DomItem::wrap", "Unsupported list type T"); return DomItem(); @@ -2139,14 +2113,14 @@ DomItem DomItem::wrap(const PathEls::PathComponent &c, T &obj) } template<typename T> -bool DomItem::dvWrap(DirectVisitor visitor, const PathEls::PathComponent &c, T &obj) +bool DomItem::dvWrap(DirectVisitor visitor, const PathEls::PathComponent &c, T &obj) const { auto lazyWrap = [this, &c, &obj]() { return this->wrap<T>(c, obj); }; return visitor(c, lazyWrap); } template<typename T> -bool ListPT<T>::iterateDirectSubpaths(DomItem &self, DirectVisitor v) +bool ListPT<T>::iterateDirectSubpaths(const DomItem &self, DirectVisitor v) const { index_type len = index_type(m_pList.size()); for (index_type i = 0; i < len; ++i) { @@ -2157,10 +2131,10 @@ bool ListPT<T>::iterateDirectSubpaths(DomItem &self, DirectVisitor v) } template<typename T> -DomItem ListPT<T>::index(DomItem &self, index_type index) const +DomItem ListPT<T>::index(const DomItem &self, index_type index) const { if (index >= 0 && index < m_pList.size()) - return self.wrap(PathEls::Index(index), *reinterpret_cast<T *>(m_pList.value(index))); + return self.wrap(PathEls::Index(index), *static_cast<const T *>(m_pList.value(index))); return DomItem(); } @@ -2170,13 +2144,13 @@ inline DomKind DomBase::domKind() const return kind2domKind(kind()); } -inline bool DomBase::iterateDirectSubpathsConst(DomItem &self, DirectVisitor visitor) const +inline bool DomBase::iterateDirectSubpathsConst(const DomItem &self, DirectVisitor visitor) const { Q_ASSERT(self.base() == this); return self.iterateDirectSubpaths(visitor); } -inline DomItem DomBase::containingObject(DomItem &self) const +inline DomItem DomBase::containingObject(const DomItem &self) const { Path path = pathFromOwner(self); DomItem base = self.owner(); @@ -2198,7 +2172,7 @@ inline QString DomBase::typeName() const return domTypeToString(kind()); } -inline QList<QString> DomBase::fields(DomItem &self) const +inline QList<QString> DomBase::fields(const DomItem &self) const { QList<QString> res; self.iterateDirectSubpaths([&res](const PathEls::PathComponent &c, function_ref<DomItem()>) { @@ -2209,7 +2183,7 @@ inline QList<QString> DomBase::fields(DomItem &self) const return res; } -inline DomItem DomBase::field(DomItem &self, QStringView name) const +inline DomItem DomBase::field(const DomItem &self, QStringView name) const { DomItem res; self.iterateDirectSubpaths( @@ -2223,7 +2197,7 @@ inline DomItem DomBase::field(DomItem &self, QStringView name) const return res; } -inline index_type DomBase::indexes(DomItem &self) const +inline index_type DomBase::indexes(const DomItem &self) const { index_type res = 0; self.iterateDirectSubpaths([&res](const PathEls::PathComponent &c, function_ref<DomItem()>) { @@ -2237,7 +2211,7 @@ inline index_type DomBase::indexes(DomItem &self) const return res; } -inline DomItem DomBase::index(DomItem &self, qint64 index) const +inline DomItem DomBase::index(const DomItem &self, qint64 index) const { DomItem res; self.iterateDirectSubpaths( @@ -2251,7 +2225,7 @@ inline DomItem DomBase::index(DomItem &self, qint64 index) const return res; } -inline QSet<QString> const DomBase::keys(DomItem &self) const +inline QSet<QString> const DomBase::keys(const DomItem &self) const { QSet<QString> res; self.iterateDirectSubpaths([&res](const PathEls::PathComponent &c, function_ref<DomItem()>) { @@ -2262,7 +2236,7 @@ inline QSet<QString> const DomBase::keys(DomItem &self) const return res; } -inline DomItem DomBase::key(DomItem &self, QString name) const +inline DomItem DomBase::key(const DomItem &self, QString name) const { DomItem res; self.iterateDirectSubpaths( @@ -2276,12 +2250,12 @@ inline DomItem DomBase::key(DomItem &self, QString name) const return res; } -inline DomItem DomItem::subListItem(const List &list) +inline DomItem DomItem::subListItem(const List &list) const { return DomItem(m_top, m_owner, m_ownerPath, list); } -inline DomItem DomItem::subMapItem(const Map &map) +inline DomItem DomItem::subMapItem(const Map &map) const { return DomItem(m_top, m_owner, m_ownerPath, map); } diff --git a/src/qmldom/qqmldommock.cpp b/src/qmldom/qqmldommock.cpp index 84f9452f9d..5bfc7ad7ce 100644 --- a/src/qmldom/qqmldommock.cpp +++ b/src/qmldom/qqmldommock.cpp @@ -32,7 +32,7 @@ std::pair<QString, MockObject> MockObject::asStringPair() const return std::make_pair(pathFromOwner().last().headName(), *this); } -bool MockObject::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool MockObject::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { static QHash<QString, QString> knownFields; static QBasicMutex m; @@ -60,7 +60,7 @@ bool MockObject::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -std::shared_ptr<OwningItem> MockOwner::doCopy(DomItem &) const +std::shared_ptr<OwningItem> MockOwner::doCopy(const DomItem &) const { return std::make_shared<MockOwner>(*this); } @@ -77,17 +77,17 @@ MockOwner::MockOwner(const MockOwner &o) } } -std::shared_ptr<MockOwner> MockOwner::makeCopy(DomItem &self) const +std::shared_ptr<MockOwner> MockOwner::makeCopy(const DomItem &self) const { return std::static_pointer_cast<MockOwner>(doCopy(self)); } -Path MockOwner::canonicalPath(DomItem &) const +Path MockOwner::canonicalPath(const DomItem &) const { return pathFromTop; } -bool MockOwner::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool MockOwner::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { static QHash<QString, QString> knownFields; static QBasicMutex m; diff --git a/src/qmldom/qqmldommock_p.h b/src/qmldom/qqmldommock_p.h index b35d4d2e1c..459bfaccf2 100644 --- a/src/qmldom/qqmldommock_p.h +++ b/src/qmldom/qqmldommock_p.h @@ -52,7 +52,7 @@ public: MockObject copy() const; std::pair<QString, MockObject> asStringPair() const; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; QMap<QString, MockObject> subObjects; QMap<QString, QCborValue> subValues; @@ -62,7 +62,7 @@ public: class MockOwner final : public OwningItem { protected: - std::shared_ptr<OwningItem> doCopy(DomItem &self) const override; + std::shared_ptr<OwningItem> doCopy(const DomItem &self) const override; public: constexpr static DomType kindValue = DomType::MockOwner; @@ -94,10 +94,10 @@ public: MockOwner(const MockOwner &o); - std::shared_ptr<MockOwner> makeCopy(DomItem &self) const; - Path canonicalPath(DomItem &self) const override; + std::shared_ptr<MockOwner> makeCopy(const DomItem &self) const; + Path canonicalPath(const DomItem &self) const override; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; Path pathFromTop; QMap<QString, MockObject> subObjects; diff --git a/src/qmldom/qqmldommoduleindex.cpp b/src/qmldom/qqmldommoduleindex.cpp index 9a638adead..3f78e9144f 100644 --- a/src/qmldom/qqmldommoduleindex.cpp +++ b/src/qmldom/qqmldommoduleindex.cpp @@ -27,7 +27,7 @@ static ErrorGroups myExportErrors() return res; } -bool ModuleScope::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool ModuleScope::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && self.dvValueField(visitor, Fields::uri, uri); @@ -36,19 +36,19 @@ bool ModuleScope::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) int minorVersion = version.minorVersion; return self.subMapItem(Map( self.pathFromOwner().field(Fields::exports), - [minorVersion](DomItem &mapExp, QString name) -> DomItem { + [minorVersion](const DomItem &mapExp, QString name) -> DomItem { DomItem mapExpOw = mapExp.owner(); QList<DomItem> exports = mapExp.ownerAs<ModuleIndex>()->exportsWithNameAndMinorVersion( mapExpOw, name, minorVersion); return mapExp.subListItem(List::fromQList<DomItem>( mapExp.pathFromOwner().key(name), exports, - [](DomItem &, const PathEls::PathComponent &, DomItem &el) { + [](const DomItem &, const PathEls::PathComponent &, const DomItem &el) { return el; }, ListOptions::Normal)); }, - [](DomItem &mapExp) { + [](const DomItem &mapExp) { DomItem mapExpOw = mapExp.owner(); return mapExp.ownerAs<ModuleIndex>()->exportNames(mapExpOw); }, @@ -58,11 +58,11 @@ bool ModuleScope::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) Path basePath = Path::Current(PathCurrent::Obj).field(Fields::exports); return self.subMapItem(Map( self.pathFromOwner().field(Fields::symbols), - [basePath](DomItem &mapExp, QString name) -> DomItem { + [basePath](const DomItem &mapExp, QString name) -> DomItem { QList<Path> symb({ basePath.key(name) }); return mapExp.subReferencesItem(PathEls::Key(name), symb); }, - [](DomItem &mapExp) { + [](const DomItem &mapExp) { DomItem mapExpOw = mapExp.owner(); return mapExp.ownerAs<ModuleIndex>()->exportNames(mapExpOw); }, @@ -74,7 +74,7 @@ bool ModuleScope::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -std::shared_ptr<OwningItem> ModuleIndex::doCopy(DomItem &) const +std::shared_ptr<OwningItem> ModuleIndex::doCopy(const DomItem &) const { return std::make_shared<ModuleIndex>(*this); } @@ -114,14 +114,14 @@ ModuleIndex::~ModuleIndex() } } -bool ModuleIndex::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool ModuleIndex::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = self.dvValueField(visitor, Fields::uri, uri()); cont = cont && self.dvValueField(visitor, Fields::majorVersion, majorVersion()); cont = cont && self.dvItemField(visitor, Fields::moduleScope, [this, &self]() { return self.subMapItem(Map( pathFromOwner(self).field(Fields::moduleScope), - [](DomItem &map, QString minorVersionStr) { + [](const DomItem &map, QString minorVersionStr) { bool ok; int minorVersion = minorVersionStr.toInt(&ok); if (minorVersionStr.isEmpty() @@ -131,7 +131,7 @@ bool ModuleIndex::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return DomItem(); return map.copy(map.ownerAs<ModuleIndex>()->ensureMinorVersion(minorVersion)); }, - [this](DomItem &) { + [this](const DomItem &) { QSet<QString> res; for (int el : minorVersions()) if (el >= 0) @@ -151,7 +151,7 @@ bool ModuleIndex::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -QSet<QString> ModuleIndex::exportNames(DomItem &self) const +QSet<QString> ModuleIndex::exportNames(const DomItem &self) const { QSet<QString> res; QList<Path> mySources = sources(); @@ -162,7 +162,7 @@ QSet<QString> ModuleIndex::exportNames(DomItem &self) const return res; } -QList<DomItem> ModuleIndex::autoExports(DomItem &self) const +QList<DomItem> ModuleIndex::autoExports(const DomItem &self) const { QList<DomItem> res; Path selfPath = canonicalPath(self).field(Fields::autoExports); @@ -219,7 +219,7 @@ QList<DomItem> ModuleIndex::autoExports(DomItem &self) const return res; } -QList<DomItem> ModuleIndex::exportsWithNameAndMinorVersion(DomItem &self, QString name, +QList<DomItem> ModuleIndex::exportsWithNameAndMinorVersion(const DomItem &self, QString name, int minorVersion) const { Path myPath = Paths::moduleScopePath(uri(), Version(majorVersion(), minorVersion)) @@ -344,7 +344,7 @@ void ModuleIndex::mergeWith(std::shared_ptr<ModuleIndex> o) } } -QList<Path> ModuleIndex::qmldirsToLoad(DomItem &self) +QList<Path> ModuleIndex::qmldirsToLoad(const DomItem &self) { // this always checks the filesystem to the qmldir file to load DomItem env = self.environment(); diff --git a/src/qmldom/qqmldommoduleindex_p.h b/src/qmldom/qqmldommoduleindex_p.h index 1d4d9be1df..37db3678da 100644 --- a/src/qmldom/qqmldommoduleindex_p.h +++ b/src/qmldom/qqmldommoduleindex_p.h @@ -38,12 +38,12 @@ public: return Path::Field(Fields::moduleScope) .key(version.isValid() ? QString::number(version.minorVersion) : QString()); } - Path pathFromOwner(DomItem &) const override { return pathFromOwner(); } - Path canonicalPath(DomItem &self) const override + Path pathFromOwner(const DomItem &) const override { return pathFromOwner(); } + Path canonicalPath(const DomItem &self) const override { return self.owner().canonicalPath().path(pathFromOwner()); } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; QString uri; Version version; @@ -54,7 +54,7 @@ class QMLDOM_EXPORT ModuleIndex final : public OwningItem Q_DECLARE_TR_FUNCTIONS(ModuleIndex); protected: - std::shared_ptr<OwningItem> doCopy(DomItem &self) const override; + std::shared_ptr<OwningItem> doCopy(const DomItem &self) const override; public: enum class Status { NotLoaded, Loading, Loaded }; @@ -71,21 +71,21 @@ public: ~ModuleIndex(); - std::shared_ptr<ModuleIndex> makeCopy(DomItem &self) const + std::shared_ptr<ModuleIndex> makeCopy(const DomItem &self) const { return std::static_pointer_cast<ModuleIndex>(doCopy(self)); } - Path canonicalPath(DomItem &) const override + Path canonicalPath(const DomItem &) const override { return Paths::moduleIndexPath(uri(), majorVersion()); } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; - QSet<QString> exportNames(DomItem &self) const; + QSet<QString> exportNames(const DomItem &self) const; - QList<DomItem> exportsWithNameAndMinorVersion(DomItem &self, QString name, + QList<DomItem> exportsWithNameAndMinorVersion(const DomItem &self, QString name, int minorVersion) const; QString uri() const { return m_uri; } @@ -106,7 +106,7 @@ public: m_qmltypesFilesPaths.append(p); } - QList<Path> qmldirsToLoad(DomItem &self); + QList<Path> qmldirsToLoad(const DomItem &self); QList<Path> qmltypesFilesPaths() const { QMutexLocker l(mutex()); @@ -122,7 +122,7 @@ public: QMutexLocker l(mutex()); return m_directoryPaths; } - QList<DomItem> autoExports(DomItem &self) const; + QList<DomItem> autoExports(const DomItem &self) const; private: QString m_uri; diff --git a/src/qmldom/qqmldomoutwriter.cpp b/src/qmldom/qqmldomoutwriter.cpp index 7bdbf505e2..405a281fbb 100644 --- a/src/qmldom/qqmldomoutwriter.cpp +++ b/src/qmldom/qqmldomoutwriter.cpp @@ -15,7 +15,7 @@ QT_BEGIN_NAMESPACE namespace QQmlJS { namespace Dom { -OutWriterState::OutWriterState(Path itCanonicalPath, DomItem &it, FileLocations::Tree fLoc) +OutWriterState::OutWriterState(Path itCanonicalPath, const DomItem &it, FileLocations::Tree fLoc) : itemCanonicalPath(itCanonicalPath), item(it), currentMap(fLoc) { DomItem cRegions = it.field(Fields::comments); @@ -50,7 +50,7 @@ OutWriterState &OutWriter::state(int i) return states[states.size() - 1 - i]; } -void OutWriter::itemStart(DomItem &it) +void OutWriter::itemStart(const DomItem &it) { if (!topLocation->path()) topLocation->setPath(it.canonicalPath()); @@ -77,7 +77,7 @@ void OutWriter::itemStart(DomItem &it) regionStart(QString()); } -void OutWriter::itemEnd(DomItem &it) +void OutWriter::itemEnd(const DomItem &it) { Q_ASSERT(states.size() > 0); Q_ASSERT(state().item == it); @@ -126,7 +126,7 @@ OutWriter &OutWriter::writeRegion(QString rName, QStringView toWrite) return *this; } -DomItem OutWriter::updatedFile(DomItem &qmlFile) +DomItem OutWriter::updatedFile(const DomItem &qmlFile) { Q_ASSERT(qmlFile.internalKind() == DomType::QmlFile); if (std::shared_ptr<QmlFile> qmlFilePtr = qmlFile.ownerAs<QmlFile>()) { diff --git a/src/qmldom/qqmldomoutwriter_p.h b/src/qmldom/qqmldomoutwriter_p.h index 1d000945d2..1960d4e8de 100644 --- a/src/qmldom/qqmldomoutwriter_p.h +++ b/src/qmldom/qqmldomoutwriter_p.h @@ -30,7 +30,7 @@ namespace Dom { class QMLDOM_EXPORT OutWriterState { public: - OutWriterState(Path itPath, DomItem &it, FileLocations::Tree fLoc); + OutWriterState(Path itPath, const DomItem &it, FileLocations::Tree fLoc); void closeState(OutWriter &); @@ -86,8 +86,8 @@ public: return indent; } - void itemStart(DomItem &it); - void itemEnd(DomItem &it); + void itemStart(const DomItem &it); + void itemEnd(const DomItem &it); void regionStart(QString rName); void regionStart(QStringView rName) { regionStart(rName.toString()); } void regionEnd(QString rName); @@ -154,7 +154,7 @@ public: updExp->info().expr = exp; } } - DomItem updatedFile(DomItem &qmlFile); + DomItem updatedFile(const DomItem &qmlFile); }; } // end namespace Dom diff --git a/src/qmldom/qqmldompath.cpp b/src/qmldom/qqmldompath.cpp index 24eb9768eb..ea2146cc10 100644 --- a/src/qmldom/qqmldompath.cpp +++ b/src/qmldom/qqmldompath.cpp @@ -82,7 +82,8 @@ void Base::dump(Sink sink) const { sink(u"]"); } -Filter::Filter(function<bool(DomItem)> f, QStringView filterDescription): filterFunction(f), filterDescription(filterDescription) {} +Filter::Filter(function<bool(const DomItem &)> f, QStringView filterDescription) + : filterFunction(f), filterDescription(filterDescription) {} QString Filter::name() const { return QLatin1String("?(%1)").arg(filterDescription); } @@ -248,7 +249,7 @@ index_type Path::headIndex(index_type defaultValue) const return component(0).index(defaultValue); } -function<bool (DomItem)> Path::headFilter() const +function<bool(const DomItem &)> Path::headFilter() const { auto &comp = component(0); if (PathEls::Filter const * f = comp.base()->asFilter()) { @@ -646,14 +647,14 @@ Path Path::any() const QStringList(), QVector<Component>(1,Component(PathEls::Any())), m_data)); } -Path Path::filter(function<bool (DomItem)> filterF, QString desc) const +Path Path::filter(function<bool(const DomItem &)> filterF, QString desc) const { auto res = filter(filterF, QStringView(desc)); res.m_data->strData.append(desc); return res; } -Path Path::filter(function<bool (DomItem)> filter, QStringView desc) const +Path Path::filter(function<bool(const DomItem &)> filter, QStringView desc) const { if (m_endOffset != 0) return noEndOffset().filter(filter, desc); diff --git a/src/qmldom/qqmldompath_p.h b/src/qmldom/qqmldompath_p.h index 57ae51e142..ad93b20c17 100644 --- a/src/qmldom/qqmldompath_p.h +++ b/src/qmldom/qqmldompath_p.h @@ -270,7 +270,8 @@ class QMLDOM_EXPORT Filter final : public Base { public: Filter() = default; - Filter(std::function<bool(DomItem)> f, QStringView filterDescription = u"<native code filter>"); + Filter(std::function<bool(const DomItem &)> f, + QStringView filterDescription = u"<native code filter>"); Kind kind() const override { return Kind::Filter; } QString name() const override; bool checkName(QStringView s) const override; @@ -278,7 +279,7 @@ public: bool hasSquareBrackets() const override { return true; } const Filter *asFilter() const override { return this; } - std::function<bool(DomItem)> filterFunction; + std::function<bool(const DomItem &)> filterFunction; QStringView filterDescription; }; @@ -316,12 +317,11 @@ private: friend class QQmlJS::Dom::Path; friend class QQmlJS::Dom::PathEls::TestPaths; - Base *base() { - return reinterpret_cast<Base*>(&data); - } - const Base *base() const { - return reinterpret_cast<const Base*>(&data); - } + // TODO: is all extremely nasty. We're casting to the common base of the union members and + // relying on the data layout of all of those to follow our expectations. + Base *base() { return reinterpret_cast<Base*>(&data); } + const Base *base() const { return reinterpret_cast<const Base*>(&data); } + union Data { Data(): empty() { } Data(const Data &d) { @@ -679,7 +679,7 @@ public: QString headName() const; bool checkHeadName(QStringView name) const; index_type headIndex(index_type defaultValue=-1) const; - std::function<bool(DomItem)> headFilter() const; + std::function<bool(const DomItem &)> headFilter() const; Path head() const; Path last() const; Source split() const; @@ -715,8 +715,9 @@ public: Path key(QStringView name) const; Path index(index_type i) const; Path any() const; - Path filter(std::function<bool(DomItem)>, QString) const; - Path filter(std::function<bool(DomItem)>, QStringView desc=u"<native code filter>") const; + Path filter(std::function<bool(const DomItem &)>, QString) const; + Path filter(std::function<bool(const DomItem &)>, + QStringView desc=u"<native code filter>") const; Path current(PathCurrent s) const; Path current(QString s) const; Path current(QStringView s=u"") const; @@ -809,6 +810,9 @@ inline size_t qHash(const Path &path, size_t seed) *it++ = qHash(p.component(0).stringView(), seed)^size_t(p.headRoot())^size_t(p.headCurrent()); } } + + // TODO: Get rid of the reinterpret_cast. + // Rather hash the path components in a more structured way. return qHash(QByteArray::fromRawData(reinterpret_cast<char *>(&buf[0]), (it - &buf[0])*sizeof(size_t)), seed); } diff --git a/src/qmldom/qqmldomscriptelements.cpp b/src/qmldom/qqmldomscriptelements.cpp index 9080aae8a5..85d5597cc2 100644 --- a/src/qmldom/qqmldomscriptelements.cpp +++ b/src/qmldom/qqmldomscriptelements.cpp @@ -71,7 +71,7 @@ using QQmlJS::Dom::ScriptElementVariant; \internal Helper for fields with elements in iterateDirectSubpaths. */ -static bool wrap(QQmlJS::Dom::DomItem &self, QQmlJS::Dom::DirectVisitor visitor, QStringView field, +static bool wrap(const QQmlJS::Dom::DomItem &self, QQmlJS::Dom::DirectVisitor visitor, QStringView field, const ScriptElementVariant &value) { if (!value) @@ -89,7 +89,7 @@ static bool wrap(QQmlJS::Dom::DomItem &self, QQmlJS::Dom::DirectVisitor visitor, \internal Helper for fields with lists in iterateDirectSubpaths. */ -static bool wrap(QQmlJS::Dom::DomItem &self, QQmlJS::Dom::DirectVisitor visitor, QStringView field, +static bool wrap(const QQmlJS::Dom::DomItem &self, QQmlJS::Dom::DirectVisitor visitor, QStringView field, const ScriptList &value) { const bool b = @@ -100,7 +100,7 @@ static bool wrap(QQmlJS::Dom::DomItem &self, QQmlJS::Dom::DirectVisitor visitor, return b; } -bool GenericScriptElement::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool GenericScriptElement::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; for (auto it = m_children.begin(); it != m_children.end(); ++it) { @@ -137,7 +137,7 @@ void GenericScriptElement::createFileLocations(FileLocations::Tree base) } } -bool BlockStatement::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool BlockStatement::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { // TODO: test me bool cont = true; @@ -157,14 +157,14 @@ void BlockStatement::createFileLocations(FileLocations::Tree base) m_statements.createFileLocations(base); } -bool IdentifierExpression::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool IdentifierExpression::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont &= self.dvValueField(visitor, Fields::identifier, m_name); return cont; } -bool Literal::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool Literal::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; std::visit([&cont, &visitor, @@ -173,7 +173,7 @@ bool Literal::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -bool IfStatement::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool IfStatement::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { // TODO: test me bool cont = true; @@ -205,7 +205,7 @@ void IfStatement::createFileLocations(FileLocations::Tree base) ptr->createFileLocations(base); } -bool ForStatement::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool ForStatement::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont &= wrap(self, visitor, Fields::initializer, m_initializer); @@ -246,7 +246,7 @@ void ForStatement::createFileLocations(FileLocations::Tree base) ptr->createFileLocations(base); } -bool BinaryExpression::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool BinaryExpression::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont &= wrap(self, visitor, Fields::left, m_left); @@ -273,7 +273,7 @@ void BinaryExpression::createFileLocations(FileLocations::Tree base) ptr->createFileLocations(base); } -bool VariableDeclarationEntry::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool VariableDeclarationEntry::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont &= self.dvValueField(visitor, Fields::scopeType, m_scopeType); @@ -300,7 +300,7 @@ void VariableDeclarationEntry::createFileLocations(FileLocations::Tree base) ptr->createFileLocations(base); } -bool VariableDeclaration::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool VariableDeclaration::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont &= wrap(self, visitor, Fields::declarations, m_declarations); @@ -319,7 +319,7 @@ void VariableDeclaration::createFileLocations(FileLocations::Tree base) m_declarations.createFileLocations(base); } -bool ReturnStatement::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool ReturnStatement::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont &= wrap(self, visitor, Fields::expression, m_expression); diff --git a/src/qmldom/qqmldomscriptelements_p.h b/src/qmldom/qqmldomscriptelements_p.h index cdb1bf645d..080a1aef6e 100644 --- a/src/qmldom/qqmldomscriptelements_p.h +++ b/src/qmldom/qqmldomscriptelements_p.h @@ -60,7 +60,7 @@ public: Pretty prints the current DomItem. Currently, for script elements, this is done entirely on the parser representation (via the AST classes), but it could be moved here if needed. */ - // void writeOut(DomItem &self, OutWriter &lw) const override; + // void writeOut(const DomItem &self, OutWriter &lw) const override; /*! All of the following overloads are only required for optimization purposes. @@ -70,17 +70,17 @@ public: */ // // needed for debug - // void dump(DomItem &, Sink sink, int indent, FilterT filter) const override; + // void dump(const DomItem &, Sink sink, int indent, FilterT filter) const override; // // just required for optimization if iterateDirectSubpaths is slow - // QList<QString> fields(DomItem &self) const override; - // DomItem field(DomItem &self, QStringView name) const override; + // QList<QString> fields(const DomItem &self) const override; + // DomItem field(const DomItem &self, QStringView name) const override; - // index_type indexes(DomItem &self) const override; - // DomItem index(DomItem &self, index_type index) const override; + // index_type indexes(const DomItem &self) const override; + // DomItem index(const DomItem &self, index_type index) const override; - // QSet<QString> const keys(DomItem &self) const override; - // DomItem key(DomItem &self, QString name) const override; + // QSet<QString> const keys(const DomItem &self) const override; + // DomItem key(const DomItem &self, QString name) const override; protected: QQmlJS::SourceLocation m_combinedLocation; @@ -94,7 +94,7 @@ public: using BaseT::BaseT; // minimal required overload for this to be wrapped as DomItem: - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override { bool cont = asList(self.pathFromOwner().key(QString())).iterateDirectSubpaths(self, visitor); @@ -122,7 +122,7 @@ public: { auto asList = List::fromQList<ScriptElementVariant>( path, m_list, - [](DomItem &list, const PathEls::PathComponent &, ScriptElementVariant &wrapped) + [](const DomItem &list, const PathEls::PathComponent &, const ScriptElementVariant &wrapped) -> DomItem { return list.subScriptElementWrapperItem(wrapped); }); return asList; @@ -144,7 +144,7 @@ public: using BaseT::BaseT; using VariantT = std::variant<ScriptElementVariant, ScriptList>; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; void updatePathFromOwner(Path p) override; void createFileLocations(FileLocations::Tree base) override; @@ -173,7 +173,7 @@ public: using BaseT::BaseT; // minimal required overload for this to be wrapped as DomItem: - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; void updatePathFromOwner(Path p) override; void createFileLocations(FileLocations::Tree base) override; @@ -192,7 +192,7 @@ public: QString name() { return m_name; } // minimal required overload for this to be wrapped as DomItem: - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; QCborValue value() const override { return QCborValue(m_name); } @@ -211,7 +211,7 @@ public: VariantT literalValue() const { return m_value; } // minimal required overload for this to be wrapped as DomItem: - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; QCborValue value() const override { @@ -229,7 +229,7 @@ public: using BaseT::BaseT; // minimal required overload for this to be wrapped as DomItem: - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; void updatePathFromOwner(Path p) override; void createFileLocations(FileLocations::Tree base) override; @@ -265,7 +265,7 @@ public: using BaseT::BaseT; // minimal required overload for this to be wrapped as DomItem: - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; void updatePathFromOwner(Path p) override; void createFileLocations(FileLocations::Tree base) override; @@ -288,7 +288,7 @@ public: using BaseT::BaseT; // minimal required overload for this to be wrapped as DomItem: - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; void updatePathFromOwner(Path p) override; void createFileLocations(FileLocations::Tree base) override; @@ -311,7 +311,7 @@ public: }; // minimal required overload for this to be wrapped as DomItem: - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; void updatePathFromOwner(Path p) override; void createFileLocations(FileLocations::Tree base) override; @@ -344,7 +344,7 @@ public: ScriptElementVariant initializer() const { return m_initializer; } void setInitializer(const ScriptElementVariant &initializer) { m_initializer = initializer; } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; void updatePathFromOwner(Path p) override; void createFileLocations(FileLocations::Tree base) override; @@ -360,7 +360,7 @@ public: using BaseT::BaseT; // minimal required overload for this to be wrapped as DomItem: - bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override; void updatePathFromOwner(Path p) override; void createFileLocations(FileLocations::Tree base) override; diff --git a/src/qmldom/qqmldomtop.cpp b/src/qmldom/qqmldomtop.cpp index adc27dc47f..7f64148f1c 100644 --- a/src/qmldom/qqmldomtop.cpp +++ b/src/qmldom/qqmldomtop.cpp @@ -55,17 +55,17 @@ using std::shared_ptr; if force is true the file is always read */ -Path DomTop::canonicalPath(DomItem &) const +Path DomTop::canonicalPath(const DomItem &) const { return canonicalPath(); } -DomItem DomTop::containingObject(DomItem &) const +DomItem DomTop::containingObject(const DomItem &) const { return DomItem(); } -bool DomTop::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool DomTop::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { static QHash<QString, QString> knownFields; static QBasicMutex m; @@ -149,7 +149,7 @@ Path DomUniverse::canonicalPath() const return Path::Root(u"universe"); } -bool DomUniverse::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool DomUniverse::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && DomTop::iterateDirectSubpaths(self, visitor); @@ -158,57 +158,57 @@ bool DomUniverse::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) cont = cont && self.dvItemField(visitor, Fields::globalScopeWithName, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::globalScopeWithName), - [this](DomItem &map, QString key) { return map.copy(globalScopeWithName(key)); }, - [this](DomItem &) { return globalScopeNames(); }, QLatin1String("GlobalScope"))); + [this](const DomItem &map, QString key) { return map.copy(globalScopeWithName(key)); }, + [this](const DomItem &) { return globalScopeNames(); }, QLatin1String("GlobalScope"))); }); cont = cont && self.dvItemField(visitor, Fields::qmlDirectoryWithPath, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::qmlDirectoryWithPath), - [this](DomItem &map, QString key) { return map.copy(qmlDirectoryWithPath(key)); }, - [this](DomItem &) { return qmlDirectoryPaths(); }, QLatin1String("QmlDirectory"))); + [this](const DomItem &map, QString key) { return map.copy(qmlDirectoryWithPath(key)); }, + [this](const DomItem &) { return qmlDirectoryPaths(); }, QLatin1String("QmlDirectory"))); }); cont = cont && self.dvItemField(visitor, Fields::qmldirFileWithPath, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::qmldirFileWithPath), - [this](DomItem &map, QString key) { return map.copy(qmldirFileWithPath(key)); }, - [this](DomItem &) { return qmldirFilePaths(); }, QLatin1String("QmldirFile"))); + [this](const DomItem &map, QString key) { return map.copy(qmldirFileWithPath(key)); }, + [this](const DomItem &) { return qmldirFilePaths(); }, QLatin1String("QmldirFile"))); }); cont = cont && self.dvItemField(visitor, Fields::qmlFileWithPath, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::qmlFileWithPath), - [this](DomItem &map, QString key) { return map.copy(qmlFileWithPath(key)); }, - [this](DomItem &) { return qmlFilePaths(); }, QLatin1String("QmlFile"))); + [this](const DomItem &map, QString key) { return map.copy(qmlFileWithPath(key)); }, + [this](const DomItem &) { return qmlFilePaths(); }, QLatin1String("QmlFile"))); }); cont = cont && self.dvItemField(visitor, Fields::jsFileWithPath, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::jsFileWithPath), - [this](DomItem &map, QString key) { return map.copy(jsFileWithPath(key)); }, - [this](DomItem &) { return jsFilePaths(); }, QLatin1String("JsFile"))); + [this](const DomItem &map, QString key) { return map.copy(jsFileWithPath(key)); }, + [this](const DomItem &) { return jsFilePaths(); }, QLatin1String("JsFile"))); }); cont = cont && self.dvItemField(visitor, Fields::jsFileWithPath, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::qmltypesFileWithPath), - [this](DomItem &map, QString key) { return map.copy(qmltypesFileWithPath(key)); }, - [this](DomItem &) { return qmltypesFilePaths(); }, QLatin1String("QmltypesFile"))); + [this](const DomItem &map, QString key) { return map.copy(qmltypesFileWithPath(key)); }, + [this](const DomItem &) { return qmltypesFilePaths(); }, QLatin1String("QmltypesFile"))); }); cont = cont && self.dvItemField(visitor, Fields::queue, [this, &self]() { QQueue<ParsingTask> q = queue(); return self.subListItem(List( Path::Field(Fields::queue), - [q](DomItem &list, index_type i) { + [q](const DomItem &list, index_type i) { if (i >= 0 && i < q.size()) return list.subDataItem(PathEls::Index(i), q.at(i).toCbor(), ConstantData::Options::FirstMapIsFields); else return DomItem(); }, - [q](DomItem &) { return index_type(q.size()); }, nullptr, + [q](const DomItem &) { return index_type(q.size()); }, nullptr, QLatin1String("ParsingTask"))); }); return cont; } -std::shared_ptr<OwningItem> DomUniverse::doCopy(DomItem &) const +std::shared_ptr<OwningItem> DomUniverse::doCopy(const DomItem &) const { QRegularExpression r(QRegularExpression::anchoredPattern(QLatin1String(R"(.*Copy([0-9]*)$)"))); auto m = r.match(m_name); @@ -221,7 +221,7 @@ std::shared_ptr<OwningItem> DomUniverse::doCopy(DomItem &) const return res; } -static DomType fileTypeForPath(DomItem &self, QString canonicalFilePath) +static DomType fileTypeForPath(const DomItem &self, QString canonicalFilePath) { if (canonicalFilePath.endsWith(u".qml", Qt::CaseInsensitive) || canonicalFilePath.endsWith(u".qmlannotation", Qt::CaseInsensitive)) { @@ -244,7 +244,7 @@ static DomType fileTypeForPath(DomItem &self, QString canonicalFilePath) return DomType::Empty; } -void DomUniverse::loadFile(DomItem &self, const FileToLoad &file, Callback callback, +void DomUniverse::loadFile(const DomItem &self, const FileToLoad &file, Callback callback, LoadOptions loadOptions, std::optional<DomType> fileType) { DomType fType = (bool(fileType) ? (*fileType) : fileTypeForPath(self, file.canonicalPath())); @@ -275,7 +275,7 @@ void DomUniverse::loadFile(DomItem &self, const FileToLoad &file, Callback callb template<typename T> QPair<std::shared_ptr<ExternalItemPair<T>>, std::shared_ptr<ExternalItemPair<T>>> -updateEntry(DomItem &univ, std::shared_ptr<T> newItem, +updateEntry(const DomItem &univ, std::shared_ptr<T> newItem, QMap<QString, std::shared_ptr<ExternalItemPair<T>>> &map, QBasicMutex *mutex) { std::shared_ptr<ExternalItemPair<T>> oldValue; @@ -502,7 +502,7 @@ void DomUniverse::removePath(const QString &path) m_qmltypesFileWithPath.removeIf(toDelete); } -std::shared_ptr<OwningItem> LoadInfo::doCopy(DomItem &self) const +std::shared_ptr<OwningItem> LoadInfo::doCopy(const DomItem &self) const { auto res = std::make_shared<LoadInfo>(*this); if (res->status() != Status::Done) { @@ -525,12 +525,12 @@ std::shared_ptr<OwningItem> LoadInfo::doCopy(DomItem &self) const return res; } -Path LoadInfo::canonicalPath(DomItem &) const +Path LoadInfo::canonicalPath(const DomItem &) const { return Path::Root(PathRoot::Env).field(Fields::loadInfo).key(elementCanonicalPath().toString()); } -bool LoadInfo::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool LoadInfo::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = OwningItem::iterateDirectSubpaths(self, visitor); cont = cont && self.dvValueField(visitor, Fields::status, int(status())); @@ -543,8 +543,8 @@ bool LoadInfo::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -void LoadInfo::addEndCallback(DomItem &self, - std::function<void(Path, DomItem &, DomItem &)> callback) +void LoadInfo::addEndCallback(const DomItem &self, + std::function<void(Path, const DomItem &, const DomItem &)> callback) { if (!callback) return; @@ -566,7 +566,7 @@ void LoadInfo::addEndCallback(DomItem &self, callback(p, el, el); } -void LoadInfo::advanceLoad(DomItem &self) +void LoadInfo::advanceLoad(const DomItem &self) { Status myStatus; Dependency dep; @@ -614,7 +614,7 @@ void LoadInfo::advanceLoad(DomItem &self) if (!dep.uri.isEmpty()) { self.loadModuleDependency( dep.uri, dep.version, - [this, self, dep](Path, DomItem &, DomItem &) mutable { + [this, self, dep](Path, const DomItem &, const DomItem &) mutable { finishedLoadingDep(self, dep); }, self.errorHandler()); @@ -624,7 +624,7 @@ void LoadInfo::advanceLoad(DomItem &self) if (std::shared_ptr<DomEnvironment> envPtr = env.ownerAs<DomEnvironment>()) envPtr->loadFile( env, FileToLoad::fromFileSystem(envPtr, dep.filePath), - [this, self, dep](Path, DomItem &, DomItem &) mutable { + [this, self, dep](Path, const DomItem &, const DomItem &) mutable { finishedLoadingDep(self, dep); }, nullptr, nullptr, LoadOption::DefaultLoad, dep.fileType, @@ -647,7 +647,7 @@ void LoadInfo::advanceLoad(DomItem &self) } } -void LoadInfo::finishedLoadingDep(DomItem &self, const Dependency &d) +void LoadInfo::finishedLoadingDep(const DomItem &self, const Dependency &d) { bool didRemove = false; bool unexpectedState = false; @@ -693,9 +693,9 @@ void LoadInfo::finishedLoadingDep(DomItem &self, const Dependency &d) execEnd(self); } -void LoadInfo::execEnd(DomItem &self) +void LoadInfo::execEnd(const DomItem &self) { - QList<std::function<void(Path, DomItem &, DomItem &)>> endCallbacks; + QList<std::function<void(Path, const DomItem &, const DomItem &)>> endCallbacks; bool unexpectedState = false; { QMutexLocker l(mutex()); @@ -708,7 +708,7 @@ void LoadInfo::execEnd(DomItem &self) DomItem el = self.path(p); { auto cleanup = qScopeGuard([this, p, &el] { - QList<std::function<void(Path, DomItem &, DomItem &)>> otherCallbacks; + QList<std::function<void(Path, const DomItem &, const DomItem &)>> otherCallbacks; bool unexpectedState2 = false; { QMutexLocker l(mutex()); @@ -730,7 +730,7 @@ void LoadInfo::execEnd(DomItem &self) } } -void LoadInfo::doAddDependencies(DomItem &self) +void LoadInfo::doAddDependencies(const DomItem &self) { if (!elementCanonicalPath()) { DomEnvironment::myErrors() @@ -780,8 +780,8 @@ void LoadInfo::doAddDependencies(DomItem &self) } } DomItem currentQmlFiles = currentFile.field(Fields::qmlFiles); - currentQmlFiles.visitKeys([this, &self](QString, DomItem &els) { - return els.visitIndexes([this, &self](DomItem &el) { + currentQmlFiles.visitKeys([this, &self](QString, const DomItem &els) { + return els.visitIndexes([this, &self](const DomItem &el) { if (const Reference *ref = el.as<Reference>()) { Path canonicalPath = ref->referredObjectPath[2]; if (canonicalPath && !canonicalPath.headName().isEmpty()) @@ -802,7 +802,7 @@ void LoadInfo::doAddDependencies(DomItem &self) DomType::QmldirFile }); } QString uri = elPtr->uri(); - addEndCallback(self, [uri, qmldirs](Path, DomItem &, DomItem &newV) { + addEndCallback(self, [uri, qmldirs](Path, const DomItem &, const DomItem &newV) { for (const Path &p : qmldirs) { DomItem qmldir = newV.path(p); if (std::shared_ptr<QmldirFile> qmldirFilePtr = qmldir.ownerAs<QmldirFile>()) { @@ -822,7 +822,7 @@ void LoadInfo::doAddDependencies(DomItem &self) } } -void LoadInfo::addDependency(DomItem &self, const Dependency &dep) +void LoadInfo::addDependency(const DomItem &self, const Dependency &dep) { bool unexpectedState = false; { @@ -843,8 +843,8 @@ void LoadInfo::addDependency(DomItem &self, const Dependency &dep) template<typename T> DomTop::Callback envCallbackForFile( - DomItem &self, QMap<QString, std::shared_ptr<ExternalItemInfo<T>>> DomEnvironment::*map, - std::shared_ptr<ExternalItemInfo<T>> (DomEnvironment::*lookupF)(DomItem &, QString, + const DomItem &self, QMap<QString, std::shared_ptr<ExternalItemInfo<T>>> DomEnvironment::*map, + std::shared_ptr<ExternalItemInfo<T>> (DomEnvironment::*lookupF)(const DomItem &, QString, EnvLookup) const, DomTop::Callback loadCallback, DomTop::Callback allDirectDepsCallback, DomTop::Callback endCallback) @@ -853,7 +853,7 @@ DomTop::Callback envCallbackForFile( std::weak_ptr<DomEnvironment> selfPtr = ePtr; std::shared_ptr<DomEnvironment> basePtr = ePtr->base(); return [selfPtr, basePtr, map, lookupF, loadCallback, allDirectDepsCallback, - endCallback](Path, DomItem &, DomItem &newItem) { + endCallback](Path, const DomItem &, const DomItem &newItem) { shared_ptr<DomEnvironment> envPtr = selfPtr.lock(); if (!envPtr) return; @@ -913,7 +913,7 @@ DomTop::Callback envCallbackForFile( } if (endCallback) envPtr->addAllLoadedCallback(env, - [p, endCallback](Path, DomItem &, DomItem &env) { + [p, endCallback](Path, const DomItem &, const DomItem &env) { DomItem el = env.path(p); endCallback(p, el, el); }); @@ -952,7 +952,7 @@ Path DomEnvironment::canonicalPath() const return Path::Root(u"env"); } -bool DomEnvironment::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool DomEnvironment::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { bool cont = true; cont = cont && DomTop::iterateDirectSubpaths(self, visitor); @@ -966,54 +966,54 @@ bool DomEnvironment::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) cont = cont && self.dvItemField(visitor, Fields::globalScopeWithName, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::globalScopeWithName), - [&self, this](DomItem &map, QString key) { + [&self, this](const DomItem &map, QString key) { return map.copy(globalScopeWithName(self, key)); }, - [&self, this](DomItem &) { return globalScopeNames(self); }, + [&self, this](const DomItem &) { return globalScopeNames(self); }, QLatin1String("GlobalScope"))); }); cont = cont && self.dvItemField(visitor, Fields::qmlDirectoryWithPath, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::qmlDirectoryWithPath), - [&self, this](DomItem &map, QString key) { + [&self, this](const DomItem &map, QString key) { return map.copy(qmlDirectoryWithPath(self, key)); }, - [&self, this](DomItem &) { return qmlDirectoryPaths(self); }, + [&self, this](const DomItem &) { return qmlDirectoryPaths(self); }, QLatin1String("QmlDirectory"))); }); cont = cont && self.dvItemField(visitor, Fields::qmldirFileWithPath, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::qmldirFileWithPath), - [&self, this](DomItem &map, QString key) { + [&self, this](const DomItem &map, QString key) { return map.copy(qmldirFileWithPath(self, key)); }, - [&self, this](DomItem &) { return qmldirFilePaths(self); }, + [&self, this](const DomItem &) { return qmldirFilePaths(self); }, QLatin1String("QmldirFile"))); }); cont = cont && self.dvItemField(visitor, Fields::qmldirWithPath, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::qmldirWithPath), - [&self, this](DomItem &map, QString key) { + [&self, this](const DomItem &map, QString key) { return map.copy(qmlDirWithPath(self, key)); }, - [&self, this](DomItem &) { return qmlDirPaths(self); }, QLatin1String("Qmldir"))); + [&self, this](const DomItem &) { return qmlDirPaths(self); }, QLatin1String("Qmldir"))); }); cont = cont && self.dvItemField(visitor, Fields::qmlFileWithPath, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::qmlFileWithPath), - [&self, this](DomItem &map, QString key) { + [&self, this](const DomItem &map, QString key) { return map.copy(qmlFileWithPath(self, key)); }, - [&self, this](DomItem &) { return qmlFilePaths(self); }, QLatin1String("QmlFile"))); + [&self, this](const DomItem &) { return qmlFilePaths(self); }, QLatin1String("QmlFile"))); }); cont = cont && self.dvItemField(visitor, Fields::jsFileWithPath, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::jsFileWithPath), - [this](DomItem &map, QString key) { + [this](const DomItem &map, QString key) { DomItem mapOw(map.owner()); return map.copy(jsFileWithPath(mapOw, key)); }, - [this](DomItem &map) { + [this](const DomItem &map) { DomItem mapOw = map.owner(); return jsFilePaths(mapOw); }, @@ -1022,11 +1022,11 @@ bool DomEnvironment::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) cont = cont && self.dvItemField(visitor, Fields::qmltypesFileWithPath, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::qmltypesFileWithPath), - [this](DomItem &map, QString key) { + [this](const DomItem &map, QString key) { DomItem mapOw = map.owner(); return map.copy(qmltypesFileWithPath(mapOw, key)); }, - [this](DomItem &map) { + [this](const DomItem &map) { DomItem mapOw = map.owner(); return qmltypesFilePaths(mapOw); }, @@ -1035,10 +1035,10 @@ bool DomEnvironment::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) cont = cont && self.dvItemField(visitor, Fields::moduleIndexWithUri, [this, &self]() { return self.subMapItem(Map( Path::Field(Fields::moduleIndexWithUri), - [this](DomItem &map, QString key) { + [this](const DomItem &map, QString key) { return map.subMapItem(Map( map.pathFromOwner().key(key), - [this, key](DomItem &submap, QString subKey) { + [this, key](const DomItem &submap, QString subKey) { bool ok; int i = subKey.toInt(&ok); if (!ok) { @@ -1054,7 +1054,7 @@ bool DomEnvironment::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) moduleIndexWithUri(subMapOw, key, i); return submap.copy(mIndex); }, - [this, key](DomItem &subMap) { + [this, key](const DomItem &subMap) { QSet<QString> res; DomItem subMapOw = subMap.owner(); for (int mVersion : @@ -1069,7 +1069,7 @@ bool DomEnvironment::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) }, QLatin1String("ModuleIndex"))); }, - [this](DomItem &map) { + [this](const DomItem &map) { DomItem mapOw = map.owner(); return moduleIndexUris(mapOw); }, @@ -1094,14 +1094,14 @@ bool DomEnvironment::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) ensureInfo(); return self.subListItem(List( Path::Field(Fields::loadsWithWork), - [loadsWithWork](DomItem &list, index_type i) { + [loadsWithWork](const DomItem &list, index_type i) { if (i >= 0 && i < loadsWithWork.size()) return list.subDataItem(PathEls::Index(i), loadsWithWork.at(i).toString()); else return DomItem(); }, - [loadsWithWork](DomItem &) { + [loadsWithWork](const DomItem &) { return index_type(loadsWithWork.size()); }, nullptr, QLatin1String("Path"))); @@ -1111,20 +1111,20 @@ bool DomEnvironment::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) ensureInfo(); return self.subListItem(List( Path::Field(Fields::inProgress), - [inProgress](DomItem &list, index_type i) { + [inProgress](const DomItem &list, index_type i) { if (i >= 0 && i < inProgress.size()) return list.subDataItem(PathEls::Index(i), inProgress.at(i).toString()); else return DomItem(); }, - [inProgress](DomItem &) { return index_type(inProgress.size()); }, + [inProgress](const DomItem &) { return index_type(inProgress.size()); }, nullptr, QLatin1String("Path"))); }); cont = cont && self.dvItemField(visitor, Fields::loadInfo, [&self, this]() { return self.subMapItem(Map( Path::Field(Fields::loadInfo), - [this](DomItem &map, QString pStr) { + [this](const DomItem &map, QString pStr) { bool hasErrors = false; Path p = Path::fromString(pStr, [&hasErrors](ErrorMessage m) { switch (m.level) { @@ -1142,7 +1142,7 @@ bool DomEnvironment::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return map.copy(loadInfo(p)); return DomItem(); }, - [this](DomItem &) { + [this](const DomItem &) { QSet<QString> res; const auto infoPaths = loadInfoPaths(); for (const Path &p : infoPaths) @@ -1161,17 +1161,17 @@ bool DomEnvironment::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) return cont; } -DomItem DomEnvironment::field(DomItem &self, QStringView name) const +DomItem DomEnvironment::field(const DomItem &self, QStringView name) const { return DomTop::field(self, name); } -std::shared_ptr<DomEnvironment> DomEnvironment::makeCopy(DomItem &self) const +std::shared_ptr<DomEnvironment> DomEnvironment::makeCopy(const DomItem &self) const { return std::static_pointer_cast<DomEnvironment>(doCopy(self)); } -std::shared_ptr<OwningItem> DomEnvironment::doCopy(DomItem &) const +std::shared_ptr<OwningItem> DomEnvironment::doCopy(const DomItem &) const { shared_ptr<DomEnvironment> res; if (m_base) @@ -1182,7 +1182,7 @@ std::shared_ptr<OwningItem> DomEnvironment::doCopy(DomItem &) const return res; } -void DomEnvironment::loadFile(DomItem &self, FileToLoad file, Callback loadCallback, +void DomEnvironment::loadFile(const DomItem &self, FileToLoad file, Callback loadCallback, Callback directDepsCallback, Callback endCallback, LoadOptions loadOptions, std::optional<DomType> fileType, ErrorHandler h) @@ -1198,7 +1198,7 @@ void DomEnvironment::loadFile(DomItem &self, FileToLoad file, Callback loadCallb if (directDepsCallback) directDepsCallback(Path(), DomItem::empty, DomItem::empty); if (endCallback) - addAllLoadedCallback(self, [endCallback](Path, DomItem &, DomItem &) { + addAllLoadedCallback(self, [endCallback](Path, const DomItem &, const DomItem &) { endCallback(Path(), DomItem::empty, DomItem::empty); }); return; @@ -1365,13 +1365,13 @@ void DomEnvironment::loadFile(DomItem &self, FileToLoad file, Callback loadCallb directDepsCallback(self.canonicalPath(), DomItem::empty, DomItem::empty); } if (endCallback) - addAllLoadedCallback(self, [p, endCallback](Path, DomItem &, DomItem &env) { + addAllLoadedCallback(self, [p, endCallback](Path, const DomItem &, const DomItem &env) { DomItem el = env.path(p); endCallback(p, el, el); }); } -void DomEnvironment::loadModuleDependency(DomItem &self, QString uri, Version v, +void DomEnvironment::loadModuleDependency(const DomItem &self, QString uri, Version v, Callback loadCallback, Callback endCallback, ErrorHandler errorHandler) { @@ -1421,7 +1421,7 @@ void DomEnvironment::loadModuleDependency(DomItem &self, QString uri, Version v, } } QAtomicInt toLoad((commonV ? 1 : 0) + ((maxV >= 0) ? 1 : 0)); - auto loadCallback2 = (loadCallback ? [p, loadCallback, toLoad](Path, DomItem &, DomItem &elV) mutable { + auto loadCallback2 = (loadCallback ? [p, loadCallback, toLoad](Path, const DomItem &, const DomItem &elV) mutable { if (--toLoad == 0) { DomItem el = elV.path(p); loadCallback(p, el, el); @@ -1462,13 +1462,13 @@ void DomEnvironment::loadModuleDependency(DomItem &self, QString uri, Version v, } } if (endCallback) - addAllLoadedCallback(self, [p, endCallback](Path, DomItem &, DomItem &env) { + addAllLoadedCallback(self, [p, endCallback](Path, const DomItem &, const DomItem &env) { DomItem el = env.path(p); endCallback(p, el, el); }); } -void DomEnvironment::loadBuiltins(DomItem &self, Callback callback, ErrorHandler h) +void DomEnvironment::loadBuiltins(const DomItem &self, Callback callback, ErrorHandler h) { QString builtinsName = QLatin1String("builtins.qmltypes"); const auto lPaths = loadPaths(); @@ -1533,7 +1533,7 @@ QSet<QString> DomEnvironment::getStrings(function_ref<QSet<QString>()> getBase, return res; } -QSet<QString> DomEnvironment::moduleIndexUris(DomItem &, EnvLookup lookup) const +QSet<QString> DomEnvironment::moduleIndexUris(const DomItem &, EnvLookup lookup) const { DomItem baseObj = DomItem(m_base); return this->getStrings<QMap<int, std::shared_ptr<ModuleIndex>>>( @@ -1541,7 +1541,7 @@ QSet<QString> DomEnvironment::moduleIndexUris(DomItem &, EnvLookup lookup) const m_moduleIndexWithUri, lookup); } -QSet<int> DomEnvironment::moduleIndexMajorVersions(DomItem &, QString uri, EnvLookup lookup) const +QSet<int> DomEnvironment::moduleIndexMajorVersions(const DomItem &, QString uri, EnvLookup lookup) const { QSet<int> res; if (lookup != EnvLookup::NoBase && m_base) { @@ -1578,7 +1578,7 @@ std::shared_ptr<ModuleIndex> DomEnvironment::lookupModuleInEnv(const QString &ur return it->value(majorVersion); // null shared_ptr is fine if no match } -DomEnvironment::ModuleLookupResult DomEnvironment::moduleIndexWithUriHelper(DomItem &self, QString uri, int majorVersion, EnvLookup options) const +DomEnvironment::ModuleLookupResult DomEnvironment::moduleIndexWithUriHelper(const DomItem &self, QString uri, int majorVersion, EnvLookup options) const { std::shared_ptr<ModuleIndex> res; if (options != EnvLookup::BaseOnly) @@ -1610,7 +1610,7 @@ DomEnvironment::ModuleLookupResult DomEnvironment::moduleIndexWithUriHelper(DomI } } -std::shared_ptr<ModuleIndex> DomEnvironment::moduleIndexWithUri(DomItem &self, QString uri, +std::shared_ptr<ModuleIndex> DomEnvironment::moduleIndexWithUri(const DomItem &self, QString uri, int majorVersion, EnvLookup options, Changeable changeable, ErrorHandler errorHandler) @@ -1670,7 +1670,7 @@ std::shared_ptr<ModuleIndex> DomEnvironment::moduleIndexWithUri(DomItem &self, Q return newModulePtr; } -std::shared_ptr<ModuleIndex> DomEnvironment::moduleIndexWithUri(DomItem &self, QString uri, +std::shared_ptr<ModuleIndex> DomEnvironment::moduleIndexWithUri(const DomItem &self, QString uri, int majorVersion, EnvLookup options) const { @@ -1680,7 +1680,7 @@ std::shared_ptr<ModuleIndex> DomEnvironment::moduleIndexWithUri(DomItem &self, Q std::shared_ptr<ExternalItemInfo<QmlDirectory>> -DomEnvironment::qmlDirectoryWithPath(DomItem &self, QString path, EnvLookup options) const +DomEnvironment::qmlDirectoryWithPath(const DomItem &self, QString path, EnvLookup options) const { if (options != EnvLookup::BaseOnly) { QMutexLocker l(mutex()); @@ -1693,7 +1693,7 @@ DomEnvironment::qmlDirectoryWithPath(DomItem &self, QString path, EnvLookup opti return {}; } -QSet<QString> DomEnvironment::qmlDirectoryPaths(DomItem &, EnvLookup options) const +QSet<QString> DomEnvironment::qmlDirectoryPaths(const DomItem &, EnvLookup options) const { return getStrings<std::shared_ptr<ExternalItemInfo<QmlDirectory>>>( [this] { @@ -1704,7 +1704,7 @@ QSet<QString> DomEnvironment::qmlDirectoryPaths(DomItem &, EnvLookup options) co } std::shared_ptr<ExternalItemInfo<QmldirFile>> -DomEnvironment::qmldirFileWithPath(DomItem &self, QString path, EnvLookup options) const +DomEnvironment::qmldirFileWithPath(const DomItem &self, QString path, EnvLookup options) const { if (options != EnvLookup::BaseOnly) { QMutexLocker l(mutex()); @@ -1717,7 +1717,7 @@ DomEnvironment::qmldirFileWithPath(DomItem &self, QString path, EnvLookup option return {}; } -QSet<QString> DomEnvironment::qmldirFilePaths(DomItem &, EnvLookup lOptions) const +QSet<QString> DomEnvironment::qmldirFilePaths(const DomItem &, EnvLookup lOptions) const { return getStrings<std::shared_ptr<ExternalItemInfo<QmldirFile>>>( [this] { @@ -1727,7 +1727,7 @@ QSet<QString> DomEnvironment::qmldirFilePaths(DomItem &, EnvLookup lOptions) con m_qmldirFileWithPath, lOptions); } -std::shared_ptr<ExternalItemInfoBase> DomEnvironment::qmlDirWithPath(DomItem &self, QString path, +std::shared_ptr<ExternalItemInfoBase> DomEnvironment::qmlDirWithPath(const DomItem &self, QString path, EnvLookup options) const { if (auto qmldirFile = qmldirFileWithPath(self, path + QLatin1String("/qmldir"), options)) @@ -1735,7 +1735,7 @@ std::shared_ptr<ExternalItemInfoBase> DomEnvironment::qmlDirWithPath(DomItem &se return qmlDirectoryWithPath(self, path, options); } -QSet<QString> DomEnvironment::qmlDirPaths(DomItem &self, EnvLookup options) const +QSet<QString> DomEnvironment::qmlDirPaths(const DomItem &self, EnvLookup options) const { QSet<QString> res = qmlDirectoryPaths(self, options); const auto qmldirFiles = qmldirFilePaths(self, options); @@ -1753,7 +1753,7 @@ QSet<QString> DomEnvironment::qmlDirPaths(DomItem &self, EnvLookup options) cons } std::shared_ptr<ExternalItemInfo<QmlFile>> -DomEnvironment::qmlFileWithPath(DomItem &self, QString path, EnvLookup options) const +DomEnvironment::qmlFileWithPath(const DomItem &self, QString path, EnvLookup options) const { if (options != EnvLookup::BaseOnly) { QMutexLocker l(mutex()); @@ -1766,7 +1766,7 @@ DomEnvironment::qmlFileWithPath(DomItem &self, QString path, EnvLookup options) return {}; } -QSet<QString> DomEnvironment::qmlFilePaths(DomItem &, EnvLookup lookup) const +QSet<QString> DomEnvironment::qmlFilePaths(const DomItem &, EnvLookup lookup) const { return getStrings<std::shared_ptr<ExternalItemInfo<QmlFile>>>( [this] { @@ -1777,7 +1777,7 @@ QSet<QString> DomEnvironment::qmlFilePaths(DomItem &, EnvLookup lookup) const } std::shared_ptr<ExternalItemInfo<JsFile>> -DomEnvironment::jsFileWithPath(DomItem &self, QString path, EnvLookup options) const +DomEnvironment::jsFileWithPath(const DomItem &self, QString path, EnvLookup options) const { if (options != EnvLookup::BaseOnly) { QMutexLocker l(mutex()); @@ -1789,7 +1789,7 @@ DomEnvironment::jsFileWithPath(DomItem &self, QString path, EnvLookup options) c return {}; } -QSet<QString> DomEnvironment::jsFilePaths(DomItem &, EnvLookup lookup) const +QSet<QString> DomEnvironment::jsFilePaths(const DomItem &, EnvLookup lookup) const { return getStrings<std::shared_ptr<ExternalItemInfo<JsFile>>>( [this] { @@ -1800,7 +1800,7 @@ QSet<QString> DomEnvironment::jsFilePaths(DomItem &, EnvLookup lookup) const } std::shared_ptr<ExternalItemInfo<QmltypesFile>> -DomEnvironment::qmltypesFileWithPath(DomItem &self, QString path, EnvLookup options) const +DomEnvironment::qmltypesFileWithPath(const DomItem &self, QString path, EnvLookup options) const { if (options != EnvLookup::BaseOnly) { QMutexLocker l(mutex()); @@ -1812,7 +1812,7 @@ DomEnvironment::qmltypesFileWithPath(DomItem &self, QString path, EnvLookup opti return {}; } -QSet<QString> DomEnvironment::qmltypesFilePaths(DomItem &, EnvLookup lookup) const +QSet<QString> DomEnvironment::qmltypesFilePaths(const DomItem &, EnvLookup lookup) const { return getStrings<std::shared_ptr<ExternalItemInfo<QmltypesFile>>>( [this] { @@ -1823,7 +1823,7 @@ QSet<QString> DomEnvironment::qmltypesFilePaths(DomItem &, EnvLookup lookup) con } std::shared_ptr<ExternalItemInfo<GlobalScope>> -DomEnvironment::globalScopeWithName(DomItem &self, QString name, EnvLookup lookupOptions) const +DomEnvironment::globalScopeWithName(const DomItem &self, QString name, EnvLookup lookupOptions) const { if (lookupOptions != EnvLookup::BaseOnly) { QMutexLocker l(mutex()); @@ -1837,7 +1837,7 @@ DomEnvironment::globalScopeWithName(DomItem &self, QString name, EnvLookup looku } std::shared_ptr<ExternalItemInfo<GlobalScope>> -DomEnvironment::ensureGlobalScopeWithName(DomItem &self, QString name, EnvLookup lookupOptions) +DomEnvironment::ensureGlobalScopeWithName(const DomItem &self, QString name, EnvLookup lookupOptions) { if (auto current = globalScopeWithName(self, name, lookupOptions)) return current; @@ -1860,7 +1860,7 @@ DomEnvironment::ensureGlobalScopeWithName(DomItem &self, QString name, EnvLookup return {}; } -QSet<QString> DomEnvironment::globalScopeNames(DomItem &, EnvLookup lookupOptions) const +QSet<QString> DomEnvironment::globalScopeNames(const DomItem &, EnvLookup lookupOptions) const { QSet<QString> res; if (lookupOptions != EnvLookup::NoBase && m_base) { @@ -1885,7 +1885,7 @@ QSet<QString> DomEnvironment::globalScopeNames(DomItem &, EnvLookup lookupOption return res; } -void DomEnvironment::addLoadInfo(DomItem &self, std::shared_ptr<LoadInfo> loadInfo) +void DomEnvironment::addLoadInfo(const DomItem &self, std::shared_ptr<LoadInfo> loadInfo) { if (!loadInfo) return; @@ -1925,7 +1925,7 @@ QList<Path> DomEnvironment::loadInfoPaths() const return lInfos.keys(); } -DomItem::Callback DomEnvironment::callbackForQmlDirectory(DomItem &self, Callback loadCallback, +DomItem::Callback DomEnvironment::callbackForQmlDirectory(const DomItem &self, Callback loadCallback, Callback allDirectDepsCallback, Callback endCallback) { @@ -1934,7 +1934,7 @@ DomItem::Callback DomEnvironment::callbackForQmlDirectory(DomItem &self, Callbac allDirectDepsCallback, endCallback); } -DomItem::Callback DomEnvironment::callbackForQmlFile(DomItem &self, Callback loadCallback, +DomItem::Callback DomEnvironment::callbackForQmlFile(const DomItem &self, Callback loadCallback, Callback allDirectDepsCallback, Callback endCallback) { @@ -1943,14 +1943,14 @@ DomItem::Callback DomEnvironment::callbackForQmlFile(DomItem &self, Callback loa allDirectDepsCallback, endCallback); } -DomTop::Callback DomEnvironment::callbackForQmltypesFile(DomItem &self, +DomTop::Callback DomEnvironment::callbackForQmltypesFile(const DomItem &self, DomTop::Callback loadCallback, Callback allDirectDepsCallback, DomTop::Callback endCallback) { return envCallbackForFile<QmltypesFile>( self, &DomEnvironment::m_qmltypesFileWithPath, &DomEnvironment::qmltypesFileWithPath, - [loadCallback](Path p, DomItem &oldV, DomItem &newV) { + [loadCallback](Path p, const DomItem &oldV, const DomItem &newV) { DomItem newFile = newV.field(Fields::currentItem); if (std::shared_ptr<QmltypesFile> newFilePtr = newFile.ownerAs<QmltypesFile>()) newFilePtr->ensureInModuleIndex(newFile); @@ -1960,7 +1960,7 @@ DomTop::Callback DomEnvironment::callbackForQmltypesFile(DomItem &self, allDirectDepsCallback, endCallback); } -DomTop::Callback DomEnvironment::callbackForQmldirFile(DomItem &self, DomTop::Callback loadCallback, +DomTop::Callback DomEnvironment::callbackForQmldirFile(const DomItem &self, DomTop::Callback loadCallback, Callback allDirectDepsCallback, DomTop::Callback endCallback) { @@ -1977,7 +1977,7 @@ DomEnvironment::DomEnvironment(QStringList loadPaths, Options options, m_implicitImports(defaultImplicitImports()) {} -DomItem DomEnvironment::create(QStringList loadPaths, Options options, DomItem &universe) +DomItem DomEnvironment::create(QStringList loadPaths, Options options, const DomItem &universe) { std::shared_ptr<DomUniverse> universePtr = universe.ownerAs<DomUniverse>(); auto envPtr = std::make_shared<DomEnvironment>(loadPaths, options, universePtr); @@ -2063,7 +2063,7 @@ DomEnvironment::addGlobalScope(std::shared_ptr<GlobalScope> scope, AddOption opt mutex()); } -bool DomEnvironment::commitToBase(DomItem &self, shared_ptr<DomEnvironment> validEnvPtr) +bool DomEnvironment::commitToBase(const DomItem &self, shared_ptr<DomEnvironment> validEnvPtr) { if (!base()) return false; @@ -2149,7 +2149,7 @@ bool DomEnvironment::commitToBase(DomItem &self, shared_ptr<DomEnvironment> vali return true; } -void DomEnvironment::loadPendingDependencies(DomItem &self) +void DomEnvironment::loadPendingDependencies(const DomItem &self) { while (true) { Path elToDo; @@ -2192,7 +2192,7 @@ void DomEnvironment::loadPendingDependencies(DomItem &self) } } -bool DomEnvironment::finishLoadingDependencies(DomItem &self, int waitMSec) +bool DomEnvironment::finishLoadingDependencies(const DomItem &self, int waitMSec) { bool hasPendingLoads = true; QDateTime endTime = QDateTime::currentDateTimeUtc().addMSecs(waitMSec); @@ -2270,7 +2270,7 @@ QList<Import> DomEnvironment::implicitImports() const return m_implicitImports; } -void DomEnvironment::addAllLoadedCallback(DomItem &self, DomTop::Callback c) +void DomEnvironment::addAllLoadedCallback(const DomItem &self, DomTop::Callback c) { if (c) { bool immediate = false; @@ -2291,14 +2291,14 @@ void DomEnvironment::clearReferenceCache() m_referenceCache.clear(); } -QString ExternalItemInfoBase::canonicalFilePath(DomItem &self) const +QString ExternalItemInfoBase::canonicalFilePath(const DomItem &self) const { shared_ptr<ExternalOwningItem> current = currentItem(); DomItem currentObj = currentItem(self); return current->canonicalFilePath(currentObj); } -bool ExternalItemInfoBase::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool ExternalItemInfoBase::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { if (!self.dvValueLazyField(visitor, Fields::currentRevision, [this, &self]() { return currentRevision(self); })) @@ -2318,38 +2318,38 @@ bool ExternalItemInfoBase::iterateDirectSubpaths(DomItem &self, DirectVisitor vi return true; } -int ExternalItemInfoBase::currentRevision(DomItem &) const +int ExternalItemInfoBase::currentRevision(const DomItem &) const { return currentItem()->revision(); } -int ExternalItemInfoBase::lastRevision(DomItem &self) const +int ExternalItemInfoBase::lastRevision(const DomItem &self) const { Path p = currentItem()->canonicalPath(); DomItem lastValue = self.universe()[p.mid(1, p.length() - 1)].field(u"revision"); return static_cast<int>(lastValue.value().toInteger(0)); } -int ExternalItemInfoBase::lastValidRevision(DomItem &self) const +int ExternalItemInfoBase::lastValidRevision(const DomItem &self) const { Path p = currentItem()->canonicalPath(); DomItem lastValidValue = self.universe()[p.mid(1, p.length() - 2)].field(u"validItem").field(u"revision"); return static_cast<int>(lastValidValue.value().toInteger(0)); } -QString ExternalItemPairBase::canonicalFilePath(DomItem &) const +QString ExternalItemPairBase::canonicalFilePath(const DomItem &) const { shared_ptr<ExternalOwningItem> current = currentItem(); return current->canonicalFilePath(); } -Path ExternalItemPairBase::canonicalPath(DomItem &) const +Path ExternalItemPairBase::canonicalPath(const DomItem &) const { shared_ptr<ExternalOwningItem> current = currentItem(); return current->canonicalPath().dropTail(); } -bool ExternalItemPairBase::iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) +bool ExternalItemPairBase::iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const { if (!self.dvValueLazyField(visitor, Fields::currentIsValid, [this]() { return currentIsValid(); })) @@ -2371,7 +2371,7 @@ bool ExternalItemPairBase::currentIsValid() const return currentItem() == validItem(); } -RefCacheEntry RefCacheEntry::forPath(DomItem &el, Path canonicalPath) +RefCacheEntry RefCacheEntry::forPath(const DomItem &el, Path canonicalPath) { DomItem env = el.environment(); std::shared_ptr<DomEnvironment> envPtr = env.ownerAs<DomEnvironment>(); @@ -2387,7 +2387,7 @@ RefCacheEntry RefCacheEntry::forPath(DomItem &el, Path canonicalPath) return cached; } -bool RefCacheEntry::addForPath(DomItem &el, Path canonicalPath, const RefCacheEntry &entry, +bool RefCacheEntry::addForPath(const DomItem &el, Path canonicalPath, const RefCacheEntry &entry, AddOption addOption) { DomItem env = el.environment(); diff --git a/src/qmldom/qqmldomtop_p.h b/src/qmldom/qqmldomtop_p.h index 5a6ac8f047..6d1637c859 100644 --- a/src/qmldom/qqmldomtop_p.h +++ b/src/qmldom/qqmldomtop_p.h @@ -58,7 +58,7 @@ public: DomType kind; FileToLoad file; std::weak_ptr<DomUniverse> requestingUniverse; // make it a shared_ptr? - function<void(Path, DomItem &, DomItem &)> callback; + function<void(Path, const DomItem &, const DomItem &)> callback; }; class QMLDOM_EXPORT ExternalItemPairBase: public OwningItem { // all access should have the lock of the DomUniverse containing this @@ -78,21 +78,21 @@ public: OwningItem(o), validExposedAt(o.validExposedAt), currentExposedAt(o.currentExposedAt) {} virtual std::shared_ptr<ExternalOwningItem> validItem() const = 0; - virtual DomItem validItem(DomItem &self) const = 0; + virtual DomItem validItem(const DomItem &self) const = 0; virtual std::shared_ptr<ExternalOwningItem> currentItem() const = 0; - virtual DomItem currentItem(DomItem &self) const = 0; + virtual DomItem currentItem(const DomItem &self) const = 0; - QString canonicalFilePath(DomItem &) const final override; - Path canonicalPath(DomItem &self) const final override; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) final override; - DomItem field(DomItem &self, QStringView name) const final override + QString canonicalFilePath(const DomItem &) const final override; + Path canonicalPath(const DomItem &self) const final override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const final override; + DomItem field(const DomItem &self, QStringView name) const final override { return OwningItem::field(self, name); } bool currentIsValid() const; - std::shared_ptr<ExternalItemPairBase> makeCopy(DomItem &self) const + std::shared_ptr<ExternalItemPairBase> makeCopy(const DomItem &self) const { return std::static_pointer_cast<ExternalItemPairBase>(doCopy(self)); } @@ -121,7 +121,7 @@ template<class T> class QMLDOM_EXPORT ExternalItemPair final : public ExternalItemPairBase { // all access should have the lock of the DomUniverse containing this protected: - std::shared_ptr<OwningItem> doCopy(DomItem &) const override + std::shared_ptr<OwningItem> doCopy(const DomItem &) const override { return std::make_shared<ExternalItemPair>(*this); } @@ -143,10 +143,10 @@ public: { } std::shared_ptr<ExternalOwningItem> validItem() const override { return valid; } - DomItem validItem(DomItem &self) const override { return self.copy(valid); } + DomItem validItem(const DomItem &self) const override { return self.copy(valid); } std::shared_ptr<ExternalOwningItem> currentItem() const override { return current; } - DomItem currentItem(DomItem &self) const override { return self.copy(current); } - std::shared_ptr<ExternalItemPair> makeCopy(DomItem &self) const + DomItem currentItem(const DomItem &self) const override { return self.copy(current); } + std::shared_ptr<ExternalItemPair> makeCopy(const DomItem &self) const { return std::static_pointer_cast<ExternalItemPair>(doCopy(self)); } @@ -173,9 +173,9 @@ public: virtual Path canonicalPath() const = 0; - Path canonicalPath(DomItem &) const override; - DomItem containingObject(DomItem &) const override; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; + Path canonicalPath(const DomItem &) const override; + DomItem containingObject(const DomItem &) const override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; template<typename T> void setExtraOwningItem(QString fieldName, std::shared_ptr<T> item) { @@ -198,7 +198,7 @@ class QMLDOM_EXPORT DomUniverse final : public DomTop Q_GADGET Q_DECLARE_TR_FUNCTIONS(DomUniverse); protected: - std::shared_ptr<OwningItem> doCopy(DomItem &self) const override; + std::shared_ptr<OwningItem> doCopy(const DomItem &self) const override; public: enum class Option{ @@ -219,13 +219,13 @@ public: Path canonicalPath() const override; using DomTop::canonicalPath; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; - std::shared_ptr<DomUniverse> makeCopy(DomItem &self) const + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; + std::shared_ptr<DomUniverse> makeCopy(const DomItem &self) const { return std::static_pointer_cast<DomUniverse>(doCopy(self)); } - void loadFile(DomItem &self, const FileToLoad &file, Callback callback, LoadOptions loadOptions, + void loadFile(const DomItem &self, const FileToLoad &file, Callback callback, LoadOptions loadOptions, std::optional<DomType> fileType = std::optional<DomType>()); void execQueue(); @@ -377,22 +377,22 @@ public: ExternalItemInfoBase(const ExternalItemInfoBase &o) = default; virtual std::shared_ptr<ExternalOwningItem> currentItem() const = 0; - virtual DomItem currentItem(DomItem &) const = 0; + virtual DomItem currentItem(const DomItem &) const = 0; - QString canonicalFilePath(DomItem &) const final override; + QString canonicalFilePath(const DomItem &) const final override; Path canonicalPath() const { return m_canonicalPath; } - Path canonicalPath(DomItem &) const final override { return canonicalPath(); } - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) final override; - DomItem field(DomItem &self, QStringView name) const final override + Path canonicalPath(const DomItem &) const final override { return canonicalPath(); } + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const final override; + DomItem field(const DomItem &self, QStringView name) const final override { return OwningItem::field(self, name); } - int currentRevision(DomItem &self) const; - int lastRevision(DomItem &self) const; - int lastValidRevision(DomItem &self) const; + int currentRevision(const DomItem &self) const; + int lastRevision(const DomItem &self) const; + int lastValidRevision(const DomItem &self) const; - std::shared_ptr<ExternalItemInfoBase> makeCopy(DomItem &self) const + std::shared_ptr<ExternalItemInfoBase> makeCopy(const DomItem &self) const { return std::static_pointer_cast<ExternalItemInfoBase>(doCopy(self)); } @@ -444,7 +444,7 @@ template<typename T> class ExternalItemInfo final : public ExternalItemInfoBase { protected: - std::shared_ptr<OwningItem> doCopy(DomItem &) const override + std::shared_ptr<OwningItem> doCopy(const DomItem &) const override { return std::make_shared<ExternalItemInfo>(*this); } @@ -465,7 +465,7 @@ public: { } - std::shared_ptr<ExternalItemInfo> makeCopy(DomItem &self) const + std::shared_ptr<ExternalItemInfo> makeCopy(const DomItem &self) const { return std::static_pointer_cast<ExternalItemInfo>(doCopy(self)); } @@ -473,7 +473,7 @@ public: std::shared_ptr<ExternalOwningItem> currentItem() const override { return current; } - DomItem currentItem(DomItem &self) const override { return self.copy(current); } + DomItem currentItem(const DomItem &self) const override { return self.copy(current); } std::shared_ptr<T> current; }; @@ -497,7 +497,7 @@ class QMLDOM_EXPORT LoadInfo final : public OwningItem Q_DECLARE_TR_FUNCTIONS(LoadInfo); protected: - std::shared_ptr<OwningItem> doCopy(DomItem &self) const override; + std::shared_ptr<OwningItem> doCopy(const DomItem &self) const override; public: constexpr static DomType kindValue = DomType::LoadInfo; @@ -532,23 +532,23 @@ public: } } - Path canonicalPath(DomItem &self) const override; + Path canonicalPath(const DomItem &self) const override; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; - std::shared_ptr<LoadInfo> makeCopy(DomItem &self) const + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; + std::shared_ptr<LoadInfo> makeCopy(const DomItem &self) const { return std::static_pointer_cast<LoadInfo>(doCopy(self)); } - void addError(DomItem &self, ErrorMessage msg) override + void addError(const DomItem &self, ErrorMessage msg) override { self.path(elementCanonicalPath()).addError(msg); } - void addEndCallback(DomItem &self, std::function<void(Path, DomItem &, DomItem &)> callback); + void addEndCallback(const DomItem &self, std::function<void(Path, const DomItem &, const DomItem &)> callback); - void advanceLoad(DomItem &self); - void finishedLoadingDep(DomItem &self, const Dependency &d); - void execEnd(DomItem &self); + void advanceLoad(const DomItem &self); + void finishedLoadingDep(const DomItem &self, const Dependency &d); + void execEnd(const DomItem &self); Status status() const { @@ -593,15 +593,15 @@ public: } private: - void doAddDependencies(DomItem &self); - void addDependency(DomItem &self, const Dependency &dep); + void doAddDependencies(const DomItem &self); + void addDependency(const DomItem &self, const Dependency &dep); Path m_elementCanonicalPath; Status m_status; int m_nLoaded; QQueue<Dependency> m_toDo; QList<Dependency> m_inProgress; - QList<std::function<void(Path, DomItem &, DomItem &)>> m_endCallbacks; + QList<std::function<void(Path, const DomItem &, const DomItem &)>> m_endCallbacks; }; enum class EnvLookup { Normal, NoBase, BaseOnly }; @@ -615,8 +615,8 @@ public: enum class Cached { None, First, All }; Q_ENUM(Cached) - static RefCacheEntry forPath(DomItem &el, Path canonicalPath); - static bool addForPath(DomItem &el, Path canonicalPath, const RefCacheEntry &entry, + static RefCacheEntry forPath(const DomItem &el, Path canonicalPath); + static bool addForPath(const DomItem &el, Path canonicalPath, const RefCacheEntry &entry, AddOption addOption = AddOption::KeepExisting); Cached cached = Cached::None; @@ -628,7 +628,7 @@ class QMLDOM_EXPORT DomEnvironment final : public DomTop Q_GADGET Q_DECLARE_TR_FUNCTIONS(DomEnvironment); protected: - std::shared_ptr<OwningItem> doCopy(DomItem &self) const override; + std::shared_ptr<OwningItem> doCopy(const DomItem &self) const override; public: enum class Option { @@ -649,54 +649,54 @@ public: Path canonicalPath() const override; using DomTop::canonicalPath; - bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override; - DomItem field(DomItem &self, QStringView name) const final override; + bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override; + DomItem field(const DomItem &self, QStringView name) const final override; - std::shared_ptr<DomEnvironment> makeCopy(DomItem &self) const; + std::shared_ptr<DomEnvironment> makeCopy(const DomItem &self) const; - void loadFile(DomItem &self, FileToLoad file, Callback loadCallback, + void loadFile(const DomItem &self, FileToLoad file, Callback loadCallback, Callback directDepsCallback, Callback endCallback, LoadOptions loadOptions, std::optional<DomType> fileType = std::optional<DomType>(), ErrorHandler h = nullptr); - void loadModuleDependency(DomItem &self, QString uri, Version v, + void loadModuleDependency(const DomItem &self, QString uri, Version v, Callback loadCallback = nullptr, Callback endCallback = nullptr, ErrorHandler = nullptr); - void loadBuiltins(DomItem &self, Callback callback = nullptr, ErrorHandler h = nullptr); + void loadBuiltins(const DomItem &self, Callback callback = nullptr, ErrorHandler h = nullptr); void removePath(const QString &path); std::shared_ptr<DomUniverse> universe() const; - QSet<QString> moduleIndexUris(DomItem &self, EnvLookup lookup = EnvLookup::Normal) const; - QSet<int> moduleIndexMajorVersions(DomItem &self, QString uri, + QSet<QString> moduleIndexUris(const DomItem &self, EnvLookup lookup = EnvLookup::Normal) const; + QSet<int> moduleIndexMajorVersions(const DomItem &self, QString uri, EnvLookup lookup = EnvLookup::Normal) const; - std::shared_ptr<ModuleIndex> moduleIndexWithUri(DomItem &self, QString uri, int majorVersion, + std::shared_ptr<ModuleIndex> moduleIndexWithUri(const DomItem &self, QString uri, int majorVersion, EnvLookup lookup, Changeable changeable, ErrorHandler errorHandler = nullptr); - std::shared_ptr<ModuleIndex> moduleIndexWithUri(DomItem &self, QString uri, int majorVersion, + std::shared_ptr<ModuleIndex> moduleIndexWithUri(const DomItem &self, QString uri, int majorVersion, EnvLookup lookup = EnvLookup::Normal) const; std::shared_ptr<ExternalItemInfo<QmlDirectory>> - qmlDirectoryWithPath(DomItem &self, QString path, EnvLookup options = EnvLookup::Normal) const; - QSet<QString> qmlDirectoryPaths(DomItem &self, EnvLookup options = EnvLookup::Normal) const; + qmlDirectoryWithPath(const DomItem &self, QString path, EnvLookup options = EnvLookup::Normal) const; + QSet<QString> qmlDirectoryPaths(const DomItem &self, EnvLookup options = EnvLookup::Normal) const; std::shared_ptr<ExternalItemInfo<QmldirFile>> - qmldirFileWithPath(DomItem &self, QString path, EnvLookup options = EnvLookup::Normal) const; - QSet<QString> qmldirFilePaths(DomItem &self, EnvLookup options = EnvLookup::Normal) const; + qmldirFileWithPath(const DomItem &self, QString path, EnvLookup options = EnvLookup::Normal) const; + QSet<QString> qmldirFilePaths(const DomItem &self, EnvLookup options = EnvLookup::Normal) const; std::shared_ptr<ExternalItemInfoBase> - qmlDirWithPath(DomItem &self, QString path, EnvLookup options = EnvLookup::Normal) const; - QSet<QString> qmlDirPaths(DomItem &self, EnvLookup options = EnvLookup::Normal) const; + qmlDirWithPath(const DomItem &self, QString path, EnvLookup options = EnvLookup::Normal) const; + QSet<QString> qmlDirPaths(const DomItem &self, EnvLookup options = EnvLookup::Normal) const; std::shared_ptr<ExternalItemInfo<QmlFile>> - qmlFileWithPath(DomItem &self, QString path, EnvLookup options = EnvLookup::Normal) const; - QSet<QString> qmlFilePaths(DomItem &self, EnvLookup lookup = EnvLookup::Normal) const; + qmlFileWithPath(const DomItem &self, QString path, EnvLookup options = EnvLookup::Normal) const; + QSet<QString> qmlFilePaths(const DomItem &self, EnvLookup lookup = EnvLookup::Normal) const; std::shared_ptr<ExternalItemInfo<JsFile>> - jsFileWithPath(DomItem &self, QString path, EnvLookup options = EnvLookup::Normal) const; - QSet<QString> jsFilePaths(DomItem &self, EnvLookup lookup = EnvLookup::Normal) const; + jsFileWithPath(const DomItem &self, QString path, EnvLookup options = EnvLookup::Normal) const; + QSet<QString> jsFilePaths(const DomItem &self, EnvLookup lookup = EnvLookup::Normal) const; std::shared_ptr<ExternalItemInfo<QmltypesFile>> - qmltypesFileWithPath(DomItem &self, QString path, EnvLookup options = EnvLookup::Normal) const; - QSet<QString> qmltypesFilePaths(DomItem &self, EnvLookup lookup = EnvLookup::Normal) const; + qmltypesFileWithPath(const DomItem &self, QString path, EnvLookup options = EnvLookup::Normal) const; + QSet<QString> qmltypesFilePaths(const DomItem &self, EnvLookup lookup = EnvLookup::Normal) const; std::shared_ptr<ExternalItemInfo<GlobalScope>> - globalScopeWithName(DomItem &self, QString name, EnvLookup lookup = EnvLookup::Normal) const; + globalScopeWithName(const DomItem &self, QString name, EnvLookup lookup = EnvLookup::Normal) const; std::shared_ptr<ExternalItemInfo<GlobalScope>> - ensureGlobalScopeWithName(DomItem &self, QString name, EnvLookup lookup = EnvLookup::Normal); - QSet<QString> globalScopeNames(DomItem &self, EnvLookup lookup = EnvLookup::Normal) const; + ensureGlobalScopeWithName(const DomItem &self, QString name, EnvLookup lookup = EnvLookup::Normal); + QSet<QString> globalScopeNames(const DomItem &self, EnvLookup lookup = EnvLookup::Normal) const; explicit DomEnvironment(QStringList loadPaths, Options options = Option::SingleThreaded, std::shared_ptr<DomUniverse> universe = nullptr); @@ -704,7 +704,7 @@ public: Options options = Option::SingleThreaded); DomEnvironment(const DomEnvironment &o) = delete; static DomItem create(QStringList loadPaths, Options options = Option::SingleThreaded, - DomItem &universe = DomItem::empty); + const DomItem &universe = DomItem::empty); std::shared_ptr<ExternalItemInfo<QmlFile>> addQmlFile(std::shared_ptr<QmlFile> file, AddOption option = AddOption::KeepExisting); @@ -719,14 +719,14 @@ public: std::shared_ptr<ExternalItemInfo<GlobalScope>> addGlobalScope(std::shared_ptr<GlobalScope> file, AddOption option = AddOption::KeepExisting); - bool commitToBase(DomItem &self, std::shared_ptr<DomEnvironment> validEnv = nullptr); + bool commitToBase(const DomItem &self, std::shared_ptr<DomEnvironment> validEnv = nullptr); - void addLoadInfo(DomItem &self, std::shared_ptr<LoadInfo> loadInfo); + void addLoadInfo(const DomItem &self, std::shared_ptr<LoadInfo> loadInfo); std::shared_ptr<LoadInfo> loadInfo(Path path) const; QList<Path> loadInfoPaths() const; QHash<Path, std::shared_ptr<LoadInfo>> loadInfos() const; - void loadPendingDependencies(DomItem &self); - bool finishLoadingDependencies(DomItem &self, int waitMSec = 30000); + void loadPendingDependencies(const DomItem &self); + bool finishLoadingDependencies(const DomItem &self, int waitMSec = 30000); void addWorkForLoadInfo(Path elementCanonicalPath); Options options() const; @@ -741,7 +741,7 @@ public: static QList<Import> defaultImplicitImports(); QList<Import> implicitImports() const; - void addAllLoadedCallback(DomItem &self, Callback c); + void addAllLoadedCallback(const DomItem &self, Callback c); void clearReferenceCache(); void setLoadPaths(const QStringList &v); @@ -752,13 +752,13 @@ private: QSet<QString> getStrings(function_ref<QSet<QString>()> getBase, const QMap<QString, T> &selfMap, EnvLookup lookup) const; - Callback callbackForQmlDirectory(DomItem &self, Callback loadCallback, + Callback callbackForQmlDirectory(const DomItem &self, Callback loadCallback, Callback directDepsCallback, Callback endCallback); - Callback callbackForQmlFile(DomItem &self, Callback loadCallback, Callback directDepsCallback, + Callback callbackForQmlFile(const DomItem &self, Callback loadCallback, Callback directDepsCallback, Callback endCallback); - Callback callbackForQmltypesFile(DomItem &self, Callback loadCallback, + Callback callbackForQmltypesFile(const DomItem &self, Callback loadCallback, Callback directDepsCallback, Callback endCallback); - Callback callbackForQmldirFile(DomItem &self, Callback loadCallback, + Callback callbackForQmldirFile(const DomItem &self, Callback loadCallback, Callback directDepsCallback, Callback endCallback); std::shared_ptr<ModuleIndex> lookupModuleInEnv(const QString &uri, int majorVersion) const; @@ -770,7 +770,7 @@ private: Origin fromBase = FromGlobal; }; // helper function used by the moduleIndexWithUri methods - ModuleLookupResult moduleIndexWithUriHelper(DomItem &self, QString uri, int majorVersion, + ModuleLookupResult moduleIndexWithUriHelper(const DomItem &self, QString uri, int majorVersion, EnvLookup lookup = EnvLookup::Normal) const; const Options m_options; diff --git a/src/qmlls/qqmlcodemodel.cpp b/src/qmlls/qqmlcodemodel.cpp index efb2bc0695..a5f589a979 100644 --- a/src/qmlls/qqmlcodemodel.cpp +++ b/src/qmlls/qqmlcodemodel.cpp @@ -188,7 +188,7 @@ void QQmlCodeModel::indexDirectory(const QString &path, int depthLeft) FileToLoad::fromFileSystem(newCurrent.ownerAs<DomEnvironment>(), fPath, options); if (!fileToLoad.canonicalPath().isEmpty()) { newCurrent.loadBuiltins(); - newCurrent.loadFile(fileToLoad, [](Path, DomItem &, DomItem &) {}, {}); + newCurrent.loadFile(fileToLoad, [](Path, const DomItem &, const DomItem &) {}, {}); newCurrent.loadPendingDependencies(); newCurrent.commitToBase(m_validEnv.ownerAs<DomEnvironment>()); } @@ -427,7 +427,7 @@ void QQmlCodeModel::newDocForOpenFile(const QByteArray &url, int version, const options.setFlag(DomCreationOption::WithSemanticAnalysis); newCurrent.loadFile( FileToLoad::fromMemory(newCurrent.ownerAs<DomEnvironment>(), fPath, docText, options), - [&p](Path, DomItem &, DomItem &newValue) { p = newValue.fileObject().canonicalPath(); }, + [&p](Path, const DomItem &, const DomItem &newValue) { p = newValue.fileObject().canonicalPath(); }, {}); newCurrent.loadPendingDependencies(); if (p) { diff --git a/src/qmlls/qqmlcompletionsupport.cpp b/src/qmlls/qqmlcompletionsupport.cpp index 93b4a472df..321d205b1f 100644 --- a/src/qmlls/qqmlcompletionsupport.cpp +++ b/src/qmlls/qqmlcompletionsupport.cpp @@ -172,7 +172,7 @@ void CompletionRequest::sendCompletions(QmlLsp::OpenDocumentSnapshot &doc) m_response.sendResponse(res); } -static QList<CompletionItem> importCompletions(DomItem &file, const CompletionContextStrings &ctx) +static QList<CompletionItem> importCompletions(const DomItem &file, const CompletionContextStrings &ctx) { // returns completions for import statements, ctx is supposed to be in an import statement QList<CompletionItem> res; @@ -272,13 +272,13 @@ static QList<CompletionItem> idsCompletions(DomItem component) return res; } -static QList<CompletionItem> bindingsCompletions(DomItem &containingObject) +static QList<CompletionItem> bindingsCompletions(const DomItem &containingObject) { // returns valid bindings completions (i.e. reachable properties and signal handlers) QList<CompletionItem> res; qCDebug(complLog) << "binding completions"; containingObject.visitPrototypeChain( - [&res](DomItem &it) { + [&res](const DomItem &it) { qCDebug(complLog) << "prototypeChain" << it.internalKindStr() << it.canonicalPath(); if (const QmlObject *itPtr = it.as<QmlObject>()) { // signal handlers @@ -310,7 +310,7 @@ static QList<CompletionItem> bindingsCompletions(DomItem &containingObject) return res; } -static QList<CompletionItem> reachableSymbols(DomItem &context, const CompletionContextStrings &ctx, +static QList<CompletionItem> reachableSymbols(const DomItem &context, const CompletionContextStrings &ctx, TypeCompletionsType typeCompletionType, FunctionCompletion completeMethodCalls) { @@ -319,7 +319,7 @@ static QList<CompletionItem> reachableSymbols(DomItem &context, const Completion QMap<CompletionItemKind, QSet<QString>> symbols; QSet<quintptr> visited; QList<Path> visitedRefs; - auto addLocalSymbols = [&res, typeCompletionType, completeMethodCalls, &symbols](DomItem &el) { + auto addLocalSymbols = [&res, typeCompletionType, completeMethodCalls, &symbols](const DomItem &el) { switch (typeCompletionType) { case TypeCompletionsType::None: return false; @@ -411,8 +411,8 @@ static QList<CompletionItem> reachableSymbols(DomItem &context, const Completion } else { QList<QStringView> baseItems = ctx.base().split(u'.', Qt::SkipEmptyParts); Q_ASSERT(!baseItems.isEmpty()); - auto addReachableSymbols = [&visited, &visitedRefs, &addLocalSymbols](Path, - DomItem &it) -> bool { + auto addReachableSymbols = [&visited, &visitedRefs, &addLocalSymbols]( + Path, const DomItem &it) -> bool { qCDebug(complLog) << "adding directly accessible symbols of" << it.internalKindStr() << it.canonicalPath(); it.visitDirectAccessibleScopes(addLocalSymbols, VisitPrototypesOption::Normal, diff --git a/src/qmlls/qqmllsutils.cpp b/src/qmlls/qqmllsutils.cpp index 58bfecdc14..4edc062f99 100644 --- a/src/qmlls/qqmllsutils.cpp +++ b/src/qmlls/qqmllsutils.cpp @@ -35,7 +35,7 @@ Q_LOGGING_CATEGORY(QQmlLSUtilsLog, "qt.languageserver.utils") \internal Helper to check if item is a Field Member Expression \c {<someExpression>.propertyName}. */ -static bool isFieldMemberExpression(DomItem &item) +static bool isFieldMemberExpression(const DomItem &item) { return item.internalKind() == DomType::ScriptBinaryExpression && item.field(Fields::operation).value().toInteger() @@ -47,7 +47,7 @@ static bool isFieldMemberExpression(DomItem &item) Helper to check if item is a Field Member Access \c memberAccess in \c {<someExpression>.memberAccess}. */ -static bool isFieldMemberAccess(DomItem &item) +static bool isFieldMemberAccess(const DomItem &item) { auto parent = item.directParent(); if (!isFieldMemberExpression(parent)) @@ -289,7 +289,7 @@ DomItem QQmlLSUtils::baseObject(DomItem object) return base; } -static std::optional<QQmlLSUtilsLocation> locationFromDomItem(DomItem &item, +static std::optional<QQmlLSUtilsLocation> locationFromDomItem(const DomItem &item, const QString ®ionName = QString()) { QQmlLSUtilsLocation location; @@ -346,7 +346,7 @@ std::optional<QQmlLSUtilsLocation> QQmlLSUtils::findTypeDefinitionOf(DomItem obj const QString bindingName = binding->name(); object.containingObject().visitLookup( bindingName, - [&propertyDefinition](DomItem &item) { + [&propertyDefinition](const DomItem &item) { if (item.internalKind() == QQmlJS::Dom::DomType::PropertyDefinition) { propertyDefinition = item; return false; @@ -370,7 +370,7 @@ std::optional<QQmlLSUtilsLocation> QQmlLSUtils::findTypeDefinitionOf(DomItem obj case QQmlJS::Dom::DomType::ScriptIdentifierExpression: { if (object.directParent().internalKind() == DomType::ScriptType) { DomItem type = - object.filterUp([](DomType k, DomItem &) { return k == DomType::ScriptType; }, + object.filterUp([](DomType k, const DomItem &) { return k == DomType::ScriptType; }, FilterUpOptions::ReturnOuter); const QString name = type.field(Fields::typeName).value().toString(); @@ -419,7 +419,7 @@ static bool findDefinitionFromItem(DomItem item, const QString &name) static DomItem findJSIdentifierDefinition(DomItem item, const QString &name) { DomItem definitionOfItem; - item.visitUp([&name, &definitionOfItem](DomItem &i) { + item.visitUp([&name, &definitionOfItem](const DomItem &i) { if (findDefinitionFromItem(i, name)) { definitionOfItem = i; return false; @@ -435,7 +435,7 @@ static DomItem findJSIdentifierDefinition(DomItem item, const QString &name) // special case: somebody asks for usages of a function parameter from its definition // function parameters are defined in the method's scope - if (DomItem res = item.filterUp([](DomType k, DomItem &) { return k == DomType::MethodInfo; }, + if (DomItem res = item.filterUp([](DomType k, const DomItem &) { return k == DomType::MethodInfo; }, FilterUpOptions::ReturnOuter)) { DomItem candidate = res.field(Fields::body).field(Fields::scriptElement); if (findDefinitionFromItem(candidate, name)) { @@ -582,7 +582,7 @@ static void findUsagesOfNonJSIdentifiers(DomItem item, const QString &name, return namesToCheck.contains(nameToCheck); }; - auto findUsages = [&targetType, &result, &name, &checkName](Path, DomItem ¤t, + auto findUsages = [&targetType, &result, &name, &checkName](Path, const DomItem ¤t, bool) -> bool { bool resolveType = false; bool continueForChildren = true; @@ -691,7 +691,7 @@ static void findUsagesHelper(DomItem item, const QString &name, QList<QQmlLSUtil definitionOfItem.visitTree( Path(), emptyChildrenVisitor, VisitOption::VisitAdopted | VisitOption::Recurse, - [&name, &result](Path, DomItem &item, bool) -> bool { + [&name, &result](Path, const DomItem &item, bool) -> bool { qCDebug(QQmlLSUtilsLog) << "Visiting a " << item.internalKindStr(); if (item.internalKind() == DomType::ScriptIdentifierExpression && item.field(Fields::identifier).value().toString() == name) { @@ -812,7 +812,7 @@ propertyFromReferrerScope(const QQmlJSScope::ConstPtr &referrerScope, const QStr return {}; } -static QQmlJSScope::ConstPtr findScopeInConnections(QQmlJSScope::ConstPtr scope, DomItem &item) +static QQmlJSScope::ConstPtr findScopeInConnections(QQmlJSScope::ConstPtr scope, const DomItem &item) { if (!scope || (scope->baseType() && scope->baseType()->internalName() != u"QQmlConnections"_s)) return {}; diff --git a/tests/auto/qmldom/domitem/tst_qmldomitem.h b/tests/auto/qmldom/domitem/tst_qmldomitem.h index 9c6507510e..a400f02cf6 100644 --- a/tests/auto/qmldom/domitem/tst_qmldomitem.h +++ b/tests/auto/qmldom/domitem/tst_qmldomitem.h @@ -28,7 +28,7 @@ QT_BEGIN_NAMESPACE namespace QQmlJS { namespace Dom { -inline DomItem wrapInt(DomItem &self, const PathEls::PathComponent &p, const int &i) +inline DomItem wrapInt(const DomItem &self, const PathEls::PathComponent &p, const int &i) { return self.subDataItem(p, i); } @@ -536,13 +536,13 @@ private slots: QList<DomItem> rects; obj1.resolve( Path::Current(PathCurrent::Lookup).field(Fields::type).key(u"Rectangle"_s), - [&rects](Path, DomItem &el) { + [&rects](Path, const DomItem &el) { rects.append(el); return true; }, {}); QVERIFY(rects.size() == 1); - for (DomItem &el : rects) { + for (const DomItem &el : rects) { QCOMPARE(rect.first(), el); } } @@ -571,7 +571,7 @@ private slots: DomItem tFile; env.loadFile( FileToLoad::fromFileSystem(env.ownerAs<DomEnvironment>(), testFile1), - [&tFile](Path, DomItem &, DomItem &newIt) { tFile = newIt.fileObject(); }, + [&tFile](Path, const DomItem &, const DomItem &newIt) { tFile = newIt.fileObject(); }, LoadOption::DefaultLoad); env.loadPendingDependencies(); @@ -654,7 +654,7 @@ private slots: QCOMPARE(obj.name(), u"MyItem"); } - static void checkAliases(DomItem &qmlObj) + static void checkAliases(const DomItem &qmlObj) { using namespace Qt::StringLiterals; @@ -747,7 +747,7 @@ private slots: DomItem tFile; env.loadFile( FileToLoad::fromFileSystem(env.ownerAs<DomEnvironment>(), testFile1), - [&tFile](Path, DomItem &, DomItem &newIt) { tFile = newIt.fileObject(); }, + [&tFile](Path, const DomItem &, const DomItem &newIt) { tFile = newIt.fileObject(); }, LoadOption::DefaultLoad); env.loadPendingDependencies(); @@ -769,7 +769,7 @@ private slots: DomItem tFile; env.loadFile( FileToLoad::fromFileSystem(env.ownerAs<DomEnvironment>(), testFile), - [&tFile](Path, DomItem &, DomItem &newIt) { tFile = newIt.fileObject(); }, + [&tFile](Path, const DomItem &, const DomItem &newIt) { tFile = newIt.fileObject(); }, LoadOption::DefaultLoad); env.loadPendingDependencies(); @@ -803,7 +803,7 @@ private slots: DomItem tFile; env.loadFile( FileToLoad::fromFileSystem(env.ownerAs<DomEnvironment>(), testFile), - [&tFile](Path, DomItem &, DomItem &newIt) { tFile = newIt.fileObject(); }, + [&tFile](Path, const DomItem &, const DomItem &newIt) { tFile = newIt.fileObject(); }, LoadOption::DefaultLoad); env.loadPendingDependencies(); @@ -864,7 +864,7 @@ private slots: env.loadFile( FileToLoad::fromFileSystem(env.ownerAs<DomEnvironment>(), fileName, WithSemanticAnalysis), - [&tFile](Path, DomItem &, DomItem &newIt) { tFile = newIt.fileObject(); }, + [&tFile](Path, const DomItem &, const DomItem &newIt) { tFile = newIt.fileObject(); }, LoadOption::DefaultLoad); env.loadPendingDependencies(); @@ -2464,12 +2464,12 @@ private slots: env.loadFile( FileToLoad::fromFileSystem(env.ownerAs<DomEnvironment>(), filePathA, options), - [&fileA](Path, DomItem &, DomItem &newIt) { fileA = newIt.fileObject(); }, + [&fileA](Path, const DomItem &, const DomItem &newIt) { fileA = newIt.fileObject(); }, LoadOption::DefaultLoad); env.loadFile( FileToLoad::fromFileSystem(env.ownerAs<DomEnvironment>(), filePathB, options), - [&fileB](Path, DomItem &, DomItem &newIt) { fileB = newIt.fileObject(); }, + [&fileB](Path, const DomItem &, const DomItem &newIt) { fileB = newIt.fileObject(); }, LoadOption::DefaultLoad); env.loadPendingDependencies(); @@ -2491,14 +2491,14 @@ private: env.loadFile( FileToLoad::fromFileSystem(env.ownerAs<DomEnvironment>(), path, options), - [&tFile](Path, DomItem &, DomItem &newIt) { tFile = newIt.fileObject(); }, + [&tFile](Path, const DomItem &, const DomItem &newIt) { tFile = newIt.fileObject(); }, LoadOption::DefaultLoad); env.loadPendingDependencies(); return tFile.rootQmlObject(GoTo::MostLikely); } - void fieldMemberExpressionHelper(DomItem &actual, const QStringList &expected) + void fieldMemberExpressionHelper(const DomItem &actual, const QStringList &expected) { Q_ASSERT(!expected.isEmpty()); auto currentString = expected.rbegin(); diff --git a/tests/benchmarks/qml/qmldom/tst_qmldomconstruction.cpp b/tests/benchmarks/qml/qmldom/tst_qmldomconstruction.cpp index 2c713281ee..3c95b77784 100644 --- a/tests/benchmarks/qml/qmldom/tst_qmldomconstruction.cpp +++ b/tests/benchmarks/qml/qmldom/tst_qmldomconstruction.cpp @@ -61,7 +61,7 @@ void tst_qmldomconstruction::domConstructionTime() env.loadFile( FileToLoad::fromFileSystem(env.ownerAs<DomEnvironment>(), fileName, withScope), - [&tFile](Path, DomItem &, DomItem &newIt) { tFile = newIt.fileObject(); }, + [&tFile](Path, const DomItem &, const DomItem &newIt) { tFile = newIt.fileObject(); }, LoadOption::DefaultLoad); env.loadPendingDependencies(); } |