189QString QQmlJSRegisterContent::descriptiveName()
const
191 using Kind = QQmlJSRegisterContentPrivate::Kind;
193 if (!d || (!d->m_storage.isValid() && containedType().isNull()))
194 return u"(invalid type)"_s;
196 const auto scope = [
this]() -> QString {
197 if (!d->m_scope.isValid())
198 return u"(invalid type)::"_s;
200 const QQmlJSScope::ConstPtr scopeContained = d->m_scope.containedType();
201 if (scopeContained.isNull())
202 return u"(invalid type)::"_s;
204 return (scopeContained->internalName().isEmpty()
205 ? (scopeContained->filePath().isEmpty()
207 : (u"(component in "_s + scopeContained->filePath() + u")"_s))
208 : scopeContained->internalName())
213 switch (Kind(d->m_content.index())) {
215 const QQmlJSScope::ConstPtr contained = type();
216 result += contained->internalName();
217 const QQmlJSScope::ConstPtr stored = d->m_storage.containedType();
218 if (stored && stored->internalName() != contained->internalName())
219 result += u" stored as "_s + stored->internalName();
222 case Kind::Property: {
223 const QQmlJSMetaProperty prop = property();
224 result += scope() + prop.propertyName() + u" with type "_s + prop.typeName();
227 if (original().isValid() && !prop.type()->internalName().isEmpty())
228 details.append(u"adjusted to " + prop.type()->internalName());
229 const QQmlJSScope::ConstPtr stored = d->m_storage.containedType();
230 if (stored && stored->internalName() != prop.typeName())
231 details.append(u"stored as "_s + stored->internalName());
233 if (!details.isEmpty())
234 result += u" (%1)"_s.arg(details.join(u", "));
239 const auto methods = method();
240 if (methods.isEmpty())
241 result = scope() + u"(unknown method)"_s;
243 result = scope() + methods[0].methodName() + u"(...)"_s;
244 if (d->m_storage.isValid())
245 return result + u" (stored as "_s + d->m_storage.containedType()->internalName() + u")";
249 const QString enumName = enumeration().name();
250 const QString memberName = enumMember();
251 if (memberName.isEmpty())
252 result = scope() + enumName;
254 result = scope() + enumName + u"::"_s + memberName;
255 if (d->m_storage.isValid())
256 return result + u" (stored as "_s + d->m_storage.containedType()->internalName() + u")";
259 case Kind::ImportNamespace: {
260 return u"import namespace %1"_s.arg(importNamespace());
262 case Kind::Conversion: {
263 return u"conversion to %1"_s.arg(conversionResultType()->internalName());
265 case Kind::MethodCall: {
266 const QQmlJSMetaMethod &method = std::get<QQmlJSMetaMethod>(d->m_content);
267 return u"call to method %1, returning %2"_s.arg(
268 method.methodName(), method.returnTypeName());
272 Q_UNREACHABLE_RETURN(result + u"wat?"_s);
327bool QQmlJSRegisterContent::isList()
const
329 using Kind = QQmlJSRegisterContentPrivate::Kind;
334 switch (Kind(d->m_content.index())) {
336 return std::get<std::pair<QQmlJSScope::ConstPtr,
int>>(d->m_content).first
337 ->accessSemantics() == QQmlJSScope::AccessSemantics::Sequence;
339 return std::get<QQmlJSRegisterContentPrivate::PropertyLookup>(d->m_content).property.type()
340 ->accessSemantics() == QQmlJSScope::AccessSemantics::Sequence;
341 case Kind::Conversion:
342 return std::get<QQmlJSRegisterContentPrivate::ConvertedTypes>(d->m_content).result
343 ->accessSemantics() == QQmlJSScope::AccessSemantics::Sequence;
344 case Kind::MethodCall:
345 return std::get<QQmlJSMetaMethod>(d->m_content).returnType()
346 ->accessSemantics() == QQmlJSScope::AccessSemantics::Sequence;
394QQmlJSRegisterContent QQmlJSRegisterContent::attachee()
const
397 Q_ASSERT(d->m_variant == Attachment);
398 QQmlJSRegisterContent attachee = attacher().scope();
399 while (attachee.variant() == ModulePrefix)
400 attachee = attachee.scope();
409QQmlJSScope::ConstPtr QQmlJSRegisterContent::containedType()
const
412 return QQmlJSScope::ConstPtr();
416 return std::get<QQmlJSRegisterContentPrivate::PropertyLookup>(d->m_content).property.type();
418 return std::get<std::pair<QQmlJSMetaEnum, QString>>(d->m_content).first.type();
421 if (isImportNamespace())
422 return importNamespaceType();
424 return conversionResultType();
426 return std::get<QQmlJSMetaMethod>(d->m_content).returnType();
428 Q_UNREACHABLE_RETURN({});
547QQmlJSRegisterContent QQmlJSRegisterContentPool::createType(
548 const QQmlJSScope::ConstPtr &type,
int resultLookupIndex,
549 QQmlJSRegisterContent::ContentVariant variant, QQmlJSRegisterContent scope)
551 QQmlJSRegisterContentPrivate *result = create(scope, variant);
552 result->m_content = std::make_pair(type, resultLookupIndex);
556QQmlJSRegisterContent QQmlJSRegisterContentPool::createProperty(
557 const QQmlJSMetaProperty &property,
int baseLookupIndex,
int resultLookupIndex,
558 QQmlJSRegisterContent::ContentVariant variant, QQmlJSRegisterContent scope)
560 QQmlJSRegisterContentPrivate *result = create(scope, variant);
561 result->m_content = QQmlJSRegisterContentPrivate::PropertyLookup {
569QQmlJSRegisterContent QQmlJSRegisterContentPool::createEnumeration(
570 const QQmlJSMetaEnum &enumeration,
const QString &enumMember,
571 QQmlJSRegisterContent::ContentVariant variant, QQmlJSRegisterContent scope)
573 QQmlJSRegisterContentPrivate *result = create(scope, variant);
574 result->m_content = std::make_pair(enumeration, enumMember);
578QQmlJSRegisterContent QQmlJSRegisterContentPool::createMethod(
579 const QList<QQmlJSMetaMethod> &methods,
const QQmlJSScope::ConstPtr &methodType,
580 QQmlJSRegisterContent::ContentVariant variant, QQmlJSRegisterContent scope)
583 Q_ASSERT(methodType->internalName() == u"QJSValue"_s);
584 QQmlJSRegisterContentPrivate *result = create(scope, variant);
585 result->m_content = std::make_pair(methods, methodType);
589QQmlJSRegisterContent QQmlJSRegisterContentPool::createMethodCall(
590 const QQmlJSMetaMethod &method,
const QQmlJSScope::ConstPtr &returnType,
591 QQmlJSRegisterContent scope)
593 QQmlJSRegisterContentPrivate *result = create(scope, ContentVariant::MethodCall);
595 QQmlJSMetaMethod resultMethod = method;
596 resultMethod.setReturnType({ returnType });
597 resultMethod.setReturnTypeName(returnType->internalName());
598 result->m_content = std::move(resultMethod);
603QQmlJSRegisterContent QQmlJSRegisterContentPool::createImportNamespace(
604 uint importNamespaceStringId,
const QQmlJSScope::ConstPtr &importNamespaceType,
605 QQmlJSRegisterContent::ContentVariant variant, QQmlJSRegisterContent scope)
607 QQmlJSRegisterContentPrivate *result = create(scope, variant);
608 result->m_content = std::make_pair(importNamespaceStringId, importNamespaceType);
612QQmlJSRegisterContent QQmlJSRegisterContentPool::createConversion(
613 const QList<QQmlJSRegisterContent> &origins,
const QQmlJSScope::ConstPtr &conversion,
614 QQmlJSRegisterContent conversionScope, ContentVariant variant,
615 QQmlJSRegisterContent scope)
617 QQmlJSRegisterContentPrivate *result = create(scope, variant);
619 result->m_content = QQmlJSRegisterContentPrivate::ConvertedTypes {
628QQmlJSRegisterContent QQmlJSRegisterContentPool::storedIn(
629 QQmlJSRegisterContent content,
const QQmlJSScope::ConstPtr &newStoredType)
632 QQmlJSRegisterContentPrivate *result = clone(content.d);
633 result->m_storage = createType(
634 newStoredType, QQmlJSRegisterContent::InvalidLookupIndex, ContentVariant::Storage);
638QQmlJSRegisterContent QQmlJSRegisterContentPool::castTo(
639 QQmlJSRegisterContent content,
const QQmlJSScope::ConstPtr &newContainedType)
642 QQmlJSRegisterContentPrivate *result = create(content, ContentVariant::Cast);
643 result->m_content = std::make_pair(newContainedType, result->resultLookupIndex());
647void QQmlJSRegisterContentPool::storeType(
648 QQmlJSRegisterContent content,
const QQmlJSScope::ConstPtr &stored)
650 QQmlJSRegisterContentPrivate *d = content.d;
653 Q_ASSERT(d->m_storage.isNull());
654 d->m_storage = createType(
655 stored, QQmlJSRegisterContent::InvalidLookupIndex, ContentVariant::Storage);
658void QQmlJSRegisterContentPool::adjustType(
659 QQmlJSRegisterContent content,
const QQmlJSScope::ConstPtr &adjusted)
661 QQmlJSRegisterContentPrivate *d = content.d;
664 Q_ASSERT(d->m_original.isNull());
665 d->m_original = clone(d);
666 d->setType(adjusted);
669void QQmlJSRegisterContentPool::generalizeType(
670 QQmlJSRegisterContent content,
const QQmlJSScope::ConstPtr &generalized)
672 QQmlJSRegisterContentPrivate *d = content.d;
675 Q_ASSERT(d->m_shadowed.isNull());
676 d->m_shadowed = clone(d);
677 d->setType(generalized);
friend bool operator!=(const ConvertedTypes &a, const ConvertedTypes &b)
QQmlJSScope::ConstPtr result
QQmlJSRegisterContent resultScope
friend bool operator==(const ConvertedTypes &a, const ConvertedTypes &b)
friend size_t qHash(const ConvertedTypes &types, size_t seed=0)
QList< QQmlJSRegisterContent > origins
friend size_t qHash(const PropertyLookup &property, size_t seed=0)
friend bool operator!=(const PropertyLookup &a, const PropertyLookup &b)
friend bool operator==(const PropertyLookup &a, const PropertyLookup &b)
QQmlJSRegisterContent m_shadowed
void setType(const QQmlJSScope::ConstPtr &type)
QQmlJSRegisterContent m_scope
friend bool operator==(const QQmlJSRegisterContentPrivate &a, const QQmlJSRegisterContentPrivate &b)
int resultLookupIndex() const
QQmlJSRegisterContent m_original
friend bool operator!=(const QQmlJSRegisterContentPrivate &a, const QQmlJSRegisterContentPrivate &b)
friend size_t qHash(const QQmlJSRegisterContentPrivate ®isterContent, size_t seed=0)
QQmlJSRegisterContent m_storage