9#if defined(__GNUC__) && __GNUC__ >= 11
10# pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
23#include <QtQml/private/qqmljslexer_p.h>
24#include <QtQml/private/qqmljsparser_p.h>
25#include <QtQml/private/qqmljsengine_p.h>
26#include <QtQml/private/qqmljsastvisitor_p.h>
27#include <QtQml/private/qqmljsast_p.h>
29#include <QtCore/QScopeGuard>
30#include <QtCore/QRegularExpression>
32#include <QtCore/QBasicMutex>
55 auto m = moduleRe.
match(uri);
58 .
error(Path::tr(
"Invalid module name in import %1").
arg(uri))
66 .
field(Fields::moduleIndexWithUri)
69 .
field(Fields::moduleScope)
76 if (!version.
isEmpty() && !(
v.isValid() ||
v.isLatest()))
92 cont = cont && self.dvWrapField(visitor, Fields::comments, m_comments);
110 cont = cont && self.dvValueField(visitor, Fields::name,
name());
111 cont = cont && self.dvWrapField(visitor, Fields::enumerations, m_enumerations);
112 cont = cont && self.dvWrapField(visitor, Fields::objects, m_objects);
113 cont = cont && self.dvValueField(visitor, Fields::isSingleton,
isSingleton());
114 cont = cont && self.dvValueField(visitor, Fields::isCreatable,
isCreatable());
115 cont = cont && self.dvValueField(visitor, Fields::isComposite,
isComposite());
116 cont = cont && self.dvValueField(visitor, Fields::attachedTypeName,
attachedTypeName());
117 cont = cont && self.dvReferenceField(visitor, Fields::attachedType,
attachedTypePath(self));
123 switch (
name.size()) {
125 if (
name == Fields::name)
126 return self.wrapField(Fields::name, m_name);
129 if (
name == Fields::objects)
130 return self.wrapField(Fields::objects, m_objects);
147 cont = cont && self.dvWrapField(visitor, Fields::ids, m_ids);
148 cont = cont && self.dvValueLazyField(visitor, Fields::subComponents, [
this, &self]() {
171 self.field(Fields::objects).index(0).writeOut(lw);
178 QString myNameDot = self.pathFromOwner()[1].headName();
183 if (cName.startsWith(myNameDot)
187 std::sort(subNames.
begin(), subNames.
end());
207 auto m =
r.matchView(
v);
210 int majorV =
m.capturedView(1).toInt(&
ok);
213 int minorV =
m.capturedView(2).toInt(&
ok);
216 return Version(majorV, minorV);
251 cont = cont && self.dvWrapField(visitor, Fields::majorVersion,
majorVersion);
252 cont = cont && self.dvWrapField(visitor, Fields::minorVersion,
minorVersion);
253 cont = cont && self.dvValueField(visitor, Fields::isLatest,
isLatest());
254 cont = cont && self.dvValueField(visitor, Fields::isValid,
isValid());
255 cont = cont && self.dvValueLazyField(visitor, Fields::stringValue, [
this]() {
264 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 else if (!
m.captured(u
"importId").isEmpty())
284 .
warning(
tr(
"namespace %1 in import string '%2' overridden by explicit "
291 .
error(
tr(
"Unexpected URI format in import '%1'").
arg(importStr))
304 cont = cont &&
self.dvValueField(visitor, Fields::uri,
uri.
toString());
305 cont = cont &&
self.dvWrapField(visitor, Fields::version,
version);
307 cont = cont &&
self.dvValueField(visitor, Fields::importId,
importId);
309 cont = cont &&
self.dvValueField(visitor, Fields::implicit,
implicit);
310 cont = cont &&
self.dvWrapField(visitor, Fields::comments,
comments);
319 ow.writeRegion(u
"import").space();
324 ow.space().write(vString);
327 ow.space().writeRegion(u
"as").space().writeRegion(u
"id",
importId);
335 cont = cont &&
self.dvValueField(visitor, Fields::name,
name);
337 cont = cont &&
self.dvWrapField(visitor, Fields::comments,
comments);
338 cont = cont &&
self.dvWrapField(visitor, Fields::annotations,
annotations);
339 cont = cont &&
self.dvWrapField(visitor, Fields::value,
value);
359 if (!
idStr().isEmpty())
360 cont = cont &&
self.dvValueField(visitor, Fields::idStr,
idStr());
361 cont = cont &&
self.dvValueField(visitor, Fields::name,
name());
363 cont = cont &&
self.dvReferencesField(visitor, Fields::prototypes, m_prototypePaths);
365 cont = cont &&
self.dvReferenceField(visitor, Fields::nextScope,
nextScopePath());
366 cont = cont &&
self.dvWrapField(visitor, Fields::propertyDefs, m_propertyDefs);
367 cont = cont &&
self.dvWrapField(visitor, Fields::bindings, m_bindings);
368 cont = cont &&
self.dvWrapField(visitor, Fields::methods, m_methods);
369 cont = cont &&
self.dvWrapField(visitor, Fields::children, m_children);
370 cont = cont &&
self.dvWrapField(visitor, Fields::annotations, m_annotations);
371 cont = cont &&
self.dvItemField(visitor, Fields::propertyInfos, [
this, &self]() {
375 auto pInfo =
self.propertyInfoWithName(k);
376 return map.wrap(PathEls::Key(k), pInfo);
399 cont = cont &&
self.dvValueLazyField(visitor, Fields::defaultPropertyName, [
this, &self]() {
407 switch (
name.size()) {
409 if (
name == Fields::name)
410 return self.subDataItem(PathEls::Field(Fields::name), this->
name());
413 if (name == Fields::idStr) {
414 if (
idStr().isEmpty())
416 return self.subDataItem(PathEls::Field(Fields::idStr),
idStr());
420 if (
name == Fields::methods)
421 return self.wrapField(Fields::methods, m_methods);
424 switch (
name.at(1).unicode()) {
426 if (
name == Fields::bindings)
427 return self.wrapField(Fields::bindings, m_bindings);
430 if (
name == Fields::comments)
434 if (
name == Fields::children)
435 return self.wrapField(Fields::children, m_children);
442 if (
name == Fields::nextScope) {
444 return self.subReferenceItem(PathEls::Field(Fields::nextScope),
nextScopePath());
450 if (
name == Fields::prototypes) {
453 return self.subReferencesItem(PathEls::Field(Fields::prototypes), m_prototypePaths);
457 if (
name == Fields::annotations)
458 return self.wrapField(Fields::annotations, m_annotations);
461 return self.wrapField(Fields::propertyDefs, m_propertyDefs);
464 if (
name == Fields::propertyInfos)
468 auto pInfo =
self.propertyInfoWithName(k);
469 return map.wrap(PathEls::Key(k), pInfo);
475 if (
name == Fields::defaultPropertyName)
476 return self.subDataItem(PathEls::Field(Fields::defaultPropertyName),
483 if (!knownLookups.contains(
name))
484 qCWarning(domLog()) <<
"Asked non existing field " <<
name <<
" in QmlObject "
501 if (!m_defaultPropertyName.
isEmpty())
502 return m_defaultPropertyName;
503 for (
const PropertyDefinition &pDef : m_propertyDefs)
504 if (pDef.isDefaultMember)
515 self.visitPrototypeChain(
517 if (
const QmlObject *objPtr =
obj.as<QmlObject>()) {
518 QString dProp = objPtr->localDefaultPropertyName();
519 if (!dProp.isEmpty()) {
530bool QmlObject::iterateSubOwners(
DomItem &self, function_ref<
bool(
DomItem &)> visitor)
const
533 return bs.visitIndexes([visitor](
DomItem &
b) {
535 if (std::shared_ptr<ScriptExpression> vPtr =
v.ownerAs<ScriptExpression>()) {
538 return v.iterateSubOwners(visitor);
543 cont = cont &&
self.field(Fields::children).visitIndexes([visitor](
DomItem &qmlObj) {
544 if (
const QmlObject *qmlObjPtr = qmlObj.as<QmlObject>()) {
545 return qmlObjPtr->iterateSubOwners(qmlObj, visitor);
553static QStringList dotExpressionToList(std::shared_ptr<ScriptExpression> expr)
556 AST::Node *node = (expr ? expr->ast() :
nullptr);
558 switch (node->kind) {
560 AST::IdentifierExpression *
id = AST::cast<AST::IdentifierExpression *>(node);
561 res.prepend(
id->name.toString());
565 AST::FieldMemberExpression *
id = AST::cast<AST::FieldMemberExpression *>(node);
566 res.prepend(
id->name.toString());
571 qCDebug(writeOutLog).noquote() <<
"Could not convert dot expression to list for:\n"
572 << expr->astRelocatableDump();
579LocallyResolvedAlias QmlObject::resolveAlias(
DomItem &self,
580 std::shared_ptr<ScriptExpression> accessSequence)
const
582 QStringList accessSequenceList = dotExpressionToList(accessSequence);
586LocallyResolvedAlias QmlObject::resolveAlias(
DomItem &self,
const QStringList &accessSequence)
const
588 LocallyResolvedAlias
res;
590 if (accessSequence.isEmpty()) {
592 }
else if (accessSequence.size() > 3) {
593 res.status = LocallyResolvedAlias::Status::TooDeep;
596 QString idName = accessSequence.first();
601 .field(Fields::referredObject)
605 res.baseObject = idTarget;
606 res.accessedPath = accessSequence.mid(1);
607 res.typeName = idTarget.name();
608 res.status = LocallyResolvedAlias::Status::ResolvedObject;
610 while (!
res.accessedPath.isEmpty()) {
612 DomItem defNow =
res.baseObject.propertyDefs().key(pNow).index(0);
613 if (
const PropertyDefinition *defNowPtr = defNow.as<PropertyDefinition>()) {
614 if (defNowPtr->isAlias()) {
617 QString aliasPath = defNow.canonicalPath().toString();
618 if (visitedAlias.
contains(aliasPath)) {
619 res.status = LocallyResolvedAlias::Status::Loop;
622 visitedAlias.
insert(aliasPath);
623 DomItem valNow =
res.baseObject.bindings().key(pNow).index(0);
624 if (std::shared_ptr<ScriptExpression> exp =
625 valNow.field(Fields::value).ownerAs<ScriptExpression>()) {
627 if (expList.isEmpty()) {
628 res.status = LocallyResolvedAlias::Status::Invalid;
630 }
else if (expList.size() > 3) {
631 res.status = LocallyResolvedAlias::Status::TooDeep;
634 idName = expList.first();
635 idTarget =
self.component()
639 .field(Fields::referredObject)
641 res.baseObject = idTarget;
642 res.accessedPath = expList.mid(1) +
res.accessedPath.mid(1);
644 res.status = LocallyResolvedAlias::Status::Invalid;
647 res.status = LocallyResolvedAlias::Status::ResolvedObject;
648 res.typeName = idTarget.name();
650 res.status = LocallyResolvedAlias::Status::Invalid;
654 res.localPropertyDef = defNow;
655 res.typeName = defNowPtr->typeName;
656 res.accessedPath =
res.accessedPath.mid(1);
657 DomItem valNow =
res.baseObject.bindings().key(pNow).index(0).field(Fields::value);
658 if (valNow.internalKind() == DomType::QmlObject) {
659 res.baseObject = valNow;
660 res.typeName = valNow.name();
661 res.status = LocallyResolvedAlias::Status::ResolvedObject;
663 res.status = LocallyResolvedAlias::Status::ResolvedProperty;
674MutableDomItem QmlObject::addPropertyDef(MutableDomItem &self, PropertyDefinition propertyDef,
678 if (
p.last().headIndex(0) > 1)
680 tr(
"Repeated PropertyDefinition with name %1").
arg(propertyDef.name)));
681 return self.owner().path(
p);
684MutableDomItem QmlObject::addBinding(MutableDomItem &self,
Binding binding, AddOption
option)
687 if (
p &&
p.last().headIndex(0) > 1)
688 self.owningItemPtr()->addErrorLocal(
690 return self.owner().path(
p);
693MutableDomItem QmlObject::addMethod(MutableDomItem &self, MethodInfo functionDef, AddOption
option)
696 if (
p.last().headIndex(0) > 1)
697 self.owningItemPtr()->addErrorLocal(
699 return self.owner().path(
p);
702void QmlObject::writeOut(
DomItem &self, OutWriter &ow,
QString onTarget)
const
704 const quint32 posOfNewElements = std::numeric_limits<quint32>::max();
705 bool isRootObject = pathFromOwner().length() == 5
706 && pathFromOwner()[0] == Path::Field(Fields::components)
707 && pathFromOwner()[3] == Path::Field(Fields::objects);
710 if (std::shared_ptr<QmlFile> qmlFilePtr =
self.ownerAs<QmlFile>())
711 code = qmlFilePtr->code();
712 ow.writeRegion(u
"name",
name());
714 ow.space().writeRegion(u
"on", u
"on").space().writeRegion(u
"onTarget", onTarget).space();
715 ow.writeRegion(u
"leftBrace", u
" {").newline();
716 int baseIndent = ow.increaseIndent();
718 if (!idStr().isEmpty()) {
719 DomItem myId =
self.component().field(Fields::ids).key(idStr()).index(0);
721 myId.writeOutPre(ow);
723 .writeRegion(u
"idToken", u
"id")
724 .writeRegion(u
"idColon", u
":")
726 .writeRegion(u
"id", idStr());
727 if (ow.lineWriter.options().attributesSequence
728 == LineWriterOptions::AttributesSequence::Normalize) {
732 myId.writeOutPost(ow);
738 auto startLoc = [&](FileLocations::Tree l) {
740 return l->info().fullRegion;
741 return SourceLocation(posOfNewElements, 0, 0, 0);
743 if (ow.lineWriter.options().attributesSequence
744 == LineWriterOptions::AttributesSequence::Preserve) {
746 AttachedInfoLookupResult<FileLocations::Tree> objLoc =
747 FileLocations::findAttachedInfo(self);
748 FileLocations::Tree componentLoc;
749 if (isRootObject && objLoc.foundTree)
750 componentLoc = objLoc.foundTree->parent()->parent();
755 FileLocations::Tree elsLoc =
756 FileLocations::find(baseLoc, els.pathFromOwner().last());
758 FileLocations::Tree elLoc =
759 FileLocations::find(elsLoc,
el.pathFromOwner().
last());
760 attribs.append(std::make_pair(startLoc(elLoc),
el));
764 auto addMyMMap = [
this, &objLoc, &
self, &addMMap](
QStringView fieldName) {
766 addMMap(
base, FileLocations::find(objLoc.foundTree,
base.pathFromOwner().
last()));
768 auto addSingleLevel = [&
attribs, &startLoc](
DomItem &
base, FileLocations::Tree baseLoc) {
772 FileLocations::Tree elLoc = FileLocations::find(baseLoc,
el.pathFromOwner().
last());
773 attribs.append(std::make_pair(startLoc(elLoc),
el));
778 addMMap(enums, FileLocations::find(componentLoc, enums.pathFromOwner().last()));
780 addMyMMap(Fields::propertyDefs);
781 addMyMMap(Fields::bindings);
782 addMyMMap(Fields::methods);
783 DomItem children = field(self, Fields::children);
784 addSingleLevel(children,
785 FileLocations::find(objLoc.foundTree, children.pathFromOwner().last()));
789 AttachedInfoLookupResult<FileLocations::Tree> subLoc =
790 FileLocations::findAttachedInfo(
c);
792 attribs.append(std::make_pair(startLoc(subLoc.foundTree),
c));
796 [](
const std::pair<SourceLocation, DomItem> &el1,
797 const std::pair<SourceLocation, DomItem> &
el2) {
798 if (el1.first.offset < el2.first.offset)
800 if (el1.first.offset > el2.first.offset)
802 int i = int(el1.second.internalKind())
803 - int(el2.second.internalKind());
807 while (iAttr !=
attribs.size()) {
816 if (++preNewlines == 2)
818 }
else if (!
c.isSpace())
822 if (preNewlines == 0)
824 ow.ensureNewline(preNewlines);
825 if (
el.second.internalKind() == DomType::PropertyDefinition && iAttr !=
attribs.
size()
829 if (bPair.second.internalKind() == DomType::Binding
831 && bPair.second.name() ==
el.second.name()) {
836 el.second.writeOut(ow);
840 bPtr->writeOutValue(
b, ow);
842 qWarning() <<
"Internal error casting binding to Binding in"
843 <<
b.canonicalPath();
844 ow.writeRegion(u
"leftBrace", u
"{").writeRegion(u
"rightBrace", u
"}");
849 el.second.writeOut(ow);
852 ow.decreaseIndent(1, baseIndent);
853 ow.ensureNewline().write(u
"}");
857 DomItem bindings = field(self, Fields::bindings);
858 DomItem propertyDefs = field(self, Fields::propertyDefs);
861 for (
auto enumDescs :
component.field(Fields::enumerations).
values()) {
862 for (
auto enumDesc : enumDescs.
values()) {
864 enumDesc.writeOut(ow);
869 if (
counter != ow.counter() || !idStr().isEmpty())
870 spacerId = ow.addNewlinesAutospacerCallback(2);
872 for (
const QString &defName : propertyDefs.sortedKeys()) {
873 auto pDefs = propertyDefs.key(defName).values();
874 for (
auto pDef : pDefs) {
878 bool uniqueDeclarationWithThisName = pDefs.size() == 1;
879 if (uniqueDeclarationWithThisName && !pDefPtr->isRequired)
880 bindings.key(pDef.name()).visitIndexes([&
b, pDefPtr](
DomItem &
el) {
882 if (elPtr && elPtr->bindingType() == BindingType::Normal) {
883 switch (elPtr->valueKind()) {
884 case BindingValueKind::ScriptExpression:
887 case BindingValueKind::Array:
888 if (!pDefPtr->isDefaultMember
889 && pDefPtr->isParametricType())
892 case BindingValueKind::Object:
893 if (!pDefPtr->isDefaultMember
894 && !pDefPtr->isParametricType())
897 case BindingValueKind::Empty:
905 mergedDefBinding.
insert(defName);
912 bPtr->writeOutValue(
b, ow);
914 qWarning() <<
"Internal error casting binding to Binding in"
915 <<
b.canonicalPath();
916 ow.writeRegion(u
"leftBrace", u
"{").writeRegion(u
"rightBrace", u
"}");
922 ow.removeTextAddCallback(spacerId);
927 if (mPtr && mPtr->methodType == MethodInfo::MethodType::Signal)
934 spacerId = ow.addNewlinesAutospacerCallback(2);
935 for (
auto &sig : signalList) {
940 ow.removeTextAddCallback(spacerId);
942 spacerId = ow.addNewlinesAutospacerCallback(2);
944 for (
auto &
method : methodList) {
945 if (!
first && ow.lineWriter.options().functionsSpacing) {
953 ow.removeTextAddCallback(spacerId);
955 for (
auto bName : bindings.sortedKeys()) {
956 bool skipFirstNormal = mergedDefBinding.
contains(bName);
959 if (skipFirstNormal) {
960 if (bPtr && bPtr->bindingType() == BindingType::Normal) {
961 skipFirstNormal =
false;
965 if (bPtr->valueKind() == BindingValueKind::Array
966 || bPtr->valueKind() == BindingValueKind::Object)
968 else if (
b.field(Fields::isSignalHandler).value().toBool(
false))
975 spacerId = ow.addNewlinesAutospacerCallback(2);
976 for (
auto &
b : normalBindings)
978 ow.removeTextAddCallback(spacerId);
980 spacerId = ow.addNewlinesAutospacerCallback(2);
981 for (
auto &
b : delayedBindings)
983 ow.removeTextAddCallback(spacerId);
985 spacerId = ow.addNewlinesAutospacerCallback(2);
986 for (
auto &
b : signalHandlers)
988 ow.removeTextAddCallback(spacerId);
990 spacerId = ow.addNewlinesAutospacerCallback(2);
992 for (
auto c : field(
self, Fields::children).
values()) {
993 if (!
first && ow.lineWriter.options().objectsSpacing) {
994 ow.newline().newline();
1000 ow.removeTextAddCallback(spacerId);
1005 spacerId = ow.addNewlinesAutospacerCallback(2);
1006 for (
auto subC : subComps.
values()) {
1010 ow.removeTextAddCallback(spacerId);
1012 ow.decreaseIndent(1, baseIndent);
1013 ow.ensureNewline().write(u
"}");
1017 : m_bindingType(bindingType), m_name(
name), m_value(
std::move(
value))
1046 : m_bindingType(
o.m_bindingType),
1048 m_annotations(
o.m_annotations),
1049 m_comments(
o.m_comments)
1052 m_value = std::make_unique<BindingValue>(*
o.m_value);
1061 m_bindingType =
o.m_bindingType;
1062 m_annotations =
o.m_annotations;
1063 m_comments =
o.m_comments;
1066 m_value = std::make_unique<BindingValue>(*
o.m_value);
1068 *m_value = *
o.m_value;
1078 cont = cont &&
self.dvValueField(visitor, Fields::name, m_name);
1081 cont = cont && visitor(PathEls::Field(Fields::value), []() {
return DomItem(); });
1083 cont = cont &&
self.dvItemField(visitor, Fields::value, [
this, &self]() {
1084 return m_value->value(self);
1086 cont = cont &&
self.dvValueField(visitor, Fields::bindingType,
int(m_bindingType));
1087 cont = cont &&
self.dvWrapField(visitor, Fields::comments, m_comments);
1088 cont = cont &&
self.dvValueLazyField(visitor, Fields::preCode, [
this]() {
1091 cont = cont &&
self.dvValueLazyField(visitor, Fields::postCode, [
this]() {
1094 cont = cont &&
self.dvWrapField(visitor, Fields::annotations, m_annotations);
1102 return m_value->value(self);
1109 return m_value->kind;
1115 return &(m_value->object);
1122 return &(m_value->object);
1129 return &(m_value->array);
1136 return &(m_value->array);
1143 return m_value->scriptExpression;
1150 return m_value->scriptExpression;
1157 m_annotations, annotation, aPtr);
1162 Path base = newPath.field(Fields::annotations);
1164 m_value->updatePathFromOwner(newPath.field(Fields::value));
1172 lw.writeRegion(u
"name",
name());
1173 lw.writeRegion(u
"colon", u
":").space();
1177 if (
const QmlObject *vPtr =
v.as<QmlObject>()) {
1179 vPtr->writeOut(
v, lw,
name());
1182 qCWarning(writeOutLog()) <<
"On Binding requires an QmlObject Value, not "
1183 <<
v.internalKindStr() <<
" at " <<
self.canonicalPath();
1193 qCWarning(writeOutLog()) <<
"Writing of empty binding " <<
name();
1197 if (
const List *vPtr =
v.as<List>()) {
1199 vPtr->writeOut(
v, lw,
false);
1213 cont = cont &&
self.dvWrapField(visitor, Fields::exports, m_exports);
1214 cont = cont &&
self.dvValueField(visitor, Fields::metaRevisions, m_metaRevisions);
1216 cont = cont &&
self.dvValueField(visitor, Fields::fileName,
fileName());
1217 cont = cont &&
self.dvValueField(visitor, Fields::interfaceNames, m_interfaceNames);
1218 cont = cont &&
self.dvValueField(visitor, Fields::hasCustomParser, m_hasCustomParser);
1219 cont = cont &&
self.dvValueField(visitor, Fields::valueTypeName, m_valueTypeName);
1220 cont = cont &&
self.dvValueField(visitor, Fields::extensionTypeName, m_extensionTypeName);
1221 cont = cont &&
self.dvValueField(visitor, Fields::accessSemantics,
int(m_accessSemantics));
1233 spaceIdx = exp.
size();
1236 if (!
res.version.isValid())
1238 .
error(
tr(
"Expected string literal to contain 'Package/Name major.minor' "
1239 "or 'Name major.minor' not '%1'.")
1245 res.typeName = exp.
mid(slashIdx + 1, spaceIdx - (slashIdx + 1)).
toString();
1252 cont = cont &&
self.dvValueField(visitor, Fields::name,
name);
1253 cont = cont &&
self.dvValueField(visitor, Fields::access,
int(
access));
1254 cont = cont &&
self.dvValueField(visitor, Fields::typeName,
typeName);
1255 cont = cont &&
self.dvValueField(visitor, Fields::isReadonly,
isReadonly);
1256 cont = cont &&
self.dvValueField(visitor, Fields::isList,
isList);
1257 cont = cont &&
self.dvWrapField(visitor, Fields::comments,
comments);
1258 cont = cont &&
self.dvWrapField(visitor, Fields::annotations,
annotations);
1271 Path base = newPath.field(Fields::annotations);
1278 cont = cont &&
self.dvValueField(visitor, Fields::name,
name());
1279 cont = cont &&
self.dvWrapField(visitor, Fields::values, m_values);
1280 cont = cont &&
self.dvWrapField(visitor, Fields::annotations, m_annotations);
1303 ow.writeRegion(u
"enum", u
"enum")
1305 .writeRegion(u
"name",
name())
1307 .writeRegion(u
"lbrace", u
"{");
1308 int iLevel = ow.increaseIndent(1);
1313 ow.decreaseIndent(1, iLevel);
1314 ow.ensureNewline().writeRegion(u
"rbrace", u
"}");
1321 Path selfPath =
self.canonicalPath().field(Fields::allSources);
1324 return cached.canonicalPaths;
1327 QList<Path> toDo(m_importSourcePaths.rbegin(), m_importSourcePaths.rend());
1328 while (!toDo.isEmpty()) {
1329 Path pNow = toDo.takeLast();
1335 for (
DomItem autoExp : sourceBase.field(Fields::autoExports).
values()) {
1336 if (
const ModuleAutoExport *autoExpPtr = autoExp.as<ModuleAutoExport>()) {
1338 if (autoExpPtr->inheritVersion) {
1339 Version v = autoExpPtr->import.version;
1340 DomItem sourceVersion = sourceBase.field(Fields::version);
1341 if (
const Version *sourceVersionPtr = sourceVersion.as<Version>()) {
1342 if (
v.majorVersion < 0)
1343 v.majorVersion = sourceVersionPtr->majorVersion;
1344 if (
v.minorVersion < 0)
1345 v.minorVersion = sourceVersionPtr->minorVersion;
1347 qWarning() <<
"autoExport with inherited version " << autoExp
1348 <<
" but missing version in source" << pNow;
1350 Import toImport(autoExpPtr->import.uri,
v);
1351 newSource = toImport.importedPath();
1353 newSource = autoExpPtr->import.importedPath();
1355 if (newSource && !knownPaths.
contains(newSource))
1356 toDo.append(newSource);
1358 qWarning() <<
"expected ModuleAutoExport not " << autoExp.internalKindStr()
1359 <<
"looking up autoExports of" << sourceBase;
1372 cont = cont &&
self.dvReferencesField(visitor, Fields::importSources, m_importSourcePaths);
1373 cont = cont &&
self.dvItemField(visitor, Fields::allSources, [
this, &self]() ->
DomItem {
1374 return self.subListItem(List::fromQList<Path>(
1375 self.pathFromOwner().field(Fields::allSources),
allSources(self),
1380 cont = cont &&
self.dvWrapField(visitor, Fields::qualifiedImports, m_subImports);
1381 cont = cont &&
self.dvItemField(visitor, Fields::imported, [
this, &self]() ->
DomItem {
1383 self.pathFromOwner().field(Fields::imported),
1385 return map.subListItem(List::fromQList<DomItem>(
1400 cont = cont &&
self.dvValueField(visitor, Fields::propertyDefs,
propertyDefs);
1401 cont = cont &&
self.dvValueField(visitor, Fields::bindings,
bindings);
1415 new (&scriptExpression) std::shared_ptr<ScriptExpression>(
o);
1437 new (&scriptExpression) std::shared_ptr<ScriptExpression>(
o.scriptExpression);
1469 return binding.copy(&
object);
1471 return binding.subOwnerItem(PathEls::Field(Fields::value),
scriptExpression);
1473 return binding.subListItem(List::fromQListRef<QmlObject>(
1474 binding.pathFromOwner().field(u
"value"),
array,
1475 [binding](
DomItem &self,
const PathEls::PathComponent &, QmlObject &
obj) {
1476 return self.copy(&obj);
1488 object.updatePathFromOwner(newPath);
1498void BindingValue::clearValue()
1504 object.~QmlObject();
1517 AST::Node *ast, std::shared_ptr<AstComments> comments,
1518 ExpressionType expressionType, SourceLocation localOffset,
1520 : OwningItem(derivedFrom),
1521 m_expressionType(expressionType),
1524 m_postCode(postCode),
1527 m_astComments(comments),
1528 m_localOffset(localOffset)
1530 if (m_expressionType == ExpressionType::BindingExpression)
1531 if (AST::ExpressionStatement *exp = AST::cast<AST::ExpressionStatement *>(m_ast))
1532 m_ast = exp->expression;
1539 m_expressionType =
e.m_expressionType;
1540 m_engine =
e.m_engine;
1542 if (m_codeStr.isEmpty()) {
1545 m_codeStr =
e.m_codeStr;
1548 m_localOffset =
e.m_localOffset;
1549 m_astComments =
e.m_astComments;
1555 std::shared_ptr<ScriptExpression>
copy =
makeCopy(self);
1557 QString preCodeStr = container.field(Fields::preCode).value().toString(m_preCode.
toString());
1558 QString postCodeStr = container.field(Fields::postCode).value().toString(m_postCode.
toString());
1559 copy->setCode(
code, preCodeStr, postCodeStr);
1566 cont = cont &&
self.dvValueField(visitor, Fields::code,
code());
1569 &&
self.dvValueField(visitor, Fields::preCode,
preCode(),
1573 &&
self.dvValueField(visitor, Fields::postCode,
postCode(),
1576 &&
self.dvValueLazyField(
1577 visitor, Fields::localOffset,
1580 cont = cont &&
self.dvValueLazyField(visitor, Fields::astRelocatableDump, [
this]() {
1583 cont = cont &&
self.dvValueField(visitor, Fields::expressionType,
int(
expressionType()));
1585 cont = cont &&
self.dvItemField(visitor, Fields::scriptElement, [
this, &self]() {
1586 return self.subScriptElementWrapperItem(m_element);
1592class FirstNodeVisitor :
public VisitAll
1596 quint32 maxEnd = std::numeric_limits<quint32>::max();
1597 AST::Node *firstNodeInRange =
nullptr;
1599 FirstNodeVisitor(
quint32 minStart = 0,
quint32 maxEnd = std::numeric_limits<quint32>::max())
1600 : minStart(minStart), maxEnd(maxEnd)
1604 bool preVisit(AST::Node *
n)
override
1606 if (!VisitAll::uiKinds().
contains(
n->kind)) {
1609 if (!firstNodeInRange && minStart <=
start &&
end <= maxEnd &&
start <
end)
1610 firstNodeInRange =
n;
1612 return !firstNodeInRange;
1618 FirstNodeVisitor visitor(minStart, maxEnd);
1620 return visitor.firstNodeInRange;
1638 m_localOffset = SourceLocation();
1640 IndentInfo preChange(m_preCode, 4);
1643 m_localOffset.
startColumn = preChange.trailingString.size();
1644 m_localOffset.
startLine = preChange.nNewlines;
1645 m_engine = std::make_shared<QQmlJS::Engine>();
1646 m_astComments = std::make_shared<AstComments>(m_engine);
1648 lexer.setCode(m_codeStr, 1,
true);
1649 QQmlJS::Parser parser(m_engine.get());
1650 if ((qmlMode && !parser.parse()) || (!qmlMode && !parser.parseScript()))
1652 for (DiagnosticMessage msg : parser.diagnosticMessages()) {
1655 err.location.startLine -= m_localOffset.
startLine;
1656 if (err.location.startLine == 1)
1657 err.location.startColumn -= m_localOffset.
startColumn;
1660 m_ast = parser.rootNode();
1661 if (AST::Program *programPtr = AST::cast<AST::Program *>(m_ast)) {
1662 m_ast = programPtr->statements;
1665 m_ast = firstNodeInRange(m_ast, m_preCode.
size(),
1668 if (AST::StatementList *sList = AST::cast<AST::StatementList *>(m_ast)) {
1670 m_ast = sList->statement;
1674 if (AST::ExpressionStatement *exp = AST::cast<AST::ExpressionStatement *>(m_ast))
1675 m_ast = exp->expression;
1684 return this->
code().
mid(l.offset, l.length);
1697 OutWriter *ow = &lw;
1699 std::optional<PendingSourceLocationId> codeLoc;
1701 codeLoc = lw.lineWriter.startSourceLocation([
this, self, ow](SourceLocation myLoc)
mutable {
1704 if (reformattedCode !=
code()) {
1705 std::shared_ptr<ScriptExpression>
copy =
1707 ow->addReformattedScriptExpression(
self.canonicalPath(),
copy);
1712 [
this](SourceLocation astL) {
1714 return this->
code().
mid(l.offset, l.length);
1718 lw.lineWriter.endSourceLocation(*codeLoc);
1724 return fLocPtr->regions.value(
QString(), fLocPtr->fullRegion);
1726 return SourceLocation();
1738 lw.writeRegion(u
"default").space();
1740 lw.writeRegion(u
"required").space();
1742 lw.writeRegion(u
"readonly").space();
1744 lw.writeRegion(u
"property").space();
1745 lw.writeRegion(u
"type",
typeName).space();
1747 lw.writeRegion(u
"name",
name);
1753 cont = cont &&
self.dvWrapField(visitor, Fields::parameters,
parameters);
1754 cont = cont &&
self.dvValueField(visitor, Fields::methodType,
int(
methodType));
1756 cont = cont &&
self.dvReferenceField(visitor, Fields::type,
typePath(self));
1758 cont = cont &&
self.dvValueField(visitor, Fields::preCode,
preCode(self));
1759 cont = cont &&
self.dvValueField(visitor, Fields::postCode,
postCode(self));
1760 cont = cont &&
self.dvValueField(visitor, Fields::isConstructor,
isConstructor);
1763 cont = cont &&
self.dvItemField(visitor, Fields::returnType, [
this, &self]() {
1764 return self.subOwnerItem(PathEls::Field(Fields::returnType),
returnType);
1767 cont = cont &&
self.dvItemField(visitor, Fields::body, [
this, &self]() {
1768 return self.subOwnerItem(PathEls::Field(Fields::body),
body);
1778 ow.indentNextlines =
true;
1779 ow.skipComments =
true;
1782 ow.itemStart(standin);
1783 ow.writeRegion(u
"function").space().writeRegion(u
"name",
name);
1785 ow.writeRegion(u
"leftParen", u
"(");
1786 for (
const MethodParameter &mp :
parameters) {
1793 ow.writeRegion(u
"rightParen", u
")");
1794 ow.ensureSpace().writeRegion(u
"leftBrace", u
"{");
1795 ow.itemEnd(standin);
1810 qCWarning(domLog) <<
"signal should not have a body in" <<
self.canonicalPath();
1811 ow.writeRegion(u
"signal").space().writeRegion(u
"name",
name);
1815 ow.writeRegion(u
"leftParen", u
"(");
1816 int baseIndent = ow.increaseIndent();
1822 if (
const MethodParameter *argPtr =
arg.as<MethodParameter>())
1823 argPtr->writeOutSignal(
arg, ow);
1825 qCWarning(domLog) <<
"failed to cast to MethodParameter";
1827 ow.writeRegion(u
"rightParen", u
")");
1828 ow.decreaseIndent(1, baseIndent);
1832 ow.writeRegion(u
"function").space().writeRegion(u
"name",
name);
1834 ow.writeRegion(u
"leftParen", u
"(");
1842 ow.writeRegion(u
"rightParen", u
")");
1844 ow.writeRegion(u
"colon", u
":");
1846 ow.writeRegion(u
"returnType",
typeName);
1848 ow.ensureSpace().writeRegion(u
"leftBrace", u
"{");
1849 int baseIndent = ow.increaseIndent();
1854 ow.decreaseIndent(1, baseIndent);
1855 ow.ensureNewline().writeRegion(u
"rightBrace", u
"}");
1863 cont = cont &&
self.dvValueField(visitor, Fields::name,
name);
1867 cont = cont &&
self.dvValueField(visitor, Fields::typeName,
typeName);
1869 cont = cont &&
self.dvValueField(visitor, Fields::isPointer,
isPointer);
1870 cont = cont &&
self.dvValueField(visitor, Fields::isReadonly,
isReadonly);
1871 cont = cont &&
self.dvValueField(visitor, Fields::isList,
isList);
1872 cont = cont &&
self.dvWrapField(visitor, Fields::defaultValue,
defaultValue);
1873 cont = cont &&
self.dvWrapField(visitor, Fields::value,
value);
1876 cont = cont &&
self.dvWrapField(visitor, Fields::annotations,
annotations);
1877 cont = cont &&
self.dvWrapField(visitor, Fields::comments,
comments);
1883 ow.writeRegion(u
"name",
name);
1885 ow.writeRegion(u
"colon", u
":").space().writeRegion(u
"type",
typeName);
1887 ow.space().writeRegion(u
"equal", u
"=").space();
1888 self.subOwnerItem(PathEls::Field(Fields::defaultValue),
defaultValue).writeOut(ow);
1894 self.writeOutPre(ow);
1896 ow.writeRegion(u
"type",
typeName).space();
1897 ow.writeRegion(u
"name",
name);
1898 self.writeOutPost(ow);
1904 ow.writeRegion(u
"pragma").space().writeRegion(u
"name",
name);
1906 bool isFirst =
true;
1910 ow.writeRegion(u
"colon", u
": ");
1911 ow.writeRegion(u
"values",
value);
1915 ow.writeRegion(u
"comma", u
", ");
1916 ow.writeRegion(u
"values",
value);
1924 cont = cont &&
self.dvValueField(visitor, Fields::name,
name());
1925 cont = cont &&
self.dvValueField(visitor, Fields::value,
value());
1926 cont = cont &&
self.dvWrapField(visitor, Fields::comments, m_comments);
1933 ow.writeRegion(u
"name",
name());
1934 bool hasDefaultValue =
false;
1937 hasDefaultValue =
value() == 0;
1938 else if (myIndex > 0)
1939 hasDefaultValue =
value()
1942 .field(Fields::value)
1946 if (!hasDefaultValue) {
1948 if (abs(
value() -
v.toDouble()) > 1.e-10)
1950 ow.space().writeRegion(u
"equal", u
"=").space().writeRegion(u
"value",
v);
1952 if (myIndex >= 0 &&
self.container().indexes() != myIndex + 1)
1953 ow.writeRegion(u
"comma", u
",");
1961 .
replace(u
"\\\\"_s, u
"\\"_s));
2011 return std::get<QString>(m_value);
2022 const QUrl &
url = std::get<QUrl>(m_value);
2029 return std::get<QString>(m_value);
2041 const QUrl &
url = std::get<QUrl>(m_value);
2048 return QDir(basePath).
filePath(std::get<QString>(m_value));
2052 return std::get<QString>(m_value);
2060 return std::get<QUrl>(m_value);
2071 return std::get<QUrl>(m_value).toString();
2074 return std::get<QString>(m_value);
2085 return std::get<QString>(m_value);
2110#include "moc_qqmldomelements_p.cpp"
static JNINativeMethod methods[]
static constexpr QChar fromLatin1(char c) noexcept
Converts the Latin-1 character c to its equivalent QChar.
QString filePath(const QString &fileName) const
Returns the path name of a file in the directory.
\inmodule QtCore \reentrant
void append(parameter_type t)
Key key(const T &value, const Key &defaultKey=Key()) const
void accept(BaseVisitor *visitor)
@ Kind_IdentifierExpression
@ Kind_FieldMemberExpression
bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor)
void updatePathFromOwner(Path newPath)
QList< QmlObject > annotations
Path addAnnotation(Path selfPathFromOwner, const QmlObject &annotation, QmlObject **aPtr=nullptr)
DomItem value(DomItem &binding)
void updatePathFromOwner(Path newPath)
BindingValue & operator=(const BindingValue &o)
std::shared_ptr< ScriptExpression > scriptExpression
std::shared_ptr< ScriptExpression > scriptExpressionValue() const
Binding & operator=(const Binding &)
Path addAnnotation(Path selfPathFromOwner, const QmlObject &a, QmlObject **aPtr=nullptr)
static QString preCodeForName(QStringView n)
Binding(QString m_name=QString(), std::unique_ptr< BindingValue > value=std::unique_ptr< BindingValue >(), BindingType bindingType=BindingType::Normal)
QmlObject const * objectValue() const
QList< QmlObject > const * arrayValue() const
static QString postCodeForName(QStringView)
void writeOutValue(DomItem &self, OutWriter &lw) const
bool isSignalHandler() const
DomItem valueItem(DomItem &self) const
BindingValueKind valueKind() const
void updatePathFromOwner(Path newPath)
bool iterateDirectSubpaths(DomItem &self, DirectVisitor)
void writeOut(DomItem &self, OutWriter &lw) const
Path addObject(const QmlObject &object, QmlObject **oPtr=nullptr)
bool iterateDirectSubpaths(DomItem &, DirectVisitor) override
Path attachedTypePath(DomItem &) const
DomItem field(DomItem &self, QStringView name) const override
void updatePathFromOwner(Path newPath) override
QString attachedTypeName() const
virtual DomItem field(DomItem &self, QStringView name) const
virtual void updatePathFromOwner(Path newPath)
Path pathFromOwner() const
static ErrorGroup domErrorGroup
const QList< QmlObject > & annotations() const &
void setAnnotations(QList< QmlObject > annotations)
void updatePathFromOwner(Path newP) override
bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override
Path addAnnotation(const QmlObject &child, QmlObject **cPtr=nullptr)
void writeOut(DomItem &self, OutWriter &lw) const override
void writeOut(DomItem &self, OutWriter &lw) const
bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor)
Represents a set of tags grouping a set of related error messages.
ErrorMessage warning(QString message) const
ErrorMessage errorMessage(Dumper msg, ErrorLevel level, Path element=Path(), QString canonicalFilePath=QString(), SourceLocation location=SourceLocation()) const
ErrorMessage error(QString message) const
ErrorMessage handle(const ErrorHandler &errorHandler=nullptr)
static Export fromString(Path source, QStringView exp, Path typePath, ErrorHandler h)
static const FileLocations * fileLocationsOf(DomItem &)
Path addAnnotation(Path selfPathFromOwner, const QmlObject &ann, QmlObject **aPtr=nullptr)
bool iterateDirectSubpaths(DomItem &self, DirectVisitor)
void updatePathFromOwner(Path pathFromOwner)
Id(QString idName=QString(), Path referredObject=Path())
QList< QmlObject > annotations
QList< Path > allSources(DomItem &self) const
bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor)
QList< DomItem > importedItemsWithName(DomItem &self, QString name) const
QSet< QString > importedNames(DomItem &self) const
bool iterateDirectSubpaths(DomItem &self, DirectVisitor)
static Import fromUriString(QString importStr, Version v=Version(), QString importId=QString(), ErrorHandler handler=nullptr)
static QRegularExpression importRe()
void writeOut(DomItem &self, OutWriter &ow) const
static Import fromFileString(QString importStr, QString importId=QString(), ErrorHandler handler=nullptr)
std::shared_ptr< ScriptExpression > body
void writeOut(DomItem &self, OutWriter &ow) const
QList< MethodParameter > parameters
QString postCode(DomItem &) const
std::shared_ptr< ScriptExpression > returnType
Path typePath(DomItem &) const
bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor)
QString preCode(DomItem &) const
void writeOut(DomItem &self, OutWriter &ow) const
std::shared_ptr< ScriptExpression > defaultValue
void writeOutSignal(DomItem &self, OutWriter &ow) const
bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor)
QList< QmlObject > annotations
OutWriter & ensureNewline(int nNewlines=1)
OutWriter & writeRegion(QString rName, QStringView toWrite)
void addErrorLocal(ErrorMessage msg)
bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override
static Path Root(PathRoot r)
Path key(QString name) const
static ErrorGroups myErrors()
Path field(QString name) const
void writeOut(DomItem &self, OutWriter &ow) const
bool isParametricType() const
void writeOut(DomItem &self, OutWriter &lw) const
bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor)
QList< DomItem > propertyDefs
QList< DomItem > bindings
void writeOut(DomItem &self, OutWriter &) const override
bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override
void updatePathFromOwner(Path newPath) override
QList< QString > subComponentsNames(DomItem &self) const
QList< DomItem > subComponents(DomItem &self) const
QmlObject(Path pathFromOwner=Path())
const QList< Path > & prototypePaths() const &
DomItem field(DomItem &self, QStringView name)
QString localDefaultPropertyName() const
bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override
bool iterateBaseDirectSubpaths(DomItem &self, DirectVisitor)
Path nextScopePath() const
QList< QString > fields() const
void updatePathFromOwner(Path newPath) override
QString defaultPropertyName(DomItem &self) 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(DomItem &, DirectVisitor) override
static bool addForPath(DomItem &el, Path canonicalPath, const RefCacheEntry &entry, AddOption addOption=AddOption::KeepExisting)
static RefCacheEntry forPath(DomItem &el, Path canonicalPath)
QStringView preCode() const
std::shared_ptr< ScriptExpression > makeCopy(DomItem &self) const
std::shared_ptr< ScriptExpression > copyWithUpdatedCode(DomItem &self, QString code) const
ExpressionType expressionType() const
bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override
QStringView postCode() const
QString astRelocatableDump() const
void setScriptElement(const ScriptElementVariant &p)
void astDumper(Sink s, AstDumperOptions options) const
SourceLocation locationToLocal(SourceLocation x) const
SourceLocation localOffset() const
SourceLocation globalLocation(DomItem &self) const
void writeOut(DomItem &self, OutWriter &lw) const override
Version(qint32 majorVersion=Undefined, qint32 minorVersion=Undefined)
bool iterateDirectSubpaths(DomItem &self, DirectVisitor)
QString minorString() const
static Version fromString(QStringView v)
QString stringValue() const
static constexpr qint32 Undefined
static constexpr qint32 Latest
QString majorSymbolicString() const
Represents an immutable JsonPath like path in the Qml code model (from a DomItem to another DomItem)
\inmodule QtCore \reentrant
QRegularExpressionMatch match(const QString &subject, qsizetype offset=0, MatchType matchType=NormalMatch, MatchOptions matchOptions=NoMatchOption) const
Attempts to match the regular expression against the given subject string, starting at the position o...
static QString anchoredPattern(const QString &expression)
bool contains(const T &value) const
iterator insert(const T &value)
bool contains(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
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
constexpr QStringView left(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.
const_iterator end() const noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary character after...
qsizetype indexOf(QChar c, qsizetype from=0, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
\macro QT_RESTRICTED_CAST_FROM_ASCII
double toDouble(bool *ok=nullptr) const
Returns the string converted to a double value.
QString last(qsizetype n) const
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)
static QString fromUtf16(const char16_t *, qsizetype size=-1)
qsizetype size() const
Returns the number of characters in this string.
QString mid(qsizetype position, qsizetype n=-1) const
Returns a string that contains n characters of this string, starting at the specified position index.
QString first(qsizetype n) const
const QChar at(qsizetype i) const
Returns the character at the given index position in the string.
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
int compare(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
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...
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 moduleScopePath(QString uri, Version version, ErrorHandler)
Path lookupTypePath(QString name)
Path moduleIndexPath(QString uri, int majorVersion, ErrorHandler errorHandler)
void astNodeDumper(Sink s, Node *n, AstDumperOptions opt, int indent, int baseIndent, function_ref< QStringView(SourceLocation)>loc2str)
static ErrorGroups domParsingErrors()
function_ref< void(QStringView)> Sink
std::function< void(const ErrorMessage &)> ErrorHandler
void reformatAst(OutWriter &lw, std::shared_ptr< AstComments > comments, const std::function< QStringView(SourceLocation)> loc2Str, AST::Node *n)
function_ref< bool(const PathEls::PathComponent &, function_ref< DomItem()>)> DirectVisitor
QMLDOM_EXPORT QCborValue locationToData(SourceLocation loc, QStringView strValue=u"")
void updatePathFromOwnerQList(QList< T > &list, Path newPath)
QString dumperToString(Dumper writer)
Converts a dumper to a string.
void updatePathFromOwnerMultiMap(QMultiMap< K, T > &mmap, Path newPath)
Path appendUpdatableElementInQList(Path listPathFromOwner, QList< T > &list, const T &value, T **vPtr=nullptr)
Combined button and popup list for selecting options.
static jboolean copy(JNIEnv *, jobject)
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)
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
IUIAutomation __RPC__in_opt IUIAutomationElement * el2