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
qqmljsscope_p.h
Go to the documentation of this file.
1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3// Qt-Security score:significant
4
5#ifndef QQMLJSSCOPE_P_H
6#define QQMLJSSCOPE_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#include <qtqmlcompilerexports.h>
19
25#include "qqmlsa_p.h"
26
27#include <QtQml/private/qqmljssourcelocation_p.h>
28
29#include <QtCore/qfileinfo.h>
30#include <QtCore/qhash.h>
31#include <QtCore/qset.h>
32#include <QtCore/qstring.h>
33
35
36#include <QtCore/qtyperevision.h>
37
38#include <optional>
39
40QT_BEGIN_NAMESPACE
41
42class QQmlJSImporter;
43
44namespace QQmlJS {
45
47
48class Export {
49public:
50 Export() = default;
51 Export(QString package, QString type, QTypeRevision version, QTypeRevision revision);
52
53 bool isValid() const;
54
55 QString package() const { return m_package; }
56 QString type() const { return m_type; }
57 QTypeRevision version() const { return m_version; }
58 QTypeRevision revision() const { return m_revision; }
59
60private:
61 QString m_package;
62 QString m_type;
63 QTypeRevision m_version;
64 QTypeRevision m_revision;
65};
66
67template<typename Pointer>
69 Pointer scope;
71};
72
73template<typename Pointer>
78
79struct ContextualTypes;
80
81} // namespace QQmlJS
82
83class Q_QMLCOMPILER_EXPORT QQmlJSScope
84{
85 friend QQmlSA::Element;
86
87public:
88 using Ptr = QDeferredSharedPointer<QQmlJSScope>;
89 using WeakPtr = QDeferredWeakPointer<QQmlJSScope>;
90 using ConstPtr = QDeferredSharedPointer<const QQmlJSScope>;
91 using WeakConstPtr = QDeferredWeakPointer<const QQmlJSScope>;
92
93 using AccessSemantics = QQmlSA::AccessSemantics;
94 using ScopeType = QQmlSA::ScopeType;
95
96 using InlineComponentNameType = QString;
97 using RootDocumentNameType = std::monostate; // an empty type that has std::hash
98 /*!
99 * A Hashable type to differentiate document roots from different inline components.
100 */
101 using InlineComponentOrDocumentRootName =
102 std::variant<InlineComponentNameType, RootDocumentNameType>;
103
104 enum Flag {
105 Creatable = 0x1,
106 Composite = 0x2,
107 JavaScriptBuiltin = 0x4,
108 Singleton = 0x8,
109 Script = 0x10,
110 CustomParser = 0x20,
111 Array = 0x40,
112 InlineComponent = 0x80,
113 WrappedInImplicitComponent = 0x100,
114 HasBaseTypeError = 0x200,
115 ExtensionIsNamespace = 0x400,
116 IsListProperty = 0x800,
117 Structured = 0x1000,
118 ExtensionIsJavaScript = 0x2000,
119 EnforcesScopedEnums = 0x4000,
120 FileRootComponent = 0x8000,
121 AssignedToUnknownProperty = 0x10000,
122 IsSelfExtension = 0x20000,
123 };
124 Q_DECLARE_FLAGS(Flags, Flag)
125
126 using Export = QQmlJS::Export;
127 template <typename Pointer>
128 using ImportedScope = QQmlJS::ImportedScope<Pointer>;
129 template <typename Pointer>
130 using ExportedScope = QQmlJS::ExportedScope<Pointer>;
131
132 struct JavaScriptIdentifier
133 {
134 enum Kind {
135 Parameter,
136 FunctionScoped,
137 LexicalScoped,
138 Injected
139 };
140
141 Kind kind = FunctionScoped;
142 QQmlJS::SourceLocation location;
143 std::optional<QString> typeName;
144 bool isConst = false;
145 QQmlJSScope::WeakConstPtr scope = {};
146 };
147
148 enum BindingTargetSpecifier {
149 SimplePropertyTarget, // e.g. `property int p: 42`
150 ListPropertyTarget, // e.g. `property list<Item> pList: [ Text {} ]`
151 UnnamedPropertyTarget // default property bindings, where property name is unspecified
152 };
153
154 template <typename Key, typename Value>
155 using QMultiHashRange = std::pair<typename QMultiHash<Key, Value>::iterator,
156 typename QMultiHash<Key, Value>::iterator>;
157
158 static QQmlJSScope::Ptr create() { return QSharedPointer<QQmlJSScope>(new QQmlJSScope); }
159 static QQmlJSScope::Ptr resetForReparse(QQmlJSScope::Ptr &&scope);
160
161 static QQmlJSScope::ConstPtr findCurrentQMLScope(const QQmlJSScope::ConstPtr &scope);
162
163 QQmlJSScope::Ptr parentScope();
164 QQmlJSScope::ConstPtr parentScope() const;
165 static void reparent(const QQmlJSScope::Ptr &parentScope, const QQmlJSScope::Ptr &childScope);
166
167 void insertJSIdentifier(const QString &name, const JavaScriptIdentifier &identifier);
168 QHash<QString, JavaScriptIdentifier> ownJSIdentifiers() const;
169 void insertPropertyIdentifier(const QQmlJSMetaProperty &prop);
170
171 ScopeType scopeType() const { return m_scopeType; }
172 void setScopeType(ScopeType type) { m_scopeType = type; }
173
174 void addOwnMethod(const QQmlJSMetaMethod &method) { m_methods.insert(method.methodName(), method); }
175 QMultiHashRange<QString, QQmlJSMetaMethod> mutableOwnMethodsRange(const QString &name)
176 {
177 return m_methods.equal_range(name);
178 }
179 QMultiHash<QString, QQmlJSMetaMethod> ownMethods() const { return m_methods; }
180 QList<QQmlJSMetaMethod> ownMethods(const QString &name) const { return m_methods.values(name); }
181 bool hasOwnMethod(const QString &name) const { return m_methods.contains(name); }
182
183 bool hasMethod(const QString &name) const;
184 QHash<QString, QQmlJSMetaMethod> methods() const;
185 QList<QQmlJSMetaMethod> methods(const QString &name) const;
186 QList<QQmlJSMetaMethod> methods(const QString &name, QQmlJSMetaMethodType type) const;
187
188 void addOwnEnumeration(const QQmlJSMetaEnum &enumeration) { m_enumerations.insert(enumeration.name(), enumeration); }
189 QHash<QString, QQmlJSMetaEnum> ownEnumerations() const { return m_enumerations; }
190 QQmlJSMetaEnum ownEnumeration(const QString &name) const { return m_enumerations.value(name); }
191 bool hasOwnEnumeration(const QString &name) const { return m_enumerations.contains(name); }
192
193 bool hasEnumeration(const QString &name) const;
194 bool hasEnumerationKey(const QString &name) const;
195 bool hasOwnEnumerationKey(const QString &name) const;
196 QQmlJSMetaEnum enumeration(const QString &name) const;
197 QHash<QString, QQmlJSMetaEnum> enumerations() const;
198
199 void setAnnotations(const QList<QQmlJSAnnotation> &annotations) { m_annotations = annotations; }
200 const QList<QQmlJSAnnotation> &annotations() const { return m_annotations; }
201
202 QString filePath() const { return m_filePath; }
203 void setFilePath(const QString &file) { m_filePath = file; }
204
205 quint32 lineNumber() const { return m_sourceLocation.startLine; }
206 void setLineNumber(quint32 lineNumber);
207
208 // The name the type uses to refer to itself. Either C++ class name or base name of
209 // QML file. isComposite tells us if this is a C++ or a QML name.
210 QString internalName() const { return m_internalName; }
211 void setInternalName(const QString &internalName) { m_internalName = internalName; }
212 QString augmentedInternalName() const;
213
214 // This returns a more user readable version of internalName / baseTypeName
215 static QString prettyName(QAnyStringView name);
216
217 enum class IsComponentRoot : quint8 { No = 0, Yes, Maybe };
218 IsComponentRoot componentRootStatus() const;
219
220 void setAliases(const QStringList &aliases) { m_aliases = aliases; }
221 QStringList aliases() const { return m_aliases; }
222
223 void setInterfaceNames(const QStringList& interfaces) { m_interfaceNames = interfaces; }
224 QStringList interfaceNames() const { return m_interfaceNames; }
225
226 bool hasInterface(const QString &name) const;
227 bool hasOwnInterface(const QString &name) const { return m_interfaceNames.contains(name); }
228
229 void setOwnDeferredNames(const QStringList &names) { m_ownDeferredNames = names; }
230 QStringList ownDeferredNames() const { return m_ownDeferredNames; }
231 void setOwnImmediateNames(const QStringList &names) { m_ownImmediateNames = names; }
232 QStringList ownImmediateNames() const { return m_ownImmediateNames; }
233
234 bool isNameDeferred(const QString &name) const;
235
236 // If isComposite(), this is the QML/JS name of the prototype. Otherwise it's the
237 // relevant base class (in the hierarchy starting from QObject) of a C++ type.
238 void setBaseTypeName(const QString &baseTypeName);
239 QString baseTypeName() const;
240
241 QQmlJSScope::ConstPtr baseType() const { return m_baseType.scope; }
242 QTypeRevision baseTypeRevision() const { return m_baseType.revision; }
243
244 QString moduleName() const;
245 QString ownModuleName() const { return m_moduleName; }
246 void setOwnModuleName(const QString &moduleName) { m_moduleName = moduleName; }
247
248 void clearBaseType() { m_baseType = {}; }
249 void setBaseTypeError(const QString &baseTypeError);
250 QString baseTypeError() const;
251
252 void addOwnProperty(const QQmlJSMetaProperty &prop) { m_properties.insert(prop.propertyName(), prop); }
253 QHash<QString, QQmlJSMetaProperty> ownProperties() const { return m_properties; }
254 QQmlJSMetaProperty ownProperty(const QString &name) const { return m_properties.value(name); }
255 bool hasOwnProperty(const QString &name) const { return m_properties.contains(name); }
256
257 bool hasProperty(const QString &name) const;
258 QQmlJSMetaProperty property(const QString &name) const;
259 QHash<QString, QQmlJSMetaProperty> properties() const;
260
261 void setPropertyLocallyRequired(const QString &name, bool isRequired);
262 bool isPropertyRequired(const QString &name) const;
263 bool isPropertyLocallyRequired(const QString &name) const;
264
265 void addOwnPropertyBinding(
266 const QQmlJSMetaPropertyBinding &binding,
267 BindingTargetSpecifier specifier = BindingTargetSpecifier::SimplePropertyTarget);
268 QMultiHash<QString, QQmlJSMetaPropertyBinding> ownPropertyBindings() const;
269 std::pair<QMultiHash<QString, QQmlJSMetaPropertyBinding>::const_iterator,
270 QMultiHash<QString, QQmlJSMetaPropertyBinding>::const_iterator>
271 ownPropertyBindings(const QString &name) const;
272 QList<QQmlJSMetaPropertyBinding> ownPropertyBindingsInQmlIROrder() const;
273 bool hasOwnPropertyBindings(const QString &name) const;
274
275 bool hasPropertyBindings(const QString &name) const;
276 QList<QQmlJSMetaPropertyBinding> propertyBindings(const QString &name) const;
277
278 struct AnnotatedScope; // defined later
279 static AnnotatedScope ownerOfProperty(const QQmlJSScope::ConstPtr &self, const QString &name);
280 static AnnotatedScope ownerOfMethod(const QQmlJSScope::ConstPtr &self, const QString &name);
281 static AnnotatedScope ownerOfEnum(const QQmlJSScope::ConstPtr &self, const QString &name);
282
283 bool isResolved() const;
284 bool isFullyResolved() const;
285
286 QString ownDefaultPropertyName() const { return m_defaultPropertyName; }
287 void setOwnDefaultPropertyName(const QString &name) { m_defaultPropertyName = name; }
288 QString defaultPropertyName() const;
289
290 QString ownParentPropertyName() const { return m_parentPropertyName; }
291 void setOwnParentPropertyName(const QString &name) { m_parentPropertyName = name; }
292 QString parentPropertyName() const;
293
294 QString ownAttachedTypeName() const { return m_attachedTypeName; }
295 void setOwnAttachedTypeName(const QString &name) { m_attachedTypeName = name; }
296 QQmlJSScope::ConstPtr ownAttachedType() const { return m_attachedType; }
297
298 QString attachedTypeName() const;
299 QQmlJSScope::ConstPtr attachedType() const;
300
301 QString extensionTypeName() const { return m_extensionTypeName; }
302 void setExtensionTypeName(const QString &name) { m_extensionTypeName = name; }
303 enum ExtensionKind {
304 NotExtension,
305 ExtensionType,
306 ExtensionJavaScript,
307 ExtensionNamespace,
308 };
309 struct AnnotatedScope
310 {
311 QQmlJSScope::ConstPtr scope;
312 ExtensionKind extensionSpecifier = NotExtension;
313 };
314 AnnotatedScope extensionType() const;
315
316 QString elementTypeName() const { return m_elementTypeName; }
317 void setElementTypeName(const QString &name) { m_elementTypeName = name; }
318 QQmlJSScope::ConstPtr elementType() const { return m_elementType; }
319 QQmlJSScope::ConstPtr listType() const { return m_listType; }
320 QQmlJSScope::Ptr listType() { return m_listType; }
321
322 void addOwnRuntimeFunctionIndex(QQmlJSMetaMethod::AbsoluteFunctionIndex index);
323 QQmlJSMetaMethod::AbsoluteFunctionIndex
324 ownRuntimeFunctionIndex(QQmlJSMetaMethod::RelativeFunctionIndex index) const;
325
326
327 /*!
328 * \internal
329 *
330 * Returns true for objects defined from Qml, and false for objects declared from C++.
331 */
332 bool isComposite() const { return m_flags.testFlag(Composite); }
333 void setIsComposite(bool v) { m_flags.setFlag(Composite, v); }
334
335 /*!
336 * \internal
337 *
338 * Returns true for JavaScript types, false for QML and C++ types.
339 */
340 bool isJavaScriptBuiltin() const { return m_flags.testFlag(JavaScriptBuiltin); }
341 void setIsJavaScriptBuiltin(bool v) { m_flags.setFlag(JavaScriptBuiltin, v); }
342
343 bool isScript() const { return m_flags.testFlag(Script); }
344 void setIsScript(bool v) { m_flags.setFlag(Script, v); }
345
346 bool hasCustomParser() const { return m_flags.testFlag(CustomParser); }
347 void setHasCustomParser(bool v) { m_flags.setFlag(CustomParser, v); }
348
349 bool isArrayScope() const { return m_flags.testFlag(Array); }
350 void setIsArrayScope(bool v) { m_flags.setFlag(Array, v); }
351
352 bool isInlineComponent() const { return m_flags.testFlag(InlineComponent); }
353 void setIsInlineComponent(bool v) { m_flags.setFlag(InlineComponent, v); }
354
355 bool isWrappedInImplicitComponent() const { return m_flags.testFlag(WrappedInImplicitComponent); }
356 void setIsWrappedInImplicitComponent(bool v) { m_flags.setFlag(WrappedInImplicitComponent, v); }
357
358 bool isAssignedToUnknownProperty() const { return m_flags.testFlag(AssignedToUnknownProperty); }
359 void setAssignedToUnknownProperty(bool v) { m_flags.setFlag(AssignedToUnknownProperty, v); }
360
361 bool extensionIsJavaScript() const { return m_flags.testFlag(ExtensionIsJavaScript); }
362 void setExtensionIsJavaScript(bool v) { m_flags.setFlag(ExtensionIsJavaScript, v); }
363
364 bool extensionIsNamespace() const { return m_flags.testFlag(ExtensionIsNamespace); }
365 void setExtensionIsNamespace(bool v) { m_flags.setFlag(ExtensionIsNamespace, v); }
366
367 bool isListProperty() const { return m_flags.testFlag(IsListProperty); }
368 void setIsListProperty(bool v) { m_flags.setFlag(IsListProperty, v); }
369
370 bool isSingleton() const { return m_flags.testFlag(Singleton); }
371 void setIsSingleton(bool v) { m_flags.setFlag(Singleton, v); }
372
373 bool enforcesScopedEnums() const;
374 void setEnforcesScopedEnumsFlag(bool v) { m_flags.setFlag(EnforcesScopedEnums, v); }
375
376 bool isCreatable() const;
377 void setCreatableFlag(bool v) { m_flags.setFlag(Creatable, v); }
378
379 bool isStructured() const;
380 void setStructuredFlag(bool v) { m_flags.setFlag(Structured, v); }
381
382 bool isFileRootComponent() const { return m_flags.testFlag(FileRootComponent); }
383 void setIsRootFileComponentFlag(bool v) { m_flags.setFlag(FileRootComponent, v); }
384
385 // Self-extension happens when a type declares itself as its own extension type using the
386 // QML_EXTENDED macro. Internally, we use the self-extension + QML_FOREIGN trick to indicate
387 // the type to be used in the generated code is the declared foreign type instead of the type
388 // itself, but that the metaObject to be used is that of the extension. This is used for example
389 // with value types for types that don't have a metaObject, such as QQmlRectValueType: The
390 // generated C++ code needs to use QRect but all the properties are defined on
391 // QQmlRectValueType.
392 bool isSelfExtension() const { return m_flags.testFlag(IsSelfExtension); }
393 void setIsSelfExtension(bool v) { m_flags.setFlag(IsSelfExtension, v); }
394
395 void setAccessSemantics(AccessSemantics semantics) { m_semantics = semantics; }
396 AccessSemantics accessSemantics() const { return m_semantics; }
397 bool isReferenceType() const { return m_semantics == QQmlJSScope::AccessSemantics::Reference; }
398 bool isValueType() const { return m_semantics == QQmlJSScope::AccessSemantics::Value; }
399
400 std::optional<JavaScriptIdentifier> jsIdentifier(const QString &id) const;
401 std::optional<JavaScriptIdentifier> ownJSIdentifier(const QString &id) const;
402
403 QQmlJS::ChildScopesIterator childScopesBegin() const { return m_childScopes.constBegin(); }
404 QQmlJS::ChildScopesIterator childScopesEnd() const { return m_childScopes.constEnd(); }
405
406 void setInlineComponentName(const QString &inlineComponentName);
407 std::optional<QString> inlineComponentName() const;
408 InlineComponentOrDocumentRootName enclosingInlineComponentName() const;
409
410 QList<QQmlJSScope::Ptr> childScopes();
411
412 QList<QQmlJSScope::ConstPtr> childScopes() const;
413
414 static QTypeRevision resolveTypes(
415 const Ptr &self, const QQmlJS::ContextualTypes &contextualTypes,
416 QSet<QString> *usedTypes = nullptr);
417 static void resolveNonEnumTypes(
418 const QQmlJSScope::Ptr &self, const QQmlJS::ContextualTypes &contextualTypes,
419 QSet<QString> *usedTypes = nullptr);
420 static void resolveEnums(
421 const QQmlJSScope::Ptr &self, const QQmlJS::ContextualTypes &contextualTypes,
422 QSet<QString> *usedTypes = nullptr);
423 static void resolveList(
424 const QQmlJSScope::Ptr &self, const QQmlJSScope::ConstPtr &arrayType);
425 static void resolveGroup(
426 const QQmlJSScope::Ptr &self, const QQmlJSScope::ConstPtr &baseType,
427 const QQmlJS::ContextualTypes &contextualTypes,
428 QSet<QString> *usedTypes = nullptr);
429
430 void setSourceLocation(const QQmlJS::SourceLocation &sourceLocation);
431 QQmlJS::SourceLocation sourceLocation() const;
432
433 void setIdSourceLocation(const QQmlJS::SourceLocation &sourceLocation);
434 QQmlJS::SourceLocation idSourceLocation() const;
435
436 static QQmlJSScope::ConstPtr nonCompositeBaseType(const QQmlJSScope::ConstPtr &type);
437
438 static QTypeRevision
439 nonCompositeBaseRevision(const ImportedScope<QQmlJSScope::ConstPtr> &scope);
440
441 bool isSameType(const QQmlJSScope::ConstPtr &otherScope) const;
442 bool inherits(const QQmlJSScope::ConstPtr &base) const;
443 bool canAssign(const QQmlJSScope::ConstPtr &derived) const;
444
445 bool isInCustomParserParent() const;
446
447
448 static ImportedScope<QQmlJSScope::ConstPtr> findType(const QString &name,
449 const QQmlJS::ContextualTypes &contextualTypes,
450 QSet<QString> *usedTypes = nullptr);
451
452 static QQmlSA::Element createQQmlSAElement(const ConstPtr &);
453 static QQmlSA::Element createQQmlSAElement(ConstPtr &&);
454 static const QQmlJSScope::ConstPtr &scope(const QQmlSA::Element &);
455 static constexpr qsizetype sizeofQQmlSAElement() { return QQmlSA::Element::sizeofElement; }
456
457private:
458 // the way to construct a QQmlJSScope is via create
459 explicit QQmlJSScope(const QString &internalName);
460 QQmlJSScope(QQmlJSScope &&) = default;
461 QQmlJSScope &operator=(QQmlJSScope &&) = default;
462 /*! \internal
463
464 Minimal information about a QQmlJSMetaPropertyBinding that allows it to
465 be manipulated similarly to QmlIR::Binding.
466 */
467 template <typename T>
468 friend class QTypeInfo; // so that we can Q_DECLARE_TYPEINFO QmlIRCompatibilityBindingData
469 struct QmlIRCompatibilityBindingData
470 {
471 QmlIRCompatibilityBindingData() = default;
472 QmlIRCompatibilityBindingData(const QString &name, quint32 offset)
473 : propertyName(name), sourceLocationOffset(offset)
474 {
475 }
476 QString propertyName; // bound property name
477 quint32 sourceLocationOffset = 0; // binding's source location offset
478 };
479
480 QQmlJSScope() = default;
481 QQmlJSScope(const QQmlJSScope &) = default;
482 QQmlJSScope &operator=(const QQmlJSScope &) = default;
483 static QTypeRevision resolveType(
484 const QQmlJSScope::Ptr &self, const QQmlJS::ContextualTypes &contextualTypes,
485 QSet<QString> *usedTypes);
486 static void updateChildScope(
487 const QQmlJSScope::Ptr &childScope, const QQmlJSScope::Ptr &self,
488 const QQmlJS::ContextualTypes &contextualTypes, QSet<QString> *usedTypes);
489
490 void addOwnPropertyBindingInQmlIROrder(const QQmlJSMetaPropertyBinding &binding,
491 BindingTargetSpecifier specifier);
492 bool hasEnforcesScopedEnumsFlag() const { return m_flags & EnforcesScopedEnums; }
493 bool hasCreatableFlag() const { return m_flags & Creatable; }
494 bool hasStructuredFlag() const { return m_flags & Structured; }
495
496 QHash<QString, JavaScriptIdentifier> m_jsIdentifiers;
497
498 QMultiHash<QString, QQmlJSMetaMethod> m_methods;
499 QHash<QString, QQmlJSMetaProperty> m_properties;
500 QMultiHash<QString, QQmlJSMetaPropertyBinding> m_propertyBindings;
501
502 // a special QmlIR compatibility bindings array, ordered the same way as
503 // bindings in QmlIR::Object
504 QList<QmlIRCompatibilityBindingData> m_propertyBindingsArray;
505
506 // same as QmlIR::Object::runtimeFunctionIndices
507 QList<QQmlJSMetaMethod::AbsoluteFunctionIndex> m_runtimeFunctionIndices;
508
509 QHash<QString, QQmlJSMetaEnum> m_enumerations;
510
511 QList<QQmlJSAnnotation> m_annotations;
512 QList<QQmlJSScope::Ptr> m_childScopes;
513 QQmlJSScope::WeakPtr m_parentScope;
514
515 QString m_filePath;
516 QString m_internalName;
517 QString m_baseTypeNameOrError;
518
519 // We only need the revision for the base type as inheritance is
520 // the only relation between two types where the revisions matter.
521 ImportedScope<QQmlJSScope::WeakConstPtr> m_baseType;
522
523 ScopeType m_scopeType = ScopeType::QMLScope;
524 QStringList m_aliases;
525 QStringList m_interfaceNames;
526 QStringList m_ownDeferredNames;
527 QStringList m_ownImmediateNames;
528
529 QString m_defaultPropertyName;
530 QString m_parentPropertyName;
531 /*! \internal
532 * The attached type name.
533 * This is an internal name, from a c++ type or a synthetic jsrootgen.
534 */
535 QString m_attachedTypeName;
536 QStringList m_requiredPropertyNames;
537 QQmlJSScope::WeakConstPtr m_attachedType;
538
539 /*! \internal
540 * The type name of the list element in case this is a sequence type.
541 * This is an internal name, from a c++ type or a synthetic jsrootgen.
542 */
543 QString m_elementTypeName;
544 QQmlJSScope::WeakConstPtr m_elementType;
545 QQmlJSScope::Ptr m_listType;
546
547 /*!
548 The extension is provided as either a type (QML_{NAMESPACE_}EXTENDED) or as a
549 namespace (QML_EXTENDED_NAMESPACE).
550 The bool HasExtensionNamespace helps differentiating both cases, as namespaces
551 have a more limited lookup capaility.
552 This is an internal name, from a c++ type or a synthetic jsrootgen.
553 */
554 QString m_extensionTypeName;
555 QQmlJSScope::WeakConstPtr m_extensionType;
556
557 Flags m_flags = Creatable; // all types are marked as creatable by default.
558 AccessSemantics m_semantics = AccessSemantics::Reference;
559
560 QQmlJS::SourceLocation m_sourceLocation;
561 QQmlJS::SourceLocation m_idSourceLocation;
562
563 QString m_moduleName;
564
565 std::optional<QString> m_inlineComponentName;
566};
567
568inline QQmlJSScope::Ptr QQmlJSScope::parentScope()
569{
570 return m_parentScope.toStrongRef();
571}
572
573inline QQmlJSScope::ConstPtr QQmlJSScope::parentScope() const
574{
575 QT_WARNING_PUSH
576#if defined(Q_CC_GNU_ONLY) && Q_CC_GNU < 1400 && Q_CC_GNU >= 1200
577 QT_WARNING_DISABLE_GCC("-Wuse-after-free")
578#endif
579 return QQmlJSScope::WeakConstPtr(m_parentScope).toStrongRef();
580 QT_WARNING_POP
581}
582
583inline QMultiHash<QString, QQmlJSMetaPropertyBinding> QQmlJSScope::ownPropertyBindings() const
584{
585 return m_propertyBindings;
586}
587
588inline std::pair<QMultiHash<QString, QQmlJSMetaPropertyBinding>::const_iterator, QMultiHash<QString, QQmlJSMetaPropertyBinding>::const_iterator> QQmlJSScope::ownPropertyBindings(const QString &name) const
589{
590 return m_propertyBindings.equal_range(name);
591}
592
593inline bool QQmlJSScope::hasOwnPropertyBindings(const QString &name) const
594{
595 return m_propertyBindings.contains(name);
596}
597
598inline QQmlJSMetaMethod::AbsoluteFunctionIndex QQmlJSScope::ownRuntimeFunctionIndex(QQmlJSMetaMethod::RelativeFunctionIndex index) const
599{
600 const int i = static_cast<int>(index);
601 Q_ASSERT(i >= 0);
602 Q_ASSERT(i < int(m_runtimeFunctionIndices.size()));
603 return m_runtimeFunctionIndices[i];
604}
605
606inline void QQmlJSScope::setInlineComponentName(const QString &inlineComponentName)
607{
608 Q_ASSERT(isInlineComponent());
609 m_inlineComponentName = inlineComponentName;
610}
611
612inline QList<QQmlJSScope::Ptr> QQmlJSScope::childScopes()
613{
614 return m_childScopes;
615}
616
617inline void QQmlJSScope::setSourceLocation(const QQmlJS::SourceLocation &sourceLocation)
618{
619 m_sourceLocation = sourceLocation;
620}
621
622inline QQmlJS::SourceLocation QQmlJSScope::sourceLocation() const
623{
624 return m_sourceLocation;
625}
626
627inline void QQmlJSScope::setIdSourceLocation(const QQmlJS::SourceLocation &sourceLocation)
628{
629 Q_ASSERT(m_scopeType == QQmlSA::ScopeType::QMLScope);
630 m_idSourceLocation = sourceLocation;
631}
632
633inline QQmlJS::SourceLocation QQmlJSScope::idSourceLocation() const
634{
635 Q_ASSERT(m_scopeType == QQmlSA::ScopeType::QMLScope);
636 return m_idSourceLocation;
637}
638
639inline QQmlJSScope::ConstPtr QQmlJSScope::nonCompositeBaseType(const ConstPtr &type)
640{
641 for (QQmlJSScope::ConstPtr base = type; base; base = base->baseType()) {
642 if (!base->isComposite())
643 return base;
644 }
645 return {};
646}
647
649
650template<>
651class Q_QMLCOMPILER_EXPORT QDeferredFactory<QQmlJSScope>
652{
653public:
654 QDeferredFactory() = default;
655
656 QDeferredFactory(QQmlJSImporter *importer, const QQmlJS::TypeReader &typeReader,
657 const QString &filePath, const QString &moduleName, bool isSingleton);
658
659 bool isValid() const
660 {
661 return !m_filePath.isEmpty() && m_importer != nullptr;
662 }
663
664 QString internalName() const
665 {
666 return QFileInfo(m_filePath).baseName();
667 }
668
669 QString filePath() const { return m_filePath; }
670
671 QQmlJSImporter* importer() const { return m_importer; }
672 QString moduleName() const { return m_moduleName; }
673 bool isSingleton() const { return m_isSingleton; }
674
675 void setIsSingleton(bool isSingleton)
676 {
677 m_isSingleton = isSingleton;
678 }
679
680 void setModuleName(const QString &moduleName) { m_moduleName = moduleName; }
681
682private:
683 friend class QDeferredSharedPointer<QQmlJSScope>;
684 friend class QDeferredSharedPointer<const QQmlJSScope>;
685 friend class QDeferredWeakPointer<QQmlJSScope>;
686 friend class QDeferredWeakPointer<const QQmlJSScope>;
687
688 // Should only be called when lazy-loading the type in a deferred pointer.
689 void populate(const QSharedPointer<QQmlJSScope> &scope) const;
690
691 QQmlJSImporter *m_importer = nullptr;
692 QQmlJS::TypeReader m_typeReader;
693 QString m_filePath;
694 QString m_moduleName;
695 bool m_isSingleton = false;
696};
697
698using QQmlJSExportedScope = QQmlJSScope::ExportedScope<QQmlJSScope::Ptr>;
699using QQmlJSImportedScope = QQmlJSScope::ImportedScope<QQmlJSScope::ConstPtr>;
700
701namespace QQmlSA {
702constexpr inline bool isFunctionScope(ScopeType type)
703{
704 switch (type) {
708 return true;
709 default:
710 return false;
711 }
712}
713
714}
715
716template <typename T>
717static void resetFactory(QDeferredSharedPointer<T> &pointer, QQmlJSImporter *importer,
718 const QQmlJS::TypeReader &typeReader, const QString &filePath)
719{
720 const auto &factory = pointer.factory();
721 QDeferredFactory<std::remove_const_t<T>> newFactory(importer,
722 typeReader, filePath,
723 factory ? factory->moduleName() : QString(),
724 factory ? factory->isSingleton() : false);
725 return resetFactoryImpl(pointer, std::move(newFactory));
726}
727
728template<typename T, typename U>
729void resetFactoryImpl(QDeferredSharedPointer<T> &pointer, U&& factory)
730{
731 pointer.m_data.reset();
732 *pointer.m_factory = std::forward<U>(factory);
733}
734
735
736QT_END_NAMESPACE
737
738#endif // QQMLJSSCOPE_P_H
friend bool operator==(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
Returns true if lhs and rhs are equal, otherwise returns false.
Definition qbytearray.h:803
friend bool operator!=(const QByteArray::FromBase64Result &lhs, const QByteArray::FromBase64Result &rhs) noexcept
Returns true if lhs and rhs are different, otherwise returns false.
Definition qbytearray.h:814
QString fileName() const
If the currently assigned device is a QFile, or if setFileName() has been called, this function retur...
void setFileName(const QString &fileName)
Sets the file name of QImageReader to fileName.
virtual Type type() const =0
Reimplement this function to return the paint engine \l{Type}.
virtual bool isValid() const
virtual QString location() const
QString typeName() const
void setIsFlag(bool isFlag)
void setLineNumber(int lineNumber)
friend bool operator!=(const QQmlJSMetaEnum &a, const QQmlJSMetaEnum &b)
void setName(const QString &name)
QQmlJSMetaEnum()=default
int lineNumber() const
friend size_t qHash(const QQmlJSMetaEnum &e, size_t seed=0)
friend bool operator==(const QQmlJSMetaEnum &a, const QQmlJSMetaEnum &b)
void setTypeName(const QString &typeName)
bool hasKey(const QString &key) const
void setIsScoped(bool v)
void setType(const QSharedPointer< const QQmlJSScope > &type)
QSharedPointer< const QQmlJSScope > type() const
int value(const QString &key) const
bool isQml() const
void setIsQml(bool v)
void addValue(int value)
bool isScoped() const
QList< int > values() const
bool isFlag() const
QString alias() const
QStringList keys() const
bool isValid() const
void addKey(const QString &key)
void setAlias(const QString &alias)
QString name() const
QQmlJSMetaEnum(QString name)
bool hasValues() const
QQmlJSMetaReturnType returnValue() const
QQmlJSMetaMethod()=default
void setReturnType(QWeakPointer< const QQmlJSScope > type)
void setSourceLocation(QQmlJS::SourceLocation location)
QQmlJS::SourceLocation sourceLocation() const
QString methodName() const
QQmlJSMetaMethodType MethodType
void setMethodName(const QString &name)
void setReturnTypeName(const QString &typeName)
QString returnTypeName() const
QQmlJSMetaMethod(QString name, QString returnType=QString())
QList< QQmlJSMetaParameter > parameters() const
void setReturnValue(const QQmlJSMetaReturnType returnValue)
QSharedPointer< const QQmlJSScope > returnType() const
void setIsPointer(bool isPointer)
void setType(QWeakPointer< const QQmlJSScope > type)
void setIsList(bool isList)
friend bool operator!=(const QQmlJSMetaParameter &a, const QQmlJSMetaParameter &b)
friend size_t qHash(const QQmlJSMetaParameter &e, size_t seed=0)
void setName(const QString &name)
void setTypeName(const QString &typeName)
void setTypeQualifier(Constness typeQualifier)
Constness typeQualifier() const
QString typeName() const
QQmlJSMetaParameter(QString name=QString(), QString typeName=QString(), Constness typeQualifier=NonConst, QWeakPointer< const QQmlJSScope > type={})
friend bool operator==(const QQmlJSMetaParameter &a, const QQmlJSMetaParameter &b)
QSharedPointer< const QQmlJSScope > type() const
\inmodule QtQmlCompiler
friend bool operator!=(const QQmlJSMetaProperty &a, const QQmlJSMetaProperty &b)
QString notify() const
QSharedPointer< const QQmlJSScope > aliasTargetScope() const
QString aliasExpression() const
friend bool operator==(const QQmlJSMetaProperty &a, const QQmlJSMetaProperty &b)
void setIsOverride(bool isOverride)
void setPropertyName(const QString &propertyName)
QString aliasTargetName() const
void setAnnotations(const QList< QQmlJSAnnotation > &annotation)
void setIsList(bool isList)
QString bindable() const
QSharedPointer< const QQmlJSScope > type() const
void setPrivateClass(const QString &privateClass)
void setRead(const QString &read)
friend size_t qHash(const QQmlJSMetaProperty &prop, size_t seed=0)
void setBindable(const QString &bindable)
void setWrite(const QString &write)
void setIsPropertyConstant(bool isPropertyConstant)
QString reset() const
void setRevision(int revision)
void setIsFinal(bool isFinal)
QString typeName() const
void setAliasTargetScope(const QSharedPointer< const QQmlJSScope > &scope)
void setSourceLocation(const QQmlJS::SourceLocation &newSourceLocation)
QString write() const
void setIsTypeConstant(bool isTypeConstant)
const QList< QQmlJSAnnotation > & annotations() const
QQmlJS::SourceLocation sourceLocation() const
void setTypeName(const QString &typeName)
QQmlJSMetaProperty()=default
void setReset(const QString &reset)
QString privateClass() const
void setIsVirtual(bool isVirtual)
void setIsWritable(bool isWritable)
void setAliasExpression(const QString &aliasString)
void setAliasTargetName(const QString &name)
void setIndex(int index)
void setNotify(const QString &notify)
bool isPropertyConstant() const
bool isTypeConstant() const
void setType(const QSharedPointer< const QQmlJSScope > &type)
QString propertyName() const
void setIsPointer(bool isPointer)
QQmlJSRegisterContent createMethod(const QList< QQmlJSMetaMethod > &methods, const QQmlJSScope::ConstPtr &methodType, ContentVariant variant, QQmlJSRegisterContent scope)
QQmlJSRegisterContent createImportNamespace(uint importNamespaceStringId, const QQmlJSScope::ConstPtr &importNamespaceType, ContentVariant variant, QQmlJSRegisterContent scope)
QQmlJSRegisterContent createProperty(const QQmlJSMetaProperty &property, int baseLookupIndex, int resultLookupIndex, ContentVariant variant, QQmlJSRegisterContent scope)
void adjustType(QQmlJSRegisterContent content, const QQmlJSScope::ConstPtr &adjusted)
void generalizeType(QQmlJSRegisterContent content, const QQmlJSScope::ConstPtr &generalized)
void storeType(QQmlJSRegisterContent content, const QQmlJSScope::ConstPtr &stored)
QQmlJSRegisterContent castTo(QQmlJSRegisterContent content, const QQmlJSScope::ConstPtr &newContainedType)
QQmlJSRegisterContent createEnumeration(const QQmlJSMetaEnum &enumeration, const QString &enumMember, ContentVariant variant, QQmlJSRegisterContent scope)
void setAllocationMode(AllocationMode mode)
QQmlJSRegisterContent storedIn(QQmlJSRegisterContent content, const QQmlJSScope::ConstPtr &newStoredType)
QQmlJSRegisterContent clone(QQmlJSRegisterContent from)
QQmlJSRegisterContent createType(const QQmlJSScope::ConstPtr &type, int resultLookupIndex, ContentVariant variant, QQmlJSRegisterContent scope={})
QQmlJSRegisterContent createConversion(const QList< QQmlJSRegisterContent > &origins, const QQmlJSScope::ConstPtr &conversion, QQmlJSRegisterContent conversionScope, ContentVariant variant, QQmlJSRegisterContent scope)
QQmlJSRegisterContent createMethodCall(const QQmlJSMetaMethod &method, const QQmlJSScope::ConstPtr &returnType, QQmlJSRegisterContent scope)
Tracks the types for the QmlCompiler.
QTypeRevision revision() const
QString type() const
QTypeRevision version() const
bool isValid() const
QString package() const
Export()=default
Export(QString package, QString type, QTypeRevision version, QTypeRevision revision)
virtual QQmlSourceLocation sourceLocation() const
\inmodule QtQmlCompiler
Definition qqmlsa.h:53
Element attachedType() const
Returns the attached type if the content type of this binding is AttachedProperty,...
Definition qqmlsa.cpp:384
BindingType bindingType() const
Returns the type of this binding.
Definition qqmlsa.cpp:350
Element bindingScope() const
Returns the Element scope in which the binding is defined.
Definition qqmlsa.cpp:342
friend bool operator!=(const Binding &lhs, const Binding &rhs)
Returns true if lhs and rhs are not equal, and false otherwise.
Definition qqmlsa.h:107
bool hasUndefinedScriptValue() const
Returns whether this binding has script value type undefined like when it is assigned undefined.
Definition qqmlsa.cpp:451
Binding(const Binding &)
Creates a copy of other.
Definition qqmlsa.cpp:254
Binding & operator=(const Binding &)
Assigns other to this Binding instance.
Definition qqmlsa.cpp:266
bool isAttached() const
Returns true if this type is attached to another one, false otherwise.
Definition qqmlsa.cpp:375
bool hasObject() const
Returns true if this binding has an objects, otherwise returns false.
Definition qqmlsa.cpp:432
friend bool operator==(const Binding &lhs, const Binding &rhs)
Returns true if lhs and rhs are equal, and false otherwise.
Definition qqmlsa.h:103
static bool isLiteralBinding(BindingType)
Returns true if bindingType is a literal type, and false otherwise.
Definition qqmlsa.cpp:475
QString propertyName() const
Returns the name of the property bound with this binding.
Definition qqmlsa.cpp:367
Binding()
Constructs a new Binding object.
Definition qqmlsa.cpp:247
QString stringValue() const
Returns the associated string literal if the content type of this binding is StringLiteral,...
Definition qqmlsa.cpp:359
Element objectType() const
Returns the type of the associated object if the content type of this binding is Object,...
Definition qqmlsa.cpp:441
Binding & operator=(Binding &&) noexcept
Move-assigns other to this Binding instance.
Definition qqmlsa.cpp:282
QQmlSA::SourceLocation sourceLocation() const
Returns the location in the QML code where this binding is defined.
Definition qqmlsa.cpp:405
ScriptBindingKind scriptKind() const
Returns the kind of the associated script if the content type of this binding is Script,...
Definition qqmlsa.cpp:424
double numberValue() const
Returns the associated number if the content type of this binding is NumberLiteral,...
Definition qqmlsa.cpp:415
Element groupType() const
Returns the type of the property of this binding if it is a group property, otherwise returns an inva...
Definition qqmlsa.cpp:334
bool hasFunctionScriptValue() const
Returns whether this binding has script value type function like when it is assigned a (lambda) metho...
Definition qqmlsa.cpp:464
\inmodule QtQmlCompiler
Definition qqmlsa.h:378
QString replacement() const
Returns the replacement string of the edit.
Definition qqmlsa.cpp:2123
QString filename() const
Returns the file this edit applies to.
Definition qqmlsa.cpp:2105
DocumentEdit(const DocumentEdit &)
Creates a copy of other.
Definition qqmlsa.cpp:2058
\inmodule QtQmlCompiler
Definition qqmlsa.h:369
\inmodule QtQmlCompiler
Definition qqmlsa.h:203
\inmodule QtQmlCompiler
Definition qqmlsa.h:406
FixSuggestion(const QString &description, const QQmlSA::SourceLocation &location, const QList< DocumentEdit > &documentEdits={})
Creates a FixSuggestion object.
Definition qqmlsa.cpp:2214
void addDocumentEdit(const DocumentEdit &)
Adds a document edit to the list of edits for this fix.
Definition qqmlsa.cpp:2286
FixSuggestion(const FixSuggestion &)
Creates a copy of other.
Definition qqmlsa.cpp:2223
QString description() const
Returns the description of the fix.
Definition qqmlsa.cpp:2268
bool isAutoApplicable() const
Returns whether this suggested fix can be applied automatically.
Definition qqmlsa.cpp:2330
void setAutoApplicable(bool autoApplicable=true)
Sets autoApplicable to determine whether this suggested fix can be applied automatically.
Definition qqmlsa.cpp:2321
QList< DocumentEdit > documentEdits() const
Returns the list of document edits that applying this fix would make.
Definition qqmlsa.cpp:2295
\inmodule QtQmlCompiler
Definition qqmlsa.h:284
void emitWarning(QAnyStringView diagnostic, LoggerWarningId id)
Emits a warning message diagnostic about an issue of type id.
Definition qqmlsa.cpp:1269
Element resolveLiteralType(const Binding &binding)
Returns the element representing the type of literal in binding.
Definition qqmlsa.cpp:1382
void emitWarning(QAnyStringView diagnostic, LoggerWarningId id, QQmlSA::SourceLocation srcLocation, const QQmlSA::FixSuggestion &fix)
Emits a warning message diagnostic about an issue of type id located at srcLocation and with suggeste...
Definition qqmlsa.cpp:1292
void emitWarning(QAnyStringView diagnostic, LoggerWarningId id, QQmlSA::SourceLocation srcLocation)
Emits warning message diagnostic about an issue of type id located at srcLocation.
Definition qqmlsa.cpp:1278
Element resolveBuiltinType(QAnyStringView typeName) const
Returns the type of the built-in type identified by typeName.
Definition qqmlsa.cpp:1354
Element resolveAttached(QAnyStringView moduleName, QAnyStringView typeName)
Returns the attached type of typeName defined in module moduleName.
Definition qqmlsa.cpp:1372
QString resolveElementToId(const Element &element, const Element &context)
Returns the id of element in a given context.
Definition qqmlsa.cpp:1405
Element resolveTypeInFileScope(QAnyStringView typeName)
Returns the type corresponding to typeName inside the currently analysed file.
Definition qqmlsa.cpp:1307
QString sourceCode(QQmlSA::SourceLocation location)
Returns the source code located within location.
Definition qqmlsa.cpp:1417
Element resolveAttachedInFileScope(QAnyStringView typeName)
Returns the attached type corresponding to typeName used inside the currently analysed file.
Definition qqmlsa.cpp:1319
Element resolveIdToElement(QAnyStringView id, const Element &context)
Returns the element in context that has id id.
Definition qqmlsa.cpp:1393
Element resolveType(QAnyStringView moduleName, QAnyStringView typeName)
Returns the type of typeName defined in module moduleName.
Definition qqmlsa.cpp:1337
\inmodule QtQmlCompiler
Definition qqmlsa.h:341
\inmodule QtQmlCompiler
Definition qqmlsa.h:121
Method & operator=(Method &&) noexcept
Move-assigns other to this Method instance.
Definition qqmlsa.cpp:624
MethodType methodType() const
Returns the type of this method.
Definition qqmlsa.cpp:651
Method(const Method &)
Creates a copy of other.
Definition qqmlsa.cpp:598
Method()
Constructs a new Method object.
Definition qqmlsa.cpp:593
Method & operator=(const Method &)
Assigns other to this Method instance.
Definition qqmlsa.cpp:611
QString methodName() const
Returns the name of the this method.
Definition qqmlsa.cpp:642
\inmodule QtQmlCompiler
Definition qqmlsa.h:315
void analyze(const Element &root)
Runs the element passes over root and all its children.
Definition qqmlsa.cpp:1607
bool isCategoryEnabled(LoggerWarningId category) const
Returns true if warnings of category are enabled, false otherwise.
Definition qqmlsa.cpp:1718
bool registerPropertyPass(std::shared_ptr< PropertyPass > pass, QAnyStringView moduleName, QAnyStringView typeName, QAnyStringView propertyName=QAnyStringView(), bool allowInheritance=true)
Registers a static analysis pass for properties.
Definition qqmlsa.cpp:1509
std::unordered_map< quint32, Binding > bindingsByLocation() const
Returns bindings by their source location.
Definition qqmlsa.cpp:1948
bool hasImportedModule(QAnyStringView name) const
Returns true if the module named module has been imported by the QML to be analyzed,...
Definition qqmlsa.cpp:1710
\inmodule QtQmlCompiler
Definition qqmlsa.h:352
\inmodule QtQmlCompiler
Definition qqmlsa.h:170
Property(const Property &)
Creates a copy of other.
Definition qqmlsa.cpp:779
QString typeName() const
Returns the name of the type of this property.
Definition qqmlsa.cpp:824
bool isReadonly() const
Returns true if this property is read-only, false otherwise.
Definition qqmlsa.cpp:842
\inmodule QtQmlCompiler
MethodType
Definition qqmlsa.h:49
constexpr bool isFunctionScope(ScopeType type)
AccessSemantics
Definition qqmlsa.h:50
Combined button and popup list for selecting options.
Q_DECLARE_TYPEINFO(QDateTime::Data, Q_RELOCATABLE_TYPE)
Q_DECLARE_INTERFACE(QNetworkAccessBackendFactory, QNetworkAccessBackendFactory_iid)
static QString toNumericString(double value)
static QString messageTypeForMethod(const QString &method)
static QString derefContentPointer(const QString &contentPointer)
static bool canTypeBeAffectedBySideEffects(const QQmlJSTypeResolver *typeResolver, const QQmlJSRegisterContent &baseType)
#define BYTECODE_UNIMPLEMENTED()
#define INJECT_TRACE_INFO(function)
#define REJECT
static QString registerName(int registerIndex, int offset)
static QString minExpression(int argc)
static QString maxExpression(int argc)
static bool isTypeStorable(const QQmlJSTypeResolver *resolver, const QQmlJSScope::ConstPtr &type)
QQmlSA::MethodType QQmlJSMetaMethodType
QQmlJSMetaParameter QQmlJSMetaReturnType
ScriptBindingValueType
@ ScriptValue_Function
@ ScriptValue_Unknown
@ ScriptValue_Undefined
static void resetFactory(QDeferredSharedPointer< T > &pointer, QQmlJSImporter *importer, const QQmlJS::TypeReader &typeReader, const QString &filePath)
void resetFactoryImpl(QDeferredSharedPointer< T > &pointer, U &&factory)
#define QmlLintPluginInterface_iid
Definition qqmlsa.h:450
QList< Export > exports
QTypeRevision revision