diff options
Diffstat (limited to 'src/qmldom/qqmldompath_p.h')
-rw-r--r-- | src/qmldom/qqmldompath_p.h | 402 |
1 files changed, 189 insertions, 213 deletions
diff --git a/src/qmldom/qqmldompath_p.h b/src/qmldom/qqmldompath_p.h index 859e23d1b0..1a5af85e8e 100644 --- a/src/qmldom/qqmldompath_p.h +++ b/src/qmldom/qqmldompath_p.h @@ -69,35 +69,21 @@ class Filter; class Base { public: - virtual ~Base() = default; - virtual Kind kind() const = 0; - virtual QString name() const = 0; - virtual bool checkName(QStringView s) const = 0; - virtual QStringView stringView() const { return QStringView(); } - virtual index_type index(index_type defaultValue=-1) const { return defaultValue; } - - virtual void dump(Sink sink) const; - virtual bool hasSquareBrackets() const { return false; } - - // casting, could use optional, but that is c++17... - virtual const Empty *asEmpty() const { return nullptr; } - virtual const Field *asField() const { return nullptr; } - virtual const Index *asIndex() const { return nullptr; } - virtual const Key *asKey() const { return nullptr; } - virtual const Root *asRoot() const { return nullptr; } - virtual const Current *asCurrent() const { return nullptr; } - virtual const Any *asAny() const { return nullptr; } - virtual const Filter *asFilter() const { return nullptr; } + QStringView stringView() const { return QStringView(); } + index_type index(index_type defaultValue = -1) const { return defaultValue; } + bool hasSquareBrackets() const { return false; } + +protected: + void dump(const Sink &sink, const QString &name, bool hasSquareBrackets) const; }; class Empty final : public Base { public: Empty() = default; - Kind kind() const override { return Kind::Empty; } - QString name() const override { return QString(); } - bool checkName(QStringView s) const override { return s.isEmpty(); } - const Empty * asEmpty() const override { return this; } + QString name() const { return QString(); } + bool checkName(QStringView s) const { return s.isEmpty(); } + void dump(const Sink &sink) const { Base::dump(sink, name(), hasSquareBrackets()); } }; class Field final : public Base @@ -105,12 +91,10 @@ class Field final : public Base public: Field() = default; Field(QStringView n): fieldName(n) {} - Kind kind() const override { return Kind::Field; } - QString name() const override { return fieldName.toString(); } - bool checkName(QStringView s) const override { return s == fieldName; } - QStringView stringView() const override { return fieldName; } - const Field * asField() const override { return this; } - void dump(Sink sink) const override { sink(fieldName); } + QString name() const { return fieldName.toString(); } + bool checkName(QStringView s) const { return s == fieldName; } + QStringView stringView() const { return fieldName; } + void dump(const Sink &sink) const { sink(fieldName); } QStringView fieldName; }; @@ -120,12 +104,11 @@ class Index final : public Base public: Index() = default; Index(index_type i): indexValue(i) {} - Kind kind() const override { return Kind::Index; } - QString name() const override { return QString::number(indexValue); } - bool checkName(QStringView s) const override { return s == name(); } - index_type index(index_type = -1) const override { return indexValue; } - bool hasSquareBrackets() const override { return true; } - const Index * asIndex() const override { return this; } + QString name() const { return QString::number(indexValue); } + bool checkName(QStringView s) const { return s == name(); } + index_type index(index_type = -1) const { return indexValue; } + void dump(const Sink &sink) const { Base::dump(sink, name(), hasSquareBrackets()); } + bool hasSquareBrackets() const { return true; } index_type indexValue = -1; }; @@ -134,18 +117,16 @@ class Key final : public Base { public: Key() = default; - Key(QString n) : keyValue(n) { } - Kind kind() const override { return Kind::Key; } - QString name() const override { return keyValue; } - bool checkName(QStringView s) const override { return s == keyValue; } - QStringView stringView() const override { return keyValue; } - void dump(Sink sink) const override { + Key(const QString &n) : keyValue(n) { } + QString name() const { return keyValue; } + bool checkName(QStringView s) const { return s == keyValue; } + QStringView stringView() const { return keyValue; } + void dump(const Sink &sink) const { sink(u"["); sinkEscaped(sink, keyValue); sink(u"]"); } - bool hasSquareBrackets() const override { return true; } - const Key * asKey() const override { return this; } + bool hasSquareBrackets() const { return true; } QString keyValue; }; @@ -164,8 +145,7 @@ public: if (contextKind == PathRoot::Other) contextName = n; } - Kind kind() const override { return Kind::Root; } - QString name() const override { + QString name() const { switch (contextKind) { case PathRoot::Modules: return QStringLiteral(u"$modules"); @@ -185,16 +165,13 @@ public: Q_ASSERT(false && "Unexpected contextKind in name"); return QString(); } - bool checkName(QStringView s) const override { + bool checkName(QStringView s) const { if (contextKind != PathRoot::Other) return s.compare(name(), Qt::CaseInsensitive) == 0; return s.startsWith(QChar::fromLatin1('$')) && s.mid(1) == contextName; } - QStringView stringView() const override { return contextName; } - void dump(Sink sink) const override { - sink(name()); - } - const Root *asRoot() const override { return this; } + QStringView stringView() const { return contextName; } + void dump(const Sink &sink) const { sink(name()); } PathRoot contextKind = PathRoot::Other; QStringView contextName; @@ -214,8 +191,7 @@ public: if (contextKind == PathCurrent::Other) contextName = n; } - Kind kind() const override { return Kind::Current; } - QString name() const override { + QString name() const { switch (contextKind) { case PathCurrent::Other: return QString::fromUtf8("@").append(contextName.toString()); @@ -243,13 +219,13 @@ public: Q_ASSERT(false && "Unexpected contextKind in Current::name"); return QString(); } - bool checkName(QStringView s) const override { + bool checkName(QStringView s) const { if (contextKind != PathCurrent::Other) return s.compare(name(), Qt::CaseInsensitive) == 0; return s.startsWith(QChar::fromLatin1('@')) && s.mid(1) == contextName; } - QStringView stringView() const override { return contextName; } - const Current *asCurrent() const override { return this; } + QStringView stringView() const { return contextName; } + void dump(const Sink &sink) const { Base::dump(sink, name(), hasSquareBrackets()); } PathCurrent contextKind = PathCurrent::Other; QStringView contextName; @@ -259,160 +235,110 @@ class Any final : public Base { public: Any() = default; - Kind kind() const override { return Kind::Any; } - QString name() const override { return QLatin1String("*"); } - bool checkName(QStringView s) const override { return s == u"*"; } - bool hasSquareBrackets() const override { return true; } - const Any *asAny() const override { return this; } + QString name() const { return QLatin1String("*"); } + bool checkName(QStringView s) const { return s == u"*"; } + void dump(const Sink &sink) const { Base::dump(sink, name(), hasSquareBrackets()); } + bool hasSquareBrackets() const { return true; } }; class QMLDOM_EXPORT Filter final : public Base { public: Filter() = default; - Filter(std::function<bool(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; - QStringView stringView() const override { return filterDescription; } - bool hasSquareBrackets() const override { return true; } - const Filter *asFilter() const override { return this; } - - std::function<bool(DomItem)> filterFunction; + Filter(const std::function<bool(const DomItem &)> &f, + QStringView filterDescription = u"<native code filter>"); + QString name() const; + bool checkName(QStringView s) const; + QStringView stringView() const { return filterDescription; } + void dump(const Sink &sink) const { Base::dump(sink, name(), hasSquareBrackets()); } + bool hasSquareBrackets() const { return true; } + + std::function<bool(const DomItem &)> filterFunction; QStringView filterDescription; }; class QMLDOM_EXPORT PathComponent { public: - PathComponent(): data() {} - ~PathComponent(); - - Kind kind() const { return base()->kind(); } - QString name() const { return base()->name(); }; - bool checkName(QStringView s) const { return base()->checkName(s); } - QStringView stringView() const { return base()->stringView(); }; - index_type index(index_type defaultValue=-1) const { return base()->index(defaultValue); } - void dump(Sink sink) const { base()->dump(sink); } - bool hasSquareBrackets() const { return base()->hasSquareBrackets(); } - - const Empty *asEmpty() const { return base()->asEmpty(); } - const Field *asField() const { return base()->asField(); } - const Index *asIndex() const { return base()->asIndex(); } - const Key *asKey() const { return base()->asKey(); } - const Root *asRoot() const { return base()->asRoot(); } - const Current *asCurrent() const { return base()->asCurrent(); } - const Any *asAny() const { return base()->asAny(); } + PathComponent() = default; + PathComponent(const PathComponent &) = default; + PathComponent(PathComponent &&) = default; + PathComponent &operator=(const PathComponent &) = default; + PathComponent &operator=(PathComponent &&) = default; + ~PathComponent() = default; + + Kind kind() const { return Kind(m_data.index()); } + + QString name() const + { + return std::visit([](auto &&d) { return d.name(); }, m_data); + } + + bool checkName(QStringView s) const + { + return std::visit([s](auto &&d) { return d.checkName(s); }, m_data); + } + + QStringView stringView() const + { + return std::visit([](auto &&d) { return d.stringView(); }, m_data); + } + + index_type index(index_type defaultValue=-1) const + { + return std::visit([defaultValue](auto &&d) { return d.index(defaultValue); }, m_data); + } + + void dump(const Sink &sink) const + { + return std::visit([sink](auto &&d) { return d.dump(sink); }, m_data); + } + + bool hasSquareBrackets() const + { + return std::visit([](auto &&d) { return d.hasSquareBrackets(); }, m_data); + } + + const Empty *asEmpty() const { return std::get_if<Empty>(&m_data); } + const Field *asField() const { return std::get_if<Field>(&m_data); } + const Index *asIndex() const { return std::get_if<Index>(&m_data); } + const Key *asKey() const { return std::get_if<Key>(&m_data); } + const Root *asRoot() const { return std::get_if<Root>(&m_data); } + const Current *asCurrent() const { return std::get_if<Current>(&m_data); } + const Any *asAny() const { return std::get_if<Any>(&m_data); } + const Filter *asFilter() const { return std::get_if<Filter>(&m_data); } + static int cmp(const PathComponent &p1, const PathComponent &p2); - PathComponent(const Empty &o): data(o) {} - PathComponent(const Field &o): data(o) {} - PathComponent(const Index &o): data(o) {} - PathComponent(const Key &o): data(o) {} - PathComponent(const Root &o): data(o) {} - PathComponent(const Current &o): data(o) {} - PathComponent(const Any &o): data(o) {} - PathComponent(const Filter &o): data(o) {} + PathComponent(Empty &&o): m_data(std::move(o)) {} + PathComponent(Field &&o): m_data(std::move(o)) {} + PathComponent(Index &&o): m_data(std::move(o)) {} + PathComponent(Key &&o): m_data(std::move(o)) {} + PathComponent(Root &&o): m_data(std::move(o)) {} + PathComponent(Current &&o): m_data(std::move(o)) {} + PathComponent(Any &&o): m_data(std::move(o)) {} + PathComponent(Filter &&o): m_data(std::move(o)) {} + 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); - } - union Data { - Data(): empty() { } - Data(const Data &d) { - switch (d.kind()){ - case Kind::Empty: - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&empty) && "non C++11 compliant compiler"); - new (&empty) Empty(d.empty); - break; - case Kind::Field: - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&field) && "non C++11 compliant compiler"); - new (&field) Field(d.field); - break; - case Kind::Index: - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&index) && "non C++11 compliant compiler"); - new (&index) Index(d.index); - break; - case Kind::Key: - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&key) && "non C++11 compliant compiler"); - new (&key) Key(d.key); - break; - case Kind::Root: - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&root) && "non C++11 compliant compiler"); - new (&root) Root(d.root); - break; - case Kind::Current: - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(¤t) && "non C++11 compliant compiler"); - new (¤t) Current(d.current); - break; - case Kind::Any: - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&any) && "non C++11 compliant compiler"); - new (&any) Any(d.any); - break; - case Kind::Filter: - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&filter) && "non C++11 compliant compiler"); - new (&filter) Filter(d.filter); - break; - } - } - Data(const Empty &o) { - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&empty) && "non C++11 compliant compiler"); - new (&empty) Empty(o); - } - Data(const Field &o) { - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&field) && "non C++11 compliant compiler"); - new (&field) Field(o); - } - Data(const Index &o){ - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&index) && "non C++11 compliant compiler"); - new (&index) Index(o); - } - Data(const Key &o) { - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&key) && "non C++11 compliant compiler"); - new (&key) Key(o); - } - Data(const Root &o) { - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&root) && "non C++11 compliant compiler"); - new (&root) Root(o); - } - Data(const Current &o) { - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(¤t) && "non C++11 compliant compiler"); - new (¤t) Current(o); - } - Data(const Any &o) { - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&any) && "non C++11 compliant compiler"); - new (&any) Any(o); - } - Data(const Filter &o) { - Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&filter) && "non C++11 compliant compiler"); - new (&filter) Filter(o); - } - Data &operator=(const Data &d) { - Q_ASSERT(this != &d); - this->~Data(); // destruct & construct new... - new (this)Data(d); - return *this; - } - Kind kind() const { - return reinterpret_cast<const Base*>(this)->kind(); - } - ~Data() { - reinterpret_cast<const Base*>(this)->~Base(); - } - Empty empty; - Field field; - Index index; - Key key; - Root root; - Current current; - Any any; - Filter filter; - } data; + using Variant = std::variant<Empty, Field, Index, Key, Root, Current, Any, Filter>; + + template<typename T, Kind K> + static constexpr bool variantTypeMatches + = std::is_same_v<std::variant_alternative_t<size_t(K), Variant>, T>; + + static_assert(size_t(Kind::Empty) == 0); + static_assert(variantTypeMatches<Empty, Kind::Empty>); + static_assert(variantTypeMatches<Field, Kind::Field>); + static_assert(variantTypeMatches<Key, Kind::Key>); + static_assert(variantTypeMatches<Root, Kind::Root>); + static_assert(variantTypeMatches<Current, Kind::Current>); + static_assert(variantTypeMatches<Any, Kind::Any>); + static_assert(variantTypeMatches<Filter, Kind::Filter>); + static_assert(std::variant_size_v<Variant> == size_t(Kind::Filter) + 1); + + Variant m_data; }; inline bool operator==(const PathComponent& lhs, const PathComponent& rhs){ return PathComponent::cmp(lhs,rhs) == 0; } @@ -424,9 +350,13 @@ inline bool operator>=(const PathComponent& lhs, const PathComponent& rhs){ retu class PathData { public: - PathData(QStringList strData, QVector<PathComponent> components): strData(strData), components(components) {} - PathData(QStringList strData, QVector<PathComponent> components, std::shared_ptr<PathData> parent): - strData(strData), components(components), parent(parent) {} + PathData(const QStringList &strData, const QVector<PathComponent> &components) + : strData(strData), components(components) + {} + PathData(const QStringList &strData, const QVector<PathComponent> &components, + const std::shared_ptr<PathData> &parent) + : strData(strData), components(components), parent(parent) + {} QStringList strData; QVector<PathComponent> components; @@ -437,30 +367,51 @@ public: #define QMLDOM_USTRING(s) u##s #define QMLDOM_FIELD(name) inline constexpr const auto name = QMLDOM_USTRING(#name) +/*! + \internal + In an ideal world, the Fields namespace would be an enum, not strings. + Use FieldType whenever you expect a static String from the Fields namespace instead of an + arbitrary QStringView. + */ +using FieldType = QStringView; // namespace, so it cam be reopened to add more entries namespace Fields{ QMLDOM_FIELD(access); QMLDOM_FIELD(accessSemantics); QMLDOM_FIELD(allSources); +QMLDOM_FIELD(alternative); QMLDOM_FIELD(annotations); +QMLDOM_FIELD(arguments); QMLDOM_FIELD(astComments); QMLDOM_FIELD(astRelocatableDump); QMLDOM_FIELD(attachedType); QMLDOM_FIELD(attachedTypeName); QMLDOM_FIELD(autoExports); QMLDOM_FIELD(base); +QMLDOM_FIELD(binaryExpression); QMLDOM_FIELD(bindable); +QMLDOM_FIELD(bindingElement); +QMLDOM_FIELD(bindingIdentifiers); QMLDOM_FIELD(bindingType); QMLDOM_FIELD(bindings); +QMLDOM_FIELD(block); QMLDOM_FIELD(body); +QMLDOM_FIELD(callee); QMLDOM_FIELD(canonicalFilePath); QMLDOM_FIELD(canonicalPath); +QMLDOM_FIELD(caseBlock); +QMLDOM_FIELD(caseClause); +QMLDOM_FIELD(caseClauses); +QMLDOM_FIELD(catchBlock); +QMLDOM_FIELD(catchParameter); QMLDOM_FIELD(children); QMLDOM_FIELD(classNames); QMLDOM_FIELD(code); QMLDOM_FIELD(commentedElements); QMLDOM_FIELD(comments); QMLDOM_FIELD(components); +QMLDOM_FIELD(condition); +QMLDOM_FIELD(consequence); QMLDOM_FIELD(contents); QMLDOM_FIELD(contentsDate); QMLDOM_FIELD(cppType); @@ -468,20 +419,26 @@ QMLDOM_FIELD(currentExposedAt); QMLDOM_FIELD(currentIsValid); QMLDOM_FIELD(currentItem); QMLDOM_FIELD(currentRevision); +QMLDOM_FIELD(declarations); +QMLDOM_FIELD(defaultClause); QMLDOM_FIELD(defaultPropertyName); QMLDOM_FIELD(defaultValue); QMLDOM_FIELD(designerSupported); QMLDOM_FIELD(elLocation); +QMLDOM_FIELD(elements); QMLDOM_FIELD(elementCanonicalPath); QMLDOM_FIELD(enumerations); QMLDOM_FIELD(errors); QMLDOM_FIELD(exportSource); QMLDOM_FIELD(exports); QMLDOM_FIELD(expr); +QMLDOM_FIELD(expression); QMLDOM_FIELD(expressionType); QMLDOM_FIELD(extensionTypeName); QMLDOM_FIELD(fileLocationsTree); QMLDOM_FIELD(fileName); +QMLDOM_FIELD(finallyBlock); +QMLDOM_FIELD(forStatement); QMLDOM_FIELD(fullRegion); QMLDOM_FIELD(get); QMLDOM_FIELD(globalScopeName); @@ -489,6 +446,7 @@ QMLDOM_FIELD(globalScopeWithName); QMLDOM_FIELD(hasCallback); QMLDOM_FIELD(hasCustomParser); QMLDOM_FIELD(idStr); +QMLDOM_FIELD(identifier); QMLDOM_FIELD(ids); QMLDOM_FIELD(implicit); QMLDOM_FIELD(import); @@ -500,6 +458,7 @@ QMLDOM_FIELD(imports); QMLDOM_FIELD(inProgress); QMLDOM_FIELD(infoItem); QMLDOM_FIELD(inheritVersion); +QMLDOM_FIELD(initializer); QMLDOM_FIELD(interfaceNames); QMLDOM_FIELD(isAlias); QMLDOM_FIELD(isComposite); @@ -519,7 +478,9 @@ QMLDOM_FIELD(isValid); QMLDOM_FIELD(jsFileWithPath); QMLDOM_FIELD(kind); QMLDOM_FIELD(lastRevision); +QMLDOM_FIELD(label); QMLDOM_FIELD(lastValidRevision); +QMLDOM_FIELD(left); QMLDOM_FIELD(loadInfo); QMLDOM_FIELD(loadOptions); QMLDOM_FIELD(loadPaths); @@ -535,17 +496,20 @@ QMLDOM_FIELD(minorVersion); QMLDOM_FIELD(moduleIndex); QMLDOM_FIELD(moduleIndexWithUri); QMLDOM_FIELD(moduleScope); +QMLDOM_FIELD(moreCaseClauses); QMLDOM_FIELD(nAllLoadedCallbacks); QMLDOM_FIELD(nCallbacks); QMLDOM_FIELD(nLoaded); QMLDOM_FIELD(nNotdone); QMLDOM_FIELD(name); +QMLDOM_FIELD(nameIdentifiers); QMLDOM_FIELD(newlinesBefore); QMLDOM_FIELD(nextComponent); QMLDOM_FIELD(nextScope); QMLDOM_FIELD(notify); QMLDOM_FIELD(objects); QMLDOM_FIELD(onAttachedObject); +QMLDOM_FIELD(operation); QMLDOM_FIELD(options); QMLDOM_FIELD(parameters); QMLDOM_FIELD(parent); @@ -560,6 +524,7 @@ QMLDOM_FIELD(pragmas); QMLDOM_FIELD(preCode); QMLDOM_FIELD(preCommentLocations); QMLDOM_FIELD(preComments); +QMLDOM_FIELD(properties); QMLDOM_FIELD(propertyDef); QMLDOM_FIELD(propertyDefRef); QMLDOM_FIELD(propertyDefs); @@ -574,7 +539,6 @@ QMLDOM_FIELD(qmldirWithPath); QMLDOM_FIELD(qmltypesFileWithPath); QMLDOM_FIELD(qmltypesFiles); QMLDOM_FIELD(qualifiedImports); -QMLDOM_FIELD(queue); QMLDOM_FIELD(rawComment); QMLDOM_FIELD(read); QMLDOM_FIELD(referredObject); @@ -585,8 +549,13 @@ QMLDOM_FIELD(requestedAt); QMLDOM_FIELD(requestingUniverse); QMLDOM_FIELD(returnType); QMLDOM_FIELD(returnTypeName); +QMLDOM_FIELD(right); QMLDOM_FIELD(rootComponent); +QMLDOM_FIELD(scopeType); +QMLDOM_FIELD(scriptElement); QMLDOM_FIELD(sources); +QMLDOM_FIELD(statement); +QMLDOM_FIELD(statements); QMLDOM_FIELD(status); QMLDOM_FIELD(stringValue); QMLDOM_FIELD(subComponents); @@ -598,6 +567,8 @@ QMLDOM_FIELD(target); QMLDOM_FIELD(targetPropertyName); QMLDOM_FIELD(text); QMLDOM_FIELD(type); +QMLDOM_FIELD(typeArgument); +QMLDOM_FIELD(typeArgumentName); QMLDOM_FIELD(typeName); QMLDOM_FIELD(types); QMLDOM_FIELD(universe); @@ -612,7 +583,7 @@ QMLDOM_FIELD(values); QMLDOM_FIELD(version); QMLDOM_FIELD(when); QMLDOM_FIELD(write); -} +} // namespace Fields class Source; size_t qHash(const Path &, size_t); @@ -646,12 +617,12 @@ 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; - void dump(Sink sink) const; + void dump(const Sink &sink) const; QString toString() const; Path dropFront(int n = 1) const; Path dropTail(int n = 1) const; @@ -660,34 +631,35 @@ public: Path appendComponent(const PathEls::PathComponent &c); // # Path construction - static Path fromString(QString s, ErrorHandler errorHandler=nullptr); - static Path fromString(QStringView s, ErrorHandler errorHandler=nullptr); + static Path fromString(const QString &s, const ErrorHandler &errorHandler = nullptr); + static Path fromString(QStringView s, const ErrorHandler &errorHandler = nullptr); static Path Root(PathRoot r); static Path Root(QStringView s=u""); - static Path Root(QString s); + static Path Root(const QString &s); static Path Index(index_type i); static Path Field(QStringView s=u""); - static Path Field(QString s); + static Path Field(const QString &s); static Path Key(QStringView s=u""); - static Path Key(QString s); + static Path Key(const QString &s); static Path Current(PathCurrent c); static Path Current(QStringView s=u""); - static Path Current(QString s); + static Path Current(const QString &s); static Path Empty(); // add Path empty() const; - Path field(QString name) const; + Path field(const QString &name) const; Path field(QStringView name) const; - Path key(QString name) const; + Path key(const QString &name) const; 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(const std::function<bool(const DomItem &)> &, const QString &) const; + Path filter(const std::function<bool(const DomItem &)> &, + QStringView desc=u"<native code filter>") const; Path current(PathCurrent s) const; - Path current(QString s) const; + Path current(const QString &s) const; Path current(QStringView s=u"") const; - Path path(Path toAdd, bool avoidToAddAsBase = false) const; + Path path(const Path &toAdd, bool avoidToAddAsBase = false) const; Path expandFront() const; Path expandBack() const; @@ -706,7 +678,8 @@ public: private: const Component &component(int i) const; - explicit Path(quint16 endOffset, quint16 length, std::shared_ptr<PathEls::PathData> data); + explicit Path(quint16 endOffset, quint16 length, + const std::shared_ptr<PathEls::PathData> &data); friend class QQmlJS::Dom::PathEls::TestPaths; friend class FieldFilter; friend size_t qHash(const Path &, size_t); @@ -776,6 +749,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); } |