12#include <QtCore/qqueue.h>
13#include <QtCore/qsharedpointer.h>
15#include <private/qduplicatetracker_p.h>
49 parent->m_childScopes.removeOne(childScope);
62 parent->m_childScopes.append(cloned);
72 return m_jsIdentifiers;
81 m_jsIdentifiers.insert(
name, identifier);
85 targetScope = targetScope->parentScope();
86 targetScope->m_jsIdentifiers.insert(
name, identifier);
95 method.setMethodType(QQmlJSMetaMethodType::Signal);
96 method.setIsImplicitQmlPropertyChangeSignal(
true);
121 QHash<QString, QQmlJSMetaMethod>
results;
126 for (
auto it =
scope->m_methods.constBegin();
it !=
scope->m_methods.constEnd();
139 QList<QQmlJSMetaMethod>
results;
153 QList<QQmlJSMetaMethod>
results;
177 for (
const auto &e : m_enumerations) {
178 if (e.keys().contains(
name))
196 if (
it ==
scope->m_enumerations.end())
207 QHash<QString, QQmlJSMetaEnum>
results;
210 for (
auto it =
scope->m_enumerations.constBegin();
it !=
scope->m_enumerations.constEnd();
225 switch (m_semantics) {
226 case AccessSemantics::Reference:
227 return m_internalName +
" *"_L1;
228 case AccessSemantics::Value:
229 case AccessSemantics::Sequence:
231 case AccessSemantics::None:
236 switch (
base->accessSemantics()) {
237 case AccessSemantics::Reference:
238 return m_internalName +
" *"_L1;
239 case AccessSemantics::Value:
240 case AccessSemantics::Sequence:
241 return m_internalName;
242 case AccessSemantics::None:
248 return m_internalName;
253 const auto internal =
"$internal$."_L1;
254 const QString anonymous =
"$anonymous$."_L1;
258 if (pretty.startsWith(internal))
259 pretty = pretty.
mid(internal.size());
260 else if (pretty.startsWith(anonymous))
261 pretty = pretty.
mid(anonymous.size());
263 if (pretty == u
"std::nullptr_t")
266 if (pretty == u
"void")
267 return u
"undefined"_s;
289 return base->internalName() == u
"QQmlComponent";
292std::optional<QQmlJSScope::JavaScriptIdentifier>
298 auto it =
scope->m_jsIdentifiers.find(
id);
299 if (
it !=
scope->m_jsIdentifiers.end())
304 return std::optional<JavaScriptIdentifier>{};
309 auto it = m_jsIdentifiers.find(
id);
310 if (
it != m_jsIdentifiers.end())
313 return std::optional<JavaScriptIdentifier>{};
319 const int separatorIndex =
typeName.lastIndexOf(u
'.');
321 if (separatorIndex < 1 || separatorIndex >=
typeName.size() - 1)
324 const auto parentIt = contextualTypes.types().constFind(
typeName.first(separatorIndex).toString());
325 if (parentIt == contextualTypes.types().constEnd())
328 auto inlineComponentParent = *parentIt;
335 QQueue<QQmlJSScope::ConstPtr> candidatesForInlineComponents;
336 candidatesForInlineComponents.enqueue(inlineComponentParent.scope);
337 while (candidatesForInlineComponents.size()) {
342 return { current, inlineComponentParent.revision };
346 candidatesForInlineComponents.append(current->
childScopes());
348 candidatesForInlineComponents.enqueue(
base);
363 QSet<QString> *usedTypes)
365 const auto useType = [&]() {
366 if (usedTypes !=
nullptr)
367 usedTypes->insert(
name);
370 auto type = contextualTypes.types().constFind(
name);
372 if (
type != contextualTypes.types().constEnd()) {
377 const auto findListType = [&](
const QString &prefix,
const QString &postfix)
378 -> ImportedScope<ConstPtr> {
379 if (
name.startsWith(prefix) &&
name.endsWith(postfix)) {
382 =
name.
mid(prefixLength,
name.length() - prefixLength - postfix.length());
383 const ImportedScope<ConstPtr> element
384 =
findType(elementName, contextualTypes, usedTypes);
387 return { element.scope->listType(), element.revision };
394 switch (contextualTypes.context()) {
396 if (
const auto listType = findListType(u
"QList<"_s, u
">"_s);
401 if (
const auto listType = findListType(u
"QQmlListProperty<"_s, u
">"_s);
408 if (colonColon == -1)
412 const auto outerType = contextualTypes.types().constFind(outerTypeName);
413 if (outerType == contextualTypes.types().constEnd())
416 for (
const auto &innerType : std::as_const(outerType->scope->m_childScopes)) {
417 if (innerType->m_internalName ==
name) {
419 return { innerType, outerType->revision };
428 if (inlineComponent.scope) {
430 return inlineComponent;
444 QSet<QString> *usedTypes)
446 if (self->accessSemantics() == AccessSemantics::Sequence
447 && self->internalName().
startsWith(u
"QQmlListProperty<"_s)) {
448 self->setIsListProperty(
true);
462 if (!
self->m_extensionType) {
464 if (
self->accessSemantics() == AccessSemantics::Sequence) {
466 self->setExtensionTypeName(u
"Array"_s);
467 self->setExtensionIsJavaScript(
true);
482 it->setType(
it->isList() ?
type.scope->listType() :
type.scope);
488 it->setType(
it->isList()
496 !parameter.type() && !
typeName.isEmpty()) {
498 if (
type.scope && parameter.isList()) {
499 type.scope =
type.scope->listType();
500 parameter.setIsList(
false);
501 parameter.setIsPointer(
false);
502 parameter.setTypeName(
type.scope ?
type.scope->internalName() :
QString());
503 }
else if (
type.scope &&
type.scope->isReferenceType()) {
504 parameter.setIsPointer(
true);
506 parameter.setType({
type.scope });
511 auto returnValue =
it->returnValue();
512 resolveParameter(returnValue);
513 it->setReturnValue(returnValue);
515 auto parameters =
it->parameters();
517 resolveParameter(parameters[
i]);
518 it->setParameters(parameters);
529void QQmlJSScope::updateChildScope(
537 if (mode == QQmlJSScope::ExtensionNamespace)
539 const auto propertyIt = type->m_properties.find(childScope->internalName());
540 if (propertyIt != type->m_properties.end()) {
541 childScope->m_baseType.scope = QQmlJSScope::ConstPtr(propertyIt->type());
542 if (propertyIt->type())
543 childScope->m_semantics = propertyIt->type()->accessSemantics();
544 childScope->setBaseTypeName(propertyIt->typeName());
551 if (
const auto attachedBase =
findType(
552 childScope->
internalName(), contextualTypes, usedTypes).scope) {
553 childScope->m_baseType.scope = attachedBase->attachedType();
562template<
typename Resolver,
typename ChildScopeUpdater>
569 const auto childScopes = self->childScopes();
571 const auto childScope = *
it;
572 update(childScope, self, contextualTypes, usedTypes);
580 QSet<QString> *usedTypes)
584 QSet<QString> *usedTypes) {
587 return resolveType(self, contextualTypes, usedTypes);
594 QSet<QString> *usedTypes)
603 if (underlyingType == u
"uint"
604 || underlyingType == u
"quint8"
605 || underlyingType == u
"ushort"
606 || underlyingType == u
"ulonglong") {
610 if (underlyingType == u
"int"
611 || underlyingType == u
"qint8"
612 || underlyingType == u
"short"
613 || underlyingType == u
"longlong") {
635 QSet<QString> *usedTypes)
638 QHash<QString, QQmlJSMetaEnum> toBeAppended;
639 for (
auto it = self->m_enumerations.
begin(),
end = self->m_enumerations.
end();
it !=
end; ++
it) {
649 else if (
it->isFlag())
651 enumScope->setBaseTypeName(
typeName);
653 enumScope->m_baseType = {
type.scope,
type.revision };
655 enumScope->m_semantics = AccessSemantics::Value;
656 enumScope->m_internalName = self->internalName() +
QStringLiteral(
"::") +
it->name();
657 if (
QString alias =
it->alias(); !alias.isEmpty()
658 && self->m_enumerations.constFind(alias) == self->m_enumerations.
constEnd()) {
660 aliasScope->m_internalName = self->internalName() +
QStringLiteral(
"::") + alias;
663 toBeAppended.insert(alias, cpy);
668 self->m_enumerations.
insert(toBeAppended);
673 if (self->listType() || self->accessSemantics() == AccessSemantics::Sequence)
681 if (self->isComposite()) {
685 }
else if (self->isReferenceType()) {
721 auto qmlScope =
scope;
723 qmlScope = qmlScope->parentScope();
733 return scope->m_properties.contains(
name);
745 if (
it ==
scope->m_properties.end())
762 QHash<QString, QQmlJSMetaProperty>
results;
767 for (
auto it =
scope->m_properties.constBegin();
768 it !=
scope->m_properties.constEnd();
it++) {
786 owner = { scope, mode };
797 m_requiredPropertyNames.removeOne(
name);
798 else if (!m_requiredPropertyNames.contains(
name))
799 m_requiredPropertyNames.append(
name);
804 bool isRequired =
false;
807 if (
scope->isPropertyLocallyRequired(
name)) {
827 return m_requiredPropertyNames.contains(
name);
839 std::rotate(
r.first, std::next(
r.first),
r.second);
842 addOwnPropertyBindingInQmlIROrder(binding, specifier);
847 BindingTargetSpecifier specifier)
857 "We really want T to be relocatable as it improves QList<T> performance");
866 const auto bindingOnTheSameProperty =
867 [&](
const QQmlJSScope::QmlIRCompatibilityBindingData &
x) {
874 auto pos = std::find_if_not(m_propertyBindingsArray.
begin(), m_propertyBindingsArray.
end(),
875 bindingOnTheSameProperty);
886 for (
auto it = m_propertyBindingsArray.
cbegin();
it != m_propertyBindingsArray.
cend();
888 if (!(
it->sourceLocationOffset <=
x.sourceLocation().offset))
898 m_propertyBindingsArray.
emplaceFront(
x.propertyName(),
x.sourceLocation().offset);
899 }
else if (
pos == m_propertyBindingsArray.
size()) {
900 m_propertyBindingsArray.
emplaceBack(
x.propertyName(),
x.sourceLocation().offset);
903 m_propertyBindingsArray.
emplace(
pos + 1,
x.propertyName(),
904 x.sourceLocation().offset);
908 const qsizetype insertionPos = findInsertionPoint(binding);
909 insertAfter(insertionPos, binding);
921 QList<QQmlJSMetaPropertyBinding> qmlIrOrdered;
922 qmlIrOrdered.reserve(m_propertyBindingsArray.
size());
924 for (
const auto &
data : m_propertyBindingsArray) {
928 return x.sourceLocation().
offset ==
data.sourceLocationOffset;
931 qmlIrOrdered.append(*binding);
945 return scope->hasOwnPropertyBindings(
name);
951 QList<QQmlJSMetaPropertyBinding> bindings;
960 bindings.append(*
it);
972 return scope->m_interfaceNames.contains(
name);
978 bool isDeferred =
false;
982 if (!immediate.isEmpty()) {
983 isDeferred = !immediate.contains(name);
987 if (!deferred.isEmpty()) {
988 isDeferred = deferred.contains(
name);
1024 if (!
name.isEmpty())
1042 if (
scope->ownAttachedType().isNull())
1058 if (
scope->ownAttachedType().isNull())
1069 if (!m_extensionType)
1085 const bool nameIsEmpty = (m_scopeType == ScopeType::AttachedPropertyScope
1086 || m_scopeType == ScopeType::GroupedPropertyScope)
1088 : m_baseTypeNameOrError.
isEmpty();
1091 if (m_baseType.scope.isNull())
1103 return !
name.isEmpty();
1113 return !
name.isEmpty();
1120 bool baseResolved =
true;
1122 if (!
scope->isResolved()) {
1123 baseResolved = false;
1129 return baseResolved;
1134 : m_package(
std::move(package))
1136 , m_version(
std::move(version))
1137 , m_revision(
std::move(revision))
1143 return m_version.isValid() || !m_package.isEmpty() || !m_type.isEmpty();
1148 scope->setOwnModuleName(m_moduleName);
1151 m_importer->m_globalWarnings.append(typeReader.errors());
1156 if (m_isSingleton && !scope->isSingleton()) {
1157 m_importer->m_globalWarnings.append(
1159 "Type %1 declared as singleton in qmldir but missing pragma Singleton")
1160 .arg(scope->internalName()),
1162 scope->setIsSingleton(
true);
1163 }
else if (!m_isSingleton && scope->isSingleton()) {
1164 m_importer->m_globalWarnings.append(
1166 "but using pragma Singleton")
1167 .arg(scope->internalName()),
1169 scope->setIsSingleton(
false);
1193 const bool isBaseComponent = [
this]() {
1198 for (
auto cppBase = nonCompositeBaseType(baseType()); cppBase;
1199 cppBase = cppBase->baseType()) {
1200 if (cppBase->internalName() == u
"QQmlAbstractDelegateComponent")
1206 QDuplicateTracker<QQmlJSScope::ConstPtr> seen;
1207 for (
auto scope =
derived; !scope.isNull() && !seen.hasSeen(scope);
1208 scope = scope->baseType()) {
1209 if (isSameType(scope))
1211 if (isBaseComponent && scope->internalName() == u
"QObject"_s)
1218 return isListProperty() && valueType()->canAssign(
derived);
1227 for (
const auto *scope =
this; scope; scope = scope->parentScope().
get()) {
1228 if (!scope->baseType().isNull() && scope->baseType()->hasCustomParser())
1242 Q_ASSERT(isInlineComponent() == m_inlineComponentName.has_value());
1243 return m_inlineComponentName;
1254 if (
type->isInlineComponent())
1255 return *
type->inlineComponentName();
1262 QVector<QQmlJSScope::ConstPtr>
result;
1263 result.reserve(m_childScopes.size());
1264 for (
const auto &
child : m_childScopes)
1286 auto isCreatableNonRecursive = [](
const QQmlJSScope *scope) {
1287 return scope->hasCreatableFlag() && !scope->isSingleton()
1291 for (
const QQmlJSScope* scope =
this; scope; scope = scope->baseType().get()) {
1292 if (!scope->isComposite()) {
1294 return isCreatableNonRecursive(scope);
1297 if (isCreatableNonRecursive(scope))
1307 for (
const QQmlJSScope *scope =
this; scope; scope = scope->baseType().
get()) {
1308 if (!scope->isComposite())
1309 return scope->hasStructuredFlag();
1336 for (
auto base = scope;
base.scope;
1337 base = {
base.scope->m_baseType.scope,
base.scope->m_baseType.revision }) {
1338 if (!
base.scope->isComposite())
1339 return base.revision;
1353 return this == otherScope.get()
1360 for (
const QQmlJSScope *scope =
this; scope; scope = scope->baseType().
get()) {
1361 if (scope->isSameType(
base))
QSharedPointer< T > toStrongRef() const
qsizetype size() const noexcept
reference emplaceFront(Args &&... args)
iterator insert(qsizetype i, parameter_type t)
reference emplaceBack(Args &&... args)
iterator emplace(const_iterator before, Args &&... args)
const_iterator cend() const noexcept
void append(parameter_type t)
const_iterator cbegin() const noexcept
std::pair< iterator, iterator > equal_range(const Key &key)
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
qsizetype size() const noexcept
Tracks the types for the QmlCompiler.
QHash< QString, QQmlJSMetaProperty > properties() const
Returns all properties visible from this scope including those of base types and extensions.
QString attachedTypeName() const
QList< QQmlJSMetaPropertyBinding > propertyBindings(const QString &name) const
bool isStructured() const
void insertJSIdentifier(const QString &name, const JavaScriptIdentifier &identifier)
QDeferredSharedPointer< QQmlJSScope > Ptr
bool isNameDeferred(const QString &name) const
QHash< QString, QQmlJSMetaMethod > methods() const
Returns all methods visible from this scope including those of base types and extensions.
InlineComponentOrDocumentRootName enclosingInlineComponentName() const
QString defaultPropertyName() const
bool isInCustomParserParent() const
bool hasPropertyBindings(const QString &name) const
static QQmlJSScope::Ptr create()
bool isSameType(const QQmlJSScope::ConstPtr &otherScope) const
void setAccessSemantics(AccessSemantics semantics)
std::monostate RootDocumentNameType
static AnnotatedScope ownerOfProperty(const QQmlJSScope::ConstPtr &self, const QString &name)
bool isComponentRootElement() const
AnnotatedScope extensionType() const
QQmlJSScope::Ptr parentScope()
ScopeType scopeType() const
static void resolveNonEnumTypes(const QQmlJSScope::Ptr &self, const QQmlJS::ContextualTypes &contextualTypes, QSet< QString > *usedTypes=nullptr)
void setInternalName(const QString &internalName)
QString baseTypeName() const
QString internalName() const
std::variant< InlineComponentNameType, RootDocumentNameType > InlineComponentOrDocumentRootName
A Hashable type to differentiate document roots from different inline components.
static ImportedScope< QQmlJSScope::ConstPtr > findType(const QString &name, const QQmlJS::ContextualTypes &contextualTypes, QSet< QString > *usedTypes=nullptr)
bool isReferenceType() const
void addOwnProperty(const QQmlJSMetaProperty &prop)
QString parentPropertyName() const
static void resolveList(const QQmlJSScope::Ptr &self, const QQmlJSScope::ConstPtr &arrayType)
QHash< QString, QQmlJSMetaEnum > enumerations() const
static QTypeRevision resolveTypes(const Ptr &self, const QQmlJS::ContextualTypes &contextualTypes, QSet< QString > *usedTypes=nullptr)
@ WrappedInImplicitComponent
QString moduleName() const
bool isInlineComponent() const
void insertPropertyIdentifier(const QQmlJSMetaProperty &prop)
AccessSemantics accessSemantics() const
static QQmlSA::Element createQQmlSAElement(const ConstPtr &)
bool hasEnumeration(const QString &name) const
QVector< QQmlJSScope::Ptr > childScopes()
bool hasEnumerationKey(const QString &name) const
void setBaseTypeName(const QString &baseTypeName)
bool isFullyResolved() const
bool hasInterface(const QString &name) const
static void resolveEnums(const QQmlJSScope::Ptr &self, const QQmlJS::ContextualTypes &contextualTypes, QSet< QString > *usedTypes=nullptr)
QQmlJSMetaEnum enumeration(const QString &name) const
QList< QQmlJSMetaPropertyBinding > ownPropertyBindingsInQmlIROrder() const
void addOwnPropertyBinding(const QQmlJSMetaPropertyBinding &binding, BindingTargetSpecifier specifier=BindingTargetSpecifier::SimplePropertyTarget)
QQmlJSScope(const QString &internalName)
std::optional< JavaScriptIdentifier > jsIdentifier(const QString &id) const
bool hasMethod(const QString &name) const
std::optional< JavaScriptIdentifier > ownJSIdentifier(const QString &id) const
QQmlJSScope::ConstPtr listType() const
static const QQmlJSScope::ConstPtr & scope(const QQmlSA::Element &)
bool isPropertyRequired(const QString &name) const
void setValueTypeName(const QString &name)
static QQmlJSScope::ConstPtr nonCompositeBaseType(const QQmlJSScope::ConstPtr &type)
QString augmentedInternalName() const
QQmlJSScope::ConstPtr attachedType() const
bool inherits(const QQmlJSScope::ConstPtr &base) const
static QQmlJSScope::Ptr clone(const QQmlJSScope::ConstPtr &origin)
QDeferredSharedPointer< const QQmlJSScope > ConstPtr
QQmlJSMetaProperty property(const QString &name) const
bool hasOwnEnumerationKey(const QString &name) const
static QTypeRevision nonCompositeBaseRevision(const ImportedScope< QQmlJSScope::ConstPtr > &scope)
static QString prettyName(QAnyStringView name)
bool canAssign(const QQmlJSScope::ConstPtr &derived) const
QQmlJSScope::ConstPtr baseType() const
void addOwnMethod(const QQmlJSMetaMethod &method)
bool isPropertyLocallyRequired(const QString &name) const
std::optional< QString > inlineComponentName() const
void addOwnRuntimeFunctionIndex(QQmlJSMetaMethod::AbsoluteFunctionIndex index)
bool hasProperty(const QString &name) const
QHash< QString, JavaScriptIdentifier > ownJSIdentifiers() const
static void reparent(const QQmlJSScope::Ptr &parentScope, const QQmlJSScope::Ptr &childScope)
static QQmlJSScope::ConstPtr findCurrentQMLScope(const QQmlJSScope::ConstPtr &scope)
QString baseTypeError() const
static void resolveGeneralizedGroup(const QQmlJSScope::Ptr &self, const QQmlJSScope::ConstPtr &baseType, const QQmlJS::ContextualTypes &contextualTypes, QSet< QString > *usedTypes=nullptr)
void setFilePath(const QString &file)
QMultiHash< QString, QQmlJSMetaMethod > ownMethods() const
QQmlJSScope::ConstPtr valueType() const
void setPropertyLocallyRequired(const QString &name, bool isRequired)
void setBaseTypeError(const QString &baseTypeError)
static QString propertyNameToChangedSignalName(QStringView property)
\macro QT_RESTRICTED_CAST_FROM_ASCII
QString left(qsizetype n) const &
iterator begin()
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first character in the string.
const_iterator constEnd() const
Returns a const \l{STL-style iterators}{STL-style iterator} pointing just after the last character in...
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
QString mid(qsizetype position, qsizetype n=-1) const &
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
iterator end()
Returns an \l{STL-style iterators}{STL-style iterator} pointing just after the last character in the ...
QString & insert(qsizetype i, QChar c)
QChar * data()
Returns a pointer to the data stored in the QString.
qsizetype length() const noexcept
Returns the number of characters in this string.
QSet< QString >::iterator it
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter * iter
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char * method
static QDBusError::ErrorType get(const char *name)
static ControlElement< T > * ptr(QWidget *widget)
GLint GLint GLint GLint GLint x
[0]
GLenum GLuint GLenum GLsizei length
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLintptr offset
static bool isComposite(const QQmlJSScope::ConstPtr &scope)
static QString internalName(const QQmlJSScope::ConstPtr &scope)
static QQmlJSScope::ImportedScope< QQmlJSScope::ConstPtr > qFindInlineComponents(QStringView typeName, const QQmlJS::ContextualTypes &contextualTypes)
static QString flagStorage(const QString &underlyingType)
static QTypeRevision resolveTypesInternal(Resolver resolve, ChildScopeUpdater update, const QQmlJSScope::Ptr &self, const QQmlJS::ContextualTypes &contextualTypes, QSet< QString > *usedTypes)
static const QQmlJSScope * resolve(const QQmlJSScope *current, const QStringList &names)
#define QStringLiteral(str)
if(qFloatDistance(a, b)<(1<< 7))
[0]
bool contains(const AT &t) const noexcept
static bool searchBaseAndExtensionTypes(QQmlJSScopePtr type, const Action &check)