Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmljsast.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include <QString>
5#include <QLocale>
7#include "qqmljsast_p.h"
8
10#include <qlocale.h>
11
12#include <algorithm>
13#include <array>
14
16
17namespace QQmlJS { namespace AST {
18
20{
21 if (!n)
22 return nullptr;
24 if (!f || !f->name.isNull())
25 return nullptr;
26 return f;
27}
28
30{
31 if (!n)
32 return nullptr;
34 if (!c || !c->name.isNull())
35 return nullptr;
36 return c;
37}
38
40{
41 return nullptr;
42}
43
45{
46 return nullptr;
47}
48
50{
51 return nullptr;
52}
53
55{
56 return nullptr;
57}
58
63
65{
66 return nullptr;
67}
68
70{
71 return nullptr;
72}
73
75{
76 return nullptr;
77}
78
80{
81 static const bool doIgnore = qEnvironmentVariableIsSet("QV4_CRASH_ON_STACKOVERFLOW");
82 return doIgnore;
83}
84
89
91{
92 for (const Node *node = this;;) {
93 switch (node->kind) {
95 const auto *fme = AST::cast<const FieldMemberExpression*>(node);
96 if (fme->isOptional)
97 return true;
98 node = fme->base;
99 break;
100 }
102 const auto *ame = AST::cast<const ArrayMemberExpression*>(node);
103 if (ame->isOptional)
104 return true;
105 node = ame->base;
106 break;
107 }
108 case Kind_CallExpression: {
109 const auto *ce = AST::cast<const CallExpression*>(node);
110 if (ce->isOptional)
111 return true;
112 node = ce->base;
113 break;
114 }
116 const auto *ne = AST::cast<const NestedExpression*>(node);
117 node = ne->expression;
118 break;
119 }
120 default:
121 // These unhandled nodes lead to invalid lvalues anyway, so they do not need to be handled here.
122 return false;
123 }
124 }
125 return false;
126}
127
129{
130 AST::ExpressionNode *expr = this;
131 AST::FormalParameterList *f = nullptr;
132 if (AST::Expression *commaExpr = AST::cast<AST::Expression *>(expr)) {
133 f = commaExpr->left->reparseAsFormalParameterList(pool);
134 if (!f)
135 return nullptr;
136
137 expr = commaExpr->right;
138 }
139
140 AST::ExpressionNode *rhs = nullptr;
141 if (AST::BinaryExpression *assign = AST::cast<AST::BinaryExpression *>(expr)) {
142 if (assign->op != QSOperator::Assign)
143 return nullptr;
144 expr = assign->left;
145 rhs = assign->right;
146 }
147 AST::PatternElement *binding = nullptr;
148 if (AST::IdentifierExpression *idExpr = AST::cast<AST::IdentifierExpression *>(expr)) {
149 binding = new (pool) AST::PatternElement(idExpr->name, /*type annotation*/nullptr, rhs);
150 binding->identifierToken = idExpr->identifierToken;
151 } else if (AST::Pattern *p = expr->patternCast()) {
152 SourceLocation loc;
153 QString s;
154 if (!p->convertLiteralToAssignmentPattern(pool, &loc, &s))
155 return nullptr;
156 binding = new (pool) AST::PatternElement(p, rhs);
157 binding->identifierToken = p->firstSourceLocation();
158 }
159 if (!binding)
160 return nullptr;
161 return new (pool) AST::FormalParameterList(f, binding);
162}
163
168
170{
171 visitor->visit(this);
172 visitor->endVisit(this);
173}
174
176{
177 return this;
178}
179
184
186{
187 if (visitor->visit(this)) {
188 accept(expression, visitor);
189 }
190 visitor->endVisit(this);
191}
192
197
202
204{
205 if (visitor->visit(this)) {
206 }
207
208 visitor->endVisit(this);
209}
210
212{
213 if (visitor->visit(this)) {
214 }
215
216 visitor->endVisit(this);
217}
218
220{
221 if (visitor->visit(this)) {
222 }
223
224 visitor->endVisit(this);
225}
226
228{
229 if (visitor->visit(this)) {
230 }
231
232 visitor->endVisit(this);
233}
234
236{
237 if (visitor->visit(this)) {
238 }
239
240 visitor->endVisit(this);
241}
242
244{
245 if (visitor->visit(this)) {
246 }
247
248 visitor->endVisit(this);
249}
250
251
253{
254 if (visitor->visit(this)) {
255 }
256
257 visitor->endVisit(this);
258}
259
261{
262 bool accepted = true;
263 for (TemplateLiteral *it = this; it && accepted; it = it->next) {
264 accepted = visitor->visit(it);
265 visitor->endVisit(it);
266 }
267}
268
270{
271 if (visitor->visit(this)) {
272 }
273
274 visitor->endVisit(this);
275}
276
278{
279 if (visitor->visit(this)) {
280 }
281
282 visitor->endVisit(this);
283}
284
286{
287 if (visitor->visit(this))
288 accept(elements, visitor);
289
290 visitor->endVisit(this);
291}
292
294 for (PatternElementList *it = elements; it != nullptr; it = it->next) {
295 PatternElement *e = it->element;
296 if (e && e->bindingTarget != nullptr) {
297 if (errorLocation)
298 *errorLocation = e->firstSourceLocation();
299 return false;
300 }
301 }
302 return true;
303}
304
306{
307 if (visitor->visit(this)) {
308 accept(properties, visitor);
309 }
310
311 visitor->endVisit(this);
312}
313
314/*
315 This is the grammar for AssignmentPattern that we need to convert the literal to:
316
317 AssignmentPattern:
318 ObjectAssignmentPattern
319 ArrayAssignmentPattern
320 ArrayAssignmentPattern:
321 [ ElisionOpt AssignmentRestElementOpt ]
322 [ AssignmentElementList ]
323 [ AssignmentElementList , ElisionOpt AssignmentRestElementOpt ]
324 AssignmentElementList:
325 AssignmentElisionElement
326 AssignmentElementList , AssignmentElisionElement
327 AssignmentElisionElement:
328 ElisionOpt AssignmentElement
329 AssignmentRestElement:
330 ... DestructuringAssignmentTarget
331
332 ObjectAssignmentPattern:
333 {}
334 { AssignmentPropertyList }
335 { AssignmentPropertyList, }
336 AssignmentPropertyList:
337 AssignmentProperty
338 AssignmentPropertyList , AssignmentProperty
339 AssignmentProperty:
340 IdentifierReference InitializerOpt_In
341 PropertyName:
342 AssignmentElement
343
344 AssignmentElement:
345 DestructuringAssignmentTarget InitializerOpt_In
346 DestructuringAssignmentTarget:
347 LeftHandSideExpression
348
349 It was originally parsed with the following grammar:
350
351ArrayLiteral:
352 [ ElisionOpt ]
353 [ ElementList ]
354 [ ElementList , ElisionOpt ]
355ElementList:
356 ElisionOpt AssignmentExpression_In
357 ElisionOpt SpreadElement
358 ElementList , ElisionOpt AssignmentExpression_In
359 ElementList , Elisionopt SpreadElement
360SpreadElement:
361 ... AssignmentExpression_In
362ObjectLiteral:
363 {}
364 { PropertyDefinitionList }
365 { PropertyDefinitionList , }
366PropertyDefinitionList:
367 PropertyDefinition
368 PropertyDefinitionList , PropertyDefinition
369PropertyDefinition:
370 IdentifierReference
371 CoverInitializedName
372 PropertyName : AssignmentExpression_In
373 MethodDefinition
374PropertyName:
375 LiteralPropertyName
376 ComputedPropertyName
377
378*/
380{
381 if (parseMode == Binding)
382 return true;
383 for (auto *it = elements; it; it = it->next) {
384 if (!it->element)
385 continue;
386 if (it->element->type == PatternElement::SpreadElement && it->next) {
387 *errorLocation = it->element->firstSourceLocation();
388 *errorMessage = QString::fromLatin1("'...' can only appear as last element in a destructuring list.");
389 return false;
390 }
391 if (!it->element->convertLiteralToAssignmentPattern(pool, errorLocation, errorMessage))
392 return false;
393 }
395 return true;
396}
397
399{
400 if (parseMode == Binding)
401 return true;
402 for (auto *it = properties; it; it = it->next) {
403 if (!it->property->convertLiteralToAssignmentPattern(pool, errorLocation, errorMessage))
404 return false;
405 }
407 return true;
408}
409
411{
414 Q_ASSERT(bindingTarget == nullptr);
415 Q_ASSERT(bindingTarget == nullptr);
418
419 initializer = nullptr;
420 LeftHandSideExpression *lhs = init->leftHandSideExpressionCast();
421 if (type == SpreadElement) {
422 if (!lhs) {
423 *errorLocation = init->firstSourceLocation();
424 *errorMessage = QString::fromLatin1("Invalid lhs expression after '...' in destructuring expression.");
425 return false;
426 }
427 } else {
429
430 if (BinaryExpression *b = init->binaryExpressionCast()) {
431 if (b->op != QSOperator::Assign) {
432 *errorLocation = b->operatorToken;
433 *errorMessage = QString::fromLatin1("Invalid assignment operation in destructuring expression");
434 return false;
435 }
436 lhs = b->left->leftHandSideExpressionCast();
437 initializer = b->right;
438 Q_ASSERT(lhs);
439 } else {
440 lhs = init->leftHandSideExpressionCast();
441 }
442 if (!lhs) {
443 *errorLocation = init->firstSourceLocation();
444 *errorMessage = QString::fromLatin1("Destructuring target is not a left hand side expression.");
445 return false;
446 }
447 }
448
449 if (auto *i = cast<IdentifierExpression *>(lhs)) {
450 bindingIdentifier = i->name;
451 identifierToken = i->identifierToken;
452 return true;
453 }
454
455 bindingTarget = lhs;
456 if (auto *p = lhs->patternCast()) {
457 if (!p->convertLiteralToAssignmentPattern(pool, errorLocation, errorMessage))
458 return false;
459 }
460 return true;
461}
462
464{
466 if (type == Binding)
467 return true;
468 if (type == Getter || type == Setter) {
469 *errorLocation = firstSourceLocation();
470 *errorMessage = QString::fromLatin1("Invalid getter/setter in destructuring expression.");
471 return false;
472 }
473 if (type == Method)
474 type = Literal;
477}
478
479
481{
482 if (visitor->visit(this)) {
483 // ###
484 }
485
486 visitor->endVisit(this);
487}
488
490{
491 if (visitor->visit(this)) {
492 }
493
494 visitor->endVisit(this);
495}
496
498{
499 if (visitor->visit(this)) {
500 }
501
502 visitor->endVisit(this);
503}
504
506{
507 if (visitor->visit(this)) {
508 }
509
510 visitor->endVisit(this);
511}
512
513namespace {
514struct LocaleWithoutZeroPadding : public QLocale
515{
516 LocaleWithoutZeroPadding()
517 : QLocale(QLocale::C)
518 {
520 }
521};
522}
523
525{
526 // Can't use QString::number here anymore as it does zero padding by default now.
527
528 // In C++11 this initialization is thread-safe (6.7 [stmt.dcl] p4)
529 static LocaleWithoutZeroPadding locale;
530 // Because of https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83562 we can't use thread_local
531 // for the locale variable and therefore rely on toString(double) to be thread-safe.
532 return locale.toString(id, 'g', 16);
533}
534
536{
537 if (visitor->visit(this)) {
538 accept(base, visitor);
539 accept(expression, visitor);
540 }
541
542 visitor->endVisit(this);
543}
544
546{
547 if (visitor->visit(this)) {
548 accept(base, visitor);
549 }
550
551 visitor->endVisit(this);
552}
553
555{
556 if (visitor->visit(this)) {
557 accept(base, visitor);
558 accept(arguments, visitor);
559 }
560
561 visitor->endVisit(this);
562}
563
565{
566 if (visitor->visit(this)) {
567 accept(expression, visitor);
568 }
569
570 visitor->endVisit(this);
571}
572
574{
575 if (visitor->visit(this)) {
576 accept(base, visitor);
577 accept(arguments, visitor);
578 }
579
580 visitor->endVisit(this);
581}
582
584{
585 if (visitor->visit(this)) {
586 for (ArgumentList *it = this; it; it = it->next) {
587 accept(it->expression, visitor);
588 }
589 }
590
591 visitor->endVisit(this);
592}
593
595{
596 if (visitor->visit(this)) {
597 accept(base, visitor);
598 }
599
600 visitor->endVisit(this);
601}
602
604{
605 if (visitor->visit(this)) {
606 accept(base, visitor);
607 }
608
609 visitor->endVisit(this);
610}
611
613{
614 if (visitor->visit(this)) {
615 accept(expression, visitor);
616 }
617
618 visitor->endVisit(this);
619}
620
622{
623 if (visitor->visit(this)) {
624 accept(expression, visitor);
625 }
626
627 visitor->endVisit(this);
628}
629
631{
632 if (visitor->visit(this)) {
633 accept(expression, visitor);
634 }
635
636 visitor->endVisit(this);
637}
638
640{
641 if (visitor->visit(this)) {
642 accept(expression, visitor);
643 }
644
645 visitor->endVisit(this);
646}
647
649{
650 if (visitor->visit(this)) {
651 accept(expression, visitor);
652 }
653
654 visitor->endVisit(this);
655}
656
658{
659 if (visitor->visit(this)) {
660 accept(expression, visitor);
661 }
662
663 visitor->endVisit(this);
664}
665
667{
668 if (visitor->visit(this)) {
669 accept(expression, visitor);
670 }
671
672 visitor->endVisit(this);
673}
674
676{
677 if (visitor->visit(this)) {
678 accept(expression, visitor);
679 }
680
681 visitor->endVisit(this);
682}
683
685{
686 if (visitor->visit(this)) {
687 accept(expression, visitor);
688 }
689
690 visitor->endVisit(this);
691}
692
694{
695 if (visitor->visit(this)) {
696 accept(left, visitor);
697 accept(right, visitor);
698 }
699
700 visitor->endVisit(this);
701}
702
704{
705 if (visitor->visit(this)) {
706 accept(expression, visitor);
707 accept(ok, visitor);
708 accept(ko, visitor);
709 }
710
711 visitor->endVisit(this);
712}
713
715{
716 if (visitor->visit(this)) {
717 accept(left, visitor);
718 accept(right, visitor);
719 }
720
721 visitor->endVisit(this);
722}
723
724void Block::accept0(BaseVisitor *visitor)
725{
726 if (visitor->visit(this)) {
727 accept(statements, visitor);
728 }
729
730 visitor->endVisit(this);
731}
732
734{
735 if (visitor->visit(this)) {
736 for (StatementList *it = this; it; it = it->next) {
737 accept(it->statement, visitor);
738 }
739 }
740
741 visitor->endVisit(this);
742}
743
745{
746 if (visitor->visit(this)) {
747 accept(declarations, visitor);
748 }
749
750 visitor->endVisit(this);
751}
752
754{
755 if (visitor->visit(this)) {
756 for (VariableDeclarationList *it = this; it; it = it->next) {
757 accept(it->declaration, visitor);
758 }
759 }
760
761 visitor->endVisit(this);
762}
763
765{
766 if (visitor->visit(this)) {
767 }
768
769 visitor->endVisit(this);
770}
771
773{
774 if (visitor->visit(this)) {
775 accept(expression, visitor);
776 }
777
778 visitor->endVisit(this);
779}
780
782{
783 if (visitor->visit(this)) {
784 accept(expression, visitor);
785 accept(ok, visitor);
786 accept(ko, visitor);
787 }
788
789 visitor->endVisit(this);
790}
791
793{
794 if (visitor->visit(this)) {
795 accept(statement, visitor);
796 accept(expression, visitor);
797 }
798
799 visitor->endVisit(this);
800}
801
803{
804 if (visitor->visit(this)) {
805 accept(expression, visitor);
806 accept(statement, visitor);
807 }
808
809 visitor->endVisit(this);
810}
811
813{
814 if (visitor->visit(this)) {
815 accept(initialiser, visitor);
816 accept(declarations, visitor);
817 accept(condition, visitor);
818 accept(expression, visitor);
819 accept(statement, visitor);
820 }
821
822 visitor->endVisit(this);
823}
824
826{
827 if (visitor->visit(this)) {
828 accept(lhs, visitor);
829 accept(expression, visitor);
830 accept(statement, visitor);
831 }
832
833 visitor->endVisit(this);
834}
835
837{
838 if (visitor->visit(this)) {
839 }
840
841 visitor->endVisit(this);
842}
843
845{
846 if (visitor->visit(this)) {
847 }
848
849 visitor->endVisit(this);
850}
851
853{
854 if (visitor->visit(this)) {
855 accept(expression, visitor);
856 }
857
858 visitor->endVisit(this);
859}
860
862{
863 if (visitor->visit(this)) {
864 accept(expression, visitor);
865 }
866
867 visitor->endVisit(this);
868}
869
870
872{
873 if (visitor->visit(this)) {
874 accept(expression, visitor);
875 accept(statement, visitor);
876 }
877
878 visitor->endVisit(this);
879}
880
882{
883 if (visitor->visit(this)) {
884 accept(expression, visitor);
885 accept(block, visitor);
886 }
887
888 visitor->endVisit(this);
889}
890
892{
893 if (visitor->visit(this)) {
894 accept(clauses, visitor);
895 accept(defaultClause, visitor);
896 accept(moreClauses, visitor);
897 }
898
899 visitor->endVisit(this);
900}
901
903{
904 if (visitor->visit(this)) {
905 for (CaseClauses *it = this; it; it = it->next) {
906 accept(it->clause, visitor);
907 }
908 }
909
910 visitor->endVisit(this);
911}
912
914{
915 if (visitor->visit(this)) {
916 accept(expression, visitor);
917 accept(statements, visitor);
918 }
919
920 visitor->endVisit(this);
921}
922
924{
925 if (visitor->visit(this)) {
926 accept(statements, visitor);
927 }
928
929 visitor->endVisit(this);
930}
931
933{
934 if (visitor->visit(this)) {
935 accept(statement, visitor);
936 }
937
938 visitor->endVisit(this);
939}
940
942{
943 if (visitor->visit(this)) {
944 accept(expression, visitor);
945 }
946
947 visitor->endVisit(this);
948}
949
951{
952 if (visitor->visit(this)) {
953 accept(statement, visitor);
954 accept(catchExpression, visitor);
955 accept(finallyExpression, visitor);
956 }
957
958 visitor->endVisit(this);
959}
960
962{
963 if (visitor->visit(this)) {
964 accept(patternElement, visitor);
965 accept(statement, visitor);
966 }
967
968 visitor->endVisit(this);
969}
970
972{
973 if (visitor->visit(this)) {
974 accept(statement, visitor);
975 }
976
977 visitor->endVisit(this);
978}
979
981{
982 if (visitor->visit(this)) {
983 accept(formals, visitor);
984 accept(typeAnnotation, visitor);
985 accept(body, visitor);
986 }
987
988 visitor->endVisit(this);
989}
990
992{
993 if (visitor->visit(this)) {
994 accept(formals, visitor);
995 accept(typeAnnotation, visitor);
996 accept(body, visitor);
997 }
998
999 visitor->endVisit(this);
1000}
1001
1006
1008{
1010 int i = 0;
1011 for (const FormalParameterList *it = this; it; it = it->next) {
1012 if (it->element) {
1013 QString name = it->element->bindingIdentifier.toString();
1014 int duplicateIndex = formals.indexOf(name);
1015 if (duplicateIndex >= 0) {
1016 // change the name of the earlier argument to enforce the lookup semantics from the spec
1017 formals[duplicateIndex].id += QLatin1String("#") + QString::number(i);
1018 }
1019 formals += { name, it->element->firstSourceLocation(), it->element->typeAnnotation,
1020 it->element->isInjectedSignalParameter ? BoundName::Injected
1022 }
1023 ++i;
1024 }
1025 return formals;
1026}
1027
1029{
1031 for (const FormalParameterList *it = this; it; it = it->next) {
1032 if (it->element)
1033 it->element->boundNames(&names);
1034 }
1035 return names;
1036}
1037
1039{
1040 bool accepted = true;
1041 for (FormalParameterList *it = this; it && accepted; it = it->next) {
1042 accepted = visitor->visit(it);
1043 if (accepted)
1044 accept(it->element, visitor);
1045 visitor->endVisit(it);
1046 }
1047}
1048
1050{
1051 FormalParameterList *front = next;
1052 next = nullptr;
1053 return front;
1054}
1055
1057{
1058 if (visitor->visit(this)) {
1059 accept(statements, visitor);
1060 }
1061
1062 visitor->endVisit(this);
1063}
1064
1066{
1067 if (visitor->visit(this)) {
1068
1069 }
1070 visitor->endVisit(this);
1071}
1072
1074{
1075 if (visitor->visit(this)) {
1076 for (ImportsList *it = this; it; it = it->next) {
1077 accept(it->importSpecifier, visitor);
1078 }
1079 }
1080
1081 visitor->endVisit(this);
1082}
1083
1085{
1086 if (visitor->visit(this)) {
1087 accept(importsList, visitor);
1088 }
1089
1090 visitor->endVisit(this);
1091}
1092
1094{
1095 if (visitor->visit(this)) {
1096 }
1097
1098 visitor->endVisit(this);
1099}
1100
1102{
1103 if (visitor->visit(this)) {
1104 }
1105
1106 visitor->endVisit(this);
1107}
1108
1110{
1111 if (visitor->visit(this)) {
1112 accept(nameSpaceImport, visitor);
1113 accept(namedImports, visitor);
1114 }
1115
1116 visitor->endVisit(this);
1117}
1118
1120{
1121 if (visitor->visit(this)) {
1122 accept(importClause, visitor);
1123 accept(fromClause, visitor);
1124 }
1125
1126 visitor->endVisit(this);
1127}
1128
1130{
1131 if (visitor->visit(this)) {
1132
1133 }
1134
1135 visitor->endVisit(this);
1136}
1137
1139{
1140 if (visitor->visit(this)) {
1141 for (ExportsList *it = this; it; it = it->next) {
1142 accept(it->exportSpecifier, visitor);
1143 }
1144 }
1145
1146 visitor->endVisit(this);
1147}
1148
1150{
1151 if (visitor->visit(this)) {
1152 accept(exportsList, visitor);
1153 }
1154
1155 visitor->endVisit(this);
1156}
1157
1159{
1160 if (visitor->visit(this)) {
1161 accept(exportClause, visitor);
1162 accept(fromClause, visitor);
1164 }
1165
1166 visitor->endVisit(this);
1167}
1168
1170{
1171 if (visitor->visit(this)) {
1172 accept(body, visitor);
1173 }
1174
1175 visitor->endVisit(this);
1176}
1177
1179{
1180 if (visitor->visit(this)) {
1181 }
1182
1183 visitor->endVisit(this);
1184}
1185
1187{
1188 if (visitor->visit(this)) {
1189 accept(headers, visitor);
1190 accept(members, visitor);
1191 }
1192
1193 visitor->endVisit(this);
1194}
1195
1197{
1198 if (visitor->visit(this)) {
1199 // accept(annotations, visitor); // accept manually in visit if interested
1200 // accept(memberType, visitor); // accept manually in visit if interested
1201 accept(statement, visitor);
1202 accept(binding, visitor);
1203 // accept(parameters, visitor); // accept manually in visit if interested
1204 }
1205
1206 visitor->endVisit(this);
1207}
1208
1210{
1211 if (visitor->visit(this)) {
1212 // accept(annotations, visitor); // accept manually in visit if interested
1213 accept(qualifiedTypeNameId, visitor);
1214 accept(initializer, visitor);
1215 }
1216
1217 visitor->endVisit(this);
1218}
1219
1221{
1222 if (visitor->visit(this)) {
1223 accept(members, visitor);
1224 }
1225
1226 visitor->endVisit(this);
1227}
1228
1230{
1231 if (visitor->visit(this)) {
1232 // accept(type, visitor); // accept manually in visit if interested
1233 }
1234 visitor->endVisit(this);
1235}
1236
1238{
1239 if (visitor->visit(this)) {
1240 // accept(annotations, visitor); // accept manually in visit if interested
1241 accept(qualifiedId, visitor);
1242 accept(qualifiedTypeNameId, visitor);
1243 accept(initializer, visitor);
1244 }
1245
1246 visitor->endVisit(this);
1247}
1248
1250{
1251 if (visitor->visit(this)) {
1252 // accept(annotations, visitor); // accept manually in visit if interested
1253 accept(qualifiedId, visitor);
1254 accept(statement, visitor);
1255 }
1256
1257 visitor->endVisit(this);
1258}
1259
1261{
1262 if (visitor->visit(this)) {
1263 // accept(annotations, visitor); // accept manually in visit if interested
1264 accept(qualifiedId, visitor);
1265 accept(members, visitor);
1266 }
1267
1268 visitor->endVisit(this);
1269}
1270
1272{
1273 if (visitor->visit(this)) {
1274 for (UiObjectMemberList *it = this; it; it = it->next)
1275 accept(it->member, visitor);
1276 }
1277
1278 visitor->endVisit(this);
1279}
1280
1282{
1283 if (visitor->visit(this)) {
1284 for (UiArrayMemberList *it = this; it; it = it->next)
1285 accept(it->member, visitor);
1286 }
1287
1288 visitor->endVisit(this);
1289}
1290
1292{
1293 if (visitor->visit(this)) {
1294 // accept(next, visitor) // accept manually in visit if interested
1295 }
1296
1297 visitor->endVisit(this);
1298}
1299
1300void Type::accept0(BaseVisitor *visitor)
1301{
1302 if (visitor->visit(this)) {
1303 accept(typeId, visitor);
1304 accept(typeArgument, visitor);
1305 }
1306
1307 visitor->endVisit(this);
1308}
1309
1311{
1312 if (visitor->visit(this)) {
1313 accept(type, visitor);
1314 }
1315
1316 visitor->endVisit(this);
1317}
1318
1320{
1321 if (visitor->visit(this)) {
1322 accept(importUri, visitor);
1323 // accept(version, visitor); // accept manually in visit if interested
1324 }
1325
1326 visitor->endVisit(this);
1327}
1328
1330{
1331 if (visitor->visit(this)) {
1332 }
1333
1334 visitor->endVisit(this);
1335}
1336
1337
1339{
1340 if (visitor->visit(this)) {
1341 }
1342
1343 visitor->endVisit(this);
1344}
1345
1347{
1348 bool accepted = true;
1349 for (UiHeaderItemList *it = this; it && accepted; it = it->next) {
1350 accepted = visitor->visit(it);
1351 if (accepted)
1352 accept(it->headerItem, visitor);
1353
1354 visitor->endVisit(it);
1355 }
1356}
1357
1358
1360{
1361 if (visitor->visit(this)) {
1362 // accept(annotations, visitor); // accept manually in visit if interested
1363 accept(sourceElement, visitor);
1364 }
1365
1366 visitor->endVisit(this);
1367}
1368
1370{
1371 if (visitor->visit(this)) {
1372 // accept(annotations, visitor); // accept manually in visit if interested
1373 accept(members, visitor);
1374 }
1375
1376 visitor->endVisit(this);
1377}
1378
1380{
1381 if (visitor->visit(this)) {
1382 }
1383
1384 visitor->endVisit(this);
1385}
1386
1388{
1389 if (visitor->visit(this)) {
1390 accept(base, visitor);
1391 accept(templateLiteral, visitor);
1392 }
1393
1394 visitor->endVisit(this);
1395}
1396
1398{
1399 expression->accept0(visitor);
1400}
1401
1403{
1404 if (visitor->visit(this)) {
1405 accept(bindingTarget, visitor);
1406 accept(typeAnnotation, visitor);
1407 accept(initializer, visitor);
1408 }
1409
1410 visitor->endVisit(this);
1411}
1412
1414{
1415 if (bindingTarget) {
1417 e->boundNames(names);
1418 else if (PatternPropertyList *p = propertyList())
1419 p->boundNames(names);
1420 } else {
1423 }
1424}
1425
1427{
1428 bool accepted = true;
1429 for (PatternElementList *it = this; it && accepted; it = it->next) {
1430 accepted = visitor->visit(it);
1431 if (accepted) {
1432 accept(it->elision, visitor);
1433 accept(it->element, visitor);
1434 }
1435 visitor->endVisit(it);
1436 }
1437}
1438
1440{
1441 for (PatternElementList *it = this; it; it = it->next) {
1442 if (it->element)
1443 it->element->boundNames(names);
1444 }
1445}
1446
1448{
1449 if (visitor->visit(this)) {
1450 accept(name, visitor);
1451 accept(bindingTarget, visitor);
1452 accept(typeAnnotation, visitor);
1453 accept(initializer, visitor);
1454 }
1455
1456 visitor->endVisit(this);
1457}
1458
1463
1465{
1466 bool accepted = true;
1467 for (PatternPropertyList *it = this; it && accepted; it = it->next) {
1468 accepted = visitor->visit(it);
1469 if (accepted)
1470 accept(it->property, visitor);
1471 visitor->endVisit(it);
1472 }
1473}
1474
1476{
1477 for (PatternPropertyList *it = this; it; it = it->next)
1478 it->property->boundNames(names);
1479}
1480
1482{
1483 if (visitor->visit(this)) {
1484 accept(expression, visitor);
1485 }
1486
1487 visitor->endVisit(this);
1488}
1489
1491{
1492 if (visitor->visit(this)) {
1493 accept(heritage, visitor);
1494 accept(elements, visitor);
1495 }
1496
1497 visitor->endVisit(this);
1498}
1499
1504
1506{
1507 if (visitor->visit(this)) {
1508 accept(heritage, visitor);
1509 accept(elements, visitor);
1510 }
1511
1512 visitor->endVisit(this);
1513}
1514
1516{
1517 bool accepted = true;
1518 for (ClassElementList *it = this; it && accepted; it = it->next) {
1519 accepted = visitor->visit(it);
1520 if (accepted)
1521 accept(it->property, visitor);
1522
1523 visitor->endVisit(it);
1524 }
1525}
1526
1528{
1529 ClassElementList *front = next;
1530 next = nullptr;
1531 return front;
1532}
1533
1535{
1536 return this;
1537}
1538
1543
1545{
1546 if (visitor->visit(this)) {
1547 }
1548 visitor->endVisit(this);
1549}
1550
1551QString Type::toString() const
1552{
1554 toString(&result);
1555 return result;
1556}
1557
1558void Type::toString(QString *out) const
1559{
1561
1562 if (typeArgument) {
1563 out->append(QLatin1Char('<'));
1565 out->append(QLatin1Char('>'));
1566 };
1567}
1568
1570{
1571 if (visitor->visit(this)) {
1572 // accept(annotations, visitor); // accept manually in visit if interested
1573 accept(component, visitor);
1574 }
1575
1576 visitor->endVisit(this);
1577}
1578
1580{
1581 if (visitor->visit(this)) {
1582 }
1583
1584 visitor->endVisit(this);
1585}
1586
1588{
1589 if (visitor->visit(this)) {
1590 for (UiAnnotationList *it = this; it; it = it->next)
1591 accept(it->annotation, visitor);
1592 }
1593
1594 visitor->endVisit(this);
1595}
1596
1598{
1599 if (visitor->visit(this)) {
1600 accept(qualifiedTypeNameId, visitor);
1601 accept(initializer, visitor);
1602 }
1603
1604 visitor->endVisit(this);
1605}
1606
1608{
1609 std::array<const SourceLocation *, 4> tokens {&m_propertyToken, &m_defaultToken, &m_readonlyToken, &m_requiredToken};
1610 const auto it = std::min_element(tokens.begin(), tokens.end(), compareLocationsByBegin<true>);
1611 return **it;
1612}
1613
1615{
1616 std::array<const SourceLocation *, 4> tokens {&m_propertyToken, &m_defaultToken, &m_readonlyToken, &m_requiredToken};
1617 const auto it = std::max_element(tokens.begin(), tokens.end(), compareLocationsByBegin<false>);
1618 return **it;
1619}
1620
1621} } // namespace QQmlJS::AST
1622
1624
1625
@ OmitGroupSeparator
Definition qlocale.h:879
@ OmitLeadingZeroInExponent
Definition qlocale.h:881
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
bool isValidArrayLiteral(SourceLocation *errorLocation=nullptr) const
PatternElementList * elements
bool convertLiteralToAssignmentPattern(MemoryPool *pool, SourceLocation *errorLocation, QString *errorMessage) override
void accept0(BaseVisitor *visitor) override
BinaryExpression * binaryExpressionCast() override
StatementList * statements
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
CaseClauses * moreClauses
DefaultClause * defaultClause
void accept0(BaseVisitor *visitor) override
ExpressionNode * expression
void accept0(BaseVisitor *visitor) override
StatementList * statements
void accept0(BaseVisitor *visitor) override
PatternElement * patternElement
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
ClassElementList * finish()
ClassExpression * asClassDefinition() override
void accept0(BaseVisitor *visitor) override
ClassElementList * elements
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
StatementList * body
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
AST::FormalParameterList * reparseAsFormalParameterList(MemoryPool *pool)
bool containsOptionalChain() const
Definition qqmljsast.cpp:90
ExpressionNode * expressionCast() override
Definition qqmljsast.cpp:85
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
ExpressionNode * expression
VariableDeclarationList * declarations
ExpressionNode * initialiser
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
FormalParameterList * finish(MemoryPool *pool)
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
FormalParameterList * formals
FunctionExpression * asFunctionDefinition() override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
ExpressionNode * expression
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
NamedImports * namedImports
NameSpaceImport * nameSpaceImport
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
LeftHandSideExpression * leftHandSideExpressionCast() override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
ClassExpression * asClassDefinition() override
void accept0(BaseVisitor *visitor) override
FunctionExpression * asFunctionDefinition() override
void accept0(BaseVisitor *visitor) override
ExpressionNode * expression
void accept0(BaseVisitor *visitor) override
virtual UiObjectMember * uiObjectMemberCast()
Definition qqmljsast.cpp:54
void accept(BaseVisitor *visitor)
virtual ClassExpression * asClassDefinition()
Definition qqmljsast.cpp:74
virtual Statement * statementCast()
Definition qqmljsast.cpp:49
virtual BinaryExpression * binaryExpressionCast()
Definition qqmljsast.cpp:44
virtual void accept0(BaseVisitor *visitor)=0
virtual ExpressionNode * expressionCast()
Definition qqmljsast.cpp:39
bool ignoreRecursionDepth() const
Definition qqmljsast.cpp:79
virtual FunctionExpression * asFunctionDefinition()
Definition qqmljsast.cpp:69
virtual Pattern * patternCast()
Definition qqmljsast.cpp:64
virtual LeftHandSideExpression * leftHandSideExpressionCast()
Definition qqmljsast.cpp:59
ExpressionNode * expression
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
QString asString() const override
void accept0(BaseVisitor *visitor) override
bool convertLiteralToAssignmentPattern(MemoryPool *pool, SourceLocation *errorLocation, QString *errorMessage) override
PatternPropertyList * properties
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void boundNames(BoundNames *names)
PatternPropertyList * propertyList() const
PatternElementList * elementList() const
void accept0(BaseVisitor *visitor) override
SourceLocation identifierToken
SourceLocation firstSourceLocation() const override
ExpressionNode * initializer
TypeAnnotation * typeAnnotation
virtual bool convertLiteralToAssignmentPattern(MemoryPool *pool, SourceLocation *errorLocation, QString *errorMessage)
virtual void boundNames(BoundNames *names)
ExpressionNode * bindingTarget
void boundNames(BoundNames *names)
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
bool convertLiteralToAssignmentPattern(MemoryPool *pool, SourceLocation *errorLocation, QString *errorMessage) override
void boundNames(BoundNames *names) override
SourceLocation firstSourceLocation() const override
Pattern * patternCast() override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
StatementList * statements
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
Statement * statementCast() override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
TemplateLiteral * templateLiteral
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
ExpressionNode * expression
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
QString toString() const
UiQualifiedId * typeArgument
UiQualifiedId * typeId
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
UiQualifiedId * qualifiedTypeNameId
UiObjectInitializer * initializer
void accept0(BaseVisitor *visitor) override
UiArrayMemberList * members
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
UiQualifiedId * importUri
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
UiObjectDefinition * component
UiQualifiedId * qualifiedTypeNameId
void accept0(BaseVisitor *visitor) override
UiObjectInitializer * initializer
UiObjectInitializer * initializer
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
UiObjectMember * uiObjectMemberCast() override
void accept0(BaseVisitor *) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
UiHeaderItemList * headers
void accept0(BaseVisitor *visitor) override
UiObjectMemberList * members
SourceLocation firstSourceLocation() const override
SourceLocation lastSourceLocation() const override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
VariableDeclarationList * declarations
void accept0(BaseVisitor *visitor) override
ExpressionNode * expression
void accept0(BaseVisitor *visitor) override
ExpressionNode * expression
void accept0(BaseVisitor *visitor) override
void accept0(BaseVisitor *visitor) override
ExpressionNode * expression
void accept0(BaseVisitor *visitor) override
QString toString() const
Returns a deep copy of this string view's data as a QString.
Definition qstring.h:1121
constexpr bool isNull() const noexcept
Returns whether this string view is null - that is, whether {data() == nullptr}.
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5871
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:8084
QSet< QString >::iterator it
FunctionExpression * asAnonymousFunctionDefinition(Node *n)
Definition qqmljsast.cpp:19
ClassExpression * asAnonymousClassDefinition(Node *n)
Definition qqmljsast.cpp:29
Combined button and popup list for selecting options.
GLboolean GLboolean GLboolean b
GLenum condition
GLdouble GLdouble right
GLfloat GLfloat f
GLint left
GLenum type
GLuint name
GLfloat n
GLdouble s
[6]
Definition qopenglext.h:235
const GLubyte * c
GLuint GLuint * names
GLuint64EXT * result
[6]
GLfloat GLfloat p
[1]
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &errorSource, qsizetype errorPosition)
Definition qurl.cpp:3517
QTextStream out(stdout)
[7]
\inmodule QtCore \reentrant
Definition qchar.h:18
int indexOf(const QString &name, int from=0) const