Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmljsregistercontent.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3// Qt-Security score:significant
4
6
7#include <variant>
8
10
11using namespace Qt::StringLiterals;
12
14{
15public:
16
17 using ContentVariant = QQmlJSRegisterContent::ContentVariant;
18
22
24 {
28
29 friend size_t qHash(const ConvertedTypes &types, size_t seed = 0)
30 {
31 return qHashMulti(seed, types.origins, types.result, types.resultScope);
32 }
33
34 friend bool operator==(const ConvertedTypes &a, const ConvertedTypes &b)
35 {
36 return a.origins == b.origins && a.result == b.result && a.resultScope == b.resultScope;
37 }
38
39 friend bool operator!=(const ConvertedTypes &a, const ConvertedTypes &b)
40 {
41 return !(a == b);
42 }
43 };
44
46 {
50
51 friend size_t qHash(const PropertyLookup &property, size_t seed = 0)
52 {
53 return qHashMulti(
54 seed, property.property, property.baseLookupIndex, property.resultLookupIndex);
55 }
56
57 friend bool operator==(const PropertyLookup &a, const PropertyLookup &b)
58 {
59 return a.baseLookupIndex == b.baseLookupIndex
60 && a.resultLookupIndex == b.resultLookupIndex
61 && a.property == b.property;
62 }
63
64 friend bool operator!=(const PropertyLookup &a, const PropertyLookup &b)
65 {
66 return !(a == b);
67 }
68 };
69
78 >;
79
80 friend size_t qHash(const QQmlJSRegisterContentPrivate &registerContent, size_t seed = 0)
81 {
82 seed = qHashMulti(
83 seed, registerContent.m_storage, registerContent.m_content.index(),
84 registerContent.m_variant, registerContent.m_scope);
85
86 switch (Kind(registerContent.m_content.index())) {
87 case Kind::Type:
88 return qHash(std::get<std::pair<QQmlJSScope::ConstPtr, int>>(registerContent.m_content),
89 seed);
90 case Kind::Property:
91 return qHash(std::get<PropertyLookup>(registerContent.m_content), seed);
92 case Kind::Enum:
93 return qHash(std::get<std::pair<QQmlJSMetaEnum, QString>>(registerContent.m_content),
94 seed);
95 case Kind::Method:
96 return qHash(std::get<std::pair<QList<QQmlJSMetaMethod>, QQmlJSScope::ConstPtr>>(
97 registerContent.m_content), seed);
98 case Kind::ImportNamespace:
99 return qHash(std::get<std::pair<uint, QQmlJSScope::ConstPtr>>(
100 registerContent.m_content), seed);
101 case Kind::Conversion:
102 return qHash(std::get<ConvertedTypes>(registerContent.m_content), seed);
103 case Kind::MethodCall:
104 return qHash(std::get<QQmlJSMetaMethod>(registerContent.m_content), seed);
105 }
106
107 Q_UNREACHABLE_RETURN(seed);
108 }
109
110 friend bool operator==(
112 {
113 return a.m_storage == b.m_storage && a.m_variant == b.m_variant
114 && a.m_scope == b.m_scope && a.m_content == b.m_content;
115 }
116
117 friend bool operator!=(
119 {
120 return !(a == b);
121 }
122
127
130
132 {
133 switch (Kind(m_content.index())) {
134 case Kind::Type:
135 return std::get<std::pair<QQmlJSScope::ConstPtr, int>>(m_content).second;
136 case Kind::Property:
137 return std::get<PropertyLookup>(m_content).resultLookupIndex;
138 default:
139 return QQmlJSRegisterContent::InvalidLookupIndex;
140 }
141 }
142
143 void setType(const QQmlJSScope::ConstPtr &type)
144 {
145 switch (Kind(m_content.index())) {
146 case Kind::Type:
147 std::get<std::pair<QQmlJSScope::ConstPtr, int>>(m_content).first = type;
148 return;
149 case Kind::Property:
150 std::get<PropertyLookup>(m_content).property.setType(type);
151 return;
152 case Kind::Enum:
153 std::get<std::pair<QQmlJSMetaEnum, QString>>(m_content).first.setType(type);
154 return;
155 case Kind::Method:
156 std::get<std::pair<QList<QQmlJSMetaMethod>, QQmlJSScope::ConstPtr>>(m_content)
157 .second = type;
158 return;
159 case Kind::ImportNamespace:
160 std::get<std::pair<uint, QQmlJSScope::ConstPtr>>(m_content).second = type;
161 return;
162 case Kind::Conversion:
163 std::get<ConvertedTypes>(m_content).result = type;
164 return;
165 case Kind::MethodCall:
166 std::get<QQmlJSMetaMethod>(m_content).setReturnType({ type });
167 return;
168 }
169
170 Q_UNREACHABLE_RETURN();
171 }
172
173private:
174 friend class QQmlJSRegisterContentPool;
175
176 QQmlJSRegisterContentPrivate() = default;
177 ~QQmlJSRegisterContentPrivate() = default;
178 QQmlJSRegisterContentPrivate(const QQmlJSRegisterContentPrivate &) = default;
179 QQmlJSRegisterContentPrivate(QQmlJSRegisterContentPrivate &&) = default;
182};
183
184bool QQmlJSRegisterContent::isValid() const
185{
186 return !containedType().isNull();
187};
188
189QString QQmlJSRegisterContent::descriptiveName() const
190{
191 using Kind = QQmlJSRegisterContentPrivate::Kind;
192
193 if (!d || (!d->m_storage.isValid() && containedType().isNull()))
194 return u"(invalid type)"_s;
195
196 const auto scope = [this]() -> QString {
197 if (!d->m_scope.isValid())
198 return u"(invalid type)::"_s;
199
200 const QQmlJSScope::ConstPtr scopeContained = d->m_scope.containedType();
201 if (scopeContained.isNull())
202 return u"(invalid type)::"_s;
203
204 return (scopeContained->internalName().isEmpty()
205 ? (scopeContained->filePath().isEmpty()
206 ? u"??"_s
207 : (u"(component in "_s + scopeContained->filePath() + u")"_s))
208 : scopeContained->internalName())
209 + u"::"_s;
210 };
211
212 QString result;
213 switch (Kind(d->m_content.index())) {
214 case Kind::Type: {
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();
220 return result;
221 }
222 case Kind::Property: {
223 const QQmlJSMetaProperty prop = property();
224 result += scope() + prop.propertyName() + u" with type "_s + prop.typeName();
225
226 QStringList details;
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());
232
233 if (!details.isEmpty())
234 result += u" (%1)"_s.arg(details.join(u", "));
235
236 return result;
237 }
238 case Kind::Method: {
239 const auto methods = method();
240 if (methods.isEmpty())
241 result = scope() + u"(unknown method)"_s;
242 else
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")";
246 return result;
247 }
248 case Kind::Enum: {
249 const QString enumName = enumeration().name();
250 const QString memberName = enumMember();
251 if (memberName.isEmpty())
252 result = scope() + enumName;
253 else
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")";
257 return result;
258 }
259 case Kind::ImportNamespace: {
260 return u"import namespace %1"_s.arg(importNamespace());
261 }
262 case Kind::Conversion: {
263 return u"conversion to %1"_s.arg(conversionResultType()->internalName());
264 }
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());
269 }
270 }
271
272 Q_UNREACHABLE_RETURN(result + u"wat?"_s);
273}
274
275QString QQmlJSRegisterContent::containedTypeName() const
276{
277 QQmlJSScope::ConstPtr type;
278
279 switch (variant()) {
280 case QQmlJSRegisterContent::MetaType:
281 type = scopeType();
282 break;
283 default:
284 type = containedType();
285 break;
286 }
287
288 return QQmlJSScope::prettyName(
289 type->internalName().isEmpty() ? type->baseTypeName() : type->internalName());
290}
291
292bool QQmlJSRegisterContent::isType() const
293{
294 return d && d->m_content.index() == size_t(QQmlJSRegisterContentPrivate::Kind::Type);
295}
296
297bool QQmlJSRegisterContent::isProperty() const
298{
299 return d && d->m_content.index() == size_t(QQmlJSRegisterContentPrivate::Kind::Property);
300}
301
302bool QQmlJSRegisterContent::isEnumeration() const
303{
304 return d && d->m_content.index() == size_t(QQmlJSRegisterContentPrivate::Kind::Enum);
305}
306
307bool QQmlJSRegisterContent::isMethod() const
308{
309 return d && d->m_content.index() == size_t(QQmlJSRegisterContentPrivate::Kind::Method);
310}
311
312bool QQmlJSRegisterContent::isImportNamespace() const
313{
314 return d && d->m_content.index() == size_t(QQmlJSRegisterContentPrivate::Kind::ImportNamespace);
315}
316
317bool QQmlJSRegisterContent::isConversion() const
318{
319 return d && d->m_content.index() == size_t(QQmlJSRegisterContentPrivate::Kind::Conversion);
320}
321
322bool QQmlJSRegisterContent::isMethodCall() const
323{
324 return d && d->m_content.index() == size_t(QQmlJSRegisterContentPrivate::Kind::MethodCall);
325}
326
327bool QQmlJSRegisterContent::isList() const
328{
329 using Kind = QQmlJSRegisterContentPrivate::Kind;
330
331 if (!d)
332 return false;
333
334 switch (Kind(d->m_content.index())) {
335 case Kind::Type:
336 return std::get<std::pair<QQmlJSScope::ConstPtr, int>>(d->m_content).first
337 ->accessSemantics() == QQmlJSScope::AccessSemantics::Sequence;
338 case Kind::Property:
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;
347 default:
348 return false;
349 }
350}
351
352bool QQmlJSRegisterContent::isWritable() const
353{
354 using Kind = QQmlJSRegisterContentPrivate::Kind;
355
356 if (!d)
357 return false;
358
359 switch (Kind(d->m_content.index())) {
360 case Kind::Property:
361 return std::get<QQmlJSRegisterContentPrivate::PropertyLookup>(d->m_content)
362 .property.isWritable();
363
364 // TODO: What can we actually write?
365 default:
366 break;
367 }
368
369 return true;
370}
371
372bool QQmlJSRegisterContent::isJavaScriptReturnValue() const
373{
374 return d && isMethodCall() && std::get<QQmlJSMetaMethod>(d->m_content).isJavaScriptFunction();
375}
376
377/*!
378 * \internal
379 * Precondition: This is an attachment.
380 * Return the type that does the attaching.
381 */
382QQmlJSRegisterContent QQmlJSRegisterContent::attacher() const
383{
384 Q_ASSERT(d);
385 Q_ASSERT(d->m_variant == Attachment);
386 return scope();
387}
388
389/*!
390 * \internal
391 * Precondition: This is an attachment.
392 * Return the type of the object the attachment is attached to.
393 */
394QQmlJSRegisterContent QQmlJSRegisterContent::attachee() const
395{
396 Q_ASSERT(d);
397 Q_ASSERT(d->m_variant == Attachment);
398 QQmlJSRegisterContent attachee = attacher().scope();
399 while (attachee.variant() == ModulePrefix)
400 attachee = attachee.scope();
401 return attachee;
402}
403
404QQmlJSScope::ConstPtr QQmlJSRegisterContent::storedType() const
405{
406 return d ? d->m_storage.containedType() : QQmlJSScope::ConstPtr();
407}
408
409QQmlJSScope::ConstPtr QQmlJSRegisterContent::containedType() const
410{
411 if (!d)
412 return QQmlJSScope::ConstPtr();
413 if (isType())
414 return type();
415 if (isProperty())
416 return std::get<QQmlJSRegisterContentPrivate::PropertyLookup>(d->m_content).property.type();
417 if (isEnumeration())
418 return std::get<std::pair<QQmlJSMetaEnum, QString>>(d->m_content).first.type();
419 if (isMethod())
420 return methodType();
421 if (isImportNamespace())
422 return importNamespaceType();
423 if (isConversion())
424 return conversionResultType();
425 if (isMethodCall())
426 return std::get<QQmlJSMetaMethod>(d->m_content).returnType();
427
428 Q_UNREACHABLE_RETURN({});
429}
430
431QQmlJSScope::ConstPtr QQmlJSRegisterContent::scopeType() const
432{
433 return d ? d->m_scope.containedType() : QQmlJSScope::ConstPtr();
434}
435
436QQmlJSScope::ConstPtr QQmlJSRegisterContent::type() const
437{
438 Q_ASSERT(isType());
439 return std::get<std::pair<QQmlJSScope::ConstPtr, int>>(d->m_content).first;
440}
441
442QQmlJSMetaProperty QQmlJSRegisterContent::property() const
443{
444 Q_ASSERT(isProperty());
445 return std::get<QQmlJSRegisterContentPrivate::PropertyLookup>(d->m_content).property;
446}
447
448int QQmlJSRegisterContent::baseLookupIndex() const
449{
450 Q_ASSERT(isProperty());
451 return std::get<QQmlJSRegisterContentPrivate::PropertyLookup>(d->m_content).baseLookupIndex;
452}
453
454int QQmlJSRegisterContent::resultLookupIndex() const
455{
456 return d ? d->resultLookupIndex() : InvalidLookupIndex;
457}
458
459QQmlJSMetaEnum QQmlJSRegisterContent::enumeration() const
460{
461 Q_ASSERT(isEnumeration());
462 return std::get<std::pair<QQmlJSMetaEnum, QString>>(d->m_content).first;
463}
464
465QString QQmlJSRegisterContent::enumMember() const
466{
467 Q_ASSERT(isEnumeration());
468 return std::get<std::pair<QQmlJSMetaEnum, QString>>(d->m_content).second;
469}
470
471QList<QQmlJSMetaMethod> QQmlJSRegisterContent::method() const
472{
473 Q_ASSERT(isMethod());
474 return std::get<std::pair<QList<QQmlJSMetaMethod>, QQmlJSScope::ConstPtr>>(d->m_content).first;
475}
476
477QQmlJSScope::ConstPtr QQmlJSRegisterContent::methodType() const
478{
479 Q_ASSERT(isMethod());
480 return std::get<std::pair<QList<QQmlJSMetaMethod>, QQmlJSScope::ConstPtr>>(d->m_content).second;
481}
482
483uint QQmlJSRegisterContent::importNamespace() const
484{
485 Q_ASSERT(isImportNamespace());
486 return std::get<std::pair<uint, QQmlJSScope::ConstPtr>>(d->m_content).first;
487}
488
489QQmlJSScope::ConstPtr QQmlJSRegisterContent::importNamespaceType() const
490{
491 Q_ASSERT(isImportNamespace());
492 return std::get<std::pair<uint, QQmlJSScope::ConstPtr>>(d->m_content).second;
493}
494
495QQmlJSScope::ConstPtr QQmlJSRegisterContent::conversionResultType() const
496{
497 Q_ASSERT(isConversion());
498 return std::get<QQmlJSRegisterContentPrivate::ConvertedTypes>(d->m_content).result;
499}
500
501QQmlJSRegisterContent QQmlJSRegisterContent::conversionResultScope() const
502{
503 Q_ASSERT(isConversion());
504 return std::get<QQmlJSRegisterContentPrivate::ConvertedTypes>(d->m_content).resultScope;
505}
506
507QList<QQmlJSRegisterContent> QQmlJSRegisterContent::conversionOrigins() const
508{
509 Q_ASSERT(isConversion());
510 return std::get<QQmlJSRegisterContentPrivate::ConvertedTypes>(d->m_content).origins;
511}
512
513QQmlJSMetaMethod QQmlJSRegisterContent::methodCall() const
514{
515 Q_ASSERT(isMethodCall());
516 return std::get<QQmlJSMetaMethod>(d->m_content);
517}
518
519QQmlJSRegisterContent::ContentVariant QQmlJSRegisterContent::variant() const
520{
521 return d ? d->m_variant : Unknown;
522}
523
524QQmlJSRegisterContent QQmlJSRegisterContent::scope() const
525{
526 return d ? d->m_scope : QQmlJSRegisterContent();
527}
528
529QQmlJSRegisterContent QQmlJSRegisterContent::storage() const
530{
531 return d ? d->m_storage : QQmlJSRegisterContent();
532}
533
534QQmlJSRegisterContent QQmlJSRegisterContent::original() const
535{
536 return d ? d->m_original : QQmlJSRegisterContent();
537}
538
539QQmlJSRegisterContent QQmlJSRegisterContent::shadowed() const
540{
541 return d ? d->m_shadowed : QQmlJSRegisterContent();
542}
543
544QQmlJSRegisterContentPool::QQmlJSRegisterContentPool() = default;
545QQmlJSRegisterContentPool::~QQmlJSRegisterContentPool() = default;
546
547QQmlJSRegisterContent QQmlJSRegisterContentPool::createType(
548 const QQmlJSScope::ConstPtr &type, int resultLookupIndex,
549 QQmlJSRegisterContent::ContentVariant variant, QQmlJSRegisterContent scope)
550{
551 QQmlJSRegisterContentPrivate *result = create(scope, variant);
552 result->m_content = std::make_pair(type, resultLookupIndex);
553 return result;
554}
555
556QQmlJSRegisterContent QQmlJSRegisterContentPool::createProperty(
557 const QQmlJSMetaProperty &property, int baseLookupIndex, int resultLookupIndex,
558 QQmlJSRegisterContent::ContentVariant variant, QQmlJSRegisterContent scope)
559{
560 QQmlJSRegisterContentPrivate *result = create(scope, variant);
561 result->m_content = QQmlJSRegisterContentPrivate::PropertyLookup {
562 property,
563 baseLookupIndex,
564 resultLookupIndex
565 };
566 return result;
567}
568
569QQmlJSRegisterContent QQmlJSRegisterContentPool::createEnumeration(
570 const QQmlJSMetaEnum &enumeration, const QString &enumMember,
571 QQmlJSRegisterContent::ContentVariant variant, QQmlJSRegisterContent scope)
572{
573 QQmlJSRegisterContentPrivate *result = create(scope, variant);
574 result->m_content = std::make_pair(enumeration, enumMember);
575 return result;
576}
577
578QQmlJSRegisterContent QQmlJSRegisterContentPool::createMethod(
579 const QList<QQmlJSMetaMethod> &methods, const QQmlJSScope::ConstPtr &methodType,
580 QQmlJSRegisterContent::ContentVariant variant, QQmlJSRegisterContent scope)
581{
582 // Methods can only be stored in QJSValue.
583 Q_ASSERT(methodType->internalName() == u"QJSValue"_s);
584 QQmlJSRegisterContentPrivate *result = create(scope, variant);
585 result->m_content = std::make_pair(methods, methodType);
586 return result;
587}
588
589QQmlJSRegisterContent QQmlJSRegisterContentPool::createMethodCall(
590 const QQmlJSMetaMethod &method, const QQmlJSScope::ConstPtr &returnType,
591 QQmlJSRegisterContent scope)
592{
593 QQmlJSRegisterContentPrivate *result = create(scope, ContentVariant::MethodCall);
594
595 QQmlJSMetaMethod resultMethod = method;
596 resultMethod.setReturnType({ returnType });
597 resultMethod.setReturnTypeName(returnType->internalName());
598 result->m_content = std::move(resultMethod);
599
600 return result;
601}
602
603QQmlJSRegisterContent QQmlJSRegisterContentPool::createImportNamespace(
604 uint importNamespaceStringId, const QQmlJSScope::ConstPtr &importNamespaceType,
605 QQmlJSRegisterContent::ContentVariant variant, QQmlJSRegisterContent scope)
606{
607 QQmlJSRegisterContentPrivate *result = create(scope, variant);
608 result->m_content = std::make_pair(importNamespaceStringId, importNamespaceType);
609 return result;
610}
611
612QQmlJSRegisterContent QQmlJSRegisterContentPool::createConversion(
613 const QList<QQmlJSRegisterContent> &origins, const QQmlJSScope::ConstPtr &conversion,
614 QQmlJSRegisterContent conversionScope, ContentVariant variant,
615 QQmlJSRegisterContent scope)
616{
617 QQmlJSRegisterContentPrivate *result = create(scope, variant);
618
619 result->m_content = QQmlJSRegisterContentPrivate::ConvertedTypes {
620 origins,
621 conversion,
622 conversionScope
623 };
624
625 return result;
626}
627
628QQmlJSRegisterContent QQmlJSRegisterContentPool::storedIn(
629 QQmlJSRegisterContent content, const QQmlJSScope::ConstPtr &newStoredType)
630{
631 Q_ASSERT(content.d);
632 QQmlJSRegisterContentPrivate *result = clone(content.d);
633 result->m_storage = createType(
634 newStoredType, QQmlJSRegisterContent::InvalidLookupIndex, ContentVariant::Storage);
635 return result;
636}
637
638QQmlJSRegisterContent QQmlJSRegisterContentPool::castTo(
639 QQmlJSRegisterContent content, const QQmlJSScope::ConstPtr &newContainedType)
640{
641 // This is not a conversion but a run time cast. It may result in null or undefined.
642 QQmlJSRegisterContentPrivate *result = create(content, ContentVariant::Cast);
643 result->m_content = std::make_pair(newContainedType, result->resultLookupIndex());
644 return result;
645}
646
647void QQmlJSRegisterContentPool::storeType(
648 QQmlJSRegisterContent content, const QQmlJSScope::ConstPtr &stored)
649{
650 QQmlJSRegisterContentPrivate *d = content.d;
651
652 Q_ASSERT(d);
653 Q_ASSERT(d->m_storage.isNull());
654 d->m_storage = createType(
655 stored, QQmlJSRegisterContent::InvalidLookupIndex, ContentVariant::Storage);
656}
657
658void QQmlJSRegisterContentPool::adjustType(
659 QQmlJSRegisterContent content, const QQmlJSScope::ConstPtr &adjusted)
660{
661 QQmlJSRegisterContentPrivate *d = content.d;
662
663 Q_ASSERT(d);
664 Q_ASSERT(d->m_original.isNull());
665 d->m_original = clone(d);
666 d->setType(adjusted);
667}
668
669void QQmlJSRegisterContentPool::generalizeType(
670 QQmlJSRegisterContent content, const QQmlJSScope::ConstPtr &generalized)
671{
672 QQmlJSRegisterContentPrivate *d = content.d;
673
674 Q_ASSERT(d);
675 Q_ASSERT(d->m_shadowed.isNull());
676 d->m_shadowed = clone(d);
677 d->setType(generalized);
678}
679
680void QQmlJSRegisterContentPool::setAllocationMode(AllocationMode mode)
681{
682 m_checkpoint = (mode == Temporary) ? m_pool.size() : -1;
683}
684
685void QQmlJSRegisterContentPool::clearTemporaries()
686{
687 if (m_checkpoint != -1)
688 m_pool.resize(m_checkpoint);
689}
690
691QQmlJSRegisterContentPrivate *QQmlJSRegisterContentPool::clone(
692 const QQmlJSRegisterContentPrivate *from)
693{
694 m_pool.push_back(std::unique_ptr<QQmlJSRegisterContentPrivate, Deleter>(from
695 ? new QQmlJSRegisterContentPrivate(*from)
696 : new QQmlJSRegisterContentPrivate));
697 return m_pool.back().get();
698}
699
700QQmlJSRegisterContentPrivate *QQmlJSRegisterContentPool::create(
701 QQmlJSRegisterContent scope, ContentVariant variant)
702{
703 QQmlJSRegisterContentPrivate *result = create();
704 result->m_scope = scope;
705 result->m_variant = variant;
706 return result;
707}
708
709QT_END_NAMESPACE
friend bool operator!=(const ConvertedTypes &a, const ConvertedTypes &b)
friend bool operator==(const ConvertedTypes &a, const ConvertedTypes &b)
friend size_t qHash(const ConvertedTypes &types, size_t seed=0)
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)
void setType(const QQmlJSScope::ConstPtr &type)
friend bool operator==(const QQmlJSRegisterContentPrivate &a, const QQmlJSRegisterContentPrivate &b)
friend bool operator!=(const QQmlJSRegisterContentPrivate &a, const QQmlJSRegisterContentPrivate &b)
friend size_t qHash(const QQmlJSRegisterContentPrivate &registerContent, size_t seed=0)