Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qqmldompath_p.h
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QMLDOM_PATH_H
5#define QMLDOM_PATH_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include "qqmldomconstants_p.h"
20#include "qqmldom_global.h"
21
22#include <QtCore/QCoreApplication>
23#include <QtCore/QMetaEnum>
24#include <QtCore/QString>
25#include <QtCore/QStringView>
26#include <QtCore/QStringList>
27#include <QtCore/QVector>
28#include <QtCore/QDebug>
29
30#include <functional>
31#include <iterator>
32
34
35namespace QQmlJS {
36namespace Dom {
37
38class ErrorGroups;
39class ErrorMessage;
40class DomItem;
41class Path;
42
43using ErrorHandler = std::function<void(const ErrorMessage &)> ;
44
46
47namespace PathEls {
48
49enum class Kind{
50 Empty,
51 Field,
52 Index,
53 Key,
54 Root,
55 Current,
56 Any,
57 Filter
58};
59
60class TestPaths;
61class Empty;
62class Field;
63class Index;
64class Key;
65class Root;
66class Current;
67class Any;
68class Filter;
69
70class Base {
71public:
72 virtual ~Base() = default;
73 virtual Kind kind() const = 0;
74 virtual QString name() const = 0;
75 virtual bool checkName(QStringView s) const = 0;
76 virtual QStringView stringView() const { return QStringView(); }
77 virtual index_type index(index_type defaultValue=-1) const { return defaultValue; }
78
79 virtual void dump(Sink sink) const;
80 virtual bool hasSquareBrackets() const { return false; }
81
82 // casting, could use optional, but that is c++17...
83 virtual const Empty *asEmpty() const { return nullptr; }
84 virtual const Field *asField() const { return nullptr; }
85 virtual const Index *asIndex() const { return nullptr; }
86 virtual const Key *asKey() const { return nullptr; }
87 virtual const Root *asRoot() const { return nullptr; }
88 virtual const Current *asCurrent() const { return nullptr; }
89 virtual const Any *asAny() const { return nullptr; }
90 virtual const Filter *asFilter() const { return nullptr; }
91};
92
93class Empty final : public Base
94{
95public:
96 Empty() = default;
97 Kind kind() const override { return Kind::Empty; }
98 QString name() const override { return QString(); }
99 bool checkName(QStringView s) const override { return s.isEmpty(); }
100 const Empty * asEmpty() const override { return this; }
101};
102
103class Field final : public Base
104{
105public:
106 Field() = default;
108 Kind kind() const override { return Kind::Field; }
109 QString name() const override { return fieldName.toString(); }
110 bool checkName(QStringView s) const override { return s == fieldName; }
111 QStringView stringView() const override { return fieldName; }
112 const Field * asField() const override { return this; }
113 void dump(Sink sink) const override { sink(fieldName); }
114
116};
117
118class Index final : public Base
119{
120public:
121 Index() = default;
123 Kind kind() const override { return Kind::Index; }
124 QString name() const override { return QString::number(indexValue); }
125 bool checkName(QStringView s) const override { return s == name(); }
126 index_type index(index_type = -1) const override { return indexValue; }
127 bool hasSquareBrackets() const override { return true; }
128 const Index * asIndex() const override { return this; }
129
131};
132
133class Key final : public Base
134{
135public:
136 Key() = default;
138 Kind kind() const override { return Kind::Key; }
139 QString name() const override { return keyValue; }
140 bool checkName(QStringView s) const override { return s == keyValue; }
141 QStringView stringView() const override { return keyValue; }
142 void dump(Sink sink) const override {
143 sink(u"[");
145 sink(u"]");
146 }
147 bool hasSquareBrackets() const override { return true; }
148 const Key * asKey() const override { return this; }
149
151};
152
153class Root final : public Base
154{
155public:
156 Root() = default;
159 QMetaEnum metaEnum = QMetaEnum::fromType<PathRoot>();
161 for (int i = 0; i < metaEnum.keyCount(); ++ i)
162 if (n.compare(QString::fromUtf8(metaEnum.key(i)), Qt::CaseInsensitive) == 0)
163 contextKind = PathRoot(metaEnum.value(i));
165 contextName = n;
166 }
167 Kind kind() const override { return Kind::Root; }
168 QString name() const override {
169 switch (contextKind) {
171 return QStringLiteral(u"$modules");
172 case PathRoot::Cpp:
173 return QStringLiteral(u"$cpp");
174 case PathRoot::Libs:
175 return QStringLiteral(u"$libs");
176 case PathRoot::Top:
177 return QStringLiteral(u"$top");
178 case PathRoot::Env:
179 return QStringLiteral(u"$env");
181 return QStringLiteral(u"$universe");
182 case PathRoot::Other:
184 }
185 Q_ASSERT(false && "Unexpected contextKind in name");
186 return QString();
187 }
188 bool checkName(QStringView s) const override {
190 return s.compare(name(), Qt::CaseInsensitive) == 0;
191 return s.startsWith(QChar::fromLatin1('$')) && s.mid(1) == contextName;
192 }
193 QStringView stringView() const override { return contextName; }
194 void dump(Sink sink) const override {
195 sink(name());
196 }
197 const Root *asRoot() const override { return this; }
198
201};
202
203class Current final : public Base
204{
205public:
206 Current() = default;
209 QMetaEnum metaEnum = QMetaEnum::fromType<PathCurrent>();
211 for (int i = 0; i < metaEnum.keyCount(); ++ i)
212 if (n.compare(QString::fromUtf8(metaEnum.key(i)), Qt::CaseInsensitive) == 0)
213 contextKind = PathCurrent(metaEnum.value(i));
215 contextName = n;
216 }
217 Kind kind() const override { return Kind::Current; }
218 QString name() const override {
219 switch (contextKind) {
222 case PathCurrent::Obj:
223 return QStringLiteral(u"@obj");
225 return QStringLiteral(u"@objChain");
227 return QStringLiteral(u"@scopeChain");
229 return QStringLiteral(u"@component");
231 return QStringLiteral(u"@module");
232 case PathCurrent::Ids:
233 return QStringLiteral(u"@ids");
235 return QStringLiteral(u"@types");
237 return QStringLiteral(u"@lookupStrict");
239 return QStringLiteral(u"@lookupDynamic");
241 return QStringLiteral(u"@lookup");
242 }
243 Q_ASSERT(false && "Unexpected contextKind in Current::name");
244 return QString();
245 }
246 bool checkName(QStringView s) const override {
248 return s.compare(name(), Qt::CaseInsensitive) == 0;
249 return s.startsWith(QChar::fromLatin1('@')) && s.mid(1) == contextName;
250 }
251 QStringView stringView() const override { return contextName; }
252 const Current *asCurrent() const override { return this; }
253
256};
257
258class Any final : public Base
259{
260public:
261 Any() = default;
262 Kind kind() const override { return Kind::Any; }
263 QString name() const override { return QLatin1String("*"); }
264 bool checkName(QStringView s) const override { return s == u"*"; }
265 bool hasSquareBrackets() const override { return true; }
266 const Any *asAny() const override { return this; }
267};
268
269class QMLDOM_EXPORT Filter final : public Base
270{
271public:
272 Filter() = default;
273 Filter(std::function<bool(DomItem)> f, QStringView filterDescription = u"<native code filter>");
274 Kind kind() const override { return Kind::Filter; }
275 QString name() const override;
276 bool checkName(QStringView s) const override;
277 QStringView stringView() const override { return filterDescription; }
278 bool hasSquareBrackets() const override { return true; }
279 const Filter *asFilter() const override { return this; }
280
281 std::function<bool(DomItem)> filterFunction;
283};
284
286public:
289
290 Kind kind() const { return base()->kind(); }
291 QString name() const { return base()->name(); };
292 bool checkName(QStringView s) const { return base()->checkName(s); }
293 QStringView stringView() const { return base()->stringView(); };
294 index_type index(index_type defaultValue=-1) const { return base()->index(defaultValue); }
295 void dump(Sink sink) const { base()->dump(sink); }
296 bool hasSquareBrackets() const { return base()->hasSquareBrackets(); }
297
298 const Empty *asEmpty() const { return base()->asEmpty(); }
299 const Field *asField() const { return base()->asField(); }
300 const Index *asIndex() const { return base()->asIndex(); }
301 const Key *asKey() const { return base()->asKey(); }
302 const Root *asRoot() const { return base()->asRoot(); }
303 const Current *asCurrent() const { return base()->asCurrent(); }
304 const Any *asAny() const { return base()->asAny(); }
305 static int cmp(const PathComponent &p1, const PathComponent &p2);
306
310 PathComponent(const Key &o): data(o) {}
311 PathComponent(const Root &o): data(o) {}
313 PathComponent(const Any &o): data(o) {}
315private:
316 friend class QQmlJS::Dom::Path;
317 friend class QQmlJS::Dom::PathEls::TestPaths;
318
319 Base *base() {
320 return reinterpret_cast<Base*>(&data);
321 }
322 const Base *base() const {
323 return reinterpret_cast<const Base*>(&data);
324 }
325 union Data {
326 Data(): empty() { }
327 Data(const Data &d) {
328 switch (d.kind()){
329 case Kind::Empty:
330 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&empty) && "non C++11 compliant compiler");
331 new (&empty) Empty(d.empty);
332 break;
333 case Kind::Field:
334 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&field) && "non C++11 compliant compiler");
335 new (&field) Field(d.field);
336 break;
337 case Kind::Index:
338 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&index) && "non C++11 compliant compiler");
339 new (&index) Index(d.index);
340 break;
341 case Kind::Key:
342 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&key) && "non C++11 compliant compiler");
343 new (&key) Key(d.key);
344 break;
345 case Kind::Root:
346 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&root) && "non C++11 compliant compiler");
347 new (&root) Root(d.root);
348 break;
349 case Kind::Current:
350 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&current) && "non C++11 compliant compiler");
351 new (&current) Current(d.current);
352 break;
353 case Kind::Any:
354 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&any) && "non C++11 compliant compiler");
355 new (&any) Any(d.any);
356 break;
357 case Kind::Filter:
358 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&filter) && "non C++11 compliant compiler");
359 new (&filter) Filter(d.filter);
360 break;
361 }
362 }
363 Data(const Empty &o) {
364 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&empty) && "non C++11 compliant compiler");
365 new (&empty) Empty(o);
366 }
367 Data(const Field &o) {
368 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&field) && "non C++11 compliant compiler");
369 new (&field) Field(o);
370 }
371 Data(const Index &o){
372 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&index) && "non C++11 compliant compiler");
373 new (&index) Index(o);
374 }
375 Data(const Key &o) {
376 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&key) && "non C++11 compliant compiler");
377 new (&key) Key(o);
378 }
379 Data(const Root &o) {
380 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&root) && "non C++11 compliant compiler");
381 new (&root) Root(o);
382 }
383 Data(const Current &o) {
384 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&current) && "non C++11 compliant compiler");
385 new (&current) Current(o);
386 }
387 Data(const Any &o) {
388 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&any) && "non C++11 compliant compiler");
389 new (&any) Any(o);
390 }
391 Data(const Filter &o) {
392 Q_ASSERT(static_cast<void*>(this)==static_cast<void*>(&filter) && "non C++11 compliant compiler");
393 new (&filter) Filter(o);
394 }
395 Data &operator=(const Data &d) {
396 Q_ASSERT(this != &d);
397 this->~Data(); // destruct & construct new...
398 new (this)Data(d);
399 return *this;
400 }
401 Kind kind() const {
402 return reinterpret_cast<const Base*>(this)->kind();
403 }
404 ~Data() {
405 reinterpret_cast<const Base*>(this)->~Base();
406 }
407 Empty empty;
408 Field field;
409 Index index;
410 Key key;
411 Root root;
412 Current current;
413 Any any;
415 } data;
416};
417
418inline bool operator==(const PathComponent& lhs, const PathComponent& rhs){ return PathComponent::cmp(lhs,rhs) == 0; }
419inline bool operator!=(const PathComponent& lhs, const PathComponent& rhs){ return PathComponent::cmp(lhs,rhs) != 0; }
420inline bool operator< (const PathComponent& lhs, const PathComponent& rhs){ return PathComponent::cmp(lhs,rhs) < 0; }
421inline bool operator> (const PathComponent& lhs, const PathComponent& rhs){ return PathComponent::cmp(lhs,rhs) > 0; }
422inline bool operator<=(const PathComponent& lhs, const PathComponent& rhs){ return PathComponent::cmp(lhs,rhs) <= 0; }
423inline bool operator>=(const PathComponent& lhs, const PathComponent& rhs){ return PathComponent::cmp(lhs,rhs) >= 0; }
424
425class PathData {
426public:
430
433 std::shared_ptr<PathData> parent;
434};
435
436} // namespace PathEls
437
438#define QMLDOM_USTRING(s) u##s
439#define QMLDOM_FIELD(name) inline constexpr const auto name = QMLDOM_USTRING(#name)
447// namespace, so it cam be reopened to add more entries
448namespace Fields{
450QMLDOM_FIELD(accessSemantics);
451QMLDOM_FIELD(allSources);
452QMLDOM_FIELD(alternative);
453QMLDOM_FIELD(annotations);
455QMLDOM_FIELD(astComments);
456QMLDOM_FIELD(astRelocatableDump);
457QMLDOM_FIELD(attachedType);
458QMLDOM_FIELD(attachedTypeName);
459QMLDOM_FIELD(autoExports);
461QMLDOM_FIELD(binaryExpression);
462QMLDOM_FIELD(bindable);
463QMLDOM_FIELD(bindingElement);
464QMLDOM_FIELD(bindingType);
465QMLDOM_FIELD(bindings);
469QMLDOM_FIELD(canonicalFilePath);
471QMLDOM_FIELD(caseBlock);
472QMLDOM_FIELD(caseClause);
473QMLDOM_FIELD(caseClauses);
474QMLDOM_FIELD(children);
475QMLDOM_FIELD(classNames);
477QMLDOM_FIELD(commentedElements);
478QMLDOM_FIELD(comments);
481QMLDOM_FIELD(consequence);
483QMLDOM_FIELD(contentsDate);
485QMLDOM_FIELD(currentExposedAt);
486QMLDOM_FIELD(currentIsValid);
487QMLDOM_FIELD(currentItem);
488QMLDOM_FIELD(currentRevision);
489QMLDOM_FIELD(declarations);
490QMLDOM_FIELD(defaultClause);
491QMLDOM_FIELD(defaultPropertyName);
492QMLDOM_FIELD(defaultValue);
493QMLDOM_FIELD(designerSupported);
494QMLDOM_FIELD(elLocation);
496QMLDOM_FIELD(elementCanonicalPath);
497QMLDOM_FIELD(enumerations);
499QMLDOM_FIELD(exportSource);
502QMLDOM_FIELD(expression);
503QMLDOM_FIELD(expressionType);
504QMLDOM_FIELD(extensionTypeName);
505QMLDOM_FIELD(fileLocationsTree);
507QMLDOM_FIELD(forStatement);
508QMLDOM_FIELD(fullRegion);
510QMLDOM_FIELD(globalScopeName);
511QMLDOM_FIELD(globalScopeWithName);
512QMLDOM_FIELD(hasCallback);
513QMLDOM_FIELD(hasCustomParser);
515QMLDOM_FIELD(identifier);
517QMLDOM_FIELD(implicit);
519QMLDOM_FIELD(importId);
520QMLDOM_FIELD(importScope);
521QMLDOM_FIELD(importSources);
522QMLDOM_FIELD(imported);
524QMLDOM_FIELD(inProgress);
525QMLDOM_FIELD(infoItem);
526QMLDOM_FIELD(inheritVersion);
527QMLDOM_FIELD(initializer);
528QMLDOM_FIELD(interfaceNames);
531QMLDOM_FIELD(isConstructor);
532QMLDOM_FIELD(isCreatable);
533QMLDOM_FIELD(isDefaultMember);
535QMLDOM_FIELD(isInternal);
536QMLDOM_FIELD(isLatest);
538QMLDOM_FIELD(isPointer);
539QMLDOM_FIELD(isReadonly);
540QMLDOM_FIELD(isRequired);
541QMLDOM_FIELD(isSignalHandler);
542QMLDOM_FIELD(isSingleton);
544QMLDOM_FIELD(jsFileWithPath);
546QMLDOM_FIELD(lastRevision);
547QMLDOM_FIELD(lastValidRevision);
549QMLDOM_FIELD(loadInfo);
550QMLDOM_FIELD(loadOptions);
551QMLDOM_FIELD(loadPaths);
552QMLDOM_FIELD(loadsWithWork);
553QMLDOM_FIELD(localOffset);
555QMLDOM_FIELD(logicalPath);
556QMLDOM_FIELD(majorVersion);
557QMLDOM_FIELD(metaRevisions);
558QMLDOM_FIELD(methodType);
560QMLDOM_FIELD(minorVersion);
561QMLDOM_FIELD(moduleIndex);
562QMLDOM_FIELD(moduleIndexWithUri);
563QMLDOM_FIELD(moduleScope);
564QMLDOM_FIELD(nAllLoadedCallbacks);
565QMLDOM_FIELD(nCallbacks);
567QMLDOM_FIELD(nNotdone);
569QMLDOM_FIELD(newlinesBefore);
570QMLDOM_FIELD(nextComponent);
571QMLDOM_FIELD(nextScope);
574QMLDOM_FIELD(onAttachedObject);
575QMLDOM_FIELD(operation);
577QMLDOM_FIELD(parameters);
579QMLDOM_FIELD(parentObject);
582QMLDOM_FIELD(postCode);
583QMLDOM_FIELD(postCommentLocations);
584QMLDOM_FIELD(postComments);
588QMLDOM_FIELD(preCommentLocations);
589QMLDOM_FIELD(preComments);
591QMLDOM_FIELD(propertyDef);
592QMLDOM_FIELD(propertyDefRef);
593QMLDOM_FIELD(propertyDefs);
594QMLDOM_FIELD(propertyInfos);
595QMLDOM_FIELD(propertyName);
596QMLDOM_FIELD(prototypes);
597QMLDOM_FIELD(qmlDirectoryWithPath);
598QMLDOM_FIELD(qmlFileWithPath);
599QMLDOM_FIELD(qmlFiles);
600QMLDOM_FIELD(qmldirFileWithPath);
601QMLDOM_FIELD(qmldirWithPath);
602QMLDOM_FIELD(qmltypesFileWithPath);
603QMLDOM_FIELD(qmltypesFiles);
604QMLDOM_FIELD(qualifiedImports);
606QMLDOM_FIELD(rawComment);
608QMLDOM_FIELD(referredObject);
609QMLDOM_FIELD(referredObjectPath);
610QMLDOM_FIELD(regionComments);
612QMLDOM_FIELD(requestedAt);
613QMLDOM_FIELD(requestingUniverse);
614QMLDOM_FIELD(returnType);
615QMLDOM_FIELD(returnTypeName);
617QMLDOM_FIELD(rootComponent);
618QMLDOM_FIELD(scopeType);
619QMLDOM_FIELD(scriptElement);
621QMLDOM_FIELD(statements);
623QMLDOM_FIELD(stringValue);
624QMLDOM_FIELD(subComponents);
625QMLDOM_FIELD(subImports);
626QMLDOM_FIELD(subItems);
630QMLDOM_FIELD(targetPropertyName);
633QMLDOM_FIELD(typeArgument);
636QMLDOM_FIELD(universe);
637QMLDOM_FIELD(updatedScriptExpressions);
640QMLDOM_FIELD(validExposedAt);
641QMLDOM_FIELD(validItem);
643QMLDOM_FIELD(valueTypeName);
648} // namespace Fields
649
650class Source;
651size_t qHash(const Path &, size_t);
652class PathIterator;
653// Define a iterator for it?
654// begin() can basically be itself, end() the empty path (zero length), iteration though dropFront()
658public:
661 static ErrorGroups myErrors(); // use static consts and central registration instead?
662
663 Path() = default;
664 explicit Path(const PathEls::PathComponent &c) : m_endOffset(0), m_length(0)
665 {
666 *this = appendComponent(c);
667 }
668
669 int length() const { return m_length; }
670 Path operator[](int i) const;
671 explicit operator bool() const;
672
673 PathIterator begin() const;
674 PathIterator end() const;
675
676 PathRoot headRoot() const;
677 PathCurrent headCurrent() const;
678 Kind headKind() const;
679 QString headName() const;
680 bool checkHeadName(QStringView name) const;
681 index_type headIndex(index_type defaultValue=-1) const;
682 std::function<bool(DomItem)> headFilter() const;
683 Path head() const;
684 Path last() const;
685 Source split() const;
686
687 void dump(Sink sink) const;
688 QString toString() const;
689 Path dropFront(int n = 1) const;
690 Path dropTail(int n = 1) const;
691 Path mid(int offset, int length) const;
692 Path mid(int offset) const;
693 Path appendComponent(const PathEls::PathComponent &c);
694
695 // # Path construction
696 static Path fromString(QString s, ErrorHandler errorHandler=nullptr);
697 static Path fromString(QStringView s, ErrorHandler errorHandler=nullptr);
698 static Path Root(PathRoot r);
699 static Path Root(QStringView s=u"");
700 static Path Root(QString s);
701 static Path Index(index_type i);
702 static Path Field(QStringView s=u"");
703 static Path Field(QString s);
704 static Path Key(QStringView s=u"");
705 static Path Key(QString s);
706 static Path Current(PathCurrent c);
707 static Path Current(QStringView s=u"");
708 static Path Current(QString s);
709 static Path Empty();
710 // add
711 Path empty() const;
712 Path field(QString name) const;
713 Path field(QStringView name) const;
714 Path key(QString name) const;
715 Path key(QStringView name) const;
716 Path index(index_type i) const;
717 Path any() const;
718 Path filter(std::function<bool(DomItem)>, QString) const;
719 Path filter(std::function<bool(DomItem)>, QStringView desc=u"<native code filter>") const;
720 Path current(PathCurrent s) const;
721 Path current(QString s) const;
722 Path current(QStringView s=u"") const;
723 Path path(Path toAdd, bool avoidToAddAsBase = false) const;
724
725 Path expandFront() const;
726 Path expandBack() const;
727
728 Path &operator++();
729 Path operator ++(int);
730
731 // iterator traits
732 using difference_type = long;
734 using pointer = const Component*;
735 using reference = const Path&;
736 using iterator_category = std::forward_iterator_tag;
737
738 static int cmp(const Path &p1, const Path &p2);
739
740private:
741 const Component &component(int i) const;
742 explicit Path(quint16 endOffset, quint16 length, std::shared_ptr<PathEls::PathData> data);
743 friend class QQmlJS::Dom::PathEls::TestPaths;
744 friend class FieldFilter;
745 friend size_t qHash(const Path &, size_t);
746
747 Path noEndOffset() const;
748
749 quint16 m_endOffset = 0;
750 quint16 m_length = 0;
751 std::shared_ptr<PathEls::PathData> m_data = {};
752};
753
754inline bool operator==(const Path &lhs, const Path &rhs)
755{
756 return lhs.length() == rhs.length() && Path::cmp(lhs, rhs) == 0;
757}
758inline bool operator!=(const Path &lhs, const Path &rhs)
759{
760 return lhs.length() != rhs.length() || Path::cmp(lhs, rhs) != 0;
761}
762inline bool operator<(const Path &lhs, const Path &rhs)
763{
764 return Path::cmp(lhs, rhs) < 0;
765}
766inline bool operator>(const Path &lhs, const Path &rhs)
767{
768 return Path::cmp(lhs, rhs) > 0;
769}
770inline bool operator<=(const Path &lhs, const Path &rhs)
771{
772 return Path::cmp(lhs, rhs) <= 0;
773}
774inline bool operator>=(const Path &lhs, const Path &rhs)
775{
776 return Path::cmp(lhs, rhs) >= 0;
777}
778
780public:
782 Path operator *() const { return currentEl.head(); }
785 bool operator ==(const PathIterator &o) const { return currentEl == o.currentEl; }
786 bool operator !=(const PathIterator &o) const { return currentEl != o.currentEl; }
787};
788
789class Source {
790public:
793};
794
795inline size_t qHash(const Path &path, size_t seed)
796{
797 const size_t bufSize = 256;
798 size_t buf[bufSize];
799 size_t *it = &buf[0];
800 *it++ = path.length();
801 if (path.length()>0) {
802 int iPath = path.length();
803 size_t maxPath = bufSize / 2 - 1;
804 size_t endPath = (size_t(iPath) > maxPath) ? maxPath - iPath : 0;
805 while (size_t(iPath) > endPath) {
806 Path p = path[--iPath];
807 Path::Kind k = p.headKind();
808 *it++ = size_t(k);
809 *it++ = qHash(p.component(0).stringView(), seed)^size_t(p.headRoot())^size_t(p.headCurrent());
810 }
811 }
812 return qHash(QByteArray::fromRawData(reinterpret_cast<char *>(&buf[0]), (it - &buf[0])*sizeof(size_t)), seed);
813}
814
816{
817 debug << p.toString();
818 return debug;
819}
820
821} // end namespace Dom
822} // end namespace QQmlJS
823
825
826#endif // QMLDOM_PATH_H
static JNINativeMethod methods[]
NSData * m_data
static QByteArray fromRawData(const char *data, qsizetype size)
Constructs a QByteArray that uses the first size bytes of the data array.
Definition qbytearray.h:394
static constexpr QChar fromLatin1(char c) noexcept
Converts the Latin-1 character c to its equivalent QChar.
Definition qchar.h:461
\inmodule QtCore
Definition qlist.h:74
\inmodule QtCore
int value(int index) const
Returns the value with the given index; or returns -1 if there is no such value.
const char * key(int index) const
Returns the key with the given index, or \nullptr if no such key exists.
int keyCount() const
Returns the number of keys.
convenience macro creating a new ErrorGroup and registering its groupId as translatable string
Represents a set of tags grouping a set of related error messages.
Represents an error message connected to the dom.
Kind kind() const override
QString name() const override
bool checkName(QStringView s) const override
const Any * asAny() const override
bool hasSquareBrackets() const override
virtual const Index * asIndex() const
virtual const Any * asAny() const
virtual Kind kind() const =0
virtual bool hasSquareBrackets() const
virtual const Field * asField() const
virtual QStringView stringView() const
virtual ~Base()=default
virtual const Filter * asFilter() const
virtual const Key * asKey() const
virtual const Current * asCurrent() const
virtual index_type index(index_type defaultValue=-1) const
virtual void dump(Sink sink) const
virtual const Empty * asEmpty() const
virtual bool checkName(QStringView s) const =0
virtual QString name() const =0
virtual const Root * asRoot() const
QStringView stringView() const override
Kind kind() const override
const Current * asCurrent() const override
QString name() const override
bool checkName(QStringView s) const override
Kind kind() const override
const Empty * asEmpty() const override
QString name() const override
bool checkName(QStringView s) const override
bool checkName(QStringView s) const override
Kind kind() const override
QString name() const override
void dump(Sink sink) const override
const Field * asField() const override
QStringView stringView() const override
bool hasSquareBrackets() const override
Kind kind() const override
QStringView stringView() const override
std::function< bool(DomItem)> filterFunction
Filter(std::function< bool(DomItem)> f, QStringView filterDescription=u"<native code filter>")
const Filter * asFilter() const override
const Index * asIndex() const override
bool hasSquareBrackets() const override
bool checkName(QStringView s) const override
QString name() const override
Kind kind() const override
index_type index(index_type=-1) const override
QStringView stringView() const override
QString name() const override
void dump(Sink sink) const override
Kind kind() const override
bool checkName(QStringView s) const override
const Key * asKey() const override
bool hasSquareBrackets() const override
bool checkName(QStringView s) const
static int cmp(const PathComponent &p1, const PathComponent &p2)
index_type index(index_type defaultValue=-1) const
const Current * asCurrent() const
QVector< PathComponent > components
std::shared_ptr< PathData > parent
PathData(QStringList strData, QVector< PathComponent > components, std::shared_ptr< PathData > parent)
PathData(QStringList strData, QVector< PathComponent > components)
Kind kind() const override
void dump(Sink sink) const override
const Root * asRoot() const override
QStringView stringView() const override
QString name() const override
bool checkName(QStringView s) const override
bool operator==(const PathIterator &o) const
bool operator!=(const PathIterator &o) const
static int cmp(const Path &p1, const Path &p2)
Path filter(std::function< bool(DomItem)>, QStringView desc=u"<native code filter>") const
Path head() const
Kind headKind() const
Path filter(std::function< bool(DomItem)>, QString) const
Path dropFront(int n=1) const
Path(const PathEls::PathComponent &c)
std::forward_iterator_tag iterator_category
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:76
QString toString() const
Returns a deep copy of this string view's data as a QString.
Definition qstring.h:1014
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5857
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:7822
QString & append(QChar c)
Definition qstring.cpp:3227
QPixmap p2
QPixmap p1
[0]
QString text
QSet< QString >::iterator it
QList< QVariant > arguments
bool operator>=(const PathComponent &lhs, const PathComponent &rhs)
bool operator<=(const PathComponent &lhs, const PathComponent &rhs)
bool operator==(const PathComponent &lhs, const PathComponent &rhs)
bool operator!=(const PathComponent &lhs, const PathComponent &rhs)
bool operator>(const PathComponent &lhs, const PathComponent &rhs)
bool operator<(const PathComponent &lhs, const PathComponent &rhs)
std::function< void(const ErrorMessage &)> ErrorHandler
QDebug operator<<(QDebug d, AST::Node *n)
bool operator!=(const Version &v1, const Version &v2)
qint64 index_type
void sinkEscaped(Sink sink, QStringView s, EscapeOptions options)
dumps a string as quoted string (escaping things like quotes or newlines)
bool operator>(const Version &v1, const Version &v2)
size_t qHash(const Path &, size_t)
bool operator>=(const Version &v1, const Version &v2)
bool operator==(const Version &v1, const Version &v2)
bool operator<=(const Version &v1, const Version &v2)
bool operator<(const Version &v1, const Version &v2)
Combined button and popup list for selecting options.
@ CaseInsensitive
#define Q_DECLARE_TR_FUNCTIONS(context)
static const QCssKnownValue properties[NumProperties - 1]
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
static QDBusError::ErrorType get(const char *name)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
size_t qHash(const QFileSystemWatcherPathKey &key, size_t seed=0)
const char * typeName
GLint location
GLenum GLsizei GLsizei GLint * values
[15]
GLuint64 key
GLint GLenum GLint components
GLuint index
[2]
GLenum condition
GLboolean r
[2]
GLuint GLuint end
GLenum GLenum GLsizei const GLuint * ids
GLsizei GLenum GLenum * types
GLenum GLuint GLenum GLsizei length
GLdouble GLdouble right
GLfloat GLfloat f
GLint left
GLenum type
GLenum access
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum target
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLintptr offset
GLuint name
GLsizei bufSize
GLsizei GLenum * sources
GLfloat n
GLuint res
const GLubyte * c
GLsizei const GLchar *const * path
GLsizei GLenum GLboolean sink
GLdouble s
[6]
Definition qopenglext.h:235
GLfloat GLfloat p
[1]
static qreal component(const QPointF &point, unsigned int i)
#define QMLDOM_EXPORT
#define QMLDOM_FIELD(name)
static bool fromString(const QMetaObject *mo, QString s, Allocate &&allocate)
static bool isComposite(const QQmlJSScope::ConstPtr &scope)
static Q_CONSTINIT QBasicAtomicInteger< unsigned > seed
Definition qrandom.cpp:196
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
static void split(QT_FT_Vector *b)
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
static QString dump(const QByteArray &)
static QString canonicalPath(const QString &rootPath)
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define QStringLiteral(str)
static const QTextHtmlElement elements[Html_NumElements]
#define Q_GADGET
@ desc
unsigned short quint16
Definition qtypes.h:43
long long qint64
Definition qtypes.h:55
ReturnedValue read(const char *data)
gzip write("uncompressed data")
QQueue< int > queue
[0]
char * toString(const MyType &t)
[31]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent