Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
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
// Qt-Security score:significant
4
5
#
include
<
QString
>
6
#
include
<
QLocale
>
7
#
include
"common/qqmljsdiagnosticmessage_p.h"
8
#
include
"common/qqmljssourcelocation_p.h"
9
#
include
"qqmljsast_p.h"
10
11
#
include
"qqmljsastvisitor_p.h"
12
#
include
<
qlocale
.
h
>
13
14
#
include
<
algorithm
>
15
#
include
<
array
>
16
17
QT_BEGIN_NAMESPACE
18
19
namespace
QQmlJS
{
namespace
AST
{
20
21
FunctionExpression *
asAnonymousFunctionDefinition
(Node *n)
22
{
23
if
(!n)
24
return
nullptr
;
25
FunctionExpression *f = n->asFunctionDefinition();
26
if
(!f || !f->name.isNull())
27
return
nullptr
;
28
return
f;
29
}
30
31
ClassExpression *
asAnonymousClassDefinition
(Node *n)
32
{
33
if
(!n)
34
return
nullptr
;
35
ClassExpression *c = n->asClassDefinition();
36
if
(!c || !c->name.isNull())
37
return
nullptr
;
38
return
c;
39
}
40
41
ExpressionNode
*
Node
::
expressionCast
()
42
{
43
return
nullptr
;
44
}
45
46
BinaryExpression
*
Node
::
binaryExpressionCast
()
47
{
48
return
nullptr
;
49
}
50
51
Statement
*
Node
::
statementCast
()
52
{
53
return
nullptr
;
54
}
55
56
UiObjectMember
*
Node
::
uiObjectMemberCast
()
57
{
58
return
nullptr
;
59
}
60
61
LeftHandSideExpression
*
Node
::
leftHandSideExpressionCast
()
62
{
63
return
nullptr
;
64
}
65
66
Pattern
*
Node
::
patternCast
()
67
{
68
return
nullptr
;
69
}
70
71
FunctionExpression
*
Node
::
asFunctionDefinition
()
72
{
73
return
nullptr
;
74
}
75
76
ClassExpression
*
Node
::
asClassDefinition
()
77
{
78
return
nullptr
;
79
}
80
81
bool
Node
::
ignoreRecursionDepth
()
const
82
{
83
static
const
bool
doIgnore
=
qEnvironmentVariableIsSet
(
"QV4_CRASH_ON_STACKOVERFLOW"
);
84
return
doIgnore
;
85
}
86
87
ExpressionNode
*
ExpressionNode
::
expressionCast
()
88
{
89
return
this
;
90
}
91
92
bool
ExpressionNode
::
containsOptionalChain
()
const
93
{
94
for
(
const
Node
*
node
=
this
;;) {
95
switch
(
node
->
kind
) {
96
case
Kind_FieldMemberExpression
: {
97
const
auto
*
fme
=
AST
::
cast
<
const
FieldMemberExpression
*>(
node
);
98
if
(
fme
->
isOptional
)
99
return
true
;
100
node
=
fme
->
base
;
101
break
;
102
}
103
case
Kind_ArrayMemberExpression
: {
104
const
auto
*
ame
=
AST
::
cast
<
const
ArrayMemberExpression
*>(
node
);
105
if
(
ame
->
isOptional
)
106
return
true
;
107
node
=
ame
->
base
;
108
break
;
109
}
110
case
Kind_CallExpression
: {
111
const
auto
*
ce
=
AST
::
cast
<
const
CallExpression
*>(
node
);
112
if
(
ce
->
isOptional
)
113
return
true
;
114
node
=
ce
->
base
;
115
break
;
116
}
117
case
Kind_NestedExpression
: {
118
const
auto
*
ne
=
AST
::
cast
<
const
NestedExpression
*>(
node
);
119
node
=
ne
->
expression
;
120
break
;
121
}
122
default
:
123
// These unhandled nodes lead to invalid lvalues anyway, so they do not need to be handled here.
124
return
false
;
125
}
126
}
127
return
false
;
128
}
129
130
FormalParameterList
*
ExpressionNode
::
reparseAsFormalParameterList
(
MemoryPool
*
pool
)
131
{
132
AST
::
ExpressionNode
*
expr
=
this
;
133
AST
::
FormalParameterList
*
f
=
nullptr
;
134
if
(
AST
::
CommaExpression
*
commaExpr
=
AST
::
cast
<
AST
::
CommaExpression
*>(
expr
)) {
135
f
=
commaExpr
->
left
->
reparseAsFormalParameterList
(
pool
);
136
if
(!
f
)
137
return
nullptr
;
138
139
f
->
commaToken
=
commaExpr
->
commaToken
;
140
expr
=
commaExpr
->
right
;
141
}
142
143
AST
::
ExpressionNode
*
rhs
=
nullptr
;
144
if
(
AST
::
BinaryExpression
*
assign
=
AST
::
cast
<
AST
::
BinaryExpression
*>(
expr
)) {
145
if
(
assign
->
op
!=
QSOperator
::
Assign
)
146
return
nullptr
;
147
expr
=
assign
->
left
;
148
rhs
=
assign
->
right
;
149
}
150
AST
::
PatternElement
*
binding
=
nullptr
;
151
if
(
AST
::
IdentifierExpression
*
idExpr
=
AST
::
cast
<
AST
::
IdentifierExpression
*>(
expr
)) {
152
binding
=
new
(
pool
)
AST
::
PatternElement
(
idExpr
->
name
,
/*type annotation*/
nullptr
,
rhs
);
153
binding
->
identifierToken
=
idExpr
->
identifierToken
;
154
}
else
if
(
AST
::
Pattern
*
p
=
expr
->
patternCast
()) {
155
SourceLocation
loc
;
156
QString
s
;
157
if
(!
p
->
convertLiteralToAssignmentPattern
(&
loc
, &
s
))
158
return
nullptr
;
159
binding
=
new
(
pool
)
AST
::
PatternElement
(
p
,
rhs
);
160
binding
->
identifierToken
=
p
->
firstSourceLocation
();
161
}
162
if
(!
binding
)
163
return
nullptr
;
164
165
return
new
(
pool
)
AST
::
FormalParameterList
(
f
,
binding
);
166
}
167
168
BinaryExpression
*
BinaryExpression
::
binaryExpressionCast
()
169
{
170
return
this
;
171
}
172
173
void
TypeExpression
::
accept0
(
BaseVisitor
*
visitor
)
174
{
175
visitor
->
visit
(
this
);
176
visitor
->
endVisit
(
this
);
177
}
178
179
Statement
*
Statement
::
statementCast
()
180
{
181
return
this
;
182
}
183
184
UiObjectMember
*
UiObjectMember
::
uiObjectMemberCast
()
185
{
186
return
this
;
187
}
188
189
void
NestedExpression
::
accept0
(
BaseVisitor
*
visitor
)
190
{
191
if
(
visitor
->
visit
(
this
)) {
192
accept
(
expression
,
visitor
);
193
}
194
visitor
->
endVisit
(
this
);
195
}
196
197
FunctionExpression
*
NestedExpression
::
asFunctionDefinition
()
198
{
199
return
expression
->
asFunctionDefinition
();
200
}
201
202
ClassExpression
*
NestedExpression
::
asClassDefinition
()
203
{
204
return
expression
->
asClassDefinition
();
205
}
206
207
void
ThisExpression
::
accept0
(
BaseVisitor
*
visitor
)
208
{
209
if
(
visitor
->
visit
(
this
)) {
210
}
211
212
visitor
->
endVisit
(
this
);
213
}
214
215
void
IdentifierExpression
::
accept0
(
BaseVisitor
*
visitor
)
216
{
217
if
(
visitor
->
visit
(
this
)) {
218
}
219
220
visitor
->
endVisit
(
this
);
221
}
222
223
void
NullExpression
::
accept0
(
BaseVisitor
*
visitor
)
224
{
225
if
(
visitor
->
visit
(
this
)) {
226
}
227
228
visitor
->
endVisit
(
this
);
229
}
230
231
void
TrueLiteral
::
accept0
(
BaseVisitor
*
visitor
)
232
{
233
if
(
visitor
->
visit
(
this
)) {
234
}
235
236
visitor
->
endVisit
(
this
);
237
}
238
239
void
FalseLiteral
::
accept0
(
BaseVisitor
*
visitor
)
240
{
241
if
(
visitor
->
visit
(
this
)) {
242
}
243
244
visitor
->
endVisit
(
this
);
245
}
246
247
void
SuperLiteral
::
accept0
(
BaseVisitor
*
visitor
)
248
{
249
if
(
visitor
->
visit
(
this
)) {
250
}
251
252
visitor
->
endVisit
(
this
);
253
}
254
255
256
void
StringLiteral
::
accept0
(
BaseVisitor
*
visitor
)
257
{
258
if
(
visitor
->
visit
(
this
)) {
259
}
260
261
visitor
->
endVisit
(
this
);
262
}
263
264
void
TemplateLiteral
::
accept0
(
BaseVisitor
*
visitor
)
265
{
266
bool
accepted
=
true
;
267
for
(
TemplateLiteral
*
it
=
this
;
it
&&
accepted
;
it
=
it
->
next
) {
268
accepted
=
visitor
->
visit
(
it
);
269
visitor
->
endVisit
(
it
);
270
}
271
}
272
273
void
NumericLiteral
::
accept0
(
BaseVisitor
*
visitor
)
274
{
275
if
(
visitor
->
visit
(
this
)) {
276
}
277
278
visitor
->
endVisit
(
this
);
279
}
280
281
void
RegExpLiteral
::
accept0
(
BaseVisitor
*
visitor
)
282
{
283
if
(
visitor
->
visit
(
this
)) {
284
}
285
286
visitor
->
endVisit
(
this
);
287
}
288
289
void
ArrayPattern
::
accept0
(
BaseVisitor
*
visitor
)
290
{
291
if
(
visitor
->
visit
(
this
))
292
accept
(
elements
,
visitor
);
293
294
visitor
->
endVisit
(
this
);
295
}
296
297
bool
ArrayPattern
::
isValidArrayLiteral
(
SourceLocation
*
errorLocation
)
const
{
298
for
(
PatternElementList
*
it
=
elements
;
it
!=
nullptr
;
it
=
it
->
next
) {
299
PatternElement
*
e
=
it
->
element
;
300
if
(
e
&&
e
->
bindingTarget
!=
nullptr
) {
301
if
(
errorLocation
)
302
*
errorLocation
=
e
->
firstSourceLocation
();
303
return
false
;
304
}
305
}
306
return
true
;
307
}
308
309
void
ObjectPattern
::
accept0
(
BaseVisitor
*
visitor
)
310
{
311
if
(
visitor
->
visit
(
this
)) {
312
accept
(
properties
,
visitor
);
313
}
314
315
visitor
->
endVisit
(
this
);
316
}
317
318
/*
319
This is the grammar for AssignmentPattern that we need to convert the literal to:
320
321
AssignmentPattern:
322
ObjectAssignmentPattern
323
ArrayAssignmentPattern
324
ArrayAssignmentPattern:
325
[ ElisionOpt AssignmentRestElementOpt ]
326
[ AssignmentElementList ]
327
[ AssignmentElementList , ElisionOpt AssignmentRestElementOpt ]
328
AssignmentElementList:
329
AssignmentElisionElement
330
AssignmentElementList , AssignmentElisionElement
331
AssignmentElisionElement:
332
ElisionOpt AssignmentElement
333
AssignmentRestElement:
334
... DestructuringAssignmentTarget
335
336
ObjectAssignmentPattern:
337
{}
338
{ AssignmentPropertyList }
339
{ AssignmentPropertyList, }
340
AssignmentPropertyList:
341
AssignmentProperty
342
AssignmentPropertyList , AssignmentProperty
343
AssignmentProperty:
344
IdentifierReference InitializerOpt_In
345
PropertyName:
346
AssignmentElement
347
348
AssignmentElement:
349
DestructuringAssignmentTarget InitializerOpt_In
350
DestructuringAssignmentTarget:
351
LeftHandSideExpression
352
353
It was originally parsed with the following grammar:
354
355
ArrayLiteral:
356
[ ElisionOpt ]
357
[ ElementList ]
358
[ ElementList , ElisionOpt ]
359
ElementList:
360
ElisionOpt AssignmentExpression_In
361
ElisionOpt SpreadElement
362
ElementList , ElisionOpt AssignmentExpression_In
363
ElementList , Elisionopt SpreadElement
364
SpreadElement:
365
... AssignmentExpression_In
366
ObjectLiteral:
367
{}
368
{ PropertyDefinitionList }
369
{ PropertyDefinitionList , }
370
PropertyDefinitionList:
371
PropertyDefinition
372
PropertyDefinitionList , PropertyDefinition
373
PropertyDefinition:
374
IdentifierReference
375
CoverInitializedName
376
PropertyName : AssignmentExpression_In
377
MethodDefinition
378
PropertyName:
379
LiteralPropertyName
380
ComputedPropertyName
381
382
*/
383
bool
ArrayPattern
::
convertLiteralToAssignmentPattern
(
SourceLocation
*
errorLocation
,
QString
*
errorMessage
)
384
{
385
if
(
parseMode
==
Binding
)
386
return
true
;
387
for
(
auto
*
it
=
elements
;
it
;
it
=
it
->
next
) {
388
if
(!
it
->
element
)
389
continue
;
390
if
(
it
->
element
->
type
==
PatternElement
::
SpreadElement
&&
it
->
next
) {
391
*
errorLocation
=
it
->
element
->
firstSourceLocation
();
392
*
errorMessage
=
QString
::
fromLatin1
(
"'...' can only appear as last element in a destructuring list."
);
393
return
false
;
394
}
395
if
(!
it
->
element
->
convertLiteralToAssignmentPattern
(
errorLocation
,
errorMessage
))
396
return
false
;
397
}
398
parseMode
=
Binding
;
399
return
true
;
400
}
401
402
QList
<
DiagnosticMessage
>
ArrayPattern
::
warningsForAssignments
()
const
403
{
404
QList
<
DiagnosticMessage
>
result
;
405
for
(
auto
*
it
=
elements
;
it
;
it
=
it
->
next
) {
406
if
(!
it
->
element
)
407
continue
;
408
result
+=
it
->
element
->
warningsForAssignments
();
409
}
410
return
result
;
411
}
412
413
bool
ObjectPattern
::
convertLiteralToAssignmentPattern
(
SourceLocation
*
errorLocation
,
QString
*
errorMessage
)
414
{
415
if
(
parseMode
==
Binding
)
416
return
true
;
417
for
(
auto
*
it
=
properties
;
it
;
it
=
it
->
next
) {
418
if
(!
it
->
property
->
convertLiteralToAssignmentPattern
(
errorLocation
,
errorMessage
))
419
return
false
;
420
}
421
parseMode
=
Binding
;
422
return
true
;
423
}
424
425
QList
<
DiagnosticMessage
>
ObjectPattern
::
warningsForAssignments
()
const
426
{
427
QList
<
DiagnosticMessage
>
result
;
428
for
(
auto
*
it
=
properties
;
it
;
it
=
it
->
next
)
429
result
+=
it
->
property
->
warningsForAssignments
();
430
return
result
;
431
}
432
433
bool
PatternElement
::
convertLiteralToAssignmentPattern
(
SourceLocation
*
errorLocation
,
QString
*
errorMessage
)
434
{
435
Q_ASSERT
(
type
==
Literal
||
type
==
SpreadElement
);
436
Q_ASSERT
(
bindingIdentifier
.
isNull
());
437
Q_ASSERT
(
bindingTarget
==
nullptr
);
438
Q_ASSERT
(
bindingTarget
==
nullptr
);
439
Q_ASSERT
(
initializer
);
440
ExpressionNode
*
init
=
initializer
;
441
442
initializer
=
nullptr
;
443
LeftHandSideExpression
*
lhs
=
init
->
leftHandSideExpressionCast
();
444
if
(
type
==
SpreadElement
) {
445
if
(!
lhs
) {
446
*
errorLocation
=
init
->
firstSourceLocation
();
447
*
errorMessage
=
QString
::
fromLatin1
(
"Invalid lhs expression after '...' in destructuring expression."
);
448
return
false
;
449
}
450
}
else
{
451
type
=
PatternElement
::
Binding
;
452
453
if
(
BinaryExpression
*
b
=
init
->
binaryExpressionCast
()) {
454
if
(
b
->
op
!=
QSOperator
::
Assign
) {
455
*
errorLocation
=
b
->
operatorToken
;
456
*
errorMessage
=
QString
::
fromLatin1
(
"Invalid assignment operation in destructuring expression"
);
457
return
false
;
458
}
459
lhs
=
b
->
left
->
leftHandSideExpressionCast
();
460
initializer
=
b
->
right
;
461
Q_ASSERT
(
lhs
);
462
}
else
{
463
lhs
=
init
->
leftHandSideExpressionCast
();
464
}
465
if
(!
lhs
) {
466
*
errorLocation
=
init
->
firstSourceLocation
();
467
*
errorMessage
=
QString
::
fromLatin1
(
"Destructuring target is not a left hand side expression."
);
468
return
false
;
469
}
470
}
471
472
if
(
auto
*
i
=
cast
<
IdentifierExpression
*>(
lhs
)) {
473
bindingIdentifier
=
i
->
name
;
474
identifierToken
=
i
->
identifierToken
;
475
return
true
;
476
}
477
478
bindingTarget
=
lhs
;
479
if
(
auto
*
p
=
lhs
->
patternCast
()) {
480
if
(!
p
->
convertLiteralToAssignmentPattern
(
errorLocation
,
errorMessage
))
481
return
false
;
482
}
483
return
true
;
484
}
485
486
QList
<
DiagnosticMessage
>
PatternElement
::
warningsForAssignments
()
const
487
{
488
LeftHandSideExpression
*
lhs
=
nullptr
;
489
490
if
(
bindingTarget
) {
491
lhs
=
bindingTarget
->
leftHandSideExpressionCast
();
492
}
else
if
(
initializer
) {
493
ExpressionNode
*
init
=
initializer
;
494
if
(
BinaryExpression
*
b
=
init
->
binaryExpressionCast
()) {
495
if
(
b
->
op
==
QSOperator
::
Assign
)
496
lhs
=
b
->
left
->
leftHandSideExpressionCast
();
497
}
498
}
499
500
if
(!
lhs
)
501
return
{ };
502
503
if
(
auto
*
p
=
lhs
->
patternCast
())
504
return
p
->
warningsForAssignments
();
505
506
return
{ };
507
}
508
509
bool
PatternProperty
::
convertLiteralToAssignmentPattern
(
SourceLocation
*
errorLocation
,
QString
*
errorMessage
)
510
{
511
Q_ASSERT
(
type
!=
SpreadElement
);
512
if
(
type
==
Binding
)
513
return
true
;
514
if
(
type
==
Getter
||
type
==
Setter
) {
515
*
errorLocation
=
firstSourceLocation
();
516
*
errorMessage
=
QString
::
fromLatin1
(
"Invalid getter/setter in destructuring expression."
);
517
return
false
;
518
}
519
if
(
type
==
Method
)
520
type
=
Literal
;
521
Q_ASSERT
(
type
==
Literal
);
522
return
PatternElement
::
convertLiteralToAssignmentPattern
(
errorLocation
,
errorMessage
);
523
}
524
525
QList
<
DiagnosticMessage
>
PatternProperty
::
warningsForAssignments
()
const
526
{
527
QList
<
DiagnosticMessage
>
result
;
528
529
if
(!
colonToken
.
isValid
()) {
530
if
(
const
BinaryExpression
*
b
=
531
initializer
?
initializer
->
binaryExpressionCast
() :
nullptr
) {
532
if
(
b
->
op
==
QSOperator
::
Assign
) {
533
result
.
append
(
QQmlJS
::
DiagnosticMessage
{
534
QString
::
fromLatin1
(
"Invalid shorthand property initializer"
),
QtWarningMsg
,
535
b
->
operatorToken
});
536
}
537
}
538
}
539
540
result
+=
PatternElement
::
warningsForAssignments
();
541
return
result
;
542
}
543
544
void
Elision
::
accept0
(
BaseVisitor
*
visitor
)
545
{
546
if
(
visitor
->
visit
(
this
)) {
547
// ###
548
}
549
550
visitor
->
endVisit
(
this
);
551
}
552
553
void
IdentifierPropertyName
::
accept0
(
BaseVisitor
*
visitor
)
554
{
555
if
(
visitor
->
visit
(
this
)) {
556
}
557
558
visitor
->
endVisit
(
this
);
559
}
560
561
void
StringLiteralPropertyName
::
accept0
(
BaseVisitor
*
visitor
)
562
{
563
if
(
visitor
->
visit
(
this
)) {
564
}
565
566
visitor
->
endVisit
(
this
);
567
}
568
569
void
NumericLiteralPropertyName
::
accept0
(
BaseVisitor
*
visitor
)
570
{
571
if
(
visitor
->
visit
(
this
)) {
572
}
573
574
visitor
->
endVisit
(
this
);
575
}
576
577
namespace
{
578
struct
LocaleWithoutZeroPadding :
public
QLocale
579
{
580
LocaleWithoutZeroPadding()
581
: QLocale(QLocale::C)
582
{
583
setNumberOptions(QLocale::OmitLeadingZeroInExponent | QLocale::OmitGroupSeparator);
584
}
585
};
586
}
587
588
QString
NumericLiteralPropertyName
::
asString
()
const
589
{
590
// Can't use QString::number here anymore as it does zero padding by default now.
591
592
// In C++11 this initialization is thread-safe (6.7 [stmt.dcl] p4)
593
static
LocaleWithoutZeroPadding
locale
;
594
// Because of https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83562 we can't use thread_local
595
// for the locale variable and therefore rely on toString(double) to be thread-safe.
596
return
locale
.
toString
(
id
,
'g'
, 16);
597
}
598
599
void
ArrayMemberExpression
::
accept0
(
BaseVisitor
*
visitor
)
600
{
601
if
(
visitor
->
visit
(
this
)) {
602
accept
(
base
,
visitor
);
603
accept
(
expression
,
visitor
);
604
}
605
606
visitor
->
endVisit
(
this
);
607
}
608
609
void
FieldMemberExpression
::
accept0
(
BaseVisitor
*
visitor
)
610
{
611
if
(
visitor
->
visit
(
this
)) {
612
accept
(
base
,
visitor
);
613
}
614
615
visitor
->
endVisit
(
this
);
616
}
617
618
void
NewMemberExpression
::
accept0
(
BaseVisitor
*
visitor
)
619
{
620
if
(
visitor
->
visit
(
this
)) {
621
accept
(
base
,
visitor
);
622
accept
(
arguments
,
visitor
);
623
}
624
625
visitor
->
endVisit
(
this
);
626
}
627
628
void
NewExpression
::
accept0
(
BaseVisitor
*
visitor
)
629
{
630
if
(
visitor
->
visit
(
this
)) {
631
accept
(
expression
,
visitor
);
632
}
633
634
visitor
->
endVisit
(
this
);
635
}
636
637
void
CallExpression
::
accept0
(
BaseVisitor
*
visitor
)
638
{
639
if
(
visitor
->
visit
(
this
)) {
640
accept
(
base
,
visitor
);
641
accept
(
arguments
,
visitor
);
642
}
643
644
visitor
->
endVisit
(
this
);
645
}
646
647
void
ArgumentList
::
accept0
(
BaseVisitor
*
visitor
)
648
{
649
if
(
visitor
->
visit
(
this
)) {
650
for
(
ArgumentList
*
it
=
this
;
it
;
it
=
it
->
next
) {
651
accept
(
it
->
expression
,
visitor
);
652
}
653
}
654
655
visitor
->
endVisit
(
this
);
656
}
657
658
void
PostIncrementExpression
::
accept0
(
BaseVisitor
*
visitor
)
659
{
660
if
(
visitor
->
visit
(
this
)) {
661
accept
(
base
,
visitor
);
662
}
663
664
visitor
->
endVisit
(
this
);
665
}
666
667
void
PostDecrementExpression
::
accept0
(
BaseVisitor
*
visitor
)
668
{
669
if
(
visitor
->
visit
(
this
)) {
670
accept
(
base
,
visitor
);
671
}
672
673
visitor
->
endVisit
(
this
);
674
}
675
676
void
DeleteExpression
::
accept0
(
BaseVisitor
*
visitor
)
677
{
678
if
(
visitor
->
visit
(
this
)) {
679
accept
(
expression
,
visitor
);
680
}
681
682
visitor
->
endVisit
(
this
);
683
}
684
685
void
VoidExpression
::
accept0
(
BaseVisitor
*
visitor
)
686
{
687
if
(
visitor
->
visit
(
this
)) {
688
accept
(
expression
,
visitor
);
689
}
690
691
visitor
->
endVisit
(
this
);
692
}
693
694
void
TypeOfExpression
::
accept0
(
BaseVisitor
*
visitor
)
695
{
696
if
(
visitor
->
visit
(
this
)) {
697
accept
(
expression
,
visitor
);
698
}
699
700
visitor
->
endVisit
(
this
);
701
}
702
703
void
PreIncrementExpression
::
accept0
(
BaseVisitor
*
visitor
)
704
{
705
if
(
visitor
->
visit
(
this
)) {
706
accept
(
expression
,
visitor
);
707
}
708
709
visitor
->
endVisit
(
this
);
710
}
711
712
void
PreDecrementExpression
::
accept0
(
BaseVisitor
*
visitor
)
713
{
714
if
(
visitor
->
visit
(
this
)) {
715
accept
(
expression
,
visitor
);
716
}
717
718
visitor
->
endVisit
(
this
);
719
}
720
721
void
UnaryPlusExpression
::
accept0
(
BaseVisitor
*
visitor
)
722
{
723
if
(
visitor
->
visit
(
this
)) {
724
accept
(
expression
,
visitor
);
725
}
726
727
visitor
->
endVisit
(
this
);
728
}
729
730
void
UnaryMinusExpression
::
accept0
(
BaseVisitor
*
visitor
)
731
{
732
if
(
visitor
->
visit
(
this
)) {
733
accept
(
expression
,
visitor
);
734
}
735
736
visitor
->
endVisit
(
this
);
737
}
738
739
void
TildeExpression
::
accept0
(
BaseVisitor
*
visitor
)
740
{
741
if
(
visitor
->
visit
(
this
)) {
742
accept
(
expression
,
visitor
);
743
}
744
745
visitor
->
endVisit
(
this
);
746
}
747
748
void
NotExpression
::
accept0
(
BaseVisitor
*
visitor
)
749
{
750
if
(
visitor
->
visit
(
this
)) {
751
accept
(
expression
,
visitor
);
752
}
753
754
visitor
->
endVisit
(
this
);
755
}
756
757
void
BinaryExpression
::
accept0
(
BaseVisitor
*
visitor
)
758
{
759
if
(
visitor
->
visit
(
this
)) {
760
accept
(
left
,
visitor
);
761
accept
(
right
,
visitor
);
762
}
763
764
visitor
->
endVisit
(
this
);
765
}
766
767
void
ConditionalExpression
::
accept0
(
BaseVisitor
*
visitor
)
768
{
769
if
(
visitor
->
visit
(
this
)) {
770
accept
(
expression
,
visitor
);
771
accept
(
ok
,
visitor
);
772
accept
(
ko
,
visitor
);
773
}
774
775
visitor
->
endVisit
(
this
);
776
}
777
778
void
CommaExpression
::
accept0
(
BaseVisitor
*
visitor
)
779
{
780
if
(
visitor
->
visit
(
this
)) {
781
accept
(
left
,
visitor
);
782
accept
(
right
,
visitor
);
783
}
784
785
visitor
->
endVisit
(
this
);
786
}
787
788
void
Block
::
accept0
(
BaseVisitor
*
visitor
)
789
{
790
if
(
visitor
->
visit
(
this
)) {
791
accept
(
statements
,
visitor
);
792
}
793
794
visitor
->
endVisit
(
this
);
795
}
796
797
void
StatementList
::
accept0
(
BaseVisitor
*
visitor
)
798
{
799
if
(
visitor
->
visit
(
this
)) {
800
for
(
StatementList
*
it
=
this
;
it
;
it
=
it
->
next
) {
801
accept
(
it
->
statement
,
visitor
);
802
}
803
}
804
805
visitor
->
endVisit
(
this
);
806
}
807
808
void
VariableStatement
::
accept0
(
BaseVisitor
*
visitor
)
809
{
810
if
(
visitor
->
visit
(
this
)) {
811
accept
(
declarations
,
visitor
);
812
}
813
814
visitor
->
endVisit
(
this
);
815
}
816
817
void
VariableDeclarationList
::
accept0
(
BaseVisitor
*
visitor
)
818
{
819
if
(
visitor
->
visit
(
this
)) {
820
for
(
VariableDeclarationList
*
it
=
this
;
it
;
it
=
it
->
next
) {
821
accept
(
it
->
declaration
,
visitor
);
822
}
823
}
824
825
visitor
->
endVisit
(
this
);
826
}
827
828
void
EmptyStatement
::
accept0
(
BaseVisitor
*
visitor
)
829
{
830
if
(
visitor
->
visit
(
this
)) {
831
}
832
833
visitor
->
endVisit
(
this
);
834
}
835
836
void
ExpressionStatement
::
accept0
(
BaseVisitor
*
visitor
)
837
{
838
if
(
visitor
->
visit
(
this
)) {
839
accept
(
expression
,
visitor
);
840
}
841
842
visitor
->
endVisit
(
this
);
843
}
844
845
void
IfStatement
::
accept0
(
BaseVisitor
*
visitor
)
846
{
847
if
(
visitor
->
visit
(
this
)) {
848
accept
(
expression
,
visitor
);
849
accept
(
ok
,
visitor
);
850
accept
(
ko
,
visitor
);
851
}
852
853
visitor
->
endVisit
(
this
);
854
}
855
856
void
DoWhileStatement
::
accept0
(
BaseVisitor
*
visitor
)
857
{
858
if
(
visitor
->
visit
(
this
)) {
859
accept
(
statement
,
visitor
);
860
accept
(
expression
,
visitor
);
861
}
862
863
visitor
->
endVisit
(
this
);
864
}
865
866
void
WhileStatement
::
accept0
(
BaseVisitor
*
visitor
)
867
{
868
if
(
visitor
->
visit
(
this
)) {
869
accept
(
expression
,
visitor
);
870
accept
(
statement
,
visitor
);
871
}
872
873
visitor
->
endVisit
(
this
);
874
}
875
876
void
ForStatement
::
accept0
(
BaseVisitor
*
visitor
)
877
{
878
if
(
visitor
->
visit
(
this
)) {
879
accept
(
initialiser
,
visitor
);
880
accept
(
declarations
,
visitor
);
881
accept
(
condition
,
visitor
);
882
accept
(
expression
,
visitor
);
883
accept
(
statement
,
visitor
);
884
}
885
886
visitor
->
endVisit
(
this
);
887
}
888
889
void
ForEachStatement
::
accept0
(
BaseVisitor
*
visitor
)
890
{
891
if
(
visitor
->
visit
(
this
)) {
892
accept
(
lhs
,
visitor
);
893
accept
(
expression
,
visitor
);
894
accept
(
statement
,
visitor
);
895
}
896
897
visitor
->
endVisit
(
this
);
898
}
899
900
void
ContinueStatement
::
accept0
(
BaseVisitor
*
visitor
)
901
{
902
if
(
visitor
->
visit
(
this
)) {
903
}
904
905
visitor
->
endVisit
(
this
);
906
}
907
908
void
BreakStatement
::
accept0
(
BaseVisitor
*
visitor
)
909
{
910
if
(
visitor
->
visit
(
this
)) {
911
}
912
913
visitor
->
endVisit
(
this
);
914
}
915
916
void
ReturnStatement
::
accept0
(
BaseVisitor
*
visitor
)
917
{
918
if
(
visitor
->
visit
(
this
)) {
919
accept
(
expression
,
visitor
);
920
}
921
922
visitor
->
endVisit
(
this
);
923
}
924
925
void
YieldExpression
::
accept0
(
BaseVisitor
*
visitor
)
926
{
927
if
(
visitor
->
visit
(
this
)) {
928
accept
(
expression
,
visitor
);
929
}
930
931
visitor
->
endVisit
(
this
);
932
}
933
934
935
void
WithStatement
::
accept0
(
BaseVisitor
*
visitor
)
936
{
937
if
(
visitor
->
visit
(
this
)) {
938
accept
(
expression
,
visitor
);
939
accept
(
statement
,
visitor
);
940
}
941
942
visitor
->
endVisit
(
this
);
943
}
944
945
void
SwitchStatement
::
accept0
(
BaseVisitor
*
visitor
)
946
{
947
if
(
visitor
->
visit
(
this
)) {
948
accept
(
expression
,
visitor
);
949
accept
(
block
,
visitor
);
950
}
951
952
visitor
->
endVisit
(
this
);
953
}
954
955
void
CaseBlock
::
accept0
(
BaseVisitor
*
visitor
)
956
{
957
if
(
visitor
->
visit
(
this
)) {
958
accept
(
clauses
,
visitor
);
959
accept
(
defaultClause
,
visitor
);
960
accept
(
moreClauses
,
visitor
);
961
}
962
963
visitor
->
endVisit
(
this
);
964
}
965
966
void
CaseClauses
::
accept0
(
BaseVisitor
*
visitor
)
967
{
968
if
(
visitor
->
visit
(
this
)) {
969
for
(
CaseClauses
*
it
=
this
;
it
;
it
=
it
->
next
) {
970
accept
(
it
->
clause
,
visitor
);
971
}
972
}
973
974
visitor
->
endVisit
(
this
);
975
}
976
977
void
CaseClause
::
accept0
(
BaseVisitor
*
visitor
)
978
{
979
if
(
visitor
->
visit
(
this
)) {
980
accept
(
expression
,
visitor
);
981
accept
(
statements
,
visitor
);
982
}
983
984
visitor
->
endVisit
(
this
);
985
}
986
987
void
DefaultClause
::
accept0
(
BaseVisitor
*
visitor
)
988
{
989
if
(
visitor
->
visit
(
this
)) {
990
accept
(
statements
,
visitor
);
991
}
992
993
visitor
->
endVisit
(
this
);
994
}
995
996
void
LabelledStatement
::
accept0
(
BaseVisitor
*
visitor
)
997
{
998
if
(
visitor
->
visit
(
this
)) {
999
accept
(
statement
,
visitor
);
1000
}
1001
1002
visitor
->
endVisit
(
this
);
1003
}
1004
1005
void
ThrowStatement
::
accept0
(
BaseVisitor
*
visitor
)
1006
{
1007
if
(
visitor
->
visit
(
this
)) {
1008
accept
(
expression
,
visitor
);
1009
}
1010
1011
visitor
->
endVisit
(
this
);
1012
}
1013
1014
void
TryStatement
::
accept0
(
BaseVisitor
*
visitor
)
1015
{
1016
if
(
visitor
->
visit
(
this
)) {
1017
accept
(
statement
,
visitor
);
1018
accept
(
catchExpression
,
visitor
);
1019
accept
(
finallyExpression
,
visitor
);
1020
}
1021
1022
visitor
->
endVisit
(
this
);
1023
}
1024
1025
void
Catch
::
accept0
(
BaseVisitor
*
visitor
)
1026
{
1027
if
(
visitor
->
visit
(
this
)) {
1028
accept
(
patternElement
,
visitor
);
1029
accept
(
statement
,
visitor
);
1030
}
1031
1032
visitor
->
endVisit
(
this
);
1033
}
1034
1035
void
Finally
::
accept0
(
BaseVisitor
*
visitor
)
1036
{
1037
if
(
visitor
->
visit
(
this
)) {
1038
accept
(
statement
,
visitor
);
1039
}
1040
1041
visitor
->
endVisit
(
this
);
1042
}
1043
1044
void
FunctionDeclaration
::
accept0
(
BaseVisitor
*
visitor
)
1045
{
1046
if
(
visitor
->
visit
(
this
)) {
1047
accept
(
formals
,
visitor
);
1048
accept
(
typeAnnotation
,
visitor
);
1049
accept
(
body
,
visitor
);
1050
}
1051
1052
visitor
->
endVisit
(
this
);
1053
}
1054
1055
void
FunctionExpression
::
accept0
(
BaseVisitor
*
visitor
)
1056
{
1057
if
(
visitor
->
visit
(
this
)) {
1058
accept
(
formals
,
visitor
);
1059
accept
(
typeAnnotation
,
visitor
);
1060
accept
(
body
,
visitor
);
1061
}
1062
1063
visitor
->
endVisit
(
this
);
1064
}
1065
1066
FunctionExpression
*
FunctionExpression
::
asFunctionDefinition
()
1067
{
1068
return
this
;
1069
}
1070
1071
BoundNames
FormalParameterList
::
formals
()
const
1072
{
1073
BoundNames
formals
;
1074
int
i
= 0;
1075
for
(
const
FormalParameterList
*
it
=
this
;
it
;
it
=
it
->
next
) {
1076
if
(
it
->
element
) {
1077
QString
name
=
it
->
element
->
bindingIdentifier
.
toString
();
1078
int
duplicateIndex
=
formals
.
indexOf
(
name
);
1079
if
(
duplicateIndex
>= 0) {
1080
// change the name of the earlier argument to enforce the lookup semantics from the spec
1081
formals
[
duplicateIndex
].
id
+=
QLatin1String
(
"#"
) +
QString
::
number
(
i
);
1082
}
1083
formals
+= {
name
,
it
->
element
->
firstSourceLocation
(),
it
->
element
->
typeAnnotation
,
1084
it
->
element
->
isInjectedSignalParameter
?
BoundName
::
Injected
1085
:
BoundName
::
Declared
};
1086
}
1087
++
i
;
1088
}
1089
return
formals
;
1090
}
1091
1092
BoundNames
FormalParameterList
::
boundNames
()
const
1093
{
1094
BoundNames
names
;
1095
for
(
const
FormalParameterList
*
it
=
this
;
it
;
it
=
it
->
next
) {
1096
if
(
it
->
element
)
1097
it
->
element
->
boundNames
(&
names
);
1098
}
1099
return
names
;
1100
}
1101
1102
void
FormalParameterList
::
accept0
(
BaseVisitor
*
visitor
)
1103
{
1104
bool
accepted
=
true
;
1105
for
(
FormalParameterList
*
it
=
this
;
it
&&
accepted
;
it
=
it
->
next
) {
1106
accepted
=
visitor
->
visit
(
it
);
1107
if
(
accepted
)
1108
accept
(
it
->
element
,
visitor
);
1109
visitor
->
endVisit
(
it
);
1110
}
1111
}
1112
1113
FormalParameterList
*
FormalParameterList
::
finish
(
QQmlJS
::
MemoryPool
*)
1114
{
1115
FormalParameterList
*
front
=
next
;
1116
next
=
nullptr
;
1117
return
front
;
1118
}
1119
1120
void
Program
::
accept0
(
BaseVisitor
*
visitor
)
1121
{
1122
if
(
visitor
->
visit
(
this
)) {
1123
accept
(
statements
,
visitor
);
1124
}
1125
1126
visitor
->
endVisit
(
this
);
1127
}
1128
1129
void
ImportSpecifier
::
accept0
(
BaseVisitor
*
visitor
)
1130
{
1131
if
(
visitor
->
visit
(
this
)) {
1132
1133
}
1134
visitor
->
endVisit
(
this
);
1135
}
1136
1137
void
ImportsList
::
accept0
(
BaseVisitor
*
visitor
)
1138
{
1139
if
(
visitor
->
visit
(
this
)) {
1140
for
(
ImportsList
*
it
=
this
;
it
;
it
=
it
->
next
) {
1141
accept
(
it
->
importSpecifier
,
visitor
);
1142
}
1143
}
1144
1145
visitor
->
endVisit
(
this
);
1146
}
1147
1148
void
NamedImports
::
accept0
(
BaseVisitor
*
visitor
)
1149
{
1150
if
(
visitor
->
visit
(
this
)) {
1151
accept
(
importsList
,
visitor
);
1152
}
1153
1154
visitor
->
endVisit
(
this
);
1155
}
1156
1157
void
FromClause
::
accept0
(
BaseVisitor
*
visitor
)
1158
{
1159
if
(
visitor
->
visit
(
this
)) {
1160
}
1161
1162
visitor
->
endVisit
(
this
);
1163
}
1164
1165
void
NameSpaceImport
::
accept0
(
BaseVisitor
*
visitor
)
1166
{
1167
if
(
visitor
->
visit
(
this
)) {
1168
}
1169
1170
visitor
->
endVisit
(
this
);
1171
}
1172
1173
void
ImportClause
::
accept0
(
BaseVisitor
*
visitor
)
1174
{
1175
if
(
visitor
->
visit
(
this
)) {
1176
accept
(
nameSpaceImport
,
visitor
);
1177
accept
(
namedImports
,
visitor
);
1178
}
1179
1180
visitor
->
endVisit
(
this
);
1181
}
1182
1183
void
ImportDeclaration
::
accept0
(
BaseVisitor
*
visitor
)
1184
{
1185
if
(
visitor
->
visit
(
this
)) {
1186
accept
(
importClause
,
visitor
);
1187
accept
(
fromClause
,
visitor
);
1188
}
1189
1190
visitor
->
endVisit
(
this
);
1191
}
1192
1193
void
ExportSpecifier
::
accept0
(
BaseVisitor
*
visitor
)
1194
{
1195
if
(
visitor
->
visit
(
this
)) {
1196
1197
}
1198
1199
visitor
->
endVisit
(
this
);
1200
}
1201
1202
void
ExportsList
::
accept0
(
BaseVisitor
*
visitor
)
1203
{
1204
if
(
visitor
->
visit
(
this
)) {
1205
for
(
ExportsList
*
it
=
this
;
it
;
it
=
it
->
next
) {
1206
accept
(
it
->
exportSpecifier
,
visitor
);
1207
}
1208
}
1209
1210
visitor
->
endVisit
(
this
);
1211
}
1212
1213
void
ExportClause
::
accept0
(
BaseVisitor
*
visitor
)
1214
{
1215
if
(
visitor
->
visit
(
this
)) {
1216
accept
(
exportsList
,
visitor
);
1217
}
1218
1219
visitor
->
endVisit
(
this
);
1220
}
1221
1222
void
ExportDeclaration
::
accept0
(
BaseVisitor
*
visitor
)
1223
{
1224
if
(
visitor
->
visit
(
this
)) {
1225
accept
(
exportClause
,
visitor
);
1226
accept
(
fromClause
,
visitor
);
1227
accept
(
variableStatementOrDeclaration
,
visitor
);
1228
}
1229
1230
visitor
->
endVisit
(
this
);
1231
}
1232
1233
void
ESModule
::
accept0
(
BaseVisitor
*
visitor
)
1234
{
1235
if
(
visitor
->
visit
(
this
)) {
1236
accept
(
body
,
visitor
);
1237
}
1238
1239
visitor
->
endVisit
(
this
);
1240
}
1241
1242
void
DebuggerStatement
::
accept0
(
BaseVisitor
*
visitor
)
1243
{
1244
if
(
visitor
->
visit
(
this
)) {
1245
}
1246
1247
visitor
->
endVisit
(
this
);
1248
}
1249
1250
void
UiProgram
::
accept0
(
BaseVisitor
*
visitor
)
1251
{
1252
if
(
visitor
->
visit
(
this
)) {
1253
accept
(
headers
,
visitor
);
1254
accept
(
members
,
visitor
);
1255
}
1256
1257
visitor
->
endVisit
(
this
);
1258
}
1259
1260
void
UiPublicMember
::
accept0
(
BaseVisitor
*
visitor
)
1261
{
1262
if
(
visitor
->
visit
(
this
)) {
1263
// accept(annotations, visitor); // accept manually in visit if interested
1264
// accept(memberType, visitor); // accept manually in visit if interested
1265
accept
(
statement
,
visitor
);
1266
accept
(
binding
,
visitor
);
1267
// accept(parameters, visitor); // accept manually in visit if interested
1268
}
1269
1270
visitor
->
endVisit
(
this
);
1271
}
1272
1273
void
UiObjectDefinition
::
accept0
(
BaseVisitor
*
visitor
)
1274
{
1275
if
(
visitor
->
visit
(
this
)) {
1276
// accept(annotations, visitor); // accept manually in visit if interested
1277
accept
(
qualifiedTypeNameId
,
visitor
);
1278
accept
(
initializer
,
visitor
);
1279
}
1280
1281
visitor
->
endVisit
(
this
);
1282
}
1283
1284
void
UiObjectInitializer
::
accept0
(
BaseVisitor
*
visitor
)
1285
{
1286
if
(
visitor
->
visit
(
this
)) {
1287
accept
(
members
,
visitor
);
1288
}
1289
1290
visitor
->
endVisit
(
this
);
1291
}
1292
1293
void
UiParameterList
::
accept0
(
BaseVisitor
*
visitor
)
1294
{
1295
if
(
visitor
->
visit
(
this
)) {
1296
// accept(type, visitor); // accept manually in visit if interested
1297
}
1298
visitor
->
endVisit
(
this
);
1299
}
1300
1301
void
UiObjectBinding
::
accept0
(
BaseVisitor
*
visitor
)
1302
{
1303
if
(
visitor
->
visit
(
this
)) {
1304
// accept(annotations, visitor); // accept manually in visit if interested
1305
accept
(
qualifiedId
,
visitor
);
1306
accept
(
qualifiedTypeNameId
,
visitor
);
1307
accept
(
initializer
,
visitor
);
1308
}
1309
1310
visitor
->
endVisit
(
this
);
1311
}
1312
1313
void
UiScriptBinding
::
accept0
(
BaseVisitor
*
visitor
)
1314
{
1315
if
(
visitor
->
visit
(
this
)) {
1316
// accept(annotations, visitor); // accept manually in visit if interested
1317
accept
(
qualifiedId
,
visitor
);
1318
accept
(
statement
,
visitor
);
1319
}
1320
1321
visitor
->
endVisit
(
this
);
1322
}
1323
1324
void
UiArrayBinding
::
accept0
(
BaseVisitor
*
visitor
)
1325
{
1326
if
(
visitor
->
visit
(
this
)) {
1327
// accept(annotations, visitor); // accept manually in visit if interested
1328
accept
(
qualifiedId
,
visitor
);
1329
accept
(
members
,
visitor
);
1330
}
1331
1332
visitor
->
endVisit
(
this
);
1333
}
1334
1335
void
UiObjectMemberList
::
accept0
(
BaseVisitor
*
visitor
)
1336
{
1337
if
(
visitor
->
visit
(
this
)) {
1338
for
(
UiObjectMemberList
*
it
=
this
;
it
;
it
=
it
->
next
)
1339
accept
(
it
->
member
,
visitor
);
1340
}
1341
1342
visitor
->
endVisit
(
this
);
1343
}
1344
1345
void
UiArrayMemberList
::
accept0
(
BaseVisitor
*
visitor
)
1346
{
1347
if
(
visitor
->
visit
(
this
)) {
1348
for
(
UiArrayMemberList
*
it
=
this
;
it
;
it
=
it
->
next
)
1349
accept
(
it
->
member
,
visitor
);
1350
}
1351
1352
visitor
->
endVisit
(
this
);
1353
}
1354
1355
void
UiQualifiedId
::
accept0
(
BaseVisitor
*
visitor
)
1356
{
1357
if
(
visitor
->
visit
(
this
)) {
1358
// accept(next, visitor) // accept manually in visit if interested
1359
}
1360
1361
visitor
->
endVisit
(
this
);
1362
}
1363
1364
void
Type
::
accept0
(
BaseVisitor
*
visitor
)
1365
{
1366
if
(
visitor
->
visit
(
this
)) {
1367
accept
(
typeId
,
visitor
);
1368
accept
(
typeArgument
,
visitor
);
1369
}
1370
1371
visitor
->
endVisit
(
this
);
1372
}
1373
1374
void
TypeAnnotation
::
accept0
(
BaseVisitor
*
visitor
)
1375
{
1376
if
(
visitor
->
visit
(
this
)) {
1377
accept
(
type
,
visitor
);
1378
}
1379
1380
visitor
->
endVisit
(
this
);
1381
}
1382
1383
void
UiImport
::
accept0
(
BaseVisitor
*
visitor
)
1384
{
1385
if
(
visitor
->
visit
(
this
)) {
1386
accept
(
importUri
,
visitor
);
1387
// accept(version, visitor); // accept manually in visit if interested
1388
}
1389
1390
visitor
->
endVisit
(
this
);
1391
}
1392
1393
void
UiPragmaValueList
::
accept0
(
BaseVisitor
*
visitor
)
1394
{
1395
if
(
visitor
->
visit
(
this
)) {
1396
}
1397
1398
visitor
->
endVisit
(
this
);
1399
}
1400
1401
1402
void
UiPragma
::
accept0
(
BaseVisitor
*
visitor
)
1403
{
1404
if
(
visitor
->
visit
(
this
)) {
1405
}
1406
1407
visitor
->
endVisit
(
this
);
1408
}
1409
1410
void
UiHeaderItemList
::
accept0
(
BaseVisitor
*
visitor
)
1411
{
1412
bool
accepted
=
true
;
1413
for
(
UiHeaderItemList
*
it
=
this
;
it
&&
accepted
;
it
=
it
->
next
) {
1414
accepted
=
visitor
->
visit
(
it
);
1415
if
(
accepted
)
1416
accept
(
it
->
headerItem
,
visitor
);
1417
1418
visitor
->
endVisit
(
it
);
1419
}
1420
}
1421
1422
1423
void
UiSourceElement
::
accept0
(
BaseVisitor
*
visitor
)
1424
{
1425
if
(
visitor
->
visit
(
this
)) {
1426
// accept(annotations, visitor); // accept manually in visit if interested
1427
accept
(
sourceElement
,
visitor
);
1428
}
1429
1430
visitor
->
endVisit
(
this
);
1431
}
1432
1433
void
UiEnumDeclaration
::
accept0
(
BaseVisitor
*
visitor
)
1434
{
1435
if
(
visitor
->
visit
(
this
)) {
1436
// accept(annotations, visitor); // accept manually in visit if interested
1437
accept
(
members
,
visitor
);
1438
}
1439
1440
visitor
->
endVisit
(
this
);
1441
}
1442
1443
void
UiEnumMemberList
::
accept0
(
BaseVisitor
*
visitor
)
1444
{
1445
if
(
visitor
->
visit
(
this
)) {
1446
}
1447
1448
visitor
->
endVisit
(
this
);
1449
}
1450
1451
void
TaggedTemplate
::
accept0
(
BaseVisitor
*
visitor
)
1452
{
1453
if
(
visitor
->
visit
(
this
)) {
1454
accept
(
base
,
visitor
);
1455
accept
(
templateLiteral
,
visitor
);
1456
}
1457
1458
visitor
->
endVisit
(
this
);
1459
}
1460
1461
void
InitializerExpression
::
accept0
(
BaseVisitor
*
visitor
)
1462
{
1463
expression
->
accept0
(
visitor
);
1464
}
1465
1466
void
PatternElement
::
accept0
(
BaseVisitor
*
visitor
)
1467
{
1468
if
(
visitor
->
visit
(
this
)) {
1469
accept
(
bindingTarget
,
visitor
);
1470
accept
(
typeAnnotation
,
visitor
);
1471
accept
(
initializer
,
visitor
);
1472
}
1473
1474
visitor
->
endVisit
(
this
);
1475
}
1476
1477
void
PatternElement
::
boundNames
(
BoundNames
*
names
)
1478
{
1479
if
(
bindingTarget
) {
1480
if
(
PatternElementList
*
e
=
elementList
())
1481
e
->
boundNames
(
names
);
1482
else
if
(
PatternPropertyList
*
p
=
propertyList
())
1483
p
->
boundNames
(
names
);
1484
}
else
{
1485
names
->
append
({
bindingIdentifier
.
toString
(),
firstSourceLocation
(),
typeAnnotation
,
1486
isInjectedSignalParameter
?
BoundName
::
Injected
:
BoundName
::
Declared
});
1487
}
1488
}
1489
1490
void
PatternElementList
::
accept0
(
BaseVisitor
*
visitor
)
1491
{
1492
bool
accepted
=
true
;
1493
for
(
PatternElementList
*
it
=
this
;
it
&&
accepted
;
it
=
it
->
next
) {
1494
accepted
=
visitor
->
visit
(
it
);
1495
if
(
accepted
) {
1496
accept
(
it
->
elision
,
visitor
);
1497
accept
(
it
->
element
,
visitor
);
1498
}
1499
visitor
->
endVisit
(
it
);
1500
}
1501
}
1502
1503
void
PatternElementList
::
boundNames
(
BoundNames
*
names
)
1504
{
1505
for
(
PatternElementList
*
it
=
this
;
it
;
it
=
it
->
next
) {
1506
if
(
it
->
element
)
1507
it
->
element
->
boundNames
(
names
);
1508
}
1509
}
1510
1511
void
PatternProperty
::
accept0
(
BaseVisitor
*
visitor
)
1512
{
1513
if
(
visitor
->
visit
(
this
)) {
1514
accept
(
name
,
visitor
);
1515
accept
(
bindingTarget
,
visitor
);
1516
accept
(
typeAnnotation
,
visitor
);
1517
accept
(
initializer
,
visitor
);
1518
}
1519
1520
visitor
->
endVisit
(
this
);
1521
}
1522
1523
void
PatternProperty
::
boundNames
(
BoundNames
*
names
)
1524
{
1525
PatternElement
::
boundNames
(
names
);
1526
}
1527
1528
void
PatternPropertyList
::
accept0
(
BaseVisitor
*
visitor
)
1529
{
1530
bool
accepted
=
true
;
1531
for
(
PatternPropertyList
*
it
=
this
;
it
&&
accepted
;
it
=
it
->
next
) {
1532
accepted
=
visitor
->
visit
(
it
);
1533
if
(
accepted
)
1534
accept
(
it
->
property
,
visitor
);
1535
visitor
->
endVisit
(
it
);
1536
}
1537
}
1538
1539
void
PatternPropertyList
::
boundNames
(
BoundNames
*
names
)
1540
{
1541
for
(
PatternPropertyList
*
it
=
this
;
it
;
it
=
it
->
next
)
1542
it
->
property
->
boundNames
(
names
);
1543
}
1544
1545
void
ComputedPropertyName
::
accept0
(
BaseVisitor
*
visitor
)
1546
{
1547
if
(
visitor
->
visit
(
this
)) {
1548
accept
(
expression
,
visitor
);
1549
}
1550
1551
visitor
->
endVisit
(
this
);
1552
}
1553
1554
void
ClassExpression
::
accept0
(
BaseVisitor
*
visitor
)
1555
{
1556
if
(
visitor
->
visit
(
this
)) {
1557
accept
(
heritage
,
visitor
);
1558
accept
(
elements
,
visitor
);
1559
}
1560
1561
visitor
->
endVisit
(
this
);
1562
}
1563
1564
ClassExpression
*
ClassExpression
::
asClassDefinition
()
1565
{
1566
return
this
;
1567
}
1568
1569
void
ClassDeclaration
::
accept0
(
BaseVisitor
*
visitor
)
1570
{
1571
if
(
visitor
->
visit
(
this
)) {
1572
accept
(
heritage
,
visitor
);
1573
accept
(
elements
,
visitor
);
1574
}
1575
1576
visitor
->
endVisit
(
this
);
1577
}
1578
1579
void
ClassElementList
::
accept0
(
BaseVisitor
*
visitor
)
1580
{
1581
bool
accepted
=
true
;
1582
for
(
ClassElementList
*
it
=
this
;
it
&&
accepted
;
it
=
it
->
next
) {
1583
accepted
=
visitor
->
visit
(
it
);
1584
if
(
accepted
)
1585
accept
(
it
->
property
,
visitor
);
1586
1587
visitor
->
endVisit
(
it
);
1588
}
1589
}
1590
1591
ClassElementList
*
ClassElementList
::
finish
()
1592
{
1593
ClassElementList
*
front
=
next
;
1594
next
=
nullptr
;
1595
return
front
;
1596
}
1597
1598
Pattern
*
Pattern
::
patternCast
()
1599
{
1600
return
this
;
1601
}
1602
1603
LeftHandSideExpression
*
LeftHandSideExpression
::
leftHandSideExpressionCast
()
1604
{
1605
return
this
;
1606
}
1607
1608
void
UiVersionSpecifier
::
accept0
(
BaseVisitor
*
visitor
)
1609
{
1610
if
(
visitor
->
visit
(
this
)) {
1611
}
1612
visitor
->
endVisit
(
this
);
1613
}
1614
1615
QString
Type
::
toString
()
const
1616
{
1617
QString
result
;
1618
toString
(&
result
);
1619
return
result
;
1620
}
1621
1622
void
Type
::
toString
(
QString
*
out
)
const
1623
{
1624
typeId
->
toString
(
out
);
1625
1626
if
(
typeArgument
) {
1627
out
->
append
(
QLatin1Char
(
'<'
));
1628
typeArgument
->
toString
(
out
);
1629
out
->
append
(
QLatin1Char
(
'>'
));
1630
};
1631
}
1632
1633
void
UiInlineComponent
::
accept0
(
BaseVisitor
*
visitor
)
1634
{
1635
if
(
visitor
->
visit
(
this
)) {
1636
// accept(annotations, visitor); // accept manually in visit if interested
1637
accept
(
component
,
visitor
);
1638
}
1639
1640
visitor
->
endVisit
(
this
);
1641
}
1642
1643
void
UiRequired
::
accept0
(
BaseVisitor
*
visitor
)
1644
{
1645
if
(
visitor
->
visit
(
this
)) {
1646
}
1647
1648
visitor
->
endVisit
(
this
);
1649
}
1650
1651
void
UiAnnotationList
::
accept0
(
BaseVisitor
*
visitor
)
1652
{
1653
if
(
visitor
->
visit
(
this
)) {
1654
for
(
UiAnnotationList
*
it
=
this
;
it
;
it
=
it
->
next
)
1655
accept
(
it
->
annotation
,
visitor
);
1656
}
1657
1658
visitor
->
endVisit
(
this
);
1659
}
1660
1661
void
UiAnnotation
::
accept0
(
BaseVisitor
*
visitor
)
1662
{
1663
if
(
visitor
->
visit
(
this
)) {
1664
accept
(
qualifiedTypeNameId
,
visitor
);
1665
accept
(
initializer
,
visitor
);
1666
}
1667
1668
visitor
->
endVisit
(
this
);
1669
}
1670
1671
SourceLocation
UiPropertyAttributes
::
firstSourceLocation
()
const
1672
{
1673
return
*
std
::
min
({ &
m_propertyToken
, &
m_defaultToken
, &
m_readonlyToken
, &
m_requiredToken
,
1674
&
m_finalToken
, &
m_virtualToken
, &
m_overrideToken
},
1675
compareLocationsByBegin
<
true
>);
1676
}
1677
1678
SourceLocation
UiPropertyAttributes
::
lastSourceLocation
()
const
1679
{
1680
return
*
std
::
max
({ &
m_propertyToken
, &
m_defaultToken
, &
m_readonlyToken
, &
m_requiredToken
,
1681
&
m_finalToken
, &
m_virtualToken
, &
m_overrideToken
},
1682
compareLocationsByBegin
<
false
>);
1683
}
1684
1685
} }
// namespace QQmlJS::AST
1686
1687
QT_END_NAMESPACE
QQmlJS::AST
Definition
qqmljsast.cpp:19
QQmlJS::AST::asAnonymousFunctionDefinition
FunctionExpression * asAnonymousFunctionDefinition(Node *n)
Definition
qqmljsast.cpp:21
QQmlJS::AST::asAnonymousClassDefinition
ClassExpression * asAnonymousClassDefinition(Node *n)
Definition
qqmljsast.cpp:31
QQmlJS
Definition
qv4bytecodegenerator_p.h:27
qtdeclarative
src
qml
parser
qqmljsast.cpp
Generated on
for Qt by
1.16.1