84 friend QQmlSA::Element;
87 using Ptr = QDeferredSharedPointer<QQmlJSScope>;
88 using WeakPtr = QDeferredWeakPointer<QQmlJSScope>;
89 using ConstPtr = QDeferredSharedPointer<
const QQmlJSScope>;
90 using WeakConstPtr = QDeferredWeakPointer<
const QQmlJSScope>;
92 using AccessSemantics = QQmlSA::AccessSemantics;
93 using ScopeType = QQmlSA::ScopeType;
95 using InlineComponentNameType = QString;
96 using RootDocumentNameType = std::monostate;
98
99
100 using InlineComponentOrDocumentRootName =
101 std::variant<InlineComponentNameType, RootDocumentNameType>;
106 JavaScriptBuiltin = 0x4,
111 InlineComponent = 0x80,
112 WrappedInImplicitComponent = 0x100,
113 HasBaseTypeError = 0x200,
114 ExtensionIsNamespace = 0x400,
115 IsListProperty = 0x800,
117 ExtensionIsJavaScript = 0x2000,
118 EnforcesScopedEnums = 0x4000,
119 FileRootComponent = 0x8000,
120 AssignedToUnknownProperty = 0x10000,
122 Q_DECLARE_FLAGS(Flags, Flag)
124 using Export = QQmlJS::Export;
125 template <
typename Pointer>
126 using ImportedScope = QQmlJS::ImportedScope<Pointer>;
127 template <
typename Pointer>
128 using ExportedScope = QQmlJS::ExportedScope<Pointer>;
130 struct JavaScriptIdentifier
139 Kind kind = FunctionScoped;
140 QQmlJS::SourceLocation location;
141 std::optional<QString> typeName;
142 bool isConst =
false;
143 QQmlJSScope::WeakConstPtr scope = {};
146 enum BindingTargetSpecifier {
147 SimplePropertyTarget,
149 UnnamedPropertyTarget
152 template <
typename Key,
typename Value>
153 using QMultiHashRange = std::pair<
typename QMultiHash<Key, Value>::iterator,
154 typename QMultiHash<Key, Value>::iterator>;
156 static QQmlJSScope::Ptr create() {
return QSharedPointer<QQmlJSScope>(
new QQmlJSScope); }
157 static QQmlJSScope::Ptr clone(
const QQmlJSScope::ConstPtr &origin);
158 static QQmlJSScope::Ptr resetForReparse(QQmlJSScope::Ptr &&scope);
160 static void cloneInto(QQmlJSScope::Ptr &origin,
161 const QQmlJSScope::Ptr &target)
163 *target = std::move(*clone(origin));
166 static QQmlJSScope::ConstPtr findCurrentQMLScope(
const QQmlJSScope::ConstPtr &scope);
168 QQmlJSScope::Ptr parentScope();
169 QQmlJSScope::ConstPtr parentScope()
const;
170 static void reparent(
const QQmlJSScope::Ptr &parentScope,
const QQmlJSScope::Ptr &childScope);
172 void insertJSIdentifier(
const QString &name,
const JavaScriptIdentifier &identifier);
173 QHash<QString, JavaScriptIdentifier> ownJSIdentifiers()
const;
174 void insertPropertyIdentifier(
const QQmlJSMetaProperty &prop);
176 ScopeType scopeType()
const {
return m_scopeType; }
177 void setScopeType(ScopeType type) { m_scopeType = type; }
179 void addOwnMethod(
const QQmlJSMetaMethod &method) { m_methods.insert(method.methodName(), method); }
180 QMultiHashRange<QString, QQmlJSMetaMethod> mutableOwnMethodsRange(
const QString &name)
182 return m_methods.equal_range(name);
184 QMultiHash<QString, QQmlJSMetaMethod> ownMethods()
const {
return m_methods; }
185 QList<QQmlJSMetaMethod> ownMethods(
const QString &name)
const {
return m_methods.values(name); }
186 bool hasOwnMethod(
const QString &name)
const {
return m_methods.contains(name); }
188 bool hasMethod(
const QString &name)
const;
189 QHash<QString, QQmlJSMetaMethod> methods()
const;
190 QList<QQmlJSMetaMethod> methods(
const QString &name)
const;
191 QList<QQmlJSMetaMethod> methods(
const QString &name, QQmlJSMetaMethodType type)
const;
193 void addOwnEnumeration(
const QQmlJSMetaEnum &enumeration) { m_enumerations.insert(enumeration.name(), enumeration); }
194 QHash<QString, QQmlJSMetaEnum> ownEnumerations()
const {
return m_enumerations; }
195 QQmlJSMetaEnum ownEnumeration(
const QString &name)
const {
return m_enumerations.value(name); }
196 bool hasOwnEnumeration(
const QString &name)
const {
return m_enumerations.contains(name); }
198 bool hasEnumeration(
const QString &name)
const;
199 bool hasEnumerationKey(
const QString &name)
const;
200 bool hasOwnEnumerationKey(
const QString &name)
const;
201 QQmlJSMetaEnum enumeration(
const QString &name)
const;
202 QHash<QString, QQmlJSMetaEnum> enumerations()
const;
204 void setAnnotations(
const QList<QQmlJSAnnotation> &annotation) { m_annotations = std::move(annotation); }
205 const QList<QQmlJSAnnotation> &annotations()
const {
return m_annotations; }
207 QString filePath()
const {
return m_filePath; }
208 void setFilePath(
const QString &file) { m_filePath = file; }
210 quint32 lineNumber()
const {
return m_sourceLocation.startLine; }
211 void setLineNumber(quint32 lineNumber);
215 QString internalName()
const {
return m_internalName; }
216 void setInternalName(
const QString &internalName) { m_internalName = internalName; }
217 QString augmentedInternalName()
const;
220 static QString prettyName(QAnyStringView name);
222 enum class IsComponentRoot : quint8 { No = 0, Yes, Maybe };
223 IsComponentRoot componentRootStatus()
const;
225 void setAliases(
const QStringList &aliases) { m_aliases = aliases; }
226 QStringList aliases()
const {
return m_aliases; }
228 void setInterfaceNames(
const QStringList& interfaces) { m_interfaceNames = interfaces; }
229 QStringList interfaceNames()
const {
return m_interfaceNames; }
231 bool hasInterface(
const QString &name)
const;
232 bool hasOwnInterface(
const QString &name)
const {
return m_interfaceNames.contains(name); }
234 void setOwnDeferredNames(
const QStringList &names) { m_ownDeferredNames = names; }
235 QStringList ownDeferredNames()
const {
return m_ownDeferredNames; }
236 void setOwnImmediateNames(
const QStringList &names) { m_ownImmediateNames = names; }
237 QStringList ownImmediateNames()
const {
return m_ownImmediateNames; }
239 bool isNameDeferred(
const QString &name)
const;
243 void setBaseTypeName(
const QString &baseTypeName);
244 QString baseTypeName()
const;
246 QQmlJSScope::ConstPtr baseType()
const {
return m_baseType.scope; }
247 QTypeRevision baseTypeRevision()
const {
return m_baseType.revision; }
249 QString moduleName()
const;
250 QString ownModuleName()
const {
return m_moduleName; }
251 void setOwnModuleName(
const QString &moduleName) { m_moduleName = moduleName; }
253 void clearBaseType() { m_baseType = {}; }
254 void setBaseTypeError(
const QString &baseTypeError);
255 QString baseTypeError()
const;
257 void addOwnProperty(
const QQmlJSMetaProperty &prop) { m_properties.insert(prop.propertyName(), prop); }
258 QHash<QString, QQmlJSMetaProperty> ownProperties()
const {
return m_properties; }
259 QQmlJSMetaProperty ownProperty(
const QString &name)
const {
return m_properties.value(name); }
260 bool hasOwnProperty(
const QString &name)
const {
return m_properties.contains(name); }
262 bool hasProperty(
const QString &name)
const;
263 QQmlJSMetaProperty property(
const QString &name)
const;
264 QHash<QString, QQmlJSMetaProperty> properties()
const;
266 void setPropertyLocallyRequired(
const QString &name,
bool isRequired);
267 bool isPropertyRequired(
const QString &name)
const;
268 bool isPropertyLocallyRequired(
const QString &name)
const;
270 void addOwnPropertyBinding(
271 const QQmlJSMetaPropertyBinding &binding,
272 BindingTargetSpecifier specifier = BindingTargetSpecifier::SimplePropertyTarget);
273 QMultiHash<QString, QQmlJSMetaPropertyBinding> ownPropertyBindings()
const;
274 std::pair<QMultiHash<QString, QQmlJSMetaPropertyBinding>::const_iterator,
275 QMultiHash<QString, QQmlJSMetaPropertyBinding>::const_iterator>
276 ownPropertyBindings(
const QString &name)
const;
277 QList<QQmlJSMetaPropertyBinding> ownPropertyBindingsInQmlIROrder()
const;
278 bool hasOwnPropertyBindings(
const QString &name)
const;
280 bool hasPropertyBindings(
const QString &name)
const;
281 QList<QQmlJSMetaPropertyBinding> propertyBindings(
const QString &name)
const;
283 struct AnnotatedScope;
284 static AnnotatedScope ownerOfProperty(
const QQmlJSScope::ConstPtr &self,
const QString &name);
285 static AnnotatedScope ownerOfMethod(
const QQmlJSScope::ConstPtr &self,
const QString &name);
287 bool isResolved()
const;
288 bool isFullyResolved()
const;
290 QString ownDefaultPropertyName()
const {
return m_defaultPropertyName; }
291 void setOwnDefaultPropertyName(
const QString &name) { m_defaultPropertyName = name; }
292 QString defaultPropertyName()
const;
294 QString ownParentPropertyName()
const {
return m_parentPropertyName; }
295 void setOwnParentPropertyName(
const QString &name) { m_parentPropertyName = name; }
296 QString parentPropertyName()
const;
298 QString ownAttachedTypeName()
const {
return m_attachedTypeName; }
299 void setOwnAttachedTypeName(
const QString &name) { m_attachedTypeName = name; }
300 QQmlJSScope::ConstPtr ownAttachedType()
const {
return m_attachedType; }
302 QString attachedTypeName()
const;
303 QQmlJSScope::ConstPtr attachedType()
const;
305 QString extensionTypeName()
const {
return m_extensionTypeName; }
306 void setExtensionTypeName(
const QString &name) { m_extensionTypeName = name; }
313 struct AnnotatedScope
315 QQmlJSScope::ConstPtr scope;
316 ExtensionKind extensionSpecifier = NotExtension;
318 AnnotatedScope extensionType()
const;
320 QString elementTypeName()
const {
return m_elementTypeName; }
321 void setElementTypeName(
const QString &name) { m_elementTypeName = name; }
322 QQmlJSScope::ConstPtr elementType()
const {
return m_elementType; }
323 QQmlJSScope::ConstPtr listType()
const {
return m_listType; }
324 QQmlJSScope::Ptr listType() {
return m_listType; }
326 void addOwnRuntimeFunctionIndex(QQmlJSMetaMethod::AbsoluteFunctionIndex index);
327 QQmlJSMetaMethod::AbsoluteFunctionIndex
328 ownRuntimeFunctionIndex(QQmlJSMetaMethod::RelativeFunctionIndex index)
const;
332
333
334
335
336 bool isComposite()
const {
return m_flags.testFlag(Composite); }
337 void setIsComposite(
bool v) { m_flags.setFlag(Composite, v); }
340
341
342
343
344 bool isJavaScriptBuiltin()
const {
return m_flags.testFlag(JavaScriptBuiltin); }
345 void setIsJavaScriptBuiltin(
bool v) { m_flags.setFlag(JavaScriptBuiltin, v); }
347 bool isScript()
const {
return m_flags.testFlag(Script); }
348 void setIsScript(
bool v) { m_flags.setFlag(Script, v); }
350 bool hasCustomParser()
const {
return m_flags.testFlag(CustomParser); }
351 void setHasCustomParser(
bool v) { m_flags.setFlag(CustomParser, v); }
353 bool isArrayScope()
const {
return m_flags.testFlag(Array); }
354 void setIsArrayScope(
bool v) { m_flags.setFlag(Array, v); }
356 bool isInlineComponent()
const {
return m_flags.testFlag(InlineComponent); }
357 void setIsInlineComponent(
bool v) { m_flags.setFlag(InlineComponent, v); }
359 bool isWrappedInImplicitComponent()
const {
return m_flags.testFlag(WrappedInImplicitComponent); }
360 void setIsWrappedInImplicitComponent(
bool v) { m_flags.setFlag(WrappedInImplicitComponent, v); }
362 bool isAssignedToUnknownProperty()
const {
return m_flags.testFlag(AssignedToUnknownProperty); }
363 void setAssignedToUnknownProperty(
bool v) { m_flags.setFlag(AssignedToUnknownProperty, v); }
365 bool extensionIsJavaScript()
const {
return m_flags.testFlag(ExtensionIsJavaScript); }
366 void setExtensionIsJavaScript(
bool v) { m_flags.setFlag(ExtensionIsJavaScript, v); }
368 bool extensionIsNamespace()
const {
return m_flags.testFlag(ExtensionIsNamespace); }
369 void setExtensionIsNamespace(
bool v) { m_flags.setFlag(ExtensionIsNamespace, v); }
371 bool isListProperty()
const {
return m_flags.testFlag(IsListProperty); }
372 void setIsListProperty(
bool v) { m_flags.setFlag(IsListProperty, v); }
374 bool isSingleton()
const {
return m_flags.testFlag(Singleton); }
375 void setIsSingleton(
bool v) { m_flags.setFlag(Singleton, v); }
377 bool enforcesScopedEnums()
const;
378 void setEnforcesScopedEnumsFlag(
bool v) { m_flags.setFlag(EnforcesScopedEnums, v); }
380 bool isCreatable()
const;
381 void setCreatableFlag(
bool v) { m_flags.setFlag(Creatable, v); }
383 bool isStructured()
const;
384 void setStructuredFlag(
bool v) { m_flags.setFlag(Structured, v); }
386 bool isFileRootComponent()
const {
return m_flags.testFlag(FileRootComponent); }
387 void setIsRootFileComponentFlag(
bool v) { m_flags.setFlag(FileRootComponent, v); }
389 void setAccessSemantics(AccessSemantics semantics) { m_semantics = semantics; }
390 AccessSemantics accessSemantics()
const {
return m_semantics; }
391 bool isReferenceType()
const {
return m_semantics == QQmlJSScope::AccessSemantics::Reference; }
392 bool isValueType()
const {
return m_semantics == QQmlJSScope::AccessSemantics::Value; }
394 std::optional<JavaScriptIdentifier> jsIdentifier(
const QString &id)
const;
395 std::optional<JavaScriptIdentifier> ownJSIdentifier(
const QString &id)
const;
397 QQmlJS::ChildScopesIterator childScopesBegin()
const {
return m_childScopes.constBegin(); }
398 QQmlJS::ChildScopesIterator childScopesEnd()
const {
return m_childScopes.constEnd(); }
400 void setInlineComponentName(
const QString &inlineComponentName);
401 std::optional<QString> inlineComponentName()
const;
402 InlineComponentOrDocumentRootName enclosingInlineComponentName()
const;
404 QList<QQmlJSScope::Ptr> childScopes();
406 QList<QQmlJSScope::ConstPtr> childScopes()
const;
408 static QTypeRevision resolveTypes(
409 const Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
410 QSet<QString> *usedTypes =
nullptr);
411 static void resolveNonEnumTypes(
412 const QQmlJSScope::Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
413 QSet<QString> *usedTypes =
nullptr);
414 static void resolveEnums(
415 const QQmlJSScope::Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
416 QSet<QString> *usedTypes =
nullptr);
417 static void resolveList(
418 const QQmlJSScope::Ptr &self,
const QQmlJSScope::ConstPtr &arrayType);
419 static void resolveGroup(
420 const QQmlJSScope::Ptr &self,
const QQmlJSScope::ConstPtr &baseType,
421 const QQmlJS::ContextualTypes &contextualTypes,
422 QSet<QString> *usedTypes =
nullptr);
424 void setSourceLocation(
const QQmlJS::SourceLocation &sourceLocation);
425 QQmlJS::SourceLocation sourceLocation()
const;
427 void setIdSourceLocation(
const QQmlJS::SourceLocation &sourceLocation);
428 QQmlJS::SourceLocation idSourceLocation()
const;
430 static QQmlJSScope::ConstPtr nonCompositeBaseType(
const QQmlJSScope::ConstPtr &type);
433 nonCompositeBaseRevision(
const ImportedScope<QQmlJSScope::ConstPtr> &scope);
435 bool isSameType(
const QQmlJSScope::ConstPtr &otherScope)
const;
436 bool inherits(
const QQmlJSScope::ConstPtr &base)
const;
437 bool canAssign(
const QQmlJSScope::ConstPtr &derived)
const;
439 bool isInCustomParserParent()
const;
442 static ImportedScope<QQmlJSScope::ConstPtr> findType(
const QString &name,
443 const QQmlJS::ContextualTypes &contextualTypes,
444 QSet<QString> *usedTypes =
nullptr);
446 static QQmlSA::Element createQQmlSAElement(
const ConstPtr &);
447 static QQmlSA::Element createQQmlSAElement(ConstPtr &&);
448 static const QQmlJSScope::ConstPtr &scope(
const QQmlSA::Element &);
449 static constexpr qsizetype sizeofQQmlSAElement() {
return QQmlSA::Element::sizeofElement; }
453 explicit QQmlJSScope(
const QString &internalName);
454 QQmlJSScope(QQmlJSScope &&) =
default;
455 QQmlJSScope &operator=(QQmlJSScope &&) =
default;
457
458
459
460
461 template <
typename T>
462 friend class QTypeInfo;
463 struct QmlIRCompatibilityBindingData
465 QmlIRCompatibilityBindingData() =
default;
466 QmlIRCompatibilityBindingData(
const QString &name, quint32 offset)
467 : propertyName(name), sourceLocationOffset(offset)
470 QString propertyName;
471 quint32 sourceLocationOffset = 0;
474 QQmlJSScope() =
default;
475 QQmlJSScope(
const QQmlJSScope &) =
default;
476 QQmlJSScope &operator=(
const QQmlJSScope &) =
default;
477 static QTypeRevision resolveType(
478 const QQmlJSScope::Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
479 QSet<QString> *usedTypes);
480 static void updateChildScope(
481 const QQmlJSScope::Ptr &childScope,
const QQmlJSScope::Ptr &self,
482 const QQmlJS::ContextualTypes &contextualTypes, QSet<QString> *usedTypes);
484 void addOwnPropertyBindingInQmlIROrder(
const QQmlJSMetaPropertyBinding &binding,
485 BindingTargetSpecifier specifier);
486 bool hasEnforcesScopedEnumsFlag()
const {
return m_flags & EnforcesScopedEnums; }
487 bool hasCreatableFlag()
const {
return m_flags & Creatable; }
488 bool hasStructuredFlag()
const {
return m_flags & Structured; }
490 QHash<QString, JavaScriptIdentifier> m_jsIdentifiers;
492 QMultiHash<QString, QQmlJSMetaMethod> m_methods;
493 QHash<QString, QQmlJSMetaProperty> m_properties;
494 QMultiHash<QString, QQmlJSMetaPropertyBinding> m_propertyBindings;
498 QList<QmlIRCompatibilityBindingData> m_propertyBindingsArray;
501 QList<QQmlJSMetaMethod::AbsoluteFunctionIndex> m_runtimeFunctionIndices;
503 QHash<QString, QQmlJSMetaEnum> m_enumerations;
505 QList<QQmlJSAnnotation> m_annotations;
506 QList<QQmlJSScope::Ptr> m_childScopes;
507 QQmlJSScope::WeakPtr m_parentScope;
510 QString m_internalName;
511 QString m_baseTypeNameOrError;
515 ImportedScope<QQmlJSScope::WeakConstPtr> m_baseType;
517 ScopeType m_scopeType = ScopeType::QMLScope;
518 QStringList m_aliases;
519 QStringList m_interfaceNames;
520 QStringList m_ownDeferredNames;
521 QStringList m_ownImmediateNames;
523 QString m_defaultPropertyName;
524 QString m_parentPropertyName;
526
527
528
529 QString m_attachedTypeName;
530 QStringList m_requiredPropertyNames;
531 QQmlJSScope::WeakConstPtr m_attachedType;
534
535
536
537 QString m_elementTypeName;
538 QQmlJSScope::WeakConstPtr m_elementType;
539 QQmlJSScope::Ptr m_listType;
542
543
544
545
546
547
548 QString m_extensionTypeName;
549 QQmlJSScope::WeakConstPtr m_extensionType;
551 Flags m_flags = Creatable;
552 AccessSemantics m_semantics = AccessSemantics::Reference;
554 QQmlJS::SourceLocation m_sourceLocation;
555 QQmlJS::SourceLocation m_idSourceLocation;
557 QString m_moduleName;
559 std::optional<QString> m_inlineComponentName;