Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
4#ifndef QQMLDOMELEMENTS_P_H
5#define QQMLDOMELEMENTS_P_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 "qqmldomitem_p.h"
19#include "qqmldomconstants_p.h"
20#include "qqmldomcomments_p.h"
21#include "qqmldomlinewriter_p.h"
22
23#include <QtQml/private/qqmljsast_p.h>
24#include <QtQml/private/qqmljsengine_p.h>
25#include <QtQml/private/qqmlsignalnames_p.h>
26
27#include <QtCore/QCborValue>
28#include <QtCore/QCborMap>
29#include <QtCore/QMutexLocker>
30#include <QtCore/QPair>
31
32#include <memory>
33#include <private/qqmljsscope_p.h>
34
35#include <functional>
36#include <limits>
37
39
40namespace QQmlJS {
41namespace Dom {
42
43// namespace for utility methods building specific paths
44// using a namespace one can reopen it and add more methods in other places
45namespace Paths {
47 const QString &uri, int majorVersion, const ErrorHandler &errorHandler = nullptr);
49 const QString &uri, Version version, const ErrorHandler &errorHandler = nullptr);
51 const QString &uri, const QString &version, const ErrorHandler &errorHandler = nullptr);
53 const QString &uri, const ErrorHandler &errorHandler = nullptr)
54{
55 return moduleScopePath(uri, QString(), errorHandler);
56}
58{
59 return Path::Root(PathRoot::Top).field(Fields::qmldirWithPath).key(path);
60}
62{
63 return qmlDirInfoPath(path).field(Fields::currentItem);
64}
66{
67 return Path::Root(PathRoot::Top).field(Fields::qmldirFileWithPath).key(path);
68}
70{
71 return qmldirFileInfoPath(path).field(Fields::currentItem);
72}
73inline Path qmlFileInfoPath(const QString &canonicalFilePath)
74{
75 return Path::Root(PathRoot::Top).field(Fields::qmlFileWithPath).key(canonicalFilePath);
76}
77inline Path qmlFilePath(const QString &canonicalFilePath)
78{
79 return qmlFileInfoPath(canonicalFilePath).field(Fields::currentItem);
80}
81inline Path qmlFileObjectPath(const QString &canonicalFilePath)
82{
83 return qmlFilePath(canonicalFilePath)
84 .field(Fields::components)
85 .key(QString())
86 .index(0)
87 .field(Fields::objects)
88 .index(0);
89}
91{
92 return Path::Root(PathRoot::Top).field(Fields::qmltypesFileWithPath).key(path);
93}
95{
96 return qmltypesFileInfoPath(path).field(Fields::currentItem);
97}
99{
100 return Path::Root(PathRoot::Top).field(Fields::jsFileWithPath).key(path);
101}
103{
104 return jsFileInfoPath(path).field(Fields::currentItem);
105}
107{
108 return Path::Root(PathRoot::Top).field(Fields::qmlDirectoryWithPath).key(path);
109}
111{
112 return qmlDirectoryInfoPath(path).field(Fields::currentItem);
113}
115{
116 return Path::Root(PathRoot::Top).field(Fields::globalScopeWithName).key(name);
117}
119{
120 return globalScopeInfoPath(name).field(Fields::currentItem);
121}
123{
124 return Path::Current(PathCurrent::Lookup).field(Fields::cppType).key(name);
125}
127{
128 return Path::Current(PathCurrent::Lookup).field(Fields::propertyDef).key(name);
129}
131{
132 return Path::Current(PathCurrent::Lookup).field(Fields::symbol).key(name);
133}
135{
136 return Path::Current(PathCurrent::Lookup).field(Fields::type).key(name);
137}
138inline Path loadInfoPath(const Path &el)
139{
140 return Path::Root(PathRoot::Env).field(Fields::loadInfo).key(el.toString());
141}
142} // end namespace Paths
143
145{
146public:
147 CommentableDomElement(const Path &pathFromOwner = Path()) : DomElement(pathFromOwner) { }
148 CommentableDomElement(const CommentableDomElement &o) : DomElement(o), m_comments(o.m_comments)
149 {
150 }
152 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override;
153 RegionComments &comments() { return m_comments; }
154 const RegionComments &comments() const { return m_comments; }
155
156private:
157 RegionComments m_comments;
158};
159
161{
162public:
163 constexpr static DomType kindValue = DomType::Version;
164 constexpr static qint32 Undefined = -1;
165 constexpr static qint32 Latest = -2;
166
167 Version(qint32 majorVersion = Undefined, qint32 minorVersion = Undefined);
169
170 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const;
171
172 bool isLatest() const;
173 bool isValid() const;
174 QString stringValue() const;
176 {
177 if (majorVersion >= 0 || majorVersion == Undefined)
178 return QString::number(majorVersion);
179 return QString();
180 }
182 {
183 if (majorVersion == Version::Latest)
184 return QLatin1String("Latest");
185 if (majorVersion >= 0 || majorVersion == Undefined)
186 return QString::number(majorVersion);
187 return QString();
188 }
190 {
191 if (minorVersion >= 0 || minorVersion == Undefined)
192 return QString::number(minorVersion);
193 return QString();
194 }
195 int compare(const Version &o) const
196 {
197 int c = majorVersion - o.majorVersion;
198 if (c != 0)
199 return c;
200 return minorVersion - o.minorVersion;
201 }
202
205};
206inline bool operator==(const Version &v1, const Version &v2)
207{
208 return v1.compare(v2) == 0;
209}
210inline bool operator!=(const Version &v1, const Version &v2)
211{
212 return v1.compare(v2) != 0;
213}
214inline bool operator<(const Version &v1, const Version &v2)
215{
216 return v1.compare(v2) < 0;
217}
218inline bool operator<=(const Version &v1, const Version &v2)
219{
220 return v1.compare(v2) <= 0;
221}
222inline bool operator>(const Version &v1, const Version &v2)
223{
224 return v1.compare(v2) > 0;
225}
226inline bool operator>=(const Version &v1, const Version &v2)
227{
228 return v1.compare(v2) >= 0;
229}
230
232{
233public:
234 enum class Kind { Invalid, ModuleUri, DirectoryUrl, RelativePath, AbsolutePath };
235 QmlUri() = default;
236 static QmlUri fromString(const QString &importStr);
237 static QmlUri fromUriString(const QString &importStr);
238 static QmlUri fromDirectoryString(const QString &importStr);
239 bool isValid() const;
240 bool isDirectory() const;
241 bool isModule() const;
244 QString absoluteLocalPath(const QString &basePath = QString()) const;
248 Kind kind() const;
249
250 friend bool operator==(const QmlUri &i1, const QmlUri &i2)
251 {
252 return i1.m_kind == i2.m_kind && i1.m_value == i2.m_value;
253 }
254 friend bool operator!=(const QmlUri &i1, const QmlUri &i2) { return !(i1 == i2); }
255
256private:
257 QmlUri(const QUrl &url) : m_kind(Kind::DirectoryUrl), m_value(url) { }
258 QmlUri(Kind kind, const QString &value) : m_kind(kind), m_value(value) { }
259 Kind m_kind = Kind::Invalid;
260 std::variant<QString, QUrl> m_value;
261};
262
264{
266public:
267 constexpr static DomType kindValue = DomType::Import;
268
270 const QString &importStr, Version v = Version(), const QString &importId = QString(),
271 const ErrorHandler &handler = nullptr);
273 const QString &importStr, const QString &importId = QString(),
274 const ErrorHandler &handler = nullptr);
275
276 Import(const QmlUri &uri = QmlUri(), Version version = Version(),
277 const QString &importId = QString())
278 : uri(uri), version(version), importId(importId)
279 {
280 }
281
284 {
285 if (uri.isDirectory()) {
286 QString path = uri.absoluteLocalPath();
287 if (!path.isEmpty()) {
288 return Paths::qmlDirPath(path);
289 } else {
290 Q_ASSERT_X(false, "Import", "url imports not supported");
291 return Paths::qmldirFilePath(uri.directoryString());
292 }
293 } else {
294 return Paths::moduleScopePath(uri.moduleUri(), version);
295 }
296 }
297 Import baseImport() const { return Import { uri, version }; }
298
299 friend bool operator==(const Import &i1, const Import &i2)
300 {
301 return i1.uri == i2.uri && i1.version == i2.version && i1.importId == i2.importId
302 && i1.comments == i2.comments && i1.implicit == i2.implicit;
303 }
304 friend bool operator!=(const Import &i1, const Import &i2) { return !(i1 == i2); }
305
306 void writeOut(const DomItem &self, OutWriter &ow) const;
307
308 static QRegularExpression importRe();
309
314 bool implicit = false;
315};
316
318{
319public:
320 constexpr static DomType kindValue = DomType::ModuleAutoExport;
321
322 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
323 {
324 bool cont = true;
325 cont = cont && self.dvWrapField(visitor, Fields::import, import);
326 cont = cont && self.dvValueField(visitor, Fields::inheritVersion, inheritVersion);
327 return cont;
328 }
329
330 friend bool operator==(const ModuleAutoExport &i1, const ModuleAutoExport &i2)
331 {
332 return i1.import == i2.import && i1.inheritVersion == i2.inheritVersion;
333 }
334 friend bool operator!=(const ModuleAutoExport &i1, const ModuleAutoExport &i2)
335 {
336 return !(i1 == i2);
337 }
338
339 Import import;
340 bool inheritVersion = false;
341};
342
344{
345public:
346 constexpr static DomType kindValue = DomType::Pragma;
347
348 Pragma(const QString &pragmaName = QString(), const QStringList &pragmaValues = {})
349 : name(pragmaName), values{ pragmaValues }
350 {
351 }
352
353 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
354 {
355 bool cont = self.dvValueField(visitor, Fields::name, name);
356 cont = cont && self.dvValueField(visitor, Fields::values, values);
357 cont = cont && self.dvWrapField(visitor, Fields::comments, comments);
358 return cont;
359 }
360
361 void writeOut(const DomItem &self, OutWriter &ow) const;
362
366};
367
369{
370public:
371 constexpr static DomType kindValue = DomType::Id;
372
373 Id(const QString &idName = QString(), const Path &referredObject = Path());
374
376 void updatePathFromOwner(const Path &pathFromOwner);
377 Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &ann, QmlObject **aPtr = nullptr);
378
382 QList<QmlObject> annotations;
383 std::shared_ptr<ScriptExpression> value;
384};
385
386// TODO: rename? it may contain statements and stuff, not only expressions
387// TODO QTBUG-121933
389{
392public:
393 enum class ExpressionType {
394 BindingExpression,
395 FunctionBody,
396 ArgInitializer,
397 ArgumentStructure,
398 ReturnType,
399 JSCode, // Used for storing the content of the whole .js file as "one" Expression
400 ESMCode, // Used for storing the content of the whole ECMAScript module (.mjs) as "one"
401 // Expression
402 };
404 constexpr static DomType kindValue = DomType::ScriptExpression;
405 DomType kind() const override { return kindValue; }
406
408 QStringView code, const std::shared_ptr<QQmlJS::Engine> &engine, AST::Node *ast,
409 const std::shared_ptr<AstComments> &comments, ExpressionType expressionType,
410 SourceLocation localOffset = SourceLocation(), int derivedFrom = 0,
411 QStringView preCode = QStringView(), QStringView postCode = QStringView());
412
414 : ScriptExpression(QStringView(), std::shared_ptr<QQmlJS::Engine>(), nullptr,
415 std::shared_ptr<AstComments>(), ExpressionType::BindingExpression,
416 SourceLocation(), 0)
417 {
418 }
419
421 const QString &code, ExpressionType expressionType, int derivedFrom = 0,
422 const QString &preCode = QString(), const QString &postCode = QString())
423 : OwningItem(derivedFrom), m_expressionType(expressionType)
424 {
425 setCode(code, preCode, postCode);
426 }
427
429
430 std::shared_ptr<ScriptExpression> makeCopy(const DomItem &self) const
431 {
432 return std::static_pointer_cast<ScriptExpression>(doCopy(self));
433 }
434
435 std::shared_ptr<ScriptExpression> copyWithUpdatedCode(const DomItem &self, const QString &code) const;
436
437 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
438
439 Path canonicalPath(const DomItem &self) const override { return self.m_ownerPath; }
440 // parsed and created if not available
441 AST::Node *ast() const { return m_ast; }
442 // dump of the ast (without locations)
443 void astDumper(const Sink &s, AstDumperOptions options) const;
445
446 // definedSymbols name, value, from
447 // usedSymbols name, locations
449 {
450 QMutexLocker l(mutex());
451 return m_code;
452 }
453
455 {
456 QMutexLocker l(mutex());
457 return m_expressionType;
458 }
459
460 bool isNull() const
461 {
462 QMutexLocker l(mutex());
463 return m_code.isNull();
464 }
465 std::shared_ptr<QQmlJS::Engine> engine() const
466 {
467 QMutexLocker l(mutex());
468 return m_engine;
469 }
470 std::shared_ptr<AstComments> astComments() const { return m_astComments; }
471 void writeOut(const DomItem &self, OutWriter &lw) const override;
473 SourceLocation localOffset() const { return m_localOffset; }
474 QStringView preCode() const { return m_preCode; }
475 QStringView postCode() const { return m_postCode; }
477 ScriptElementVariant scriptElement() { return m_element; }
478
479protected:
480 std::shared_ptr<OwningItem> doCopy(const DomItem &) const override
481 {
482 return std::make_shared<ScriptExpression>(*this);
483 }
484
485 std::function<SourceLocation(SourceLocation)> locationToGlobalF(const DomItem &self) const
486 {
487 SourceLocation loc = globalLocation(self);
488 return [loc, this](SourceLocation x) {
489 return SourceLocation(x.offset - m_localOffset.offset + loc.offset, x.length,
490 x.startLine - m_localOffset.startLine + loc.startLine,
491 ((x.startLine == m_localOffset.startLine) ? x.startColumn
492 - m_localOffset.startColumn + loc.startColumn
493 : x.startColumn));
494 };
495 }
496
498 {
499 return SourceLocation(
500 x.offset - m_localOffset.offset, x.length, x.startLine - m_localOffset.startLine,
501 ((x.startLine == m_localOffset.startLine)
502 ? x.startColumn - m_localOffset.startColumn
503 : x.startColumn)); // are line and column 1 based? then we should + 1
504 }
505
507 {
508 return [this](SourceLocation x) { return locationToLocal(x); };
509 }
510
511private:
512 enum class ParseMode {
513 QML,
514 JS,
515 ESM, // ECMAScript module
516 };
517
518 inline ParseMode resolveParseMode()
519 {
520 switch (m_expressionType) {
521 case ExpressionType::BindingExpression:
522 // unfortunately there are no documentation explaining this resolution
523 // this was just moved from the original implementation
524 return ParseMode::QML;
525 case ExpressionType::ESMCode:
526 return ParseMode::ESM;
527 default:
528 return ParseMode::JS;
529 }
530 }
531 void setCode(const QString &code, const QString &preCode, const QString &postCode);
532 [[nodiscard]] AST::Node *parse(ParseMode mode);
533
534 ExpressionType m_expressionType;
535 QString m_codeStr;
536 QStringView m_code;
537 QStringView m_preCode;
538 QStringView m_postCode;
539 mutable std::shared_ptr<QQmlJS::Engine> m_engine;
540 mutable AST::Node *m_ast;
541 std::shared_ptr<AstComments> m_astComments;
542 SourceLocation m_localOffset;
543 ScriptElementVariant m_element;
544};
545
546class BindingValue;
547
549{
550public:
551 constexpr static DomType kindValue = DomType::Binding;
552
553 Binding(const QString &m_name = QString(),
554 std::unique_ptr<BindingValue> value = std::unique_ptr<BindingValue>(),
555 BindingType bindingType = BindingType::Normal);
556 Binding(const QString &m_name, const std::shared_ptr<ScriptExpression> &value,
557 BindingType bindingType = BindingType::Normal);
558 Binding(const QString &m_name, const QString &scriptCode,
559 BindingType bindingType = BindingType::Normal);
560 Binding(const QString &m_name, const QmlObject &value,
561 BindingType bindingType = BindingType::Normal);
562 Binding(const QString &m_name, const QList<QmlObject> &value,
563 BindingType bindingType = BindingType::Normal);
565 Binding(Binding &&o) = default;
568 Binding &operator=(Binding &&) = default;
569
571 DomItem valueItem(const DomItem &self) const; // ### REVISIT: consider replacing return value with variant
573 QString name() const { return m_name; }
574 BindingType bindingType() const { return m_bindingType; }
575 QmlObject const *objectValue() const;
576 QList<QmlObject> const *arrayValue() const;
577 std::shared_ptr<ScriptExpression> scriptExpressionValue() const;
579 QList<QmlObject> *arrayValue();
580 std::shared_ptr<ScriptExpression> scriptExpressionValue();
581 QList<QmlObject> annotations() const { return m_annotations; }
582 void setAnnotations(const QList<QmlObject> &annotations) { m_annotations = annotations; }
583 void setValue(std::unique_ptr<BindingValue> &&value) { m_value = std::move(value); }
584 Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &a, QmlObject **aPtr = nullptr);
585 const RegionComments &comments() const { return m_comments; }
586 RegionComments &comments() { return m_comments; }
587 void updatePathFromOwner(const Path &newPath);
588 void writeOut(const DomItem &self, OutWriter &lw) const;
589 void writeOutValue(const DomItem &self, OutWriter &lw) const;
590 bool isSignalHandler() const
591 {
592 QString baseName = m_name.split(QLatin1Char('.')).last();
593 return QQmlSignalNames::isHandlerName(baseName);
594 }
596 {
597 return QStringLiteral(u"QtObject{\n %1: ").arg(n.split(u'.').last());
598 }
599 static QString postCodeForName(QStringView) { return QStringLiteral(u"\n}\n"); }
600 QString preCode() const { return preCodeForName(m_name); }
601 QString postCode() const { return postCodeForName(m_name); }
602
603 ScriptElementVariant bindingIdentifiers() const { return m_bindingIdentifiers; }
604 void setBindingIdentifiers(const ScriptElementVariant &bindingIdentifiers) { m_bindingIdentifiers = bindingIdentifiers; }
605
606private:
607 friend class QQmlDomAstCreator;
608 BindingType m_bindingType;
609 QString m_name;
610 std::unique_ptr<BindingValue> m_value;
611 QList<QmlObject> m_annotations;
612 RegionComments m_comments;
613 ScriptElementVariant m_bindingIdentifiers;
614};
615
617{
618public:
620
621 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const;
622
623 Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &annotation,
624 QmlObject **aPtr = nullptr);
625 void updatePathFromOwner(const Path &newPath);
626
627 QQmlJSScope::ConstPtr semanticScope() const { return m_semanticScope; }
628 void setSemanticScope(const QQmlJSScope::ConstPtr &scope) { m_semanticScope = scope; }
629
633 bool isReadonly = false;
634 bool isList = false;
635 QList<QmlObject> annotations;
638};
639
641{
642 enum class Status { Invalid, ResolvedProperty, ResolvedObject, Loop, TooDeep };
643 bool valid()
644 {
645 switch (status) {
646 case Status::ResolvedProperty:
647 case Status::ResolvedObject:
648 return true;
649 default:
650 return false;
651 }
652 }
657 Status status = Status::Invalid;
658 int nAliases = 0;
659};
660
662{
663public:
664 constexpr static DomType kindValue = DomType::PropertyDefinition;
665
666 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
667 {
668 bool cont = AttributeInfo::iterateDirectSubpaths(self, visitor);
669 cont = cont && self.dvValueField(visitor, Fields::isPointer, isPointer);
670 cont = cont && self.dvValueField(visitor, Fields::isFinal, isFinal);
671 cont = cont && self.dvValueField(visitor, Fields::isAlias, isAlias());
672 cont = cont && self.dvValueField(visitor, Fields::isDefaultMember, isDefaultMember);
673 cont = cont && self.dvValueField(visitor, Fields::isRequired, isRequired);
674 cont = cont && self.dvValueField(visitor, Fields::read, read);
675 cont = cont && self.dvValueField(visitor, Fields::write, write);
676 cont = cont && self.dvValueField(visitor, Fields::bindable, bindable);
677 cont = cont && self.dvValueField(visitor, Fields::notify, notify);
678 cont = cont && self.dvReferenceField(visitor, Fields::type, typePath());
679 if (m_nameIdentifiers) {
680 cont = cont && self.dvItemField(visitor, Fields::nameIdentifiers, [this, &self]() {
681 return self.subScriptElementWrapperItem(m_nameIdentifiers);
682 });
683 }
684 return cont;
685 }
686
687 Path typePath() const { return Paths::lookupTypePath(typeName); }
688
689 bool isAlias() const { return typeName == u"alias"; }
690 bool isParametricType() const;
691 void writeOut(const DomItem &self, OutWriter &lw) const;
692 ScriptElementVariant nameIdentifiers() const { return m_nameIdentifiers; }
693 void setNameIdentifiers(const ScriptElementVariant &name) { m_nameIdentifiers = name; }
694
699 bool isFinal = false;
700 bool isPointer = false;
701 bool isDefaultMember = false;
702 bool isRequired = false;
704};
705
707{
708public:
709 constexpr static DomType kindValue = DomType::PropertyInfo; // used to get the correct kind in ObjectWrapper
710
711 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const;
712
713 QList<DomItem> propertyDefs;
714 QList<DomItem> bindings;
715};
716
718{
719public:
720 constexpr static DomType kindValue = DomType::MethodParameter;
721
722 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const;
723
724 void writeOut(const DomItem &self, OutWriter &ow) const;
725 void writeOutSignal(const DomItem &self, OutWriter &ow) const;
726
729 bool isPointer = false;
730 bool isReadonly = false;
731 bool isList = false;
732 bool isRestElement = false;
733 std::shared_ptr<ScriptExpression> defaultValue;
739 std::shared_ptr<ScriptExpression> value;
740 QList<QmlObject> annotations;
742};
743
745{
747public:
748 enum MethodType { Signal, Method };
749 Q_ENUM(MethodType)
750
751 constexpr static DomType kindValue = DomType::MethodInfo;
752
753 Path typePath(const DomItem &) const
754 {
755 return (typeName.isEmpty() ? Path() : Paths::lookupTypePath(typeName));
756 }
757
758 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const;
759 QString preCode(const DomItem &) const; // ### REVISIT, might be simplified by using different toplevel production rules at usage site
760 QString postCode(const DomItem &) const;
761 void writePre(const DomItem &self, OutWriter &ow) const;
762 void writeOut(const DomItem &self, OutWriter &ow) const;
763 void setCode(const QString &code)
764 {
765 body = std::make_shared<ScriptExpression>(
766 code, ScriptExpression::ExpressionType::FunctionBody, 0,
767 QLatin1String("function foo(){\n"), QLatin1String("\n}\n"));
768 }
769 MethodInfo() = default;
770
771 // TODO: make private + add getters/setters
772 QList<MethodParameter> parameters;
773 MethodType methodType = Method;
774 std::shared_ptr<ScriptExpression> body;
775 std::shared_ptr<ScriptExpression> returnType;
776 bool isConstructor = false;
777};
778
780{
781public:
782 constexpr static DomType kindValue = DomType::EnumItem;
783
784 EnumItem(const QString &name = QString(), int value = 0) : m_name(name), m_value(value) { }
785
786 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const;
787
788 QString name() const { return m_name; }
789 double value() const { return m_value; }
790 RegionComments &comments() { return m_comments; }
791 const RegionComments &comments() const { return m_comments; }
792 void writeOut(const DomItem &self, OutWriter &lw) const;
793
794private:
795 QString m_name;
796 double m_value;
797 RegionComments m_comments;
798};
799
801{
802public:
803 constexpr static DomType kindValue = DomType::EnumDecl;
804 DomType kind() const override { return kindValue; }
805
806 EnumDecl(const QString &name = QString(), QList<EnumItem> values = QList<EnumItem>(),
807 Path pathFromOwner = Path())
808 : CommentableDomElement(pathFromOwner), m_name(name), m_values(values)
809 {
810 }
811
812 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override;
813
814 QString name() const { return m_name; }
815 void setName(const QString &name) { m_name = name; }
816 const QList<EnumItem> &values() const & { return m_values; }
817 bool isFlag() const { return m_isFlag; }
818 void setIsFlag(bool flag) { m_isFlag = flag; }
819 QString alias() const { return m_alias; }
820 void setAlias(const QString &aliasName) { m_alias = aliasName; }
821 void setValues(QList<EnumItem> values) { m_values = values; }
823 {
824 m_values.append(value);
825 return Path::Field(Fields::values).index(index_type(m_values.size() - 1));
826 }
827 void updatePathFromOwner(const Path &newP) override;
828
829 const QList<QmlObject> &annotations() const & { return m_annotations; }
830 void setAnnotations(const QList<QmlObject> &annotations);
831 Path addAnnotation(const QmlObject &child, QmlObject **cPtr = nullptr);
832 void writeOut(const DomItem &self, OutWriter &lw) const override;
833
834private:
835 QString m_name;
836 bool m_isFlag = false;
837 QString m_alias;
838 QList<EnumItem> m_values;
839 QList<QmlObject> m_annotations;
840};
841
843{
845public:
846 constexpr static DomType kindValue = DomType::QmlObject;
847 DomType kind() const override { return kindValue; }
848
849 QmlObject(const Path &pathFromOwner = Path());
850 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override;
852 QList<QString> fields() const;
853 QList<QString> fields(const DomItem &) const override { return fields(); }
854 DomItem field(const DomItem &self, QStringView name) const override;
855 void updatePathFromOwner(const Path &newPath) override;
858 virtual bool iterateSubOwners(const DomItem &self, function_ref<bool(const DomItem &owner)> visitor) const;
859
860 QString idStr() const { return m_idStr; }
861 QString name() const { return m_name; }
862 const QList<Path> &prototypePaths() const & { return m_prototypePaths; }
863 Path nextScopePath() const { return m_nextScopePath; }
864 const QMultiMap<QString, PropertyDefinition> &propertyDefs() const & { return m_propertyDefs; }
865 const QMultiMap<QString, Binding> &bindings() const & { return m_bindings; }
866 const QMultiMap<QString, MethodInfo> &methods() const & { return m_methods; }
867 QList<QmlObject> children() const { return m_children; }
868 QList<QmlObject> annotations() const { return m_annotations; }
869
870 void setIdStr(const QString &id) { m_idStr = id; }
871 void setName(const QString &name) { m_name = name; }
872 void setDefaultPropertyName(const QString &name) { m_defaultPropertyName = name; }
873 void setPrototypePaths(QList<Path> prototypePaths) { m_prototypePaths = prototypePaths; }
874 Path addPrototypePath(const Path &prototypePath)
875 {
876 index_type idx = index_type(m_prototypePaths.indexOf(prototypePath));
877 if (idx == -1) {
878 idx = index_type(m_prototypePaths.size());
879 m_prototypePaths.append(prototypePath);
880 }
881 return Path::Field(Fields::prototypes).index(idx);
882 }
883 void setNextScopePath(const Path &nextScopePath) { m_nextScopePath = nextScopePath; }
884 void setPropertyDefs(QMultiMap<QString, PropertyDefinition> propertyDefs)
885 {
886 m_propertyDefs = propertyDefs;
887 }
888 void setBindings(QMultiMap<QString, Binding> bindings) { m_bindings = bindings; }
889 void setMethods(QMultiMap<QString, MethodInfo> functionDefs) { m_methods = functionDefs; }
890 void setChildren(const QList<QmlObject> &children)
891 {
892 m_children = children;
893 if (pathFromOwner())
894 updatePathFromOwner(pathFromOwner());
895 }
896 void setAnnotations(const QList<QmlObject> &annotations)
897 {
898 m_annotations = annotations;
899 if (pathFromOwner())
900 updatePathFromOwner(pathFromOwner());
901 }
903 PropertyDefinition **pDef = nullptr)
904 {
905 return insertUpdatableElementInMultiMap(pathFromOwner().field(Fields::propertyDefs),
906 m_propertyDefs, propertyDef.name, propertyDef,
907 option, pDef);
908 }
911
912 Path addBinding(Binding binding, AddOption option, Binding **bPtr = nullptr)
913 {
914 return insertUpdatableElementInMultiMap(pathFromOwner().field(Fields::bindings), m_bindings,
915 binding.name(), binding, option, bPtr);
916 }
918 Path addMethod(const MethodInfo &functionDef, AddOption option, MethodInfo **mPtr = nullptr)
919 {
920 return insertUpdatableElementInMultiMap(pathFromOwner().field(Fields::methods), m_methods,
921 functionDef.name, functionDef, option, mPtr);
922 }
925 {
926 return appendUpdatableElementInQList(pathFromOwner().field(Fields::children), m_children,
927 child, cPtr);
928 }
930 {
931 Path p = addChild(child);
932 return MutableDomItem(self.owner().item(), p);
933 }
934 Path addAnnotation(const QmlObject &annotation, QmlObject **aPtr = nullptr)
935 {
936 return appendUpdatableElementInQList(pathFromOwner().field(Fields::annotations),
937 m_annotations, annotation, aPtr);
938 }
939 void writeOut(const DomItem &self, OutWriter &ow, const QString &onTarget) const;
940 void writeOut(const DomItem &self, OutWriter &lw) const override { writeOut(self, lw, QString()); }
941
943 std::shared_ptr<ScriptExpression> accessSequence) const;
944 LocallyResolvedAlias resolveAlias(const DomItem &self, const QStringList &accessSequence) const;
945
946 QQmlJSScope::ConstPtr semanticScope() const { return m_scope; }
947 void setSemanticScope(const QQmlJSScope::ConstPtr &scope) { m_scope = scope; }
948
949 ScriptElementVariant nameIdentifiers() const { return m_nameIdentifiers; }
950 void setNameIdentifiers(const ScriptElementVariant &name) { m_nameIdentifiers = name; }
951
952private:
953 friend class QQmlDomAstCreator;
954 QString m_idStr;
955 QString m_name;
956 QList<Path> m_prototypePaths;
957 Path m_nextScopePath;
958 QString m_defaultPropertyName;
959 QMultiMap<QString, PropertyDefinition> m_propertyDefs;
960 QMultiMap<QString, Binding> m_bindings;
961 QMultiMap<QString, MethodInfo> m_methods;
962 QList<QmlObject> m_children;
963 QList<QmlObject> m_annotations;
964 QQmlJSScope::ConstPtr m_scope;
965 ScriptElementVariant m_nameIdentifiers;
966};
967
969{
971public:
974 const Path &source, QStringView exp, const Path &typePath, const ErrorHandler &h);
975 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
976 {
977 bool cont = true;
978 cont = cont && self.dvValueField(visitor, Fields::uri, uri);
979 cont = cont && self.dvValueField(visitor, Fields::typeName, typeName);
980 cont = cont && self.dvWrapField(visitor, Fields::version, version);
981 if (typePath)
982 cont = cont && self.dvReferenceField(visitor, Fields::type, typePath);
983 cont = cont && self.dvValueField(visitor, Fields::isInternal, isInternal);
984 cont = cont && self.dvValueField(visitor, Fields::isSingleton, isSingleton);
986 cont = cont && self.dvReferenceField(visitor, Fields::exportSource, exportSourcePath);
987 return cont;
988 }
989
995 bool isInternal = false;
996 bool isSingleton = false;
997};
998
1000{
1001public:
1002 Component(const QString &name);
1003 Component(const Path &pathFromOwner = Path());
1004 Component(const Component &o) = default;
1005 Component &operator=(const Component &) = default;
1006
1007 bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override;
1008 void updatePathFromOwner(const Path &newPath) override;
1009 DomItem field(const DomItem &self, QStringView name) const override;
1010
1011 QString name() const { return m_name; }
1012 const QMultiMap<QString, EnumDecl> &enumerations() const & { return m_enumerations; }
1013 const QList<QmlObject> &objects() const & { return m_objects; }
1014 bool isSingleton() const { return m_isSingleton; }
1015 bool isCreatable() const { return m_isCreatable; }
1016 bool isComposite() const { return m_isComposite; }
1017 QString attachedTypeName() const { return m_attachedTypeName; }
1018 Path attachedTypePath(const DomItem &) const { return m_attachedTypePath; }
1019
1020 void setName(const QString &name) { m_name = name; }
1021 void setEnumerations(QMultiMap<QString, EnumDecl> enumerations)
1022 {
1023 m_enumerations = enumerations;
1024 }
1025 Path addEnumeration(const EnumDecl &enumeration, AddOption option = AddOption::Overwrite,
1026 EnumDecl **ePtr = nullptr)
1027 {
1028 return insertUpdatableElementInMultiMap(pathFromOwner().field(Fields::enumerations),
1029 m_enumerations, enumeration.name(), enumeration,
1030 option, ePtr);
1031 }
1032 void setObjects(const QList<QmlObject> &objects) { m_objects = objects; }
1033 Path addObject(const QmlObject &object, QmlObject **oPtr = nullptr);
1034 void setIsSingleton(bool isSingleton) { m_isSingleton = isSingleton; }
1035 void setIsCreatable(bool isCreatable) { m_isCreatable = isCreatable; }
1036 void setIsComposite(bool isComposite) { m_isComposite = isComposite; }
1037 void setAttachedTypeName(const QString &name) { m_attachedTypeName = name; }
1038 void setAttachedTypePath(const Path &p) { m_attachedTypePath = p; }
1039
1040private:
1041 friend class QQmlDomAstCreator;
1042 QString m_name;
1043 QMultiMap<QString, EnumDecl> m_enumerations;
1044 QList<QmlObject> m_objects;
1045 bool m_isSingleton = false;
1046 bool m_isCreatable = true;
1047 bool m_isComposite = true;
1048 QString m_attachedTypeName;
1049 Path m_attachedTypePath;
1050};
1051
1053{
1054public:
1055 constexpr static DomType kindValue = DomType::JsResource;
1056 DomType kind() const override { return kindValue; }
1057
1058 JsResource(const Path &pathFromOwner = Path()) : Component(pathFromOwner) { }
1059 bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
1060 { // to do: complete
1061 return true;
1062 }
1063 // globalSymbols defined/exported, required/used
1064};
1065
1067{
1068public:
1069 constexpr static DomType kindValue = DomType::QmltypesComponent;
1070 DomType kind() const override { return kindValue; }
1071
1072 QmltypesComponent(const Path &pathFromOwner = Path()) : Component(pathFromOwner) { }
1073 bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override;
1074 const QList<Export> &exports() const & { return m_exports; }
1075 QString fileName() const { return m_fileName; }
1076 void setExports(QList<Export> exports) { m_exports = exports; }
1077 void addExport(const Export &exportedEntry) { m_exports.append(exportedEntry); }
1078 void setFileName(const QString &fileName) { m_fileName = fileName; }
1079 const QList<int> &metaRevisions() const & { return m_metaRevisions; }
1080 void setMetaRevisions(QList<int> metaRevisions) { m_metaRevisions = metaRevisions; }
1081 void setInterfaceNames(const QStringList& interfaces) { m_interfaceNames = interfaces; }
1082 const QStringList &interfaceNames() const & { return m_interfaceNames; }
1083 QString extensionTypeName() const { return m_extensionTypeName; }
1084 void setExtensionTypeName(const QString &name) { m_extensionTypeName = name; }
1085 QString valueTypeName() const { return m_valueTypeName; }
1086 void setValueTypeName(const QString &name) { m_valueTypeName = name; }
1087 bool hasCustomParser() const { return m_hasCustomParser; }
1088 void setHasCustomParser(bool v) { m_hasCustomParser = v; }
1089 bool extensionIsJavaScript() const { return m_extensionIsJavaScript; }
1090 void setExtensionIsJavaScript(bool v) { m_extensionIsJavaScript = v; }
1091 bool extensionIsNamespace() const { return m_extensionIsNamespace; }
1092 void setExtensionIsNamespace(bool v) { m_extensionIsNamespace = v; }
1093 QQmlJSScope::AccessSemantics accessSemantics() const { return m_accessSemantics; }
1095
1096 void setSemanticScope(const QQmlJSScope::ConstPtr &scope) { m_semanticScope = scope; }
1097 QQmlJSScope::ConstPtr semanticScope() const { return m_semanticScope; }
1098
1099private:
1100 QList<Export> m_exports;
1101 QList<int> m_metaRevisions;
1102 QString m_fileName; // remove?
1103 QStringList m_interfaceNames;
1104 bool m_hasCustomParser = false;
1105 bool m_extensionIsJavaScript = false;
1106 bool m_extensionIsNamespace = false;
1107 QString m_valueTypeName;
1108 QString m_extensionTypeName;
1109 QQmlJSScope::AccessSemantics m_accessSemantics = QQmlJSScope::AccessSemantics::None;
1110 QQmlJSScope::ConstPtr m_semanticScope;
1111};
1112
1114{
1115public:
1116 constexpr static DomType kindValue = DomType::QmlComponent;
1117 DomType kind() const override { return kindValue; }
1118
1120 {
1121 setIsComposite(true);
1122 setIsCreatable(true);
1123 }
1124
1125 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override;
1126
1127 const QMultiMap<QString, Id> &ids() const & { return m_ids; }
1128 Path nextComponentPath() const { return m_nextComponentPath; }
1129 void setIds(QMultiMap<QString, Id> ids) { m_ids = ids; }
1130 void setNextComponentPath(const Path &p) { m_nextComponentPath = p; }
1131 void updatePathFromOwner(const Path &newPath) override;
1132 Path addId(const Id &id, AddOption option = AddOption::Overwrite, Id **idPtr = nullptr)
1133 {
1134 // warning does nor remove old idStr when overwriting...
1135 return insertUpdatableElementInMultiMap(pathFromOwner().field(Fields::ids), m_ids, id.name,
1136 id, option, idPtr);
1137 }
1138 void writeOut(const DomItem &self, OutWriter &) const override;
1139 QList<QString> subComponentsNames(const DomItem &self) const;
1140 QList<DomItem> subComponents(const DomItem &self) const;
1141
1142 void setSemanticScope(const QQmlJSScope::ConstPtr &scope) { m_semanticScope = scope; }
1143 QQmlJSScope::ConstPtr semanticScope() const { return m_semanticScope; }
1144 ScriptElementVariant nameIdentifiers() const { return m_nameIdentifiers; }
1145 void setNameIdentifiers(const ScriptElementVariant &name) { m_nameIdentifiers = name; }
1146
1147private:
1148 friend class QQmlDomAstCreator;
1149 Path m_nextComponentPath;
1150 QMultiMap<QString, Id> m_ids;
1151 QQmlJSScope::ConstPtr m_semanticScope;
1152 // m_nameIdentifiers contains the name of the component as FieldMemberExpression, and therefore
1153 // only exists in inline components!
1154 ScriptElementVariant m_nameIdentifiers;
1155};
1156
1158{
1159public:
1160 constexpr static DomType kindValue = DomType::GlobalComponent;
1161 DomType kind() const override { return kindValue; }
1162
1163 GlobalComponent(const Path &pathFromOwner = Path()) : Component(pathFromOwner) { }
1164};
1165
1167
1169{
1171public:
1172 constexpr static DomType kindValue = DomType::ImportScope;
1173
1174 ImportScope() = default;
1175 ~ImportScope() = default;
1176
1177 const QList<Path> &importSourcePaths() const & { return m_importSourcePaths; }
1178
1179 const QMap<QString, ImportScope> &subImports() const & { return m_subImports; }
1180
1181 QList<Path> allSources(const DomItem &self) const;
1182
1183 QSet<QString> importedNames(const DomItem &self) const
1184 {
1185 QSet<QString> res;
1186 const auto sources = allSources(self);
1187 for (const Path &p : sources) {
1188 QSet<QString> ks = self.path(p.field(Fields::exports), self.errorHandler()).keys();
1189 res += ks;
1190 }
1191 return res;
1192 }
1193
1194 QList<DomItem> importedItemsWithName(const DomItem &self, const QString &name) const
1195 {
1196 QList<DomItem> res;
1197 const auto sources = allSources(self);
1198 for (const Path &p : sources) {
1199 DomItem source = self.path(p.field(Fields::exports), self.errorHandler());
1200 DomItem els = source.key(name);
1201 int nEls = els.indexes();
1202 for (int i = 0; i < nEls; ++i)
1203 res.append(els.index(i));
1204 if (nEls == 0 && els) {
1205 self.addError(importErrors.warning(
1206 tr("Looking up '%1' expected a list of exports, not %2")
1207 .arg(name, els.toString())));
1208 }
1209 }
1210 return res;
1211 }
1212
1213 QList<Export> importedExportsWithName(const DomItem &self, const QString &name) const
1214 {
1215 QList<Export> res;
1216 for (const DomItem &i : importedItemsWithName(self, name))
1217 if (const Export *e = i.as<Export>())
1218 res.append(*e);
1219 else
1220 self.addError(importErrors.warning(
1221 tr("Expected Export looking up '%1', not %2").arg(name, i.toString())));
1222 return res;
1223 }
1224
1225 bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const;
1226
1227 void addImport(QStringList p, const Path &targetExports)
1228 {
1229 if (!p.isEmpty()) {
1230 const QString current = p.takeFirst();
1231 m_subImports[current].addImport(std::move(p), targetExports);
1232 } else if (!m_importSourcePaths.contains(targetExports)) {
1233 m_importSourcePaths.append(targetExports);
1234 }
1235 }
1236
1237private:
1238 QList<Path> m_importSourcePaths;
1239 QMap<QString, ImportScope> m_subImports;
1240};
1241
1243{
1244public:
1247 BindingValue(const std::shared_ptr<ScriptExpression> &o);
1248 BindingValue(const QList<QmlObject> &l);
1252
1253 DomItem value(const DomItem &binding) const;
1254 void updatePathFromOwner(const Path &newPath);
1255
1256private:
1257 friend class Binding;
1258 void clearValue();
1259
1260 BindingValueKind kind;
1261 union {
1264 std::shared_ptr<ScriptExpression> scriptExpression;
1265 QList<QmlObject> array;
1266 };
1267};
1268
1269} // end namespace Dom
1270} // end namespace QQmlJS
1272#endif // QQMLDOMELEMENTS_P_H
\inmodule QtCore
Definition qmutex.h:313
Associates comments with AST::Node *.
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
Binding(const QString &m_name, const QList< QmlObject > &value, BindingType bindingType=BindingType::Normal)
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=QString(), std::unique_ptr< BindingValue > value=std::unique_ptr< BindingValue >(), BindingType bindingType=BindingType::Normal)
Binding(const QString &m_name, const QString &scriptCode, BindingType bindingType=BindingType::Normal)
const RegionComments & comments() const
void writeOutValue(const DomItem &self, OutWriter &lw) const
Binding(const QString &m_name, const QmlObject &value, BindingType bindingType=BindingType::Normal)
Binding(Binding &&o)=default
QmlObject * objectValue()
std::shared_ptr< ScriptExpression > scriptExpressionValue()
ScriptElementVariant bindingIdentifiers() const
BindingValueKind valueKind() const
Binding(const QString &m_name, const std::shared_ptr< ScriptExpression > &value, BindingType bindingType=BindingType::Normal)
const RegionComments & comments() const
CommentableDomElement & operator=(const CommentableDomElement &o)=default
CommentableDomElement(const CommentableDomElement &o)
CommentableDomElement(const Path &pathFromOwner=Path())
void setIsSingleton(bool isSingleton)
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
void setEnumerations(QMultiMap< QString, EnumDecl > enumerations)
void setName(const QString &name)
Path attachedTypePath(const DomItem &) const
Path addEnumeration(const EnumDecl &enumeration, AddOption option=AddOption::Overwrite, EnumDecl **ePtr=nullptr)
void setAttachedTypeName(const QString &name)
QString attachedTypeName() const
void setAttachedTypePath(const Path &p)
const QList< QmlObject > & objects() const &
static ErrorGroup domErrorGroup
index_type indexes() const
DomItem key(const QString &name) const
const QList< QmlObject > & annotations() const &
void setValues(QList< EnumItem > values)
const QList< EnumItem > & values() const &
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
Path addValue(EnumItem value)
void setAlias(const QString &aliasName)
void setAnnotations(const QList< QmlObject > &annotations)
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)
EnumDecl(const QString &name=QString(), QList< EnumItem > values=QList< EnumItem >(), Path pathFromOwner=Path())
DomType kind() const override
const RegionComments & comments() const
RegionComments & comments()
EnumItem(const QString &name=QString(), int value=0)
void writeOut(const DomItem &self, OutWriter &lw) const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
Represents a set of tags grouping a set of related error messages.
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
static constexpr DomType kindValue
static Export fromString(const Path &source, QStringView exp, const Path &typePath, const ErrorHandler &h)
GlobalComponent(const Path &pathFromOwner=Path())
DomType kind() const override
Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &ann, QmlObject **aPtr=nullptr)
RegionComments comments
std::shared_ptr< ScriptExpression > value
Id(const QString &idName=QString(), const Path &referredObject=Path())
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
void updatePathFromOwner(const Path &pathFromOwner)
QList< QmlObject > annotations
const QList< Path > & importSourcePaths() const &
void addImport(QStringList p, const Path &targetExports)
const QMap< QString, ImportScope > & subImports() const &
QList< DomItem > importedItemsWithName(const DomItem &self, const QString &name) const
QList< Export > importedExportsWithName(const DomItem &self, const QString &name) const
QSet< QString > importedNames(const DomItem &self) const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
QList< Path > allSources(const DomItem &self) const
Import(const QmlUri &uri=QmlUri(), Version version=Version(), const QString &importId=QString())
Import baseImport() const
static Import fromUriString(const QString &importStr, Version v=Version(), const QString &importId=QString(), const ErrorHandler &handler=nullptr)
friend bool operator==(const Import &i1, const Import &i2)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
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)
JsResource(const Path &pathFromOwner=Path())
DomType kind() const override
bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
std::shared_ptr< ScriptExpression > body
QString postCode(const DomItem &) const
QString preCode(const DomItem &) const
QList< MethodParameter > parameters
std::shared_ptr< ScriptExpression > returnType
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
void writeOut(const DomItem &self, OutWriter &ow) const
void writePre(const DomItem &self, OutWriter &ow) const
void setCode(const QString &code)
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
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 Path Root(PathRoot r)
Path key(const QString &name) const
Path field(const QString &name) const
Path index(index_type i) const
static Path Current(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
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
QQmlJSScope::ConstPtr semanticScope() const
void setNextComponentPath(const Path &p)
void setIds(QMultiMap< QString, Id > ids)
const QMultiMap< QString, Id > & ids() const &
void setNameIdentifiers(const ScriptElementVariant &name)
void setSemanticScope(const QQmlJSScope::ConstPtr &scope)
QmlComponent(const QString &name=QString())
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)
void writeOut(const DomItem &self, OutWriter &ow, const QString &onTarget) const
MutableDomItem addBinding(MutableDomItem &self, Binding binding, AddOption option)
ScriptElementVariant nameIdentifiers() const
void setName(const QString &name)
MutableDomItem addChild(MutableDomItem &self, QmlObject child)
void setBindings(QMultiMap< QString, Binding > bindings)
void setAnnotations(const QList< QmlObject > &annotations)
Path addChild(QmlObject child, QmlObject **cPtr=nullptr)
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 addAnnotation(const QmlObject &annotation, QmlObject **aPtr=nullptr)
LocallyResolvedAlias resolveAlias(const DomItem &self, std::shared_ptr< ScriptExpression > accessSequence) const
QList< QmlObject > children() const
LocallyResolvedAlias resolveAlias(const DomItem &self, const QStringList &accessSequence) const
const QList< Path > & prototypePaths() const &
virtual bool iterateSubOwners(const DomItem &self, function_ref< bool(const DomItem &owner)> visitor) const
Path addPropertyDef(const PropertyDefinition &propertyDef, AddOption option, PropertyDefinition **pDef=nullptr)
const QMultiMap< QString, MethodInfo > & methods() const &
Path addBinding(Binding binding, AddOption option, Binding **bPtr=nullptr)
MutableDomItem addPropertyDef(MutableDomItem &self, const PropertyDefinition &propertyDef, AddOption option)
DomItem field(const DomItem &self, QStringView name) const override
QString localDefaultPropertyName() const
void setPropertyDefs(QMultiMap< QString, PropertyDefinition > propertyDefs)
QString defaultPropertyName(const DomItem &self) const
QmlObject(const Path &pathFromOwner=Path())
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)
QList< QmlObject > annotations() const
QList< QString > fields() const
void setPrototypePaths(QList< Path > prototypePaths)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
void setMethods(QMultiMap< QString, MethodInfo > functionDefs)
Path addMethod(const MethodInfo &functionDef, AddOption option, MethodInfo **mPtr=nullptr)
bool iterateBaseDirectSubpaths(const DomItem &self, DirectVisitor) const
Kind kind() const
QString absoluteLocalPath(const QString &basePath=QString()) const
static QmlUri fromDirectoryString(const QString &importStr)
QUrl directoryUrl() const
QString directoryString() const
static QmlUri fromUriString(const QString &importStr)
bool isValid() const
QString toString() const
bool isDirectory() const
QString localPath() const
bool isModule() const
static QmlUri fromString(const QString &importStr)
QString moduleUri() const
friend bool operator==(const QmlUri &i1, const QmlUri &i2)
friend bool operator!=(const QmlUri &i1, const QmlUri &i2)
void setValueTypeName(const QString &name)
void setInterfaceNames(const QStringList &interfaces)
QQmlJSScope::AccessSemantics accessSemantics() const
void setFileName(const QString &fileName)
QQmlJSScope::ConstPtr semanticScope() const
void setAccessSemantics(QQmlJSScope::AccessSemantics v)
void setSemanticScope(const QQmlJSScope::ConstPtr &scope)
bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
void setExports(QList< Export > exports)
void setMetaRevisions(QList< int > metaRevisions)
void setExtensionTypeName(const QString &name)
const QList< int > & metaRevisions() const &
const QList< Export > & exports() const &
void addExport(const Export &exportedEntry)
const QStringList & interfaceNames() const &
QmltypesComponent(const Path &pathFromOwner=Path())
DomType kind() const override
Keeps the comments associated with a DomItem.
Use this to contain any script element.
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
ScriptExpression(const QString &code, ExpressionType expressionType, int derivedFrom=0, const QString &preCode=QString(), const QString &postCode=QString())
DomType kind() const override
std::shared_ptr< AstComments > astComments() const
std::shared_ptr< QQmlJS::Engine > engine() 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
QString astRelocatableDump() const
void setScriptElement(const ScriptElementVariant &p)
std::shared_ptr< OwningItem > doCopy(const DomItem &) const override
SourceLocation locationToLocal(SourceLocation x) const
std::function< SourceLocation(SourceLocation)> locationToLocalF(const DomItem &) const
ScriptElementVariant scriptElement()
void astDumper(const Sink &s, AstDumperOptions options) const
ScriptExpression(QStringView code, const std::shared_ptr< QQmlJS::Engine > &engine, AST::Node *ast, const std::shared_ptr< AstComments > &comments, ExpressionType expressionType, SourceLocation localOffset=SourceLocation(), int derivedFrom=0, QStringView preCode=QStringView(), QStringView postCode=QStringView())
std::function< SourceLocation(SourceLocation)> locationToGlobalF(const DomItem &self) const
std::shared_ptr< ScriptExpression > copyWithUpdatedCode(const DomItem &self, const QString &code) const
SourceLocation localOffset() const
Path canonicalPath(const DomItem &self) const override
QString majorString() const
int compare(const Version &o) const
QString minorString() const
QString majorSymbolicString() const
static bool isHandlerName(QStringView signalName)
\inmodule QtCore \reentrant
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:78
QString toString() const
Returns a deep copy of this string view's data as a QString.
Definition qstring.h:1121
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
QStringList split(const QString &sep, Qt::SplitBehavior behavior=Qt::KeepEmptyParts, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Splits the string into substrings wherever sep occurs, and returns the list of those strings.
Definition qstring.cpp:8218
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:8084
QString & append(QChar c)
Definition qstring.cpp:3252
\inmodule QtCore
Definition qurl.h:94
Path moduleIndexPath(const QString &uri, int majorVersion, const ErrorHandler &errorHandler)
Path lookupTypePath(const QString &name)
Path loadInfoPath(const Path &el)
Path qmltypesFilePath(const QString &path)
Path jsFilePath(const QString &path)
Path lookupCppTypePath(const QString &name)
Path qmlFileInfoPath(const QString &canonicalFilePath)
Path qmlFilePath(const QString &canonicalFilePath)
Path globalScopePath(const QString &name)
Path lookupSymbolPath(const QString &name)
Path jsFileInfoPath(const QString &path)
Path lookupPropertyPath(const QString &name)
Path qmlDirPath(const QString &path)
Path qmlDirectoryPath(const QString &path)
Path qmldirFilePath(const QString &path)
Path qmlDirectoryInfoPath(const QString &path)
Path qmltypesFileInfoPath(const QString &path)
Path qmldirFileInfoPath(const QString &path)
Path qmlDirInfoPath(const QString &path)
Path qmlFileObjectPath(const QString &canonicalFilePath)
Path globalScopeInfoPath(const QString &name)
Path moduleScopePath(const QString &uri, Version version, const ErrorHandler &)
Path appendUpdatableElementInQList(const Path &listPathFromOwner, QList< T > &list, const T &value, T **vPtr=nullptr)
Path insertUpdatableElementInMultiMap(const Path &mapPathFromOwner, QMultiMap< K, T > &mmap, K key, const T &value, AddOption option=AddOption::KeepExisting, T **valuePtr=nullptr)
bool operator!=(const Version &v1, const Version &v2)
qint64 index_type
bool operator>(const Version &v1, const Version &v2)
std::function< void(const ErrorMessage &)> ErrorHandler
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)
static ErrorGroups importErrors
AccessSemantics
Definition qqmlsa_p.h:40
Combined button and popup list for selecting options.
#define Q_DECLARE_TR_FUNCTIONS(context)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
@ Invalid
const char * typeName
GLint GLfloat GLfloat GLfloat v2
GLenum GLsizei GLsizei GLint * values
[15]
GLsizei const GLfloat * v
[13]
GLint GLint GLint GLint GLint x
[0]
GLenum mode
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLenum GLsizei const GLuint * ids
GLenum GLuint id
[7]
GLenum access
GLint GLfloat GLfloat v1
GLuint name
GLsizei GLenum * sources
GLfloat n
GLfloat GLfloat GLfloat GLfloat h
GLsizei GLsizei GLchar * source
GLdouble s
[6]
Definition qopenglext.h:235
GLuint res
const GLubyte * c
GLsizei const GLchar *const * path
GLfloat GLfloat p
[1]
GLuint GLenum option
#define QMLDOM_EXPORT
#define NewErrorGroup(name)
static bool fromString(const QMetaObject *mo, QString s, Allocate &&allocate)
static bool isComposite(const QQmlJSScope::ConstPtr &scope)
#define Q_ASSERT_X(cond, x, msg)
Definition qrandom.cpp:48
SSL_CTX int void * arg
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define QStringLiteral(str)
#define tr(X)
#define Q_ENUM(x)
#define Q_GADGET
int qint32
Definition qtypes.h:49
ReturnedValue read(const char *data)
gzip write("uncompressed data")
QStringList keys
QUrl url("example.com")
[constructor-url-reference]
QObject::connect nullptr
QMutex mutex
[2]
QLayoutItem * child
[0]
QJSEngine engine
[0]
QStringView el
\inmodule QtCore \reentrant
Definition qchar.h:18