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)
123 using Export = QQmlJS::Export;
124 template <
typename Pointer>
125 using ImportedScope = QQmlJS::ImportedScope<Pointer>;
126 template <
typename Pointer>
127 using ExportedScope = QQmlJS::ExportedScope<Pointer>;
129 struct JavaScriptIdentifier
138 Kind kind = FunctionScoped;
139 QQmlJS::SourceLocation location;
140 std::optional<QString> typeName;
141 bool isConst =
false;
142 QQmlJSScope::WeakConstPtr scope = {};
145 enum BindingTargetSpecifier {
146 SimplePropertyTarget,
148 UnnamedPropertyTarget
151 template <
typename Key,
typename Value>
152 using QMultiHashRange = std::pair<
typename QMultiHash<Key, Value>::iterator,
153 typename QMultiHash<Key, Value>::iterator>;
155 static QQmlJSScope::Ptr create() {
return QSharedPointer<QQmlJSScope>(
new QQmlJSScope); }
156 static QQmlJSScope::Ptr clone(
const QQmlJSScope::ConstPtr &origin);
158 static void cloneInto(QQmlJSScope::Ptr &origin,
159 const QQmlJSScope::Ptr &target)
161 *target = std::move(*clone(origin));
165 void resetForReparse() {
166 const QString moduleName =
this->moduleName();
167 *
this = QQmlJSScope {
this->internalName() };
168 setOwnModuleName(moduleName);
171 static QQmlJSScope::ConstPtr findCurrentQMLScope(
const QQmlJSScope::ConstPtr &scope);
173 QQmlJSScope::Ptr parentScope();
174 QQmlJSScope::ConstPtr parentScope()
const;
175 static void reparent(
const QQmlJSScope::Ptr &parentScope,
const QQmlJSScope::Ptr &childScope);
177 void insertJSIdentifier(
const QString &name,
const JavaScriptIdentifier &identifier);
178 QHash<QString, JavaScriptIdentifier> ownJSIdentifiers()
const;
179 void insertPropertyIdentifier(
const QQmlJSMetaProperty &prop);
181 ScopeType scopeType()
const {
return m_scopeType; }
182 void setScopeType(ScopeType type) { m_scopeType = type; }
184 void addOwnMethod(
const QQmlJSMetaMethod &method) { m_methods.insert(method.methodName(), method); }
185 QMultiHashRange<QString, QQmlJSMetaMethod> mutableOwnMethodsRange(
const QString &name)
187 return m_methods.equal_range(name);
189 QMultiHash<QString, QQmlJSMetaMethod> ownMethods()
const {
return m_methods; }
190 QList<QQmlJSMetaMethod> ownMethods(
const QString &name)
const {
return m_methods.values(name); }
191 bool hasOwnMethod(
const QString &name)
const {
return m_methods.contains(name); }
193 bool hasMethod(
const QString &name)
const;
194 QHash<QString, QQmlJSMetaMethod> methods()
const;
195 QList<QQmlJSMetaMethod> methods(
const QString &name)
const;
196 QList<QQmlJSMetaMethod> methods(
const QString &name, QQmlJSMetaMethodType type)
const;
198 void addOwnEnumeration(
const QQmlJSMetaEnum &enumeration) { m_enumerations.insert(enumeration.name(), enumeration); }
199 QHash<QString, QQmlJSMetaEnum> ownEnumerations()
const {
return m_enumerations; }
200 QQmlJSMetaEnum ownEnumeration(
const QString &name)
const {
return m_enumerations.value(name); }
201 bool hasOwnEnumeration(
const QString &name)
const {
return m_enumerations.contains(name); }
203 bool hasEnumeration(
const QString &name)
const;
204 bool hasEnumerationKey(
const QString &name)
const;
205 bool hasOwnEnumerationKey(
const QString &name)
const;
206 QQmlJSMetaEnum enumeration(
const QString &name)
const;
207 QHash<QString, QQmlJSMetaEnum> enumerations()
const;
209 void setAnnotations(
const QList<QQmlJSAnnotation> &annotation) { m_annotations = std::move(annotation); }
210 const QList<QQmlJSAnnotation> &annotations()
const {
return m_annotations; }
212 QString filePath()
const {
return m_filePath; }
213 void setFilePath(
const QString &file) { m_filePath = file; }
215 quint32 lineNumber()
const {
return m_sourceLocation.startLine; }
216 void setLineNumber(quint32 lineNumber);
220 QString internalName()
const {
return m_internalName; }
221 void setInternalName(
const QString &internalName) { m_internalName = internalName; }
222 QString augmentedInternalName()
const;
225 static QString prettyName(QAnyStringView name);
227 enum class IsComponentRoot : quint8 { No = 0, Yes, Maybe };
228 IsComponentRoot componentRootStatus()
const;
230 void setAliases(
const QStringList &aliases) { m_aliases = aliases; }
231 QStringList aliases()
const {
return m_aliases; }
233 void setInterfaceNames(
const QStringList& interfaces) { m_interfaceNames = interfaces; }
234 QStringList interfaceNames()
const {
return m_interfaceNames; }
236 bool hasInterface(
const QString &name)
const;
237 bool hasOwnInterface(
const QString &name)
const {
return m_interfaceNames.contains(name); }
239 void setOwnDeferredNames(
const QStringList &names) { m_ownDeferredNames = names; }
240 QStringList ownDeferredNames()
const {
return m_ownDeferredNames; }
241 void setOwnImmediateNames(
const QStringList &names) { m_ownImmediateNames = names; }
242 QStringList ownImmediateNames()
const {
return m_ownImmediateNames; }
244 bool isNameDeferred(
const QString &name)
const;
248 void setBaseTypeName(
const QString &baseTypeName);
249 QString baseTypeName()
const;
251 QQmlJSScope::ConstPtr baseType()
const {
return m_baseType.scope; }
252 QTypeRevision baseTypeRevision()
const {
return m_baseType.revision; }
254 QString moduleName()
const;
255 QString ownModuleName()
const {
return m_moduleName; }
256 void setOwnModuleName(
const QString &moduleName) { m_moduleName = moduleName; }
258 void clearBaseType() { m_baseType = {}; }
259 void setBaseTypeError(
const QString &baseTypeError);
260 QString baseTypeError()
const;
262 void addOwnProperty(
const QQmlJSMetaProperty &prop) { m_properties.insert(prop.propertyName(), prop); }
263 QHash<QString, QQmlJSMetaProperty> ownProperties()
const {
return m_properties; }
264 QQmlJSMetaProperty ownProperty(
const QString &name)
const {
return m_properties.value(name); }
265 bool hasOwnProperty(
const QString &name)
const {
return m_properties.contains(name); }
267 bool hasProperty(
const QString &name)
const;
268 QQmlJSMetaProperty property(
const QString &name)
const;
269 QHash<QString, QQmlJSMetaProperty> properties()
const;
271 void setPropertyLocallyRequired(
const QString &name,
bool isRequired);
272 bool isPropertyRequired(
const QString &name)
const;
273 bool isPropertyLocallyRequired(
const QString &name)
const;
275 void addOwnPropertyBinding(
276 const QQmlJSMetaPropertyBinding &binding,
277 BindingTargetSpecifier specifier = BindingTargetSpecifier::SimplePropertyTarget);
278 QMultiHash<QString, QQmlJSMetaPropertyBinding> ownPropertyBindings()
const;
279 std::pair<QMultiHash<QString, QQmlJSMetaPropertyBinding>::const_iterator,
280 QMultiHash<QString, QQmlJSMetaPropertyBinding>::const_iterator>
281 ownPropertyBindings(
const QString &name)
const;
282 QList<QQmlJSMetaPropertyBinding> ownPropertyBindingsInQmlIROrder()
const;
283 bool hasOwnPropertyBindings(
const QString &name)
const;
285 bool hasPropertyBindings(
const QString &name)
const;
286 QList<QQmlJSMetaPropertyBinding> propertyBindings(
const QString &name)
const;
288 struct AnnotatedScope;
289 static AnnotatedScope ownerOfProperty(
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 bool isScript()
const {
return m_flags.testFlag(Script); }
352 void setIsScript(
bool v) { m_flags.setFlag(Script, v); }
354 bool hasCustomParser()
const {
return m_flags.testFlag(CustomParser); }
355 void setHasCustomParser(
bool v) { m_flags.setFlag(CustomParser, v); }
357 bool isArrayScope()
const {
return m_flags.testFlag(Array); }
358 void setIsArrayScope(
bool v) { m_flags.setFlag(Array, v); }
360 bool isInlineComponent()
const {
return m_flags.testFlag(InlineComponent); }
361 void setIsInlineComponent(
bool v) { m_flags.setFlag(InlineComponent, v); }
363 bool isWrappedInImplicitComponent()
const {
return m_flags.testFlag(WrappedInImplicitComponent); }
364 void setIsWrappedInImplicitComponent(
bool v) { m_flags.setFlag(WrappedInImplicitComponent, v); }
366 bool isAssignedToUnknownProperty()
const {
return m_flags.testFlag(AssignedToUnknownProperty); }
367 void setAssignedToUnknownProperty(
bool v) { m_flags.setFlag(AssignedToUnknownProperty, v); }
369 bool extensionIsJavaScript()
const {
return m_flags.testFlag(ExtensionIsJavaScript); }
370 void setExtensionIsJavaScript(
bool v) { m_flags.setFlag(ExtensionIsJavaScript, v); }
372 bool extensionIsNamespace()
const {
return m_flags.testFlag(ExtensionIsNamespace); }
373 void setExtensionIsNamespace(
bool v) { m_flags.setFlag(ExtensionIsNamespace, v); }
375 bool isListProperty()
const {
return m_flags.testFlag(IsListProperty); }
376 void setIsListProperty(
bool v) { m_flags.setFlag(IsListProperty, v); }
378 bool isSingleton()
const {
return m_flags.testFlag(Singleton); }
379 void setIsSingleton(
bool v) { m_flags.setFlag(Singleton, v); }
381 bool enforcesScopedEnums()
const;
382 void setEnforcesScopedEnumsFlag(
bool v) { m_flags.setFlag(EnforcesScopedEnums, v); }
384 bool isCreatable()
const;
385 void setCreatableFlag(
bool v) { m_flags.setFlag(Creatable, v); }
387 bool isStructured()
const;
388 void setStructuredFlag(
bool v) { m_flags.setFlag(Structured, v); }
390 bool isFileRootComponent()
const {
return m_flags.testFlag(FileRootComponent); }
391 void setIsRootFileComponentFlag(
bool v) { m_flags.setFlag(FileRootComponent, v); }
393 void setAccessSemantics(AccessSemantics semantics) { m_semantics = semantics; }
394 AccessSemantics accessSemantics()
const {
return m_semantics; }
395 bool isReferenceType()
const {
return m_semantics == QQmlJSScope::AccessSemantics::Reference; }
396 bool isValueType()
const {
return m_semantics == QQmlJSScope::AccessSemantics::Value; }
398 std::optional<JavaScriptIdentifier> jsIdentifier(
const QString &id)
const;
399 std::optional<JavaScriptIdentifier> ownJSIdentifier(
const QString &id)
const;
401 QQmlJS::ChildScopesIterator childScopesBegin()
const {
return m_childScopes.constBegin(); }
402 QQmlJS::ChildScopesIterator childScopesEnd()
const {
return m_childScopes.constEnd(); }
404 void setInlineComponentName(
const QString &inlineComponentName);
405 std::optional<QString> inlineComponentName()
const;
406 InlineComponentOrDocumentRootName enclosingInlineComponentName()
const;
408 QList<QQmlJSScope::Ptr> childScopes();
410 QList<QQmlJSScope::ConstPtr> childScopes()
const;
412 static QTypeRevision resolveTypes(
413 const Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
414 QSet<QString> *usedTypes =
nullptr);
415 static void resolveNonEnumTypes(
416 const QQmlJSScope::Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
417 QSet<QString> *usedTypes =
nullptr);
418 static void resolveEnums(
419 const QQmlJSScope::Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
420 QSet<QString> *usedTypes =
nullptr);
421 static void resolveList(
422 const QQmlJSScope::Ptr &self,
const QQmlJSScope::ConstPtr &arrayType);
423 static void resolveGroup(
424 const QQmlJSScope::Ptr &self,
const QQmlJSScope::ConstPtr &baseType,
425 const QQmlJS::ContextualTypes &contextualTypes,
426 QSet<QString> *usedTypes =
nullptr);
428 void setSourceLocation(
const QQmlJS::SourceLocation &sourceLocation);
429 QQmlJS::SourceLocation sourceLocation()
const;
431 void setIdSourceLocation(
const QQmlJS::SourceLocation &sourceLocation);
432 QQmlJS::SourceLocation idSourceLocation()
const;
434 static QQmlJSScope::ConstPtr nonCompositeBaseType(
const QQmlJSScope::ConstPtr &type);
437 nonCompositeBaseRevision(
const ImportedScope<QQmlJSScope::ConstPtr> &scope);
439 bool isSameType(
const QQmlJSScope::ConstPtr &otherScope)
const;
440 bool inherits(
const QQmlJSScope::ConstPtr &base)
const;
441 bool canAssign(
const QQmlJSScope::ConstPtr &derived)
const;
443 bool isInCustomParserParent()
const;
446 static ImportedScope<QQmlJSScope::ConstPtr> findType(
const QString &name,
447 const QQmlJS::ContextualTypes &contextualTypes,
448 QSet<QString> *usedTypes =
nullptr);
450 static QQmlSA::Element createQQmlSAElement(
const ConstPtr &);
451 static QQmlSA::Element createQQmlSAElement(ConstPtr &&);
452 static const QQmlJSScope::ConstPtr &scope(
const QQmlSA::Element &);
453 static constexpr qsizetype sizeofQQmlSAElement() {
return QQmlSA::Element::sizeofElement; }
457 explicit QQmlJSScope(
const QString &internalName);
458 QQmlJSScope(QQmlJSScope &&) =
default;
459 QQmlJSScope &operator=(QQmlJSScope &&) =
default;
461
462
463
464
465 template <
typename T>
466 friend class QTypeInfo;
467 struct QmlIRCompatibilityBindingData
469 QmlIRCompatibilityBindingData() =
default;
470 QmlIRCompatibilityBindingData(
const QString &name, quint32 offset)
471 : propertyName(name), sourceLocationOffset(offset)
474 QString propertyName;
475 quint32 sourceLocationOffset = 0;
478 QQmlJSScope() =
default;
479 QQmlJSScope(
const QQmlJSScope &) =
default;
480 QQmlJSScope &operator=(
const QQmlJSScope &) =
default;
481 static QTypeRevision resolveType(
482 const QQmlJSScope::Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
483 QSet<QString> *usedTypes);
484 static void updateChildScope(
485 const QQmlJSScope::Ptr &childScope,
const QQmlJSScope::Ptr &self,
486 const QQmlJS::ContextualTypes &contextualTypes, QSet<QString> *usedTypes);
488 void addOwnPropertyBindingInQmlIROrder(
const QQmlJSMetaPropertyBinding &binding,
489 BindingTargetSpecifier specifier);
490 bool hasEnforcesScopedEnumsFlag()
const {
return m_flags & EnforcesScopedEnums; }
491 bool hasCreatableFlag()
const {
return m_flags & Creatable; }
492 bool hasStructuredFlag()
const {
return m_flags & Structured; }
494 QHash<QString, JavaScriptIdentifier> m_jsIdentifiers;
496 QMultiHash<QString, QQmlJSMetaMethod> m_methods;
497 QHash<QString, QQmlJSMetaProperty> m_properties;
498 QMultiHash<QString, QQmlJSMetaPropertyBinding> m_propertyBindings;
502 QList<QmlIRCompatibilityBindingData> m_propertyBindingsArray;
505 QList<QQmlJSMetaMethod::AbsoluteFunctionIndex> m_runtimeFunctionIndices;
507 QHash<QString, QQmlJSMetaEnum> m_enumerations;
509 QList<QQmlJSAnnotation> m_annotations;
510 QList<QQmlJSScope::Ptr> m_childScopes;
511 QQmlJSScope::WeakPtr m_parentScope;
514 QString m_internalName;
515 QString m_baseTypeNameOrError;
519 ImportedScope<QQmlJSScope::WeakConstPtr> m_baseType;
521 ScopeType m_scopeType = ScopeType::QMLScope;
522 QStringList m_aliases;
523 QStringList m_interfaceNames;
524 QStringList m_ownDeferredNames;
525 QStringList m_ownImmediateNames;
527 QString m_defaultPropertyName;
528 QString m_parentPropertyName;
530
531
532
533 QString m_attachedTypeName;
534 QStringList m_requiredPropertyNames;
535 QQmlJSScope::WeakConstPtr m_attachedType;
538
539
540
541 QString m_elementTypeName;
542 QQmlJSScope::WeakConstPtr m_elementType;
543 QQmlJSScope::Ptr m_listType;
546
547
548
549
550
551
552 QString m_extensionTypeName;
553 QQmlJSScope::WeakConstPtr m_extensionType;
555 Flags m_flags = Creatable;
556 AccessSemantics m_semantics = AccessSemantics::Reference;
558 QQmlJS::SourceLocation m_sourceLocation;
559 QQmlJS::SourceLocation m_idSourceLocation;
561 QString m_moduleName;
563 std::optional<QString> m_inlineComponentName;