82 friend QQmlSA::Element;
85 using Ptr = QDeferredSharedPointer<QQmlJSScope>;
86 using WeakPtr = QDeferredWeakPointer<QQmlJSScope>;
87 using ConstPtr = QDeferredSharedPointer<
const QQmlJSScope>;
88 using WeakConstPtr = QDeferredWeakPointer<
const QQmlJSScope>;
90 using AccessSemantics = QQmlSA::AccessSemantics;
91 using ScopeType = QQmlSA::ScopeType;
93 using InlineComponentNameType = QString;
94 using RootDocumentNameType = std::monostate;
96
97
98 using InlineComponentOrDocumentRootName =
99 std::variant<InlineComponentNameType, RootDocumentNameType>;
104 JavaScriptBuiltin = 0x4,
109 InlineComponent = 0x80,
110 WrappedInImplicitComponent = 0x100,
111 HasBaseTypeError = 0x200,
112 ExtensionIsNamespace = 0x400,
113 IsListProperty = 0x800,
115 ExtensionIsJavaScript = 0x2000,
116 EnforcesScopedEnums = 0x4000,
117 FileRootComponent = 0x8000,
118 AssignedToUnknownProperty = 0x10000,
120 Q_DECLARE_FLAGS(Flags, Flag)
122 using Export = QQmlJS::Export;
123 template <
typename Pointer>
124 using ImportedScope = QQmlJS::ImportedScope<Pointer>;
125 template <
typename Pointer>
126 using ExportedScope = QQmlJS::ExportedScope<Pointer>;
128 struct JavaScriptIdentifier
137 Kind kind = FunctionScoped;
138 QQmlJS::SourceLocation location;
139 std::optional<QString> typeName;
140 bool isConst =
false;
141 QQmlJSScope::WeakConstPtr scope = {};
144 enum BindingTargetSpecifier {
145 SimplePropertyTarget,
147 UnnamedPropertyTarget
150 template <
typename Key,
typename Value>
151 using QMultiHashRange = std::pair<
typename QMultiHash<Key, Value>::iterator,
152 typename QMultiHash<Key, Value>::iterator>;
154 static QQmlJSScope::Ptr create() {
return QSharedPointer<QQmlJSScope>(
new QQmlJSScope); }
155 static QQmlJSScope::Ptr clone(
const QQmlJSScope::ConstPtr &origin);
157 static void cloneInto(QQmlJSScope::Ptr &origin,
158 const QQmlJSScope::Ptr &target)
160 *target = std::move(*clone(origin));
164 void resetForReparse() {
165 const QString moduleName =
this->moduleName();
166 *
this = QQmlJSScope {
this->internalName() };
167 setOwnModuleName(moduleName);
170 static QQmlJSScope::ConstPtr findCurrentQMLScope(
const QQmlJSScope::ConstPtr &scope);
172 QQmlJSScope::Ptr parentScope();
173 QQmlJSScope::ConstPtr parentScope()
const;
174 static void reparent(
const QQmlJSScope::Ptr &parentScope,
const QQmlJSScope::Ptr &childScope);
176 void insertJSIdentifier(
const QString &name,
const JavaScriptIdentifier &identifier);
177 QHash<QString, JavaScriptIdentifier> ownJSIdentifiers()
const;
178 void insertPropertyIdentifier(
const QQmlJSMetaProperty &prop);
180 ScopeType scopeType()
const {
return m_scopeType; }
181 void setScopeType(ScopeType type) { m_scopeType = type; }
183 void addOwnMethod(
const QQmlJSMetaMethod &method) { m_methods.insert(method.methodName(), method); }
184 QMultiHashRange<QString, QQmlJSMetaMethod> mutableOwnMethodsRange(
const QString &name)
186 return m_methods.equal_range(name);
188 QMultiHash<QString, QQmlJSMetaMethod> ownMethods()
const {
return m_methods; }
189 QList<QQmlJSMetaMethod> ownMethods(
const QString &name)
const {
return m_methods.values(name); }
190 bool hasOwnMethod(
const QString &name)
const {
return m_methods.contains(name); }
192 bool hasMethod(
const QString &name)
const;
193 QHash<QString, QQmlJSMetaMethod> methods()
const;
194 QList<QQmlJSMetaMethod> methods(
const QString &name)
const;
195 QList<QQmlJSMetaMethod> methods(
const QString &name, QQmlJSMetaMethodType type)
const;
197 void addOwnEnumeration(
const QQmlJSMetaEnum &enumeration) { m_enumerations.insert(enumeration.name(), enumeration); }
198 QHash<QString, QQmlJSMetaEnum> ownEnumerations()
const {
return m_enumerations; }
199 QQmlJSMetaEnum ownEnumeration(
const QString &name)
const {
return m_enumerations.value(name); }
200 bool hasOwnEnumeration(
const QString &name)
const {
return m_enumerations.contains(name); }
202 bool hasEnumeration(
const QString &name)
const;
203 bool hasEnumerationKey(
const QString &name)
const;
204 bool hasOwnEnumerationKey(
const QString &name)
const;
205 QQmlJSMetaEnum enumeration(
const QString &name)
const;
206 QHash<QString, QQmlJSMetaEnum> enumerations()
const;
208 void setAnnotations(
const QList<QQmlJSAnnotation> &annotation) { m_annotations = std::move(annotation); }
209 const QList<QQmlJSAnnotation> &annotations()
const {
return m_annotations; }
211 QString filePath()
const {
return m_filePath; }
212 void setFilePath(
const QString &file) { m_filePath = file; }
214 quint32 lineNumber()
const {
return m_sourceLocation.startLine; }
215 void setLineNumber(quint32 lineNumber);
219 QString internalName()
const {
return m_internalName; }
220 void setInternalName(
const QString &internalName) { m_internalName = internalName; }
221 QString augmentedInternalName()
const;
224 static QString prettyName(QAnyStringView name);
226 enum class IsComponentRoot : quint8 { No = 0, Yes, Maybe };
227 IsComponentRoot componentRootStatus()
const;
229 void setAliases(
const QStringList &aliases) { m_aliases = aliases; }
230 QStringList aliases()
const {
return m_aliases; }
232 void setInterfaceNames(
const QStringList& interfaces) { m_interfaceNames = interfaces; }
233 QStringList interfaceNames()
const {
return m_interfaceNames; }
235 bool hasInterface(
const QString &name)
const;
236 bool hasOwnInterface(
const QString &name)
const {
return m_interfaceNames.contains(name); }
238 void setOwnDeferredNames(
const QStringList &names) { m_ownDeferredNames = names; }
239 QStringList ownDeferredNames()
const {
return m_ownDeferredNames; }
240 void setOwnImmediateNames(
const QStringList &names) { m_ownImmediateNames = names; }
241 QStringList ownImmediateNames()
const {
return m_ownImmediateNames; }
243 bool isNameDeferred(
const QString &name)
const;
247 void setBaseTypeName(
const QString &baseTypeName);
248 QString baseTypeName()
const;
250 QQmlJSScope::ConstPtr baseType()
const {
return m_baseType.scope; }
251 QTypeRevision baseTypeRevision()
const {
return m_baseType.revision; }
253 QString moduleName()
const;
254 QString ownModuleName()
const {
return m_moduleName; }
255 void setOwnModuleName(
const QString &moduleName) { m_moduleName = moduleName; }
257 void clearBaseType() { m_baseType = {}; }
258 void setBaseTypeError(
const QString &baseTypeError);
259 QString baseTypeError()
const;
261 void addOwnProperty(
const QQmlJSMetaProperty &prop) { m_properties.insert(prop.propertyName(), prop); }
262 QHash<QString, QQmlJSMetaProperty> ownProperties()
const {
return m_properties; }
263 QQmlJSMetaProperty ownProperty(
const QString &name)
const {
return m_properties.value(name); }
264 bool hasOwnProperty(
const QString &name)
const {
return m_properties.contains(name); }
266 bool hasProperty(
const QString &name)
const;
267 QQmlJSMetaProperty property(
const QString &name)
const;
268 QHash<QString, QQmlJSMetaProperty> properties()
const;
270 void setPropertyLocallyRequired(
const QString &name,
bool isRequired);
271 bool isPropertyRequired(
const QString &name)
const;
272 bool isPropertyLocallyRequired(
const QString &name)
const;
274 void addOwnPropertyBinding(
275 const QQmlJSMetaPropertyBinding &binding,
276 BindingTargetSpecifier specifier = BindingTargetSpecifier::SimplePropertyTarget);
277 QMultiHash<QString, QQmlJSMetaPropertyBinding> ownPropertyBindings()
const;
278 std::pair<QMultiHash<QString, QQmlJSMetaPropertyBinding>::const_iterator,
279 QMultiHash<QString, QQmlJSMetaPropertyBinding>::const_iterator>
280 ownPropertyBindings(
const QString &name)
const;
281 QList<QQmlJSMetaPropertyBinding> ownPropertyBindingsInQmlIROrder()
const;
282 bool hasOwnPropertyBindings(
const QString &name)
const;
284 bool hasPropertyBindings(
const QString &name)
const;
285 QList<QQmlJSMetaPropertyBinding> propertyBindings(
const QString &name)
const;
287 struct AnnotatedScope;
288 static AnnotatedScope ownerOfProperty(
const QQmlJSScope::ConstPtr &self,
const QString &name);
289 static AnnotatedScope ownerOfMethod(
const QQmlJSScope::ConstPtr &self,
const QString &name);
291 bool isResolved()
const;
292 bool isFullyResolved()
const;
294 QString ownDefaultPropertyName()
const {
return m_defaultPropertyName; }
295 void setOwnDefaultPropertyName(
const QString &name) { m_defaultPropertyName = name; }
296 QString defaultPropertyName()
const;
298 QString ownParentPropertyName()
const {
return m_parentPropertyName; }
299 void setOwnParentPropertyName(
const QString &name) { m_parentPropertyName = name; }
300 QString parentPropertyName()
const;
302 QString ownAttachedTypeName()
const {
return m_attachedTypeName; }
303 void setOwnAttachedTypeName(
const QString &name) { m_attachedTypeName = name; }
304 QQmlJSScope::ConstPtr ownAttachedType()
const {
return m_attachedType; }
306 QString attachedTypeName()
const;
307 QQmlJSScope::ConstPtr attachedType()
const;
309 QString extensionTypeName()
const {
return m_extensionTypeName; }
310 void setExtensionTypeName(
const QString &name) { m_extensionTypeName = name; }
317 struct AnnotatedScope
319 QQmlJSScope::ConstPtr scope;
320 ExtensionKind extensionSpecifier = NotExtension;
322 AnnotatedScope extensionType()
const;
324 QString elementTypeName()
const {
return m_elementTypeName; }
325 void setElementTypeName(
const QString &name) { m_elementTypeName = name; }
326 QQmlJSScope::ConstPtr elementType()
const {
return m_elementType; }
327 QQmlJSScope::ConstPtr listType()
const {
return m_listType; }
328 QQmlJSScope::Ptr listType() {
return m_listType; }
330 void addOwnRuntimeFunctionIndex(QQmlJSMetaMethod::AbsoluteFunctionIndex index);
331 QQmlJSMetaMethod::AbsoluteFunctionIndex
332 ownRuntimeFunctionIndex(QQmlJSMetaMethod::RelativeFunctionIndex index)
const;
336
337
338
339
340 bool isComposite()
const {
return m_flags.testFlag(Composite); }
341 void setIsComposite(
bool v) { m_flags.setFlag(Composite, v); }
344
345
346
347
348 bool isJavaScriptBuiltin()
const {
return m_flags.testFlag(JavaScriptBuiltin); }
349 void setIsJavaScriptBuiltin(
bool v) { m_flags.setFlag(JavaScriptBuiltin, v); }
351 QString metaObjectHash()
const {
return m_metaObjectHash; }
352 void setMetaObjectHash(
const QString &hash) { m_metaObjectHash = hash; }
354 bool isScript()
const {
return m_flags.testFlag(Script); }
355 void setIsScript(
bool v) { m_flags.setFlag(Script, v); }
357 bool hasCustomParser()
const {
return m_flags.testFlag(CustomParser); }
358 void setHasCustomParser(
bool v) { m_flags.setFlag(CustomParser, v); }
360 bool isArrayScope()
const {
return m_flags.testFlag(Array); }
361 void setIsArrayScope(
bool v) { m_flags.setFlag(Array, v); }
363 bool isInlineComponent()
const {
return m_flags.testFlag(InlineComponent); }
364 void setIsInlineComponent(
bool v) { m_flags.setFlag(InlineComponent, v); }
366 bool isWrappedInImplicitComponent()
const {
return m_flags.testFlag(WrappedInImplicitComponent); }
367 void setIsWrappedInImplicitComponent(
bool v) { m_flags.setFlag(WrappedInImplicitComponent, v); }
369 bool isAssignedToUnknownProperty()
const {
return m_flags.testFlag(AssignedToUnknownProperty); }
370 void setAssignedToUnknownProperty(
bool v) { m_flags.setFlag(AssignedToUnknownProperty, v); }
372 bool extensionIsJavaScript()
const {
return m_flags.testFlag(ExtensionIsJavaScript); }
373 void setExtensionIsJavaScript(
bool v) { m_flags.setFlag(ExtensionIsJavaScript, v); }
375 bool extensionIsNamespace()
const {
return m_flags.testFlag(ExtensionIsNamespace); }
376 void setExtensionIsNamespace(
bool v) { m_flags.setFlag(ExtensionIsNamespace, v); }
378 bool isListProperty()
const {
return m_flags.testFlag(IsListProperty); }
379 void setIsListProperty(
bool v) { m_flags.setFlag(IsListProperty, v); }
381 bool isSingleton()
const {
return m_flags.testFlag(Singleton); }
382 void setIsSingleton(
bool v) { m_flags.setFlag(Singleton, v); }
384 bool enforcesScopedEnums()
const;
385 void setEnforcesScopedEnumsFlag(
bool v) { m_flags.setFlag(EnforcesScopedEnums, v); }
387 bool isCreatable()
const;
388 void setCreatableFlag(
bool v) { m_flags.setFlag(Creatable, v); }
390 bool isStructured()
const;
391 void setStructuredFlag(
bool v) { m_flags.setFlag(Structured, v); }
393 bool isFileRootComponent()
const {
return m_flags.testFlag(FileRootComponent); }
394 void setIsRootFileComponentFlag(
bool v) { m_flags.setFlag(FileRootComponent, v); }
396 void setAccessSemantics(AccessSemantics semantics) { m_semantics = semantics; }
397 AccessSemantics accessSemantics()
const {
return m_semantics; }
398 bool isReferenceType()
const {
return m_semantics == QQmlJSScope::AccessSemantics::Reference; }
399 bool isValueType()
const {
return m_semantics == QQmlJSScope::AccessSemantics::Value; }
401 std::optional<JavaScriptIdentifier> jsIdentifier(
const QString &id)
const;
402 std::optional<JavaScriptIdentifier> ownJSIdentifier(
const QString &id)
const;
404 QQmlJS::ChildScopesIterator childScopesBegin()
const {
return m_childScopes.constBegin(); }
405 QQmlJS::ChildScopesIterator childScopesEnd()
const {
return m_childScopes.constEnd(); }
407 void setInlineComponentName(
const QString &inlineComponentName);
408 std::optional<QString> inlineComponentName()
const;
409 InlineComponentOrDocumentRootName enclosingInlineComponentName()
const;
411 QList<QQmlJSScope::Ptr> childScopes();
413 QList<QQmlJSScope::ConstPtr> childScopes()
const;
415 static QTypeRevision resolveTypes(
416 const Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
417 QSet<QString> *usedTypes =
nullptr);
418 static void resolveNonEnumTypes(
419 const QQmlJSScope::Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
420 QSet<QString> *usedTypes =
nullptr);
421 static void resolveEnums(
422 const QQmlJSScope::Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
423 QSet<QString> *usedTypes =
nullptr);
424 static void resolveList(
425 const QQmlJSScope::Ptr &self,
const QQmlJSScope::ConstPtr &arrayType);
426 static void resolveGroup(
427 const QQmlJSScope::Ptr &self,
const QQmlJSScope::ConstPtr &baseType,
428 const QQmlJS::ContextualTypes &contextualTypes,
429 QSet<QString> *usedTypes =
nullptr);
431 void setSourceLocation(
const QQmlJS::SourceLocation &sourceLocation);
432 QQmlJS::SourceLocation sourceLocation()
const;
434 void setIdSourceLocation(
const QQmlJS::SourceLocation &sourceLocation);
435 QQmlJS::SourceLocation idSourceLocation()
const;
437 static QQmlJSScope::ConstPtr nonCompositeBaseType(
const QQmlJSScope::ConstPtr &type);
440 nonCompositeBaseRevision(
const ImportedScope<QQmlJSScope::ConstPtr> &scope);
442 bool isSameType(
const QQmlJSScope::ConstPtr &otherScope)
const;
443 bool inherits(
const QQmlJSScope::ConstPtr &base)
const;
444 bool canAssign(
const QQmlJSScope::ConstPtr &derived)
const;
446 bool isInCustomParserParent()
const;
449 static ImportedScope<QQmlJSScope::ConstPtr> findType(
const QString &name,
450 const QQmlJS::ContextualTypes &contextualTypes,
451 QSet<QString> *usedTypes =
nullptr);
453 static QQmlSA::Element createQQmlSAElement(
const ConstPtr &);
454 static QQmlSA::Element createQQmlSAElement(ConstPtr &&);
455 static const QQmlJSScope::ConstPtr &scope(
const QQmlSA::Element &);
456 static constexpr qsizetype sizeofQQmlSAElement() {
return QQmlSA::Element::sizeofElement; }
460 explicit QQmlJSScope(
const QString &internalName);
461 QQmlJSScope(QQmlJSScope &&) =
default;
462 QQmlJSScope &operator=(QQmlJSScope &&) =
default;
464
465
466
467
468 template <
typename T>
469 friend class QTypeInfo;
470 struct QmlIRCompatibilityBindingData
472 QmlIRCompatibilityBindingData() =
default;
473 QmlIRCompatibilityBindingData(
const QString &name, quint32 offset)
474 : propertyName(name), sourceLocationOffset(offset)
477 QString propertyName;
478 quint32 sourceLocationOffset = 0;
481 QQmlJSScope() =
default;
482 QQmlJSScope(
const QQmlJSScope &) =
default;
483 QQmlJSScope &operator=(
const QQmlJSScope &) =
default;
484 static QTypeRevision resolveType(
485 const QQmlJSScope::Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
486 QSet<QString> *usedTypes);
487 static void updateChildScope(
488 const QQmlJSScope::Ptr &childScope,
const QQmlJSScope::Ptr &self,
489 const QQmlJS::ContextualTypes &contextualTypes, QSet<QString> *usedTypes);
491 void addOwnPropertyBindingInQmlIROrder(
const QQmlJSMetaPropertyBinding &binding,
492 BindingTargetSpecifier specifier);
493 bool hasEnforcesScopedEnumsFlag()
const {
return m_flags & EnforcesScopedEnums; }
494 bool hasCreatableFlag()
const {
return m_flags & Creatable; }
495 bool hasStructuredFlag()
const {
return m_flags & Structured; }
497 QHash<QString, JavaScriptIdentifier> m_jsIdentifiers;
499 QMultiHash<QString, QQmlJSMetaMethod> m_methods;
500 QHash<QString, QQmlJSMetaProperty> m_properties;
501 QMultiHash<QString, QQmlJSMetaPropertyBinding> m_propertyBindings;
505 QList<QmlIRCompatibilityBindingData> m_propertyBindingsArray;
508 QList<QQmlJSMetaMethod::AbsoluteFunctionIndex> m_runtimeFunctionIndices;
510 QHash<QString, QQmlJSMetaEnum> m_enumerations;
512 QList<QQmlJSAnnotation> m_annotations;
513 QList<QQmlJSScope::Ptr> m_childScopes;
514 QQmlJSScope::WeakPtr m_parentScope;
517 QString m_internalName;
518 QString m_baseTypeNameOrError;
519 QString m_metaObjectHash;
523 ImportedScope<QQmlJSScope::WeakConstPtr> m_baseType;
525 ScopeType m_scopeType = ScopeType::QMLScope;
526 QStringList m_aliases;
527 QStringList m_interfaceNames;
528 QStringList m_ownDeferredNames;
529 QStringList m_ownImmediateNames;
531 QString m_defaultPropertyName;
532 QString m_parentPropertyName;
534
535
536
537 QString m_attachedTypeName;
538 QStringList m_requiredPropertyNames;
539 QQmlJSScope::WeakConstPtr m_attachedType;
542
543
544
545 QString m_elementTypeName;
546 QQmlJSScope::WeakConstPtr m_elementType;
547 QQmlJSScope::Ptr m_listType;
550
551
552
553
554
555
556 QString m_extensionTypeName;
557 QQmlJSScope::WeakConstPtr m_extensionType;
559 Flags m_flags = Creatable;
560 AccessSemantics m_semantics = AccessSemantics::Reference;
562 QQmlJS::SourceLocation m_sourceLocation;
563 QQmlJS::SourceLocation m_idSourceLocation;
565 QString m_moduleName;
567 std::optional<QString> m_inlineComponentName;