31 if (!element.isNull())
32 m_types[element].append({ propertyName.
toString(),
warning.toString() });
40 for (
const auto &pair : std::as_const(m_types).asKeyValueRange()) {
50 for (
const auto &elementPair : std::as_const(m_types).asKeyValueRange()) {
55 for (
const auto &
warning : elementPair.second) {
60 const auto firstBinding = bindings.
constBegin().value();
73 QList<TypeDescription> allowedTypes,
76 QVarLengthArray<QQmlSA::Element, 4>
elements;
90 Warning{ elements, allowInDelegate, warning.toString() }) });
95void AttachedPropertyTypeValidatorPass::checkWarnings(
const QQmlSA::Element &element,
103 if (scopeUsedIn.inherits(
type))
107 if (
warning->allowInDelegate) {
108 if (scopeUsedIn.isPropertyRequired(u
"index"_s)
109 || scopeUsedIn.isPropertyRequired(u
"model"_s))
116 if (!scopeUsedIn.parentScope() || scopeUsedIn.parentScope().internalId() == u
"global"_s)
120 scopeUsedIn.parentScope().propertyBindings(u
"delegate"_s)) {
121 if (!binding.hasObject())
123 if (binding.objectType() == scopeUsedIn)
158 checkWarnings(element, readScope,
location);
170 checkWarnings(element, writeScope,
location);
177 ControlElement {
"Control",
178 QStringList {
"background",
"contentItem",
"leftPadding",
"rightPadding",
179 "topPadding",
"bottomPadding",
"horizontalPadding",
180 "verticalPadding",
"padding" },
182 ControlElement {
"Button",
QStringList {
"indicator" } },
185 QStringList {
"background",
"contentItem",
"header",
"footer",
"menuBar" } },
186 ControlElement {
"ComboBox",
QStringList {
"indicator" } },
187 ControlElement {
"Dial",
QStringList {
"handle" } },
188 ControlElement {
"GroupBox",
QStringList {
"label" } },
189 ControlElement {
"$internal$.QQuickIndicatorButton",
QStringList {
"indicator" },
false },
190 ControlElement {
"Label",
QStringList {
"background" } },
191 ControlElement {
"MenuItem",
QStringList {
"arrow" } },
192 ControlElement {
"Page",
QStringList {
"header",
"footer" } },
193 ControlElement {
"Popup",
QStringList {
"background",
"contentItem" } },
194 ControlElement {
"RangeSlider",
QStringList {
"handle" } },
195 ControlElement {
"Slider",
QStringList {
"handle" } },
196 ControlElement {
"$internal$.QQuickSwipe",
197 QStringList {
"leftItem",
"behindItem",
"rightItem" },
false },
198 ControlElement {
"TextArea",
QStringList {
"background" } },
199 ControlElement {
"TextField",
QStringList {
"background" } },
202 for (
const QString &module : { u
"QtQuick.Controls.macOS"_s, u
"QtQuick.Controls.Windows"_s }) {
203 if (!
manager->hasImportedModule(module))
208 for (ControlElement &element : m_elements) {
209 auto type =
resolveType(element.isInModuleControls ? module :
"QtQuick.Templates",
215 element.inheritsControl = !element.isControl &&
type.
inherits(control);
216 element.element =
type;
219 m_elements.
removeIf([](
const ControlElement &element) {
return element.element.
isNull(); });
227 for (
const ControlElement &controlElement : m_elements) {
229 if (controlElement.inheritsControl)
231 if (element.
inherits(controlElement.element))
239 for (
const ControlElement &controlElement : m_elements) {
240 if (element.
inherits(controlElement.element)) {
241 for (
const QString &propertyName : controlElement.restrictedProperties) {
244 "styles cannot be customized: See "
245 "https://doc-snapshots.qt.io/qt6-dev/"
246 "qtquickcontrols-customize.html#customization-"
247 "reference for more information.")
255 if (!controlElement.isControl)
263 , m_item(resolveType(
"QtQuick",
"Item"))
275 enum BindingLocation { Exists = 1, Own = (1 << 1) };
276 QHash<QString, qint8> bindings;
279 u
"top"_s, u
"bottom"_s, u
"verticalCenter"_s,
282 QList<QQmlSA::Binding> anchorBindings = element.
propertyBindings(u
"anchors"_s);
284 for (
qsizetype i = anchorBindings.size() - 1;
i >= 0;
i--) {
285 auto groupType = anchorBindings[
i].groupType();
286 if (groupType.isNull())
291 const auto &propertyBindings = groupType.ownPropertyBindings(
name);
292 if (propertyBindings.begin() == propertyBindings.end())
295 bool isUndefined =
false;
296 for (
const auto &propertyBinding : propertyBindings) {
297 if (propertyBinding.hasUndefinedScriptValue()) {
306 bindings[
name] |= Exists | ((
i == 0) ? Own : 0);
314 if (bindings[
name] & Own) {
317 Q_ASSERT(bindings.begin() != bindings.end());
318 warnLoc = bindings.begin().value().sourceLocation();
325 if ((bindings[u
"left"_s] & bindings[u
"right"_s] & bindings[u
"horizontalCenter"_s]) & Exists) {
327 ownSourceLocation({ u
"left"_s, u
"right"_s, u
"horizontalCenter"_s });
329 if (warnLoc.isValid()) {
331 "Cannot specify left, right, and horizontalCenter anchors at the same time.",
336 if ((bindings[u
"top"_s] & bindings[u
"bottom"_s] & bindings[u
"verticalCenter"_s]) & Exists) {
338 ownSourceLocation({ u
"top"_s, u
"bottom"_s, u
"verticalCenter"_s });
339 if (warnLoc.isValid()) {
340 emitWarning(
"Cannot specify top, bottom, and verticalCenter anchors at the same time.",
345 if ((bindings[u
"baseline"_s] & (bindings[u
"bottom"_s] | bindings[u
"verticalCenter"_s]))
348 ownSourceLocation({ u
"baseline"_s, u
"bottom"_s, u
"verticalCenter"_s });
349 if (warnLoc.isValid()) {
350 emitWarning(
"Baseline anchor cannot be used in conjunction with top, bottom, or "
351 "verticalCenter anchors.",
359 , m_swipeDelegate(resolveType(
"QtQuick.Controls",
"SwipeDelegate"))
365 return !m_swipeDelegate.
isNull() && element.
inherits(m_swipeDelegate);
370 for (
const auto &
property : { u
"background"_s, u
"contentItem"_s }) {
372 if (!binding.hasObject())
376 if (bindings.isEmpty())
382 auto anchors = bindings.first().groupType();
383 for (
const auto &disallowed : { u
"fill"_s, u
"centerIn"_s, u
"left"_s, u
"right"_s }) {
384 if (
anchors.hasPropertyBindings(disallowed)) {
386 const auto &ownBindings =
anchors.ownPropertyBindings(disallowed);
387 if (ownBindings.begin() != ownBindings.end()) {
388 location = ownBindings.begin().value().sourceLocation();
392 u
"SwipeDelegate: Cannot use horizontal anchors with %1; unable to layout the item."_s
403 if (swipe.begin() == swipe.end())
406 const auto firstSwipe = swipe.
begin().value();
410 auto group = firstSwipe.groupType();
412 const std::array ownDirBindings = {
group.ownPropertyBindings(u
"right"_s),
413 group.ownPropertyBindings(u
"left"_s),
414 group.ownPropertyBindings(u
"behind"_s) };
416 auto ownBindingIterator =
417 std::find_if(ownDirBindings.begin(), ownDirBindings.end(),
418 [](
const auto &bindings) { return bindings.begin() != bindings.end(); });
420 if (ownBindingIterator == ownDirBindings.end())
423 if (
group.hasPropertyBindings(u
"behind"_s)
424 && (
group.hasPropertyBindings(u
"right"_s) ||
group.hasPropertyBindings(u
"left"_s))) {
425 emitWarning(
"SwipeDelegate: Cannot set both behind and left/right properties",
432 const QMultiHash<QString, TypeDescription> &expectedPropertyTypes)
435 QMultiHash<QString, QQmlSA::Element> propertyTypes;
437 for (
const auto &pair : expectedPropertyTypes.asKeyValueRange()) {
440 :
resolveType(pair.second.module, pair.second.name);
442 propertyTypes.insert(pair.first, propType);
445 m_expectedPropertyTypes = propertyTypes;
464 if (!
value.isNull()) {
483 [&](
const QQmlSA::Element &scope) { return bindingType.inherits(scope); })
486 const bool bindingTypeIsComposite = bindingType.
isComposite();
487 if (bindingTypeIsComposite && !bindingType.
baseType()) {
496 const QString bindingTypeName =
498 : bindingType.
name();
502 expectedTypeNames <<
it.value().name();
504 emitWarning(u
"Unexpected type for property \"%1\" expected %2 got %3"_s.arg(
505 propertyName, expectedTypeNames.join(u
", "_s), bindingTypeName),
515 const auto attachedTypeAndLocation = std::find_if(
516 range.first,
range.second, [&](
const ElementAndLocation &elementAndLocation) {
517 return elementAndLocation.element == element;
519 if (attachedTypeAndLocation !=
range.second) {
528 scope = scope.parentScope()) {
532 if (
it->element == element) {
542 attachedLocation.startLine(),
543 attachedLocation.startColumn() };
545 id.isEmpty() ? u
"<id>."_s : (
id +
'.'_L1) };
548 suggestion.
setHint(
"You first have to give the element an id"_L1);
550 suggestion.setAutoApplicable();
552 emitWarning(
"Using attached type %1 already initialized in a parent scope."_L1.arg(
554 category, attachedLocation, suggestion);
565 if (!
type || !attached)
572 if (parent.internalId() ==
"QQuickAttachedPropertyPropagator"_L1) {
602 const bool hasQuick =
manager->hasImportedModule(
"QtQuick");
603 const bool hasQuickLayouts =
manager->hasImportedModule(
"QtQuick.Layouts");
604 const bool hasQuickControls =
manager->hasImportedModule(
"QtQuick.Templates")
605 ||
manager->hasImportedModule(
"QtQuick.Controls")
606 ||
manager->hasImportedModule(
"QtQuick.Controls.Basic");
611 manager->registerElementPass(std::make_unique<AnchorsValidatorPass>(
manager));
612 manager->registerElementPass(std::make_unique<PropertyChangesValidatorPass>(
manager));
614 auto forbiddenChildProperty =
615 std::make_unique<ForbiddenChildrenPropertyValidatorPass>(
manager);
617 for (
const QString &element : { u
"Grid"_s, u
"Flow"_s }) {
619 forbiddenChildProperty->addWarning(
621 u
"Cannot specify %1 for items inside %2. %2 will not function."_s.arg(
626 if (hasQuickLayouts) {
627 forbiddenChildProperty->addWarning(
628 "QtQuick.Layouts",
"Layout",
"anchors",
629 "Detected anchors on an item that is managed by a layout. This is undefined "
630 u
"behavior; use Layout.alignment instead.");
631 forbiddenChildProperty->addWarning(
632 "QtQuick.Layouts",
"Layout",
"x",
633 "Detected x on an item that is managed by a layout. This is undefined "
634 u
"behavior; use Layout.leftMargin or Layout.rightMargin instead.");
635 forbiddenChildProperty->addWarning(
636 "QtQuick.Layouts",
"Layout",
"y",
637 "Detected y on an item that is managed by a layout. This is undefined "
638 u
"behavior; use Layout.topMargin or Layout.bottomMargin instead.");
639 forbiddenChildProperty->addWarning(
640 "QtQuick.Layouts",
"Layout",
"width",
641 "Detected width on an item that is managed by a layout. This is undefined "
642 u
"behavior; use implicitWidth or Layout.preferredWidth instead.");
643 forbiddenChildProperty->addWarning(
644 "QtQuick.Layouts",
"Layout",
"height",
645 "Detected height on an item that is managed by a layout. This is undefined "
646 u
"behavior; use implictHeight or Layout.preferredHeight instead.");
649 manager->registerElementPass(std::move(forbiddenChildProperty));
652 auto attachedPropertyType = std::make_shared<AttachedPropertyTypeValidatorPass>(
manager);
654 auto addAttachedWarning = [&](
TypeDescription attachedType, QList<TypeDescription> allowedTypes,
656 QString attachedTypeName = attachedPropertyType->addWarning(attachedType, allowedTypes,
658 manager->registerPropertyPass(attachedPropertyType, attachedType.module,
659 u
"$internal$."_s + attachedTypeName, {},
false);
662 auto addVarBindingWarning =
664 const QMultiHash<QString, TypeDescription> &expectedPropertyTypes) {
665 auto varBindingType = std::make_shared<VarBindingTypeValidatorPass>(
666 manager, expectedPropertyTypes);
667 for (
const auto &propertyName : expectedPropertyTypes.uniqueKeys()) {
674 addVarBindingWarning(
"QtQuick",
"TableView",
675 { {
"columnWidthProvider", {
"",
"function" } },
676 {
"rowHeightProvider", {
"",
"function" } } });
677 addAttachedWarning({
"QtQuick",
"Accessible" }, { {
"QtQuick",
"Item" } },
678 "Accessible must be attached to an Item");
679 addAttachedWarning({
"QtQuick",
"LayoutMirroring" },
680 { {
"QtQuick",
"Item" }, {
"QtQuick",
"Window" } },
681 "LayoutDirection attached property only works with Items and Windows");
682 addAttachedWarning({
"QtQuick",
"EnterKey" }, { {
"QtQuick",
"Item" } },
683 "EnterKey attached property only works with Items");
685 if (hasQuickLayouts) {
686 addAttachedWarning({
"QtQuick.Layouts",
"Layout" }, { {
"QtQuick",
"Item" } },
687 "Layout must be attached to Item elements");
688 addAttachedWarning({
"QtQuick.Layouts",
"StackLayout" }, { {
"QtQuick",
"Item" } },
689 "StackLayout must be attached to an Item");
693 if (hasQuickControls) {
694 manager->registerElementPass(std::make_unique<ControlsSwipeDelegateValidatorPass>(
manager));
695 manager->registerPropertyPass(std::make_unique<AttachedPropertyReuse>(
696 manager, attachedReuseCategory),
"",
"");
698 addAttachedWarning({
"QtQuick.Templates",
"ScrollBar" },
699 { {
"QtQuick",
"Flickable" }, {
"QtQuick.Templates",
"ScrollView" } },
700 "ScrollBar must be attached to a Flickable or ScrollView");
701 addAttachedWarning({
"QtQuick.Templates",
"ScrollIndicator" },
702 { {
"QtQuick",
"Flickable" } },
703 "ScrollIndicator must be attached to a Flickable");
704 addAttachedWarning({
"QtQuick.Templates",
"TextArea" }, { {
"QtQuick",
"Flickable" } },
705 "TextArea must be attached to a Flickable");
706 addAttachedWarning({
"QtQuick.Templates",
"SplitView" }, { {
"QtQuick",
"Item" } },
707 "SplitView attached property only works with Items");
708 addAttachedWarning({
"QtQuick.Templates",
"StackView" }, { {
"QtQuick",
"Item" } },
709 "StackView attached property only works with Items");
710 addAttachedWarning({
"QtQuick.Templates",
"ToolTip" }, { {
"QtQuick",
"Item" } },
711 "ToolTip must be attached to an Item");
712 addAttachedWarning({
"QtQuick.Templates",
"SwipeDelegate" }, { {
"QtQuick",
"Item" } },
713 "Attached properties of SwipeDelegate must be accessed through an Item");
714 addAttachedWarning({
"QtQuick.Templates",
"SwipeView" }, { {
"QtQuick",
"Item" } },
715 "SwipeView must be attached to an Item");
717 {
"QtQuick.Templates",
"Tumbler" }, { {
"QtQuick",
"Tumbler" } },
718 "Tumbler: attached properties of Tumbler must be accessed through a delegate item",
720 addVarBindingWarning(
"QtQuick.Templates",
"Tumbler",
721 { {
"contentItem", {
"QtQuick",
"PathView" } },
722 {
"contentItem", {
"QtQuick",
"ListView" } } });
723 addVarBindingWarning(
"QtQuick.Templates",
"SpinBox",
724 { {
"textFromValue", {
"",
"function" } },
725 {
"valueFromText", {
"",
"function" } } });
727 manager->registerPropertyPass(std::make_unique<AttachedPropertyReuse>(
728 manager, attachedReuseCategory),
"",
"");
731 if (
manager->hasImportedModule(u
"QtQuick.Controls.macOS"_s)
732 ||
manager->hasImportedModule(u
"QtQuick.Controls.Windows"_s))
733 manager->registerElementPass(std::make_unique<ControlsNativeValidatorPass>(
manager));
738 , m_propertyChanges(resolveType(
"QtQuick",
"PropertyChanges"))
744 return !m_propertyChanges.
isNull() && element.
inherits(m_propertyChanges);
753 [](
const auto binding) { return binding.propertyName() == u
"target"_s; });
758 const auto targetLocation =
target.value().sourceLocation();
761 if (!targetElement.isNull())
762 targetId = targetBinding;
764 bool hadCustomParsedBindings =
false;
766 const auto &propertyName =
it.key();
767 const auto &propertyBinding =
it.value();
772 if (!targetElement.isNull() && !targetElement.hasProperty(propertyName)) {
774 "Unknown property \"%1\" in PropertyChanges."_L1.arg(propertyName),
780 if (binding.
length() > 16)
781 binding = binding.
left(13) +
"..."_L1;
783 hadCustomParsedBindings =
true;
784 emitWarning(
"Property \"%1\" is custom-parsed in PropertyChanges. "
785 "You should phrase this binding as \"%2.%1: %3\""_L1.arg(propertyName, targetId,
790 if (hadCustomParsedBindings && !targetElement.isNull()) {
791 emitWarning(
"You should remove any bindings on the \"target\" property and avoid "
792 "custom-parsed bindings in PropertyChanges.",
799#include "moc_quicklintplugin.cpp"
bool shouldRun(const QQmlSA::Element &element) override
Controls whether the run() function should be executed on the given element.
AnchorsValidatorPass(QQmlSA::PassManager *manager)
void run(const QQmlSA::Element &element) override
Executes if shouldRun() returns true.
void onRead(const QQmlSA::Element &element, const QString &propertyName, const QQmlSA::Element &readScope, QQmlSA::SourceLocation location) override
Executes whenever a property is read.
void onWrite(const QQmlSA::Element &element, const QString &propertyName, const QQmlSA::Element &value, const QQmlSA::Element &writeScope, QQmlSA::SourceLocation location) override
Executes whenever a property is written to.
void onRead(const QQmlSA::Element &element, const QString &propertyName, const QQmlSA::Element &readScope, QQmlSA::SourceLocation location) override
Executes whenever a property is read.
AttachedPropertyTypeValidatorPass(QQmlSA::PassManager *manager)
void onWrite(const QQmlSA::Element &element, const QString &propertyName, const QQmlSA::Element &value, const QQmlSA::Element &writeScope, QQmlSA::SourceLocation location) override
Executes whenever a property is written to.
void onBinding(const QQmlSA::Element &element, const QString &propertyName, const QQmlSA::Binding &binding, const QQmlSA::Element &bindingScope, const QQmlSA::Element &value) override
Executes whenever a property gets bound to a value.
QString addWarning(TypeDescription attachType, QList< TypeDescription > allowedTypes, bool allowInDelegate, QAnyStringView warning)
ControlsNativeValidatorPass(QQmlSA::PassManager *manager)
void run(const QQmlSA::Element &element) override
Executes if shouldRun() returns true.
bool shouldRun(const QQmlSA::Element &element) override
Controls whether the run() function should be executed on the given element.
bool shouldRun(const QQmlSA::Element &element) override
Controls whether the run() function should be executed on the given element.
ControlsSwipeDelegateValidatorPass(QQmlSA::PassManager *manager)
void run(const QQmlSA::Element &element) override
Executes if shouldRun() returns true.
void addWarning(QAnyStringView moduleName, QAnyStringView typeName, QAnyStringView propertyName, QAnyStringView warning)
ForbiddenChildrenPropertyValidatorPass(QQmlSA::PassManager *manager)
void run(const QQmlSA::Element &element) override
Executes if shouldRun() returns true.
bool shouldRun(const QQmlSA::Element &element) override
Controls whether the run() function should be executed on the given element.
void run(const QQmlSA::Element &element) override
Executes if shouldRun() returns true.
PropertyChangesValidatorPass(QQmlSA::PassManager *manager)
bool shouldRun(const QQmlSA::Element &element) override
Controls whether the run() function should be executed on the given element.
QString toString() const
Returns a deep copy of this string view's data as a QString.
const_iterator constFind(const Key &key) const noexcept
const_iterator cend() const noexcept
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
qsizetype removeIf(Predicate pred)
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.
QMultiHash< QString, Binding >::const_iterator constBegin() const
Returns an iterator to the beginning of the bindings.
QMultiHash< QString, Binding >::const_iterator begin() const
QMultiHash< QString, Binding >::const_iterator constEnd() const
Returns an iterator to the end of the bindings.
BindingType bindingType() const
static bool isLiteralBinding(BindingType)
Returns true if bindingType is a literal type, and false otherwise.
Element objectType() const
Returns the type of the associated object if the content type of this binding is Object,...
QQmlSA::SourceLocation sourceLocation() const
Returns the location in the QML code where this binding is defined.
QString internalId() const
Element baseType() const
Returns the Element this Element derives from.
bool hasMethod(const QString &methodName) const
Returns whether this Element has a method with the name methodName.
QString name() const
Returns the name of this Element.
QQmlSA::SourceLocation sourceLocation() const
Returns the location in the QML code where this Element is defined.
Binding::Bindings ownPropertyBindings() const
Returns this Element's property bindings which are not defined on its base or extension objects.
QList< Binding > propertyBindings(const QString &propertyName) const
Returns this Element's property bindings that have the name propertyName.
bool isComposite() const
Returns true for objects defined from Qml, and false for objects declared from C++.
bool hasProperty(const QString &propertyName) const
Returns whether this Element has a property with the name propertyName.
Element parentScope() const
Returns the Element that encloses this Element.
bool inherits(const Element &) const
Returns whether this Element inherits from element.
bool hasOwnPropertyBindings(const QString &propertyName) const
Returns whether this Element has property bindings which are not defined in its base or extension obj...
void setHint(const QString &)
Sets hint as the hint for this fix suggestion.
void emitWarning(QAnyStringView diagnostic, LoggerWarningId id)
Emits a warning message diagnostic about an issue of type id.
Element resolveLiteralType(const Binding &binding)
Returns the element representing the type of literal in binding.
Element resolveBuiltinType(QAnyStringView typeName) const
Returns the type of the built-in type identified by typeName.
Element resolveAttached(QAnyStringView moduleName, QAnyStringView typeName)
Returns the attached type of typeName defined in module moduleName.
QString resolveElementToId(const Element &element, const Element &context)
Returns the id of element in a given context.
Element resolveTypeInFileScope(QAnyStringView typeName)
Returns the type corresponding to typeName inside the currently analysed file.
QString sourceCode(QQmlSA::SourceLocation location)
Returns the source code located within location.
Element resolveAttachedInFileScope(QAnyStringView typeName)
Returns the attached type corresponding to typeName used inside the currently analysed file.
Element resolveIdToElement(QAnyStringView id, const Element &context)
Returns the element in context that has id id.
Element resolveType(QAnyStringView moduleName, QAnyStringView typeName)
Returns the type of typeName defined in module moduleName.
quint32 offset() const
Returns the offset of the beginning of this source location.
\macro QT_RESTRICTED_CAST_FROM_ASCII
QString left(qsizetype n) const &
qsizetype count(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
qsizetype length() const noexcept
Returns the number of characters in this string.
void registerPasses(QQmlSA::PassManager *manager, const QQmlSA::Element &rootElement) override
Adds a pass manager that will be executed on rootElement.
VarBindingTypeValidatorPass(QQmlSA::PassManager *manager, const QMultiHash< QString, TypeDescription > &expectedPropertyTypes)
void onBinding(const QQmlSA::Element &element, const QString &propertyName, const QQmlSA::Binding &binding, const QQmlSA::Element &bindingScope, const QQmlSA::Element &value) override
Executes whenever a property gets bound to a value.
QSet< QString >::iterator it
Combined button and popup list for selecting options.
static const QCssKnownValue properties[NumProperties - 1]
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
const QQmlSA::LoggerWarningId qmlAttachedPropertyReuse
QDebug warning(QAnyStringView fileName, int lineNumber)
QQuickAnchors * anchors(QQuickItem *item)
#define QStringLiteral(str)
static const QTextHtmlElement elements[Html_NumElements]
static constexpr QQmlSA::LoggerWarningId quickUnexpectedVarType
static constexpr QQmlSA::LoggerWarningId quickControlsNativeCustomize
static constexpr QQmlSA::LoggerWarningId quickControlsAttachedPropertyReuse
static constexpr QQmlSA::LoggerWarningId quickAttachedPropertyType
static constexpr QQmlSA::LoggerWarningId quickAnchorCombinations
static constexpr QQmlSA::LoggerWarningId quickAttachedPropertyReuse
static constexpr QQmlSA::LoggerWarningId quickPropertyChangesParsed
static constexpr QQmlSA::LoggerWarningId quickLayoutPositioning
QNetworkAccessManager manager
\inmodule QtCore \reentrant