10#if defined(__GNUC__) && __GNUC__ >= 11
11# pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
24#include <QtQml/private/qqmljslexer_p.h>
25#include <QtQml/private/qqmljsparser_p.h>
26#include <QtQml/private/qqmljsengine_p.h>
27#include <QtQml/private/qqmljsastvisitor_p.h>
28#include <QtQml/private/qqmljsast_p.h>
30#include <QtCore/QScopeGuard>
31#include <QtCore/QRegularExpression>
33#include <QtCore/QBasicMutex>
56 auto m = moduleRe.match(uri);
59 .error(Path::tr(
"Invalid module name in import %1").
arg(uri))
60 .handle(errorHandler);
67 .field(Fields::moduleIndexWithUri)
70 .field(Fields::moduleScope)
77 if (!version.
isEmpty() && !(
v.isValid() ||
v.isLatest()))
78 Path::myErrors().error(Path::tr(
"Invalid Version %1").
arg(version)).handle(errorHandler);
93 cont = cont && self.dvWrapField(visitor, Fields::comments, m_comments);
111 cont = cont && self.dvValueField(visitor, Fields::name,
name());
112 cont = cont && self.dvWrapField(visitor, Fields::enumerations, m_enumerations);
113 cont = cont && self.dvWrapField(visitor, Fields::objects, m_objects);
114 cont = cont && self.dvValueField(visitor, Fields::isSingleton,
isSingleton());
115 cont = cont && self.dvValueField(visitor, Fields::isCreatable,
isCreatable());
116 cont = cont && self.dvValueField(visitor, Fields::isComposite,
isComposite());
117 cont = cont && self.dvValueField(visitor, Fields::attachedTypeName,
attachedTypeName());
118 cont = cont && self.dvReferenceField(visitor, Fields::attachedType,
attachedTypePath(self));
124 if (
name == Fields::name)
125 return self.wrapField(Fields::name, m_name);
126 if (
name == Fields::objects)
127 return self.wrapField(Fields::objects, m_objects);
141 cont = cont && self.dvWrapField(visitor, Fields::ids, m_ids);
142 cont = cont && self.dvValueLazyField(visitor, Fields::subComponents, [
this, &self]() {
145 if (m_nameIdentifiers) {
146 cont = cont && self.dvItemField(visitor, Fields::nameIdentifiers, [
this, &self]() {
147 return self.subScriptElementWrapperItem(m_nameIdentifiers);
170 self.field(Fields::objects).index(0).writeOut(lw);
176 const QSet<QString> cNames =
components.keys();
177 QString myNameDot = self.pathFromOwner()[1].headName();
178 if (!myNameDot.isEmpty())
180 QList<QString> subNames;
181 for (
const QString &cName : cNames)
182 if (cName.startsWith(myNameDot)
185 subNames.append(cName);
186 std::sort(subNames.begin(), subNames.end());
206 auto m =
r.matchView(
v);
209 int majorV =
m.capturedView(1).toInt(&
ok);
212 int minorV =
m.capturedView(2).toInt(&
ok);
215 return Version(majorV, minorV);
250 cont = cont && self.dvWrapField(visitor, Fields::majorVersion,
majorVersion);
251 cont = cont && self.dvWrapField(visitor, Fields::minorVersion,
minorVersion);
252 cont = cont && self.dvValueField(visitor, Fields::isLatest,
isLatest());
253 cont = cont && self.dvValueField(visitor, Fields::isValid,
isValid());
254 cont = cont && self.dvValueLazyField(visitor, Fields::stringValue, [
this]() {
263 uR
"((?<uri>\w+(?:\.\w+)*)(?:\W+(?<version>[0-9]+(?:\.[0-9]*)?))?(?:\W+as\W+(?<id>\w+))?$)")));
274 else if (!
m.captured(u
"version").isEmpty())
276 .warning(
tr(
"Version %1 in import string '%2' overridden by explicit "
278 .
arg(
m.captured(2), importStr,
v.stringValue()))
282 resolvedImportId =
m.captured(u
"importId");
284 if (!
m.captured(u
"importId").isEmpty()) {
286 .warning(
tr(
"namespace %1 in import string '%2' overridden by explicit "
297 .error(
tr(
"Unexpected URI format in import '%1'").
arg(importStr))
311 cont = cont &&
self.dvValueField(visitor, Fields::uri,
uri.
toString());
312 cont = cont &&
self.dvWrapField(visitor, Fields::version,
version);
314 cont = cont &&
self.dvValueField(visitor, Fields::importId,
importId);
316 cont = cont &&
self.dvValueField(visitor, Fields::implicit,
implicit);
317 cont = cont &&
self.dvWrapField(visitor, Fields::comments,
comments);
328 if (std::shared_ptr<QmlFile> qmlFilePtr =
self.ownerAs<
QmlFile>())
329 code = qmlFilePtr->code();
341 if (++preNewlines == 2)
343 }
else if (!
c.isSpace())
347 if (preNewlines == 0)
350 ow.ensureNewline(preNewlines);
355 if (!vString.isEmpty())
356 ow.space().write(vString);
362Id::Id(
const QString &idName,
const Path &referredObject) :
name(idName), referredObjectPath(referredObject) { }
367 cont = cont &&
self.dvValueField(visitor, Fields::name,
name);
369 cont = cont &&
self.dvWrapField(visitor, Fields::comments,
comments);
370 cont = cont &&
self.dvWrapField(visitor, Fields::annotations,
annotations);
371 cont = cont &&
self.dvWrapField(visitor, Fields::value,
value);
391 if (!
idStr().isEmpty())
392 cont = cont &&
self.dvValueField(visitor, Fields::idStr,
idStr());
393 cont = cont &&
self.dvValueField(visitor, Fields::name,
name());
395 cont = cont &&
self.dvReferencesField(visitor, Fields::prototypes, m_prototypePaths);
397 cont = cont &&
self.dvReferenceField(visitor, Fields::nextScope,
nextScopePath());
398 cont = cont &&
self.dvWrapField(visitor, Fields::propertyDefs, m_propertyDefs);
399 cont = cont &&
self.dvWrapField(visitor, Fields::bindings, m_bindings);
400 cont = cont &&
self.dvWrapField(visitor, Fields::methods, m_methods);
401 cont = cont &&
self.dvWrapField(visitor, Fields::children, m_children);
402 cont = cont &&
self.dvWrapField(visitor, Fields::annotations, m_annotations);
403 cont = cont &&
self.dvItemField(visitor, Fields::propertyInfos, [
this, &self]() {
407 auto pInfo =
self.propertyInfoWithName(k);
413 if (m_nameIdentifiers) {
414 cont = cont &&
self.dvItemField(visitor, Fields::nameIdentifiers, [
this, &self]() {
415 return self.subScriptElementWrapperItem(m_nameIdentifiers);
423 static QList<QString> myFields(
436 cont = cont &&
self.dvValueLazyField(visitor, Fields::defaultPropertyName, [
this, &self]() {
444 if (
name == Fields::name)
446 if (name == Fields::idStr) {
447 if (
idStr().isEmpty())
451 if (
name == Fields::methods)
452 return self.wrapField(Fields::methods, m_methods);
453 if (
name == Fields::bindings)
454 return self.wrapField(Fields::bindings, m_bindings);
455 if (
name == Fields::comments)
457 if (
name == Fields::children)
458 return self.wrapField(Fields::children, m_children);
460 if (
name == Fields::nextScope) {
466 if (
name == Fields::prototypes) {
471 if (
name == Fields::annotations)
472 return self.wrapField(Fields::annotations, m_annotations);
473 if (
name == Fields::propertyDefs)
474 return self.wrapField(Fields::propertyDefs, m_propertyDefs);
475 if (
name == Fields::propertyInfos) {
482 [copiedSelf =
self](
const DomItem &) {
return copiedSelf.propertyInfoNames(); },
485 if (
name == Fields::nameIdentifiers && m_nameIdentifiers) {
486 return self.subScriptElementWrapperItem(m_nameIdentifiers);
488 if (
name == Fields::defaultPropertyName) {
493 if (!knownLookups.contains(
name)) {
494 qCWarning(domLog()) <<
"Asked non existing field " <<
name <<
" in QmlObject "
512 if (!m_defaultPropertyName.
isEmpty())
513 return m_defaultPropertyName;
515 if (pDef.isDefaultMember)
523 if (!dProp.isEmpty())
526 self.visitPrototypeChain(
529 QString dProp = objPtr->localDefaultPropertyName();
530 if (!dProp.isEmpty()) {
541bool QmlObject::iterateSubOwners(
const DomItem &self, function_ref<
bool(
const DomItem &)> visitor)
const
543 bool cont =
self.field(Fields::bindings).visitKeys([visitor](
const QString &,
const DomItem &bs) {
544 return bs.visitIndexes([visitor](
const DomItem &
b) {
546 if (std::shared_ptr<ScriptExpression> vPtr =
v.ownerAs<ScriptExpression>()) {
549 return v.iterateSubOwners(visitor);
554 cont = cont &&
self.field(Fields::children).visitIndexes([visitor](
const DomItem &qmlObj) {
555 if (
const QmlObject *qmlObjPtr = qmlObj.as<QmlObject>()) {
556 return qmlObjPtr->iterateSubOwners(qmlObj, visitor);
564static QStringList dotExpressionToList(
const std::shared_ptr<ScriptExpression> &expr)
567 AST::Node *node = (expr ? expr->ast() :
nullptr);
569 switch (node->kind) {
571 AST::IdentifierExpression *
id = AST::cast<AST::IdentifierExpression *>(node);
572 res.prepend(
id->name.toString());
576 AST::FieldMemberExpression *
id = AST::cast<AST::FieldMemberExpression *>(node);
577 res.prepend(
id->name.toString());
582 qCDebug(writeOutLog).noquote() <<
"Could not convert dot expression to list for:\n"
583 << expr->astRelocatableDump();
590LocallyResolvedAlias QmlObject::resolveAlias(
const DomItem &self,
591 std::shared_ptr<ScriptExpression> accessSequence)
const
593 QStringList accessSequenceList = dotExpressionToList(accessSequence);
597LocallyResolvedAlias QmlObject::resolveAlias(
const DomItem &self,
const QStringList &accessSequence)
const
599 LocallyResolvedAlias
res;
600 QSet<QString> visitedAlias;
601 if (accessSequence.isEmpty()) {
603 }
else if (accessSequence.size() > 3) {
604 res.status = LocallyResolvedAlias::Status::TooDeep;
612 .field(Fields::referredObject)
616 res.baseObject = idTarget;
617 res.accessedPath = accessSequence.
mid(1);
618 res.typeName = idTarget.name();
619 res.status = LocallyResolvedAlias::Status::ResolvedObject;
621 while (!
res.accessedPath.isEmpty()) {
623 DomItem defNow =
res.baseObject.propertyDefs().key(pNow).index(0);
624 if (
const PropertyDefinition *defNowPtr = defNow.as<PropertyDefinition>()) {
625 if (defNowPtr->isAlias()) {
628 QString aliasPath = defNow.canonicalPath().toString();
629 if (visitedAlias.contains(aliasPath)) {
630 res.status = LocallyResolvedAlias::Status::Loop;
633 visitedAlias.
insert(aliasPath);
634 DomItem valNow =
res.baseObject.bindings().key(pNow).index(0);
635 if (std::shared_ptr<ScriptExpression> exp =
636 valNow.field(Fields::value).ownerAs<ScriptExpression>()) {
638 if (expList.isEmpty()) {
639 res.status = LocallyResolvedAlias::Status::Invalid;
641 }
else if (expList.size() > 3) {
642 res.status = LocallyResolvedAlias::Status::TooDeep;
645 idName = expList.first();
646 idTarget =
self.component()
650 .field(Fields::referredObject)
652 res.baseObject = idTarget;
653 res.accessedPath = expList.
mid(1) +
res.accessedPath.
mid(1);
655 res.status = LocallyResolvedAlias::Status::Invalid;
658 res.status = LocallyResolvedAlias::Status::ResolvedObject;
659 res.typeName = idTarget.name();
661 res.status = LocallyResolvedAlias::Status::Invalid;
665 res.localPropertyDef = defNow;
666 res.typeName = defNowPtr->typeName;
667 res.accessedPath =
res.accessedPath.
mid(1);
668 DomItem valNow =
res.baseObject.bindings().key(pNow).index(0).field(Fields::value);
669 if (valNow.internalKind() == DomType::QmlObject) {
670 res.baseObject = valNow;
671 res.typeName = valNow.name();
672 res.status = LocallyResolvedAlias::Status::ResolvedObject;
674 res.status = LocallyResolvedAlias::Status::ResolvedProperty;
685MutableDomItem QmlObject::addPropertyDef(
686 MutableDomItem &self,
const PropertyDefinition &propertyDef, AddOption
option)
688 Path
p = addPropertyDef(propertyDef,
option);
689 if (
p.last().headIndex(0) > 1)
691 tr(
"Repeated PropertyDefinition with name %1").
arg(propertyDef.name)));
692 return self.owner().path(
p);
695MutableDomItem QmlObject::addBinding(MutableDomItem &self,
Binding binding, AddOption
option)
697 Path
p = addBinding(binding,
option);
698 if (
p &&
p.last().headIndex(0) > 1)
699 self.owningItemPtr()->addErrorLocal(
701 return self.owner().path(
p);
704MutableDomItem QmlObject::addMethod(
705 MutableDomItem &self,
const MethodInfo &functionDef, AddOption
option)
707 Path
p = addMethod(functionDef,
option);
708 if (
p.last().headIndex(0) > 1)
709 self.owningItemPtr()->addErrorLocal(
711 return self.owner().path(
p);
714void QmlObject::writeOut(
const DomItem &self, OutWriter &ow,
const QString &onTarget)
const
716 const quint32 posOfNewElements = std::numeric_limits<quint32>::max();
717 bool isRootObject = pathFromOwner().length() == 5
718 && pathFromOwner()[0] == Path::Field(Fields::components)
719 && pathFromOwner()[3] == Path::Field(Fields::objects);
722 if (std::shared_ptr<QmlFile> qmlFilePtr =
self.ownerAs<QmlFile>())
723 code = qmlFilePtr->code();
724 ow.writeRegion(IdentifierRegion,
name());
725 if (!onTarget.isEmpty())
726 ow.space().writeRegion(OnTokenRegion).space().writeRegion(OnTargetRegion, onTarget);
727 ow.writeRegion(LeftBraceRegion, u
" {");
728 int baseIndent = ow.increaseIndent();
730 if (!idStr().isEmpty()) {
731 DomItem myId =
self.component().field(Fields::ids).key(idStr()).index(0);
733 myId.writeOutPre(ow);
735 .writeRegion(IdTokenRegion)
736 .writeRegion(IdColonTokenRegion)
738 .writeRegion(IdNameRegion, idStr());
739 if (ow.lineWriter.options().attributesSequence
740 == LineWriterOptions::AttributesSequence::Normalize) {
744 myId.writeOutPost(ow);
752 auto startLoc = [&](
const FileLocations::Tree &l) {
754 return l->info().fullRegion;
755 return SourceLocation(posOfNewElements, 0, 0, 0);
757 if (ow.lineWriter.options().attributesSequence
758 == LineWriterOptions::AttributesSequence::Preserve) {
759 QList<QPair<SourceLocation, DomItem>>
attribs;
760 AttachedInfoLookupResult<FileLocations::Tree> objLoc =
761 FileLocations::findAttachedInfo(self);
762 FileLocations::Tree componentLoc;
763 if (isRootObject && objLoc.foundTree)
764 componentLoc = objLoc.foundTree->parent()->parent();
770 for (
const auto &els :
values) {
771 FileLocations::Tree elsLoc =
772 FileLocations::find(baseLoc, els.pathFromOwner().last());
773 const auto elsValues = els.values();
774 for (
const auto &
el : elsValues) {
775 FileLocations::Tree elLoc =
776 FileLocations::find(elsLoc,
el.pathFromOwner().
last());
777 attribs.append(std::make_pair(startLoc(elLoc),
el));
781 auto addMyMMap = [
this, &objLoc, &
self, &addMMap](
QStringView fieldName) {
783 addMMap(
base, FileLocations::find(objLoc.foundTree,
base.pathFromOwner().last()));
789 const auto baseValues =
base.values();
790 for (
const auto &
el : baseValues) {
791 FileLocations::Tree elLoc = FileLocations::find(baseLoc,
el.pathFromOwner().
last());
792 attribs.append(std::make_pair(startLoc(elLoc),
el));
797 addMMap(enums, FileLocations::find(componentLoc, enums.pathFromOwner().last()));
799 addMyMMap(Fields::propertyDefs);
800 addMyMMap(Fields::bindings);
801 addMyMMap(Fields::methods);
802 DomItem children = field(self, Fields::children);
803 addSingleLevel(children,
804 FileLocations::find(objLoc.foundTree, children.pathFromOwner().last()));
808 AttachedInfoLookupResult<FileLocations::Tree> subLoc =
809 FileLocations::findAttachedInfo(
c);
811 attribs.append(std::make_pair(startLoc(subLoc.foundTree),
c));
815 [](
const std::pair<SourceLocation, DomItem> &el1,
816 const std::pair<SourceLocation, DomItem> &el2) {
817 if (el1.first.offset < el2.first.offset)
819 if (el1.first.offset > el2.first.offset)
821 int i = int(el1.second.internalKind())
822 - int(el2.second.internalKind());
826 while (iAttr !=
attribs.size()) {
835 if (++preNewlines == 2)
837 }
else if (!
c.isSpace())
841 if (preNewlines == 0)
843 ow.ensureNewline(preNewlines);
844 if (
el.second.internalKind() == DomType::PropertyDefinition && iAttr !=
attribs.
size()
848 if (bPair.second.internalKind() == DomType::Binding
849 && bPair.first.begin() <
el.
first.end()
850 && bPair.second.name() ==
el.second.name()) {
855 el.second.writeOut(ow);
859 bPtr->writeOutValue(
b, ow);
861 qWarning() <<
"Internal error casting binding to Binding in"
862 <<
b.canonicalPath();
863 ow.writeRegion(LeftBraceRegion).writeRegion(RightBraceRegion);
868 el.second.writeOut(ow);
872 ow.decreaseIndent(1, baseIndent);
873 ow.writeRegion(RightBraceRegion);
877 DomItem bindings = field(self, Fields::bindings);
878 DomItem propertyDefs = field(self, Fields::propertyDefs);
881 const auto descs =
component.field(Fields::enumerations).values();
882 for (
const auto &enumDescs : descs) {
883 const auto values = enumDescs.values();
884 for (
const auto &enumDesc :
values) {
886 enumDesc.writeOut(ow);
891 if (
counter != ow.counter() || !idStr().isEmpty())
892 spacerId = ow.addNewlinesAutospacerCallback(2);
893 QSet<QString> mergedDefBinding;
894 for (
const QString &defName : propertyDefs.sortedKeys()) {
895 const auto pDefs = propertyDefs.key(defName).values();
896 for (
const auto &pDef : pDefs) {
900 bool uniqueDeclarationWithThisName = pDefs.size() == 1;
901 if (uniqueDeclarationWithThisName && !pDefPtr->isRequired)
902 bindings.key(pDef.name()).visitIndexes([&
b, pDefPtr](
const DomItem &
el) {
904 if (elPtr && elPtr->bindingType() == BindingType::Normal) {
905 switch (elPtr->valueKind()) {
906 case BindingValueKind::ScriptExpression:
909 case BindingValueKind::Array:
910 if (!pDefPtr->isDefaultMember
911 && pDefPtr->isParametricType())
914 case BindingValueKind::Object:
915 if (!pDefPtr->isDefaultMember
916 && !pDefPtr->isParametricType())
919 case BindingValueKind::Empty:
927 mergedDefBinding.insert(defName);
934 bPtr->writeOutValue(
b, ow);
936 qWarning() <<
"Internal error casting binding to Binding in"
937 <<
b.canonicalPath();
938 ow.writeRegion(LeftBraceRegion).writeRegion(RightBraceRegion);
944 ow.removeTextAddCallback(spacerId);
945 QList<DomItem> signalList, methodList;
946 const auto fields = field(self, Fields::methods).values();
947 for (
const auto &ms : fields) {
948 const auto values = ms.values();
951 if (mPtr && mPtr->methodType == MethodInfo::MethodType::Signal)
952 signalList.append(
m);
954 methodList.append(
m);
958 spacerId = ow.addNewlinesAutospacerCallback(2);
959 for (
const auto &sig :
std::as_const(signalList)) {
964 ow.removeTextAddCallback(spacerId);
966 spacerId = ow.addNewlinesAutospacerCallback(2);
968 for (
const auto &
method :
std::as_const(methodList)) {
969 if (!
first && ow.lineWriter.options().functionsSpacing) {
977 ow.removeTextAddCallback(spacerId);
978 QList<DomItem> normalBindings, signalHandlers, delayedBindings;
979 for (
const auto &bName : bindings.sortedKeys()) {
980 bool skipFirstNormal = mergedDefBinding.contains(bName);
981 const auto values = bindings.key(bName).values();
984 if (skipFirstNormal) {
985 if (bPtr && bPtr->bindingType() == BindingType::Normal) {
986 skipFirstNormal =
false;
990 if (bPtr->valueKind() == BindingValueKind::Array
991 || bPtr->valueKind() == BindingValueKind::Object)
992 delayedBindings.append(
b);
993 else if (
b.field(Fields::isSignalHandler).value().toBool(
false))
994 signalHandlers.append(
b);
996 normalBindings.append(
b);
1000 spacerId = ow.addNewlinesAutospacerCallback(2);
1001 for (
const auto &
b :
std::as_const(normalBindings))
1003 ow.removeTextAddCallback(spacerId);
1005 spacerId = ow.addNewlinesAutospacerCallback(2);
1006 for (
const auto &
b :
std::as_const(delayedBindings))
1008 ow.removeTextAddCallback(spacerId);
1010 spacerId = ow.addNewlinesAutospacerCallback(2);
1011 for (
const auto &
b :
std::as_const(signalHandlers))
1013 ow.removeTextAddCallback(spacerId);
1015 spacerId = ow.addNewlinesAutospacerCallback(2);
1017 const auto values = field(self, Fields::children).values();
1018 for (
const auto &
c :
values) {
1019 if (!
first && ow.lineWriter.options().objectsSpacing) {
1020 ow.newline().newline();
1026 ow.removeTextAddCallback(spacerId);
1031 spacerId = ow.addNewlinesAutospacerCallback(2);
1032 const auto values = subComps.values();
1033 for (
const auto &subC :
values) {
1037 ow.removeTextAddCallback(spacerId);
1039 ow.decreaseIndent(1, baseIndent);
1040 ow.ensureNewline().writeRegion(RightBraceRegion);
1044 : m_bindingType(bindingType), m_name(
name), m_value(
std::move(
value))
1075 : m_bindingType(
o.m_bindingType),
1077 m_annotations(
o.m_annotations),
1078 m_comments(
o.m_comments),
1079 m_bindingIdentifiers(
o.m_bindingIdentifiers)
1082 m_value = std::make_unique<BindingValue>(*
o.m_value);
1091 m_bindingType =
o.m_bindingType;
1092 m_annotations =
o.m_annotations;
1093 m_comments =
o.m_comments;
1094 m_bindingIdentifiers =
o.m_bindingIdentifiers;
1097 m_value = std::make_unique<BindingValue>(*
o.m_value);
1099 *m_value = *
o.m_value;
1109 cont = cont &&
self.dvValueField(visitor, Fields::name, m_name);
1114 cont = cont &&
self.dvItemField(visitor, Fields::value, [
this, &self]() {
1115 return m_value->value(self);
1117 cont = cont &&
self.dvValueField(visitor, Fields::bindingType,
int(m_bindingType));
1118 cont = cont &&
self.dvWrapField(visitor, Fields::comments, m_comments);
1119 cont = cont &&
self.dvValueLazyField(visitor, Fields::preCode, [
this]() {
1122 cont = cont &&
self.dvValueLazyField(visitor, Fields::postCode, [
this]() {
1125 if (m_bindingIdentifiers) {
1126 cont = cont &&
self.dvItemField(visitor, Fields::bindingIdentifiers, [
this, &self]() {
1127 return self.subScriptElementWrapperItem(m_bindingIdentifiers);
1130 cont = cont &&
self.dvWrapField(visitor, Fields::annotations, m_annotations);
1138 return m_value->value(self);
1145 return m_value->kind;
1151 return &(m_value->object);
1158 return &(m_value->object);
1165 return &(m_value->array);
1172 return &(m_value->array);
1179 return m_value->scriptExpression;
1186 return m_value->scriptExpression;
1193 m_annotations, annotation, aPtr);
1198 Path
base = newPath.field(Fields::annotations);
1200 m_value->updatePathFromOwner(newPath.field(Fields::value));
1215 vPtr->writeOut(
v, lw,
name());
1218 qCWarning(writeOutLog()) <<
"On Binding requires an QmlObject Value, not "
1219 <<
v.internalKindStr() <<
" at " <<
self.canonicalPath();
1229 qCWarning(writeOutLog()) <<
"Writing of empty binding " <<
name();
1233 if (
const List *vPtr =
v.as<List>()) {
1235 vPtr->writeOut(
v, lw,
false);
1249 cont = cont &&
self.dvWrapField(visitor, Fields::exports, m_exports);
1250 cont = cont &&
self.dvValueField(visitor, Fields::metaRevisions, m_metaRevisions);
1252 cont = cont &&
self.dvValueField(visitor, Fields::fileName,
fileName());
1253 cont = cont &&
self.dvValueField(visitor, Fields::interfaceNames, m_interfaceNames);
1254 cont = cont &&
self.dvValueField(visitor, Fields::hasCustomParser, m_hasCustomParser);
1255 cont = cont &&
self.dvValueField(visitor, Fields::valueTypeName, m_valueTypeName);
1256 cont = cont &&
self.dvValueField(visitor, Fields::extensionTypeName, m_extensionTypeName);
1257 cont = cont &&
self.dvValueField(visitor, Fields::accessSemantics,
int(m_accessSemantics));
1270 spaceIdx = exp.size();
1273 if (!
res.version.isValid())
1275 .error(
tr(
"Expected string literal to contain 'Package/Name major.minor' "
1276 "or 'Name major.minor' not '%1'.")
1280 res.uri = exp.left(slashIdx).toString();
1281 res.typeName = exp.mid(slashIdx + 1, spaceIdx - (slashIdx + 1)).toString();
1288 cont = cont &&
self.dvValueField(visitor, Fields::name,
name);
1289 cont = cont &&
self.dvValueField(visitor, Fields::access,
int(
access));
1290 cont = cont &&
self.dvValueField(visitor, Fields::typeName,
typeName);
1291 cont = cont &&
self.dvValueField(visitor, Fields::isReadonly,
isReadonly);
1292 cont = cont &&
self.dvValueField(visitor, Fields::isList,
isList);
1293 cont = cont &&
self.dvWrapField(visitor, Fields::comments,
comments);
1294 cont = cont &&
self.dvWrapField(visitor, Fields::annotations,
annotations);
1307 Path
base = newPath.field(Fields::annotations);
1314 cont = cont &&
self.dvValueField(visitor, Fields::name,
name());
1315 cont = cont &&
self.dvWrapField(visitor, Fields::values, m_values);
1316 cont = cont &&
self.dvWrapField(visitor, Fields::annotations, m_annotations);
1344 int iLevel = ow.increaseIndent(1);
1345 const auto values =
self.field(Fields::values).values();
1350 ow.decreaseIndent(1, iLevel);
1358 Path selfPath =
self.canonicalPath().field(Fields::allSources);
1361 return cached.canonicalPaths;
1363 QSet<Path> knownPaths;
1364 QList<Path> toDo(m_importSourcePaths.rbegin(), m_importSourcePaths.rend());
1365 while (!toDo.isEmpty()) {
1366 Path pNow = toDo.takeLast();
1367 if (knownPaths.contains(pNow))
1369 knownPaths.insert(pNow);
1372 for (
const DomItem &autoExp : sourceBase.field(Fields::autoExports).
values()) {
1375 if (autoExpPtr->inheritVersion) {
1376 Version v = autoExpPtr->import.version;
1377 DomItem sourceVersion = sourceBase.field(Fields::version);
1378 if (
const Version *sourceVersionPtr = sourceVersion.as<
Version>()) {
1379 if (
v.majorVersion < 0)
1380 v.majorVersion = sourceVersionPtr->majorVersion;
1381 if (
v.minorVersion < 0)
1382 v.minorVersion = sourceVersionPtr->minorVersion;
1384 qWarning() <<
"autoExport with inherited version " << autoExp
1385 <<
" but missing version in source" << pNow;
1387 Import toImport(autoExpPtr->import.uri,
v);
1388 newSource = toImport.importedPath();
1390 newSource = autoExpPtr->import.importedPath();
1392 if (newSource && !knownPaths.contains(newSource))
1393 toDo.append(newSource);
1395 qWarning() <<
"expected ModuleAutoExport not " << autoExp.internalKindStr()
1396 <<
"looking up autoExports of" << sourceBase;
1409 cont = cont &&
self.dvReferencesField(visitor, Fields::importSources, m_importSourcePaths);
1410 cont = cont &&
self.dvItemField(visitor, Fields::allSources, [
this, &self]() ->
DomItem {
1411 return self.subListItem(List::fromQList<Path>(
1412 self.pathFromOwner().field(Fields::allSources),
allSources(self),
1413 [](
const DomItem &
list,
const PathEls::PathComponent &
p,
const Path &
el) {
1417 cont = cont &&
self.dvWrapField(visitor, Fields::qualifiedImports, m_subImports);
1418 cont = cont &&
self.dvItemField(visitor, Fields::imported, [
this, &self]() ->
DomItem {
1420 self.pathFromOwner().field(Fields::imported),
1422 return map.subListItem(List::fromQList<DomItem>(
1437 cont = cont &&
self.dvValueField(visitor, Fields::propertyDefs,
propertyDefs);
1438 cont = cont &&
self.dvValueField(visitor, Fields::bindings,
bindings);
1452 new (&scriptExpression) std::shared_ptr<ScriptExpression>(
o);
1457 new (&
array) QList<QmlObject>(l);
1474 new (&scriptExpression) std::shared_ptr<ScriptExpression>(
o.scriptExpression);
1477 new (&
array) QList<QmlObject>(
o.array);
1495 new (&
array) QList<QmlObject>(
o.array);
1506 return binding.copy(&
object);
1510 return binding.subListItem(List::fromQListRef<QmlObject>(
1511 binding.pathFromOwner().field(u
"value"),
array,
1513 return self.copy(&obj);
1525 object.updatePathFromOwner(newPath);
1535void BindingValue::clearValue()
1541 object.~QmlObject();
1554 QStringView code,
const std::shared_ptr<QQmlJS::Engine> &
engine, AST::Node *ast,
1555 const std::shared_ptr<AstComments> &comments, ExpressionType expressionType,
1557 : OwningItem(derivedFrom),
1558 m_expressionType(expressionType),
1561 m_postCode(postCode),
1564 m_astComments(comments),
1565 m_localOffset(localOffset)
1567 if (m_expressionType == ExpressionType::BindingExpression)
1568 if (AST::ExpressionStatement *exp = AST::cast<AST::ExpressionStatement *>(m_ast))
1569 m_ast = exp->expression;
1576 m_expressionType = e.m_expressionType;
1577 m_engine = e.m_engine;
1579 if (m_codeStr.isEmpty()) {
1582 m_codeStr = e.m_codeStr;
1585 m_localOffset = e.m_localOffset;
1586 m_astComments = e.m_astComments;
1592 std::shared_ptr<ScriptExpression>
copy =
makeCopy(self);
1594 QString preCodeStr = container.field(Fields::preCode).value().toString(m_preCode.
toString());
1595 QString postCodeStr = container.field(Fields::postCode).value().toString(m_postCode.
toString());
1596 copy->setCode(
code, preCodeStr, postCodeStr);
1603 cont = cont &&
self.dvValueField(visitor, Fields::code,
code());
1606 &&
self.dvValueField(visitor, Fields::preCode,
preCode(),
1610 &&
self.dvValueField(visitor, Fields::postCode,
postCode(),
1613 &&
self.dvValueLazyField(
1614 visitor, Fields::localOffset,
1617 cont = cont &&
self.dvValueLazyField(visitor, Fields::astRelocatableDump, [
this]() {
1620 cont = cont &&
self.dvValueField(visitor, Fields::expressionType,
int(
expressionType()));
1622 cont = cont &&
self.dvItemField(visitor, Fields::scriptElement, [
this, &self]() {
1623 return self.subScriptElementWrapperItem(m_element);
1629class FirstNodeVisitor :
public VisitAll
1633 quint32 maxEnd = std::numeric_limits<quint32>::max();
1634 AST::Node *firstNodeInRange =
nullptr;
1636 FirstNodeVisitor(
quint32 minStart = 0,
quint32 maxEnd = std::numeric_limits<quint32>::max())
1637 : minStart(minStart), maxEnd(maxEnd)
1641 bool preVisit(AST::Node *
n)
override
1643 if (!VisitAll::uiKinds().
contains(
n->kind)) {
1646 if (!firstNodeInRange && minStart <=
start &&
end <= maxEnd &&
start <
end)
1647 firstNodeInRange =
n;
1649 return !firstNodeInRange;
1655 FirstNodeVisitor visitor(minStart, maxEnd);
1657 return visitor.firstNodeInRange;
1664 QString resolvedPreCode, resolvedPostCode;
1672 if (!resolvedPreCode.isEmpty() || !resolvedPostCode.isEmpty())
1673 m_codeStr = resolvedPreCode +
code + resolvedPostCode;
1675 m_preCode =
QStringView(m_codeStr).
mid(0, resolvedPreCode.size());
1677 resolvedPreCode.size() +
code.
size(), resolvedPostCode.size());
1680 m_localOffset = SourceLocation();
1682 IndentInfo preChange(m_preCode, 4);
1685 m_localOffset.
startColumn = preChange.trailingString.size();
1686 m_localOffset.
startLine = preChange.nNewlines;
1687 m_engine = std::make_shared<QQmlJS::Engine>();
1688 m_astComments = std::make_shared<AstComments>(m_engine);
1689 m_ast = parse(resolveParseMode());
1691 if (AST::Program *programPtr = AST::cast<AST::Program *>(m_ast)) {
1692 m_ast = programPtr->statements;
1695 m_ast = firstNodeInRange(m_ast, m_preCode.
size(),
1697 if (
auto *sList = AST::cast<AST::FormalParameterList *>(m_ast)) {
1698 m_ast = sList->element;
1701 if (AST::StatementList *sList = AST::cast<AST::StatementList *>(m_ast)) {
1703 m_ast = sList->statement;
1707 if (AST::ExpressionStatement *exp = AST::cast<AST::ExpressionStatement *>(m_ast))
1708 m_ast = exp->expression;
1710 CommentCollector collector;
1711 collector.collectComments(m_engine, m_ast, m_astComments);
1715AST::Node *ScriptExpression::parse(
const ParseMode
mode)
1718 lexer.setCode(m_codeStr, 1,
mode == ParseMode::QML);
1719 QQmlJS::Parser parser(m_engine.get());
1720 const bool parserSucceeded = [
mode, &parser]() {
1722 case ParseMode::QML:
1723 return parser.parse();
1725 return parser.parseScript();
1726 case ParseMode::ESM:
1727 return parser.parseModule();
1729 Q_UNREACHABLE_RETURN(
false);
1732 if (!parserSucceeded) {
1735 const auto messages = parser.diagnosticMessages();
1736 for (
const DiagnosticMessage &msg : messages) {
1738 err.location.offset -= m_localOffset.
offset;
1739 err.location.startLine -= m_localOffset.
startLine;
1740 if (err.location.startLine == 1)
1741 err.location.startColumn -= m_localOffset.
startColumn;
1744 return parser.rootNode();
1751 return this->
code().
mid(l.offset, l.length);
1764 OutWriter *ow = &lw;
1766 std::optional<PendingSourceLocationId> codeLoc;
1768 codeLoc = lw.lineWriter.startSourceLocation([
this, self, ow](SourceLocation myLoc)
mutable {
1771 if (reformattedCode !=
code()) {
1780 std::shared_ptr<ScriptExpression>
copy =
1782 ow->addReformattedScriptExpression(
self.canonicalPath(),
copy);
1787 [
this](SourceLocation astL) {
1789 return this->
code().
mid(l.offset, l.length);
1793 lw.lineWriter.endSourceLocation(*codeLoc);
1801 return SourceLocation();
1828 cont = cont &&
self.dvWrapField(visitor, Fields::parameters,
parameters);
1829 cont = cont &&
self.dvValueField(visitor, Fields::methodType,
int(
methodType));
1831 cont = cont &&
self.dvReferenceField(visitor, Fields::type,
typePath(self));
1833 cont = cont &&
self.dvValueField(visitor, Fields::preCode,
preCode(self));
1834 cont = cont &&
self.dvValueField(visitor, Fields::postCode,
postCode(self));
1835 cont = cont &&
self.dvValueField(visitor, Fields::isConstructor,
isConstructor);
1838 cont = cont &&
self.dvItemField(visitor, Fields::returnType, [
this, &self]() {
1842 cont = cont &&
self.dvItemField(visitor, Fields::body, [
this, &self]() {
1853 ow.indentNextlines =
true;
1854 ow.skipComments =
true;
1857 ow.itemStart(standin);
1866 ow.write(mp.value->code());
1870 ow.itemEnd(standin);
1885 qCWarning(domLog) <<
"signal should not have a body in" <<
self.canonicalPath();
1891 int baseIndent = ow.increaseIndent();
1898 argPtr->writeOutSignal(
arg, ow);
1900 qCWarning(domLog) <<
"failed to cast to MethodParameter";
1903 ow.decreaseIndent(1, baseIndent);
1924 int baseIndent = ow.increaseIndent();
1929 ow.decreaseIndent(1, baseIndent);
1938 cont = cont &&
self.dvValueField(visitor, Fields::name,
name);
1942 cont = cont &&
self.dvValueField(visitor, Fields::typeName,
typeName);
1944 cont = cont &&
self.dvValueField(visitor, Fields::isPointer,
isPointer);
1945 cont = cont &&
self.dvValueField(visitor, Fields::isReadonly,
isReadonly);
1946 cont = cont &&
self.dvValueField(visitor, Fields::isList,
isList);
1947 cont = cont &&
self.dvWrapField(visitor, Fields::defaultValue,
defaultValue);
1948 cont = cont &&
self.dvWrapField(visitor, Fields::value,
value);
1950 cont = cont &&
self.dvValueField(visitor, Fields::preCode, u
"function f("_s);
1951 cont = cont &&
self.dvValueField(visitor, Fields::postCode, u
") {}"_s);
1954 cont = cont &&
self.dvWrapField(visitor, Fields::annotations,
annotations);
1955 cont = cont &&
self.dvWrapField(visitor, Fields::comments,
comments);
1961 if (!
name.isEmpty()) {
1980 self.writeOutPre(ow);
1984 self.writeOutPost(ow);
1992 bool isFirst =
true;
2010 cont = cont &&
self.dvValueField(visitor, Fields::name,
name());
2011 cont = cont &&
self.dvValueField(visitor, Fields::value,
value());
2012 cont = cont &&
self.dvWrapField(visitor, Fields::comments, m_comments);
2020 bool hasDefaultValue =
false;
2023 hasDefaultValue =
value() == 0;
2024 else if (myIndex > 0)
2025 hasDefaultValue =
value()
2028 .field(Fields::value)
2032 if (!hasDefaultValue) {
2034 if (abs(
value() -
v.toDouble()) > 1.e-10)
2038 if (myIndex >= 0 &&
self.container().indexes() != myIndex + 1)
2047 .
replace(u
"\\\\"_s, u
"\\"_s));
2097 return std::get<QString>(m_value);
2108 const QUrl &
url = std::get<QUrl>(m_value);
2115 return std::get<QString>(m_value);
2127 const QUrl &
url = std::get<QUrl>(m_value);
2133 if (!basePath.isEmpty())
2134 return QDir(basePath).
filePath(std::get<QString>(m_value));
2138 return std::get<QString>(m_value);
2146 return std::get<QUrl>(m_value);
2157 return std::get<QUrl>(m_value).toString();
2160 return std::get<QString>(m_value);
2171 return std::get<QString>(m_value);
2196#include "moc_qqmldomelements_p.cpp"
void write(QXmlStreamWriter &writer, const QString &tagName=QString()) const
QString filePath(const QString &fileName) const
Returns the path name of a file in the directory.
Key key(const T &value, const Key &defaultKey=Key()) const
void accept(BaseVisitor *visitor)
@ Kind_IdentifierExpression
@ Kind_FieldMemberExpression
void updatePathFromOwner(const Path &newPath)
QList< QmlObject > annotations
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &annotation, QmlObject **aPtr=nullptr)
void updatePathFromOwner(const Path &newPath)
DomItem value(const DomItem &binding) const
BindingValue & operator=(const BindingValue &o)
std::shared_ptr< ScriptExpression > scriptExpression
std::shared_ptr< ScriptExpression > scriptExpressionValue() const
Binding & operator=(const Binding &)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &a, QmlObject **aPtr=nullptr)
void updatePathFromOwner(const Path &newPath)
static QString preCodeForName(QStringView n)
QmlObject const * objectValue() const
DomItem valueItem(const DomItem &self) const
QList< QmlObject > const * arrayValue() const
static QString postCodeForName(QStringView)
void writeOut(const DomItem &self, OutWriter &lw) const
Binding(const QString &m_name=QString(), std::unique_ptr< BindingValue > value=std::unique_ptr< BindingValue >(), BindingType bindingType=BindingType::Normal)
bool isSignalHandler() const
void writeOutValue(const DomItem &self, OutWriter &lw) const
BindingValueKind valueKind() const
void updatePathFromOwner(const Path &newPath) override
Path addObject(const QmlObject &object, QmlObject **oPtr=nullptr)
Path attachedTypePath(const DomItem &) const
DomItem field(const DomItem &self, QStringView name) const override
bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
QString attachedTypeName() const
Component(const QString &name)
virtual DomItem field(const DomItem &self, QStringView name) const
virtual void updatePathFromOwner(const Path &newPath)
Path pathFromOwner() const
static ErrorGroup domErrorGroup
const QList< QmlObject > & annotations() const &
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void setAnnotations(const QList< QmlObject > &annotations)
void writeOut(const DomItem &self, OutWriter &lw) const override
void updatePathFromOwner(const Path &newP) override
Path addAnnotation(const QmlObject &child, QmlObject **cPtr=nullptr)
void writeOut(const DomItem &self, OutWriter &lw) const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
Represents a set of tags grouping a set of related error messages.
static Export fromString(const Path &source, QStringView exp, const Path &typePath, const ErrorHandler &h)
static AttachedInfoLookupResult< Tree > findAttachedInfo(const DomItem &item)
static QQmlJS::SourceLocation region(const Tree &fLoc, FileLocationRegion region)
std::shared_ptr< AttachedInfoT< FileLocations > > Tree
static FileLocations::Tree treeOf(const DomItem &)
Path addAnnotation(const Path &selfPathFromOwner, const QmlObject &ann, QmlObject **aPtr=nullptr)
Id(const QString &idName=QString(), const Path &referredObject=Path())
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
void updatePathFromOwner(const Path &pathFromOwner)
QList< QmlObject > annotations
QList< DomItem > importedItemsWithName(const DomItem &self, const QString &name) const
QSet< QString > importedNames(const DomItem &self) const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
QList< Path > allSources(const DomItem &self) const
static Import fromUriString(const QString &importStr, Version v=Version(), const QString &importId=QString(), const ErrorHandler &handler=nullptr)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
static QRegularExpression importRe()
void writeOut(const DomItem &self, OutWriter &ow) const
static Import fromFileString(const QString &importStr, const QString &importId=QString(), const ErrorHandler &handler=nullptr)
std::shared_ptr< ScriptExpression > body
Path typePath(const DomItem &) const
QString postCode(const DomItem &) const
QString preCode(const DomItem &) const
QList< MethodParameter > parameters
std::shared_ptr< ScriptExpression > returnType
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
void writeOut(const DomItem &self, OutWriter &ow) const
std::shared_ptr< ScriptExpression > defaultValue
void writeOut(const DomItem &self, OutWriter &ow) const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
void writeOutSignal(const DomItem &self, OutWriter &ow) const
QList< QmlObject > annotations
OutWriter & ensureNewline(int nNewlines=1)
OutWriter & writeRegion(FileLocationRegion region, QStringView toWrite)
void addErrorLocal(ErrorMessage &&msg)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
static Path Root(PathRoot r)
static ErrorGroups myErrors()
void writeOut(const DomItem &self, OutWriter &ow) const
bool isParametricType() const
void writeOut(const DomItem &self, OutWriter &lw) const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const
QList< DomItem > propertyDefs
QList< DomItem > bindings
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
QList< DomItem > subComponents(const DomItem &self) const
void updatePathFromOwner(const Path &newPath) override
void writeOut(const DomItem &self, OutWriter &) const override
QList< QString > subComponentsNames(const DomItem &self) const
void updatePathFromOwner(const Path &newPath) override
const QList< Path > & prototypePaths() const &
DomItem field(const DomItem &self, QStringView name) const override
QString localDefaultPropertyName() const
QString defaultPropertyName(const DomItem &self) const
QmlObject(const Path &pathFromOwner=Path())
Path nextScopePath() const
QList< QString > fields() const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const override
bool iterateBaseDirectSubpaths(const DomItem &self, DirectVisitor) const
QString absoluteLocalPath(const QString &basePath=QString()) const
static QmlUri fromDirectoryString(const QString &importStr)
QUrl directoryUrl() const
QString directoryString() const
static QmlUri fromUriString(const QString &importStr)
QString localPath() const
static QmlUri fromString(const QString &importStr)
QString moduleUri() const
bool iterateDirectSubpaths(const DomItem &, DirectVisitor) const override
static bool addForPath(const DomItem &el, const Path &canonicalPath, const RefCacheEntry &entry, AddOption addOption=AddOption::KeepExisting)
static RefCacheEntry forPath(const DomItem &el, const Path &canonicalPath)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
QStringView preCode() const
std::shared_ptr< ScriptExpression > makeCopy(const DomItem &self) const
ExpressionType expressionType() const
void writeOut(const DomItem &self, OutWriter &lw) const override
SourceLocation globalLocation(const DomItem &self) const
QStringView postCode() const
QString astRelocatableDump() const
void setScriptElement(const ScriptElementVariant &p)
SourceLocation locationToLocal(SourceLocation x) const
void astDumper(const Sink &s, AstDumperOptions options) const
std::shared_ptr< ScriptExpression > copyWithUpdatedCode(const DomItem &self, const QString &code) const
SourceLocation localOffset() const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor) const
Version(qint32 majorVersion=Undefined, qint32 minorVersion=Undefined)
QString minorString() const
static Version fromString(QStringView v)
QString stringValue() const
static constexpr qint32 Undefined
static constexpr qint32 Latest
QString majorSymbolicString() const
\inmodule QtCore \reentrant
static QString anchoredPattern(const QString &expression)
constexpr bool isEmpty() const noexcept
Returns whether this string view is empty - that is, whether {size() == 0}.
constexpr qsizetype size() const noexcept
Returns the size of this string view, in UTF-16 code units (that is, surrogate pairs count as two for...
constexpr QStringView first(qsizetype n) const noexcept
QString toString() const
Returns a deep copy of this string view's data as a QString.
constexpr QStringView last(qsizetype n) const noexcept
constexpr QStringView mid(qsizetype pos, qsizetype n=-1) const noexcept
Returns the substring of length length starting at position start in this object.
\macro QT_RESTRICTED_CAST_FROM_ASCII
double toDouble(bool *ok=nullptr) const
Returns the string converted to a double value.
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
QString & replace(qsizetype i, qsizetype len, QChar after)
QString mid(qsizetype position, qsizetype n=-1) const &
static QString fromUtf16(const char16_t *, qsizetype size=-1)
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
qsizetype size() const noexcept
Returns the number of characters in this string.
QString first(qsizetype n) const &
const QChar at(qsizetype i) const
Returns the character at the given index position in the string.
int compare(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
QString & insert(qsizetype i, QChar c)
bool contains(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString & append(QChar c)
QString last(qsizetype n) const &
bool isValid() const
Returns true if the URL is non-empty and valid; otherwise returns false.
QString scheme() const
Returns the scheme of the URL.
QString path(ComponentFormattingOptions options=FullyDecoded) const
Returns the path of the URL.
QMap< QString, QString > map
[6]
Path moduleIndexPath(const QString &uri, int majorVersion, const ErrorHandler &errorHandler)
Path lookupTypePath(const QString &name)
Path moduleScopePath(const QString &uri, Version version, const ErrorHandler &)
static ErrorGroups domParsingErrors()
Path appendUpdatableElementInQList(const Path &listPathFromOwner, QList< T > &list, const T &value, T **vPtr=nullptr)
function_ref< bool(const PathEls::PathComponent &, function_ref< DomItem()>)> DirectVisitor
void reformatAst(OutWriter &lw, const std::shared_ptr< AstComments > &comments, const std::function< QStringView(SourceLocation)> &loc2Str, AST::Node *n)
void updatePathFromOwnerQList(QList< T > &list, const Path &newPath)
QString dumperToString(const Dumper &writer)
Converts a dumper to a string.
void astNodeDumper(const Sink &s, Node *n, AstDumperOptions opt, int indent, int baseIndent, function_ref< QStringView(SourceLocation)>loc2str)
function_ref< void(QStringView)> Sink
std::function< void(const ErrorMessage &)> ErrorHandler
void updatePathFromOwnerMultiMap(QMultiMap< K, T > &mmap, const Path &newPath)
QCborValue sourceLocationToQCborValue(QQmlJS::SourceLocation loc)
Combined button and popup list for selecting options.
Q_CONSTINIT thread_local int iLevel
static jboolean copy(JNIEnv *, jobject)
QList< QString > QStringList
Constructs a string list that contains the given string, str.
DBusConnection const char DBusError * error
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
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define qCWarning(category,...)
#define qCDebug(category,...)
static bool contains(const QJsonArray &haystack, unsigned needle)
GLenum GLsizei GLsizei GLint * values
[15]
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLint GLenum GLint components
GLdouble GLdouble GLdouble GLdouble top
GLfloat GLfloat GLfloat GLfloat h
GLsizei GLsizei GLchar * source
GLsizei const GLchar *const * path
static qreal component(const QPointF &point, unsigned int i)
#define NewErrorGroup(name)
static QQmlJSUtils::ResolvedAlias resolveAlias(ScopeForId scopeForId, const QQmlJSMetaProperty &property, const QQmlJSScope::ConstPtr &owner, const QQmlJSUtils::AliasResolutionVisitor &visitor)
QQmlJS::Dom::DomItem DomItem
static void split(QT_FT_Vector *b)
QLatin1StringView QLatin1String
#define QStringLiteral(str)
if(qFloatDistance(a, b)<(1<< 7))
[0]
QUrl url("example.com")
[constructor-url-reference]
\inmodule QtCore \reentrant