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,
124 Q_DECLARE_FLAGS(Flags, Flag)
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>;
132 struct JavaScriptIdentifier
141 Kind kind = FunctionScoped;
142 QQmlJS::SourceLocation location;
143 std::optional<QString> typeName;
144 bool isConst =
false;
145 QQmlJSScope::WeakConstPtr scope = {};
148 enum BindingTargetSpecifier {
149 SimplePropertyTarget,
151 UnnamedPropertyTarget
154 template <
typename Key,
typename Value>
155 using QMultiHashRange = std::pair<
typename QMultiHash<Key, Value>::iterator,
156 typename QMultiHash<Key, Value>::iterator>;
158 static QQmlJSScope::Ptr create() {
return QSharedPointer<QQmlJSScope>(
new QQmlJSScope); }
159 static QQmlJSScope::Ptr resetForReparse(QQmlJSScope::Ptr &&scope);
161 static QQmlJSScope::ConstPtr findCurrentQMLScope(
const QQmlJSScope::ConstPtr &scope);
163 QQmlJSScope::Ptr parentScope();
164 QQmlJSScope::ConstPtr parentScope()
const;
165 static void reparent(
const QQmlJSScope::Ptr &parentScope,
const QQmlJSScope::Ptr &childScope);
167 void insertJSIdentifier(
const QString &name,
const JavaScriptIdentifier &identifier);
168 QHash<QString, JavaScriptIdentifier> ownJSIdentifiers()
const;
169 void insertPropertyIdentifier(
const QQmlJSMetaProperty &prop);
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);
210 QString internalName()
const {
return m_internalName; }
211 void setInternalName(
const QString &internalName) { m_internalName = internalName; }
212 QString augmentedInternalName()
const;
215 static QString prettyName(QAnyStringView name);
217 enum class IsComponentRoot : quint8 { No = 0, Yes, Maybe };
218 IsComponentRoot componentRootStatus()
const;
220 void setAliases(
const QStringList &aliases) { m_aliases = aliases; }
221 QStringList aliases()
const {
return m_aliases; }
223 void setInterfaceNames(
const QStringList& interfaces) { m_interfaceNames = interfaces; }
224 QStringList interfaceNames()
const {
return m_interfaceNames; }
226 bool hasInterface(
const QString &name)
const;
227 bool hasOwnInterface(
const QString &name)
const {
return m_interfaceNames.contains(name); }
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; }
234 bool isNameDeferred(
const QString &name)
const;
238 void setBaseTypeName(
const QString &baseTypeName);
239 QString baseTypeName()
const;
241 QQmlJSScope::ConstPtr baseType()
const {
return m_baseType.scope; }
242 QTypeRevision baseTypeRevision()
const {
return m_baseType.revision; }
244 QString moduleName()
const;
245 QString ownModuleName()
const {
return m_moduleName; }
246 void setOwnModuleName(
const QString &moduleName) { m_moduleName = moduleName; }
248 void clearBaseType() { m_baseType = {}; }
249 void setBaseTypeError(
const QString &baseTypeError);
250 QString baseTypeError()
const;
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); }
257 bool hasProperty(
const QString &name)
const;
258 QQmlJSMetaProperty property(
const QString &name)
const;
259 QHash<QString, QQmlJSMetaProperty> properties()
const;
261 void setPropertyLocallyRequired(
const QString &name,
bool isRequired);
262 bool isPropertyRequired(
const QString &name)
const;
263 bool isPropertyLocallyRequired(
const QString &name)
const;
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;
275 bool hasPropertyBindings(
const QString &name)
const;
276 QList<QQmlJSMetaPropertyBinding> propertyBindings(
const QString &name)
const;
278 struct AnnotatedScope;
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);
283 bool isResolved()
const;
284 bool isFullyResolved()
const;
286 QString ownDefaultPropertyName()
const {
return m_defaultPropertyName; }
287 void setOwnDefaultPropertyName(
const QString &name) { m_defaultPropertyName = name; }
288 QString defaultPropertyName()
const;
290 QString ownParentPropertyName()
const {
return m_parentPropertyName; }
291 void setOwnParentPropertyName(
const QString &name) { m_parentPropertyName = name; }
292 QString parentPropertyName()
const;
294 QString ownAttachedTypeName()
const {
return m_attachedTypeName; }
295 void setOwnAttachedTypeName(
const QString &name) { m_attachedTypeName = name; }
296 QQmlJSScope::ConstPtr ownAttachedType()
const {
return m_attachedType; }
298 QString attachedTypeName()
const;
299 QQmlJSScope::ConstPtr attachedType()
const;
301 QString extensionTypeName()
const {
return m_extensionTypeName; }
302 void setExtensionTypeName(
const QString &name) { m_extensionTypeName = name; }
309 struct AnnotatedScope
311 QQmlJSScope::ConstPtr scope;
312 ExtensionKind extensionSpecifier = NotExtension;
314 AnnotatedScope extensionType()
const;
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; }
322 void addOwnRuntimeFunctionIndex(QQmlJSMetaMethod::AbsoluteFunctionIndex index);
323 QQmlJSMetaMethod::AbsoluteFunctionIndex
324 ownRuntimeFunctionIndex(QQmlJSMetaMethod::RelativeFunctionIndex index)
const;
328
329
330
331
332 bool isComposite()
const {
return m_flags.testFlag(Composite); }
333 void setIsComposite(
bool v) { m_flags.setFlag(Composite, v); }
336
337
338
339
340 bool isJavaScriptBuiltin()
const {
return m_flags.testFlag(JavaScriptBuiltin); }
341 void setIsJavaScriptBuiltin(
bool v) { m_flags.setFlag(JavaScriptBuiltin, v); }
343 bool isScript()
const {
return m_flags.testFlag(Script); }
344 void setIsScript(
bool v) { m_flags.setFlag(Script, v); }
346 bool hasCustomParser()
const {
return m_flags.testFlag(CustomParser); }
347 void setHasCustomParser(
bool v) { m_flags.setFlag(CustomParser, v); }
349 bool isArrayScope()
const {
return m_flags.testFlag(Array); }
350 void setIsArrayScope(
bool v) { m_flags.setFlag(Array, v); }
352 bool isInlineComponent()
const {
return m_flags.testFlag(InlineComponent); }
353 void setIsInlineComponent(
bool v) { m_flags.setFlag(InlineComponent, v); }
355 bool isWrappedInImplicitComponent()
const {
return m_flags.testFlag(WrappedInImplicitComponent); }
356 void setIsWrappedInImplicitComponent(
bool v) { m_flags.setFlag(WrappedInImplicitComponent, v); }
358 bool isAssignedToUnknownProperty()
const {
return m_flags.testFlag(AssignedToUnknownProperty); }
359 void setAssignedToUnknownProperty(
bool v) { m_flags.setFlag(AssignedToUnknownProperty, v); }
361 bool extensionIsJavaScript()
const {
return m_flags.testFlag(ExtensionIsJavaScript); }
362 void setExtensionIsJavaScript(
bool v) { m_flags.setFlag(ExtensionIsJavaScript, v); }
364 bool extensionIsNamespace()
const {
return m_flags.testFlag(ExtensionIsNamespace); }
365 void setExtensionIsNamespace(
bool v) { m_flags.setFlag(ExtensionIsNamespace, v); }
367 bool isListProperty()
const {
return m_flags.testFlag(IsListProperty); }
368 void setIsListProperty(
bool v) { m_flags.setFlag(IsListProperty, v); }
370 bool isSingleton()
const {
return m_flags.testFlag(Singleton); }
371 void setIsSingleton(
bool v) { m_flags.setFlag(Singleton, v); }
373 bool enforcesScopedEnums()
const;
374 void setEnforcesScopedEnumsFlag(
bool v) { m_flags.setFlag(EnforcesScopedEnums, v); }
376 bool isCreatable()
const;
377 void setCreatableFlag(
bool v) { m_flags.setFlag(Creatable, v); }
379 bool isStructured()
const;
380 void setStructuredFlag(
bool v) { m_flags.setFlag(Structured, v); }
382 bool isFileRootComponent()
const {
return m_flags.testFlag(FileRootComponent); }
383 void setIsRootFileComponentFlag(
bool v) { m_flags.setFlag(FileRootComponent, v); }
392 bool isSelfExtension()
const {
return m_flags.testFlag(IsSelfExtension); }
393 void setIsSelfExtension(
bool v) { m_flags.setFlag(IsSelfExtension, v); }
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; }
400 std::optional<JavaScriptIdentifier> jsIdentifier(
const QString &id)
const;
401 std::optional<JavaScriptIdentifier> ownJSIdentifier(
const QString &id)
const;
403 QQmlJS::ChildScopesIterator childScopesBegin()
const {
return m_childScopes.constBegin(); }
404 QQmlJS::ChildScopesIterator childScopesEnd()
const {
return m_childScopes.constEnd(); }
406 void setInlineComponentName(
const QString &inlineComponentName);
407 std::optional<QString> inlineComponentName()
const;
408 InlineComponentOrDocumentRootName enclosingInlineComponentName()
const;
410 QList<QQmlJSScope::Ptr> childScopes();
412 QList<QQmlJSScope::ConstPtr> childScopes()
const;
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);
430 void setSourceLocation(
const QQmlJS::SourceLocation &sourceLocation);
431 QQmlJS::SourceLocation sourceLocation()
const;
433 void setIdSourceLocation(
const QQmlJS::SourceLocation &sourceLocation);
434 QQmlJS::SourceLocation idSourceLocation()
const;
436 static QQmlJSScope::ConstPtr nonCompositeBaseType(
const QQmlJSScope::ConstPtr &type);
439 nonCompositeBaseRevision(
const ImportedScope<QQmlJSScope::ConstPtr> &scope);
441 bool isSameType(
const QQmlJSScope::ConstPtr &otherScope)
const;
442 bool inherits(
const QQmlJSScope::ConstPtr &base)
const;
443 bool canAssign(
const QQmlJSScope::ConstPtr &derived)
const;
445 bool isInCustomParserParent()
const;
448 static ImportedScope<QQmlJSScope::ConstPtr> findType(
const QString &name,
449 const QQmlJS::ContextualTypes &contextualTypes,
450 QSet<QString> *usedTypes =
nullptr);
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; }
459 explicit QQmlJSScope(
const QString &internalName);
460 QQmlJSScope(QQmlJSScope &&) =
default;
461 QQmlJSScope &operator=(QQmlJSScope &&) =
default;
463
464
465
466
467 template <
typename T>
468 friend class QTypeInfo;
469 struct QmlIRCompatibilityBindingData
471 QmlIRCompatibilityBindingData() =
default;
472 QmlIRCompatibilityBindingData(
const QString &name, quint32 offset)
473 : propertyName(name), sourceLocationOffset(offset)
476 QString propertyName;
477 quint32 sourceLocationOffset = 0;
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);
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; }
496 QHash<QString, JavaScriptIdentifier> m_jsIdentifiers;
498 QMultiHash<QString, QQmlJSMetaMethod> m_methods;
499 QHash<QString, QQmlJSMetaProperty> m_properties;
500 QMultiHash<QString, QQmlJSMetaPropertyBinding> m_propertyBindings;
504 QList<QmlIRCompatibilityBindingData> m_propertyBindingsArray;
507 QList<QQmlJSMetaMethod::AbsoluteFunctionIndex> m_runtimeFunctionIndices;
509 QHash<QString, QQmlJSMetaEnum> m_enumerations;
511 QList<QQmlJSAnnotation> m_annotations;
512 QList<QQmlJSScope::Ptr> m_childScopes;
513 QQmlJSScope::WeakPtr m_parentScope;
516 QString m_internalName;
517 QString m_baseTypeNameOrError;
521 ImportedScope<QQmlJSScope::WeakConstPtr> m_baseType;
523 ScopeType m_scopeType = ScopeType::QMLScope;
524 QStringList m_aliases;
525 QStringList m_interfaceNames;
526 QStringList m_ownDeferredNames;
527 QStringList m_ownImmediateNames;
529 QString m_defaultPropertyName;
530 QString m_parentPropertyName;
532
533
534
535 QString m_attachedTypeName;
536 QStringList m_requiredPropertyNames;
537 QQmlJSScope::WeakConstPtr m_attachedType;
540
541
542
543 QString m_elementTypeName;
544 QQmlJSScope::WeakConstPtr m_elementType;
545 QQmlJSScope::Ptr m_listType;
548
549
550
551
552
553
554 QString m_extensionTypeName;
555 QQmlJSScope::WeakConstPtr m_extensionType;
557 Flags m_flags = Creatable;
558 AccessSemantics m_semantics = AccessSemantics::Reference;
560 QQmlJS::SourceLocation m_sourceLocation;
561 QQmlJS::SourceLocation m_idSourceLocation;
563 QString m_moduleName;
565 std::optional<QString> m_inlineComponentName;