Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qqmldomreformatter.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 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
5#include "qqmldomcomments_p.h"
6
7#include <QtQml/private/qqmljsast_p.h>
8#include <QtQml/private/qqmljsastvisitor_p.h>
9#include <QtQml/private/qqmljsengine_p.h>
10#include <QtQml/private/qqmljslexer_p.h>
11
12#include <QString>
13
14#include <limits>
15
17namespace QQmlJS {
18namespace Dom {
19
20using namespace AST;
21
22class Rewriter : protected BaseVisitor
23{
24 OutWriter &lw;
25 std::shared_ptr<AstComments> comments;
26 std::function<QStringView(SourceLocation)> loc2Str;
27 QHash<Node *, QList<std::function<void()>>> postOps;
28 int expressionDepth = 0;
29
30 bool addSemicolons() const { return expressionDepth > 0; }
31
32public:
33 Rewriter(OutWriter &lw, std::shared_ptr<AstComments> comments,
34 std::function<QStringView(SourceLocation)> loc2Str, Node *node)
35 : lw(lw), comments(comments), loc2Str(loc2Str)
36 {
37 accept(node);
38 }
39
40protected:
41 bool preVisit(Node *n) override
42 {
43 if (CommentedElement *c = comments->commentForNode(n)) {
44 c->writePre(lw);
45 postOps[n].append([c, this]() { c->writePost(lw); });
46 }
47 return true;
48 }
49 void postVisit(Node *n) override
50 {
51 for (auto &op : postOps[n]) {
52 op();
53 }
54 postOps.remove(n);
55 }
56
57 void accept(Node *node) { Node::accept(node, this); }
58
60 {
61 int indent = lw.increaseIndent(1);
62 lw.ensureNewline();
63 accept(node);
64 lw.decreaseIndent(1, indent);
65 }
66
67 void out(const char *str) { lw.write(QString::fromLatin1(str)); }
68
69 void out(QStringView str) { lw.write(str); }
70
71 void out(const SourceLocation &loc)
72 {
73 if (loc.length != 0)
74 out(loc2Str(loc));
75 }
76
77 void newLine() { lw.ensureNewline(); }
78
79 bool acceptBlockOrIndented(Node *ast, bool finishWithSpaceOrNewline = false)
80 {
81 if (cast<Block *>(ast)) {
82 out(" ");
83 accept(ast);
84 if (finishWithSpaceOrNewline)
85 out(" ");
86 return true;
87 } else {
88 if (finishWithSpaceOrNewline)
89 postOps[ast].append([this]() { this->newLine(); });
91 return false;
92 }
93 }
94
95#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
96 // we are not supposed to handle the ui
97 bool visit(UiPragmaValueList *) override
98 {
99 Q_ASSERT(false);
100 return false;
101 }
102#endif
103 bool visit(UiPragma *) override
104 {
105 Q_ASSERT(false);
106 return false;
107 }
108 bool visit(UiEnumDeclaration *) override
109 {
110 Q_ASSERT(false);
111 return false;
112 }
113 bool visit(UiEnumMemberList *) override
114 {
115 Q_ASSERT(false);
116 return false;
117 }
118 bool visit(UiImport *) override
119 {
120 Q_ASSERT(false);
121 return false;
122 }
123 bool visit(UiObjectDefinition *) override
124 {
125 Q_ASSERT(false);
126 return false;
127 }
128 bool visit(UiObjectInitializer *) override
129 {
130 Q_ASSERT(false);
131 return false;
132 }
133 bool visit(UiParameterList *) override
134 {
135 Q_ASSERT(false);
136 return false;
137 }
138 bool visit(UiPublicMember *) override
139 {
140 Q_ASSERT(false);
141 return false;
142 }
143 bool visit(UiObjectBinding *) override
144 {
145 Q_ASSERT(false);
146 return false;
147 }
148 bool visit(UiScriptBinding *) override
149 {
150 Q_ASSERT(false);
151 return false;
152 }
153 bool visit(UiArrayBinding *) override
154 {
155 Q_ASSERT(false);
156 return false;
157 }
158 bool visit(UiHeaderItemList *) override
159 {
160 Q_ASSERT(false);
161 return false;
162 }
163 bool visit(UiObjectMemberList *) override
164 {
165 Q_ASSERT(false);
166 return false;
167 }
168 bool visit(UiArrayMemberList *) override
169 {
170 Q_ASSERT(false);
171 return false;
172 }
173 bool visit(UiQualifiedId *) override
174 {
175 Q_ASSERT(false);
176 return false;
177 }
178 bool visit(UiProgram *) override
179 {
180 Q_ASSERT(false);
181 return false;
182 }
183 bool visit(UiSourceElement *) override
184 {
185 Q_ASSERT(false);
186 return false;
187 }
188 bool visit(UiVersionSpecifier *) override
189 {
190 Q_ASSERT(false);
191 return false;
192 }
193 bool visit(UiInlineComponent *) override
194 {
195 Q_ASSERT(false);
196 return false;
197 }
198 bool visit(UiAnnotation *) override
199 {
200 Q_ASSERT(false);
201 return false;
202 }
203 bool visit(UiAnnotationList *) override
204 {
205 Q_ASSERT(false);
206 return false;
207 }
208 bool visit(UiRequired *) override
209 {
210 Q_ASSERT(false);
211 return false;
212 }
213
214 bool visit(ThisExpression *ast) override
215 {
216 out(ast->thisToken);
217 return true;
218 }
219 bool visit(NullExpression *ast) override
220 {
221 out(ast->nullToken);
222 return true;
223 }
224 bool visit(TrueLiteral *ast) override
225 {
226 out(ast->trueToken);
227 return true;
228 }
229 bool visit(FalseLiteral *ast) override
230 {
231 out(ast->falseToken);
232 return true;
233 }
234 bool visit(IdentifierExpression *ast) override
235 {
236 out(ast->identifierToken);
237 return true;
238 }
239 bool visit(StringLiteral *ast) override
240 {
241 // correctly handle multiline literals
242 if (ast->literalToken.length == 0)
243 return true;
244 QStringView str = loc2Str(ast->literalToken);
245 if (lw.indentNextlines && str.contains(QLatin1Char('\n'))) {
246 out(str.mid(0, 1));
247 lw.indentNextlines = false;
248 out(str.mid(1));
249 lw.indentNextlines = true;
250 } else {
251 out(str);
252 }
253 return true;
254 }
255 bool visit(NumericLiteral *ast) override
256 {
257 out(ast->literalToken);
258 return true;
259 }
260 bool visit(RegExpLiteral *ast) override
261 {
262 out(ast->literalToken);
263 return true;
264 }
265
266 bool visit(ArrayPattern *ast) override
267 {
268 out(ast->lbracketToken);
269 int baseIndent = lw.increaseIndent(1);
270 if (ast->elements)
271 accept(ast->elements);
272 out(ast->commaToken);
273 lw.decreaseIndent(1, baseIndent);
274 out(ast->rbracketToken);
275 return false;
276 }
277
278 bool visit(ObjectPattern *ast) override
279 {
280 out(ast->lbraceToken);
281 ++expressionDepth;
282 if (ast->properties) {
284 newLine();
285 }
286 --expressionDepth;
287 out(ast->rbraceToken);
288 return false;
289 }
290
291 bool visit(PatternElementList *ast) override
292 {
293 for (PatternElementList *it = ast; it; it = it->next) {
294 if (it->elision)
295 accept(it->elision);
296 if (it->elision && it->element)
297 out(", ");
298 if (it->element)
299 accept(it->element);
300 if (it->next)
301 out(", ");
302 }
303 return false;
304 }
305
306 bool visit(PatternPropertyList *ast) override
307 {
308 for (PatternPropertyList *it = ast; it; it = it->next) {
309 PatternProperty *assignment = AST::cast<PatternProperty *>(it->property);
310 if (assignment) {
311 preVisit(assignment);
312 bool isStringLike = AST::cast<StringLiteralPropertyName *>(assignment->name)
313 || cast<IdentifierPropertyName *>(assignment->name);
314 if (isStringLike)
315 out("\"");
316 accept(assignment->name);
317 if (isStringLike)
318 out("\"");
319 out(": "); // assignment->colonToken
320 if (it->next)
321 postOps[assignment->initializer].append([this] {
322 out(","); // always invalid?
323 });
324 accept(assignment->initializer);
325 if (it->next)
326 newLine();
327 postVisit(assignment);
328 continue;
329 }
330 PatternPropertyList *getterSetter = AST::cast<PatternPropertyList *>(it->next);
331 if (getterSetter->property) {
332 switch (getterSetter->property->type) {
334 out("get");
335 break;
337 out("set");
338 break;
339 default:
340 break;
341 }
342
343 accept(getterSetter->property->name);
344 out("(");
345 // accept(getterSetter->formals); // TODO
346 out(")");
347 out(" {");
348 // accept(getterSetter->functionBody); // TODO
349 out(" }");
350 }
351 }
352 return false;
353 }
354
355 bool visit(NestedExpression *ast) override
356 {
357 out(ast->lparenToken);
358 int baseIndent = lw.increaseIndent(1);
359 accept(ast->expression);
360 lw.decreaseIndent(1, baseIndent);
361 out(ast->rparenToken);
362 return false;
363 }
364
365 bool visit(IdentifierPropertyName *ast) override
366 {
367 out(ast->id.toString());
368 return true;
369 }
371 {
372 out(ast->id.toString());
373 return true;
374 }
376 {
377 out(QString::number(ast->id));
378 return true;
379 }
380
381 bool visit(TemplateLiteral *ast) override
382 {
383 // correctly handle multiline literals
384 if (ast->literalToken.length != 0) {
385 QStringView str = loc2Str(ast->literalToken);
386 if (lw.indentNextlines && str.contains(QLatin1Char('\n'))) {
387 out(str.mid(0, 1));
388 lw.indentNextlines = false;
389 out(str.mid(1));
390 lw.indentNextlines = true;
391 } else {
392 out(str);
393 }
394 }
395 accept(ast->expression);
396 return true;
397 }
398
399 bool visit(ArrayMemberExpression *ast) override
400 {
401 accept(ast->base);
402 out(ast->lbracketToken);
403 int indent = lw.increaseIndent(1);
404 accept(ast->expression);
405 lw.decreaseIndent(1, indent);
406 out(ast->rbracketToken);
407 return false;
408 }
409
410 bool visit(FieldMemberExpression *ast) override
411 {
412 accept(ast->base);
413 out(ast->dotToken);
414 out(ast->identifierToken);
415 return false;
416 }
417
418 bool visit(NewMemberExpression *ast) override
419 {
420 out("new "); // ast->newToken
421 accept(ast->base);
422 out(ast->lparenToken);
423 accept(ast->arguments);
424 out(ast->rparenToken);
425 return false;
426 }
427
428 bool visit(NewExpression *ast) override
429 {
430 out("new "); // ast->newToken
431 accept(ast->expression);
432 return false;
433 }
434
435 bool visit(CallExpression *ast) override
436 {
437 accept(ast->base);
438 out(ast->lparenToken);
439 int baseIndent = lw.increaseIndent(1);
440 accept(ast->arguments);
441 lw.decreaseIndent(1, baseIndent);
442 out(ast->rparenToken);
443 return false;
444 }
445
446 bool visit(PostIncrementExpression *ast) override
447 {
448 accept(ast->base);
449 out(ast->incrementToken);
450 return false;
451 }
452
453 bool visit(PostDecrementExpression *ast) override
454 {
455 accept(ast->base);
456 out(ast->decrementToken);
457 return false;
458 }
459
460 bool visit(PreIncrementExpression *ast) override
461 {
462 out(ast->incrementToken);
463 accept(ast->expression);
464 return false;
465 }
466
467 bool visit(PreDecrementExpression *ast) override
468 {
469 out(ast->decrementToken);
470 accept(ast->expression);
471 return false;
472 }
473
474 bool visit(DeleteExpression *ast) override
475 {
476 out("delete "); // ast->deleteToken
477 accept(ast->expression);
478 return false;
479 }
480
481 bool visit(VoidExpression *ast) override
482 {
483 out("void "); // ast->voidToken
484 accept(ast->expression);
485 return false;
486 }
487
488 bool visit(TypeOfExpression *ast) override
489 {
490 out("typeof "); // ast->typeofToken
491 accept(ast->expression);
492 return false;
493 }
494
495 bool visit(UnaryPlusExpression *ast) override
496 {
497 out(ast->plusToken);
498 accept(ast->expression);
499 return false;
500 }
501
502 bool visit(UnaryMinusExpression *ast) override
503 {
504 out(ast->minusToken);
505 accept(ast->expression);
506 return false;
507 }
508
509 bool visit(TildeExpression *ast) override
510 {
511 out(ast->tildeToken);
512 accept(ast->expression);
513 return false;
514 }
515
516 bool visit(NotExpression *ast) override
517 {
518 out(ast->notToken);
519 accept(ast->expression);
520 return false;
521 }
522
523 bool visit(BinaryExpression *ast) override
524 {
525 accept(ast->left);
526 out(" ");
527 out(ast->operatorToken);
528 out(" ");
529 accept(ast->right);
530 return false;
531 }
532
533 bool visit(ConditionalExpression *ast) override
534 {
535 accept(ast->expression);
536 out(" ? "); // ast->questionToken
537 accept(ast->ok);
538 out(" : "); // ast->colonToken
539 accept(ast->ko);
540 return false;
541 }
542
543 bool visit(Block *ast) override
544 {
545 out(ast->lbraceToken);
546 ++expressionDepth;
548 newLine();
549 --expressionDepth;
550 out(ast->rbraceToken);
551 return false;
552 }
553
554 bool visit(VariableStatement *ast) override
555 {
557 out(" ");
558 accept(ast->declarations);
559 if (addSemicolons())
560 out(";");
561 return false;
562 }
563
564
566 switch (scope) {
567 case VariableScope::Const:
568 out("const ");
569 break;
570 case VariableScope::Let:
571 out("let ");
572 break;
573 case VariableScope::Var:
574 out("var ");
575 break;
576 default:
577 break;
578 }
579 }
580
581 bool visit(PatternElement *ast) override
582 {
583 if (ast->isForDeclaration) {
584 outputScope(ast->scope);
585 }
586 accept(ast->bindingTarget);
587 switch (ast->type) {
591 break;
593 out("get ");
594 break;
596 out("set ");
597 break;
599 out("...");
600 break;
601 }
602 out(ast->identifierToken);
603 if (ast->initializer) {
604 if (ast->isVariableDeclaration())
605 out(" = ");
606 accept(ast->initializer);
607 }
608 return false;
609 }
610
611 bool visit(EmptyStatement *ast) override
612 {
613 out(ast->semicolonToken);
614 return false;
615 }
616
617 bool visit(IfStatement *ast) override
618 {
619 out(ast->ifToken);
620 out(" ");
621 out(ast->lparenToken);
622 preVisit(ast->expression);
623 ast->expression->accept0(this);
624 out(ast->rparenToken);
625 postVisit(ast->expression);
626 acceptBlockOrIndented(ast->ok, ast->ko);
627 if (ast->ko) {
628 out(ast->elseToken);
629 if (cast<Block *>(ast->ko) || cast<IfStatement *>(ast->ko)) {
630 out(" ");
631 accept(ast->ko);
632 } else {
633 lnAcceptIndented(ast->ko);
634 }
635 }
636 return false;
637 }
638
639 bool visit(DoWhileStatement *ast) override
640 {
641 out(ast->doToken);
643 out(ast->whileToken);
644 out(" ");
645 out(ast->lparenToken);
646 accept(ast->expression);
647 out(ast->rparenToken);
648 return false;
649 }
650
651 bool visit(WhileStatement *ast) override
652 {
653 out(ast->whileToken);
654 out(" ");
655 out(ast->lparenToken);
656 accept(ast->expression);
657 out(ast->rparenToken);
659 return false;
660 }
661
662 bool visit(ForStatement *ast) override
663 {
664 out(ast->forToken);
665 out(" ");
666 out(ast->lparenToken);
667 if (ast->initialiser) {
668 accept(ast->initialiser);
669 } else if (ast->declarations) {
671 accept(ast->declarations);
672 }
673 out("; "); // ast->firstSemicolonToken
674 accept(ast->condition);
675 out("; "); // ast->secondSemicolonToken
676 accept(ast->expression);
677 out(ast->rparenToken);
679 return false;
680 }
681
682 bool visit(ForEachStatement *ast) override
683 {
684 out(ast->forToken);
685 out(" ");
686 out(ast->lparenToken);
687 accept(ast->lhs);
688 out(" ");
689 out(ast->inOfToken);
690 out(" ");
691 accept(ast->expression);
692 out(ast->rparenToken);
694 return false;
695 }
696
697 bool visit(ContinueStatement *ast) override
698 {
699 out(ast->continueToken);
700 if (!ast->label.isNull()) {
701 out(" ");
702 out(ast->identifierToken);
703 }
704 if (addSemicolons())
705 out(";");
706 return false;
707 }
708
709 bool visit(BreakStatement *ast) override
710 {
711 out(ast->breakToken);
712 if (!ast->label.isNull()) {
713 out(" ");
714 out(ast->identifierToken);
715 }
716 if (addSemicolons())
717 out(";");
718 return false;
719 }
720
721 bool visit(ReturnStatement *ast) override
722 {
723 out(ast->returnToken);
724 if (ast->expression) {
725 if (ast->returnToken.length != 0)
726 out(" ");
727 accept(ast->expression);
728 }
729 if (ast->returnToken.length > 0 && addSemicolons())
730 out(";");
731 return false;
732 }
733
734 bool visit(ThrowStatement *ast) override
735 {
736 out(ast->throwToken);
737 if (ast->expression) {
738 out(" ");
739 accept(ast->expression);
740 }
741 if (addSemicolons())
742 out(";");
743 return false;
744 }
745
746 bool visit(WithStatement *ast) override
747 {
748 out(ast->withToken);
749 out(" ");
750 out(ast->lparenToken);
751 accept(ast->expression);
752 out(ast->rparenToken);
754 return false;
755 }
756
757 bool visit(SwitchStatement *ast) override
758 {
759 out(ast->switchToken);
760 out(" ");
761 out(ast->lparenToken);
762 accept(ast->expression);
763 out(ast->rparenToken);
764 out(" ");
765 accept(ast->block);
766 return false;
767 }
768
769 bool visit(CaseBlock *ast) override
770 {
771 out(ast->lbraceToken);
772 ++expressionDepth;
773 newLine();
774 accept(ast->clauses);
775 if (ast->clauses && ast->defaultClause)
776 newLine();
777 accept(ast->defaultClause);
778 if (ast->moreClauses)
779 newLine();
780 accept(ast->moreClauses);
781 newLine();
782 --expressionDepth;
783 out(ast->rbraceToken);
784 return false;
785 }
786
787 bool visit(CaseClause *ast) override
788 {
789 out("case "); // ast->caseToken
790 accept(ast->expression);
791 out(ast->colonToken);
792 if (ast->statements)
794 return false;
795 }
796
797 bool visit(DefaultClause *ast) override
798 {
799 out(ast->defaultToken);
800 out(ast->colonToken);
802 return false;
803 }
804
805 bool visit(LabelledStatement *ast) override
806 {
807 out(ast->identifierToken);
808 out(": "); // ast->colonToken
809 accept(ast->statement);
810 return false;
811 }
812
813 bool visit(TryStatement *ast) override
814 {
815 out("try "); // ast->tryToken
816 accept(ast->statement);
817 if (ast->catchExpression) {
818 out(" ");
820 }
821 if (ast->finallyExpression) {
822 out(" ");
824 }
825 return false;
826 }
827
828 bool visit(Catch *ast) override
829 {
830 out(ast->catchToken);
831 out(" ");
832 out(ast->lparenToken);
833 out(ast->identifierToken);
834 out(") "); // ast->rparenToken
835 accept(ast->statement);
836 return false;
837 }
838
839 bool visit(Finally *ast) override
840 {
841 out("finally "); // ast->finallyToken
842 accept(ast->statement);
843 return false;
844 }
845
846 bool visit(FunctionDeclaration *ast) override
847 {
848 return visit(static_cast<FunctionExpression *>(ast));
849 }
850
851 bool visit(FunctionExpression *ast) override
852 {
853 if (!ast->isArrowFunction) {
854 out("function "); // ast->functionToken
855 if (!ast->name.isNull())
856 out(ast->identifierToken);
857 }
858 out(ast->lparenToken);
859 const bool needParentheses = ast->formals &&
860 (ast->formals->next ||
861 (ast->formals->element && ast->formals->element->bindingTarget));
862 if (ast->isArrowFunction && needParentheses)
863 out("(");
864 int baseIndent = lw.increaseIndent(1);
865 accept(ast->formals);
866 lw.decreaseIndent(1, baseIndent);
867 if (ast->isArrowFunction && needParentheses)
868 out(")");
869 out(ast->rparenToken);
870 if (ast->isArrowFunction && !ast->formals)
871 out("()");
872 out(" ");
873 if (ast->isArrowFunction)
874 out("=> ");
875 out(ast->lbraceToken);
876 if (ast->lbraceToken.length != 0)
877 ++expressionDepth;
878 if (ast->body) {
879 if (ast->body->next || ast->lbraceToken.length != 0) {
881 newLine();
882 } else {
883 // print a single statement in one line. E.g. x => x * 2
884 baseIndent = lw.increaseIndent(1);
885 accept(ast->body);
886 lw.decreaseIndent(1, baseIndent);
887 }
888 }
889 if (ast->lbraceToken.length != 0)
890 --expressionDepth;
891 out(ast->rbraceToken);
892 return false;
893 }
894
895 bool visit(Elision *ast) override
896 {
897 for (Elision *it = ast; it; it = it->next) {
898 if (it->next)
899 out(", "); // ast->commaToken
900 }
901 return false;
902 }
903
904 bool visit(ArgumentList *ast) override
905 {
906 for (ArgumentList *it = ast; it; it = it->next) {
907 if (it->isSpreadElement)
908 out("...");
909 accept(it->expression);
910 if (it->next) {
911 out(", "); // it->commaToken
912 }
913 }
914 return false;
915 }
916
917 bool visit(StatementList *ast) override
918 {
919 ++expressionDepth;
920 for (StatementList *it = ast; it; it = it->next) {
921 // ### work around parser bug: skip empty statements with wrong tokens
922 if (EmptyStatement *emptyStatement = cast<EmptyStatement *>(it->statement)) {
923 if (loc2Str(emptyStatement->semicolonToken) != QLatin1String(";"))
924 continue;
925 }
926
927 accept(it->statement);
928 if (it->next)
929 newLine();
930 }
931 --expressionDepth;
932 return false;
933 }
934
935 bool visit(VariableDeclarationList *ast) override
936 {
937 for (VariableDeclarationList *it = ast; it; it = it->next) {
938 accept(it->declaration);
939 if (it->next)
940 out(", "); // it->commaToken
941 }
942 return false;
943 }
944
945 bool visit(CaseClauses *ast) override
946 {
947 for (CaseClauses *it = ast; it; it = it->next) {
948 accept(it->clause);
949 if (it->next)
950 newLine();
951 }
952 return false;
953 }
954
955 bool visit(FormalParameterList *ast) override
956 {
957 for (FormalParameterList *it = ast; it; it = it->next) {
958 // compare FormalParameterList::finish
959 if (auto id = it->element->bindingIdentifier.toString(); !id.startsWith(u"arg#"))
960 out(id);
961 if (it->element->bindingTarget)
962 accept(it->element->bindingTarget);
963 if (it->next)
964 out(", ");
965 }
966 return false;
967 }
968
969 // to check
970 bool visit(TypeExpression *) override { return true; }
971 bool visit(SuperLiteral *) override
972 {
973 out("super");
974 return true;
975 }
976 bool visit(PatternProperty *) override { return true; }
978 {
979 out("[");
980 return true;
981 }
982 bool visit(TaggedTemplate *) override { return true; }
983 bool visit(Expression *el) override
984 {
985 accept(el->left);
986 out(", ");
987 accept(el->right);
988 return false;
989 }
991 {
992 if (addSemicolons())
993 postOps[el->expression].append([this]() { out(";"); });
994 return true;
995 }
996 bool visit(YieldExpression *) override { return true; }
997 bool visit(ClassExpression *) override { return true; }
998
999 // Return false because we want to omit default function calls in accept0 implementation.
1000 bool visit(ClassDeclaration *ast) override
1001 {
1002 preVisit(ast);
1003 out(ast->classToken);
1004 out(" ");
1005 out(ast->name);
1006 if (ast->heritage) {
1007 out(" extends ");
1008 accept(ast->heritage);
1009 }
1010 out(" {");
1011 int baseIndent = lw.increaseIndent();
1012 for (ClassElementList *it = ast->elements; it; it = it->next) {
1013 PatternProperty *property = it->property;
1014 lw.newline();
1016 if (it->isStatic)
1017 out("static ");
1018 if (property->type == PatternProperty::Getter)
1019 out("get ");
1020 else if (property->type == PatternProperty::Setter)
1021 out("set ");
1022 FunctionExpression *f = AST::cast<FunctionExpression *>(property->initializer);
1023 const bool scoped = f->lbraceToken.length != 0;
1024 out(f->functionToken);
1025 out(f->lparenToken);
1026 accept(f->formals);
1027 out(f->rparenToken);
1028 out(f->lbraceToken);
1029 if (scoped)
1030 ++expressionDepth;
1031 if (f->body) {
1032 if (f->body->next || scoped) {
1033 lnAcceptIndented(f->body);
1034 lw.newline();
1035 } else {
1036 baseIndent = lw.increaseIndent(1);
1037 accept(f->body);
1038 lw.decreaseIndent(1, baseIndent);
1039 }
1040 }
1041 if (scoped)
1042 --expressionDepth;
1043 out(f->rbraceToken);
1044 lw.newline();
1046 }
1047 lw.decreaseIndent(1, baseIndent);
1048 out("}");
1049 postVisit(ast);
1050 return false;
1051 }
1052
1053 bool visit(ClassElementList *) override { return true; }
1054 bool visit(Program *) override { return true; }
1055 bool visit(NameSpaceImport *) override { return true; }
1056 bool visit(ImportSpecifier *) override { return true; }
1057 bool visit(ImportsList *) override { return true; }
1058 bool visit(NamedImports *) override { return true; }
1059 bool visit(FromClause *) override { return true; }
1060 bool visit(ImportClause *) override { return true; }
1061 bool visit(ImportDeclaration *) override { return true; }
1062 bool visit(ExportSpecifier *) override { return true; }
1063 bool visit(ExportsList *) override { return true; }
1064 bool visit(ExportClause *) override { return true; }
1065 bool visit(ExportDeclaration *) override { return true; }
1066 bool visit(ESModule *) override { return true; }
1067 bool visit(DebuggerStatement *) override { return true; }
1068 bool visit(Type *) override { return true; }
1069 bool visit(TypeAnnotation *) override { return true; }
1070
1071 // overridden to use BasicVisitor (and ensure warnings about new added AST)
1072 void endVisit(UiProgram *) override { }
1073 void endVisit(UiImport *) override { }
1074 void endVisit(UiHeaderItemList *) override { }
1075#if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0)
1076 void endVisit(UiPragmaValueList *) override { }
1077#endif
1078 void endVisit(UiPragma *) override { }
1079 void endVisit(UiPublicMember *) override { }
1080 void endVisit(UiSourceElement *) override { }
1081 void endVisit(UiObjectDefinition *) override { }
1082 void endVisit(UiObjectInitializer *) override { }
1083 void endVisit(UiObjectBinding *) override { }
1084 void endVisit(UiScriptBinding *) override { }
1085 void endVisit(UiArrayBinding *) override { }
1086 void endVisit(UiParameterList *) override { }
1087 void endVisit(UiObjectMemberList *) override { }
1088 void endVisit(UiArrayMemberList *) override { }
1089 void endVisit(UiQualifiedId *) override { }
1090 void endVisit(UiEnumDeclaration *) override { }
1091 void endVisit(UiEnumMemberList *) override { }
1092 void endVisit(UiVersionSpecifier *) override { }
1093 void endVisit(UiInlineComponent *) override { }
1094 void endVisit(UiAnnotation *) override { }
1095 void endVisit(UiAnnotationList *) override { }
1096 void endVisit(UiRequired *) override { }
1097 void endVisit(TypeExpression *) override { }
1098 void endVisit(ThisExpression *) override { }
1099 void endVisit(IdentifierExpression *) override { }
1100 void endVisit(NullExpression *) override { }
1101 void endVisit(TrueLiteral *) override { }
1102 void endVisit(FalseLiteral *) override { }
1103 void endVisit(SuperLiteral *) override { }
1104 void endVisit(StringLiteral *) override { }
1105 void endVisit(TemplateLiteral *) override { }
1106 void endVisit(NumericLiteral *) override { }
1107 void endVisit(RegExpLiteral *) override { }
1108 void endVisit(ArrayPattern *) override { }
1109 void endVisit(ObjectPattern *) override { }
1110 void endVisit(PatternElementList *) override { }
1111 void endVisit(PatternPropertyList *) override { }
1112 void endVisit(PatternElement *) override { }
1113 void endVisit(PatternProperty *) override { }
1114 void endVisit(Elision *) override { }
1115 void endVisit(NestedExpression *) override { }
1119 void endVisit(ComputedPropertyName *) override { out("]"); }
1120 void endVisit(ArrayMemberExpression *) override { }
1121 void endVisit(FieldMemberExpression *) override { }
1122 void endVisit(TaggedTemplate *) override { }
1123 void endVisit(NewMemberExpression *) override { }
1124 void endVisit(NewExpression *) override { }
1125 void endVisit(CallExpression *) override { }
1126 void endVisit(ArgumentList *) override { }
1129 void endVisit(DeleteExpression *) override { }
1130 void endVisit(VoidExpression *) override { }
1131 void endVisit(TypeOfExpression *) override { }
1134 void endVisit(UnaryPlusExpression *) override { }
1135 void endVisit(UnaryMinusExpression *) override { }
1136 void endVisit(TildeExpression *) override { }
1137 void endVisit(NotExpression *) override { }
1138 void endVisit(BinaryExpression *) override { }
1139 void endVisit(ConditionalExpression *) override { }
1140 void endVisit(Expression *) override { }
1141 void endVisit(Block *) override { }
1142 void endVisit(StatementList *) override { }
1143 void endVisit(VariableStatement *) override { }
1145 void endVisit(EmptyStatement *) override { }
1146 void endVisit(ExpressionStatement *) override { }
1147 void endVisit(IfStatement *) override { }
1148 void endVisit(DoWhileStatement *) override { }
1149 void endVisit(WhileStatement *) override { }
1150 void endVisit(ForStatement *) override { }
1151 void endVisit(ForEachStatement *) override { }
1152 void endVisit(ContinueStatement *) override { }
1153 void endVisit(BreakStatement *) override { }
1154 void endVisit(ReturnStatement *) override { }
1155 void endVisit(YieldExpression *) override { }
1156 void endVisit(WithStatement *) override { }
1157 void endVisit(SwitchStatement *) override { }
1158 void endVisit(CaseBlock *) override { }
1159 void endVisit(CaseClauses *) override { }
1160 void endVisit(CaseClause *) override { }
1161 void endVisit(DefaultClause *) override { }
1162 void endVisit(LabelledStatement *) override { }
1163 void endVisit(ThrowStatement *) override { }
1164 void endVisit(TryStatement *) override { }
1165 void endVisit(Catch *) override { }
1166 void endVisit(Finally *) override { }
1167 void endVisit(FunctionDeclaration *) override { }
1168 void endVisit(FunctionExpression *) override { }
1169 void endVisit(FormalParameterList *) override { }
1170 void endVisit(ClassExpression *) override { }
1171 void endVisit(ClassDeclaration *) override { }
1172 void endVisit(ClassElementList *) override { }
1173 void endVisit(Program *) override { }
1174 void endVisit(NameSpaceImport *) override { }
1175 void endVisit(ImportSpecifier *) override { }
1176 void endVisit(ImportsList *) override { }
1177 void endVisit(NamedImports *) override { }
1178 void endVisit(FromClause *) override { }
1179 void endVisit(ImportClause *) override { }
1180 void endVisit(ImportDeclaration *) override { }
1181 void endVisit(ExportSpecifier *) override { }
1182 void endVisit(ExportsList *) override { }
1183 void endVisit(ExportClause *) override { }
1184 void endVisit(ExportDeclaration *) override { }
1185 void endVisit(ESModule *) override { }
1186 void endVisit(DebuggerStatement *) override { }
1187 void endVisit(Type *) override { }
1188 void endVisit(TypeAnnotation *) override { }
1189
1191 {
1192 out("/* ERROR: Hit recursion limit visiting AST, rewrite failed */");
1193 }
1194};
1195
1196void reformatAst(OutWriter &lw, std::shared_ptr<AstComments> comments,
1197 const std::function<QStringView(SourceLocation)> loc2Str, AST::Node *n)
1198{
1199 if (n) {
1200 Rewriter rewriter(lw, comments, loc2Str, n);
1201 }
1202}
1203
1204} // namespace Dom
1205} // namespace QQmlJS
\inmodule QtCore
Definition qhash.h:818
Definition qlist.h:74
SourceLocation rbracketToken
PatternElementList * elements
SourceLocation lbracketToken
SourceLocation commaToken
StatementList * statements
SourceLocation rbraceToken
SourceLocation lbraceToken
CaseClauses * moreClauses
SourceLocation lbraceToken
SourceLocation rbraceToken
DefaultClause * defaultClause
ExpressionNode * expression
SourceLocation colonToken
StatementList * statements
SourceLocation identifierToken
SourceLocation lparenToken
SourceLocation catchToken
ClassElementList * elements
SourceLocation falseToken
ExpressionNode * expression
VariableDeclarationList * declarations
ExpressionNode * initialiser
ExpressionNode * condition
FormalParameterList * formals
SourceLocation rparenToken
SourceLocation lparenToken
ExpressionNode * expression
ExpressionNode * expression
void accept(BaseVisitor *visitor)
virtual void accept0(BaseVisitor *visitor)=0
ExpressionNode * expression
PatternPropertyList * properties
SourceLocation identifierToken
ExpressionNode * initializer
ExpressionNode * bindingTarget
bool isVariableDeclaration() const
SourceLocation literalToken
SourceLocation literalToken
ExpressionNode * expression
ExpressionNode * expression
SourceLocation trueToken
VariableDeclarationList * declarations
ExpressionNode * expression
ExpressionNode * expression
ExpressionNode * expression
Keeps the comment associated with an element.
OutWriter & ensureNewline(int nNewlines=1)
int increaseIndent(int level=1)
int decreaseIndent(int level=1, int expectedIndent=-1)
OutWriter & write(QStringView v, LineWriter::TextAddType t=LineWriter::TextAddType::Normal)
bool visit(NumericLiteral *ast) override
void endVisit(WithStatement *) override
void endVisit(PatternElement *) override
void endVisit(DefaultClause *) override
bool visit(CaseBlock *ast) override
void endVisit(ImportsList *) override
void endVisit(Finally *) override
bool visit(PreDecrementExpression *ast) override
void endVisit(NameSpaceImport *) override
void endVisit(FieldMemberExpression *) override
bool visit(FormalParameterList *ast) override
void endVisit(Elision *) override
bool visit(UiArrayMemberList *) override
bool visit(ExpressionStatement *el) override
void endVisit(UiEnumMemberList *) override
bool visit(VoidExpression *ast) override
void endVisit(ThrowStatement *) override
bool visit(ExportClause *) override
bool visit(NotExpression *ast) override
void endVisit(ThisExpression *) override
void endVisit(PatternProperty *) override
bool visit(ThrowStatement *ast) override
bool visit(UiObjectBinding *) override
bool visit(ForEachStatement *ast) override
void endVisit(ForEachStatement *) override
bool visit(ExportDeclaration *) override
bool visit(FromClause *) override
void endVisit(PreIncrementExpression *) override
bool visit(ComputedPropertyName *) override
bool visit(Catch *ast) override
void endVisit(Type *) override
void endVisit(ImportSpecifier *) override
void endVisit(StringLiteralPropertyName *) override
void endVisit(IdentifierPropertyName *) override
void endVisit(WhileStatement *) override
bool visit(NewExpression *ast) override
bool visit(RegExpLiteral *ast) override
void endVisit(UiParameterList *) override
bool visit(WhileStatement *ast) override
void endVisit(DebuggerStatement *) override
void endVisit(ContinueStatement *) override
void endVisit(VariableDeclarationList *) override
bool visit(UiObjectMemberList *) override
void endVisit(ExportsList *) override
bool visit(UiVersionSpecifier *) override
void endVisit(DeleteExpression *) override
bool visit(LabelledStatement *ast) override
void out(const SourceLocation &loc)
bool visit(UiRequired *) override
bool visit(DebuggerStatement *) override
bool visit(WithStatement *ast) override
bool visit(NullExpression *ast) override
bool visit(UiParameterList *) override
bool visit(ContinueStatement *ast) override
void out(QStringView str)
void endVisit(UiAnnotation *) override
bool visit(PatternPropertyList *ast) override
void lnAcceptIndented(Node *node)
void endVisit(ExportClause *) override
bool acceptBlockOrIndented(Node *ast, bool finishWithSpaceOrNewline=false)
void endVisit(NumericLiteralPropertyName *) override
bool visit(NewMemberExpression *ast) override
void endVisit(TypeOfExpression *) override
void endVisit(IdentifierExpression *) override
bool visit(ClassDeclaration *ast) override
void endVisit(UnaryMinusExpression *) override
bool visit(UiPragmaValueList *) override
void postVisit(Node *n) override
void endVisit(NullExpression *) override
bool visit(CaseClause *ast) override
void endVisit(PatternPropertyList *) override
void endVisit(FormalParameterList *) override
bool visit(ForStatement *ast) override
bool visit(UiQualifiedId *) override
bool visit(DefaultClause *ast) override
void endVisit(ClassExpression *) override
bool visit(UiObjectDefinition *) override
void endVisit(UiProgram *) override
void endVisit(BinaryExpression *) override
void endVisit(TaggedTemplate *) override
void endVisit(EmptyStatement *) override
bool visit(StringLiteralPropertyName *ast) override
void endVisit(UnaryPlusExpression *) override
void endVisit(ESModule *) override
bool visit(EmptyStatement *ast) override
bool visit(ReturnStatement *ast) override
bool visit(ExportSpecifier *) override
bool visit(UiImport *) override
bool visit(PostIncrementExpression *ast) override
void endVisit(UiPublicMember *) override
bool visit(UiAnnotationList *) override
void endVisit(LabelledStatement *) override
void endVisit(SuperLiteral *) override
bool visit(UnaryMinusExpression *ast) override
bool visit(UiAnnotation *) override
bool visit(NestedExpression *ast) override
bool visit(NameSpaceImport *) override
bool visit(FieldMemberExpression *ast) override
void endVisit(ExpressionStatement *) override
bool visit(CaseClauses *ast) override
bool visit(IfStatement *ast) override
bool visit(PatternProperty *) override
void endVisit(CaseBlock *) override
void endVisit(DoWhileStatement *) override
bool visit(IdentifierExpression *ast) override
void endVisit(Block *) override
bool visit(YieldExpression *) override
bool visit(ImportDeclaration *) override
void endVisit(ArrayMemberExpression *) override
bool visit(UiArrayBinding *) override
void out(const char *str)
Rewriter(OutWriter &lw, std::shared_ptr< AstComments > comments, std::function< QStringView(SourceLocation)> loc2Str, Node *node)
void endVisit(UiEnumDeclaration *) override
void endVisit(UiObjectBinding *) override
bool visit(TaggedTemplate *) override
void endVisit(PreDecrementExpression *) override
void endVisit(CallExpression *) override
bool visit(ImportsList *) override
void endVisit(RegExpLiteral *) override
bool visit(ArrayPattern *ast) override
void endVisit(TypeAnnotation *) override
bool visit(DoWhileStatement *ast) override
bool visit(UiPublicMember *) override
bool visit(ClassExpression *) override
bool visit(StatementList *ast) override
void endVisit(UiRequired *) override
void endVisit(UiArrayMemberList *) override
void endVisit(PostDecrementExpression *) override
void endVisit(UiImport *) override
bool visit(SwitchStatement *ast) override
bool visit(FunctionExpression *ast) override
void endVisit(NotExpression *) override
bool visit(BreakStatement *ast) override
void outputScope(VariableScope scope)
bool visit(ESModule *) override
bool visit(ExportsList *) override
bool visit(UiInlineComponent *) override
void endVisit(Program *) override
void endVisit(YieldExpression *) override
void endVisit(UiObjectMemberList *) override
bool visit(NumericLiteralPropertyName *ast) override
bool visit(BinaryExpression *ast) override
void endVisit(UiAnnotationList *) override
void endVisit(TrueLiteral *) override
bool visit(VariableStatement *ast) override
void endVisit(NewMemberExpression *) override
void endVisit(Expression *) override
bool visit(Finally *ast) override
void endVisit(CaseClause *) override
void endVisit(UiPragmaValueList *) override
bool visit(TildeExpression *ast) override
bool visit(PatternElementList *ast) override
bool visit(ConditionalExpression *ast) override
bool visit(TypeExpression *) override
void endVisit(UiVersionSpecifier *) override
void endVisit(PostIncrementExpression *) override
void endVisit(UiHeaderItemList *) override
bool visit(TypeOfExpression *ast) override
bool visit(ArrayMemberExpression *ast) override
void endVisit(PatternElementList *) override
bool visit(UiHeaderItemList *) override
bool visit(ArgumentList *ast) override
bool visit(FunctionDeclaration *ast) override
void endVisit(ExportDeclaration *) override
void endVisit(ConditionalExpression *) override
void endVisit(UiSourceElement *) override
bool visit(PostDecrementExpression *ast) override
void endVisit(ForStatement *) override
void endVisit(FunctionDeclaration *) override
bool visit(Block *ast) override
void endVisit(StatementList *) override
bool visit(ClassElementList *) override
void endVisit(ExportSpecifier *) override
bool visit(PreIncrementExpression *ast) override
bool visit(FalseLiteral *ast) override
void endVisit(TryStatement *) override
void endVisit(BreakStatement *) override
bool visit(UiScriptBinding *) override
void endVisit(VoidExpression *) override
void endVisit(ClassDeclaration *) override
bool visit(NamedImports *) override
bool visit(ObjectPattern *ast) override
void endVisit(TemplateLiteral *) override
void endVisit(NewExpression *) override
bool visit(TrueLiteral *ast) override
void endVisit(CaseClauses *) override
void endVisit(UiScriptBinding *) override
bool visit(ImportSpecifier *) override
void endVisit(ImportDeclaration *) override
bool visit(ImportClause *) override
bool visit(Expression *el) override
bool visit(UnaryPlusExpression *ast) override
bool visit(PatternElement *ast) override
void endVisit(ComputedPropertyName *) override
bool visit(StringLiteral *ast) override
bool visit(DeleteExpression *ast) override
bool preVisit(Node *n) override
bool visit(Type *) override
bool visit(TryStatement *ast) override
bool visit(UiEnumMemberList *) override
void endVisit(FromClause *) override
bool visit(Program *) override
bool visit(UiSourceElement *) override
void endVisit(TypeExpression *) override
bool visit(TypeAnnotation *) override
void endVisit(ClassElementList *) override
bool visit(SuperLiteral *) override
bool visit(UiObjectInitializer *) override
void endVisit(TildeExpression *) override
bool visit(VariableDeclarationList *ast) override
void endVisit(StringLiteral *) override
void endVisit(Catch *) override
void endVisit(UiArrayBinding *) override
void endVisit(FalseLiteral *) override
void throwRecursionDepthError() override
void endVisit(VariableStatement *) override
bool visit(CallExpression *ast) override
void endVisit(UiPragma *) override
void endVisit(UiInlineComponent *) override
bool visit(UiProgram *) override
void endVisit(SwitchStatement *) override
void endVisit(ReturnStatement *) override
void endVisit(UiObjectInitializer *) override
bool visit(IdentifierPropertyName *ast) override
void endVisit(ObjectPattern *) override
void endVisit(UiQualifiedId *) override
void endVisit(IfStatement *) override
void endVisit(NamedImports *) override
void endVisit(NestedExpression *) override
void endVisit(ArrayPattern *) override
bool visit(UiPragma *) override
bool visit(ThisExpression *ast) override
bool visit(UiEnumDeclaration *) override
void endVisit(ImportClause *) override
bool visit(TemplateLiteral *ast) override
bool visit(Elision *ast) override
void endVisit(NumericLiteral *) override
void endVisit(UiObjectDefinition *) override
void endVisit(FunctionExpression *) override
void endVisit(ArgumentList *) override
\inmodule QtCore
Definition qstringview.h:76
constexpr QStringView left(qsizetype n) const noexcept
QString toString() const
Returns a deep copy of this string view's data as a QString.
Definition qstring.h:1014
constexpr bool isNull() const noexcept
Returns whether this string view is null - that is, whether {data() == nullptr}.
constexpr QStringView right(qsizetype n) const noexcept
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5710
QString mid(qsizetype position, qsizetype n=-1) const
Returns a string that contains n characters of this string, starting at the specified position index.
Definition qstring.cpp:5204
bool contains(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Definition qstring.h:1217
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:7822
QString str
[2]
QSet< QString >::iterator it
void reformatAst(OutWriter &lw, std::shared_ptr< AstComments > comments, const std::function< QStringView(SourceLocation)> loc2Str, AST::Node *n)
Combined button and popup list for selecting options.
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 return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
GLfloat GLfloat f
GLfloat n
const GLubyte * c
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
const char property[13]
Definition qwizard.cpp:101
QTextStream out(stdout)
[7]
QStringView el
\inmodule QtCore \reentrant
Definition qchar.h:17