Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmldomelements_p.h
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant
4
5#ifndef QQMLDOMELEMENTS_P_H
6#define QQMLDOMELEMENTS_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include "qqmldomitem_p.h"
23
24#include <QtQml/private/qqmljsast_p.h>
25#include <QtQml/private/qqmljsengine_p.h>
26#include <QtQml/private/qqmlsignalnames_p.h>
27
28#include <QtCore/QCborValue>
29#include <QtCore/QCborMap>
30#include <QtCore/QMutexLocker>
31
32#include <memory>
33#include <private/qqmljsscope_p.h>
34
35#include <functional>
36#include <limits>
37#include <utility>
38
39QT_BEGIN_NAMESPACE
40
41namespace QQmlJS {
42namespace Dom {
43
44// namespace for utility methods building specific paths
45// using a namespace one can reopen it and add more methods in other places
46namespace Paths {
48 const QString &uri, int majorVersion, const ErrorHandler &errorHandler = nullptr);
50 const QString &uri, Version version, const ErrorHandler &errorHandler = nullptr);
52 const QString &uri, const QString &version, const ErrorHandler &errorHandler = nullptr);
54 const QString &uri, const ErrorHandler &errorHandler = nullptr)
55{
56 return moduleScopePath(uri, QString(), errorHandler);
57}
58inline Path qmlFileInfoPath(const QString &canonicalFilePath)
59{
60 return Path::fromRoot(PathRoot::Top).withField(Fields::qmlFileWithPath).withKey(canonicalFilePath);
61}
62inline Path qmlFilePath(const QString &canonicalFilePath)
63{
64 return qmlFileInfoPath(canonicalFilePath).withField(Fields::currentItem);
65}
66inline Path qmlFileObjectPath(const QString &canonicalFilePath)
67{
68 return qmlFilePath(canonicalFilePath)
69 .withField(Fields::components)
70 .withKey(QString())
71 .withIndex(0)
72 .withField(Fields::objects)
73 .withIndex(0);
74}
75inline Path jsFileInfoPath(const QString &path)
76{
77 return Path::fromRoot(PathRoot::Top).withField(Fields::jsFileWithPath).withKey(path);
78}
79inline Path jsFilePath(const QString &path)
80{
81 return jsFileInfoPath(path).withField(Fields::currentItem);
82}
83inline Path lookupCppTypePath(const QString &name)
84{
85 return Path::fromCurrent(PathCurrent::Lookup).withField(Fields::cppType).withKey(name);
86}
87inline Path lookupPropertyPath(const QString &name)
88{
89 return Path::fromCurrent(PathCurrent::Lookup).withField(Fields::propertyDef).withKey(name);
90}
91inline Path lookupSymbolPath(const QString &name)
92{
93 return Path::fromCurrent(PathCurrent::Lookup).withField(Fields::symbol).withKey(name);
94}
95inline Path lookupTypePath(const QString &name)
96{
97 return Path::fromCurrent(PathCurrent::Lookup).withField(Fields::type).withKey(name);
98}
99inline Path loadInfoPath(const Path &el)
100{
101 return Path::fromRoot(PathRoot::Env).withField(Fields::loadInfo).withKey(el.toString());
102}
103} // end namespace Paths
104
106{
107public:
108 CommentableDomElement(const Path &pathFromOwner = Path()) : DomElement(pathFromOwner) { }
113 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override;
114 RegionComments &comments() { return m_comments; }
115 const RegionComments &comments() const { return m_comments; }
116
117private:
118 RegionComments m_comments;
119};
120
122{
123public:
125 constexpr static qint32 Undefined = -1;
126 constexpr static qint32 Latest = -2;
127
128 Version(qint32 majorVersion = Undefined, qint32 minorVersion = Undefined);
129 static Version fromString(QStringView v);
130
131 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const;
132
133 bool isLatest() const;
134 bool isValid() const;
135 QString stringValue() const;
137 {
138 if (majorVersion >= 0 || majorVersion == Undefined)
139 return QString::number(majorVersion);
140 return QString();
141 }
143 {
144 if (majorVersion == Version::Latest)
145 return QLatin1String("Latest");
146 if (majorVersion >= 0 || majorVersion == Undefined)
147 return QString::number(majorVersion);
148 return QString();
149 }
151 {
152 if (minorVersion >= 0 || minorVersion == Undefined)
153 return QString::number(minorVersion);
154 return QString();
155 }
156 int compare(Version o) const
157 {
158 int c = majorVersion - o.majorVersion;
159 if (c != 0)
160 return c;
161 return minorVersion - o.minorVersion;
162 }
163
166};
167inline bool operator==(Version v1, Version v2)
168{
169 return v1.compare(v2) == 0;
170}
171inline bool operator!=(Version v1, Version v2)
172{
173 return v1.compare(v2) != 0;
174}
175inline bool operator<(Version v1, Version v2)
176{
177 return v1.compare(v2) < 0;
178}
179inline bool operator<=(Version v1, Version v2)
180{
181 return v1.compare(v2) <= 0;
182}
183inline bool operator>(Version v1, Version v2)
184{
185 return v1.compare(v2) > 0;
186}
187inline bool operator>=(Version v1, Version v2)
188{
189 return v1.compare(v2) >= 0;
190}
191
193{
194public:
196 QmlUri() = default;
197 static QmlUri fromString(const QString &importStr);
198 static QmlUri fromUriString(const QString &importStr);
199 static QmlUri fromDirectoryString(const QString &importStr);
200 bool isValid() const;
201 bool isDirectory() const;
202 bool isModule() const;
203 QString moduleUri() const;
204 QString localPath() const;
205 QString absoluteLocalPath(const QString &basePath = QString()) const;
206 QUrl directoryUrl() const;
207 QString directoryString() const;
208 QString toString() const;
209 Kind kind() const;
210
211 friend bool operator==(const QmlUri &i1, const QmlUri &i2)
212 {
213 return i1.m_kind == i2.m_kind && i1.m_value == i2.m_value;
214 }
215 friend bool operator!=(const QmlUri &i1, const QmlUri &i2) { return !(i1 == i2); }
216
217private:
218 QmlUri(const QUrl &url) : m_kind(Kind::DirectoryUrl), m_value(url) { }
219 QmlUri(Kind kind, const QString &value) : m_kind(kind), m_value(value) { }
220 Kind m_kind = Kind::Invalid;
221 std::variant<QString, QUrl> m_value;
222};
223
225{
227public:
228 constexpr static DomType kindValue = DomType::Import;
229
230 static Import fromUriString(
231 const QString &importStr, Version v = Version(),
232 const QString &importId = QString(), const ErrorHandler &handler = nullptr);
233 static Import fromFileString(
234 const QString &importStr, const QString &importId = QString(),
235 const ErrorHandler &handler = nullptr);
236
237 Import(const QmlUri &uri = QmlUri(), Version version = Version(),
238 const QString &importId = QString())
240 {
241 }
242
243 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const;
244 Import baseImport() const { return Import { uri, version }; }
245
246 friend bool operator==(const Import &i1, const Import &i2)
247 {
248 return i1.uri == i2.uri && i1.version == i2.version && i1.importId == i2.importId
249 && i1.comments == i2.comments && i1.implicit == i2.implicit;
250 }
251 friend bool operator!=(const Import &i1, const Import &i2) { return !(i1 == i2); }
252
253 void writeOut(const DomItem &self, OutWriter &ow) const;
254
256
261 bool implicit = false;
262};
263
265{
266public:
268
269 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
270 {
271 bool cont = true;
272 cont = cont && self.invokeVisitorOnField(visitor, Fields::import, import);
273 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::inheritVersion),
275 return cont;
276 }
277
278 friend bool operator==(const ModuleAutoExport &i1, const ModuleAutoExport &i2)
279 {
280 return i1.import == i2.import && i1.inheritVersion == i2.inheritVersion;
281 }
282 friend bool operator!=(const ModuleAutoExport &i1, const ModuleAutoExport &i2)
283 {
284 return !(i1 == i2);
285 }
286
288 bool inheritVersion = false;
289};
290
292{
293public:
295
296 Pragma(const QString &pragmaName = QString(), const QStringList &pragmaValues = {})
298 {
299 }
300
301 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
302 {
303 bool cont = self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::name), name);
304 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::values), values);
305 cont = cont && self.invokeVisitorOnField(visitor, Fields::comments, comments);
306 return cont;
307 }
308
309 void writeOut(const DomItem &self, OutWriter &ow) const;
310
314};
315
317{
318public:
319 constexpr static DomType kindValue = DomType::Id;
320
321 Id(const QString &idName = QString(), const Path &referredObject = Path());
322
323 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const;
324 void updatePathFromOwner(const Path &pathFromOwner);
325 Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &ann, QmlObject **aPtr = nullptr);
326
332};
333
334// TODO: rename? it may contain statements and stuff, not only expressions
335// TODO QTBUG-121933
337{
338 Q_GADGET
339 Q_DECLARE_TR_FUNCTIONS(ScriptExpression)
340public:
341 enum class ExpressionType {
347 JSCode, // Used for storing the content of the whole .js file as "one" Expression
348 ESMCode, // Used for storing the content of the whole ECMAScript module (.mjs) as "one"
349 // Expression
350 };
353 DomType kind() const override { return kindValue; }
354
355 explicit ScriptExpression(QStringView code, const std::shared_ptr<QQmlJS::Engine> &engine,
356 AST::Node *ast, const std::shared_ptr<AstComments> &comments,
357 ExpressionType expressionType,
358 const SourceLocation &localOffset = SourceLocation());
359
366
367 explicit ScriptExpression(const QString &code, ExpressionType expressionType)
369 {
370 setCode(code);
371 }
372
374
375 std::shared_ptr<ScriptExpression> makeCopy(const DomItem &self) const
376 {
377 return std::static_pointer_cast<ScriptExpression>(doCopy(self));
378 }
379
380 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
381
382 Path canonicalPath(const DomItem &self) const override { return self.m_ownerPath; }
383 // parsed and created if not available
384 AST::Node *ast() const { return m_ast; }
385 // dump of the ast (without locations)
386 void astDumper(const Sink &s, AstDumperOptions options) const;
388
389 // definedSymbols name, value, from
390 // usedSymbols name, locations
392 {
393 QMutexLocker l(mutex());
394 return m_code;
395 }
396
398 {
399 QMutexLocker l(mutex());
400 return m_expressionType;
401 }
402
403 bool isNull() const
404 {
405 QMutexLocker l(mutex());
406 return m_code.isNull();
407 }
409 {
410 QMutexLocker l(mutex());
411 return m_engine;
412 }
413 QStringView loc2Str(const SourceLocation &) const;
414 std::shared_ptr<AstComments> astComments() const { return m_astComments; }
415 void writeOut(const DomItem &self, OutWriter &lw) const override;
416 SourceLocation globalLocation(const DomItem &self) const;
417 SourceLocation localOffset() const { return m_localOffset; }
419 ScriptElementVariant scriptElement() { return m_element; }
420
421protected:
422 std::shared_ptr<OwningItem> doCopy(const DomItem &) const override
423 {
424 return std::make_shared<ScriptExpression>(*this);
425 }
426
427 SourceLocation locationToLocal(const SourceLocation &x) const
428 {
429 return SourceLocation(
430 x.offset - m_localOffset.offset, x.length, x.startLine - m_localOffset.startLine,
431 ((x.startLine == m_localOffset.startLine)
432 ? x.startColumn - m_localOffset.startColumn
433 : x.startColumn)); // are line and column 1 based? then we should + 1
434 }
435
436private:
437 void setCode(const QString &code);
438 [[nodiscard]] AST::Node *parse();
439
440 ExpressionType m_expressionType;
441 QString m_codeStr;
442 QStringView m_code;
443 mutable std::shared_ptr<QQmlJS::Engine> m_engine;
444 mutable AST::Node *m_ast;
445 std::shared_ptr<AstComments> m_astComments;
446 SourceLocation m_localOffset;
447 ScriptElementVariant m_element;
448};
449
450class BindingValue;
451
453{
454public:
456
457 Binding(const QString &m_name = QString());
458 Binding(const QString &m_name, std::unique_ptr<BindingValue> &&value,
459 BindingType bindingType = BindingType::Normal);
460 Binding(const QString &m_name, const std::shared_ptr<ScriptExpression> &value,
461 BindingType bindingType = BindingType::Normal);
462 Binding(const QString &m_name, const QString &scriptCode,
463 BindingType bindingType = BindingType::Normal);
464 Binding(const QString &m_name, const QmlObject &value,
465 BindingType bindingType = BindingType::Normal);
466 Binding(const QString &m_name, const QList<QmlObject> &value,
467 BindingType bindingType = BindingType::Normal);
468 Binding(const Binding &o);
469 Binding(Binding &&o) = default;
470 ~Binding();
471 Binding &operator=(const Binding &);
472 Binding &operator=(Binding &&) = default;
473
474 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const;
475 DomItem valueItem(const DomItem &self) const; // ### REVISIT: consider replacing return value with variant
477 QString name() const { return m_name; }
478 BindingType bindingType() const { return m_bindingType; }
479 QmlObject const *objectValue() const;
480 QList<QmlObject> const *arrayValue() const;
481 std::shared_ptr<ScriptExpression> scriptExpressionValue() const;
485 QList<QmlObject> annotations() const { return m_annotations; }
486 void setAnnotations(const QList<QmlObject> &annotations) { m_annotations = annotations; }
487 void setValue(std::unique_ptr<BindingValue> &&value);
488 Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &a, QmlObject **aPtr = nullptr);
489 const RegionComments &comments() const { return m_comments; }
490 RegionComments &comments() { return m_comments; }
491 void updatePathFromOwner(const Path &newPath);
492 void writeOut(const DomItem &self, OutWriter &lw) const;
493 void writeOutValue(const DomItem &self, OutWriter &lw) const;
494 bool isSignalHandler() const
495 {
496 QString baseName = m_name.split(QLatin1Char('.')).last();
497 return QQmlSignalNames::isHandlerName(baseName);
498 }
499 static QString preCodeForName(QStringView n)
500 {
501 return QStringLiteral(u"QtObject{\n %1: ").arg(n.split(u'.').last());
502 }
503 static QString postCodeForName(QStringView) { return QStringLiteral(u"\n}\n"); }
504 QString preCode() const { return preCodeForName(m_name); }
505 QString postCode() const { return postCodeForName(m_name); }
506
507 ScriptElementVariant bindingIdentifiers() const { return m_bindingIdentifiers; }
508 void setBindingIdentifiers(const ScriptElementVariant &bindingIdentifiers) { m_bindingIdentifiers = bindingIdentifiers; }
509
510private:
512 BindingType m_bindingType;
513 QString m_name;
514 std::unique_ptr<BindingValue> m_value;
515 QList<QmlObject> m_annotations;
516 RegionComments m_comments;
517 ScriptElementVariant m_bindingIdentifiers;
518};
519
521{
522public:
524
525 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const;
526
527 Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &annotation,
528 QmlObject **aPtr = nullptr);
529 void updatePathFromOwner(const Path &newPath);
530
531 QQmlJSScope::ConstPtr semanticScope() const { return m_semanticScope; }
532 void setSemanticScope(const QQmlJSScope::ConstPtr &scope) { m_semanticScope = scope; }
533
537 bool isReadonly = false;
538 bool isList = false;
542};
543
564
566{
567public:
569
570 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
571 {
572 bool cont = AttributeInfo::iterateDirectSubpaths(self, visitor);
573 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::isPointer), isPointer);
574 // virtual and override don't need to be accessed through DomItem API for now
575 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::isFinal), isFinal);
576 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::isAlias), isAlias());
577 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::isDefaultMember),
579 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::isRequired),
580 isRequired);
581 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::read), read);
582 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::write), write);
583 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::bindable), bindable);
584 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::notify), notify);
585 if (m_nameIdentifiers) {
586 cont = cont && visitor(PathEls::Field(Fields::nameIdentifiers), [this, &self]() {
587 return self.subScriptElementWrapperItem(m_nameIdentifiers);
588 });
589 }
590 return cont;
591 }
592
593 bool isAlias() const { return typeName == u"alias"; }
594 bool isParametricType() const;
595 void writeOut(const DomItem &self, OutWriter &lw) const;
596 ScriptElementVariant nameIdentifiers() const { return m_nameIdentifiers; }
597 void setNameIdentifiers(const ScriptElementVariant &name) { m_nameIdentifiers = name; }
598
603 bool isVirtual = false;
604 bool isOverride = false;
605 bool isFinal = false;
606 bool isPointer = false;
607 bool isDefaultMember = false;
608 bool isRequired = false;
610};
611
613{
614public:
615 constexpr static DomType kindValue = DomType::PropertyInfo; // used to get the correct kind in ObjectWrapper
616
617 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const;
618
621};
622
624{
625public:
628 Prefix, // a(int x)
629 Suffix, // a(x : int)
630 };
631 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const;
632
633 void writeOut(const DomItem &self, OutWriter &ow) const;
634 void writeOutSignal(const DomItem &self, OutWriter &ow) const;
635
638 bool isPointer = false;
639 bool isReadonly = false;
640 bool isList = false;
641 bool isRestElement = false;
643 /*!
644 \internal
645 Contains the scriptElement representing this argument, inclusive default value,
646 deconstruction, etc.
647 */
652};
653
654// TODO (QTBUG-128423)
655// Refactor to differentiate between Signals and Methods easily,
656// considering their distinct handling and formatting needs.
657// Explore separating Signal functionality or unifying shared methods.
659{
661public:
663 Q_ENUM(MethodType)
664
665 constexpr static DomType kindValue = DomType::MethodInfo;
666
667 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const;
668 void writePre(const DomItem &self, OutWriter &ow) const;
669 void writeOut(const DomItem &self, OutWriter &ow) const;
670 QString signature(const DomItem &self) const;
671
672 MethodInfo() = default;
673
674 // TODO: make private + add getters/setters
679 bool isConstructor = false;
680 bool isGenerator = false;
681
682private:
683 void writeOutArguments(const DomItem &self, OutWriter &ow) const;
684 void writeOutReturnType(const DomItem &self, OutWriter &ow) const;
685 void writeOutBody(const DomItem &self, OutWriter &ow) const;
686};
687
689{
690public:
696 EnumItem(const QString &name = QString(), int value = 0, ValueKind valueKind = ValueKind::ImplicitValue)
697 : m_name(name), m_value(value), m_valueKind(valueKind)
698 {
699 }
700
701 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const;
702
703 QString name() const { return m_name; }
704 double value() const { return m_value; }
705 RegionComments &comments() { return m_comments; }
706 const RegionComments &comments() const { return m_comments; }
707 void writeOut(const DomItem &self, OutWriter &lw) const;
708
709private:
710 QString m_name;
711 double m_value;
712 ValueKind m_valueKind;
713 RegionComments m_comments;
714};
715
716class QMLDOM_EXPORT EnumDecl final : public CommentableDomElement
717{
718public:
720 DomType kind() const override { return kindValue; }
721
722 EnumDecl(const QString &name = QString(), const QList<EnumItem> &values = QList<EnumItem>(),
723 const Path &pathFromOwner = Path())
725 {
726 }
727
728 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
729
730 QString name() const { return m_name; }
731 void setName(const QString &name) { m_name = name; }
732 const QList<EnumItem> &values() const & { return m_values; }
733 bool isFlag() const { return m_isFlag; }
734 void setIsFlag(bool flag) { m_isFlag = flag; }
735 QString alias() const { return m_alias; }
736 void setAlias(const QString &aliasName) { m_alias = aliasName; }
737 void setValues(const QList<EnumItem> &values) { m_values = values; }
738 Path addValue(const EnumItem &value)
739 {
740 m_values.append(value);
741 return Path::fromField(Fields::values).withIndex(index_type(m_values.size() - 1));
742 }
743 void updatePathFromOwner(const Path &newP) override;
744
745 const QList<QmlObject> &annotations() const & { return m_annotations; }
746 void setAnnotations(const QList<QmlObject> &annotations);
747 Path addAnnotation(const QmlObject &child, QmlObject **cPtr = nullptr);
748 void writeOut(const DomItem &self, OutWriter &lw) const override;
749
750private:
751 QString m_name;
752 bool m_isFlag = false;
753 QString m_alias;
754 QList<EnumItem> m_values;
755 QList<QmlObject> m_annotations;
756};
757
759{
761public:
762 constexpr static DomType kindValue = DomType::QmlObject;
763 DomType kind() const override { return kindValue; }
764
765 QmlObject(const Path &pathFromOwner = Path());
766 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override;
767 bool iterateBaseDirectSubpaths(const DomItem &self, DirectVisitor) const;
768 QList<QString> fields() const;
769 QList<QString> fields(const DomItem &) const override { return fields(); }
770 DomItem field(const DomItem &self, QStringView name) const override;
771 void updatePathFromOwner(const Path &newPath) override;
773 QString defaultPropertyName(const DomItem &self) const;
774 bool iterateSubOwners(const DomItem &self,
775 function_ref<bool(const DomItem &owner)> visitor) const;
776
777 QString idStr() const { return m_idStr; }
778 QString name() const { return m_name; }
779 const QList<Path> &prototypePaths() const & { return m_prototypePaths; }
780 Path nextScopePath() const { return m_nextScopePath; }
781 const QMultiMap<QString, PropertyDefinition> &propertyDefs() const & { return m_propertyDefs; }
782 const QMultiMap<QString, Binding> &bindings() const & { return m_bindings; }
783 const QMultiMap<QString, MethodInfo> &methods() const & { return m_methods; }
784 QList<QmlObject> children() const { return m_children; }
785 QList<QmlObject> annotations() const { return m_annotations; }
786
787 void setIdStr(const QString &id) { m_idStr = id; }
788 void setName(const QString &name) { m_name = name; }
789 void setDefaultPropertyName(const QString &name) { m_defaultPropertyName = name; }
790 void setPrototypePaths(const QList<Path> &prototypePaths) { m_prototypePaths = prototypePaths; }
791 Path addPrototypePath(const Path &prototypePath)
792 {
793 index_type idx = index_type(m_prototypePaths.indexOf(prototypePath));
794 if (idx == -1) {
795 idx = index_type(m_prototypePaths.size());
796 m_prototypePaths.append(prototypePath);
797 }
798 return Path::fromField(Fields::prototypes).withIndex(idx);
799 }
800 void setNextScopePath(const Path &nextScopePath) { m_nextScopePath = nextScopePath; }
801 void setPropertyDefs(const QMultiMap<QString, PropertyDefinition> &propertyDefs)
802 {
803 m_propertyDefs = propertyDefs;
804 }
805 void setBindings(const QMultiMap<QString, Binding> &bindings) { m_bindings = bindings; }
806 void setMethods(const QMultiMap<QString, MethodInfo> &functionDefs)
807 {
808 m_methods = functionDefs;
809 }
810 void setChildren(const QList<QmlObject> &children)
811 {
812 m_children = children;
813 if (pathFromOwner())
815 }
816 void setAnnotations(const QList<QmlObject> &annotations)
817 {
818 m_annotations = annotations;
819 if (pathFromOwner())
821 }
823 PropertyDefinition **pDef = nullptr)
824 {
825 return insertUpdatableElementInMultiMap(pathFromOwner().withField(Fields::propertyDefs),
826 m_propertyDefs, propertyDef.name, propertyDef,
827 option, pDef);
828 }
830 AddOption option);
831
832 Path addBinding(const Binding &binding, AddOption option, Binding **bPtr = nullptr)
833 {
834 return insertUpdatableElementInMultiMap(pathFromOwner().withField(Fields::bindings), m_bindings,
835 binding.name(), binding, option, bPtr);
836 }
837 MutableDomItem addBinding(MutableDomItem &self, const Binding &binding, AddOption option);
838 Path addMethod(const MethodInfo &functionDef, AddOption option, MethodInfo **mPtr = nullptr)
839 {
840 return insertUpdatableElementInMultiMap(pathFromOwner().withField(Fields::methods), m_methods,
841 functionDef.name, functionDef, option, mPtr);
842 }
843 MutableDomItem addMethod(MutableDomItem &self, const MethodInfo &functionDef, AddOption option);
844 Path addChild(const QmlObject &child, QmlObject **cPtr = nullptr)
845 {
846 return appendUpdatableElementInQList(pathFromOwner().withField(Fields::children), m_children,
847 child, cPtr);
848 }
850 {
851 Path p = addChild(child);
853 }
854 Path addAnnotation(const QmlObject &annotation, QmlObject **aPtr = nullptr)
855 {
856 return appendUpdatableElementInQList(pathFromOwner().withField(Fields::annotations),
857 m_annotations, annotation, aPtr);
858 }
859
861 const DomItem &component) const;
863 void writeOutAttributes(OutWriter &ow, const Attributes &attribs, const QString &code) const;
864
865 void writeOutSortedEnumerations(const QList<DomItem> &descs, OutWriter &ow) const;
866 void writeOutSortedAttributes(const DomItem &self, OutWriter &ow, const DomItem &component,
867 const Attributes &attribs) const;
868 void writeOutSortedPropertyDefinition(const DomItem &self, OutWriter &ow,
869 QSet<QString> &mergedDefBinding,
870 const QStringList &keys) const;
871
872 void writeOutId(const DomItem &self, OutWriter &ow) const;
873 void writeOut(const DomItem &self, OutWriter &ow, const QString &onTarget) const;
874 void writeOut(const DomItem &self, OutWriter &lw) const override { writeOut(self, lw, QString()); }
875
877 std::shared_ptr<ScriptExpression> accessSequence) const;
878 LocallyResolvedAlias resolveAlias(const DomItem &self, const QStringList &accessSequence) const;
879
880 QQmlJSScope::ConstPtr semanticScope() const { return m_scope; }
881 void setSemanticScope(const QQmlJSScope::ConstPtr &scope) { m_scope = scope; }
882
883 ScriptElementVariant nameIdentifiers() const { return m_nameIdentifiers; }
884 void setNameIdentifiers(const ScriptElementVariant &name) { m_nameIdentifiers = name; }
885
886private:
888 QString m_idStr;
889 QString m_name;
890 QList<Path> m_prototypePaths;
891 Path m_nextScopePath;
892 QString m_defaultPropertyName;
893 QMultiMap<QString, PropertyDefinition> m_propertyDefs;
894 QMultiMap<QString, Binding> m_bindings;
895 QMultiMap<QString, MethodInfo> m_methods;
896 QList<QmlObject> m_children;
897 QList<QmlObject> m_annotations;
898 QQmlJSScope::ConstPtr m_scope;
899 ScriptElementVariant m_nameIdentifiers;
900
901 static constexpr quint32 posOfNewElements = std::numeric_limits<quint32>::max();
902};
903
905{
907public:
908 constexpr static DomType kindValue = DomType::Export;
909 static Export fromString(
910 const Path &source, QStringView exp, const Path &typePath, const ErrorHandler &h);
911 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
912 {
913 bool cont = true;
914 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::uri), uri);
915 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::typeName), typeName);
916 cont = cont && self.invokeVisitorOnField(visitor, Fields::version, version);
917 if (typePath)
918 cont = cont && self.invokeVisitorOnReference(visitor, Fields::type, typePath);
919 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::isInternal),
920 isInternal);
921 cont = cont && self.invokeVisitorOnValue(visitor, PathEls::Field(Fields::isSingleton),
923 if (exportSourcePath)
924 cont = cont && self.invokeVisitorOnReference(visitor, Fields::exportSource,
925 exportSourcePath);
926 return cont;
927 }
928
934 bool isInternal = false;
935 bool isSingleton = false;
936};
937
939{
940public:
941 Component(const QString &name);
942 Component(const Path &pathFromOwner = Path());
943 Component(const Component &o) = default;
944 Component &operator=(const Component &) = default;
945
946 bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override;
947 void updatePathFromOwner(const Path &newPath) override;
948 DomItem field(const DomItem &self, QStringView name) const override;
949
950 QString name() const { return m_name; }
951 const QMultiMap<QString, EnumDecl> &enumerations() const & { return m_enumerations; }
952 const QList<QmlObject> &objects() const & { return m_objects; }
953 bool isSingleton() const { return m_isSingleton; }
954 bool isCreatable() const { return m_isCreatable; }
955 bool isComposite() const { return m_isComposite; }
956 QString attachedTypeName() const { return m_attachedTypeName; }
957 Path attachedTypePath(const DomItem &) const { return m_attachedTypePath; }
958
959 void setName(const QString &name) { m_name = name; }
960 void setEnumerations(const QMultiMap<QString, EnumDecl> &enumerations)
961 {
962 m_enumerations = enumerations;
963 }
964 Path addEnumeration(const EnumDecl &enumeration, AddOption option = AddOption::Overwrite,
965 EnumDecl **ePtr = nullptr)
966 {
967 return insertUpdatableElementInMultiMap(pathFromOwner().withField(Fields::enumerations),
968 m_enumerations, enumeration.name(), enumeration,
969 option, ePtr);
970 }
971 void setObjects(const QList<QmlObject> &objects) { m_objects = objects; }
972 Path addObject(const QmlObject &object, QmlObject **oPtr = nullptr);
973 void setIsSingleton(bool isSingleton) { m_isSingleton = isSingleton; }
974 void setIsCreatable(bool isCreatable) { m_isCreatable = isCreatable; }
975 void setIsComposite(bool isComposite) { m_isComposite = isComposite; }
976 void setAttachedTypeName(const QString &name) { m_attachedTypeName = name; }
977 void setAttachedTypePath(const Path &p) { m_attachedTypePath = p; }
978
979private:
981 QString m_name;
982 QMultiMap<QString, EnumDecl> m_enumerations;
983 QList<QmlObject> m_objects;
984 bool m_isSingleton = false;
985 bool m_isCreatable = true;
986 bool m_isComposite = true;
987 QString m_attachedTypeName;
988 Path m_attachedTypePath;
989};
990
991class QMLDOM_EXPORT JsResource final : public Component
992{
993public:
995 DomType kind() const override { return kindValue; }
996
997 JsResource(const Path &pathFromOwner = Path()) : Component(pathFromOwner) { }
998 bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
999 { // to do: complete
1000 return true;
1001 }
1002 // globalSymbols defined/exported, required/used
1003};
1004
1005class QMLDOM_EXPORT QmlComponent final : public Component
1006{
1007public:
1009 DomType kind() const override { return kindValue; }
1010
1011 QmlComponent(const QString &name = QString()) : Component(name)
1012 {
1013 setIsComposite(true);
1014 setIsCreatable(true);
1015 }
1016
1017 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override;
1018
1019 const QMultiMap<QString, Id> &ids() const & { return m_ids; }
1020 Path nextComponentPath() const { return m_nextComponentPath; }
1021 void setIds(const QMultiMap<QString, Id> &ids) { m_ids = ids; }
1022 void setNextComponentPath(const Path &p) { m_nextComponentPath = p; }
1023 void updatePathFromOwner(const Path &newPath) override;
1024 Path addId(const Id &id, AddOption option = AddOption::Overwrite, Id **idPtr = nullptr)
1025 {
1026 // warning does nor remove old idStr when overwriting...
1027 return insertUpdatableElementInMultiMap(pathFromOwner().withField(Fields::ids), m_ids, id.name,
1028 id, option, idPtr);
1029 }
1030 void writeOut(const DomItem &self, OutWriter &) const override;
1031 QList<QString> subComponentsNames(const DomItem &self) const;
1032 QList<DomItem> subComponents(const DomItem &self) const;
1033
1034 void setSemanticScope(const QQmlJSScope::ConstPtr &scope) { m_semanticScope = scope; }
1035 QQmlJSScope::ConstPtr semanticScope() const { return m_semanticScope; }
1036 ScriptElementVariant nameIdentifiers() const { return m_nameIdentifiers; }
1037 void setNameIdentifiers(const ScriptElementVariant &name) { m_nameIdentifiers = name; }
1038
1039private:
1041 Path m_nextComponentPath;
1042 QMultiMap<QString, Id> m_ids;
1043 QQmlJSScope::ConstPtr m_semanticScope;
1044 // m_nameIdentifiers contains the name of the component as FieldMemberExpression, and therefore
1045 // only exists in inline components!
1046 ScriptElementVariant m_nameIdentifiers;
1047};
1048
1049class QMLDOM_EXPORT GlobalComponent final : public Component
1050{
1051public:
1053 DomType kind() const override { return kindValue; }
1054
1055 GlobalComponent(const Path &pathFromOwner = Path()) : Component(pathFromOwner) { }
1056};
1057
1059
1061{
1062public:
1063 BindingValue();
1064 BindingValue(const QmlObject &o);
1065 BindingValue(const std::shared_ptr<ScriptExpression> &o);
1066 BindingValue(const QList<QmlObject> &l);
1067 ~BindingValue();
1068 BindingValue(const BindingValue &o);
1070
1071 DomItem value(const DomItem &binding) const;
1072 void updatePathFromOwner(const Path &newPath);
1073
1074private:
1075 friend class Binding;
1076 void clearValue();
1077
1078 BindingValueKind kind;
1079 union {
1084 };
1085};
1086
1087} // end namespace Dom
1088} // end namespace QQmlJS
1089QT_END_NAMESPACE
1090#endif // QQMLDOMELEMENTS_P_H
std::pair< AST::Node *, CommentAnchor > CommentKey
void setSemanticScope(const QQmlJSScope::ConstPtr &scope)
QQmlJSScope::ConstPtr m_semanticScope
void updatePathFromOwner(const Path &newPath)
QQmlJSScope::ConstPtr semanticScope() const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &annotation, QmlObject **aPtr=nullptr)
BindingValue(const QList< QmlObject > &l)
void updatePathFromOwner(const Path &newPath)
BindingValue(const std::shared_ptr< ScriptExpression > &o)
BindingValue(const BindingValue &o)
DomItem value(const DomItem &binding) const
BindingValue & operator=(const BindingValue &o)
std::shared_ptr< ScriptExpression > scriptExpression
BindingValue(const QmlObject &o)
void setValue(std::unique_ptr< BindingValue > &&value)
BindingType bindingType() const
std::shared_ptr< ScriptExpression > scriptExpressionValue() const
RegionComments & comments()
Binding & operator=(const Binding &)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
void setBindingIdentifiers(const ScriptElementVariant &bindingIdentifiers)
Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &a, QmlObject **aPtr=nullptr)
QList< QmlObject > annotations() const
void updatePathFromOwner(const Path &newPath)
static QString preCodeForName(QStringView n)
QmlObject const * objectValue() const
DomItem valueItem(const DomItem &self) const
QList< QmlObject > * arrayValue()
Binding(const Binding &o)
QList< QmlObject > const * arrayValue() const
static QString postCodeForName(QStringView)
void setAnnotations(const QList< QmlObject > &annotations)
Binding & operator=(Binding &&)=default
void writeOut(const DomItem &self, OutWriter &lw) const
Binding(const QString &m_name, const QString &scriptCode, BindingType bindingType=BindingType::Normal)
const RegionComments & comments() const
Binding(const QString &m_name, std::unique_ptr< BindingValue > &&value, BindingType bindingType=BindingType::Normal)
void writeOutValue(const DomItem &self, OutWriter &lw) const
Binding(const QString &m_name=QString())
static constexpr DomType kindValue
Binding(const QString &m_name, const QmlObject &value, BindingType bindingType=BindingType::Normal)
Binding(Binding &&o)=default
std::shared_ptr< ScriptExpression > scriptExpressionValue()
ScriptElementVariant bindingIdentifiers() const
BindingValueKind valueKind() const
Binding(const QString &m_name, const std::shared_ptr< ScriptExpression > &value, BindingType bindingType=BindingType::Normal)
const RegionComments & comments() const
CommentableDomElement & operator=(const CommentableDomElement &o)=default
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
CommentableDomElement(const CommentableDomElement &o)
CommentableDomElement(const Path &pathFromOwner=Path())
void setIsSingleton(bool isSingleton)
void updatePathFromOwner(const Path &newPath) override
Component(const Path &pathFromOwner=Path())
void setIsComposite(bool isComposite)
Component & operator=(const Component &)=default
void setIsCreatable(bool isCreatable)
void setObjects(const QList< QmlObject > &objects)
const QMultiMap< QString, EnumDecl > & enumerations() const &
Component(const Component &o)=default
Path addObject(const QmlObject &object, QmlObject **oPtr=nullptr)
void setName(const QString &name)
Path attachedTypePath(const DomItem &) const
void setEnumerations(const QMultiMap< QString, EnumDecl > &enumerations)
DomItem field(const DomItem &self, QStringView name) const override
Path addEnumeration(const EnumDecl &enumeration, AddOption option=AddOption::Overwrite, EnumDecl **ePtr=nullptr)
void setAttachedTypeName(const QString &name)
bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
QString attachedTypeName() const
Component(const QString &name)
void setAttachedTypePath(const Path &p)
const QList< QmlObject > & objects() const &
Path pathFromOwner() const override
DomElement(const Path &pathFromOwner=Path())
A value type that references any element of the Dom.
static ErrorGroup domErrorGroup
const QList< QmlObject > & annotations() const &
const QList< EnumItem > & values() const &
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void setAlias(const QString &aliasName)
void setAnnotations(const QList< QmlObject > &annotations)
EnumDecl(const QString &name=QString(), const QList< EnumItem > &values=QList< EnumItem >(), const Path &pathFromOwner=Path())
void writeOut(const DomItem &self, OutWriter &lw) const override
void updatePathFromOwner(const Path &newP) override
void setName(const QString &name)
Path addAnnotation(const QmlObject &child, QmlObject **cPtr=nullptr)
Path addValue(const EnumItem &value)
static constexpr DomType kindValue
void setValues(const QList< EnumItem > &values)
DomType kind() const override
EnumItem(const QString &name=QString(), int value=0, ValueKind valueKind=ValueKind::ImplicitValue)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
const RegionComments & comments() const
RegionComments & comments()
void writeOut(const DomItem &self, OutWriter &lw) const
static constexpr DomType kindValue
Represents a set of tags grouping a set of related error messages.
static Export fromString(const Path &source, QStringView exp, const Path &typePath, const ErrorHandler &h)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
GlobalComponent(const Path &pathFromOwner=Path())
DomType kind() const override
static constexpr DomType kindValue
Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &ann, QmlObject **aPtr=nullptr)
RegionComments comments
std::shared_ptr< ScriptExpression > value
static constexpr DomType kindValue
Id(const QString &idName=QString(), const Path &referredObject=Path())
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
void updatePathFromOwner(const Path &pathFromOwner)
QList< QmlObject > annotations
Import(const QmlUri &uri=QmlUri(), Version version=Version(), const QString &importId=QString())
Import baseImport() const
friend bool operator==(const Import &i1, const Import &i2)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
static QRegularExpression importRe()
void writeOut(const DomItem &self, OutWriter &ow) const
static Import fromFileString(const QString &importStr, const QString &importId=QString(), const ErrorHandler &handler=nullptr)
friend bool operator!=(const Import &i1, const Import &i2)
static Import fromUriString(const QString &importStr, Version v=Version(), const QString &importId=QString(), const ErrorHandler &handler=nullptr)
JsResource(const Path &pathFromOwner=Path())
DomType kind() const override
bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
static constexpr DomType kindValue
std::shared_ptr< ScriptExpression > body
QList< MethodParameter > parameters
std::shared_ptr< ScriptExpression > returnType
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
void writeOut(const DomItem &self, OutWriter &ow) const
void writePre(const DomItem &self, OutWriter &ow) const
QString signature(const DomItem &self) const
std::shared_ptr< ScriptExpression > defaultValue
void writeOut(const DomItem &self, OutWriter &ow) const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
void writeOutSignal(const DomItem &self, OutWriter &ow) const
TypeAnnotationStyle typeAnnotationStyle
static constexpr DomType kindValue
std::shared_ptr< ScriptExpression > value
friend bool operator==(const ModuleAutoExport &i1, const ModuleAutoExport &i2)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
friend bool operator!=(const ModuleAutoExport &i1, const ModuleAutoExport &i2)
static constexpr DomType kindValue
MutableDomItem(const DomItem &owner, const Path &pathFromOwner)
A DomItem that owns other DomItems and is managed through a shared pointer.
OwningItem(int derivedFrom=0)
PathEls::Kind Kind
static Path fromRoot(PathRoot r)
Path operator[](int i) const
Path mid(int offset, int length) const
Path last() const
Kind headKind() const
static Path fromCurrent(PathCurrent c)
Pragma(const QString &pragmaName=QString(), const QStringList &pragmaValues={})
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
void writeOut(const DomItem &self, OutWriter &ow) const
static constexpr DomType kindValue
static constexpr DomType kindValue
ScriptElementVariant m_nameIdentifiers
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
void writeOut(const DomItem &self, OutWriter &lw) const
ScriptElementVariant nameIdentifiers() const
void setNameIdentifiers(const ScriptElementVariant &name)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
static constexpr DomType kindValue
QQmlDomAstCreatorBase(const MutableDomItem &qmlFile)
void endVisit(AST::UiProgram *) override
std::shared_ptr< DomEnvironment > currentEnvironment()
void throwRecursionDepthError() override
void endVisitHelper(AST::PatternElement *pe, const std::shared_ptr< ScriptElements::GenericScriptElement > &element)
void loadAnnotations(AST::UiObjectMember *el)
bool visit(AST::UiProgram *program) override
void enableLoadFileLazily(bool enable=true)
void enableScriptExpressions(bool enable=true)
virtual QQmlJSASTClassListToVisit void throwRecursionDepthError() override
QQmlDomAstCreatorWithQQmlJSScope(MutableDomItem &qmlFile, QQmlJSLogger *logger, QQmlJSImporter *importer)
QQmlJSScope::ConstPtr semanticScope() const
void setIds(const QMultiMap< QString, Id > &ids)
void setNextComponentPath(const Path &p)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
QList< DomItem > subComponents(const DomItem &self) const
const QMultiMap< QString, Id > & ids() const &
void updatePathFromOwner(const Path &newPath) override
void setNameIdentifiers(const ScriptElementVariant &name)
static constexpr DomType kindValue
void writeOut(const DomItem &self, OutWriter &) const override
void setSemanticScope(const QQmlJSScope::ConstPtr &scope)
QmlComponent(const QString &name=QString())
QList< QString > subComponentsNames(const DomItem &self) const
Path addId(const Id &id, AddOption option=AddOption::Overwrite, Id **idPtr=nullptr)
ScriptElementVariant nameIdentifiers() const
DomType kind() const override
QList< QString > fields(const DomItem &) const override
void setNameIdentifiers(const ScriptElementVariant &name)
Path addChild(const QmlObject &child, QmlObject **cPtr=nullptr)
MutableDomItem addBinding(MutableDomItem &self, const Binding &binding, AddOption option)
void setMethods(const QMultiMap< QString, MethodInfo > &functionDefs)
void writeOutSortedEnumerations(const QList< DomItem > &descs, OutWriter &ow) const
void writeOut(const DomItem &self, OutWriter &ow, const QString &onTarget) const
ScriptElementVariant nameIdentifiers() const
void setName(const QString &name)
QList< std::pair< SourceLocation, DomItem > > orderOfAttributes(const DomItem &self, const DomItem &component) const
bool iterateSubOwners(const DomItem &self, function_ref< bool(const DomItem &owner)> visitor) const
MutableDomItem addChild(MutableDomItem &self, const QmlObject &child)
void setAnnotations(const QList< QmlObject > &annotations)
const QMultiMap< QString, Binding > & bindings() const &
DomType kind() const override
void setNextScopePath(const Path &nextScopePath)
void updatePathFromOwner(const Path &newPath) override
void setChildren(const QList< QmlObject > &children)
Path addBinding(const Binding &binding, AddOption option, Binding **bPtr=nullptr)
Path addAnnotation(const QmlObject &annotation, QmlObject **aPtr=nullptr)
LocallyResolvedAlias resolveAlias(const DomItem &self, std::shared_ptr< ScriptExpression > accessSequence) const
void writeOutId(const DomItem &self, OutWriter &ow) const
QList< QmlObject > children() const
LocallyResolvedAlias resolveAlias(const DomItem &self, const QStringList &accessSequence) const
const QList< Path > & prototypePaths() const &
void writeOutSortedPropertyDefinition(const DomItem &self, OutWriter &ow, QSet< QString > &mergedDefBinding, const QStringList &keys) const
Path addPropertyDef(const PropertyDefinition &propertyDef, AddOption option, PropertyDefinition **pDef=nullptr)
void writeOutSortedAttributes(const DomItem &self, OutWriter &ow, const DomItem &component, const Attributes &attribs) const
const QMultiMap< QString, MethodInfo > & methods() const &
MutableDomItem addPropertyDef(MutableDomItem &self, const PropertyDefinition &propertyDef, AddOption option)
DomItem field(const DomItem &self, QStringView name) const override
void setBindings(const QMultiMap< QString, Binding > &bindings)
QString localDefaultPropertyName() const
QString defaultPropertyName(const DomItem &self) const
void setPropertyDefs(const QMultiMap< QString, PropertyDefinition > &propertyDefs)
QmlObject(const Path &pathFromOwner=Path())
void writeOutAttributes(OutWriter &ow, const Attributes &attribs, const QString &code) const
MutableDomItem addMethod(MutableDomItem &self, const MethodInfo &functionDef, AddOption option)
void setIdStr(const QString &id)
QQmlJSScope::ConstPtr semanticScope() const
const QMultiMap< QString, PropertyDefinition > & propertyDefs() const &
void writeOut(const DomItem &self, OutWriter &lw) const override
Path addPrototypePath(const Path &prototypePath)
void setSemanticScope(const QQmlJSScope::ConstPtr &scope)
void setDefaultPropertyName(const QString &name)
void setPrototypePaths(const QList< Path > &prototypePaths)
QList< QmlObject > annotations() const
QList< QString > fields() const
QList< std::pair< SourceLocation, DomItem > > Attributes
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
Path addMethod(const MethodInfo &functionDef, AddOption option, MethodInfo **mPtr=nullptr)
bool iterateBaseDirectSubpaths(const DomItem &self, DirectVisitor) const
static QmlUri fromString(const QString &importStr)
QString absoluteLocalPath(const QString &basePath=QString()) const
QString directoryString() const
static QmlUri fromUriString(const QString &importStr)
QString localPath() const
QString moduleUri() const
friend bool operator==(const QmlUri &i1, const QmlUri &i2)
static QmlUri fromDirectoryString(const QString &importStr)
friend bool operator!=(const QmlUri &i1, const QmlUri &i2)
Keeps the comments associated with a DomItem.
Use this to contain any script element.
void replaceKindForGenericChildren(DomType oldType, DomType newType)
QStringView loc2Str(const SourceLocation &) const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
DomType kind() const override
std::shared_ptr< AstComments > astComments() const
std::shared_ptr< QQmlJS::Engine > engine() const
ScriptExpression(const QString &code, ExpressionType expressionType)
static constexpr DomType kindValue
SourceLocation locationToLocal(const SourceLocation &x) const
std::shared_ptr< ScriptExpression > makeCopy(const DomItem &self) const
ScriptExpression(const ScriptExpression &e)
ExpressionType expressionType() const
void writeOut(const DomItem &self, OutWriter &lw) const override
SourceLocation globalLocation(const DomItem &self) const
ScriptExpression(QStringView code, const std::shared_ptr< QQmlJS::Engine > &engine, AST::Node *ast, const std::shared_ptr< AstComments > &comments, ExpressionType expressionType, const SourceLocation &localOffset=SourceLocation())
void setScriptElement(const ScriptElementVariant &p)
std::shared_ptr< OwningItem > doCopy(const DomItem &) const override
ScriptElementVariant scriptElement()
void astDumper(const Sink &s, AstDumperOptions options) const
SourceLocation localOffset() const
Path canonicalPath(const DomItem &self) const override
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
QString majorString() const
static constexpr DomType kindValue
Version(qint32 majorVersion=Undefined, qint32 minorVersion=Undefined)
QString minorString() const
int compare(Version o) const
static Version fromString(QStringView v)
QString stringValue() const
static constexpr qint32 Undefined
static constexpr qint32 Latest
QString majorSymbolicString() const
Provides entities to maintain mappings between elements and their location in a file.
void addRegion(const Tree &fLoc, FileLocationRegion region, SourceLocation loc)
Tree ensure(const Tree &base, const Path &basePath)
Path lookupTypePath(const QString &name)
Path loadInfoPath(const Path &el)
Path moduleScopePath(const QString &uri, const ErrorHandler &errorHandler=nullptr)
Path jsFilePath(const QString &path)
Path lookupCppTypePath(const QString &name)
Path qmlFileInfoPath(const QString &canonicalFilePath)
Path moduleIndexPath(const QString &uri, int majorVersion, const ErrorHandler &errorHandler=nullptr)
Path qmlFilePath(const QString &canonicalFilePath)
Path moduleScopePath(const QString &uri, const QString &version, const ErrorHandler &errorHandler=nullptr)
Path lookupSymbolPath(const QString &name)
Path jsFileInfoPath(const QString &path)
Path lookupPropertyPath(const QString &name)
Path moduleScopePath(const QString &uri, Version version, const ErrorHandler &errorHandler=nullptr)
Path qmlFileObjectPath(const QString &canonicalFilePath)
bool operator>(Version v1, Version v2)
bool operator==(Version v1, Version v2)
std::disjunction< std::is_same< U, V >... > IsInList
bool operator<(Version v1, Version v2)
bool operator<=(Version v1, Version v2)
bool operator!=(Version v1, Version v2)
bool operator>=(Version v1, Version v2)
bool visitWithCustomListIteration(T *t, AST::Visitor *visitor)
std::function< void(const ErrorMessage &)> ErrorHandler
static ErrorGroups importErrors
Combined button and popup list for selecting options.
QT_BEGIN_NAMESPACE Q_STATIC_LOGGING_CATEGORY(lcSynthesizedIterableAccess, "qt.iterable.synthesized", QtWarningMsg)
#define QMLDOM_EXPORT
#define Q_SCRIPTELEMENT_EXIT_IF(check)
#define Q_SCRIPTELEMENT_DISABLE()
#define NewErrorGroup(name)