85 friend QQmlSA::Element;
88 using Ptr = QDeferredSharedPointer<QQmlJSScope>;
89 using WeakPtr = QDeferredWeakPointer<QQmlJSScope>;
90 using ConstPtr = QDeferredSharedPointer<
const QQmlJSScope>;
91 using WeakConstPtr = QDeferredWeakPointer<
const QQmlJSScope>;
93 using AccessSemantics = QQmlSA::AccessSemantics;
94 using ScopeType = QQmlSA::ScopeType;
96 using InlineComponentNameType = QString;
97 using RootDocumentNameType = std::monostate;
99
100
101 using InlineComponentOrDocumentRootName =
102 std::variant<InlineComponentNameType, RootDocumentNameType>;
107 JavaScriptBuiltin = 0x4,
112 InlineComponent = 0x80,
113 WrappedInImplicitComponent = 0x100,
114 HasBaseTypeError = 0x200,
115 ExtensionIsNamespace = 0x400,
116 IsListProperty = 0x800,
118 ExtensionIsJavaScript = 0x2000,
119 EnforcesScopedEnums = 0x4000,
120 FileRootComponent = 0x8000,
121 AssignedToUnknownProperty = 0x10000,
122 IsSelfExtension = 0x20000,
125 Q_DECLARE_FLAGS(Flags, Flag)
127 using Export = QQmlJS::Export;
128 template <
typename Pointer>
129 using ImportedScope = QQmlJS::ImportedScope<Pointer>;
130 template <
typename Pointer>
131 using ExportedScope = QQmlJS::ExportedScope<Pointer>;
133 struct JavaScriptIdentifier
142 Kind kind = FunctionScoped;
143 QQmlJS::SourceLocation location;
144 std::optional<QString> typeName;
145 bool isConst =
false;
146 QQmlJSScope::WeakConstPtr scope = {};
149 enum BindingTargetSpecifier {
150 SimplePropertyTarget,
152 UnnamedPropertyTarget
155 template <
typename Key,
typename Value>
156 using QMultiHashRange = std::pair<
typename QMultiHash<Key, Value>::iterator,
157 typename QMultiHash<Key, Value>::iterator>;
159 static QQmlJSScope::Ptr create() {
return QSharedPointer<QQmlJSScope>(
new QQmlJSScope); }
160 static QQmlJSScope::Ptr resetForReparse(QQmlJSScope::Ptr &&scope);
162 static QQmlJSScope::ConstPtr findCurrentQMLScope(
const QQmlJSScope::ConstPtr &scope);
164 QQmlJSScope::Ptr parentScope();
165 QQmlJSScope::ConstPtr parentScope()
const;
166 static void reparent(
const QQmlJSScope::Ptr &parentScope,
const QQmlJSScope::Ptr &childScope);
168 void insertJSIdentifier(
const QString &name,
const JavaScriptIdentifier &identifier);
169 QHash<QString, JavaScriptIdentifier> ownJSIdentifiers()
const;
171 ScopeType scopeType()
const {
return m_scopeType; }
172 void setScopeType(ScopeType type) { m_scopeType = type; }
174 void addOwnMethod(
const QQmlJSMetaMethod &method) { m_methods.insert(method.methodName(), method); }
175 QMultiHashRange<QString, QQmlJSMetaMethod> mutableOwnMethodsRange(
const QString &name)
177 return m_methods.equal_range(name);
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); }
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;
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); }
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;
199 void setAnnotations(
const QList<QQmlJSAnnotation> &annotations) { m_annotations = annotations; }
200 const QList<QQmlJSAnnotation> &annotations()
const {
return m_annotations; }
202 QString filePath()
const {
return m_filePath; }
203 void setFilePath(
const QString &file) { m_filePath = file; }
205 quint32 lineNumber()
const {
return m_sourceLocation.startLine; }
206 void setLineNumber(quint32 lineNumber);
208 QString resolvedFilePath()
const {
return m_resolvedFilePath; }
209 void setResolvedFilePath(
const QString &file) { m_resolvedFilePath = file; }
211 quint32 lineNumberInResolvedFile()
const {
return m_lineNumberInResolvedFile; }
212 void setLineNumberInResolvedFile(quint32 lineNumber);
216 QString internalName()
const {
return m_internalName; }
217 void setInternalName(
const QString &internalName) { m_internalName = internalName; }
218 QString augmentedInternalName()
const;
221 static QString prettyName(QAnyStringView name);
223 enum class IsComponentRoot : quint8 { No = 0, Yes, Maybe };
224 IsComponentRoot componentRootStatus()
const;
226 void setAliases(
const QStringList &aliases) { m_aliases = aliases; }
227 QStringList aliases()
const {
return m_aliases; }
229 void setInterfaceNames(
const QStringList& interfaces) { m_interfaceNames = interfaces; }
230 QStringList interfaceNames()
const {
return m_interfaceNames; }
232 bool hasInterface(
const QString &name)
const;
233 bool hasOwnInterface(
const QString &name)
const {
return m_interfaceNames.contains(name); }
235 void setOwnDeferredNames(
const QStringList &names) { m_ownDeferredNames = names; }
236 QStringList ownDeferredNames()
const {
return m_ownDeferredNames; }
237 void setOwnImmediateNames(
const QStringList &names) { m_ownImmediateNames = names; }
238 QStringList ownImmediateNames()
const {
return m_ownImmediateNames; }
240 bool isNameDeferred(
const QString &name)
const;
244 void setBaseTypeName(
const QString &baseTypeName);
245 QString baseTypeName()
const;
247 QQmlJSScope::ConstPtr baseType()
const {
return m_baseType.scope; }
248 QTypeRevision baseTypeRevision()
const {
return m_baseType.revision; }
250 QString moduleName()
const;
251 QString ownModuleName()
const {
return m_moduleName; }
252 void setOwnModuleName(
const QString &moduleName) { m_moduleName = moduleName; }
254 void clearBaseType() { m_baseType = {}; }
255 void setBaseTypeError(
const QString &baseTypeError);
256 QString baseTypeError()
const;
258 void addOwnProperty(
const QQmlJSMetaProperty &prop) { m_properties.insert(prop.propertyName(), prop); }
259 QHash<QString, QQmlJSMetaProperty> ownProperties()
const {
return m_properties; }
260 QQmlJSMetaProperty ownProperty(
const QString &name)
const {
return m_properties.value(name); }
261 bool hasOwnProperty(
const QString &name)
const {
return m_properties.contains(name); }
263 bool hasProperty(
const QString &name)
const;
264 QQmlJSMetaProperty property(
const QString &name)
const;
265 QHash<QString, QQmlJSMetaProperty> properties()
const;
267 void setPropertyLocallyRequired(
const QString &name,
bool isRequired);
268 bool isPropertyRequired(
const QString &name)
const;
269 bool isPropertyLocallyRequired(
const QString &name)
const;
271 void addOwnPropertyBinding(
272 const QQmlJSMetaPropertyBinding &binding,
273 BindingTargetSpecifier specifier = BindingTargetSpecifier::SimplePropertyTarget);
274 QMultiHash<QString, QQmlJSMetaPropertyBinding> ownPropertyBindings()
const;
275 std::pair<QMultiHash<QString, QQmlJSMetaPropertyBinding>::const_iterator,
276 QMultiHash<QString, QQmlJSMetaPropertyBinding>::const_iterator>
277 ownPropertyBindings(
const QString &name)
const;
278 QList<QQmlJSMetaPropertyBinding> ownPropertyBindingsInQmlIROrder()
const;
279 bool hasOwnPropertyBindings(
const QString &name)
const;
281 bool hasPropertyBindings(
const QString &name)
const;
282 QList<QQmlJSMetaPropertyBinding> propertyBindings(
const QString &name)
const;
284 struct AnnotatedScope;
285 static AnnotatedScope ownerOfProperty(
const QQmlJSScope::ConstPtr &self,
const QString &name);
286 static AnnotatedScope ownerOfMethod(
const QQmlJSScope::ConstPtr &self,
const QString &name);
287 static AnnotatedScope ownerOfEnum(
const QQmlJSScope::ConstPtr &self,
const QString &name);
289 bool isResolved()
const;
290 bool isFullyResolved()
const;
292 QString ownDefaultPropertyName()
const {
return m_defaultPropertyName; }
293 void setOwnDefaultPropertyName(
const QString &name) { m_defaultPropertyName = name; }
294 QString defaultPropertyName()
const;
296 QString ownParentPropertyName()
const {
return m_parentPropertyName; }
297 void setOwnParentPropertyName(
const QString &name) { m_parentPropertyName = name; }
298 QString parentPropertyName()
const;
300 QString ownAttachedTypeName()
const {
return m_attachedTypeName; }
301 void setOwnAttachedTypeName(
const QString &name) { m_attachedTypeName = name; }
302 QQmlJSScope::ConstPtr ownAttachedType()
const {
return m_attachedType; }
304 QString attachedTypeName()
const;
305 QQmlJSScope::ConstPtr attachedType()
const;
307 QString extensionTypeName()
const {
return m_extensionTypeName; }
308 void setExtensionTypeName(
const QString &name) { m_extensionTypeName = name; }
315 struct AnnotatedScope
317 QQmlJSScope::ConstPtr scope;
318 ExtensionKind extensionSpecifier = NotExtension;
320 AnnotatedScope extensionType()
const;
322 QString elementTypeName()
const {
return m_elementTypeName; }
323 void setElementTypeName(
const QString &name) { m_elementTypeName = name; }
324 QQmlJSScope::ConstPtr elementType()
const {
return m_elementType; }
325 QQmlJSScope::ConstPtr listType()
const {
return m_listType; }
326 QQmlJSScope::Ptr listType() {
return m_listType; }
328 void addOwnRuntimeFunctionIndex(QQmlJSMetaMethod::AbsoluteFunctionIndex index);
329 QQmlJSMetaMethod::AbsoluteFunctionIndex
330 ownRuntimeFunctionIndex(QQmlJSMetaMethod::RelativeFunctionIndex index)
const;
334
335
336
337
338 bool isComposite()
const {
return m_flags.testFlag(Composite); }
339 void setIsComposite(
bool v) { m_flags.setFlag(Composite, v); }
342
343
344
345
346 bool isJavaScriptBuiltin()
const {
return m_flags.testFlag(JavaScriptBuiltin); }
347 void setIsJavaScriptBuiltin(
bool v) { m_flags.setFlag(JavaScriptBuiltin, v); }
350 bool isOpaqueType()
const {
return m_flags.testFlag(IsOpaque); }
351 void setIsTypeOpaque(
bool v) { m_flags.setFlag(IsOpaque, v); }
353 bool isScript()
const {
return m_flags.testFlag(Script); }
354 void setIsScript(
bool v) { m_flags.setFlag(Script, v); }
356 bool hasCustomParser()
const {
return m_flags.testFlag(CustomParser); }
357 void setHasCustomParser(
bool v) { m_flags.setFlag(CustomParser, v); }
359 bool isArrayScope()
const {
return m_flags.testFlag(Array); }
360 void setIsArrayScope(
bool v) { m_flags.setFlag(Array, v); }
362 bool isInlineComponent()
const {
return m_flags.testFlag(InlineComponent); }
363 void setIsInlineComponent(
bool v) { m_flags.setFlag(InlineComponent, v); }
365 bool isWrappedInImplicitComponent()
const {
return m_flags.testFlag(WrappedInImplicitComponent); }
366 void setIsWrappedInImplicitComponent(
bool v) { m_flags.setFlag(WrappedInImplicitComponent, v); }
368 bool isAssignedToUnknownProperty()
const {
return m_flags.testFlag(AssignedToUnknownProperty); }
369 void setAssignedToUnknownProperty(
bool v) { m_flags.setFlag(AssignedToUnknownProperty, v); }
371 bool extensionIsJavaScript()
const {
return m_flags.testFlag(ExtensionIsJavaScript); }
372 void setExtensionIsJavaScript(
bool v) { m_flags.setFlag(ExtensionIsJavaScript, v); }
374 bool extensionIsNamespace()
const {
return m_flags.testFlag(ExtensionIsNamespace); }
375 void setExtensionIsNamespace(
bool v) { m_flags.setFlag(ExtensionIsNamespace, v); }
377 bool isListProperty()
const {
return m_flags.testFlag(IsListProperty); }
378 void setIsListProperty(
bool v) { m_flags.setFlag(IsListProperty, v); }
380 bool isSingleton()
const {
return m_flags.testFlag(Singleton); }
381 void setIsSingleton(
bool v) { m_flags.setFlag(Singleton, v); }
383 bool enforcesScopedEnums()
const;
384 void setEnforcesScopedEnumsFlag(
bool v) { m_flags.setFlag(EnforcesScopedEnums, v); }
386 bool isCreatable()
const;
387 void setCreatableFlag(
bool v) { m_flags.setFlag(Creatable, v); }
389 bool isStructured()
const;
390 void setStructuredFlag(
bool v) { m_flags.setFlag(Structured, v); }
392 bool isFileRootComponent()
const {
return m_flags.testFlag(FileRootComponent); }
393 void setIsRootFileComponentFlag(
bool v) { m_flags.setFlag(FileRootComponent, v); }
402 bool isSelfExtension()
const {
return m_flags.testFlag(IsSelfExtension); }
403 void setIsSelfExtension(
bool v) { m_flags.setFlag(IsSelfExtension, v); }
405 void setAccessSemantics(AccessSemantics semantics) { m_semantics = semantics; }
406 AccessSemantics accessSemantics()
const {
return m_semantics; }
407 bool isReferenceType()
const {
return m_semantics == QQmlJSScope::AccessSemantics::Reference; }
408 bool isValueType()
const {
return m_semantics == QQmlJSScope::AccessSemantics::Value; }
410 std::optional<JavaScriptIdentifier> jsIdentifier(
const QString &id)
const;
411 std::optional<JavaScriptIdentifier> ownJSIdentifier(
const QString &id)
const;
413 QQmlJS::ChildScopesIterator childScopesBegin()
const {
return m_childScopes.constBegin(); }
414 QQmlJS::ChildScopesIterator childScopesEnd()
const {
return m_childScopes.constEnd(); }
416 void setInlineComponentName(
const QString &inlineComponentName);
417 std::optional<QString> inlineComponentName()
const;
418 InlineComponentOrDocumentRootName enclosingInlineComponentName()
const;
420 QList<QQmlJSScope::Ptr> childScopes();
422 QList<QQmlJSScope::ConstPtr> childScopes()
const;
424 static QTypeRevision resolveTypes(
425 const Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
426 QSet<QString> *usedTypes =
nullptr);
427 static void resolveNonEnumTypes(
428 const QQmlJSScope::Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
429 QSet<QString> *usedTypes =
nullptr);
430 static void resolveEnums(
431 const QQmlJSScope::Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
432 QSet<QString> *usedTypes =
nullptr);
433 static void resolveList(
434 const QQmlJSScope::Ptr &self,
const QQmlJSScope::ConstPtr &arrayType);
435 static void resolveGroup(
436 const QQmlJSScope::Ptr &self,
const QQmlJSScope::ConstPtr &baseType,
437 const QQmlJS::ContextualTypes &contextualTypes,
438 QSet<QString> *usedTypes =
nullptr);
440 void setSourceLocation(
const QQmlJS::SourceLocation &sourceLocation);
441 QQmlJS::SourceLocation sourceLocation()
const;
443 void setIdSourceLocation(
const QQmlJS::SourceLocation &sourceLocation);
444 QQmlJS::SourceLocation idSourceLocation()
const;
446 static QQmlJSScope::ConstPtr nonCompositeBaseType(
const QQmlJSScope::ConstPtr &type);
449 nonCompositeBaseRevision(
const ImportedScope<QQmlJSScope::ConstPtr> &scope);
451 bool isSameType(
const QQmlJSScope::ConstPtr &otherScope)
const;
452 bool inherits(
const QQmlJSScope::ConstPtr &base)
const;
453 bool canAssign(
const QQmlJSScope::ConstPtr &derived)
const;
455 bool isInCustomParserParent()
const;
458 static ImportedScope<QQmlJSScope::ConstPtr> findType(
const QString &name,
459 const QQmlJS::ContextualTypes &contextualTypes,
460 QSet<QString> *usedTypes =
nullptr);
462 static QQmlSA::Element createQQmlSAElement(
const ConstPtr &);
463 static QQmlSA::Element createQQmlSAElement(ConstPtr &&);
464 static const QQmlJSScope::ConstPtr &scope(
const QQmlSA::Element &);
465 static constexpr qsizetype sizeofQQmlSAElement() {
return QQmlSA::Element::sizeofElement; }
469 explicit QQmlJSScope(
const QString &internalName);
470 QQmlJSScope(QQmlJSScope &&) =
default;
471 QQmlJSScope &operator=(QQmlJSScope &&) =
default;
473
474
475
476
477 template <
typename T>
478 friend class QTypeInfo;
479 struct QmlIRCompatibilityBindingData
481 QmlIRCompatibilityBindingData() =
default;
482 QmlIRCompatibilityBindingData(
const QString &name, quint32 offset)
483 : propertyName(name), sourceLocationOffset(offset)
486 QString propertyName;
487 quint32 sourceLocationOffset = 0;
490 QQmlJSScope() =
default;
491 QQmlJSScope(
const QQmlJSScope &) =
default;
492 QQmlJSScope &operator=(
const QQmlJSScope &) =
default;
493 static QTypeRevision resolveType(
494 const QQmlJSScope::Ptr &self,
const QQmlJS::ContextualTypes &contextualTypes,
495 QSet<QString> *usedTypes);
496 static void updateChildScope(
497 const QQmlJSScope::Ptr &childScope,
const QQmlJSScope::Ptr &self,
498 const QQmlJS::ContextualTypes &contextualTypes, QSet<QString> *usedTypes);
500 void addOwnPropertyBindingInQmlIROrder(
const QQmlJSMetaPropertyBinding &binding,
501 BindingTargetSpecifier specifier);
502 bool hasEnforcesScopedEnumsFlag()
const {
return m_flags & EnforcesScopedEnums; }
503 bool hasCreatableFlag()
const {
return m_flags & Creatable; }
504 bool hasStructuredFlag()
const {
return m_flags & Structured; }
506 QHash<QString, JavaScriptIdentifier> m_jsIdentifiers;
508 QMultiHash<QString, QQmlJSMetaMethod> m_methods;
509 QHash<QString, QQmlJSMetaProperty> m_properties;
510 QMultiHash<QString, QQmlJSMetaPropertyBinding> m_propertyBindings;
514 QList<QmlIRCompatibilityBindingData> m_propertyBindingsArray;
517 QList<QQmlJSMetaMethod::AbsoluteFunctionIndex> m_runtimeFunctionIndices;
519 QHash<QString, QQmlJSMetaEnum> m_enumerations;
521 QList<QQmlJSAnnotation> m_annotations;
522 QList<QQmlJSScope::Ptr> m_childScopes;
523 QQmlJSScope::WeakPtr m_parentScope;
526 QString m_resolvedFilePath;
527 QString m_internalName;
528 QString m_baseTypeNameOrError;
532 ImportedScope<QQmlJSScope::WeakConstPtr> m_baseType;
534 ScopeType m_scopeType = ScopeType::QMLScope;
535 QStringList m_aliases;
536 QStringList m_interfaceNames;
537 QStringList m_ownDeferredNames;
538 QStringList m_ownImmediateNames;
540 QString m_defaultPropertyName;
541 QString m_parentPropertyName;
543
544
545
546 QString m_attachedTypeName;
547 QStringList m_requiredPropertyNames;
548 QQmlJSScope::WeakConstPtr m_attachedType;
551
552
553
554 QString m_elementTypeName;
555 QQmlJSScope::WeakConstPtr m_elementType;
556 QQmlJSScope::Ptr m_listType;
559
560
561
562
563
564
565 QString m_extensionTypeName;
566 QQmlJSScope::WeakConstPtr m_extensionType;
568 Flags m_flags = Creatable;
569 AccessSemantics m_semantics = AccessSemantics::Reference;
571 QQmlJS::SourceLocation m_sourceLocation;
572 QQmlJS::SourceLocation m_idSourceLocation;
574 QString m_moduleName;
576 std::optional<QString> m_inlineComponentName;
578 quint32 m_lineNumberInResolvedFile = 0;