Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1404)

Side by Side Diff: packages/analyzer/lib/src/dart/ast/utilities.dart

Issue 2990843002: Removed fixed dependencies (Closed)
Patch Set: Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library analyzer.src.dart.ast.utilities;
6
7 import 'dart:collection';
8
9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/ast/token.dart';
11 import 'package:analyzer/dart/ast/visitor.dart';
12 import 'package:analyzer/dart/element/element.dart';
13 import 'package:analyzer/exception/exception.dart';
14 import 'package:analyzer/src/dart/ast/ast.dart';
15 import 'package:analyzer/src/dart/ast/token.dart';
16 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
17 import 'package:analyzer/src/generated/java_core.dart';
18 import 'package:analyzer/src/generated/utilities_collection.dart' show TokenMap;
19 import 'package:analyzer/src/generated/utilities_dart.dart';
20
21 /**
22 * An AST visitor that will clone any AST structure that it visits. The cloner
23 * will only clone the structure, it will not preserve any resolution results or
24 * properties associated with the nodes.
25 */
26 class AstCloner implements AstVisitor<AstNode> {
27 /**
28 * A flag indicating whether tokens should be cloned while cloning an AST
29 * structure.
30 */
31 final bool cloneTokens;
32
33 /**
34 * Mapping from original tokes to cloned.
35 */
36 final Map<Token, Token> _clonedTokens = new Map<Token, Token>.identity();
37
38 /**
39 * The next original token to clone.
40 */
41 Token _nextToClone;
42
43 /**
44 * The last cloned token.
45 */
46 Token _lastCloned;
47
48 /**
49 * The offset of the last cloned token.
50 */
51 int _lastClonedOffset = -1;
52
53 /**
54 * Initialize a newly created AST cloner to optionally clone tokens while
55 * cloning AST nodes if [cloneTokens] is `true`.
56 *
57 * TODO(brianwilkerson) Change this to be a named parameter.
58 */
59 AstCloner([this.cloneTokens = false]);
60
61 /**
62 * Return a clone of the given [node].
63 */
64 AstNode/*=E*/ cloneNode/*<E extends AstNode>*/(AstNode/*=E*/ node) {
65 if (node == null) {
66 return null;
67 }
68 return node.accept(this) as AstNode/*=E*/;
69 }
70
71 /**
72 * Return a list containing cloned versions of the nodes in the given list of
73 * [nodes].
74 */
75 List<AstNode/*=E*/ > cloneNodeList/*<E extends AstNode>*/(List/*<E>*/ nodes) {
76 int count = nodes.length;
77 List/*<E>*/ clonedNodes = new List/*<E>*/();
78 for (int i = 0; i < count; i++) {
79 clonedNodes.add((nodes[i]).accept(this) as AstNode/*=E*/);
80 }
81 return clonedNodes;
82 }
83
84 /**
85 * Clone the given [token] if tokens are supposed to be cloned.
86 */
87 Token cloneToken(Token token) {
88 if (cloneTokens) {
89 if (token == null) {
90 return null;
91 }
92 if (_lastClonedOffset <= token.offset) {
93 _cloneTokens(_nextToClone ?? token, token.offset);
94 }
95 Token clone = _clonedTokens[token];
96 assert(clone != null);
97 return clone;
98 } else {
99 return token;
100 }
101 }
102
103 /**
104 * Clone the given [tokens] if tokens are supposed to be cloned.
105 */
106 List<Token> cloneTokenList(List<Token> tokens) {
107 if (cloneTokens) {
108 return tokens.map(cloneToken).toList();
109 }
110 return tokens;
111 }
112
113 @override
114 AdjacentStrings visitAdjacentStrings(AdjacentStrings node) =>
115 new AdjacentStrings(cloneNodeList(node.strings));
116
117 @override
118 Annotation visitAnnotation(Annotation node) => new Annotation(
119 cloneToken(node.atSign),
120 cloneNode(node.name),
121 cloneToken(node.period),
122 cloneNode(node.constructorName),
123 cloneNode(node.arguments));
124
125 @override
126 ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(
127 cloneToken(node.leftParenthesis),
128 cloneNodeList(node.arguments),
129 cloneToken(node.rightParenthesis));
130
131 @override
132 AsExpression visitAsExpression(AsExpression node) => new AsExpression(
133 cloneNode(node.expression),
134 cloneToken(node.asOperator),
135 cloneNode(node.type));
136
137 @override
138 AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(
139 cloneToken(node.assertKeyword),
140 cloneToken(node.leftParenthesis),
141 cloneNode(node.condition),
142 cloneToken(node.comma),
143 cloneNode(node.message),
144 cloneToken(node.rightParenthesis),
145 cloneToken(node.semicolon));
146
147 @override
148 AssignmentExpression visitAssignmentExpression(AssignmentExpression node) =>
149 new AssignmentExpression(cloneNode(node.leftHandSide),
150 cloneToken(node.operator), cloneNode(node.rightHandSide));
151
152 @override
153 AwaitExpression visitAwaitExpression(AwaitExpression node) =>
154 new AwaitExpression(
155 cloneToken(node.awaitKeyword), cloneNode(node.expression));
156
157 @override
158 BinaryExpression visitBinaryExpression(BinaryExpression node) =>
159 new BinaryExpression(cloneNode(node.leftOperand),
160 cloneToken(node.operator), cloneNode(node.rightOperand));
161
162 @override
163 Block visitBlock(Block node) => new Block(cloneToken(node.leftBracket),
164 cloneNodeList(node.statements), cloneToken(node.rightBracket));
165
166 @override
167 BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) =>
168 new BlockFunctionBody(cloneToken(node.keyword), cloneToken(node.star),
169 cloneNode(node.block));
170
171 @override
172 BooleanLiteral visitBooleanLiteral(BooleanLiteral node) =>
173 new BooleanLiteral(cloneToken(node.literal), node.value);
174
175 @override
176 BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(
177 cloneToken(node.breakKeyword),
178 cloneNode(node.label),
179 cloneToken(node.semicolon));
180
181 @override
182 CascadeExpression visitCascadeExpression(CascadeExpression node) =>
183 new CascadeExpression(
184 cloneNode(node.target), cloneNodeList(node.cascadeSections));
185
186 @override
187 CatchClause visitCatchClause(CatchClause node) => new CatchClause(
188 cloneToken(node.onKeyword),
189 cloneNode(node.exceptionType),
190 cloneToken(node.catchKeyword),
191 cloneToken(node.leftParenthesis),
192 cloneNode(node.exceptionParameter),
193 cloneToken(node.comma),
194 cloneNode(node.stackTraceParameter),
195 cloneToken(node.rightParenthesis),
196 cloneNode(node.body));
197
198 @override
199 ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
200 ClassDeclaration copy = new ClassDeclaration(
201 cloneNode(node.documentationComment),
202 cloneNodeList(node.metadata),
203 cloneToken(node.abstractKeyword),
204 cloneToken(node.classKeyword),
205 cloneNode(node.name),
206 cloneNode(node.typeParameters),
207 cloneNode(node.extendsClause),
208 cloneNode(node.withClause),
209 cloneNode(node.implementsClause),
210 cloneToken(node.leftBracket),
211 cloneNodeList(node.members),
212 cloneToken(node.rightBracket));
213 copy.nativeClause = cloneNode(node.nativeClause);
214 return copy;
215 }
216
217 @override
218 ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) {
219 cloneToken(node.abstractKeyword);
220 return new ClassTypeAlias(
221 cloneNode(node.documentationComment),
222 cloneNodeList(node.metadata),
223 cloneToken(node.typedefKeyword),
224 cloneNode(node.name),
225 cloneNode(node.typeParameters),
226 cloneToken(node.equals),
227 cloneToken(node.abstractKeyword),
228 cloneNode(node.superclass),
229 cloneNode(node.withClause),
230 cloneNode(node.implementsClause),
231 cloneToken(node.semicolon));
232 }
233
234 @override
235 Comment visitComment(Comment node) {
236 if (node.isDocumentation) {
237 return Comment.createDocumentationCommentWithReferences(
238 cloneTokenList(node.tokens), cloneNodeList(node.references));
239 } else if (node.isBlock) {
240 return Comment.createBlockComment(cloneTokenList(node.tokens));
241 }
242 return Comment.createEndOfLineComment(cloneTokenList(node.tokens));
243 }
244
245 @override
246 CommentReference visitCommentReference(CommentReference node) =>
247 new CommentReference(
248 cloneToken(node.newKeyword), cloneNode(node.identifier));
249
250 @override
251 CompilationUnit visitCompilationUnit(CompilationUnit node) {
252 CompilationUnit clone = new CompilationUnit(
253 cloneToken(node.beginToken),
254 cloneNode(node.scriptTag),
255 cloneNodeList(node.directives),
256 cloneNodeList(node.declarations),
257 cloneToken(node.endToken));
258 clone.lineInfo = node.lineInfo;
259 return clone;
260 }
261
262 @override
263 ConditionalExpression visitConditionalExpression(
264 ConditionalExpression node) =>
265 new ConditionalExpression(
266 cloneNode(node.condition),
267 cloneToken(node.question),
268 cloneNode(node.thenExpression),
269 cloneToken(node.colon),
270 cloneNode(node.elseExpression));
271
272 @override
273 Configuration visitConfiguration(Configuration node) => new Configuration(
274 cloneToken(node.ifKeyword),
275 cloneToken(node.leftParenthesis),
276 cloneNode(node.name),
277 cloneToken(node.equalToken),
278 cloneNode(node.value),
279 cloneToken(node.rightParenthesis),
280 cloneNode(node.uri));
281
282 @override
283 ConstructorDeclaration visitConstructorDeclaration(
284 ConstructorDeclaration node) =>
285 new ConstructorDeclaration(
286 cloneNode(node.documentationComment),
287 cloneNodeList(node.metadata),
288 cloneToken(node.externalKeyword),
289 cloneToken(node.constKeyword),
290 cloneToken(node.factoryKeyword),
291 cloneNode(node.returnType),
292 cloneToken(node.period),
293 cloneNode(node.name),
294 cloneNode(node.parameters),
295 cloneToken(node.separator),
296 cloneNodeList(node.initializers),
297 cloneNode(node.redirectedConstructor),
298 cloneNode(node.body));
299
300 @override
301 ConstructorFieldInitializer visitConstructorFieldInitializer(
302 ConstructorFieldInitializer node) =>
303 new ConstructorFieldInitializer(
304 cloneToken(node.thisKeyword),
305 cloneToken(node.period),
306 cloneNode(node.fieldName),
307 cloneToken(node.equals),
308 cloneNode(node.expression));
309
310 @override
311 ConstructorName visitConstructorName(ConstructorName node) =>
312 new ConstructorName(
313 cloneNode(node.type), cloneToken(node.period), cloneNode(node.name));
314
315 @override
316 ContinueStatement visitContinueStatement(ContinueStatement node) =>
317 new ContinueStatement(cloneToken(node.continueKeyword),
318 cloneNode(node.label), cloneToken(node.semicolon));
319
320 @override
321 DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) =>
322 new DeclaredIdentifier(
323 cloneNode(node.documentationComment),
324 cloneNodeList(node.metadata),
325 cloneToken(node.keyword),
326 cloneNode(node.type),
327 cloneNode(node.identifier));
328
329 @override
330 DefaultFormalParameter visitDefaultFormalParameter(
331 DefaultFormalParameter node) =>
332 new DefaultFormalParameter(cloneNode(node.parameter), node.kind,
333 cloneToken(node.separator), cloneNode(node.defaultValue));
334
335 @override
336 DoStatement visitDoStatement(DoStatement node) => new DoStatement(
337 cloneToken(node.doKeyword),
338 cloneNode(node.body),
339 cloneToken(node.whileKeyword),
340 cloneToken(node.leftParenthesis),
341 cloneNode(node.condition),
342 cloneToken(node.rightParenthesis),
343 cloneToken(node.semicolon));
344
345 @override
346 DottedName visitDottedName(DottedName node) =>
347 new DottedName(cloneNodeList(node.components));
348
349 @override
350 DoubleLiteral visitDoubleLiteral(DoubleLiteral node) =>
351 new DoubleLiteral(cloneToken(node.literal), node.value);
352
353 @override
354 EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) =>
355 new EmptyFunctionBody(cloneToken(node.semicolon));
356
357 @override
358 EmptyStatement visitEmptyStatement(EmptyStatement node) =>
359 new EmptyStatement(cloneToken(node.semicolon));
360
361 @override
362 AstNode visitEnumConstantDeclaration(EnumConstantDeclaration node) =>
363 new EnumConstantDeclaration(cloneNode(node.documentationComment),
364 cloneNodeList(node.metadata), cloneNode(node.name));
365
366 @override
367 EnumDeclaration visitEnumDeclaration(EnumDeclaration node) =>
368 new EnumDeclaration(
369 cloneNode(node.documentationComment),
370 cloneNodeList(node.metadata),
371 cloneToken(node.enumKeyword),
372 cloneNode(node.name),
373 cloneToken(node.leftBracket),
374 cloneNodeList(node.constants),
375 cloneToken(node.rightBracket));
376
377 @override
378 ExportDirective visitExportDirective(ExportDirective node) {
379 ExportDirectiveImpl directive = new ExportDirective(
380 cloneNode(node.documentationComment),
381 cloneNodeList(node.metadata),
382 cloneToken(node.keyword),
383 cloneNode(node.uri),
384 cloneNodeList(node.configurations),
385 cloneNodeList(node.combinators),
386 cloneToken(node.semicolon));
387 directive.selectedUriContent = node.selectedUriContent;
388 directive.selectedSource = node.selectedSource;
389 directive.uriSource = node.uriSource;
390 directive.uriContent = node.uriContent;
391 return directive;
392 }
393
394 @override
395 ExpressionFunctionBody visitExpressionFunctionBody(
396 ExpressionFunctionBody node) =>
397 new ExpressionFunctionBody(
398 cloneToken(node.keyword),
399 cloneToken(node.functionDefinition),
400 cloneNode(node.expression),
401 cloneToken(node.semicolon));
402
403 @override
404 ExpressionStatement visitExpressionStatement(ExpressionStatement node) =>
405 new ExpressionStatement(
406 cloneNode(node.expression), cloneToken(node.semicolon));
407
408 @override
409 ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(
410 cloneToken(node.extendsKeyword), cloneNode(node.superclass));
411
412 @override
413 FieldDeclaration visitFieldDeclaration(FieldDeclaration node) =>
414 new FieldDeclaration(
415 cloneNode(node.documentationComment),
416 cloneNodeList(node.metadata),
417 cloneToken(node.staticKeyword),
418 cloneNode(node.fields),
419 cloneToken(node.semicolon));
420
421 @override
422 FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) =>
423 new FieldFormalParameter(
424 cloneNode(node.documentationComment),
425 cloneNodeList(node.metadata),
426 cloneToken(node.keyword),
427 cloneNode(node.type),
428 cloneToken(node.thisKeyword),
429 cloneToken(node.period),
430 cloneNode(node.identifier),
431 cloneNode(node.typeParameters),
432 cloneNode(node.parameters));
433
434 @override
435 ForEachStatement visitForEachStatement(ForEachStatement node) {
436 DeclaredIdentifier loopVariable = node.loopVariable;
437 if (loopVariable == null) {
438 return new ForEachStatement.withReference(
439 cloneToken(node.awaitKeyword),
440 cloneToken(node.forKeyword),
441 cloneToken(node.leftParenthesis),
442 cloneNode(node.identifier),
443 cloneToken(node.inKeyword),
444 cloneNode(node.iterable),
445 cloneToken(node.rightParenthesis),
446 cloneNode(node.body));
447 }
448 return new ForEachStatement.withDeclaration(
449 cloneToken(node.awaitKeyword),
450 cloneToken(node.forKeyword),
451 cloneToken(node.leftParenthesis),
452 cloneNode(loopVariable),
453 cloneToken(node.inKeyword),
454 cloneNode(node.iterable),
455 cloneToken(node.rightParenthesis),
456 cloneNode(node.body));
457 }
458
459 @override
460 FormalParameterList visitFormalParameterList(FormalParameterList node) =>
461 new FormalParameterList(
462 cloneToken(node.leftParenthesis),
463 cloneNodeList(node.parameters),
464 cloneToken(node.leftDelimiter),
465 cloneToken(node.rightDelimiter),
466 cloneToken(node.rightParenthesis));
467
468 @override
469 ForStatement visitForStatement(ForStatement node) => new ForStatement(
470 cloneToken(node.forKeyword),
471 cloneToken(node.leftParenthesis),
472 cloneNode(node.variables),
473 cloneNode(node.initialization),
474 cloneToken(node.leftSeparator),
475 cloneNode(node.condition),
476 cloneToken(node.rightSeparator),
477 cloneNodeList(node.updaters),
478 cloneToken(node.rightParenthesis),
479 cloneNode(node.body));
480
481 @override
482 FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) =>
483 new FunctionDeclaration(
484 cloneNode(node.documentationComment),
485 cloneNodeList(node.metadata),
486 cloneToken(node.externalKeyword),
487 cloneNode(node.returnType),
488 cloneToken(node.propertyKeyword),
489 cloneNode(node.name),
490 cloneNode(node.functionExpression));
491
492 @override
493 FunctionDeclarationStatement visitFunctionDeclarationStatement(
494 FunctionDeclarationStatement node) =>
495 new FunctionDeclarationStatement(cloneNode(node.functionDeclaration));
496
497 @override
498 FunctionExpression visitFunctionExpression(FunctionExpression node) =>
499 new FunctionExpression(cloneNode(node.typeParameters),
500 cloneNode(node.parameters), cloneNode(node.body));
501
502 @override
503 FunctionExpressionInvocation visitFunctionExpressionInvocation(
504 FunctionExpressionInvocation node) =>
505 new FunctionExpressionInvocation(cloneNode(node.function),
506 cloneNode(node.typeArguments), cloneNode(node.argumentList));
507
508 @override
509 FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) =>
510 new FunctionTypeAlias(
511 cloneNode(node.documentationComment),
512 cloneNodeList(node.metadata),
513 cloneToken(node.typedefKeyword),
514 cloneNode(node.returnType),
515 cloneNode(node.name),
516 cloneNode(node.typeParameters),
517 cloneNode(node.parameters),
518 cloneToken(node.semicolon));
519
520 @override
521 FunctionTypedFormalParameter visitFunctionTypedFormalParameter(
522 FunctionTypedFormalParameter node) =>
523 new FunctionTypedFormalParameter(
524 cloneNode(node.documentationComment),
525 cloneNodeList(node.metadata),
526 cloneNode(node.returnType),
527 cloneNode(node.identifier),
528 cloneNode(node.typeParameters),
529 cloneNode(node.parameters));
530
531 @override
532 HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(
533 cloneToken(node.keyword), cloneNodeList(node.hiddenNames));
534
535 @override
536 IfStatement visitIfStatement(IfStatement node) => new IfStatement(
537 cloneToken(node.ifKeyword),
538 cloneToken(node.leftParenthesis),
539 cloneNode(node.condition),
540 cloneToken(node.rightParenthesis),
541 cloneNode(node.thenStatement),
542 cloneToken(node.elseKeyword),
543 cloneNode(node.elseStatement));
544
545 @override
546 ImplementsClause visitImplementsClause(ImplementsClause node) =>
547 new ImplementsClause(
548 cloneToken(node.implementsKeyword), cloneNodeList(node.interfaces));
549
550 @override
551 ImportDirective visitImportDirective(ImportDirective node) {
552 ImportDirectiveImpl directive = new ImportDirective(
553 cloneNode(node.documentationComment),
554 cloneNodeList(node.metadata),
555 cloneToken(node.keyword),
556 cloneNode(node.uri),
557 cloneNodeList(node.configurations),
558 cloneToken(node.deferredKeyword),
559 cloneToken(node.asKeyword),
560 cloneNode(node.prefix),
561 cloneNodeList(node.combinators),
562 cloneToken(node.semicolon));
563 directive.selectedUriContent = node.selectedUriContent;
564 directive.selectedSource = node.selectedSource;
565 directive.uriSource = node.uriSource;
566 directive.uriContent = node.uriContent;
567 return directive;
568 }
569
570 @override
571 IndexExpression visitIndexExpression(IndexExpression node) {
572 Token period = node.period;
573 if (period == null) {
574 return new IndexExpression.forTarget(
575 cloneNode(node.target),
576 cloneToken(node.leftBracket),
577 cloneNode(node.index),
578 cloneToken(node.rightBracket));
579 } else {
580 return new IndexExpression.forCascade(
581 cloneToken(period),
582 cloneToken(node.leftBracket),
583 cloneNode(node.index),
584 cloneToken(node.rightBracket));
585 }
586 }
587
588 @override
589 InstanceCreationExpression visitInstanceCreationExpression(
590 InstanceCreationExpression node) =>
591 new InstanceCreationExpression(cloneToken(node.keyword),
592 cloneNode(node.constructorName), cloneNode(node.argumentList));
593
594 @override
595 IntegerLiteral visitIntegerLiteral(IntegerLiteral node) =>
596 new IntegerLiteral(cloneToken(node.literal), node.value);
597
598 @override
599 InterpolationExpression visitInterpolationExpression(
600 InterpolationExpression node) =>
601 new InterpolationExpression(cloneToken(node.leftBracket),
602 cloneNode(node.expression), cloneToken(node.rightBracket));
603
604 @override
605 InterpolationString visitInterpolationString(InterpolationString node) =>
606 new InterpolationString(cloneToken(node.contents), node.value);
607
608 @override
609 IsExpression visitIsExpression(IsExpression node) => new IsExpression(
610 cloneNode(node.expression),
611 cloneToken(node.isOperator),
612 cloneToken(node.notOperator),
613 cloneNode(node.type));
614
615 @override
616 Label visitLabel(Label node) =>
617 new Label(cloneNode(node.label), cloneToken(node.colon));
618
619 @override
620 LabeledStatement visitLabeledStatement(LabeledStatement node) =>
621 new LabeledStatement(
622 cloneNodeList(node.labels), cloneNode(node.statement));
623
624 @override
625 LibraryDirective visitLibraryDirective(LibraryDirective node) =>
626 new LibraryDirective(
627 cloneNode(node.documentationComment),
628 cloneNodeList(node.metadata),
629 cloneToken(node.libraryKeyword),
630 cloneNode(node.name),
631 cloneToken(node.semicolon));
632
633 @override
634 LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) =>
635 new LibraryIdentifier(cloneNodeList(node.components));
636
637 @override
638 ListLiteral visitListLiteral(ListLiteral node) => new ListLiteral(
639 cloneToken(node.constKeyword),
640 cloneNode(node.typeArguments),
641 cloneToken(node.leftBracket),
642 cloneNodeList(node.elements),
643 cloneToken(node.rightBracket));
644
645 @override
646 MapLiteral visitMapLiteral(MapLiteral node) => new MapLiteral(
647 cloneToken(node.constKeyword),
648 cloneNode(node.typeArguments),
649 cloneToken(node.leftBracket),
650 cloneNodeList(node.entries),
651 cloneToken(node.rightBracket));
652
653 @override
654 MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) =>
655 new MapLiteralEntry(cloneNode(node.key), cloneToken(node.separator),
656 cloneNode(node.value));
657
658 @override
659 MethodDeclaration visitMethodDeclaration(MethodDeclaration node) =>
660 new MethodDeclaration(
661 cloneNode(node.documentationComment),
662 cloneNodeList(node.metadata),
663 cloneToken(node.externalKeyword),
664 cloneToken(node.modifierKeyword),
665 cloneNode(node.returnType),
666 cloneToken(node.propertyKeyword),
667 cloneToken(node.operatorKeyword),
668 cloneNode(node.name),
669 cloneNode(node.typeParameters),
670 cloneNode(node.parameters),
671 cloneNode(node.body));
672
673 @override
674 MethodInvocation visitMethodInvocation(MethodInvocation node) =>
675 new MethodInvocation(
676 cloneNode(node.target),
677 cloneToken(node.operator),
678 cloneNode(node.methodName),
679 cloneNode(node.typeArguments),
680 cloneNode(node.argumentList));
681
682 @override
683 NamedExpression visitNamedExpression(NamedExpression node) =>
684 new NamedExpression(cloneNode(node.name), cloneNode(node.expression));
685
686 @override
687 AstNode visitNativeClause(NativeClause node) =>
688 new NativeClause(cloneToken(node.nativeKeyword), cloneNode(node.name));
689
690 @override
691 NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) =>
692 new NativeFunctionBody(cloneToken(node.nativeKeyword),
693 cloneNode(node.stringLiteral), cloneToken(node.semicolon));
694
695 @override
696 NullLiteral visitNullLiteral(NullLiteral node) =>
697 new NullLiteral(cloneToken(node.literal));
698
699 @override
700 ParenthesizedExpression visitParenthesizedExpression(
701 ParenthesizedExpression node) =>
702 new ParenthesizedExpression(cloneToken(node.leftParenthesis),
703 cloneNode(node.expression), cloneToken(node.rightParenthesis));
704
705 @override
706 PartDirective visitPartDirective(PartDirective node) {
707 PartDirective directive = new PartDirective(
708 cloneNode(node.documentationComment),
709 cloneNodeList(node.metadata),
710 cloneToken(node.partKeyword),
711 cloneNode(node.uri),
712 cloneToken(node.semicolon));
713 directive.uriSource = node.uriSource;
714 directive.uriContent = node.uriContent;
715 return directive;
716 }
717
718 @override
719 PartOfDirective visitPartOfDirective(PartOfDirective node) =>
720 new PartOfDirective(
721 cloneNode(node.documentationComment),
722 cloneNodeList(node.metadata),
723 cloneToken(node.partKeyword),
724 cloneToken(node.ofKeyword),
725 cloneNode(node.libraryName),
726 cloneToken(node.semicolon));
727
728 @override
729 PostfixExpression visitPostfixExpression(PostfixExpression node) =>
730 new PostfixExpression(cloneNode(node.operand), cloneToken(node.operator));
731
732 @override
733 PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) =>
734 new PrefixedIdentifier(cloneNode(node.prefix), cloneToken(node.period),
735 cloneNode(node.identifier));
736
737 @override
738 PrefixExpression visitPrefixExpression(PrefixExpression node) =>
739 new PrefixExpression(cloneToken(node.operator), cloneNode(node.operand));
740
741 @override
742 PropertyAccess visitPropertyAccess(PropertyAccess node) => new PropertyAccess(
743 cloneNode(node.target),
744 cloneToken(node.operator),
745 cloneNode(node.propertyName));
746
747 @override
748 RedirectingConstructorInvocation visitRedirectingConstructorInvocation(
749 RedirectingConstructorInvocation node) =>
750 new RedirectingConstructorInvocation(
751 cloneToken(node.thisKeyword),
752 cloneToken(node.period),
753 cloneNode(node.constructorName),
754 cloneNode(node.argumentList));
755
756 @override
757 RethrowExpression visitRethrowExpression(RethrowExpression node) =>
758 new RethrowExpression(cloneToken(node.rethrowKeyword));
759
760 @override
761 ReturnStatement visitReturnStatement(ReturnStatement node) =>
762 new ReturnStatement(cloneToken(node.returnKeyword),
763 cloneNode(node.expression), cloneToken(node.semicolon));
764
765 @override
766 ScriptTag visitScriptTag(ScriptTag node) =>
767 new ScriptTag(cloneToken(node.scriptTag));
768
769 @override
770 ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(
771 cloneToken(node.keyword), cloneNodeList(node.shownNames));
772
773 @override
774 SimpleFormalParameter visitSimpleFormalParameter(
775 SimpleFormalParameter node) =>
776 new SimpleFormalParameter(
777 cloneNode(node.documentationComment),
778 cloneNodeList(node.metadata),
779 cloneToken(node.keyword),
780 cloneNode(node.type),
781 cloneNode(node.identifier));
782
783 @override
784 SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) =>
785 new SimpleIdentifier(cloneToken(node.token),
786 isDeclaration: node.inDeclarationContext());
787
788 @override
789 SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) =>
790 new SimpleStringLiteral(cloneToken(node.literal), node.value);
791
792 @override
793 StringInterpolation visitStringInterpolation(StringInterpolation node) =>
794 new StringInterpolation(cloneNodeList(node.elements));
795
796 @override
797 SuperConstructorInvocation visitSuperConstructorInvocation(
798 SuperConstructorInvocation node) =>
799 new SuperConstructorInvocation(
800 cloneToken(node.superKeyword),
801 cloneToken(node.period),
802 cloneNode(node.constructorName),
803 cloneNode(node.argumentList));
804
805 @override
806 SuperExpression visitSuperExpression(SuperExpression node) =>
807 new SuperExpression(cloneToken(node.superKeyword));
808
809 @override
810 SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(
811 cloneNodeList(node.labels),
812 cloneToken(node.keyword),
813 cloneNode(node.expression),
814 cloneToken(node.colon),
815 cloneNodeList(node.statements));
816
817 @override
818 SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(
819 cloneNodeList(node.labels),
820 cloneToken(node.keyword),
821 cloneToken(node.colon),
822 cloneNodeList(node.statements));
823
824 @override
825 SwitchStatement visitSwitchStatement(SwitchStatement node) =>
826 new SwitchStatement(
827 cloneToken(node.switchKeyword),
828 cloneToken(node.leftParenthesis),
829 cloneNode(node.expression),
830 cloneToken(node.rightParenthesis),
831 cloneToken(node.leftBracket),
832 cloneNodeList(node.members),
833 cloneToken(node.rightBracket));
834
835 @override
836 SymbolLiteral visitSymbolLiteral(SymbolLiteral node) => new SymbolLiteral(
837 cloneToken(node.poundSign), cloneTokenList(node.components));
838
839 @override
840 ThisExpression visitThisExpression(ThisExpression node) =>
841 new ThisExpression(cloneToken(node.thisKeyword));
842
843 @override
844 ThrowExpression visitThrowExpression(ThrowExpression node) =>
845 new ThrowExpression(
846 cloneToken(node.throwKeyword), cloneNode(node.expression));
847
848 @override
849 TopLevelVariableDeclaration visitTopLevelVariableDeclaration(
850 TopLevelVariableDeclaration node) =>
851 new TopLevelVariableDeclaration(
852 cloneNode(node.documentationComment),
853 cloneNodeList(node.metadata),
854 cloneNode(node.variables),
855 cloneToken(node.semicolon));
856
857 @override
858 TryStatement visitTryStatement(TryStatement node) => new TryStatement(
859 cloneToken(node.tryKeyword),
860 cloneNode(node.body),
861 cloneNodeList(node.catchClauses),
862 cloneToken(node.finallyKeyword),
863 cloneNode(node.finallyBlock));
864
865 @override
866 TypeArgumentList visitTypeArgumentList(TypeArgumentList node) =>
867 new TypeArgumentList(cloneToken(node.leftBracket),
868 cloneNodeList(node.arguments), cloneToken(node.rightBracket));
869
870 @override
871 TypeName visitTypeName(TypeName node) =>
872 new TypeName(cloneNode(node.name), cloneNode(node.typeArguments));
873
874 @override
875 TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(
876 cloneNode(node.documentationComment),
877 cloneNodeList(node.metadata),
878 cloneNode(node.name),
879 cloneToken(node.extendsKeyword),
880 cloneNode(node.bound));
881
882 @override
883 TypeParameterList visitTypeParameterList(TypeParameterList node) =>
884 new TypeParameterList(cloneToken(node.leftBracket),
885 cloneNodeList(node.typeParameters), cloneToken(node.rightBracket));
886
887 @override
888 VariableDeclaration visitVariableDeclaration(VariableDeclaration node) =>
889 new VariableDeclaration(cloneNode(node.name), cloneToken(node.equals),
890 cloneNode(node.initializer));
891
892 @override
893 VariableDeclarationList visitVariableDeclarationList(
894 VariableDeclarationList node) =>
895 new VariableDeclarationList(
896 cloneNode(node.documentationComment),
897 cloneNodeList(node.metadata),
898 cloneToken(node.keyword),
899 cloneNode(node.type),
900 cloneNodeList(node.variables));
901
902 @override
903 VariableDeclarationStatement visitVariableDeclarationStatement(
904 VariableDeclarationStatement node) =>
905 new VariableDeclarationStatement(
906 cloneNode(node.variables), cloneToken(node.semicolon));
907
908 @override
909 WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(
910 cloneToken(node.whileKeyword),
911 cloneToken(node.leftParenthesis),
912 cloneNode(node.condition),
913 cloneToken(node.rightParenthesis),
914 cloneNode(node.body));
915
916 @override
917 WithClause visitWithClause(WithClause node) => new WithClause(
918 cloneToken(node.withKeyword), cloneNodeList(node.mixinTypes));
919
920 @override
921 YieldStatement visitYieldStatement(YieldStatement node) => new YieldStatement(
922 cloneToken(node.yieldKeyword),
923 cloneToken(node.star),
924 cloneNode(node.expression),
925 cloneToken(node.semicolon));
926
927 /**
928 * Clone all token starting from the given [token] up to a token that has
929 * offset greater then [stopAfter], and put mapping from originals to clones
930 * into [_clonedTokens].
931 *
932 * We cannot clone tokens as we visit nodes because not every token is a part
933 * of a node, E.g. commas in argument lists are not represented in AST. But
934 * we need to the sequence of tokens that is identical to the original one.
935 */
936 void _cloneTokens(Token token, int stopAfter) {
937 if (token == null) {
938 return;
939 }
940 Token nonComment(Token token) {
941 return token is CommentToken ? token.parent : token;
942 }
943
944 token = nonComment(token);
945 if (_lastCloned == null) {
946 _lastCloned = new Token(TokenType.EOF, -1);
947 _lastCloned.setNext(_lastCloned);
948 }
949 while (token != null) {
950 Token clone = token.copy();
951 {
952 CommentToken c1 = token.precedingComments;
953 CommentToken c2 = clone.precedingComments;
954 while (c1 != null && c2 != null) {
955 _clonedTokens[c1] = c2;
956 if (c1 is DocumentationCommentToken &&
957 c2 is DocumentationCommentToken) {
958 for (int i = 0; i < c1.references.length; i++) {
959 _clonedTokens[c1.references[i]] = c2.references[i];
960 }
961 }
962 c1 = c1.next;
963 c2 = c2.next;
964 }
965 }
966 _clonedTokens[token] = clone;
967 _lastCloned.setNext(clone);
968 _lastCloned = clone;
969 if (token.type == TokenType.EOF) {
970 break;
971 }
972 if (token.offset > stopAfter) {
973 _nextToClone = token.next;
974 _lastClonedOffset = token.offset;
975 break;
976 }
977 token = token.next;
978 }
979 }
980
981 /**
982 * Return a clone of the given [node].
983 */
984 static AstNode clone(AstNode node) {
985 return node.accept(new AstCloner());
986 }
987 }
988
989 /**
990 * An AstVisitor that compares the structure of two AstNodes to see whether they
991 * are equal.
992 */
993 class AstComparator implements AstVisitor<bool> {
994 /**
995 * The AST node with which the node being visited is to be compared. This is
996 * only valid at the beginning of each visit method (until [isEqualNodes] is
997 * invoked).
998 */
999 AstNode _other;
1000
1001 /**
1002 * Notify that [first] and second have different length.
1003 * This implementation returns `false`. Subclasses can override and throw.
1004 */
1005 bool failDifferentLength(List first, List second) {
1006 return false;
1007 }
1008
1009 /**
1010 * Check whether [second] is null. Subclasses can override to throw.
1011 */
1012 bool failIfNotNull(Object first, Object second) {
1013 return second == null;
1014 }
1015
1016 /**
1017 * Notify that [first] is not `null` while [second] one is `null`.
1018 * This implementation returns `false`. Subclasses can override and throw.
1019 */
1020 bool failIsNull(Object first, Object second) {
1021 return false;
1022 }
1023
1024 /**
1025 * Notify that [first] and [second] have different types.
1026 * This implementation returns `false`. Subclasses can override and throw.
1027 */
1028 bool failRuntimeType(Object first, Object second) {
1029 return false;
1030 }
1031
1032 /**
1033 * Return `true` if the [first] node and the [second] node have the same
1034 * structure.
1035 *
1036 * *Note:* This method is only visible for testing purposes and should not be
1037 * used by clients.
1038 */
1039 bool isEqualNodes(AstNode first, AstNode second) {
1040 if (first == null) {
1041 return failIfNotNull(first, second);
1042 } else if (second == null) {
1043 return failIsNull(first, second);
1044 } else if (first.runtimeType != second.runtimeType) {
1045 return failRuntimeType(first, second);
1046 }
1047 _other = second;
1048 return first.accept(this);
1049 }
1050
1051 /**
1052 * Return `true` if the [first] token and the [second] token have the same
1053 * structure.
1054 *
1055 * *Note:* This method is only visible for testing purposes and should not be
1056 * used by clients.
1057 */
1058 bool isEqualTokens(Token first, Token second) {
1059 if (first == null) {
1060 return failIfNotNull(first, second);
1061 } else if (second == null) {
1062 return failIsNull(first, second);
1063 } else if (identical(first, second)) {
1064 return true;
1065 }
1066 return isEqualTokensNotNull(first, second);
1067 }
1068
1069 /**
1070 * Return `true` if the [first] token and the [second] token have the same
1071 * structure. Both [first] and [second] are not `null`.
1072 */
1073 bool isEqualTokensNotNull(Token first, Token second) =>
1074 first.offset == second.offset &&
1075 first.length == second.length &&
1076 first.lexeme == second.lexeme;
1077
1078 @override
1079 bool visitAdjacentStrings(AdjacentStrings node) {
1080 AdjacentStrings other = _other as AdjacentStrings;
1081 return _isEqualNodeLists(node.strings, other.strings);
1082 }
1083
1084 @override
1085 bool visitAnnotation(Annotation node) {
1086 Annotation other = _other as Annotation;
1087 return isEqualTokens(node.atSign, other.atSign) &&
1088 isEqualNodes(node.name, other.name) &&
1089 isEqualTokens(node.period, other.period) &&
1090 isEqualNodes(node.constructorName, other.constructorName) &&
1091 isEqualNodes(node.arguments, other.arguments);
1092 }
1093
1094 @override
1095 bool visitArgumentList(ArgumentList node) {
1096 ArgumentList other = _other as ArgumentList;
1097 return isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
1098 _isEqualNodeLists(node.arguments, other.arguments) &&
1099 isEqualTokens(node.rightParenthesis, other.rightParenthesis);
1100 }
1101
1102 @override
1103 bool visitAsExpression(AsExpression node) {
1104 AsExpression other = _other as AsExpression;
1105 return isEqualNodes(node.expression, other.expression) &&
1106 isEqualTokens(node.asOperator, other.asOperator) &&
1107 isEqualNodes(node.type, other.type);
1108 }
1109
1110 @override
1111 bool visitAssertStatement(AssertStatement node) {
1112 AssertStatement other = _other as AssertStatement;
1113 return isEqualTokens(node.assertKeyword, other.assertKeyword) &&
1114 isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
1115 isEqualNodes(node.condition, other.condition) &&
1116 isEqualTokens(node.comma, other.comma) &&
1117 isEqualNodes(node.message, other.message) &&
1118 isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
1119 isEqualTokens(node.semicolon, other.semicolon);
1120 }
1121
1122 @override
1123 bool visitAssignmentExpression(AssignmentExpression node) {
1124 AssignmentExpression other = _other as AssignmentExpression;
1125 return isEqualNodes(node.leftHandSide, other.leftHandSide) &&
1126 isEqualTokens(node.operator, other.operator) &&
1127 isEqualNodes(node.rightHandSide, other.rightHandSide);
1128 }
1129
1130 @override
1131 bool visitAwaitExpression(AwaitExpression node) {
1132 AwaitExpression other = _other as AwaitExpression;
1133 return isEqualTokens(node.awaitKeyword, other.awaitKeyword) &&
1134 isEqualNodes(node.expression, other.expression);
1135 }
1136
1137 @override
1138 bool visitBinaryExpression(BinaryExpression node) {
1139 BinaryExpression other = _other as BinaryExpression;
1140 return isEqualNodes(node.leftOperand, other.leftOperand) &&
1141 isEqualTokens(node.operator, other.operator) &&
1142 isEqualNodes(node.rightOperand, other.rightOperand);
1143 }
1144
1145 @override
1146 bool visitBlock(Block node) {
1147 Block other = _other as Block;
1148 return isEqualTokens(node.leftBracket, other.leftBracket) &&
1149 _isEqualNodeLists(node.statements, other.statements) &&
1150 isEqualTokens(node.rightBracket, other.rightBracket);
1151 }
1152
1153 @override
1154 bool visitBlockFunctionBody(BlockFunctionBody node) {
1155 BlockFunctionBody other = _other as BlockFunctionBody;
1156 return isEqualNodes(node.block, other.block);
1157 }
1158
1159 @override
1160 bool visitBooleanLiteral(BooleanLiteral node) {
1161 BooleanLiteral other = _other as BooleanLiteral;
1162 return isEqualTokens(node.literal, other.literal) &&
1163 node.value == other.value;
1164 }
1165
1166 @override
1167 bool visitBreakStatement(BreakStatement node) {
1168 BreakStatement other = _other as BreakStatement;
1169 return isEqualTokens(node.breakKeyword, other.breakKeyword) &&
1170 isEqualNodes(node.label, other.label) &&
1171 isEqualTokens(node.semicolon, other.semicolon);
1172 }
1173
1174 @override
1175 bool visitCascadeExpression(CascadeExpression node) {
1176 CascadeExpression other = _other as CascadeExpression;
1177 return isEqualNodes(node.target, other.target) &&
1178 _isEqualNodeLists(node.cascadeSections, other.cascadeSections);
1179 }
1180
1181 @override
1182 bool visitCatchClause(CatchClause node) {
1183 CatchClause other = _other as CatchClause;
1184 return isEqualTokens(node.onKeyword, other.onKeyword) &&
1185 isEqualNodes(node.exceptionType, other.exceptionType) &&
1186 isEqualTokens(node.catchKeyword, other.catchKeyword) &&
1187 isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
1188 isEqualNodes(node.exceptionParameter, other.exceptionParameter) &&
1189 isEqualTokens(node.comma, other.comma) &&
1190 isEqualNodes(node.stackTraceParameter, other.stackTraceParameter) &&
1191 isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
1192 isEqualNodes(node.body, other.body);
1193 }
1194
1195 @override
1196 bool visitClassDeclaration(ClassDeclaration node) {
1197 ClassDeclaration other = _other as ClassDeclaration;
1198 return isEqualNodes(
1199 node.documentationComment, other.documentationComment) &&
1200 _isEqualNodeLists(node.metadata, other.metadata) &&
1201 isEqualTokens(node.abstractKeyword, other.abstractKeyword) &&
1202 isEqualTokens(node.classKeyword, other.classKeyword) &&
1203 isEqualNodes(node.name, other.name) &&
1204 isEqualNodes(node.typeParameters, other.typeParameters) &&
1205 isEqualNodes(node.extendsClause, other.extendsClause) &&
1206 isEqualNodes(node.withClause, other.withClause) &&
1207 isEqualNodes(node.implementsClause, other.implementsClause) &&
1208 isEqualTokens(node.leftBracket, other.leftBracket) &&
1209 _isEqualNodeLists(node.members, other.members) &&
1210 isEqualTokens(node.rightBracket, other.rightBracket);
1211 }
1212
1213 @override
1214 bool visitClassTypeAlias(ClassTypeAlias node) {
1215 ClassTypeAlias other = _other as ClassTypeAlias;
1216 return isEqualNodes(
1217 node.documentationComment, other.documentationComment) &&
1218 _isEqualNodeLists(node.metadata, other.metadata) &&
1219 isEqualTokens(node.typedefKeyword, other.typedefKeyword) &&
1220 isEqualNodes(node.name, other.name) &&
1221 isEqualNodes(node.typeParameters, other.typeParameters) &&
1222 isEqualTokens(node.equals, other.equals) &&
1223 isEqualTokens(node.abstractKeyword, other.abstractKeyword) &&
1224 isEqualNodes(node.superclass, other.superclass) &&
1225 isEqualNodes(node.withClause, other.withClause) &&
1226 isEqualNodes(node.implementsClause, other.implementsClause) &&
1227 isEqualTokens(node.semicolon, other.semicolon);
1228 }
1229
1230 @override
1231 bool visitComment(Comment node) {
1232 Comment other = _other as Comment;
1233 return _isEqualNodeLists(node.references, other.references);
1234 }
1235
1236 @override
1237 bool visitCommentReference(CommentReference node) {
1238 CommentReference other = _other as CommentReference;
1239 return isEqualTokens(node.newKeyword, other.newKeyword) &&
1240 isEqualNodes(node.identifier, other.identifier);
1241 }
1242
1243 @override
1244 bool visitCompilationUnit(CompilationUnit node) {
1245 CompilationUnit other = _other as CompilationUnit;
1246 return isEqualTokens(node.beginToken, other.beginToken) &&
1247 isEqualNodes(node.scriptTag, other.scriptTag) &&
1248 _isEqualNodeLists(node.directives, other.directives) &&
1249 _isEqualNodeLists(node.declarations, other.declarations) &&
1250 isEqualTokens(node.endToken, other.endToken);
1251 }
1252
1253 @override
1254 bool visitConditionalExpression(ConditionalExpression node) {
1255 ConditionalExpression other = _other as ConditionalExpression;
1256 return isEqualNodes(node.condition, other.condition) &&
1257 isEqualTokens(node.question, other.question) &&
1258 isEqualNodes(node.thenExpression, other.thenExpression) &&
1259 isEqualTokens(node.colon, other.colon) &&
1260 isEqualNodes(node.elseExpression, other.elseExpression);
1261 }
1262
1263 @override
1264 bool visitConfiguration(Configuration node) {
1265 Configuration other = _other as Configuration;
1266 return isEqualTokens(node.ifKeyword, other.ifKeyword) &&
1267 isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
1268 isEqualNodes(node.name, other.name) &&
1269 isEqualTokens(node.equalToken, other.equalToken) &&
1270 isEqualNodes(node.value, other.value) &&
1271 isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
1272 isEqualNodes(node.uri, other.uri);
1273 }
1274
1275 @override
1276 bool visitConstructorDeclaration(ConstructorDeclaration node) {
1277 ConstructorDeclaration other = _other as ConstructorDeclaration;
1278 return isEqualNodes(
1279 node.documentationComment, other.documentationComment) &&
1280 _isEqualNodeLists(node.metadata, other.metadata) &&
1281 isEqualTokens(node.externalKeyword, other.externalKeyword) &&
1282 isEqualTokens(node.constKeyword, other.constKeyword) &&
1283 isEqualTokens(node.factoryKeyword, other.factoryKeyword) &&
1284 isEqualNodes(node.returnType, other.returnType) &&
1285 isEqualTokens(node.period, other.period) &&
1286 isEqualNodes(node.name, other.name) &&
1287 isEqualNodes(node.parameters, other.parameters) &&
1288 isEqualTokens(node.separator, other.separator) &&
1289 _isEqualNodeLists(node.initializers, other.initializers) &&
1290 isEqualNodes(node.redirectedConstructor, other.redirectedConstructor) &&
1291 isEqualNodes(node.body, other.body);
1292 }
1293
1294 @override
1295 bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
1296 ConstructorFieldInitializer other = _other as ConstructorFieldInitializer;
1297 return isEqualTokens(node.thisKeyword, other.thisKeyword) &&
1298 isEqualTokens(node.period, other.period) &&
1299 isEqualNodes(node.fieldName, other.fieldName) &&
1300 isEqualTokens(node.equals, other.equals) &&
1301 isEqualNodes(node.expression, other.expression);
1302 }
1303
1304 @override
1305 bool visitConstructorName(ConstructorName node) {
1306 ConstructorName other = _other as ConstructorName;
1307 return isEqualNodes(node.type, other.type) &&
1308 isEqualTokens(node.period, other.period) &&
1309 isEqualNodes(node.name, other.name);
1310 }
1311
1312 @override
1313 bool visitContinueStatement(ContinueStatement node) {
1314 ContinueStatement other = _other as ContinueStatement;
1315 return isEqualTokens(node.continueKeyword, other.continueKeyword) &&
1316 isEqualNodes(node.label, other.label) &&
1317 isEqualTokens(node.semicolon, other.semicolon);
1318 }
1319
1320 @override
1321 bool visitDeclaredIdentifier(DeclaredIdentifier node) {
1322 DeclaredIdentifier other = _other as DeclaredIdentifier;
1323 return isEqualNodes(
1324 node.documentationComment, other.documentationComment) &&
1325 _isEqualNodeLists(node.metadata, other.metadata) &&
1326 isEqualTokens(node.keyword, other.keyword) &&
1327 isEqualNodes(node.type, other.type) &&
1328 isEqualNodes(node.identifier, other.identifier);
1329 }
1330
1331 @override
1332 bool visitDefaultFormalParameter(DefaultFormalParameter node) {
1333 DefaultFormalParameter other = _other as DefaultFormalParameter;
1334 return isEqualNodes(node.parameter, other.parameter) &&
1335 node.kind == other.kind &&
1336 isEqualTokens(node.separator, other.separator) &&
1337 isEqualNodes(node.defaultValue, other.defaultValue);
1338 }
1339
1340 @override
1341 bool visitDoStatement(DoStatement node) {
1342 DoStatement other = _other as DoStatement;
1343 return isEqualTokens(node.doKeyword, other.doKeyword) &&
1344 isEqualNodes(node.body, other.body) &&
1345 isEqualTokens(node.whileKeyword, other.whileKeyword) &&
1346 isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
1347 isEqualNodes(node.condition, other.condition) &&
1348 isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
1349 isEqualTokens(node.semicolon, other.semicolon);
1350 }
1351
1352 @override
1353 bool visitDottedName(DottedName node) {
1354 DottedName other = _other as DottedName;
1355 return _isEqualNodeLists(node.components, other.components);
1356 }
1357
1358 @override
1359 bool visitDoubleLiteral(DoubleLiteral node) {
1360 DoubleLiteral other = _other as DoubleLiteral;
1361 return isEqualTokens(node.literal, other.literal) &&
1362 node.value == other.value;
1363 }
1364
1365 @override
1366 bool visitEmptyFunctionBody(EmptyFunctionBody node) {
1367 EmptyFunctionBody other = _other as EmptyFunctionBody;
1368 return isEqualTokens(node.semicolon, other.semicolon);
1369 }
1370
1371 @override
1372 bool visitEmptyStatement(EmptyStatement node) {
1373 EmptyStatement other = _other as EmptyStatement;
1374 return isEqualTokens(node.semicolon, other.semicolon);
1375 }
1376
1377 @override
1378 bool visitEnumConstantDeclaration(EnumConstantDeclaration node) {
1379 EnumConstantDeclaration other = _other as EnumConstantDeclaration;
1380 return isEqualNodes(
1381 node.documentationComment, other.documentationComment) &&
1382 _isEqualNodeLists(node.metadata, other.metadata) &&
1383 isEqualNodes(node.name, other.name);
1384 }
1385
1386 @override
1387 bool visitEnumDeclaration(EnumDeclaration node) {
1388 EnumDeclaration other = _other as EnumDeclaration;
1389 return isEqualNodes(
1390 node.documentationComment, other.documentationComment) &&
1391 _isEqualNodeLists(node.metadata, other.metadata) &&
1392 isEqualTokens(node.enumKeyword, other.enumKeyword) &&
1393 isEqualNodes(node.name, other.name) &&
1394 isEqualTokens(node.leftBracket, other.leftBracket) &&
1395 _isEqualNodeLists(node.constants, other.constants) &&
1396 isEqualTokens(node.rightBracket, other.rightBracket);
1397 }
1398
1399 @override
1400 bool visitExportDirective(ExportDirective node) {
1401 ExportDirective other = _other as ExportDirective;
1402 return isEqualNodes(
1403 node.documentationComment, other.documentationComment) &&
1404 _isEqualNodeLists(node.metadata, other.metadata) &&
1405 isEqualTokens(node.keyword, other.keyword) &&
1406 isEqualNodes(node.uri, other.uri) &&
1407 _isEqualNodeLists(node.combinators, other.combinators) &&
1408 isEqualTokens(node.semicolon, other.semicolon);
1409 }
1410
1411 @override
1412 bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
1413 ExpressionFunctionBody other = _other as ExpressionFunctionBody;
1414 return isEqualTokens(node.functionDefinition, other.functionDefinition) &&
1415 isEqualNodes(node.expression, other.expression) &&
1416 isEqualTokens(node.semicolon, other.semicolon);
1417 }
1418
1419 @override
1420 bool visitExpressionStatement(ExpressionStatement node) {
1421 ExpressionStatement other = _other as ExpressionStatement;
1422 return isEqualNodes(node.expression, other.expression) &&
1423 isEqualTokens(node.semicolon, other.semicolon);
1424 }
1425
1426 @override
1427 bool visitExtendsClause(ExtendsClause node) {
1428 ExtendsClause other = _other as ExtendsClause;
1429 return isEqualTokens(node.extendsKeyword, other.extendsKeyword) &&
1430 isEqualNodes(node.superclass, other.superclass);
1431 }
1432
1433 @override
1434 bool visitFieldDeclaration(FieldDeclaration node) {
1435 FieldDeclaration other = _other as FieldDeclaration;
1436 return isEqualNodes(
1437 node.documentationComment, other.documentationComment) &&
1438 _isEqualNodeLists(node.metadata, other.metadata) &&
1439 isEqualTokens(node.staticKeyword, other.staticKeyword) &&
1440 isEqualNodes(node.fields, other.fields) &&
1441 isEqualTokens(node.semicolon, other.semicolon);
1442 }
1443
1444 @override
1445 bool visitFieldFormalParameter(FieldFormalParameter node) {
1446 FieldFormalParameter other = _other as FieldFormalParameter;
1447 return isEqualNodes(
1448 node.documentationComment, other.documentationComment) &&
1449 _isEqualNodeLists(node.metadata, other.metadata) &&
1450 isEqualTokens(node.keyword, other.keyword) &&
1451 isEqualNodes(node.type, other.type) &&
1452 isEqualTokens(node.thisKeyword, other.thisKeyword) &&
1453 isEqualTokens(node.period, other.period) &&
1454 isEqualNodes(node.identifier, other.identifier);
1455 }
1456
1457 @override
1458 bool visitForEachStatement(ForEachStatement node) {
1459 ForEachStatement other = _other as ForEachStatement;
1460 return isEqualTokens(node.forKeyword, other.forKeyword) &&
1461 isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
1462 isEqualNodes(node.loopVariable, other.loopVariable) &&
1463 isEqualTokens(node.inKeyword, other.inKeyword) &&
1464 isEqualNodes(node.iterable, other.iterable) &&
1465 isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
1466 isEqualNodes(node.body, other.body);
1467 }
1468
1469 @override
1470 bool visitFormalParameterList(FormalParameterList node) {
1471 FormalParameterList other = _other as FormalParameterList;
1472 return isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
1473 _isEqualNodeLists(node.parameters, other.parameters) &&
1474 isEqualTokens(node.leftDelimiter, other.leftDelimiter) &&
1475 isEqualTokens(node.rightDelimiter, other.rightDelimiter) &&
1476 isEqualTokens(node.rightParenthesis, other.rightParenthesis);
1477 }
1478
1479 @override
1480 bool visitForStatement(ForStatement node) {
1481 ForStatement other = _other as ForStatement;
1482 return isEqualTokens(node.forKeyword, other.forKeyword) &&
1483 isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
1484 isEqualNodes(node.variables, other.variables) &&
1485 isEqualNodes(node.initialization, other.initialization) &&
1486 isEqualTokens(node.leftSeparator, other.leftSeparator) &&
1487 isEqualNodes(node.condition, other.condition) &&
1488 isEqualTokens(node.rightSeparator, other.rightSeparator) &&
1489 _isEqualNodeLists(node.updaters, other.updaters) &&
1490 isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
1491 isEqualNodes(node.body, other.body);
1492 }
1493
1494 @override
1495 bool visitFunctionDeclaration(FunctionDeclaration node) {
1496 FunctionDeclaration other = _other as FunctionDeclaration;
1497 return isEqualNodes(
1498 node.documentationComment, other.documentationComment) &&
1499 _isEqualNodeLists(node.metadata, other.metadata) &&
1500 isEqualTokens(node.externalKeyword, other.externalKeyword) &&
1501 isEqualNodes(node.returnType, other.returnType) &&
1502 isEqualTokens(node.propertyKeyword, other.propertyKeyword) &&
1503 isEqualNodes(node.name, other.name) &&
1504 isEqualNodes(node.functionExpression, other.functionExpression);
1505 }
1506
1507 @override
1508 bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
1509 FunctionDeclarationStatement other = _other as FunctionDeclarationStatement;
1510 return isEqualNodes(node.functionDeclaration, other.functionDeclaration);
1511 }
1512
1513 @override
1514 bool visitFunctionExpression(FunctionExpression node) {
1515 FunctionExpression other = _other as FunctionExpression;
1516 return isEqualNodes(node.parameters, other.parameters) &&
1517 isEqualNodes(node.body, other.body);
1518 }
1519
1520 @override
1521 bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
1522 FunctionExpressionInvocation other = _other as FunctionExpressionInvocation;
1523 return isEqualNodes(node.function, other.function) &&
1524 isEqualNodes(node.argumentList, other.argumentList);
1525 }
1526
1527 @override
1528 bool visitFunctionTypeAlias(FunctionTypeAlias node) {
1529 FunctionTypeAlias other = _other as FunctionTypeAlias;
1530 return isEqualNodes(
1531 node.documentationComment, other.documentationComment) &&
1532 _isEqualNodeLists(node.metadata, other.metadata) &&
1533 isEqualTokens(node.typedefKeyword, other.typedefKeyword) &&
1534 isEqualNodes(node.returnType, other.returnType) &&
1535 isEqualNodes(node.name, other.name) &&
1536 isEqualNodes(node.typeParameters, other.typeParameters) &&
1537 isEqualNodes(node.parameters, other.parameters) &&
1538 isEqualTokens(node.semicolon, other.semicolon);
1539 }
1540
1541 @override
1542 bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
1543 FunctionTypedFormalParameter other = _other as FunctionTypedFormalParameter;
1544 return isEqualNodes(
1545 node.documentationComment, other.documentationComment) &&
1546 _isEqualNodeLists(node.metadata, other.metadata) &&
1547 isEqualNodes(node.returnType, other.returnType) &&
1548 isEqualNodes(node.identifier, other.identifier) &&
1549 isEqualNodes(node.parameters, other.parameters);
1550 }
1551
1552 @override
1553 bool visitHideCombinator(HideCombinator node) {
1554 HideCombinator other = _other as HideCombinator;
1555 return isEqualTokens(node.keyword, other.keyword) &&
1556 _isEqualNodeLists(node.hiddenNames, other.hiddenNames);
1557 }
1558
1559 @override
1560 bool visitIfStatement(IfStatement node) {
1561 IfStatement other = _other as IfStatement;
1562 return isEqualTokens(node.ifKeyword, other.ifKeyword) &&
1563 isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
1564 isEqualNodes(node.condition, other.condition) &&
1565 isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
1566 isEqualNodes(node.thenStatement, other.thenStatement) &&
1567 isEqualTokens(node.elseKeyword, other.elseKeyword) &&
1568 isEqualNodes(node.elseStatement, other.elseStatement);
1569 }
1570
1571 @override
1572 bool visitImplementsClause(ImplementsClause node) {
1573 ImplementsClause other = _other as ImplementsClause;
1574 return isEqualTokens(node.implementsKeyword, other.implementsKeyword) &&
1575 _isEqualNodeLists(node.interfaces, other.interfaces);
1576 }
1577
1578 @override
1579 bool visitImportDirective(ImportDirective node) {
1580 ImportDirective other = _other as ImportDirective;
1581 return isEqualNodes(
1582 node.documentationComment, other.documentationComment) &&
1583 _isEqualNodeLists(node.metadata, other.metadata) &&
1584 isEqualTokens(node.keyword, other.keyword) &&
1585 isEqualNodes(node.uri, other.uri) &&
1586 isEqualTokens(node.deferredKeyword, other.deferredKeyword) &&
1587 isEqualTokens(node.asKeyword, other.asKeyword) &&
1588 isEqualNodes(node.prefix, other.prefix) &&
1589 _isEqualNodeLists(node.combinators, other.combinators) &&
1590 isEqualTokens(node.semicolon, other.semicolon);
1591 }
1592
1593 @override
1594 bool visitIndexExpression(IndexExpression node) {
1595 IndexExpression other = _other as IndexExpression;
1596 return isEqualNodes(node.target, other.target) &&
1597 isEqualTokens(node.leftBracket, other.leftBracket) &&
1598 isEqualNodes(node.index, other.index) &&
1599 isEqualTokens(node.rightBracket, other.rightBracket);
1600 }
1601
1602 @override
1603 bool visitInstanceCreationExpression(InstanceCreationExpression node) {
1604 InstanceCreationExpression other = _other as InstanceCreationExpression;
1605 return isEqualTokens(node.keyword, other.keyword) &&
1606 isEqualNodes(node.constructorName, other.constructorName) &&
1607 isEqualNodes(node.argumentList, other.argumentList);
1608 }
1609
1610 @override
1611 bool visitIntegerLiteral(IntegerLiteral node) {
1612 IntegerLiteral other = _other as IntegerLiteral;
1613 return isEqualTokens(node.literal, other.literal) &&
1614 (node.value == other.value);
1615 }
1616
1617 @override
1618 bool visitInterpolationExpression(InterpolationExpression node) {
1619 InterpolationExpression other = _other as InterpolationExpression;
1620 return isEqualTokens(node.leftBracket, other.leftBracket) &&
1621 isEqualNodes(node.expression, other.expression) &&
1622 isEqualTokens(node.rightBracket, other.rightBracket);
1623 }
1624
1625 @override
1626 bool visitInterpolationString(InterpolationString node) {
1627 InterpolationString other = _other as InterpolationString;
1628 return isEqualTokens(node.contents, other.contents) &&
1629 node.value == other.value;
1630 }
1631
1632 @override
1633 bool visitIsExpression(IsExpression node) {
1634 IsExpression other = _other as IsExpression;
1635 return isEqualNodes(node.expression, other.expression) &&
1636 isEqualTokens(node.isOperator, other.isOperator) &&
1637 isEqualTokens(node.notOperator, other.notOperator) &&
1638 isEqualNodes(node.type, other.type);
1639 }
1640
1641 @override
1642 bool visitLabel(Label node) {
1643 Label other = _other as Label;
1644 return isEqualNodes(node.label, other.label) &&
1645 isEqualTokens(node.colon, other.colon);
1646 }
1647
1648 @override
1649 bool visitLabeledStatement(LabeledStatement node) {
1650 LabeledStatement other = _other as LabeledStatement;
1651 return _isEqualNodeLists(node.labels, other.labels) &&
1652 isEqualNodes(node.statement, other.statement);
1653 }
1654
1655 @override
1656 bool visitLibraryDirective(LibraryDirective node) {
1657 LibraryDirective other = _other as LibraryDirective;
1658 return isEqualNodes(
1659 node.documentationComment, other.documentationComment) &&
1660 _isEqualNodeLists(node.metadata, other.metadata) &&
1661 isEqualTokens(node.libraryKeyword, other.libraryKeyword) &&
1662 isEqualNodes(node.name, other.name) &&
1663 isEqualTokens(node.semicolon, other.semicolon);
1664 }
1665
1666 @override
1667 bool visitLibraryIdentifier(LibraryIdentifier node) {
1668 LibraryIdentifier other = _other as LibraryIdentifier;
1669 return _isEqualNodeLists(node.components, other.components);
1670 }
1671
1672 @override
1673 bool visitListLiteral(ListLiteral node) {
1674 ListLiteral other = _other as ListLiteral;
1675 return isEqualTokens(node.constKeyword, other.constKeyword) &&
1676 isEqualNodes(node.typeArguments, other.typeArguments) &&
1677 isEqualTokens(node.leftBracket, other.leftBracket) &&
1678 _isEqualNodeLists(node.elements, other.elements) &&
1679 isEqualTokens(node.rightBracket, other.rightBracket);
1680 }
1681
1682 @override
1683 bool visitMapLiteral(MapLiteral node) {
1684 MapLiteral other = _other as MapLiteral;
1685 return isEqualTokens(node.constKeyword, other.constKeyword) &&
1686 isEqualNodes(node.typeArguments, other.typeArguments) &&
1687 isEqualTokens(node.leftBracket, other.leftBracket) &&
1688 _isEqualNodeLists(node.entries, other.entries) &&
1689 isEqualTokens(node.rightBracket, other.rightBracket);
1690 }
1691
1692 @override
1693 bool visitMapLiteralEntry(MapLiteralEntry node) {
1694 MapLiteralEntry other = _other as MapLiteralEntry;
1695 return isEqualNodes(node.key, other.key) &&
1696 isEqualTokens(node.separator, other.separator) &&
1697 isEqualNodes(node.value, other.value);
1698 }
1699
1700 @override
1701 bool visitMethodDeclaration(MethodDeclaration node) {
1702 MethodDeclaration other = _other as MethodDeclaration;
1703 return isEqualNodes(
1704 node.documentationComment, other.documentationComment) &&
1705 _isEqualNodeLists(node.metadata, other.metadata) &&
1706 isEqualTokens(node.externalKeyword, other.externalKeyword) &&
1707 isEqualTokens(node.modifierKeyword, other.modifierKeyword) &&
1708 isEqualNodes(node.returnType, other.returnType) &&
1709 isEqualTokens(node.propertyKeyword, other.propertyKeyword) &&
1710 isEqualTokens(node.propertyKeyword, other.propertyKeyword) &&
1711 isEqualNodes(node.name, other.name) &&
1712 isEqualNodes(node.parameters, other.parameters) &&
1713 isEqualNodes(node.body, other.body);
1714 }
1715
1716 @override
1717 bool visitMethodInvocation(MethodInvocation node) {
1718 MethodInvocation other = _other as MethodInvocation;
1719 return isEqualNodes(node.target, other.target) &&
1720 isEqualTokens(node.operator, other.operator) &&
1721 isEqualNodes(node.methodName, other.methodName) &&
1722 isEqualNodes(node.argumentList, other.argumentList);
1723 }
1724
1725 @override
1726 bool visitNamedExpression(NamedExpression node) {
1727 NamedExpression other = _other as NamedExpression;
1728 return isEqualNodes(node.name, other.name) &&
1729 isEqualNodes(node.expression, other.expression);
1730 }
1731
1732 @override
1733 bool visitNativeClause(NativeClause node) {
1734 NativeClause other = _other as NativeClause;
1735 return isEqualTokens(node.nativeKeyword, other.nativeKeyword) &&
1736 isEqualNodes(node.name, other.name);
1737 }
1738
1739 @override
1740 bool visitNativeFunctionBody(NativeFunctionBody node) {
1741 NativeFunctionBody other = _other as NativeFunctionBody;
1742 return isEqualTokens(node.nativeKeyword, other.nativeKeyword) &&
1743 isEqualNodes(node.stringLiteral, other.stringLiteral) &&
1744 isEqualTokens(node.semicolon, other.semicolon);
1745 }
1746
1747 @override
1748 bool visitNullLiteral(NullLiteral node) {
1749 NullLiteral other = _other as NullLiteral;
1750 return isEqualTokens(node.literal, other.literal);
1751 }
1752
1753 @override
1754 bool visitParenthesizedExpression(ParenthesizedExpression node) {
1755 ParenthesizedExpression other = _other as ParenthesizedExpression;
1756 return isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
1757 isEqualNodes(node.expression, other.expression) &&
1758 isEqualTokens(node.rightParenthesis, other.rightParenthesis);
1759 }
1760
1761 @override
1762 bool visitPartDirective(PartDirective node) {
1763 PartDirective other = _other as PartDirective;
1764 return isEqualNodes(
1765 node.documentationComment, other.documentationComment) &&
1766 _isEqualNodeLists(node.metadata, other.metadata) &&
1767 isEqualTokens(node.partKeyword, other.partKeyword) &&
1768 isEqualNodes(node.uri, other.uri) &&
1769 isEqualTokens(node.semicolon, other.semicolon);
1770 }
1771
1772 @override
1773 bool visitPartOfDirective(PartOfDirective node) {
1774 PartOfDirective other = _other as PartOfDirective;
1775 return isEqualNodes(
1776 node.documentationComment, other.documentationComment) &&
1777 _isEqualNodeLists(node.metadata, other.metadata) &&
1778 isEqualTokens(node.partKeyword, other.partKeyword) &&
1779 isEqualTokens(node.ofKeyword, other.ofKeyword) &&
1780 isEqualNodes(node.libraryName, other.libraryName) &&
1781 isEqualTokens(node.semicolon, other.semicolon);
1782 }
1783
1784 @override
1785 bool visitPostfixExpression(PostfixExpression node) {
1786 PostfixExpression other = _other as PostfixExpression;
1787 return isEqualNodes(node.operand, other.operand) &&
1788 isEqualTokens(node.operator, other.operator);
1789 }
1790
1791 @override
1792 bool visitPrefixedIdentifier(PrefixedIdentifier node) {
1793 PrefixedIdentifier other = _other as PrefixedIdentifier;
1794 return isEqualNodes(node.prefix, other.prefix) &&
1795 isEqualTokens(node.period, other.period) &&
1796 isEqualNodes(node.identifier, other.identifier);
1797 }
1798
1799 @override
1800 bool visitPrefixExpression(PrefixExpression node) {
1801 PrefixExpression other = _other as PrefixExpression;
1802 return isEqualTokens(node.operator, other.operator) &&
1803 isEqualNodes(node.operand, other.operand);
1804 }
1805
1806 @override
1807 bool visitPropertyAccess(PropertyAccess node) {
1808 PropertyAccess other = _other as PropertyAccess;
1809 return isEqualNodes(node.target, other.target) &&
1810 isEqualTokens(node.operator, other.operator) &&
1811 isEqualNodes(node.propertyName, other.propertyName);
1812 }
1813
1814 @override
1815 bool visitRedirectingConstructorInvocation(
1816 RedirectingConstructorInvocation node) {
1817 RedirectingConstructorInvocation other =
1818 _other as RedirectingConstructorInvocation;
1819 return isEqualTokens(node.thisKeyword, other.thisKeyword) &&
1820 isEqualTokens(node.period, other.period) &&
1821 isEqualNodes(node.constructorName, other.constructorName) &&
1822 isEqualNodes(node.argumentList, other.argumentList);
1823 }
1824
1825 @override
1826 bool visitRethrowExpression(RethrowExpression node) {
1827 RethrowExpression other = _other as RethrowExpression;
1828 return isEqualTokens(node.rethrowKeyword, other.rethrowKeyword);
1829 }
1830
1831 @override
1832 bool visitReturnStatement(ReturnStatement node) {
1833 ReturnStatement other = _other as ReturnStatement;
1834 return isEqualTokens(node.returnKeyword, other.returnKeyword) &&
1835 isEqualNodes(node.expression, other.expression) &&
1836 isEqualTokens(node.semicolon, other.semicolon);
1837 }
1838
1839 @override
1840 bool visitScriptTag(ScriptTag node) {
1841 ScriptTag other = _other as ScriptTag;
1842 return isEqualTokens(node.scriptTag, other.scriptTag);
1843 }
1844
1845 @override
1846 bool visitShowCombinator(ShowCombinator node) {
1847 ShowCombinator other = _other as ShowCombinator;
1848 return isEqualTokens(node.keyword, other.keyword) &&
1849 _isEqualNodeLists(node.shownNames, other.shownNames);
1850 }
1851
1852 @override
1853 bool visitSimpleFormalParameter(SimpleFormalParameter node) {
1854 SimpleFormalParameter other = _other as SimpleFormalParameter;
1855 return isEqualNodes(
1856 node.documentationComment, other.documentationComment) &&
1857 _isEqualNodeLists(node.metadata, other.metadata) &&
1858 isEqualTokens(node.keyword, other.keyword) &&
1859 isEqualNodes(node.type, other.type) &&
1860 isEqualNodes(node.identifier, other.identifier);
1861 }
1862
1863 @override
1864 bool visitSimpleIdentifier(SimpleIdentifier node) {
1865 SimpleIdentifier other = _other as SimpleIdentifier;
1866 return isEqualTokens(node.token, other.token);
1867 }
1868
1869 @override
1870 bool visitSimpleStringLiteral(SimpleStringLiteral node) {
1871 SimpleStringLiteral other = _other as SimpleStringLiteral;
1872 return isEqualTokens(node.literal, other.literal) &&
1873 (node.value == other.value);
1874 }
1875
1876 @override
1877 bool visitStringInterpolation(StringInterpolation node) {
1878 StringInterpolation other = _other as StringInterpolation;
1879 return _isEqualNodeLists(node.elements, other.elements);
1880 }
1881
1882 @override
1883 bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
1884 SuperConstructorInvocation other = _other as SuperConstructorInvocation;
1885 return isEqualTokens(node.superKeyword, other.superKeyword) &&
1886 isEqualTokens(node.period, other.period) &&
1887 isEqualNodes(node.constructorName, other.constructorName) &&
1888 isEqualNodes(node.argumentList, other.argumentList);
1889 }
1890
1891 @override
1892 bool visitSuperExpression(SuperExpression node) {
1893 SuperExpression other = _other as SuperExpression;
1894 return isEqualTokens(node.superKeyword, other.superKeyword);
1895 }
1896
1897 @override
1898 bool visitSwitchCase(SwitchCase node) {
1899 SwitchCase other = _other as SwitchCase;
1900 return _isEqualNodeLists(node.labels, other.labels) &&
1901 isEqualTokens(node.keyword, other.keyword) &&
1902 isEqualNodes(node.expression, other.expression) &&
1903 isEqualTokens(node.colon, other.colon) &&
1904 _isEqualNodeLists(node.statements, other.statements);
1905 }
1906
1907 @override
1908 bool visitSwitchDefault(SwitchDefault node) {
1909 SwitchDefault other = _other as SwitchDefault;
1910 return _isEqualNodeLists(node.labels, other.labels) &&
1911 isEqualTokens(node.keyword, other.keyword) &&
1912 isEqualTokens(node.colon, other.colon) &&
1913 _isEqualNodeLists(node.statements, other.statements);
1914 }
1915
1916 @override
1917 bool visitSwitchStatement(SwitchStatement node) {
1918 SwitchStatement other = _other as SwitchStatement;
1919 return isEqualTokens(node.switchKeyword, other.switchKeyword) &&
1920 isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
1921 isEqualNodes(node.expression, other.expression) &&
1922 isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
1923 isEqualTokens(node.leftBracket, other.leftBracket) &&
1924 _isEqualNodeLists(node.members, other.members) &&
1925 isEqualTokens(node.rightBracket, other.rightBracket);
1926 }
1927
1928 @override
1929 bool visitSymbolLiteral(SymbolLiteral node) {
1930 SymbolLiteral other = _other as SymbolLiteral;
1931 return isEqualTokens(node.poundSign, other.poundSign) &&
1932 _isEqualTokenLists(node.components, other.components);
1933 }
1934
1935 @override
1936 bool visitThisExpression(ThisExpression node) {
1937 ThisExpression other = _other as ThisExpression;
1938 return isEqualTokens(node.thisKeyword, other.thisKeyword);
1939 }
1940
1941 @override
1942 bool visitThrowExpression(ThrowExpression node) {
1943 ThrowExpression other = _other as ThrowExpression;
1944 return isEqualTokens(node.throwKeyword, other.throwKeyword) &&
1945 isEqualNodes(node.expression, other.expression);
1946 }
1947
1948 @override
1949 bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
1950 TopLevelVariableDeclaration other = _other as TopLevelVariableDeclaration;
1951 return isEqualNodes(
1952 node.documentationComment, other.documentationComment) &&
1953 _isEqualNodeLists(node.metadata, other.metadata) &&
1954 isEqualNodes(node.variables, other.variables) &&
1955 isEqualTokens(node.semicolon, other.semicolon);
1956 }
1957
1958 @override
1959 bool visitTryStatement(TryStatement node) {
1960 TryStatement other = _other as TryStatement;
1961 return isEqualTokens(node.tryKeyword, other.tryKeyword) &&
1962 isEqualNodes(node.body, other.body) &&
1963 _isEqualNodeLists(node.catchClauses, other.catchClauses) &&
1964 isEqualTokens(node.finallyKeyword, other.finallyKeyword) &&
1965 isEqualNodes(node.finallyBlock, other.finallyBlock);
1966 }
1967
1968 @override
1969 bool visitTypeArgumentList(TypeArgumentList node) {
1970 TypeArgumentList other = _other as TypeArgumentList;
1971 return isEqualTokens(node.leftBracket, other.leftBracket) &&
1972 _isEqualNodeLists(node.arguments, other.arguments) &&
1973 isEqualTokens(node.rightBracket, other.rightBracket);
1974 }
1975
1976 @override
1977 bool visitTypeName(TypeName node) {
1978 TypeName other = _other as TypeName;
1979 return isEqualNodes(node.name, other.name) &&
1980 isEqualNodes(node.typeArguments, other.typeArguments);
1981 }
1982
1983 @override
1984 bool visitTypeParameter(TypeParameter node) {
1985 TypeParameter other = _other as TypeParameter;
1986 return isEqualNodes(
1987 node.documentationComment, other.documentationComment) &&
1988 _isEqualNodeLists(node.metadata, other.metadata) &&
1989 isEqualNodes(node.name, other.name) &&
1990 isEqualTokens(node.extendsKeyword, other.extendsKeyword) &&
1991 isEqualNodes(node.bound, other.bound);
1992 }
1993
1994 @override
1995 bool visitTypeParameterList(TypeParameterList node) {
1996 TypeParameterList other = _other as TypeParameterList;
1997 return isEqualTokens(node.leftBracket, other.leftBracket) &&
1998 _isEqualNodeLists(node.typeParameters, other.typeParameters) &&
1999 isEqualTokens(node.rightBracket, other.rightBracket);
2000 }
2001
2002 @override
2003 bool visitVariableDeclaration(VariableDeclaration node) {
2004 VariableDeclaration other = _other as VariableDeclaration;
2005 return isEqualNodes(
2006 node.documentationComment, other.documentationComment) &&
2007 _isEqualNodeLists(node.metadata, other.metadata) &&
2008 isEqualNodes(node.name, other.name) &&
2009 isEqualTokens(node.equals, other.equals) &&
2010 isEqualNodes(node.initializer, other.initializer);
2011 }
2012
2013 @override
2014 bool visitVariableDeclarationList(VariableDeclarationList node) {
2015 VariableDeclarationList other = _other as VariableDeclarationList;
2016 return isEqualNodes(
2017 node.documentationComment, other.documentationComment) &&
2018 _isEqualNodeLists(node.metadata, other.metadata) &&
2019 isEqualTokens(node.keyword, other.keyword) &&
2020 isEqualNodes(node.type, other.type) &&
2021 _isEqualNodeLists(node.variables, other.variables);
2022 }
2023
2024 @override
2025 bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
2026 VariableDeclarationStatement other = _other as VariableDeclarationStatement;
2027 return isEqualNodes(node.variables, other.variables) &&
2028 isEqualTokens(node.semicolon, other.semicolon);
2029 }
2030
2031 @override
2032 bool visitWhileStatement(WhileStatement node) {
2033 WhileStatement other = _other as WhileStatement;
2034 return isEqualTokens(node.whileKeyword, other.whileKeyword) &&
2035 isEqualTokens(node.leftParenthesis, other.leftParenthesis) &&
2036 isEqualNodes(node.condition, other.condition) &&
2037 isEqualTokens(node.rightParenthesis, other.rightParenthesis) &&
2038 isEqualNodes(node.body, other.body);
2039 }
2040
2041 @override
2042 bool visitWithClause(WithClause node) {
2043 WithClause other = _other as WithClause;
2044 return isEqualTokens(node.withKeyword, other.withKeyword) &&
2045 _isEqualNodeLists(node.mixinTypes, other.mixinTypes);
2046 }
2047
2048 @override
2049 bool visitYieldStatement(YieldStatement node) {
2050 YieldStatement other = _other as YieldStatement;
2051 return isEqualTokens(node.yieldKeyword, other.yieldKeyword) &&
2052 isEqualNodes(node.expression, other.expression) &&
2053 isEqualTokens(node.semicolon, other.semicolon);
2054 }
2055
2056 /**
2057 * Return `true` if the [first] and [second] lists of AST nodes have the same
2058 * size and corresponding elements are equal.
2059 */
2060 bool _isEqualNodeLists(NodeList first, NodeList second) {
2061 if (first == null) {
2062 return failIfNotNull(first, second);
2063 } else if (second == null) {
2064 return failIsNull(first, second);
2065 }
2066 int size = first.length;
2067 if (second.length != size) {
2068 return failDifferentLength(first, second);
2069 }
2070 for (int i = 0; i < size; i++) {
2071 if (!isEqualNodes(first[i], second[i])) {
2072 return false;
2073 }
2074 }
2075 return true;
2076 }
2077
2078 /**
2079 * Return `true` if the [first] and [second] lists of tokens have the same
2080 * length and corresponding elements are equal.
2081 */
2082 bool _isEqualTokenLists(List<Token> first, List<Token> second) {
2083 int length = first.length;
2084 if (second.length != length) {
2085 return failDifferentLength(first, second);
2086 }
2087 for (int i = 0; i < length; i++) {
2088 if (!isEqualTokens(first[i], second[i])) {
2089 return false;
2090 }
2091 }
2092 return true;
2093 }
2094
2095 /**
2096 * Return `true` if the [first] and [second] nodes are equal.
2097 */
2098 static bool equalNodes(AstNode first, AstNode second) {
2099 AstComparator comparator = new AstComparator();
2100 return comparator.isEqualNodes(first, second);
2101 }
2102 }
2103
2104 /**
2105 * Instances of the class [ConstantEvaluator] evaluate constant expressions to
2106 * produce their compile-time value.
2107 *
2108 * According to the Dart Language Specification:
2109 *
2110 * > A constant expression is one of the following:
2111 * >
2112 * > * A literal number.
2113 * > * A literal boolean.
2114 * > * A literal string where any interpolated expression is a compile-time
2115 * > constant that evaluates to a numeric, string or boolean value or to
2116 * > **null**.
2117 * > * A literal symbol.
2118 * > * **null**.
2119 * > * A qualified reference to a static constant variable.
2120 * > * An identifier expression that denotes a constant variable, class or type
2121 * > alias.
2122 * > * A constant constructor invocation.
2123 * > * A constant list literal.
2124 * > * A constant map literal.
2125 * > * A simple or qualified identifier denoting a top-level function or a
2126 * > static method.
2127 * > * A parenthesized expression _(e)_ where _e_ is a constant expression.
2128 * > * <span>
2129 * > An expression of the form <i>identical(e<sub>1</sub>, e<sub>2</sub>)</i>
2130 * > where <i>e<sub>1</sub></i> and <i>e<sub>2</sub></i> are constant
2131 * > expressions and <i>identical()</i> is statically bound to the predefined
2132 * > dart function <i>identical()</i> discussed above.
2133 * > </span>
2134 * > * <span>
2135 * > An expression of one of the forms <i>e<sub>1</sub> == e<sub>2</sub></i>
2136 * > or <i>e<sub>1</sub> != e<sub>2</sub></i> where <i>e<sub>1</sub></i> and
2137 * > <i>e<sub>2</sub></i> are constant expressions that evaluate to a
2138 * > numeric, string or boolean value.
2139 * > </span>
2140 * > * <span>
2141 * > An expression of one of the forms <i>!e</i>, <i>e<sub>1</sub> &amp;&amp;
2142 * > e<sub>2</sub></i> or <i>e<sub>1</sub> || e<sub>2</sub></i>, where
2143 * > <i>e</i>, <i>e<sub>1</sub></i> and <i>e<sub>2</sub></i> are constant
2144 * > expressions that evaluate to a boolean value.
2145 * > </span>
2146 * > * <span>
2147 * > An expression of one of the forms <i>~e</i>, <i>e<sub>1</sub> ^
2148 * > e<sub>2</sub></i>, <i>e<sub>1</sub> &amp; e<sub>2</sub></i>,
2149 * > <i>e<sub>1</sub> | e<sub>2</sub></i>, <i>e<sub>1</sub> &gt;&gt;
2150 * > e<sub>2</sub></i> or <i>e<sub>1</sub> &lt;&lt; e<sub>2</sub></i>, where
2151 * > <i>e</i>, <i>e<sub>1</sub></i> and <i>e<sub>2</sub></i> are constant
2152 * > expressions that evaluate to an integer value or to <b>null</b>.
2153 * > </span>
2154 * > * <span>
2155 * > An expression of one of the forms <i>-e</i>, <i>e<sub>1</sub> +
2156 * > e<sub>2</sub></i>, <i>e<sub>1</sub> -e<sub>2</sub></i>,
2157 * > <i>e<sub>1</sub> * e<sub>2</sub></i>, <i>e<sub>1</sub> /
2158 * > e<sub>2</sub></i>, <i>e<sub>1</sub> ~/ e<sub>2</sub></i>,
2159 * > <i>e<sub>1</sub> &gt; e<sub>2</sub></i>, <i>e<sub>1</sub> &lt;
2160 * > e<sub>2</sub></i>, <i>e<sub>1</sub> &gt;= e<sub>2</sub></i>,
2161 * > <i>e<sub>1</sub> &lt;= e<sub>2</sub></i> or <i>e<sub>1</sub> %
2162 * > e<sub>2</sub></i>, where <i>e</i>, <i>e<sub>1</sub></i> and
2163 * > <i>e<sub>2</sub></i> are constant expressions that evaluate to a numeric
2164 * > value or to <b>null</b>.
2165 * > </span>
2166 * > * <span>
2167 * > An expression of the form <i>e<sub>1</sub> ? e<sub>2</sub> :
2168 * > e<sub>3</sub></i> where <i>e<sub>1</sub></i>, <i>e<sub>2</sub></i> and
2169 * > <i>e<sub>3</sub></i> are constant expressions, and <i>e<sub>1</sub></i>
2170 * > evaluates to a boolean value.
2171 * > </span>
2172 *
2173 * The values returned by instances of this class are therefore `null` and
2174 * instances of the classes `Boolean`, `BigInteger`, `Double`, `String`, and
2175 * `DartObject`.
2176 *
2177 * In addition, this class defines several values that can be returned to
2178 * indicate various conditions encountered during evaluation. These are
2179 * documented with the static fields that define those values.
2180 */
2181 class ConstantEvaluator extends GeneralizingAstVisitor<Object> {
2182 /**
2183 * The value returned for expressions (or non-expression nodes) that are not
2184 * compile-time constant expressions.
2185 */
2186 static Object NOT_A_CONSTANT = new Object();
2187
2188 @override
2189 Object visitAdjacentStrings(AdjacentStrings node) {
2190 StringBuffer buffer = new StringBuffer();
2191 for (StringLiteral string in node.strings) {
2192 Object value = string.accept(this);
2193 if (identical(value, NOT_A_CONSTANT)) {
2194 return value;
2195 }
2196 buffer.write(value);
2197 }
2198 return buffer.toString();
2199 }
2200
2201 @override
2202 Object visitBinaryExpression(BinaryExpression node) {
2203 Object leftOperand = node.leftOperand.accept(this);
2204 if (identical(leftOperand, NOT_A_CONSTANT)) {
2205 return leftOperand;
2206 }
2207 Object rightOperand = node.rightOperand.accept(this);
2208 if (identical(rightOperand, NOT_A_CONSTANT)) {
2209 return rightOperand;
2210 }
2211 while (true) {
2212 if (node.operator.type == TokenType.AMPERSAND) {
2213 // integer or {@code null}
2214 if (leftOperand is int && rightOperand is int) {
2215 return leftOperand & rightOperand;
2216 }
2217 } else if (node.operator.type == TokenType.AMPERSAND_AMPERSAND) {
2218 // boolean or {@code null}
2219 if (leftOperand is bool && rightOperand is bool) {
2220 return leftOperand && rightOperand;
2221 }
2222 } else if (node.operator.type == TokenType.BANG_EQ) {
2223 // numeric, string, boolean, or {@code null}
2224 if (leftOperand is bool && rightOperand is bool) {
2225 return leftOperand != rightOperand;
2226 } else if (leftOperand is num && rightOperand is num) {
2227 return leftOperand != rightOperand;
2228 } else if (leftOperand is String && rightOperand is String) {
2229 return leftOperand != rightOperand;
2230 }
2231 } else if (node.operator.type == TokenType.BAR) {
2232 // integer or {@code null}
2233 if (leftOperand is int && rightOperand is int) {
2234 return leftOperand | rightOperand;
2235 }
2236 } else if (node.operator.type == TokenType.BAR_BAR) {
2237 // boolean or {@code null}
2238 if (leftOperand is bool && rightOperand is bool) {
2239 return leftOperand || rightOperand;
2240 }
2241 } else if (node.operator.type == TokenType.CARET) {
2242 // integer or {@code null}
2243 if (leftOperand is int && rightOperand is int) {
2244 return leftOperand ^ rightOperand;
2245 }
2246 } else if (node.operator.type == TokenType.EQ_EQ) {
2247 // numeric, string, boolean, or {@code null}
2248 if (leftOperand is bool && rightOperand is bool) {
2249 return leftOperand == rightOperand;
2250 } else if (leftOperand is num && rightOperand is num) {
2251 return leftOperand == rightOperand;
2252 } else if (leftOperand is String && rightOperand is String) {
2253 return leftOperand == rightOperand;
2254 }
2255 } else if (node.operator.type == TokenType.GT) {
2256 // numeric or {@code null}
2257 if (leftOperand is num && rightOperand is num) {
2258 return leftOperand.compareTo(rightOperand) > 0;
2259 }
2260 } else if (node.operator.type == TokenType.GT_EQ) {
2261 // numeric or {@code null}
2262 if (leftOperand is num && rightOperand is num) {
2263 return leftOperand.compareTo(rightOperand) >= 0;
2264 }
2265 } else if (node.operator.type == TokenType.GT_GT) {
2266 // integer or {@code null}
2267 if (leftOperand is int && rightOperand is int) {
2268 return leftOperand >> rightOperand;
2269 }
2270 } else if (node.operator.type == TokenType.LT) {
2271 // numeric or {@code null}
2272 if (leftOperand is num && rightOperand is num) {
2273 return leftOperand.compareTo(rightOperand) < 0;
2274 }
2275 } else if (node.operator.type == TokenType.LT_EQ) {
2276 // numeric or {@code null}
2277 if (leftOperand is num && rightOperand is num) {
2278 return leftOperand.compareTo(rightOperand) <= 0;
2279 }
2280 } else if (node.operator.type == TokenType.LT_LT) {
2281 // integer or {@code null}
2282 if (leftOperand is int && rightOperand is int) {
2283 return leftOperand << rightOperand;
2284 }
2285 } else if (node.operator.type == TokenType.MINUS) {
2286 // numeric or {@code null}
2287 if (leftOperand is num && rightOperand is num) {
2288 return leftOperand - rightOperand;
2289 }
2290 } else if (node.operator.type == TokenType.PERCENT) {
2291 // numeric or {@code null}
2292 if (leftOperand is num && rightOperand is num) {
2293 return leftOperand.remainder(rightOperand);
2294 }
2295 } else if (node.operator.type == TokenType.PLUS) {
2296 // numeric or {@code null}
2297 if (leftOperand is num && rightOperand is num) {
2298 return leftOperand + rightOperand;
2299 }
2300 } else if (node.operator.type == TokenType.STAR) {
2301 // numeric or {@code null}
2302 if (leftOperand is num && rightOperand is num) {
2303 return leftOperand * rightOperand;
2304 }
2305 } else if (node.operator.type == TokenType.SLASH) {
2306 // numeric or {@code null}
2307 if (leftOperand is num && rightOperand is num) {
2308 return leftOperand / rightOperand;
2309 }
2310 } else if (node.operator.type == TokenType.TILDE_SLASH) {
2311 // numeric or {@code null}
2312 if (leftOperand is num && rightOperand is num) {
2313 return leftOperand ~/ rightOperand;
2314 }
2315 }
2316 break;
2317 }
2318 // TODO(brianwilkerson) This doesn't handle numeric conversions.
2319 return visitExpression(node);
2320 }
2321
2322 @override
2323 Object visitBooleanLiteral(BooleanLiteral node) => node.value ? true : false;
2324
2325 @override
2326 Object visitDoubleLiteral(DoubleLiteral node) => node.value;
2327
2328 @override
2329 Object visitIntegerLiteral(IntegerLiteral node) => node.value;
2330
2331 @override
2332 Object visitInterpolationExpression(InterpolationExpression node) {
2333 Object value = node.expression.accept(this);
2334 if (value == null || value is bool || value is String || value is num) {
2335 return value;
2336 }
2337 return NOT_A_CONSTANT;
2338 }
2339
2340 @override
2341 Object visitInterpolationString(InterpolationString node) => node.value;
2342
2343 @override
2344 Object visitListLiteral(ListLiteral node) {
2345 List<Object> list = new List<Object>();
2346 for (Expression element in node.elements) {
2347 Object value = element.accept(this);
2348 if (identical(value, NOT_A_CONSTANT)) {
2349 return value;
2350 }
2351 list.add(value);
2352 }
2353 return list;
2354 }
2355
2356 @override
2357 Object visitMapLiteral(MapLiteral node) {
2358 HashMap<String, Object> map = new HashMap<String, Object>();
2359 for (MapLiteralEntry entry in node.entries) {
2360 Object key = entry.key.accept(this);
2361 Object value = entry.value.accept(this);
2362 if (key is String && !identical(value, NOT_A_CONSTANT)) {
2363 map[key] = value;
2364 } else {
2365 return NOT_A_CONSTANT;
2366 }
2367 }
2368 return map;
2369 }
2370
2371 @override
2372 Object visitMethodInvocation(MethodInvocation node) => visitNode(node);
2373
2374 @override
2375 Object visitNode(AstNode node) => NOT_A_CONSTANT;
2376
2377 @override
2378 Object visitNullLiteral(NullLiteral node) => null;
2379
2380 @override
2381 Object visitParenthesizedExpression(ParenthesizedExpression node) =>
2382 node.expression.accept(this);
2383
2384 @override
2385 Object visitPrefixedIdentifier(PrefixedIdentifier node) =>
2386 _getConstantValue(null);
2387
2388 @override
2389 Object visitPrefixExpression(PrefixExpression node) {
2390 Object operand = node.operand.accept(this);
2391 if (identical(operand, NOT_A_CONSTANT)) {
2392 return operand;
2393 }
2394 while (true) {
2395 if (node.operator.type == TokenType.BANG) {
2396 if (identical(operand, true)) {
2397 return false;
2398 } else if (identical(operand, false)) {
2399 return true;
2400 }
2401 } else if (node.operator.type == TokenType.TILDE) {
2402 if (operand is int) {
2403 return ~operand;
2404 }
2405 } else if (node.operator.type == TokenType.MINUS) {
2406 if (operand == null) {
2407 return null;
2408 } else if (operand is num) {
2409 return -operand;
2410 }
2411 } else {}
2412 break;
2413 }
2414 return NOT_A_CONSTANT;
2415 }
2416
2417 @override
2418 Object visitPropertyAccess(PropertyAccess node) => _getConstantValue(null);
2419
2420 @override
2421 Object visitSimpleIdentifier(SimpleIdentifier node) =>
2422 _getConstantValue(null);
2423
2424 @override
2425 Object visitSimpleStringLiteral(SimpleStringLiteral node) => node.value;
2426
2427 @override
2428 Object visitStringInterpolation(StringInterpolation node) {
2429 StringBuffer buffer = new StringBuffer();
2430 for (InterpolationElement element in node.elements) {
2431 Object value = element.accept(this);
2432 if (identical(value, NOT_A_CONSTANT)) {
2433 return value;
2434 }
2435 buffer.write(value);
2436 }
2437 return buffer.toString();
2438 }
2439
2440 @override
2441 Object visitSymbolLiteral(SymbolLiteral node) {
2442 // TODO(brianwilkerson) This isn't optimal because a Symbol is not a String.
2443 StringBuffer buffer = new StringBuffer();
2444 for (Token component in node.components) {
2445 if (buffer.length > 0) {
2446 buffer.writeCharCode(0x2E);
2447 }
2448 buffer.write(component.lexeme);
2449 }
2450 return buffer.toString();
2451 }
2452
2453 /**
2454 * Return the constant value of the static constant represented by the given
2455 * [element].
2456 */
2457 Object _getConstantValue(Element element) {
2458 // TODO(brianwilkerson) Implement this
2459 // if (element is FieldElement) {
2460 // FieldElement field = element;
2461 // if (field.isStatic && field.isConst) {
2462 // //field.getConstantValue();
2463 // }
2464 // // } else if (element instanceof VariableElement) {
2465 // // VariableElement variable = (VariableElement) element;
2466 // // if (variable.isStatic() && variable.isConst()) {
2467 // // //variable.getConstantValue();
2468 // // }
2469 // }
2470 return NOT_A_CONSTANT;
2471 }
2472 }
2473
2474 /**
2475 * A recursive AST visitor that is used to run over [Expression]s to determine
2476 * whether the expression is composed by at least one deferred
2477 * [PrefixedIdentifier].
2478 *
2479 * See [PrefixedIdentifier.isDeferred].
2480 */
2481 class DeferredLibraryReferenceDetector extends RecursiveAstVisitor<Object> {
2482 /**
2483 * A flag indicating whether an identifier from a deferred library has been
2484 * found.
2485 */
2486 bool _result = false;
2487
2488 /**
2489 * Return `true` if the visitor found a [PrefixedIdentifier] that returned
2490 * `true` to the [PrefixedIdentifier.isDeferred] query.
2491 */
2492 bool get result => _result;
2493
2494 @override
2495 Object visitPrefixedIdentifier(PrefixedIdentifier node) {
2496 if (!_result) {
2497 if (node.isDeferred) {
2498 _result = true;
2499 }
2500 }
2501 return null;
2502 }
2503 }
2504
2505 /**
2506 * An object used to locate the [Element] associated with a given [AstNode].
2507 */
2508 class ElementLocator {
2509 /**
2510 * Return the element associated with the given [node], or `null` if there is
2511 * no element associated with the node.
2512 */
2513 static Element locate(AstNode node) {
2514 if (node == null) {
2515 return null;
2516 }
2517 ElementLocator_ElementMapper mapper = new ElementLocator_ElementMapper();
2518 return node.accept(mapper);
2519 }
2520 }
2521
2522 /**
2523 * Visitor that maps nodes to elements.
2524 */
2525 class ElementLocator_ElementMapper extends GeneralizingAstVisitor<Element> {
2526 @override
2527 Element visitAnnotation(Annotation node) => node.element;
2528
2529 @override
2530 Element visitAssignmentExpression(AssignmentExpression node) =>
2531 node.bestElement;
2532
2533 @override
2534 Element visitBinaryExpression(BinaryExpression node) => node.bestElement;
2535
2536 @override
2537 Element visitClassDeclaration(ClassDeclaration node) => node.element;
2538
2539 @override
2540 Element visitCompilationUnit(CompilationUnit node) => node.element;
2541
2542 @override
2543 Element visitConstructorDeclaration(ConstructorDeclaration node) =>
2544 node.element;
2545
2546 @override
2547 Element visitExportDirective(ExportDirective node) => node.element;
2548
2549 @override
2550 Element visitFunctionDeclaration(FunctionDeclaration node) => node.element;
2551
2552 @override
2553 Element visitIdentifier(Identifier node) {
2554 AstNode parent = node.parent;
2555 if (parent is Annotation) {
2556 // Type name in Annotation
2557 if (identical(parent.name, node) && parent.constructorName == null) {
2558 return parent.element;
2559 }
2560 } else if (parent is ConstructorDeclaration) {
2561 // Extra work to map Constructor Declarations to their associated
2562 // Constructor Elements
2563 Identifier returnType = parent.returnType;
2564 if (identical(returnType, node)) {
2565 SimpleIdentifier name = parent.name;
2566 if (name != null) {
2567 return name.bestElement;
2568 }
2569 Element element = node.bestElement;
2570 if (element is ClassElement) {
2571 return element.unnamedConstructor;
2572 }
2573 }
2574 } else if (parent is LibraryIdentifier) {
2575 AstNode grandParent = parent.parent;
2576 if (grandParent is PartOfDirective) {
2577 Element element = grandParent.element;
2578 if (element is LibraryElement) {
2579 return element.definingCompilationUnit;
2580 }
2581 } else if (grandParent is LibraryDirective) {
2582 return grandParent.element;
2583 }
2584 }
2585 return node.bestElement;
2586 }
2587
2588 @override
2589 Element visitImportDirective(ImportDirective node) => node.element;
2590
2591 @override
2592 Element visitIndexExpression(IndexExpression node) => node.bestElement;
2593
2594 @override
2595 Element visitInstanceCreationExpression(InstanceCreationExpression node) =>
2596 node.staticElement;
2597
2598 @override
2599 Element visitLibraryDirective(LibraryDirective node) => node.element;
2600
2601 @override
2602 Element visitMethodDeclaration(MethodDeclaration node) => node.element;
2603
2604 @override
2605 Element visitMethodInvocation(MethodInvocation node) =>
2606 node.methodName.bestElement;
2607
2608 @override
2609 Element visitPartOfDirective(PartOfDirective node) => node.element;
2610
2611 @override
2612 Element visitPostfixExpression(PostfixExpression node) => node.bestElement;
2613
2614 @override
2615 Element visitPrefixedIdentifier(PrefixedIdentifier node) => node.bestElement;
2616
2617 @override
2618 Element visitPrefixExpression(PrefixExpression node) => node.bestElement;
2619
2620 @override
2621 Element visitStringLiteral(StringLiteral node) {
2622 AstNode parent = node.parent;
2623 if (parent is UriBasedDirective) {
2624 return parent.uriElement;
2625 }
2626 return null;
2627 }
2628
2629 @override
2630 Element visitVariableDeclaration(VariableDeclaration node) => node.element;
2631 }
2632
2633 /**
2634 * An object that will clone any AST structure that it visits. The cloner will
2635 * clone the structure, replacing the specified ASTNode with a new ASTNode,
2636 * mapping the old token stream to a new token stream, and preserving resolution
2637 * results.
2638 */
2639 @deprecated
2640 class IncrementalAstCloner implements AstVisitor<AstNode> {
2641 /**
2642 * The node to be replaced during the cloning process.
2643 */
2644 final AstNode _oldNode;
2645
2646 /**
2647 * The replacement node used during the cloning process.
2648 */
2649 final AstNode _newNode;
2650
2651 /**
2652 * A mapping of old tokens to new tokens used during the cloning process.
2653 */
2654 final TokenMap _tokenMap;
2655
2656 /**
2657 * Construct a new instance that will replace the [oldNode] with the [newNode]
2658 * in the process of cloning an existing AST structure. The [tokenMap] is a
2659 * mapping of old tokens to new tokens.
2660 */
2661 IncrementalAstCloner(this._oldNode, this._newNode, this._tokenMap);
2662
2663 @override
2664 AdjacentStrings visitAdjacentStrings(AdjacentStrings node) =>
2665 new AdjacentStrings(_cloneNodeList(node.strings));
2666
2667 @override
2668 Annotation visitAnnotation(Annotation node) {
2669 Annotation copy = new Annotation(
2670 _mapToken(node.atSign),
2671 _cloneNode(node.name),
2672 _mapToken(node.period),
2673 _cloneNode(node.constructorName),
2674 _cloneNode(node.arguments));
2675 copy.element = node.element;
2676 return copy;
2677 }
2678
2679 @override
2680 ArgumentList visitArgumentList(ArgumentList node) => new ArgumentList(
2681 _mapToken(node.leftParenthesis),
2682 _cloneNodeList(node.arguments),
2683 _mapToken(node.rightParenthesis));
2684
2685 @override
2686 AsExpression visitAsExpression(AsExpression node) {
2687 AsExpression copy = new AsExpression(_cloneNode(node.expression),
2688 _mapToken(node.asOperator), _cloneNode(node.type));
2689 copy.propagatedType = node.propagatedType;
2690 copy.staticType = node.staticType;
2691 return copy;
2692 }
2693
2694 @override
2695 AstNode visitAssertStatement(AssertStatement node) => new AssertStatement(
2696 _mapToken(node.assertKeyword),
2697 _mapToken(node.leftParenthesis),
2698 _cloneNode(node.condition),
2699 _mapToken(node.comma),
2700 _cloneNode(node.message),
2701 _mapToken(node.rightParenthesis),
2702 _mapToken(node.semicolon));
2703
2704 @override
2705 AssignmentExpression visitAssignmentExpression(AssignmentExpression node) {
2706 AssignmentExpression copy = new AssignmentExpression(
2707 _cloneNode(node.leftHandSide),
2708 _mapToken(node.operator),
2709 _cloneNode(node.rightHandSide));
2710 copy.propagatedElement = node.propagatedElement;
2711 copy.propagatedType = node.propagatedType;
2712 copy.staticElement = node.staticElement;
2713 copy.staticType = node.staticType;
2714 return copy;
2715 }
2716
2717 @override
2718 AwaitExpression visitAwaitExpression(AwaitExpression node) =>
2719 new AwaitExpression(
2720 _mapToken(node.awaitKeyword), _cloneNode(node.expression));
2721
2722 @override
2723 BinaryExpression visitBinaryExpression(BinaryExpression node) {
2724 BinaryExpression copy = new BinaryExpression(_cloneNode(node.leftOperand),
2725 _mapToken(node.operator), _cloneNode(node.rightOperand));
2726 copy.propagatedElement = node.propagatedElement;
2727 copy.propagatedType = node.propagatedType;
2728 copy.staticElement = node.staticElement;
2729 copy.staticType = node.staticType;
2730 return copy;
2731 }
2732
2733 @override
2734 Block visitBlock(Block node) => new Block(_mapToken(node.leftBracket),
2735 _cloneNodeList(node.statements), _mapToken(node.rightBracket));
2736
2737 @override
2738 BlockFunctionBody visitBlockFunctionBody(BlockFunctionBody node) =>
2739 new BlockFunctionBody(_mapToken(node.keyword), _mapToken(node.star),
2740 _cloneNode(node.block));
2741
2742 @override
2743 BooleanLiteral visitBooleanLiteral(BooleanLiteral node) {
2744 BooleanLiteral copy =
2745 new BooleanLiteral(_mapToken(node.literal), node.value);
2746 copy.propagatedType = node.propagatedType;
2747 copy.staticType = node.staticType;
2748 return copy;
2749 }
2750
2751 @override
2752 BreakStatement visitBreakStatement(BreakStatement node) => new BreakStatement(
2753 _mapToken(node.breakKeyword),
2754 _cloneNode(node.label),
2755 _mapToken(node.semicolon));
2756
2757 @override
2758 CascadeExpression visitCascadeExpression(CascadeExpression node) {
2759 CascadeExpression copy = new CascadeExpression(
2760 _cloneNode(node.target), _cloneNodeList(node.cascadeSections));
2761 copy.propagatedType = node.propagatedType;
2762 copy.staticType = node.staticType;
2763 return copy;
2764 }
2765
2766 @override
2767 CatchClause visitCatchClause(CatchClause node) => new CatchClause(
2768 _mapToken(node.onKeyword),
2769 _cloneNode(node.exceptionType),
2770 _mapToken(node.catchKeyword),
2771 _mapToken(node.leftParenthesis),
2772 _cloneNode(node.exceptionParameter),
2773 _mapToken(node.comma),
2774 _cloneNode(node.stackTraceParameter),
2775 _mapToken(node.rightParenthesis),
2776 _cloneNode(node.body));
2777
2778 @override
2779 ClassDeclaration visitClassDeclaration(ClassDeclaration node) {
2780 ClassDeclaration copy = new ClassDeclaration(
2781 _cloneNode(node.documentationComment),
2782 _cloneNodeList(node.metadata),
2783 _mapToken(node.abstractKeyword),
2784 _mapToken(node.classKeyword),
2785 _cloneNode(node.name),
2786 _cloneNode(node.typeParameters),
2787 _cloneNode(node.extendsClause),
2788 _cloneNode(node.withClause),
2789 _cloneNode(node.implementsClause),
2790 _mapToken(node.leftBracket),
2791 _cloneNodeList(node.members),
2792 _mapToken(node.rightBracket));
2793 copy.nativeClause = _cloneNode(node.nativeClause);
2794 return copy;
2795 }
2796
2797 @override
2798 ClassTypeAlias visitClassTypeAlias(ClassTypeAlias node) => new ClassTypeAlias(
2799 _cloneNode(node.documentationComment),
2800 _cloneNodeList(node.metadata),
2801 _mapToken(node.typedefKeyword),
2802 _cloneNode(node.name),
2803 _cloneNode(node.typeParameters),
2804 _mapToken(node.equals),
2805 _mapToken(node.abstractKeyword),
2806 _cloneNode(node.superclass),
2807 _cloneNode(node.withClause),
2808 _cloneNode(node.implementsClause),
2809 _mapToken(node.semicolon));
2810
2811 @override
2812 Comment visitComment(Comment node) {
2813 if (node.isDocumentation) {
2814 return Comment.createDocumentationCommentWithReferences(
2815 _mapTokens(node.tokens), _cloneNodeList(node.references));
2816 } else if (node.isBlock) {
2817 return Comment.createBlockComment(_mapTokens(node.tokens));
2818 }
2819 return Comment.createEndOfLineComment(_mapTokens(node.tokens));
2820 }
2821
2822 @override
2823 CommentReference visitCommentReference(CommentReference node) =>
2824 new CommentReference(
2825 _mapToken(node.newKeyword), _cloneNode(node.identifier));
2826
2827 @override
2828 CompilationUnit visitCompilationUnit(CompilationUnit node) {
2829 CompilationUnit copy = new CompilationUnit(
2830 _mapToken(node.beginToken),
2831 _cloneNode(node.scriptTag),
2832 _cloneNodeList(node.directives),
2833 _cloneNodeList(node.declarations),
2834 _mapToken(node.endToken));
2835 copy.lineInfo = node.lineInfo;
2836 copy.element = node.element;
2837 return copy;
2838 }
2839
2840 @override
2841 ConditionalExpression visitConditionalExpression(ConditionalExpression node) {
2842 ConditionalExpression copy = new ConditionalExpression(
2843 _cloneNode(node.condition),
2844 _mapToken(node.question),
2845 _cloneNode(node.thenExpression),
2846 _mapToken(node.colon),
2847 _cloneNode(node.elseExpression));
2848 copy.propagatedType = node.propagatedType;
2849 copy.staticType = node.staticType;
2850 return copy;
2851 }
2852
2853 @override
2854 Configuration visitConfiguration(Configuration node) => new Configuration(
2855 _mapToken(node.ifKeyword),
2856 _mapToken(node.leftParenthesis),
2857 _cloneNode(node.name),
2858 _mapToken(node.equalToken),
2859 _cloneNode(node.value),
2860 _mapToken(node.rightParenthesis),
2861 _cloneNode(node.uri));
2862
2863 @override
2864 ConstructorDeclaration visitConstructorDeclaration(
2865 ConstructorDeclaration node) {
2866 ConstructorDeclaration copy = new ConstructorDeclaration(
2867 _cloneNode(node.documentationComment),
2868 _cloneNodeList(node.metadata),
2869 _mapToken(node.externalKeyword),
2870 _mapToken(node.constKeyword),
2871 _mapToken(node.factoryKeyword),
2872 _cloneNode(node.returnType),
2873 _mapToken(node.period),
2874 _cloneNode(node.name),
2875 _cloneNode(node.parameters),
2876 _mapToken(node.separator),
2877 _cloneNodeList(node.initializers),
2878 _cloneNode(node.redirectedConstructor),
2879 _cloneNode(node.body));
2880 copy.element = node.element;
2881 return copy;
2882 }
2883
2884 @override
2885 ConstructorFieldInitializer visitConstructorFieldInitializer(
2886 ConstructorFieldInitializer node) =>
2887 new ConstructorFieldInitializer(
2888 _mapToken(node.thisKeyword),
2889 _mapToken(node.period),
2890 _cloneNode(node.fieldName),
2891 _mapToken(node.equals),
2892 _cloneNode(node.expression));
2893
2894 @override
2895 ConstructorName visitConstructorName(ConstructorName node) {
2896 ConstructorName copy = new ConstructorName(
2897 _cloneNode(node.type), _mapToken(node.period), _cloneNode(node.name));
2898 copy.staticElement = node.staticElement;
2899 return copy;
2900 }
2901
2902 @override
2903 ContinueStatement visitContinueStatement(ContinueStatement node) =>
2904 new ContinueStatement(_mapToken(node.continueKeyword),
2905 _cloneNode(node.label), _mapToken(node.semicolon));
2906
2907 @override
2908 DeclaredIdentifier visitDeclaredIdentifier(DeclaredIdentifier node) =>
2909 new DeclaredIdentifier(
2910 _cloneNode(node.documentationComment),
2911 _cloneNodeList(node.metadata),
2912 _mapToken(node.keyword),
2913 _cloneNode(node.type),
2914 _cloneNode(node.identifier));
2915
2916 @override
2917 DefaultFormalParameter visitDefaultFormalParameter(
2918 DefaultFormalParameter node) =>
2919 new DefaultFormalParameter(_cloneNode(node.parameter), node.kind,
2920 _mapToken(node.separator), _cloneNode(node.defaultValue));
2921
2922 @override
2923 DoStatement visitDoStatement(DoStatement node) => new DoStatement(
2924 _mapToken(node.doKeyword),
2925 _cloneNode(node.body),
2926 _mapToken(node.whileKeyword),
2927 _mapToken(node.leftParenthesis),
2928 _cloneNode(node.condition),
2929 _mapToken(node.rightParenthesis),
2930 _mapToken(node.semicolon));
2931
2932 @override
2933 DottedName visitDottedName(DottedName node) =>
2934 new DottedName(_cloneNodeList(node.components));
2935
2936 @override
2937 DoubleLiteral visitDoubleLiteral(DoubleLiteral node) {
2938 DoubleLiteral copy = new DoubleLiteral(_mapToken(node.literal), node.value);
2939 copy.propagatedType = node.propagatedType;
2940 copy.staticType = node.staticType;
2941 return copy;
2942 }
2943
2944 @override
2945 EmptyFunctionBody visitEmptyFunctionBody(EmptyFunctionBody node) =>
2946 new EmptyFunctionBody(_mapToken(node.semicolon));
2947
2948 @override
2949 EmptyStatement visitEmptyStatement(EmptyStatement node) =>
2950 new EmptyStatement(_mapToken(node.semicolon));
2951
2952 @override
2953 AstNode visitEnumConstantDeclaration(EnumConstantDeclaration node) =>
2954 new EnumConstantDeclaration(_cloneNode(node.documentationComment),
2955 _cloneNodeList(node.metadata), _cloneNode(node.name));
2956
2957 @override
2958 AstNode visitEnumDeclaration(EnumDeclaration node) => new EnumDeclaration(
2959 _cloneNode(node.documentationComment),
2960 _cloneNodeList(node.metadata),
2961 _mapToken(node.enumKeyword),
2962 _cloneNode(node.name),
2963 _mapToken(node.leftBracket),
2964 _cloneNodeList(node.constants),
2965 _mapToken(node.rightBracket));
2966
2967 @override
2968 ExportDirective visitExportDirective(ExportDirective node) {
2969 ExportDirective copy = new ExportDirective(
2970 _cloneNode(node.documentationComment),
2971 _cloneNodeList(node.metadata),
2972 _mapToken(node.keyword),
2973 _cloneNode(node.uri),
2974 _cloneNodeList(node.configurations),
2975 _cloneNodeList(node.combinators),
2976 _mapToken(node.semicolon));
2977 copy.element = node.element;
2978 return copy;
2979 }
2980
2981 @override
2982 ExpressionFunctionBody visitExpressionFunctionBody(
2983 ExpressionFunctionBody node) =>
2984 new ExpressionFunctionBody(
2985 _mapToken(node.keyword),
2986 _mapToken(node.functionDefinition),
2987 _cloneNode(node.expression),
2988 _mapToken(node.semicolon));
2989
2990 @override
2991 ExpressionStatement visitExpressionStatement(ExpressionStatement node) =>
2992 new ExpressionStatement(
2993 _cloneNode(node.expression), _mapToken(node.semicolon));
2994
2995 @override
2996 ExtendsClause visitExtendsClause(ExtendsClause node) => new ExtendsClause(
2997 _mapToken(node.extendsKeyword), _cloneNode(node.superclass));
2998
2999 @override
3000 FieldDeclaration visitFieldDeclaration(FieldDeclaration node) =>
3001 new FieldDeclaration(
3002 _cloneNode(node.documentationComment),
3003 _cloneNodeList(node.metadata),
3004 _mapToken(node.staticKeyword),
3005 _cloneNode(node.fields),
3006 _mapToken(node.semicolon));
3007
3008 @override
3009 FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) =>
3010 new FieldFormalParameter(
3011 _cloneNode(node.documentationComment),
3012 _cloneNodeList(node.metadata),
3013 _mapToken(node.keyword),
3014 _cloneNode(node.type),
3015 _mapToken(node.thisKeyword),
3016 _mapToken(node.period),
3017 _cloneNode(node.identifier),
3018 _cloneNode(node.typeParameters),
3019 _cloneNode(node.parameters));
3020
3021 @override
3022 ForEachStatement visitForEachStatement(ForEachStatement node) {
3023 DeclaredIdentifier loopVariable = node.loopVariable;
3024 if (loopVariable == null) {
3025 return new ForEachStatement.withReference(
3026 _mapToken(node.awaitKeyword),
3027 _mapToken(node.forKeyword),
3028 _mapToken(node.leftParenthesis),
3029 _cloneNode(node.identifier),
3030 _mapToken(node.inKeyword),
3031 _cloneNode(node.iterable),
3032 _mapToken(node.rightParenthesis),
3033 _cloneNode(node.body));
3034 }
3035 return new ForEachStatement.withDeclaration(
3036 _mapToken(node.awaitKeyword),
3037 _mapToken(node.forKeyword),
3038 _mapToken(node.leftParenthesis),
3039 _cloneNode(loopVariable),
3040 _mapToken(node.inKeyword),
3041 _cloneNode(node.iterable),
3042 _mapToken(node.rightParenthesis),
3043 _cloneNode(node.body));
3044 }
3045
3046 @override
3047 FormalParameterList visitFormalParameterList(FormalParameterList node) =>
3048 new FormalParameterList(
3049 _mapToken(node.leftParenthesis),
3050 _cloneNodeList(node.parameters),
3051 _mapToken(node.leftDelimiter),
3052 _mapToken(node.rightDelimiter),
3053 _mapToken(node.rightParenthesis));
3054
3055 @override
3056 ForStatement visitForStatement(ForStatement node) => new ForStatement(
3057 _mapToken(node.forKeyword),
3058 _mapToken(node.leftParenthesis),
3059 _cloneNode(node.variables),
3060 _cloneNode(node.initialization),
3061 _mapToken(node.leftSeparator),
3062 _cloneNode(node.condition),
3063 _mapToken(node.rightSeparator),
3064 _cloneNodeList(node.updaters),
3065 _mapToken(node.rightParenthesis),
3066 _cloneNode(node.body));
3067
3068 @override
3069 FunctionDeclaration visitFunctionDeclaration(FunctionDeclaration node) =>
3070 new FunctionDeclaration(
3071 _cloneNode(node.documentationComment),
3072 _cloneNodeList(node.metadata),
3073 _mapToken(node.externalKeyword),
3074 _cloneNode(node.returnType),
3075 _mapToken(node.propertyKeyword),
3076 _cloneNode(node.name),
3077 _cloneNode(node.functionExpression));
3078
3079 @override
3080 FunctionDeclarationStatement visitFunctionDeclarationStatement(
3081 FunctionDeclarationStatement node) =>
3082 new FunctionDeclarationStatement(_cloneNode(node.functionDeclaration));
3083
3084 @override
3085 FunctionExpression visitFunctionExpression(FunctionExpression node) {
3086 FunctionExpression copy = new FunctionExpression(
3087 _cloneNode(node.typeParameters),
3088 _cloneNode(node.parameters),
3089 _cloneNode(node.body));
3090 copy.element = node.element;
3091 copy.propagatedType = node.propagatedType;
3092 copy.staticType = node.staticType;
3093 return copy;
3094 }
3095
3096 @override
3097 FunctionExpressionInvocation visitFunctionExpressionInvocation(
3098 FunctionExpressionInvocation node) {
3099 FunctionExpressionInvocation copy = new FunctionExpressionInvocation(
3100 _cloneNode(node.function),
3101 _cloneNode(node.typeArguments),
3102 _cloneNode(node.argumentList));
3103 copy.propagatedElement = node.propagatedElement;
3104 copy.propagatedType = node.propagatedType;
3105 copy.staticElement = node.staticElement;
3106 copy.staticType = node.staticType;
3107 return copy;
3108 }
3109
3110 @override
3111 FunctionTypeAlias visitFunctionTypeAlias(FunctionTypeAlias node) =>
3112 new FunctionTypeAlias(
3113 _cloneNode(node.documentationComment),
3114 _cloneNodeList(node.metadata),
3115 _mapToken(node.typedefKeyword),
3116 _cloneNode(node.returnType),
3117 _cloneNode(node.name),
3118 _cloneNode(node.typeParameters),
3119 _cloneNode(node.parameters),
3120 _mapToken(node.semicolon));
3121
3122 @override
3123 FunctionTypedFormalParameter visitFunctionTypedFormalParameter(
3124 FunctionTypedFormalParameter node) =>
3125 new FunctionTypedFormalParameter(
3126 _cloneNode(node.documentationComment),
3127 _cloneNodeList(node.metadata),
3128 _cloneNode(node.returnType),
3129 _cloneNode(node.identifier),
3130 _cloneNode(node.typeParameters),
3131 _cloneNode(node.parameters));
3132
3133 @override
3134 HideCombinator visitHideCombinator(HideCombinator node) => new HideCombinator(
3135 _mapToken(node.keyword), _cloneNodeList(node.hiddenNames));
3136
3137 @override
3138 IfStatement visitIfStatement(IfStatement node) => new IfStatement(
3139 _mapToken(node.ifKeyword),
3140 _mapToken(node.leftParenthesis),
3141 _cloneNode(node.condition),
3142 _mapToken(node.rightParenthesis),
3143 _cloneNode(node.thenStatement),
3144 _mapToken(node.elseKeyword),
3145 _cloneNode(node.elseStatement));
3146
3147 @override
3148 ImplementsClause visitImplementsClause(ImplementsClause node) =>
3149 new ImplementsClause(
3150 _mapToken(node.implementsKeyword), _cloneNodeList(node.interfaces));
3151
3152 @override
3153 ImportDirective visitImportDirective(ImportDirective node) {
3154 ImportDirective copy = new ImportDirective(
3155 _cloneNode(node.documentationComment),
3156 _cloneNodeList(node.metadata),
3157 _mapToken(node.keyword),
3158 _cloneNode(node.uri),
3159 _cloneNodeList(node.configurations),
3160 _mapToken(node.deferredKeyword),
3161 _mapToken(node.asKeyword),
3162 _cloneNode(node.prefix),
3163 _cloneNodeList(node.combinators),
3164 _mapToken(node.semicolon));
3165 copy.element = node.element;
3166 return copy;
3167 }
3168
3169 @override
3170 IndexExpression visitIndexExpression(IndexExpression node) {
3171 Token period = _mapToken(node.period);
3172 IndexExpression copy;
3173 if (period == null) {
3174 copy = new IndexExpression.forTarget(
3175 _cloneNode(node.target),
3176 _mapToken(node.leftBracket),
3177 _cloneNode(node.index),
3178 _mapToken(node.rightBracket));
3179 } else {
3180 copy = new IndexExpression.forCascade(period, _mapToken(node.leftBracket),
3181 _cloneNode(node.index), _mapToken(node.rightBracket));
3182 }
3183 copy.auxiliaryElements = node.auxiliaryElements;
3184 copy.propagatedElement = node.propagatedElement;
3185 copy.propagatedType = node.propagatedType;
3186 copy.staticElement = node.staticElement;
3187 copy.staticType = node.staticType;
3188 return copy;
3189 }
3190
3191 @override
3192 InstanceCreationExpression visitInstanceCreationExpression(
3193 InstanceCreationExpression node) {
3194 InstanceCreationExpression copy = new InstanceCreationExpression(
3195 _mapToken(node.keyword),
3196 _cloneNode(node.constructorName),
3197 _cloneNode(node.argumentList));
3198 copy.propagatedType = node.propagatedType;
3199 copy.staticElement = node.staticElement;
3200 copy.staticType = node.staticType;
3201 return copy;
3202 }
3203
3204 @override
3205 IntegerLiteral visitIntegerLiteral(IntegerLiteral node) {
3206 IntegerLiteral copy =
3207 new IntegerLiteral(_mapToken(node.literal), node.value);
3208 copy.propagatedType = node.propagatedType;
3209 copy.staticType = node.staticType;
3210 return copy;
3211 }
3212
3213 @override
3214 InterpolationExpression visitInterpolationExpression(
3215 InterpolationExpression node) =>
3216 new InterpolationExpression(_mapToken(node.leftBracket),
3217 _cloneNode(node.expression), _mapToken(node.rightBracket));
3218
3219 @override
3220 InterpolationString visitInterpolationString(InterpolationString node) =>
3221 new InterpolationString(_mapToken(node.contents), node.value);
3222
3223 @override
3224 IsExpression visitIsExpression(IsExpression node) {
3225 IsExpression copy = new IsExpression(
3226 _cloneNode(node.expression),
3227 _mapToken(node.isOperator),
3228 _mapToken(node.notOperator),
3229 _cloneNode(node.type));
3230 copy.propagatedType = node.propagatedType;
3231 copy.staticType = node.staticType;
3232 return copy;
3233 }
3234
3235 @override
3236 Label visitLabel(Label node) =>
3237 new Label(_cloneNode(node.label), _mapToken(node.colon));
3238
3239 @override
3240 LabeledStatement visitLabeledStatement(LabeledStatement node) =>
3241 new LabeledStatement(
3242 _cloneNodeList(node.labels), _cloneNode(node.statement));
3243
3244 @override
3245 LibraryDirective visitLibraryDirective(LibraryDirective node) {
3246 LibraryDirective copy = new LibraryDirective(
3247 _cloneNode(node.documentationComment),
3248 _cloneNodeList(node.metadata),
3249 _mapToken(node.libraryKeyword),
3250 _cloneNode(node.name),
3251 _mapToken(node.semicolon));
3252 copy.element = node.element;
3253 return copy;
3254 }
3255
3256 @override
3257 LibraryIdentifier visitLibraryIdentifier(LibraryIdentifier node) {
3258 LibraryIdentifier copy =
3259 new LibraryIdentifier(_cloneNodeList(node.components));
3260 copy.propagatedType = node.propagatedType;
3261 copy.staticType = node.staticType;
3262 return copy;
3263 }
3264
3265 @override
3266 ListLiteral visitListLiteral(ListLiteral node) {
3267 ListLiteral copy = new ListLiteral(
3268 _mapToken(node.constKeyword),
3269 _cloneNode(node.typeArguments),
3270 _mapToken(node.leftBracket),
3271 _cloneNodeList(node.elements),
3272 _mapToken(node.rightBracket));
3273 copy.propagatedType = node.propagatedType;
3274 copy.staticType = node.staticType;
3275 return copy;
3276 }
3277
3278 @override
3279 MapLiteral visitMapLiteral(MapLiteral node) {
3280 MapLiteral copy = new MapLiteral(
3281 _mapToken(node.constKeyword),
3282 _cloneNode(node.typeArguments),
3283 _mapToken(node.leftBracket),
3284 _cloneNodeList(node.entries),
3285 _mapToken(node.rightBracket));
3286 copy.propagatedType = node.propagatedType;
3287 copy.staticType = node.staticType;
3288 return copy;
3289 }
3290
3291 @override
3292 MapLiteralEntry visitMapLiteralEntry(MapLiteralEntry node) =>
3293 new MapLiteralEntry(_cloneNode(node.key), _mapToken(node.separator),
3294 _cloneNode(node.value));
3295
3296 @override
3297 MethodDeclaration visitMethodDeclaration(MethodDeclaration node) =>
3298 new MethodDeclaration(
3299 _cloneNode(node.documentationComment),
3300 _cloneNodeList(node.metadata),
3301 _mapToken(node.externalKeyword),
3302 _mapToken(node.modifierKeyword),
3303 _cloneNode(node.returnType),
3304 _mapToken(node.propertyKeyword),
3305 _mapToken(node.operatorKeyword),
3306 _cloneNode(node.name),
3307 _cloneNode(node.typeParameters),
3308 _cloneNode(node.parameters),
3309 _cloneNode(node.body));
3310
3311 @override
3312 MethodInvocation visitMethodInvocation(MethodInvocation node) {
3313 MethodInvocation copy = new MethodInvocation(
3314 _cloneNode(node.target),
3315 _mapToken(node.operator),
3316 _cloneNode(node.methodName),
3317 _cloneNode(node.typeArguments),
3318 _cloneNode(node.argumentList));
3319 copy.propagatedType = node.propagatedType;
3320 copy.staticType = node.staticType;
3321 return copy;
3322 }
3323
3324 @override
3325 NamedExpression visitNamedExpression(NamedExpression node) {
3326 NamedExpression copy =
3327 new NamedExpression(_cloneNode(node.name), _cloneNode(node.expression));
3328 copy.propagatedType = node.propagatedType;
3329 copy.staticType = node.staticType;
3330 return copy;
3331 }
3332
3333 @override
3334 AstNode visitNativeClause(NativeClause node) =>
3335 new NativeClause(_mapToken(node.nativeKeyword), _cloneNode(node.name));
3336
3337 @override
3338 NativeFunctionBody visitNativeFunctionBody(NativeFunctionBody node) =>
3339 new NativeFunctionBody(_mapToken(node.nativeKeyword),
3340 _cloneNode(node.stringLiteral), _mapToken(node.semicolon));
3341
3342 @override
3343 NullLiteral visitNullLiteral(NullLiteral node) {
3344 NullLiteral copy = new NullLiteral(_mapToken(node.literal));
3345 copy.propagatedType = node.propagatedType;
3346 copy.staticType = node.staticType;
3347 return copy;
3348 }
3349
3350 @override
3351 ParenthesizedExpression visitParenthesizedExpression(
3352 ParenthesizedExpression node) {
3353 ParenthesizedExpression copy = new ParenthesizedExpression(
3354 _mapToken(node.leftParenthesis),
3355 _cloneNode(node.expression),
3356 _mapToken(node.rightParenthesis));
3357 copy.propagatedType = node.propagatedType;
3358 copy.staticType = node.staticType;
3359 return copy;
3360 }
3361
3362 @override
3363 PartDirective visitPartDirective(PartDirective node) {
3364 PartDirective copy = new PartDirective(
3365 _cloneNode(node.documentationComment),
3366 _cloneNodeList(node.metadata),
3367 _mapToken(node.partKeyword),
3368 _cloneNode(node.uri),
3369 _mapToken(node.semicolon));
3370 copy.element = node.element;
3371 return copy;
3372 }
3373
3374 @override
3375 PartOfDirective visitPartOfDirective(PartOfDirective node) {
3376 PartOfDirective copy = new PartOfDirective(
3377 _cloneNode(node.documentationComment),
3378 _cloneNodeList(node.metadata),
3379 _mapToken(node.partKeyword),
3380 _mapToken(node.ofKeyword),
3381 _cloneNode(node.libraryName),
3382 _mapToken(node.semicolon));
3383 copy.element = node.element;
3384 return copy;
3385 }
3386
3387 @override
3388 PostfixExpression visitPostfixExpression(PostfixExpression node) {
3389 PostfixExpression copy = new PostfixExpression(
3390 _cloneNode(node.operand), _mapToken(node.operator));
3391 copy.propagatedElement = node.propagatedElement;
3392 copy.propagatedType = node.propagatedType;
3393 copy.staticElement = node.staticElement;
3394 copy.staticType = node.staticType;
3395 return copy;
3396 }
3397
3398 @override
3399 PrefixedIdentifier visitPrefixedIdentifier(PrefixedIdentifier node) {
3400 PrefixedIdentifier copy = new PrefixedIdentifier(_cloneNode(node.prefix),
3401 _mapToken(node.period), _cloneNode(node.identifier));
3402 copy.propagatedType = node.propagatedType;
3403 copy.staticType = node.staticType;
3404 return copy;
3405 }
3406
3407 @override
3408 PrefixExpression visitPrefixExpression(PrefixExpression node) {
3409 PrefixExpression copy = new PrefixExpression(
3410 _mapToken(node.operator), _cloneNode(node.operand));
3411 copy.propagatedElement = node.propagatedElement;
3412 copy.propagatedType = node.propagatedType;
3413 copy.staticElement = node.staticElement;
3414 copy.staticType = node.staticType;
3415 return copy;
3416 }
3417
3418 @override
3419 PropertyAccess visitPropertyAccess(PropertyAccess node) {
3420 PropertyAccess copy = new PropertyAccess(_cloneNode(node.target),
3421 _mapToken(node.operator), _cloneNode(node.propertyName));
3422 copy.propagatedType = node.propagatedType;
3423 copy.staticType = node.staticType;
3424 return copy;
3425 }
3426
3427 @override
3428 RedirectingConstructorInvocation visitRedirectingConstructorInvocation(
3429 RedirectingConstructorInvocation node) {
3430 RedirectingConstructorInvocation copy =
3431 new RedirectingConstructorInvocation(
3432 _mapToken(node.thisKeyword),
3433 _mapToken(node.period),
3434 _cloneNode(node.constructorName),
3435 _cloneNode(node.argumentList));
3436 copy.staticElement = node.staticElement;
3437 return copy;
3438 }
3439
3440 @override
3441 RethrowExpression visitRethrowExpression(RethrowExpression node) {
3442 RethrowExpression copy =
3443 new RethrowExpression(_mapToken(node.rethrowKeyword));
3444 copy.propagatedType = node.propagatedType;
3445 copy.staticType = node.staticType;
3446 return copy;
3447 }
3448
3449 @override
3450 ReturnStatement visitReturnStatement(ReturnStatement node) =>
3451 new ReturnStatement(_mapToken(node.returnKeyword),
3452 _cloneNode(node.expression), _mapToken(node.semicolon));
3453
3454 @override
3455 ScriptTag visitScriptTag(ScriptTag node) =>
3456 new ScriptTag(_mapToken(node.scriptTag));
3457
3458 @override
3459 ShowCombinator visitShowCombinator(ShowCombinator node) => new ShowCombinator(
3460 _mapToken(node.keyword), _cloneNodeList(node.shownNames));
3461
3462 @override
3463 SimpleFormalParameter visitSimpleFormalParameter(
3464 SimpleFormalParameter node) =>
3465 new SimpleFormalParameter(
3466 _cloneNode(node.documentationComment),
3467 _cloneNodeList(node.metadata),
3468 _mapToken(node.keyword),
3469 _cloneNode(node.type),
3470 _cloneNode(node.identifier));
3471
3472 @override
3473 SimpleIdentifier visitSimpleIdentifier(SimpleIdentifier node) {
3474 Token mappedToken = _mapToken(node.token);
3475 if (mappedToken == null) {
3476 // This only happens for SimpleIdentifiers created by the parser as part
3477 // of scanning documentation comments (the tokens for those identifiers
3478 // are not in the original token stream and hence do not get copied).
3479 // This extra check can be removed if the scanner is changed to scan
3480 // documentation comments for the parser.
3481 mappedToken = node.token;
3482 }
3483 SimpleIdentifier copy = new SimpleIdentifier(mappedToken,
3484 isDeclaration: node.inDeclarationContext());
3485 copy.auxiliaryElements = node.auxiliaryElements;
3486 copy.propagatedElement = node.propagatedElement;
3487 copy.propagatedType = node.propagatedType;
3488 copy.staticElement = node.staticElement;
3489 copy.staticType = node.staticType;
3490 return copy;
3491 }
3492
3493 @override
3494 SimpleStringLiteral visitSimpleStringLiteral(SimpleStringLiteral node) {
3495 SimpleStringLiteral copy =
3496 new SimpleStringLiteral(_mapToken(node.literal), node.value);
3497 copy.propagatedType = node.propagatedType;
3498 copy.staticType = node.staticType;
3499 return copy;
3500 }
3501
3502 @override
3503 StringInterpolation visitStringInterpolation(StringInterpolation node) {
3504 StringInterpolation copy =
3505 new StringInterpolation(_cloneNodeList(node.elements));
3506 copy.propagatedType = node.propagatedType;
3507 copy.staticType = node.staticType;
3508 return copy;
3509 }
3510
3511 @override
3512 SuperConstructorInvocation visitSuperConstructorInvocation(
3513 SuperConstructorInvocation node) {
3514 SuperConstructorInvocation copy = new SuperConstructorInvocation(
3515 _mapToken(node.superKeyword),
3516 _mapToken(node.period),
3517 _cloneNode(node.constructorName),
3518 _cloneNode(node.argumentList));
3519 copy.staticElement = node.staticElement;
3520 return copy;
3521 }
3522
3523 @override
3524 SuperExpression visitSuperExpression(SuperExpression node) {
3525 SuperExpression copy = new SuperExpression(_mapToken(node.superKeyword));
3526 copy.propagatedType = node.propagatedType;
3527 copy.staticType = node.staticType;
3528 return copy;
3529 }
3530
3531 @override
3532 SwitchCase visitSwitchCase(SwitchCase node) => new SwitchCase(
3533 _cloneNodeList(node.labels),
3534 _mapToken(node.keyword),
3535 _cloneNode(node.expression),
3536 _mapToken(node.colon),
3537 _cloneNodeList(node.statements));
3538
3539 @override
3540 SwitchDefault visitSwitchDefault(SwitchDefault node) => new SwitchDefault(
3541 _cloneNodeList(node.labels),
3542 _mapToken(node.keyword),
3543 _mapToken(node.colon),
3544 _cloneNodeList(node.statements));
3545
3546 @override
3547 SwitchStatement visitSwitchStatement(SwitchStatement node) =>
3548 new SwitchStatement(
3549 _mapToken(node.switchKeyword),
3550 _mapToken(node.leftParenthesis),
3551 _cloneNode(node.expression),
3552 _mapToken(node.rightParenthesis),
3553 _mapToken(node.leftBracket),
3554 _cloneNodeList(node.members),
3555 _mapToken(node.rightBracket));
3556
3557 @override
3558 AstNode visitSymbolLiteral(SymbolLiteral node) {
3559 SymbolLiteral copy = new SymbolLiteral(
3560 _mapToken(node.poundSign), _mapTokens(node.components));
3561 copy.propagatedType = node.propagatedType;
3562 copy.staticType = node.staticType;
3563 return copy;
3564 }
3565
3566 @override
3567 ThisExpression visitThisExpression(ThisExpression node) {
3568 ThisExpression copy = new ThisExpression(_mapToken(node.thisKeyword));
3569 copy.propagatedType = node.propagatedType;
3570 copy.staticType = node.staticType;
3571 return copy;
3572 }
3573
3574 @override
3575 ThrowExpression visitThrowExpression(ThrowExpression node) {
3576 ThrowExpression copy = new ThrowExpression(
3577 _mapToken(node.throwKeyword), _cloneNode(node.expression));
3578 copy.propagatedType = node.propagatedType;
3579 copy.staticType = node.staticType;
3580 return copy;
3581 }
3582
3583 @override
3584 TopLevelVariableDeclaration visitTopLevelVariableDeclaration(
3585 TopLevelVariableDeclaration node) =>
3586 new TopLevelVariableDeclaration(
3587 _cloneNode(node.documentationComment),
3588 _cloneNodeList(node.metadata),
3589 _cloneNode(node.variables),
3590 _mapToken(node.semicolon));
3591
3592 @override
3593 TryStatement visitTryStatement(TryStatement node) => new TryStatement(
3594 _mapToken(node.tryKeyword),
3595 _cloneNode(node.body),
3596 _cloneNodeList(node.catchClauses),
3597 _mapToken(node.finallyKeyword),
3598 _cloneNode(node.finallyBlock));
3599
3600 @override
3601 TypeArgumentList visitTypeArgumentList(TypeArgumentList node) =>
3602 new TypeArgumentList(_mapToken(node.leftBracket),
3603 _cloneNodeList(node.arguments), _mapToken(node.rightBracket));
3604
3605 @override
3606 TypeName visitTypeName(TypeName node) {
3607 TypeName copy =
3608 new TypeName(_cloneNode(node.name), _cloneNode(node.typeArguments));
3609 copy.type = node.type;
3610 return copy;
3611 }
3612
3613 @override
3614 TypeParameter visitTypeParameter(TypeParameter node) => new TypeParameter(
3615 _cloneNode(node.documentationComment),
3616 _cloneNodeList(node.metadata),
3617 _cloneNode(node.name),
3618 _mapToken(node.extendsKeyword),
3619 _cloneNode(node.bound));
3620
3621 @override
3622 TypeParameterList visitTypeParameterList(TypeParameterList node) =>
3623 new TypeParameterList(_mapToken(node.leftBracket),
3624 _cloneNodeList(node.typeParameters), _mapToken(node.rightBracket));
3625
3626 @override
3627 VariableDeclaration visitVariableDeclaration(VariableDeclaration node) =>
3628 new VariableDeclaration(_cloneNode(node.name), _mapToken(node.equals),
3629 _cloneNode(node.initializer));
3630
3631 @override
3632 VariableDeclarationList visitVariableDeclarationList(
3633 VariableDeclarationList node) =>
3634 new VariableDeclarationList(
3635 null,
3636 _cloneNodeList(node.metadata),
3637 _mapToken(node.keyword),
3638 _cloneNode(node.type),
3639 _cloneNodeList(node.variables));
3640
3641 @override
3642 VariableDeclarationStatement visitVariableDeclarationStatement(
3643 VariableDeclarationStatement node) =>
3644 new VariableDeclarationStatement(
3645 _cloneNode(node.variables), _mapToken(node.semicolon));
3646
3647 @override
3648 WhileStatement visitWhileStatement(WhileStatement node) => new WhileStatement(
3649 _mapToken(node.whileKeyword),
3650 _mapToken(node.leftParenthesis),
3651 _cloneNode(node.condition),
3652 _mapToken(node.rightParenthesis),
3653 _cloneNode(node.body));
3654
3655 @override
3656 WithClause visitWithClause(WithClause node) => new WithClause(
3657 _mapToken(node.withKeyword), _cloneNodeList(node.mixinTypes));
3658
3659 @override
3660 YieldStatement visitYieldStatement(YieldStatement node) => new YieldStatement(
3661 _mapToken(node.yieldKeyword),
3662 _mapToken(node.star),
3663 _cloneNode(node.expression),
3664 _mapToken(node.semicolon));
3665
3666 AstNode/*=E*/ _cloneNode/*<E extends AstNode>*/(AstNode/*=E*/ node) {
3667 if (node == null) {
3668 return null;
3669 }
3670 if (identical(node, _oldNode)) {
3671 return _newNode as AstNode/*=E*/;
3672 }
3673 return node.accept(this) as AstNode/*=E*/;
3674 }
3675
3676 List/*<E>*/ _cloneNodeList/*<E extends AstNode>*/(NodeList/*<E>*/ nodes) {
3677 List/*<E>*/ clonedNodes = new List/*<E>*/();
3678 for (AstNode/*=E*/ node in nodes) {
3679 clonedNodes.add(_cloneNode(node));
3680 }
3681 return clonedNodes;
3682 }
3683
3684 Token _mapToken(Token oldToken) {
3685 if (oldToken == null) {
3686 return null;
3687 }
3688 return _tokenMap.get(oldToken);
3689 }
3690
3691 List<Token> _mapTokens(List<Token> oldTokens) {
3692 List<Token> newTokens = new List<Token>(oldTokens.length);
3693 for (int index = 0; index < newTokens.length; index++) {
3694 newTokens[index] = _mapToken(oldTokens[index]);
3695 }
3696 return newTokens;
3697 }
3698 }
3699
3700 /**
3701 * An object used to locate the [AstNode] associated with a source range, given
3702 * the AST structure built from the source. More specifically, they will return
3703 * the [AstNode] with the shortest length whose source range completely
3704 * encompasses the specified range.
3705 */
3706 class NodeLocator extends UnifyingAstVisitor<Object> {
3707 /**
3708 * The start offset of the range used to identify the node.
3709 */
3710 int _startOffset = 0;
3711
3712 /**
3713 * The end offset of the range used to identify the node.
3714 */
3715 int _endOffset = 0;
3716
3717 /**
3718 * The element that was found that corresponds to the given source range, or
3719 * `null` if there is no such element.
3720 */
3721 AstNode _foundNode;
3722
3723 /**
3724 * Initialize a newly created locator to locate an [AstNode] by locating the
3725 * node within an AST structure that corresponds to the given range of
3726 * characters (between the [startOffset] and [endOffset] in the source.
3727 */
3728 NodeLocator(int startOffset, [int endOffset])
3729 : this._startOffset = startOffset,
3730 this._endOffset = endOffset ?? startOffset;
3731
3732 /**
3733 * Return the node that was found that corresponds to the given source range
3734 * or `null` if there is no such node.
3735 */
3736 AstNode get foundNode => _foundNode;
3737
3738 /**
3739 * Search within the given AST [node] for an identifier representing an
3740 * element in the specified source range. Return the element that was found,
3741 * or `null` if no element was found.
3742 */
3743 AstNode searchWithin(AstNode node) {
3744 if (node == null) {
3745 return null;
3746 }
3747 try {
3748 node.accept(this);
3749 } catch (exception, stackTrace) {
3750 AnalysisEngine.instance.logger.logInformation(
3751 "Unable to locate element at offset ($_startOffset - $_endOffset)",
3752 new CaughtException(exception, stackTrace));
3753 return null;
3754 }
3755 return _foundNode;
3756 }
3757
3758 @override
3759 Object visitNode(AstNode node) {
3760 // Don't visit a new tree if the result has been already found.
3761 if (_foundNode != null) {
3762 return null;
3763 }
3764 // Check whether the current node covers the selection.
3765 Token beginToken = node.beginToken;
3766 Token endToken = node.endToken;
3767 // Don't include synthetic tokens.
3768 while (endToken != beginToken) {
3769 if (endToken.type == TokenType.EOF || !endToken.isSynthetic) {
3770 break;
3771 }
3772 endToken = endToken.previous;
3773 }
3774 int end = endToken.end;
3775 int start = node.offset;
3776 if (end < _startOffset) {
3777 return null;
3778 }
3779 if (start > _endOffset) {
3780 return null;
3781 }
3782 // Check children.
3783 try {
3784 node.visitChildren(this);
3785 } catch (exception, stackTrace) {
3786 // Ignore the exception and proceed in order to visit the rest of the
3787 // structure.
3788 AnalysisEngine.instance.logger.logInformation(
3789 "Exception caught while traversing an AST structure.",
3790 new CaughtException(exception, stackTrace));
3791 }
3792 // Found a child.
3793 if (_foundNode != null) {
3794 return null;
3795 }
3796 // Check this node.
3797 if (start <= _startOffset && _endOffset <= end) {
3798 _foundNode = node;
3799 }
3800 return null;
3801 }
3802 }
3803
3804 /**
3805 * An object used to locate the [AstNode] associated with a source range.
3806 * More specifically, they will return the deepest [AstNode] which completely
3807 * encompasses the specified range.
3808 */
3809 class NodeLocator2 extends UnifyingAstVisitor<Object> {
3810 /**
3811 * The inclusive start offset of the range used to identify the node.
3812 */
3813 int _startOffset = 0;
3814
3815 /**
3816 * The inclusive end offset of the range used to identify the node.
3817 */
3818 int _endOffset = 0;
3819
3820 /**
3821 * The found node or `null` if there is no such node.
3822 */
3823 AstNode _foundNode;
3824
3825 /**
3826 * Initialize a newly created locator to locate the deepest [AstNode] for
3827 * which `node.offset <= [startOffset]` and `[endOffset] < node.end`.
3828 *
3829 * If [endOffset] is not provided, then it is considered the same as the
3830 * given [startOffset].
3831 */
3832 NodeLocator2(int startOffset, [int endOffset])
3833 : this._startOffset = startOffset,
3834 this._endOffset = endOffset ?? startOffset;
3835
3836 /**
3837 * Search within the given AST [node] and return the node that was found,
3838 * or `null` if no node was found.
3839 */
3840 AstNode searchWithin(AstNode node) {
3841 if (node == null) {
3842 return null;
3843 }
3844 try {
3845 node.accept(this);
3846 } catch (exception, stackTrace) {
3847 AnalysisEngine.instance.logger.logInformation(
3848 "Unable to locate element at offset ($_startOffset - $_endOffset)",
3849 new CaughtException(exception, stackTrace));
3850 return null;
3851 }
3852 return _foundNode;
3853 }
3854
3855 @override
3856 Object visitNode(AstNode node) {
3857 // Don't visit a new tree if the result has been already found.
3858 if (_foundNode != null) {
3859 return null;
3860 }
3861 // Check whether the current node covers the selection.
3862 Token beginToken = node.beginToken;
3863 Token endToken = node.endToken;
3864 // Don't include synthetic tokens.
3865 while (endToken != beginToken) {
3866 if (endToken.type == TokenType.EOF || !endToken.isSynthetic) {
3867 break;
3868 }
3869 endToken = endToken.previous;
3870 }
3871 int end = endToken.end;
3872 int start = node.offset;
3873 if (end <= _startOffset) {
3874 return null;
3875 }
3876 if (start > _endOffset) {
3877 return null;
3878 }
3879 // Check children.
3880 try {
3881 node.visitChildren(this);
3882 } catch (exception, stackTrace) {
3883 // Ignore the exception and proceed in order to visit the rest of the
3884 // structure.
3885 AnalysisEngine.instance.logger.logInformation(
3886 "Exception caught while traversing an AST structure.",
3887 new CaughtException(exception, stackTrace));
3888 }
3889 // Found a child.
3890 if (_foundNode != null) {
3891 return null;
3892 }
3893 // Check this node.
3894 if (start <= _startOffset && _endOffset < end) {
3895 _foundNode = node;
3896 }
3897 return null;
3898 }
3899 }
3900
3901 /**
3902 * An object that will replace one child node in an AST node with another node.
3903 */
3904 class NodeReplacer implements AstVisitor<bool> {
3905 /**
3906 * The node being replaced.
3907 */
3908 final AstNode _oldNode;
3909
3910 /**
3911 * The node that is replacing the old node.
3912 */
3913 final AstNode _newNode;
3914
3915 /**
3916 * Initialize a newly created node locator to replace the [_oldNode] with the
3917 * [_newNode].
3918 */
3919 NodeReplacer(this._oldNode, this._newNode);
3920
3921 @override
3922 bool visitAdjacentStrings(AdjacentStrings node) {
3923 if (_replaceInList(node.strings)) {
3924 return true;
3925 }
3926 return visitNode(node);
3927 }
3928
3929 bool visitAnnotatedNode(AnnotatedNode node) {
3930 if (identical(node.documentationComment, _oldNode)) {
3931 node.documentationComment = _newNode as Comment;
3932 return true;
3933 } else if (_replaceInList(node.metadata)) {
3934 return true;
3935 }
3936 return visitNode(node);
3937 }
3938
3939 @override
3940 bool visitAnnotation(Annotation node) {
3941 if (identical(node.arguments, _oldNode)) {
3942 node.arguments = _newNode as ArgumentList;
3943 return true;
3944 } else if (identical(node.constructorName, _oldNode)) {
3945 node.constructorName = _newNode as SimpleIdentifier;
3946 return true;
3947 } else if (identical(node.name, _oldNode)) {
3948 node.name = _newNode as Identifier;
3949 return true;
3950 }
3951 return visitNode(node);
3952 }
3953
3954 @override
3955 bool visitArgumentList(ArgumentList node) {
3956 if (_replaceInList(node.arguments)) {
3957 return true;
3958 }
3959 return visitNode(node);
3960 }
3961
3962 @override
3963 bool visitAsExpression(AsExpression node) {
3964 if (identical(node.expression, _oldNode)) {
3965 node.expression = _newNode as Expression;
3966 return true;
3967 } else if (identical(node.type, _oldNode)) {
3968 node.type = _newNode as TypeName;
3969 return true;
3970 }
3971 return visitNode(node);
3972 }
3973
3974 @override
3975 bool visitAssertStatement(AssertStatement node) {
3976 if (identical(node.condition, _oldNode)) {
3977 node.condition = _newNode as Expression;
3978 return true;
3979 }
3980 if (identical(node.message, _oldNode)) {
3981 node.message = _newNode as Expression;
3982 return true;
3983 }
3984 return visitNode(node);
3985 }
3986
3987 @override
3988 bool visitAssignmentExpression(AssignmentExpression node) {
3989 if (identical(node.leftHandSide, _oldNode)) {
3990 node.leftHandSide = _newNode as Expression;
3991 return true;
3992 } else if (identical(node.rightHandSide, _oldNode)) {
3993 node.rightHandSide = _newNode as Expression;
3994 return true;
3995 }
3996 return visitNode(node);
3997 }
3998
3999 @override
4000 bool visitAwaitExpression(AwaitExpression node) {
4001 if (identical(node.expression, _oldNode)) {
4002 node.expression = _newNode as Expression;
4003 return true;
4004 }
4005 return visitNode(node);
4006 }
4007
4008 @override
4009 bool visitBinaryExpression(BinaryExpression node) {
4010 if (identical(node.leftOperand, _oldNode)) {
4011 node.leftOperand = _newNode as Expression;
4012 return true;
4013 } else if (identical(node.rightOperand, _oldNode)) {
4014 node.rightOperand = _newNode as Expression;
4015 return true;
4016 }
4017 return visitNode(node);
4018 }
4019
4020 @override
4021 bool visitBlock(Block node) {
4022 if (_replaceInList(node.statements)) {
4023 return true;
4024 }
4025 return visitNode(node);
4026 }
4027
4028 @override
4029 bool visitBlockFunctionBody(BlockFunctionBody node) {
4030 if (identical(node.block, _oldNode)) {
4031 node.block = _newNode as Block;
4032 return true;
4033 }
4034 return visitNode(node);
4035 }
4036
4037 @override
4038 bool visitBooleanLiteral(BooleanLiteral node) => visitNode(node);
4039
4040 @override
4041 bool visitBreakStatement(BreakStatement node) {
4042 if (identical(node.label, _oldNode)) {
4043 node.label = _newNode as SimpleIdentifier;
4044 return true;
4045 }
4046 return visitNode(node);
4047 }
4048
4049 @override
4050 bool visitCascadeExpression(CascadeExpression node) {
4051 if (identical(node.target, _oldNode)) {
4052 node.target = _newNode as Expression;
4053 return true;
4054 } else if (_replaceInList(node.cascadeSections)) {
4055 return true;
4056 }
4057 return visitNode(node);
4058 }
4059
4060 @override
4061 bool visitCatchClause(CatchClause node) {
4062 if (identical(node.exceptionType, _oldNode)) {
4063 node.exceptionType = _newNode as TypeName;
4064 return true;
4065 } else if (identical(node.exceptionParameter, _oldNode)) {
4066 node.exceptionParameter = _newNode as SimpleIdentifier;
4067 return true;
4068 } else if (identical(node.stackTraceParameter, _oldNode)) {
4069 node.stackTraceParameter = _newNode as SimpleIdentifier;
4070 return true;
4071 }
4072 return visitNode(node);
4073 }
4074
4075 @override
4076 bool visitClassDeclaration(ClassDeclaration node) {
4077 if (identical(node.name, _oldNode)) {
4078 node.name = _newNode as SimpleIdentifier;
4079 return true;
4080 } else if (identical(node.typeParameters, _oldNode)) {
4081 node.typeParameters = _newNode as TypeParameterList;
4082 return true;
4083 } else if (identical(node.extendsClause, _oldNode)) {
4084 node.extendsClause = _newNode as ExtendsClause;
4085 return true;
4086 } else if (identical(node.withClause, _oldNode)) {
4087 node.withClause = _newNode as WithClause;
4088 return true;
4089 } else if (identical(node.implementsClause, _oldNode)) {
4090 node.implementsClause = _newNode as ImplementsClause;
4091 return true;
4092 } else if (identical(node.nativeClause, _oldNode)) {
4093 node.nativeClause = _newNode as NativeClause;
4094 return true;
4095 } else if (_replaceInList(node.members)) {
4096 return true;
4097 }
4098 return visitAnnotatedNode(node);
4099 }
4100
4101 @override
4102 bool visitClassTypeAlias(ClassTypeAlias node) {
4103 if (identical(node.name, _oldNode)) {
4104 node.name = _newNode as SimpleIdentifier;
4105 return true;
4106 } else if (identical(node.typeParameters, _oldNode)) {
4107 node.typeParameters = _newNode as TypeParameterList;
4108 return true;
4109 } else if (identical(node.superclass, _oldNode)) {
4110 node.superclass = _newNode as TypeName;
4111 return true;
4112 } else if (identical(node.withClause, _oldNode)) {
4113 node.withClause = _newNode as WithClause;
4114 return true;
4115 } else if (identical(node.implementsClause, _oldNode)) {
4116 node.implementsClause = _newNode as ImplementsClause;
4117 return true;
4118 }
4119 return visitAnnotatedNode(node);
4120 }
4121
4122 @override
4123 bool visitComment(Comment node) {
4124 if (_replaceInList(node.references)) {
4125 return true;
4126 }
4127 return visitNode(node);
4128 }
4129
4130 @override
4131 bool visitCommentReference(CommentReference node) {
4132 if (identical(node.identifier, _oldNode)) {
4133 node.identifier = _newNode as Identifier;
4134 return true;
4135 }
4136 return visitNode(node);
4137 }
4138
4139 @override
4140 bool visitCompilationUnit(CompilationUnit node) {
4141 if (identical(node.scriptTag, _oldNode)) {
4142 node.scriptTag = _newNode as ScriptTag;
4143 return true;
4144 } else if (_replaceInList(node.directives)) {
4145 return true;
4146 } else if (_replaceInList(node.declarations)) {
4147 return true;
4148 }
4149 return visitNode(node);
4150 }
4151
4152 @override
4153 bool visitConditionalExpression(ConditionalExpression node) {
4154 if (identical(node.condition, _oldNode)) {
4155 node.condition = _newNode as Expression;
4156 return true;
4157 } else if (identical(node.thenExpression, _oldNode)) {
4158 node.thenExpression = _newNode as Expression;
4159 return true;
4160 } else if (identical(node.elseExpression, _oldNode)) {
4161 node.elseExpression = _newNode as Expression;
4162 return true;
4163 }
4164 return visitNode(node);
4165 }
4166
4167 @override
4168 bool visitConfiguration(Configuration node) {
4169 if (identical(node.name, _oldNode)) {
4170 node.name = _newNode as DottedName;
4171 return true;
4172 } else if (identical(node.value, _oldNode)) {
4173 node.value = _newNode as StringLiteral;
4174 return true;
4175 } else if (identical(node.uri, _oldNode)) {
4176 node.uri = _newNode as StringLiteral;
4177 return true;
4178 }
4179 return visitNode(node);
4180 }
4181
4182 @override
4183 bool visitConstructorDeclaration(ConstructorDeclaration node) {
4184 if (identical(node.returnType, _oldNode)) {
4185 node.returnType = _newNode as Identifier;
4186 return true;
4187 } else if (identical(node.name, _oldNode)) {
4188 node.name = _newNode as SimpleIdentifier;
4189 return true;
4190 } else if (identical(node.parameters, _oldNode)) {
4191 node.parameters = _newNode as FormalParameterList;
4192 return true;
4193 } else if (identical(node.redirectedConstructor, _oldNode)) {
4194 node.redirectedConstructor = _newNode as ConstructorName;
4195 return true;
4196 } else if (identical(node.body, _oldNode)) {
4197 node.body = _newNode as FunctionBody;
4198 return true;
4199 } else if (_replaceInList(node.initializers)) {
4200 return true;
4201 }
4202 return visitAnnotatedNode(node);
4203 }
4204
4205 @override
4206 bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
4207 if (identical(node.fieldName, _oldNode)) {
4208 node.fieldName = _newNode as SimpleIdentifier;
4209 return true;
4210 } else if (identical(node.expression, _oldNode)) {
4211 node.expression = _newNode as Expression;
4212 return true;
4213 }
4214 return visitNode(node);
4215 }
4216
4217 @override
4218 bool visitConstructorName(ConstructorName node) {
4219 if (identical(node.type, _oldNode)) {
4220 node.type = _newNode as TypeName;
4221 return true;
4222 } else if (identical(node.name, _oldNode)) {
4223 node.name = _newNode as SimpleIdentifier;
4224 return true;
4225 }
4226 return visitNode(node);
4227 }
4228
4229 @override
4230 bool visitContinueStatement(ContinueStatement node) {
4231 if (identical(node.label, _oldNode)) {
4232 node.label = _newNode as SimpleIdentifier;
4233 return true;
4234 }
4235 return visitNode(node);
4236 }
4237
4238 @override
4239 bool visitDeclaredIdentifier(DeclaredIdentifier node) {
4240 if (identical(node.type, _oldNode)) {
4241 node.type = _newNode as TypeName;
4242 return true;
4243 } else if (identical(node.identifier, _oldNode)) {
4244 node.identifier = _newNode as SimpleIdentifier;
4245 return true;
4246 }
4247 return visitAnnotatedNode(node);
4248 }
4249
4250 @override
4251 bool visitDefaultFormalParameter(DefaultFormalParameter node) {
4252 if (identical(node.parameter, _oldNode)) {
4253 node.parameter = _newNode as NormalFormalParameter;
4254 return true;
4255 } else if (identical(node.defaultValue, _oldNode)) {
4256 node.defaultValue = _newNode as Expression;
4257 return true;
4258 }
4259 return visitNode(node);
4260 }
4261
4262 @override
4263 bool visitDoStatement(DoStatement node) {
4264 if (identical(node.body, _oldNode)) {
4265 node.body = _newNode as Statement;
4266 return true;
4267 } else if (identical(node.condition, _oldNode)) {
4268 node.condition = _newNode as Expression;
4269 return true;
4270 }
4271 return visitNode(node);
4272 }
4273
4274 @override
4275 bool visitDottedName(DottedName node) {
4276 if (_replaceInList(node.components)) {
4277 return true;
4278 }
4279 return visitNode(node);
4280 }
4281
4282 @override
4283 bool visitDoubleLiteral(DoubleLiteral node) => visitNode(node);
4284
4285 @override
4286 bool visitEmptyFunctionBody(EmptyFunctionBody node) => visitNode(node);
4287
4288 @override
4289 bool visitEmptyStatement(EmptyStatement node) => visitNode(node);
4290
4291 @override
4292 bool visitEnumConstantDeclaration(EnumConstantDeclaration node) {
4293 if (identical(node.name, _oldNode)) {
4294 node.name = _newNode as SimpleIdentifier;
4295 return true;
4296 }
4297 return visitAnnotatedNode(node);
4298 }
4299
4300 @override
4301 bool visitEnumDeclaration(EnumDeclaration node) {
4302 if (identical(node.name, _oldNode)) {
4303 node.name = _newNode as SimpleIdentifier;
4304 return true;
4305 } else if (_replaceInList(node.constants)) {
4306 return true;
4307 }
4308 return visitAnnotatedNode(node);
4309 }
4310
4311 @override
4312 bool visitExportDirective(ExportDirective node) =>
4313 visitNamespaceDirective(node);
4314
4315 @override
4316 bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
4317 if (identical(node.expression, _oldNode)) {
4318 node.expression = _newNode as Expression;
4319 return true;
4320 }
4321 return visitNode(node);
4322 }
4323
4324 @override
4325 bool visitExpressionStatement(ExpressionStatement node) {
4326 if (identical(node.expression, _oldNode)) {
4327 node.expression = _newNode as Expression;
4328 return true;
4329 }
4330 return visitNode(node);
4331 }
4332
4333 @override
4334 bool visitExtendsClause(ExtendsClause node) {
4335 if (identical(node.superclass, _oldNode)) {
4336 node.superclass = _newNode as TypeName;
4337 return true;
4338 }
4339 return visitNode(node);
4340 }
4341
4342 @override
4343 bool visitFieldDeclaration(FieldDeclaration node) {
4344 if (identical(node.fields, _oldNode)) {
4345 node.fields = _newNode as VariableDeclarationList;
4346 return true;
4347 }
4348 return visitAnnotatedNode(node);
4349 }
4350
4351 @override
4352 bool visitFieldFormalParameter(FieldFormalParameter node) {
4353 if (identical(node.type, _oldNode)) {
4354 node.type = _newNode as TypeName;
4355 return true;
4356 } else if (identical(node.parameters, _oldNode)) {
4357 node.parameters = _newNode as FormalParameterList;
4358 return true;
4359 }
4360 return visitNormalFormalParameter(node);
4361 }
4362
4363 @override
4364 bool visitForEachStatement(ForEachStatement node) {
4365 if (identical(node.loopVariable, _oldNode)) {
4366 node.loopVariable = _newNode as DeclaredIdentifier;
4367 return true;
4368 } else if (identical(node.identifier, _oldNode)) {
4369 node.identifier = _newNode as SimpleIdentifier;
4370 return true;
4371 } else if (identical(node.iterable, _oldNode)) {
4372 node.iterable = _newNode as Expression;
4373 return true;
4374 } else if (identical(node.body, _oldNode)) {
4375 node.body = _newNode as Statement;
4376 return true;
4377 }
4378 return visitNode(node);
4379 }
4380
4381 @override
4382 bool visitFormalParameterList(FormalParameterList node) {
4383 if (_replaceInList(node.parameters)) {
4384 return true;
4385 }
4386 return visitNode(node);
4387 }
4388
4389 @override
4390 bool visitForStatement(ForStatement node) {
4391 if (identical(node.variables, _oldNode)) {
4392 node.variables = _newNode as VariableDeclarationList;
4393 return true;
4394 } else if (identical(node.initialization, _oldNode)) {
4395 node.initialization = _newNode as Expression;
4396 return true;
4397 } else if (identical(node.condition, _oldNode)) {
4398 node.condition = _newNode as Expression;
4399 return true;
4400 } else if (identical(node.body, _oldNode)) {
4401 node.body = _newNode as Statement;
4402 return true;
4403 } else if (_replaceInList(node.updaters)) {
4404 return true;
4405 }
4406 return visitNode(node);
4407 }
4408
4409 @override
4410 bool visitFunctionDeclaration(FunctionDeclaration node) {
4411 if (identical(node.returnType, _oldNode)) {
4412 node.returnType = _newNode as TypeName;
4413 return true;
4414 } else if (identical(node.name, _oldNode)) {
4415 node.name = _newNode as SimpleIdentifier;
4416 return true;
4417 } else if (identical(node.functionExpression, _oldNode)) {
4418 node.functionExpression = _newNode as FunctionExpression;
4419 return true;
4420 }
4421 return visitAnnotatedNode(node);
4422 }
4423
4424 @override
4425 bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
4426 if (identical(node.functionDeclaration, _oldNode)) {
4427 node.functionDeclaration = _newNode as FunctionDeclaration;
4428 return true;
4429 }
4430 return visitNode(node);
4431 }
4432
4433 @override
4434 bool visitFunctionExpression(FunctionExpression node) {
4435 if (identical(node.parameters, _oldNode)) {
4436 node.parameters = _newNode as FormalParameterList;
4437 return true;
4438 } else if (identical(node.body, _oldNode)) {
4439 node.body = _newNode as FunctionBody;
4440 return true;
4441 }
4442 return visitNode(node);
4443 }
4444
4445 @override
4446 bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
4447 if (identical(node.function, _oldNode)) {
4448 node.function = _newNode as Expression;
4449 return true;
4450 } else if (identical(node.argumentList, _oldNode)) {
4451 node.argumentList = _newNode as ArgumentList;
4452 return true;
4453 }
4454 return visitNode(node);
4455 }
4456
4457 @override
4458 bool visitFunctionTypeAlias(FunctionTypeAlias node) {
4459 if (identical(node.returnType, _oldNode)) {
4460 node.returnType = _newNode as TypeName;
4461 return true;
4462 } else if (identical(node.name, _oldNode)) {
4463 node.name = _newNode as SimpleIdentifier;
4464 return true;
4465 } else if (identical(node.typeParameters, _oldNode)) {
4466 node.typeParameters = _newNode as TypeParameterList;
4467 return true;
4468 } else if (identical(node.parameters, _oldNode)) {
4469 node.parameters = _newNode as FormalParameterList;
4470 return true;
4471 }
4472 return visitAnnotatedNode(node);
4473 }
4474
4475 @override
4476 bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
4477 if (identical(node.returnType, _oldNode)) {
4478 node.returnType = _newNode as TypeName;
4479 return true;
4480 } else if (identical(node.parameters, _oldNode)) {
4481 node.parameters = _newNode as FormalParameterList;
4482 return true;
4483 }
4484 return visitNormalFormalParameter(node);
4485 }
4486
4487 @override
4488 bool visitHideCombinator(HideCombinator node) {
4489 if (_replaceInList(node.hiddenNames)) {
4490 return true;
4491 }
4492 return visitNode(node);
4493 }
4494
4495 @override
4496 bool visitIfStatement(IfStatement node) {
4497 if (identical(node.condition, _oldNode)) {
4498 node.condition = _newNode as Expression;
4499 return true;
4500 } else if (identical(node.thenStatement, _oldNode)) {
4501 node.thenStatement = _newNode as Statement;
4502 return true;
4503 } else if (identical(node.elseStatement, _oldNode)) {
4504 node.elseStatement = _newNode as Statement;
4505 return true;
4506 }
4507 return visitNode(node);
4508 }
4509
4510 @override
4511 bool visitImplementsClause(ImplementsClause node) {
4512 if (_replaceInList(node.interfaces)) {
4513 return true;
4514 }
4515 return visitNode(node);
4516 }
4517
4518 @override
4519 bool visitImportDirective(ImportDirective node) {
4520 if (identical(node.prefix, _oldNode)) {
4521 node.prefix = _newNode as SimpleIdentifier;
4522 return true;
4523 }
4524 return visitNamespaceDirective(node);
4525 }
4526
4527 @override
4528 bool visitIndexExpression(IndexExpression node) {
4529 if (identical(node.target, _oldNode)) {
4530 node.target = _newNode as Expression;
4531 return true;
4532 } else if (identical(node.index, _oldNode)) {
4533 node.index = _newNode as Expression;
4534 return true;
4535 }
4536 return visitNode(node);
4537 }
4538
4539 @override
4540 bool visitInstanceCreationExpression(InstanceCreationExpression node) {
4541 if (identical(node.constructorName, _oldNode)) {
4542 node.constructorName = _newNode as ConstructorName;
4543 return true;
4544 } else if (identical(node.argumentList, _oldNode)) {
4545 node.argumentList = _newNode as ArgumentList;
4546 return true;
4547 }
4548 return visitNode(node);
4549 }
4550
4551 @override
4552 bool visitIntegerLiteral(IntegerLiteral node) => visitNode(node);
4553
4554 @override
4555 bool visitInterpolationExpression(InterpolationExpression node) {
4556 if (identical(node.expression, _oldNode)) {
4557 node.expression = _newNode as Expression;
4558 return true;
4559 }
4560 return visitNode(node);
4561 }
4562
4563 @override
4564 bool visitInterpolationString(InterpolationString node) => visitNode(node);
4565
4566 @override
4567 bool visitIsExpression(IsExpression node) {
4568 if (identical(node.expression, _oldNode)) {
4569 node.expression = _newNode as Expression;
4570 return true;
4571 } else if (identical(node.type, _oldNode)) {
4572 node.type = _newNode as TypeName;
4573 return true;
4574 }
4575 return visitNode(node);
4576 }
4577
4578 @override
4579 bool visitLabel(Label node) {
4580 if (identical(node.label, _oldNode)) {
4581 node.label = _newNode as SimpleIdentifier;
4582 return true;
4583 }
4584 return visitNode(node);
4585 }
4586
4587 @override
4588 bool visitLabeledStatement(LabeledStatement node) {
4589 if (identical(node.statement, _oldNode)) {
4590 node.statement = _newNode as Statement;
4591 return true;
4592 } else if (_replaceInList(node.labels)) {
4593 return true;
4594 }
4595 return visitNode(node);
4596 }
4597
4598 @override
4599 bool visitLibraryDirective(LibraryDirective node) {
4600 if (identical(node.name, _oldNode)) {
4601 node.name = _newNode as LibraryIdentifier;
4602 return true;
4603 }
4604 return visitAnnotatedNode(node);
4605 }
4606
4607 @override
4608 bool visitLibraryIdentifier(LibraryIdentifier node) {
4609 if (_replaceInList(node.components)) {
4610 return true;
4611 }
4612 return visitNode(node);
4613 }
4614
4615 @override
4616 bool visitListLiteral(ListLiteral node) {
4617 if (_replaceInList(node.elements)) {
4618 return true;
4619 }
4620 return visitTypedLiteral(node);
4621 }
4622
4623 @override
4624 bool visitMapLiteral(MapLiteral node) {
4625 if (_replaceInList(node.entries)) {
4626 return true;
4627 }
4628 return visitTypedLiteral(node);
4629 }
4630
4631 @override
4632 bool visitMapLiteralEntry(MapLiteralEntry node) {
4633 if (identical(node.key, _oldNode)) {
4634 node.key = _newNode as Expression;
4635 return true;
4636 } else if (identical(node.value, _oldNode)) {
4637 node.value = _newNode as Expression;
4638 return true;
4639 }
4640 return visitNode(node);
4641 }
4642
4643 @override
4644 bool visitMethodDeclaration(MethodDeclaration node) {
4645 if (identical(node.returnType, _oldNode)) {
4646 node.returnType = _newNode as TypeName;
4647 return true;
4648 } else if (identical(node.name, _oldNode)) {
4649 node.name = _newNode as SimpleIdentifier;
4650 return true;
4651 } else if (identical(node.parameters, _oldNode)) {
4652 node.parameters = _newNode as FormalParameterList;
4653 return true;
4654 } else if (identical(node.body, _oldNode)) {
4655 node.body = _newNode as FunctionBody;
4656 return true;
4657 }
4658 return visitAnnotatedNode(node);
4659 }
4660
4661 @override
4662 bool visitMethodInvocation(MethodInvocation node) {
4663 if (identical(node.target, _oldNode)) {
4664 node.target = _newNode as Expression;
4665 return true;
4666 } else if (identical(node.methodName, _oldNode)) {
4667 node.methodName = _newNode as SimpleIdentifier;
4668 return true;
4669 } else if (identical(node.argumentList, _oldNode)) {
4670 node.argumentList = _newNode as ArgumentList;
4671 return true;
4672 }
4673 return visitNode(node);
4674 }
4675
4676 @override
4677 bool visitNamedExpression(NamedExpression node) {
4678 if (identical(node.name, _oldNode)) {
4679 node.name = _newNode as Label;
4680 return true;
4681 } else if (identical(node.expression, _oldNode)) {
4682 node.expression = _newNode as Expression;
4683 return true;
4684 }
4685 return visitNode(node);
4686 }
4687
4688 bool visitNamespaceDirective(NamespaceDirective node) {
4689 if (_replaceInList(node.combinators)) {
4690 return true;
4691 }
4692 return visitUriBasedDirective(node);
4693 }
4694
4695 @override
4696 bool visitNativeClause(NativeClause node) {
4697 if (identical(node.name, _oldNode)) {
4698 node.name = _newNode as StringLiteral;
4699 return true;
4700 }
4701 return visitNode(node);
4702 }
4703
4704 @override
4705 bool visitNativeFunctionBody(NativeFunctionBody node) {
4706 if (identical(node.stringLiteral, _oldNode)) {
4707 node.stringLiteral = _newNode as StringLiteral;
4708 return true;
4709 }
4710 return visitNode(node);
4711 }
4712
4713 bool visitNode(AstNode node) {
4714 throw new ArgumentError("The old node is not a child of it's parent");
4715 }
4716
4717 bool visitNormalFormalParameter(NormalFormalParameter node) {
4718 if (identical(node.documentationComment, _oldNode)) {
4719 node.documentationComment = _newNode as Comment;
4720 return true;
4721 } else if (identical(node.identifier, _oldNode)) {
4722 node.identifier = _newNode as SimpleIdentifier;
4723 return true;
4724 } else if (_replaceInList(node.metadata)) {
4725 return true;
4726 }
4727 return visitNode(node);
4728 }
4729
4730 @override
4731 bool visitNullLiteral(NullLiteral node) => visitNode(node);
4732
4733 @override
4734 bool visitParenthesizedExpression(ParenthesizedExpression node) {
4735 if (identical(node.expression, _oldNode)) {
4736 node.expression = _newNode as Expression;
4737 return true;
4738 }
4739 return visitNode(node);
4740 }
4741
4742 @override
4743 bool visitPartDirective(PartDirective node) => visitUriBasedDirective(node);
4744
4745 @override
4746 bool visitPartOfDirective(PartOfDirective node) {
4747 if (identical(node.libraryName, _oldNode)) {
4748 node.libraryName = _newNode as LibraryIdentifier;
4749 return true;
4750 }
4751 return visitAnnotatedNode(node);
4752 }
4753
4754 @override
4755 bool visitPostfixExpression(PostfixExpression node) {
4756 if (identical(node.operand, _oldNode)) {
4757 node.operand = _newNode as Expression;
4758 return true;
4759 }
4760 return visitNode(node);
4761 }
4762
4763 @override
4764 bool visitPrefixedIdentifier(PrefixedIdentifier node) {
4765 if (identical(node.prefix, _oldNode)) {
4766 node.prefix = _newNode as SimpleIdentifier;
4767 return true;
4768 } else if (identical(node.identifier, _oldNode)) {
4769 node.identifier = _newNode as SimpleIdentifier;
4770 return true;
4771 }
4772 return visitNode(node);
4773 }
4774
4775 @override
4776 bool visitPrefixExpression(PrefixExpression node) {
4777 if (identical(node.operand, _oldNode)) {
4778 node.operand = _newNode as Expression;
4779 return true;
4780 }
4781 return visitNode(node);
4782 }
4783
4784 @override
4785 bool visitPropertyAccess(PropertyAccess node) {
4786 if (identical(node.target, _oldNode)) {
4787 node.target = _newNode as Expression;
4788 return true;
4789 } else if (identical(node.propertyName, _oldNode)) {
4790 node.propertyName = _newNode as SimpleIdentifier;
4791 return true;
4792 }
4793 return visitNode(node);
4794 }
4795
4796 @override
4797 bool visitRedirectingConstructorInvocation(
4798 RedirectingConstructorInvocation node) {
4799 if (identical(node.constructorName, _oldNode)) {
4800 node.constructorName = _newNode as SimpleIdentifier;
4801 return true;
4802 } else if (identical(node.argumentList, _oldNode)) {
4803 node.argumentList = _newNode as ArgumentList;
4804 return true;
4805 }
4806 return visitNode(node);
4807 }
4808
4809 @override
4810 bool visitRethrowExpression(RethrowExpression node) => visitNode(node);
4811
4812 @override
4813 bool visitReturnStatement(ReturnStatement node) {
4814 if (identical(node.expression, _oldNode)) {
4815 node.expression = _newNode as Expression;
4816 return true;
4817 }
4818 return visitNode(node);
4819 }
4820
4821 @override
4822 bool visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
4823
4824 @override
4825 bool visitShowCombinator(ShowCombinator node) {
4826 if (_replaceInList(node.shownNames)) {
4827 return true;
4828 }
4829 return visitNode(node);
4830 }
4831
4832 @override
4833 bool visitSimpleFormalParameter(SimpleFormalParameter node) {
4834 if (identical(node.type, _oldNode)) {
4835 node.type = _newNode as TypeName;
4836 return true;
4837 }
4838 return visitNormalFormalParameter(node);
4839 }
4840
4841 @override
4842 bool visitSimpleIdentifier(SimpleIdentifier node) => visitNode(node);
4843
4844 @override
4845 bool visitSimpleStringLiteral(SimpleStringLiteral node) => visitNode(node);
4846
4847 @override
4848 bool visitStringInterpolation(StringInterpolation node) {
4849 if (_replaceInList(node.elements)) {
4850 return true;
4851 }
4852 return visitNode(node);
4853 }
4854
4855 @override
4856 bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
4857 if (identical(node.constructorName, _oldNode)) {
4858 node.constructorName = _newNode as SimpleIdentifier;
4859 return true;
4860 } else if (identical(node.argumentList, _oldNode)) {
4861 node.argumentList = _newNode as ArgumentList;
4862 return true;
4863 }
4864 return visitNode(node);
4865 }
4866
4867 @override
4868 bool visitSuperExpression(SuperExpression node) => visitNode(node);
4869
4870 @override
4871 bool visitSwitchCase(SwitchCase node) {
4872 if (identical(node.expression, _oldNode)) {
4873 node.expression = _newNode as Expression;
4874 return true;
4875 }
4876 return visitSwitchMember(node);
4877 }
4878
4879 @override
4880 bool visitSwitchDefault(SwitchDefault node) => visitSwitchMember(node);
4881
4882 bool visitSwitchMember(SwitchMember node) {
4883 if (_replaceInList(node.labels)) {
4884 return true;
4885 } else if (_replaceInList(node.statements)) {
4886 return true;
4887 }
4888 return visitNode(node);
4889 }
4890
4891 @override
4892 bool visitSwitchStatement(SwitchStatement node) {
4893 if (identical(node.expression, _oldNode)) {
4894 node.expression = _newNode as Expression;
4895 return true;
4896 } else if (_replaceInList(node.members)) {
4897 return true;
4898 }
4899 return visitNode(node);
4900 }
4901
4902 @override
4903 bool visitSymbolLiteral(SymbolLiteral node) => visitNode(node);
4904
4905 @override
4906 bool visitThisExpression(ThisExpression node) => visitNode(node);
4907
4908 @override
4909 bool visitThrowExpression(ThrowExpression node) {
4910 if (identical(node.expression, _oldNode)) {
4911 node.expression = _newNode as Expression;
4912 return true;
4913 }
4914 return visitNode(node);
4915 }
4916
4917 @override
4918 bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
4919 if (identical(node.variables, _oldNode)) {
4920 node.variables = _newNode as VariableDeclarationList;
4921 return true;
4922 }
4923 return visitAnnotatedNode(node);
4924 }
4925
4926 @override
4927 bool visitTryStatement(TryStatement node) {
4928 if (identical(node.body, _oldNode)) {
4929 node.body = _newNode as Block;
4930 return true;
4931 } else if (identical(node.finallyBlock, _oldNode)) {
4932 node.finallyBlock = _newNode as Block;
4933 return true;
4934 } else if (_replaceInList(node.catchClauses)) {
4935 return true;
4936 }
4937 return visitNode(node);
4938 }
4939
4940 @override
4941 bool visitTypeArgumentList(TypeArgumentList node) {
4942 if (_replaceInList(node.arguments)) {
4943 return true;
4944 }
4945 return visitNode(node);
4946 }
4947
4948 bool visitTypedLiteral(TypedLiteral node) {
4949 if (identical(node.typeArguments, _oldNode)) {
4950 node.typeArguments = _newNode as TypeArgumentList;
4951 return true;
4952 }
4953 return visitNode(node);
4954 }
4955
4956 @override
4957 bool visitTypeName(TypeName node) {
4958 if (identical(node.name, _oldNode)) {
4959 node.name = _newNode as Identifier;
4960 return true;
4961 } else if (identical(node.typeArguments, _oldNode)) {
4962 node.typeArguments = _newNode as TypeArgumentList;
4963 return true;
4964 }
4965 return visitNode(node);
4966 }
4967
4968 @override
4969 bool visitTypeParameter(TypeParameter node) {
4970 if (identical(node.name, _oldNode)) {
4971 node.name = _newNode as SimpleIdentifier;
4972 return true;
4973 } else if (identical(node.bound, _oldNode)) {
4974 node.bound = _newNode as TypeName;
4975 return true;
4976 }
4977 return visitNode(node);
4978 }
4979
4980 @override
4981 bool visitTypeParameterList(TypeParameterList node) {
4982 if (_replaceInList(node.typeParameters)) {
4983 return true;
4984 }
4985 return visitNode(node);
4986 }
4987
4988 bool visitUriBasedDirective(UriBasedDirective node) {
4989 if (identical(node.uri, _oldNode)) {
4990 node.uri = _newNode as StringLiteral;
4991 return true;
4992 }
4993 return visitAnnotatedNode(node);
4994 }
4995
4996 @override
4997 bool visitVariableDeclaration(VariableDeclaration node) {
4998 if (identical(node.name, _oldNode)) {
4999 node.name = _newNode as SimpleIdentifier;
5000 return true;
5001 } else if (identical(node.initializer, _oldNode)) {
5002 node.initializer = _newNode as Expression;
5003 return true;
5004 }
5005 return visitAnnotatedNode(node);
5006 }
5007
5008 @override
5009 bool visitVariableDeclarationList(VariableDeclarationList node) {
5010 if (identical(node.type, _oldNode)) {
5011 node.type = _newNode as TypeName;
5012 return true;
5013 } else if (_replaceInList(node.variables)) {
5014 return true;
5015 }
5016 return visitAnnotatedNode(node);
5017 }
5018
5019 @override
5020 bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
5021 if (identical(node.variables, _oldNode)) {
5022 node.variables = _newNode as VariableDeclarationList;
5023 return true;
5024 }
5025 return visitNode(node);
5026 }
5027
5028 @override
5029 bool visitWhileStatement(WhileStatement node) {
5030 if (identical(node.condition, _oldNode)) {
5031 node.condition = _newNode as Expression;
5032 return true;
5033 } else if (identical(node.body, _oldNode)) {
5034 node.body = _newNode as Statement;
5035 return true;
5036 }
5037 return visitNode(node);
5038 }
5039
5040 @override
5041 bool visitWithClause(WithClause node) {
5042 if (_replaceInList(node.mixinTypes)) {
5043 return true;
5044 }
5045 return visitNode(node);
5046 }
5047
5048 @override
5049 bool visitYieldStatement(YieldStatement node) {
5050 if (identical(node.expression, _oldNode)) {
5051 node.expression = _newNode as Expression;
5052 return true;
5053 }
5054 return visitNode(node);
5055 }
5056
5057 bool _replaceInList(NodeList list) {
5058 int count = list.length;
5059 for (int i = 0; i < count; i++) {
5060 if (identical(_oldNode, list[i])) {
5061 list[i] = _newNode;
5062 return true;
5063 }
5064 }
5065 return false;
5066 }
5067
5068 /**
5069 * Replace the [oldNode] with the [newNode] in the AST structure containing
5070 * the old node. Return `true` if the replacement was successful.
5071 *
5072 * Throws an [ArgumentError] if either node is `null`, if the old node does
5073 * not have a parent node, or if the AST structure has been corrupted.
5074 */
5075 static bool replace(AstNode oldNode, AstNode newNode) {
5076 if (oldNode == null || newNode == null) {
5077 throw new ArgumentError("The old and new nodes must be non-null");
5078 } else if (identical(oldNode, newNode)) {
5079 return true;
5080 }
5081 AstNode parent = oldNode.parent;
5082 if (parent == null) {
5083 throw new ArgumentError("The old node is not a child of another node");
5084 }
5085 NodeReplacer replacer = new NodeReplacer(oldNode, newNode);
5086 return parent.accept(replacer);
5087 }
5088 }
5089
5090 /**
5091 * An object that copies resolution information from one AST structure to
5092 * another as long as the structures of the corresponding children of a pair of
5093 * nodes are the same.
5094 */
5095 class ResolutionCopier implements AstVisitor<bool> {
5096 /**
5097 * The AST node with which the node being visited is to be compared. This is
5098 * only valid at the beginning of each visit method (until [isEqualNodes] is
5099 * invoked).
5100 */
5101 AstNode _toNode;
5102
5103 @override
5104 bool visitAdjacentStrings(AdjacentStrings node) {
5105 AdjacentStrings toNode = this._toNode as AdjacentStrings;
5106 if (_isEqualNodeLists(node.strings, toNode.strings)) {
5107 toNode.staticType = node.staticType;
5108 toNode.propagatedType = node.propagatedType;
5109 return true;
5110 }
5111 return false;
5112 }
5113
5114 @override
5115 bool visitAnnotation(Annotation node) {
5116 Annotation toNode = this._toNode as Annotation;
5117 if (_and(
5118 _isEqualTokens(node.atSign, toNode.atSign),
5119 _isEqualNodes(node.name, toNode.name),
5120 _isEqualTokens(node.period, toNode.period),
5121 _isEqualNodes(node.constructorName, toNode.constructorName),
5122 _isEqualNodes(node.arguments, toNode.arguments))) {
5123 toNode.element = node.element;
5124 return true;
5125 }
5126 return false;
5127 }
5128
5129 @override
5130 bool visitArgumentList(ArgumentList node) {
5131 ArgumentList toNode = this._toNode as ArgumentList;
5132 return _and(
5133 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
5134 _isEqualNodeLists(node.arguments, toNode.arguments),
5135 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
5136 }
5137
5138 @override
5139 bool visitAsExpression(AsExpression node) {
5140 AsExpression toNode = this._toNode as AsExpression;
5141 if (_and(
5142 _isEqualNodes(node.expression, toNode.expression),
5143 _isEqualTokens(node.asOperator, toNode.asOperator),
5144 _isEqualNodes(node.type, toNode.type))) {
5145 toNode.propagatedType = node.propagatedType;
5146 toNode.staticType = node.staticType;
5147 return true;
5148 }
5149 return false;
5150 }
5151
5152 @override
5153 bool visitAssertStatement(AssertStatement node) {
5154 AssertStatement toNode = this._toNode as AssertStatement;
5155 return _and(
5156 _isEqualTokens(node.assertKeyword, toNode.assertKeyword),
5157 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
5158 _isEqualNodes(node.condition, toNode.condition),
5159 _isEqualTokens(node.comma, toNode.comma),
5160 _isEqualNodes(node.message, toNode.message),
5161 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
5162 _isEqualTokens(node.semicolon, toNode.semicolon));
5163 }
5164
5165 @override
5166 bool visitAssignmentExpression(AssignmentExpression node) {
5167 AssignmentExpression toNode = this._toNode as AssignmentExpression;
5168 if (_and(
5169 _isEqualNodes(node.leftHandSide, toNode.leftHandSide),
5170 _isEqualTokens(node.operator, toNode.operator),
5171 _isEqualNodes(node.rightHandSide, toNode.rightHandSide))) {
5172 toNode.propagatedElement = node.propagatedElement;
5173 toNode.propagatedType = node.propagatedType;
5174 toNode.staticElement = node.staticElement;
5175 toNode.staticType = node.staticType;
5176 return true;
5177 }
5178 return false;
5179 }
5180
5181 @override
5182 bool visitAwaitExpression(AwaitExpression node) {
5183 AwaitExpression toNode = this._toNode as AwaitExpression;
5184 if (_and(_isEqualTokens(node.awaitKeyword, toNode.awaitKeyword),
5185 _isEqualNodes(node.expression, toNode.expression))) {
5186 toNode.propagatedType = node.propagatedType;
5187 toNode.staticType = node.staticType;
5188 return true;
5189 }
5190 return false;
5191 }
5192
5193 @override
5194 bool visitBinaryExpression(BinaryExpression node) {
5195 BinaryExpression toNode = this._toNode as BinaryExpression;
5196 if (_and(
5197 _isEqualNodes(node.leftOperand, toNode.leftOperand),
5198 _isEqualTokens(node.operator, toNode.operator),
5199 _isEqualNodes(node.rightOperand, toNode.rightOperand))) {
5200 toNode.propagatedElement = node.propagatedElement;
5201 toNode.propagatedType = node.propagatedType;
5202 toNode.staticElement = node.staticElement;
5203 toNode.staticType = node.staticType;
5204 return true;
5205 }
5206 return false;
5207 }
5208
5209 @override
5210 bool visitBlock(Block node) {
5211 Block toNode = this._toNode as Block;
5212 return _and(
5213 _isEqualTokens(node.leftBracket, toNode.leftBracket),
5214 _isEqualNodeLists(node.statements, toNode.statements),
5215 _isEqualTokens(node.rightBracket, toNode.rightBracket));
5216 }
5217
5218 @override
5219 bool visitBlockFunctionBody(BlockFunctionBody node) {
5220 BlockFunctionBody toNode = this._toNode as BlockFunctionBody;
5221 return _isEqualNodes(node.block, toNode.block);
5222 }
5223
5224 @override
5225 bool visitBooleanLiteral(BooleanLiteral node) {
5226 BooleanLiteral toNode = this._toNode as BooleanLiteral;
5227 if (_and(_isEqualTokens(node.literal, toNode.literal),
5228 node.value == toNode.value)) {
5229 toNode.propagatedType = node.propagatedType;
5230 toNode.staticType = node.staticType;
5231 return true;
5232 }
5233 return false;
5234 }
5235
5236 @override
5237 bool visitBreakStatement(BreakStatement node) {
5238 BreakStatement toNode = this._toNode as BreakStatement;
5239 if (_and(
5240 _isEqualTokens(node.breakKeyword, toNode.breakKeyword),
5241 _isEqualNodes(node.label, toNode.label),
5242 _isEqualTokens(node.semicolon, toNode.semicolon))) {
5243 // TODO(paulberry): map node.target to toNode.target.
5244 return true;
5245 }
5246 return false;
5247 }
5248
5249 @override
5250 bool visitCascadeExpression(CascadeExpression node) {
5251 CascadeExpression toNode = this._toNode as CascadeExpression;
5252 if (_and(_isEqualNodes(node.target, toNode.target),
5253 _isEqualNodeLists(node.cascadeSections, toNode.cascadeSections))) {
5254 toNode.propagatedType = node.propagatedType;
5255 toNode.staticType = node.staticType;
5256 return true;
5257 }
5258 return false;
5259 }
5260
5261 @override
5262 bool visitCatchClause(CatchClause node) {
5263 CatchClause toNode = this._toNode as CatchClause;
5264 return _and(
5265 _isEqualTokens(node.onKeyword, toNode.onKeyword),
5266 _isEqualNodes(node.exceptionType, toNode.exceptionType),
5267 _isEqualTokens(node.catchKeyword, toNode.catchKeyword),
5268 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
5269 _isEqualNodes(node.exceptionParameter, toNode.exceptionParameter),
5270 _isEqualTokens(node.comma, toNode.comma),
5271 _isEqualNodes(node.stackTraceParameter, toNode.stackTraceParameter),
5272 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
5273 _isEqualNodes(node.body, toNode.body));
5274 }
5275
5276 @override
5277 bool visitClassDeclaration(ClassDeclaration node) {
5278 ClassDeclaration toNode = this._toNode as ClassDeclaration;
5279 return _and(
5280 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5281 _isEqualNodeLists(node.metadata, toNode.metadata),
5282 _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword),
5283 _isEqualTokens(node.classKeyword, toNode.classKeyword),
5284 _isEqualNodes(node.name, toNode.name),
5285 _isEqualNodes(node.typeParameters, toNode.typeParameters),
5286 _isEqualNodes(node.extendsClause, toNode.extendsClause),
5287 _isEqualNodes(node.withClause, toNode.withClause),
5288 _isEqualNodes(node.implementsClause, toNode.implementsClause),
5289 _isEqualTokens(node.leftBracket, toNode.leftBracket),
5290 _isEqualNodeLists(node.members, toNode.members),
5291 _isEqualTokens(node.rightBracket, toNode.rightBracket));
5292 }
5293
5294 @override
5295 bool visitClassTypeAlias(ClassTypeAlias node) {
5296 ClassTypeAlias toNode = this._toNode as ClassTypeAlias;
5297 return _and(
5298 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5299 _isEqualNodeLists(node.metadata, toNode.metadata),
5300 _isEqualTokens(node.typedefKeyword, toNode.typedefKeyword),
5301 _isEqualNodes(node.name, toNode.name),
5302 _isEqualNodes(node.typeParameters, toNode.typeParameters),
5303 _isEqualTokens(node.equals, toNode.equals),
5304 _isEqualTokens(node.abstractKeyword, toNode.abstractKeyword),
5305 _isEqualNodes(node.superclass, toNode.superclass),
5306 _isEqualNodes(node.withClause, toNode.withClause),
5307 _isEqualNodes(node.implementsClause, toNode.implementsClause),
5308 _isEqualTokens(node.semicolon, toNode.semicolon));
5309 }
5310
5311 @override
5312 bool visitComment(Comment node) {
5313 Comment toNode = this._toNode as Comment;
5314 return _isEqualNodeLists(node.references, toNode.references);
5315 }
5316
5317 @override
5318 bool visitCommentReference(CommentReference node) {
5319 CommentReference toNode = this._toNode as CommentReference;
5320 return _and(_isEqualTokens(node.newKeyword, toNode.newKeyword),
5321 _isEqualNodes(node.identifier, toNode.identifier));
5322 }
5323
5324 @override
5325 bool visitCompilationUnit(CompilationUnit node) {
5326 CompilationUnit toNode = this._toNode as CompilationUnit;
5327 if (_and(
5328 _isEqualTokens(node.beginToken, toNode.beginToken),
5329 _isEqualNodes(node.scriptTag, toNode.scriptTag),
5330 _isEqualNodeLists(node.directives, toNode.directives),
5331 _isEqualNodeLists(node.declarations, toNode.declarations),
5332 _isEqualTokens(node.endToken, toNode.endToken))) {
5333 toNode.element = node.element;
5334 return true;
5335 }
5336 return false;
5337 }
5338
5339 @override
5340 bool visitConditionalExpression(ConditionalExpression node) {
5341 ConditionalExpression toNode = this._toNode as ConditionalExpression;
5342 if (_and(
5343 _isEqualNodes(node.condition, toNode.condition),
5344 _isEqualTokens(node.question, toNode.question),
5345 _isEqualNodes(node.thenExpression, toNode.thenExpression),
5346 _isEqualTokens(node.colon, toNode.colon),
5347 _isEqualNodes(node.elseExpression, toNode.elseExpression))) {
5348 toNode.propagatedType = node.propagatedType;
5349 toNode.staticType = node.staticType;
5350 return true;
5351 }
5352 return false;
5353 }
5354
5355 @override
5356 bool visitConfiguration(Configuration node) {
5357 Configuration toNode = this._toNode as Configuration;
5358 if (_and(
5359 _isEqualTokens(node.ifKeyword, toNode.ifKeyword),
5360 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
5361 _isEqualNodes(node.name, toNode.name),
5362 _isEqualTokens(node.equalToken, toNode.equalToken),
5363 _isEqualNodes(node.value, toNode.value),
5364 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
5365 _isEqualNodes(node.uri, toNode.uri))) {
5366 return true;
5367 }
5368 return false;
5369 }
5370
5371 @override
5372 bool visitConstructorDeclaration(ConstructorDeclaration node) {
5373 ConstructorDeclaration toNode = this._toNode as ConstructorDeclaration;
5374 if (_and(
5375 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5376 _isEqualNodeLists(node.metadata, toNode.metadata),
5377 _isEqualTokens(node.externalKeyword, toNode.externalKeyword),
5378 _isEqualTokens(node.constKeyword, toNode.constKeyword),
5379 _isEqualTokens(node.factoryKeyword, toNode.factoryKeyword),
5380 _isEqualNodes(node.returnType, toNode.returnType),
5381 _isEqualTokens(node.period, toNode.period),
5382 _isEqualNodes(node.name, toNode.name),
5383 _isEqualNodes(node.parameters, toNode.parameters),
5384 _isEqualTokens(node.separator, toNode.separator),
5385 _isEqualNodeLists(node.initializers, toNode.initializers),
5386 _isEqualNodes(node.redirectedConstructor, toNode.redirectedConstructor),
5387 _isEqualNodes(node.body, toNode.body))) {
5388 toNode.element = node.element;
5389 return true;
5390 }
5391 return false;
5392 }
5393
5394 @override
5395 bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
5396 ConstructorFieldInitializer toNode =
5397 this._toNode as ConstructorFieldInitializer;
5398 return _and(
5399 _isEqualTokens(node.thisKeyword, toNode.thisKeyword),
5400 _isEqualTokens(node.period, toNode.period),
5401 _isEqualNodes(node.fieldName, toNode.fieldName),
5402 _isEqualTokens(node.equals, toNode.equals),
5403 _isEqualNodes(node.expression, toNode.expression));
5404 }
5405
5406 @override
5407 bool visitConstructorName(ConstructorName node) {
5408 ConstructorName toNode = this._toNode as ConstructorName;
5409 if (_and(
5410 _isEqualNodes(node.type, toNode.type),
5411 _isEqualTokens(node.period, toNode.period),
5412 _isEqualNodes(node.name, toNode.name))) {
5413 toNode.staticElement = node.staticElement;
5414 return true;
5415 }
5416 return false;
5417 }
5418
5419 @override
5420 bool visitContinueStatement(ContinueStatement node) {
5421 ContinueStatement toNode = this._toNode as ContinueStatement;
5422 if (_and(
5423 _isEqualTokens(node.continueKeyword, toNode.continueKeyword),
5424 _isEqualNodes(node.label, toNode.label),
5425 _isEqualTokens(node.semicolon, toNode.semicolon))) {
5426 // TODO(paulberry): map node.target to toNode.target.
5427 return true;
5428 }
5429 return false;
5430 }
5431
5432 @override
5433 bool visitDeclaredIdentifier(DeclaredIdentifier node) {
5434 DeclaredIdentifier toNode = this._toNode as DeclaredIdentifier;
5435 return _and(
5436 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5437 _isEqualNodeLists(node.metadata, toNode.metadata),
5438 _isEqualTokens(node.keyword, toNode.keyword),
5439 _isEqualNodes(node.type, toNode.type),
5440 _isEqualNodes(node.identifier, toNode.identifier));
5441 }
5442
5443 @override
5444 bool visitDefaultFormalParameter(DefaultFormalParameter node) {
5445 DefaultFormalParameter toNode = this._toNode as DefaultFormalParameter;
5446 return _and(
5447 _isEqualNodes(node.parameter, toNode.parameter),
5448 node.kind == toNode.kind,
5449 _isEqualTokens(node.separator, toNode.separator),
5450 _isEqualNodes(node.defaultValue, toNode.defaultValue));
5451 }
5452
5453 @override
5454 bool visitDoStatement(DoStatement node) {
5455 DoStatement toNode = this._toNode as DoStatement;
5456 return _and(
5457 _isEqualTokens(node.doKeyword, toNode.doKeyword),
5458 _isEqualNodes(node.body, toNode.body),
5459 _isEqualTokens(node.whileKeyword, toNode.whileKeyword),
5460 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
5461 _isEqualNodes(node.condition, toNode.condition),
5462 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
5463 _isEqualTokens(node.semicolon, toNode.semicolon));
5464 }
5465
5466 @override
5467 bool visitDottedName(DottedName node) {
5468 DottedName toNode = this._toNode as DottedName;
5469 return _isEqualNodeLists(node.components, toNode.components);
5470 }
5471
5472 @override
5473 bool visitDoubleLiteral(DoubleLiteral node) {
5474 DoubleLiteral toNode = this._toNode as DoubleLiteral;
5475 if (_and(_isEqualTokens(node.literal, toNode.literal),
5476 node.value == toNode.value)) {
5477 toNode.propagatedType = node.propagatedType;
5478 toNode.staticType = node.staticType;
5479 return true;
5480 }
5481 return false;
5482 }
5483
5484 @override
5485 bool visitEmptyFunctionBody(EmptyFunctionBody node) {
5486 EmptyFunctionBody toNode = this._toNode as EmptyFunctionBody;
5487 return _isEqualTokens(node.semicolon, toNode.semicolon);
5488 }
5489
5490 @override
5491 bool visitEmptyStatement(EmptyStatement node) {
5492 EmptyStatement toNode = this._toNode as EmptyStatement;
5493 return _isEqualTokens(node.semicolon, toNode.semicolon);
5494 }
5495
5496 @override
5497 bool visitEnumConstantDeclaration(EnumConstantDeclaration node) {
5498 EnumConstantDeclaration toNode = this._toNode as EnumConstantDeclaration;
5499 return _and(
5500 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5501 _isEqualNodeLists(node.metadata, toNode.metadata),
5502 _isEqualNodes(node.name, toNode.name));
5503 }
5504
5505 @override
5506 bool visitEnumDeclaration(EnumDeclaration node) {
5507 EnumDeclaration toNode = this._toNode as EnumDeclaration;
5508 return _and(
5509 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5510 _isEqualNodeLists(node.metadata, toNode.metadata),
5511 _isEqualTokens(node.enumKeyword, toNode.enumKeyword),
5512 _isEqualNodes(node.name, toNode.name),
5513 _isEqualTokens(node.leftBracket, toNode.leftBracket),
5514 _isEqualNodeLists(node.constants, toNode.constants),
5515 _isEqualTokens(node.rightBracket, toNode.rightBracket));
5516 }
5517
5518 @override
5519 bool visitExportDirective(ExportDirective node) {
5520 ExportDirective toNode = this._toNode as ExportDirective;
5521 if (_and(
5522 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5523 _isEqualNodeLists(node.metadata, toNode.metadata),
5524 _isEqualTokens(node.keyword, toNode.keyword),
5525 _isEqualNodes(node.uri, toNode.uri),
5526 _isEqualNodeLists(node.combinators, toNode.combinators),
5527 _isEqualTokens(node.semicolon, toNode.semicolon))) {
5528 toNode.element = node.element;
5529 return true;
5530 }
5531 return false;
5532 }
5533
5534 @override
5535 bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
5536 ExpressionFunctionBody toNode = this._toNode as ExpressionFunctionBody;
5537 return _and(
5538 _isEqualTokens(node.functionDefinition, toNode.functionDefinition),
5539 _isEqualNodes(node.expression, toNode.expression),
5540 _isEqualTokens(node.semicolon, toNode.semicolon));
5541 }
5542
5543 @override
5544 bool visitExpressionStatement(ExpressionStatement node) {
5545 ExpressionStatement toNode = this._toNode as ExpressionStatement;
5546 return _and(_isEqualNodes(node.expression, toNode.expression),
5547 _isEqualTokens(node.semicolon, toNode.semicolon));
5548 }
5549
5550 @override
5551 bool visitExtendsClause(ExtendsClause node) {
5552 ExtendsClause toNode = this._toNode as ExtendsClause;
5553 return _and(_isEqualTokens(node.extendsKeyword, toNode.extendsKeyword),
5554 _isEqualNodes(node.superclass, toNode.superclass));
5555 }
5556
5557 @override
5558 bool visitFieldDeclaration(FieldDeclaration node) {
5559 FieldDeclaration toNode = this._toNode as FieldDeclaration;
5560 return _and(
5561 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5562 _isEqualNodeLists(node.metadata, toNode.metadata),
5563 _isEqualTokens(node.staticKeyword, toNode.staticKeyword),
5564 _isEqualNodes(node.fields, toNode.fields),
5565 _isEqualTokens(node.semicolon, toNode.semicolon));
5566 }
5567
5568 @override
5569 bool visitFieldFormalParameter(FieldFormalParameter node) {
5570 FieldFormalParameter toNode = this._toNode as FieldFormalParameter;
5571 return _and(
5572 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5573 _isEqualNodeLists(node.metadata, toNode.metadata),
5574 _isEqualTokens(node.keyword, toNode.keyword),
5575 _isEqualNodes(node.type, toNode.type),
5576 _isEqualTokens(node.thisKeyword, toNode.thisKeyword),
5577 _isEqualTokens(node.period, toNode.period),
5578 _isEqualNodes(node.identifier, toNode.identifier));
5579 }
5580
5581 @override
5582 bool visitForEachStatement(ForEachStatement node) {
5583 ForEachStatement toNode = this._toNode as ForEachStatement;
5584 return _and(
5585 _isEqualTokens(node.forKeyword, toNode.forKeyword),
5586 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
5587 _isEqualNodes(node.loopVariable, toNode.loopVariable),
5588 _isEqualTokens(node.inKeyword, toNode.inKeyword),
5589 _isEqualNodes(node.iterable, toNode.iterable),
5590 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
5591 _isEqualNodes(node.body, toNode.body));
5592 }
5593
5594 @override
5595 bool visitFormalParameterList(FormalParameterList node) {
5596 FormalParameterList toNode = this._toNode as FormalParameterList;
5597 return _and(
5598 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
5599 _isEqualNodeLists(node.parameters, toNode.parameters),
5600 _isEqualTokens(node.leftDelimiter, toNode.leftDelimiter),
5601 _isEqualTokens(node.rightDelimiter, toNode.rightDelimiter),
5602 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis));
5603 }
5604
5605 @override
5606 bool visitForStatement(ForStatement node) {
5607 ForStatement toNode = this._toNode as ForStatement;
5608 return _and(
5609 _isEqualTokens(node.forKeyword, toNode.forKeyword),
5610 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
5611 _isEqualNodes(node.variables, toNode.variables),
5612 _isEqualNodes(node.initialization, toNode.initialization),
5613 _isEqualTokens(node.leftSeparator, toNode.leftSeparator),
5614 _isEqualNodes(node.condition, toNode.condition),
5615 _isEqualTokens(node.rightSeparator, toNode.rightSeparator),
5616 _isEqualNodeLists(node.updaters, toNode.updaters),
5617 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
5618 _isEqualNodes(node.body, toNode.body));
5619 }
5620
5621 @override
5622 bool visitFunctionDeclaration(FunctionDeclaration node) {
5623 FunctionDeclaration toNode = this._toNode as FunctionDeclaration;
5624 return _and(
5625 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5626 _isEqualNodeLists(node.metadata, toNode.metadata),
5627 _isEqualTokens(node.externalKeyword, toNode.externalKeyword),
5628 _isEqualNodes(node.returnType, toNode.returnType),
5629 _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword),
5630 _isEqualNodes(node.name, toNode.name),
5631 _isEqualNodes(node.functionExpression, toNode.functionExpression));
5632 }
5633
5634 @override
5635 bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
5636 FunctionDeclarationStatement toNode =
5637 this._toNode as FunctionDeclarationStatement;
5638 return _isEqualNodes(node.functionDeclaration, toNode.functionDeclaration);
5639 }
5640
5641 @override
5642 bool visitFunctionExpression(FunctionExpression node) {
5643 FunctionExpression toNode = this._toNode as FunctionExpression;
5644 if (_and(_isEqualNodes(node.parameters, toNode.parameters),
5645 _isEqualNodes(node.body, toNode.body))) {
5646 toNode.element = node.element;
5647 toNode.propagatedType = node.propagatedType;
5648 toNode.staticType = node.staticType;
5649 return true;
5650 }
5651 return false;
5652 }
5653
5654 @override
5655 bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
5656 FunctionExpressionInvocation toNode =
5657 this._toNode as FunctionExpressionInvocation;
5658 if (_and(
5659 _isEqualNodes(node.function, toNode.function),
5660 _isEqualNodes(node.typeArguments, toNode.typeArguments),
5661 _isEqualNodes(node.argumentList, toNode.argumentList))) {
5662 toNode.propagatedElement = node.propagatedElement;
5663 toNode.propagatedInvokeType = node.propagatedInvokeType;
5664 toNode.propagatedType = node.propagatedType;
5665 toNode.staticInvokeType = node.staticInvokeType;
5666 toNode.staticElement = node.staticElement;
5667 toNode.staticType = node.staticType;
5668 return true;
5669 }
5670 return false;
5671 }
5672
5673 @override
5674 bool visitFunctionTypeAlias(FunctionTypeAlias node) {
5675 FunctionTypeAlias toNode = this._toNode as FunctionTypeAlias;
5676 return _and(
5677 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5678 _isEqualNodeLists(node.metadata, toNode.metadata),
5679 _isEqualTokens(node.typedefKeyword, toNode.typedefKeyword),
5680 _isEqualNodes(node.returnType, toNode.returnType),
5681 _isEqualNodes(node.name, toNode.name),
5682 _isEqualNodes(node.typeParameters, toNode.typeParameters),
5683 _isEqualNodes(node.parameters, toNode.parameters),
5684 _isEqualTokens(node.semicolon, toNode.semicolon));
5685 }
5686
5687 @override
5688 bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
5689 FunctionTypedFormalParameter toNode =
5690 this._toNode as FunctionTypedFormalParameter;
5691 return _and(
5692 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5693 _isEqualNodeLists(node.metadata, toNode.metadata),
5694 _isEqualNodes(node.returnType, toNode.returnType),
5695 _isEqualNodes(node.identifier, toNode.identifier),
5696 _isEqualNodes(node.parameters, toNode.parameters));
5697 }
5698
5699 @override
5700 bool visitHideCombinator(HideCombinator node) {
5701 HideCombinator toNode = this._toNode as HideCombinator;
5702 return _and(_isEqualTokens(node.keyword, toNode.keyword),
5703 _isEqualNodeLists(node.hiddenNames, toNode.hiddenNames));
5704 }
5705
5706 @override
5707 bool visitIfStatement(IfStatement node) {
5708 IfStatement toNode = this._toNode as IfStatement;
5709 return _and(
5710 _isEqualTokens(node.ifKeyword, toNode.ifKeyword),
5711 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
5712 _isEqualNodes(node.condition, toNode.condition),
5713 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
5714 _isEqualNodes(node.thenStatement, toNode.thenStatement),
5715 _isEqualTokens(node.elseKeyword, toNode.elseKeyword),
5716 _isEqualNodes(node.elseStatement, toNode.elseStatement));
5717 }
5718
5719 @override
5720 bool visitImplementsClause(ImplementsClause node) {
5721 ImplementsClause toNode = this._toNode as ImplementsClause;
5722 return _and(
5723 _isEqualTokens(node.implementsKeyword, toNode.implementsKeyword),
5724 _isEqualNodeLists(node.interfaces, toNode.interfaces));
5725 }
5726
5727 @override
5728 bool visitImportDirective(ImportDirective node) {
5729 ImportDirective toNode = this._toNode as ImportDirective;
5730 if (_and(
5731 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5732 _isEqualNodeLists(node.metadata, toNode.metadata),
5733 _isEqualTokens(node.keyword, toNode.keyword),
5734 _isEqualNodes(node.uri, toNode.uri),
5735 _isEqualTokens(node.asKeyword, toNode.asKeyword),
5736 _isEqualNodes(node.prefix, toNode.prefix),
5737 _isEqualNodeLists(node.combinators, toNode.combinators),
5738 _isEqualTokens(node.semicolon, toNode.semicolon))) {
5739 toNode.element = node.element;
5740 return true;
5741 }
5742 return false;
5743 }
5744
5745 @override
5746 bool visitIndexExpression(IndexExpression node) {
5747 IndexExpression toNode = this._toNode as IndexExpression;
5748 if (_and(
5749 _isEqualNodes(node.target, toNode.target),
5750 _isEqualTokens(node.leftBracket, toNode.leftBracket),
5751 _isEqualNodes(node.index, toNode.index),
5752 _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
5753 toNode.auxiliaryElements = node.auxiliaryElements;
5754 toNode.propagatedElement = node.propagatedElement;
5755 toNode.propagatedType = node.propagatedType;
5756 toNode.staticElement = node.staticElement;
5757 toNode.staticType = node.staticType;
5758 return true;
5759 }
5760 return false;
5761 }
5762
5763 @override
5764 bool visitInstanceCreationExpression(InstanceCreationExpression node) {
5765 InstanceCreationExpression toNode =
5766 this._toNode as InstanceCreationExpression;
5767 if (_and(
5768 _isEqualTokens(node.keyword, toNode.keyword),
5769 _isEqualNodes(node.constructorName, toNode.constructorName),
5770 _isEqualNodes(node.argumentList, toNode.argumentList))) {
5771 toNode.propagatedType = node.propagatedType;
5772 toNode.staticElement = node.staticElement;
5773 toNode.staticType = node.staticType;
5774 return true;
5775 }
5776 return false;
5777 }
5778
5779 @override
5780 bool visitIntegerLiteral(IntegerLiteral node) {
5781 IntegerLiteral toNode = this._toNode as IntegerLiteral;
5782 if (_and(_isEqualTokens(node.literal, toNode.literal),
5783 node.value == toNode.value)) {
5784 toNode.propagatedType = node.propagatedType;
5785 toNode.staticType = node.staticType;
5786 return true;
5787 }
5788 return false;
5789 }
5790
5791 @override
5792 bool visitInterpolationExpression(InterpolationExpression node) {
5793 InterpolationExpression toNode = this._toNode as InterpolationExpression;
5794 return _and(
5795 _isEqualTokens(node.leftBracket, toNode.leftBracket),
5796 _isEqualNodes(node.expression, toNode.expression),
5797 _isEqualTokens(node.rightBracket, toNode.rightBracket));
5798 }
5799
5800 @override
5801 bool visitInterpolationString(InterpolationString node) {
5802 InterpolationString toNode = this._toNode as InterpolationString;
5803 return _and(_isEqualTokens(node.contents, toNode.contents),
5804 node.value == toNode.value);
5805 }
5806
5807 @override
5808 bool visitIsExpression(IsExpression node) {
5809 IsExpression toNode = this._toNode as IsExpression;
5810 if (_and(
5811 _isEqualNodes(node.expression, toNode.expression),
5812 _isEqualTokens(node.isOperator, toNode.isOperator),
5813 _isEqualTokens(node.notOperator, toNode.notOperator),
5814 _isEqualNodes(node.type, toNode.type))) {
5815 toNode.propagatedType = node.propagatedType;
5816 toNode.staticType = node.staticType;
5817 return true;
5818 }
5819 return false;
5820 }
5821
5822 @override
5823 bool visitLabel(Label node) {
5824 Label toNode = this._toNode as Label;
5825 return _and(_isEqualNodes(node.label, toNode.label),
5826 _isEqualTokens(node.colon, toNode.colon));
5827 }
5828
5829 @override
5830 bool visitLabeledStatement(LabeledStatement node) {
5831 LabeledStatement toNode = this._toNode as LabeledStatement;
5832 return _and(_isEqualNodeLists(node.labels, toNode.labels),
5833 _isEqualNodes(node.statement, toNode.statement));
5834 }
5835
5836 @override
5837 bool visitLibraryDirective(LibraryDirective node) {
5838 LibraryDirective toNode = this._toNode as LibraryDirective;
5839 if (_and(
5840 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5841 _isEqualNodeLists(node.metadata, toNode.metadata),
5842 _isEqualTokens(node.libraryKeyword, toNode.libraryKeyword),
5843 _isEqualNodes(node.name, toNode.name),
5844 _isEqualTokens(node.semicolon, toNode.semicolon))) {
5845 toNode.element = node.element;
5846 return true;
5847 }
5848 return false;
5849 }
5850
5851 @override
5852 bool visitLibraryIdentifier(LibraryIdentifier node) {
5853 LibraryIdentifier toNode = this._toNode as LibraryIdentifier;
5854 if (_isEqualNodeLists(node.components, toNode.components)) {
5855 toNode.propagatedType = node.propagatedType;
5856 toNode.staticType = node.staticType;
5857 return true;
5858 }
5859 return false;
5860 }
5861
5862 @override
5863 bool visitListLiteral(ListLiteral node) {
5864 ListLiteral toNode = this._toNode as ListLiteral;
5865 if (_and(
5866 _isEqualTokens(node.constKeyword, toNode.constKeyword),
5867 _isEqualNodes(node.typeArguments, toNode.typeArguments),
5868 _isEqualTokens(node.leftBracket, toNode.leftBracket),
5869 _isEqualNodeLists(node.elements, toNode.elements),
5870 _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
5871 toNode.propagatedType = node.propagatedType;
5872 toNode.staticType = node.staticType;
5873 return true;
5874 }
5875 return false;
5876 }
5877
5878 @override
5879 bool visitMapLiteral(MapLiteral node) {
5880 MapLiteral toNode = this._toNode as MapLiteral;
5881 if (_and(
5882 _isEqualTokens(node.constKeyword, toNode.constKeyword),
5883 _isEqualNodes(node.typeArguments, toNode.typeArguments),
5884 _isEqualTokens(node.leftBracket, toNode.leftBracket),
5885 _isEqualNodeLists(node.entries, toNode.entries),
5886 _isEqualTokens(node.rightBracket, toNode.rightBracket))) {
5887 toNode.propagatedType = node.propagatedType;
5888 toNode.staticType = node.staticType;
5889 return true;
5890 }
5891 return false;
5892 }
5893
5894 @override
5895 bool visitMapLiteralEntry(MapLiteralEntry node) {
5896 MapLiteralEntry toNode = this._toNode as MapLiteralEntry;
5897 return _and(
5898 _isEqualNodes(node.key, toNode.key),
5899 _isEqualTokens(node.separator, toNode.separator),
5900 _isEqualNodes(node.value, toNode.value));
5901 }
5902
5903 @override
5904 bool visitMethodDeclaration(MethodDeclaration node) {
5905 MethodDeclaration toNode = this._toNode as MethodDeclaration;
5906 return _and(
5907 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5908 _isEqualNodeLists(node.metadata, toNode.metadata),
5909 _isEqualTokens(node.externalKeyword, toNode.externalKeyword),
5910 _isEqualTokens(node.modifierKeyword, toNode.modifierKeyword),
5911 _isEqualNodes(node.returnType, toNode.returnType),
5912 _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword),
5913 _isEqualTokens(node.propertyKeyword, toNode.propertyKeyword),
5914 _isEqualNodes(node.name, toNode.name),
5915 _isEqualNodes(node.parameters, toNode.parameters),
5916 _isEqualNodes(node.body, toNode.body));
5917 }
5918
5919 @override
5920 bool visitMethodInvocation(MethodInvocation node) {
5921 MethodInvocation toNode = this._toNode as MethodInvocation;
5922 if (_and(
5923 _isEqualNodes(node.target, toNode.target),
5924 _isEqualTokens(node.operator, toNode.operator),
5925 _isEqualNodes(node.typeArguments, toNode.typeArguments),
5926 _isEqualNodes(node.methodName, toNode.methodName),
5927 _isEqualNodes(node.argumentList, toNode.argumentList))) {
5928 toNode.propagatedInvokeType = node.propagatedInvokeType;
5929 toNode.propagatedType = node.propagatedType;
5930 toNode.staticInvokeType = node.staticInvokeType;
5931 toNode.staticType = node.staticType;
5932 return true;
5933 }
5934 return false;
5935 }
5936
5937 @override
5938 bool visitNamedExpression(NamedExpression node) {
5939 NamedExpression toNode = this._toNode as NamedExpression;
5940 if (_and(_isEqualNodes(node.name, toNode.name),
5941 _isEqualNodes(node.expression, toNode.expression))) {
5942 toNode.propagatedType = node.propagatedType;
5943 toNode.staticType = node.staticType;
5944 return true;
5945 }
5946 return false;
5947 }
5948
5949 @override
5950 bool visitNativeClause(NativeClause node) {
5951 NativeClause toNode = this._toNode as NativeClause;
5952 return _and(_isEqualTokens(node.nativeKeyword, toNode.nativeKeyword),
5953 _isEqualNodes(node.name, toNode.name));
5954 }
5955
5956 @override
5957 bool visitNativeFunctionBody(NativeFunctionBody node) {
5958 NativeFunctionBody toNode = this._toNode as NativeFunctionBody;
5959 return _and(
5960 _isEqualTokens(node.nativeKeyword, toNode.nativeKeyword),
5961 _isEqualNodes(node.stringLiteral, toNode.stringLiteral),
5962 _isEqualTokens(node.semicolon, toNode.semicolon));
5963 }
5964
5965 @override
5966 bool visitNullLiteral(NullLiteral node) {
5967 NullLiteral toNode = this._toNode as NullLiteral;
5968 if (_isEqualTokens(node.literal, toNode.literal)) {
5969 toNode.propagatedType = node.propagatedType;
5970 toNode.staticType = node.staticType;
5971 return true;
5972 }
5973 return false;
5974 }
5975
5976 @override
5977 bool visitParenthesizedExpression(ParenthesizedExpression node) {
5978 ParenthesizedExpression toNode = this._toNode as ParenthesizedExpression;
5979 if (_and(
5980 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
5981 _isEqualNodes(node.expression, toNode.expression),
5982 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis))) {
5983 toNode.propagatedType = node.propagatedType;
5984 toNode.staticType = node.staticType;
5985 return true;
5986 }
5987 return false;
5988 }
5989
5990 @override
5991 bool visitPartDirective(PartDirective node) {
5992 PartDirective toNode = this._toNode as PartDirective;
5993 if (_and(
5994 _isEqualNodes(node.documentationComment, toNode.documentationComment),
5995 _isEqualNodeLists(node.metadata, toNode.metadata),
5996 _isEqualTokens(node.partKeyword, toNode.partKeyword),
5997 _isEqualNodes(node.uri, toNode.uri),
5998 _isEqualTokens(node.semicolon, toNode.semicolon))) {
5999 toNode.element = node.element;
6000 return true;
6001 }
6002 return false;
6003 }
6004
6005 @override
6006 bool visitPartOfDirective(PartOfDirective node) {
6007 PartOfDirective toNode = this._toNode as PartOfDirective;
6008 if (_and(
6009 _isEqualNodes(node.documentationComment, toNode.documentationComment),
6010 _isEqualNodeLists(node.metadata, toNode.metadata),
6011 _isEqualTokens(node.partKeyword, toNode.partKeyword),
6012 _isEqualTokens(node.ofKeyword, toNode.ofKeyword),
6013 _isEqualNodes(node.libraryName, toNode.libraryName),
6014 _isEqualTokens(node.semicolon, toNode.semicolon))) {
6015 toNode.element = node.element;
6016 return true;
6017 }
6018 return false;
6019 }
6020
6021 @override
6022 bool visitPostfixExpression(PostfixExpression node) {
6023 PostfixExpression toNode = this._toNode as PostfixExpression;
6024 if (_and(_isEqualNodes(node.operand, toNode.operand),
6025 _isEqualTokens(node.operator, toNode.operator))) {
6026 toNode.propagatedElement = node.propagatedElement;
6027 toNode.propagatedType = node.propagatedType;
6028 toNode.staticElement = node.staticElement;
6029 toNode.staticType = node.staticType;
6030 return true;
6031 }
6032 return false;
6033 }
6034
6035 @override
6036 bool visitPrefixedIdentifier(PrefixedIdentifier node) {
6037 PrefixedIdentifier toNode = this._toNode as PrefixedIdentifier;
6038 if (_and(
6039 _isEqualNodes(node.prefix, toNode.prefix),
6040 _isEqualTokens(node.period, toNode.period),
6041 _isEqualNodes(node.identifier, toNode.identifier))) {
6042 toNode.propagatedType = node.propagatedType;
6043 toNode.staticType = node.staticType;
6044 return true;
6045 }
6046 return false;
6047 }
6048
6049 @override
6050 bool visitPrefixExpression(PrefixExpression node) {
6051 PrefixExpression toNode = this._toNode as PrefixExpression;
6052 if (_and(_isEqualTokens(node.operator, toNode.operator),
6053 _isEqualNodes(node.operand, toNode.operand))) {
6054 toNode.propagatedElement = node.propagatedElement;
6055 toNode.propagatedType = node.propagatedType;
6056 toNode.staticElement = node.staticElement;
6057 toNode.staticType = node.staticType;
6058 return true;
6059 }
6060 return false;
6061 }
6062
6063 @override
6064 bool visitPropertyAccess(PropertyAccess node) {
6065 PropertyAccess toNode = this._toNode as PropertyAccess;
6066 if (_and(
6067 _isEqualNodes(node.target, toNode.target),
6068 _isEqualTokens(node.operator, toNode.operator),
6069 _isEqualNodes(node.propertyName, toNode.propertyName))) {
6070 toNode.propagatedType = node.propagatedType;
6071 toNode.staticType = node.staticType;
6072 return true;
6073 }
6074 return false;
6075 }
6076
6077 @override
6078 bool visitRedirectingConstructorInvocation(
6079 RedirectingConstructorInvocation node) {
6080 RedirectingConstructorInvocation toNode =
6081 this._toNode as RedirectingConstructorInvocation;
6082 if (_and(
6083 _isEqualTokens(node.thisKeyword, toNode.thisKeyword),
6084 _isEqualTokens(node.period, toNode.period),
6085 _isEqualNodes(node.constructorName, toNode.constructorName),
6086 _isEqualNodes(node.argumentList, toNode.argumentList))) {
6087 toNode.staticElement = node.staticElement;
6088 return true;
6089 }
6090 return false;
6091 }
6092
6093 @override
6094 bool visitRethrowExpression(RethrowExpression node) {
6095 RethrowExpression toNode = this._toNode as RethrowExpression;
6096 if (_isEqualTokens(node.rethrowKeyword, toNode.rethrowKeyword)) {
6097 toNode.propagatedType = node.propagatedType;
6098 toNode.staticType = node.staticType;
6099 return true;
6100 }
6101 return false;
6102 }
6103
6104 @override
6105 bool visitReturnStatement(ReturnStatement node) {
6106 ReturnStatement toNode = this._toNode as ReturnStatement;
6107 return _and(
6108 _isEqualTokens(node.returnKeyword, toNode.returnKeyword),
6109 _isEqualNodes(node.expression, toNode.expression),
6110 _isEqualTokens(node.semicolon, toNode.semicolon));
6111 }
6112
6113 @override
6114 bool visitScriptTag(ScriptTag node) {
6115 ScriptTag toNode = this._toNode as ScriptTag;
6116 return _isEqualTokens(node.scriptTag, toNode.scriptTag);
6117 }
6118
6119 @override
6120 bool visitShowCombinator(ShowCombinator node) {
6121 ShowCombinator toNode = this._toNode as ShowCombinator;
6122 return _and(_isEqualTokens(node.keyword, toNode.keyword),
6123 _isEqualNodeLists(node.shownNames, toNode.shownNames));
6124 }
6125
6126 @override
6127 bool visitSimpleFormalParameter(SimpleFormalParameter node) {
6128 SimpleFormalParameter toNode = this._toNode as SimpleFormalParameter;
6129 return _and(
6130 _isEqualNodes(node.documentationComment, toNode.documentationComment),
6131 _isEqualNodeLists(node.metadata, toNode.metadata),
6132 _isEqualTokens(node.keyword, toNode.keyword),
6133 _isEqualNodes(node.type, toNode.type),
6134 _isEqualNodes(node.identifier, toNode.identifier));
6135 }
6136
6137 @override
6138 bool visitSimpleIdentifier(SimpleIdentifier node) {
6139 SimpleIdentifier toNode = this._toNode as SimpleIdentifier;
6140 if (_isEqualTokens(node.token, toNode.token)) {
6141 toNode.staticElement = node.staticElement;
6142 toNode.staticType = node.staticType;
6143 toNode.propagatedElement = node.propagatedElement;
6144 toNode.propagatedType = node.propagatedType;
6145 toNode.auxiliaryElements = node.auxiliaryElements;
6146 return true;
6147 }
6148 return false;
6149 }
6150
6151 @override
6152 bool visitSimpleStringLiteral(SimpleStringLiteral node) {
6153 SimpleStringLiteral toNode = this._toNode as SimpleStringLiteral;
6154 if (_and(_isEqualTokens(node.literal, toNode.literal),
6155 node.value == toNode.value)) {
6156 toNode.propagatedType = node.propagatedType;
6157 toNode.staticType = node.staticType;
6158 return true;
6159 }
6160 return false;
6161 }
6162
6163 @override
6164 bool visitStringInterpolation(StringInterpolation node) {
6165 StringInterpolation toNode = this._toNode as StringInterpolation;
6166 if (_isEqualNodeLists(node.elements, toNode.elements)) {
6167 toNode.propagatedType = node.propagatedType;
6168 toNode.staticType = node.staticType;
6169 return true;
6170 }
6171 return false;
6172 }
6173
6174 @override
6175 bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
6176 SuperConstructorInvocation toNode =
6177 this._toNode as SuperConstructorInvocation;
6178 if (_and(
6179 _isEqualTokens(node.superKeyword, toNode.superKeyword),
6180 _isEqualTokens(node.period, toNode.period),
6181 _isEqualNodes(node.constructorName, toNode.constructorName),
6182 _isEqualNodes(node.argumentList, toNode.argumentList))) {
6183 toNode.staticElement = node.staticElement;
6184 return true;
6185 }
6186 return false;
6187 }
6188
6189 @override
6190 bool visitSuperExpression(SuperExpression node) {
6191 SuperExpression toNode = this._toNode as SuperExpression;
6192 if (_isEqualTokens(node.superKeyword, toNode.superKeyword)) {
6193 toNode.propagatedType = node.propagatedType;
6194 toNode.staticType = node.staticType;
6195 return true;
6196 }
6197 return false;
6198 }
6199
6200 @override
6201 bool visitSwitchCase(SwitchCase node) {
6202 SwitchCase toNode = this._toNode as SwitchCase;
6203 return _and(
6204 _isEqualNodeLists(node.labels, toNode.labels),
6205 _isEqualTokens(node.keyword, toNode.keyword),
6206 _isEqualNodes(node.expression, toNode.expression),
6207 _isEqualTokens(node.colon, toNode.colon),
6208 _isEqualNodeLists(node.statements, toNode.statements));
6209 }
6210
6211 @override
6212 bool visitSwitchDefault(SwitchDefault node) {
6213 SwitchDefault toNode = this._toNode as SwitchDefault;
6214 return _and(
6215 _isEqualNodeLists(node.labels, toNode.labels),
6216 _isEqualTokens(node.keyword, toNode.keyword),
6217 _isEqualTokens(node.colon, toNode.colon),
6218 _isEqualNodeLists(node.statements, toNode.statements));
6219 }
6220
6221 @override
6222 bool visitSwitchStatement(SwitchStatement node) {
6223 SwitchStatement toNode = this._toNode as SwitchStatement;
6224 return _and(
6225 _isEqualTokens(node.switchKeyword, toNode.switchKeyword),
6226 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
6227 _isEqualNodes(node.expression, toNode.expression),
6228 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
6229 _isEqualTokens(node.leftBracket, toNode.leftBracket),
6230 _isEqualNodeLists(node.members, toNode.members),
6231 _isEqualTokens(node.rightBracket, toNode.rightBracket));
6232 }
6233
6234 @override
6235 bool visitSymbolLiteral(SymbolLiteral node) {
6236 SymbolLiteral toNode = this._toNode as SymbolLiteral;
6237 if (_and(_isEqualTokens(node.poundSign, toNode.poundSign),
6238 _isEqualTokenLists(node.components, toNode.components))) {
6239 toNode.propagatedType = node.propagatedType;
6240 toNode.staticType = node.staticType;
6241 return true;
6242 }
6243 return false;
6244 }
6245
6246 @override
6247 bool visitThisExpression(ThisExpression node) {
6248 ThisExpression toNode = this._toNode as ThisExpression;
6249 if (_isEqualTokens(node.thisKeyword, toNode.thisKeyword)) {
6250 toNode.propagatedType = node.propagatedType;
6251 toNode.staticType = node.staticType;
6252 return true;
6253 }
6254 return false;
6255 }
6256
6257 @override
6258 bool visitThrowExpression(ThrowExpression node) {
6259 ThrowExpression toNode = this._toNode as ThrowExpression;
6260 if (_and(_isEqualTokens(node.throwKeyword, toNode.throwKeyword),
6261 _isEqualNodes(node.expression, toNode.expression))) {
6262 toNode.propagatedType = node.propagatedType;
6263 toNode.staticType = node.staticType;
6264 return true;
6265 }
6266 return false;
6267 }
6268
6269 @override
6270 bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
6271 TopLevelVariableDeclaration toNode =
6272 this._toNode as TopLevelVariableDeclaration;
6273 return _and(
6274 _isEqualNodes(node.documentationComment, toNode.documentationComment),
6275 _isEqualNodeLists(node.metadata, toNode.metadata),
6276 _isEqualNodes(node.variables, toNode.variables),
6277 _isEqualTokens(node.semicolon, toNode.semicolon));
6278 }
6279
6280 @override
6281 bool visitTryStatement(TryStatement node) {
6282 TryStatement toNode = this._toNode as TryStatement;
6283 return _and(
6284 _isEqualTokens(node.tryKeyword, toNode.tryKeyword),
6285 _isEqualNodes(node.body, toNode.body),
6286 _isEqualNodeLists(node.catchClauses, toNode.catchClauses),
6287 _isEqualTokens(node.finallyKeyword, toNode.finallyKeyword),
6288 _isEqualNodes(node.finallyBlock, toNode.finallyBlock));
6289 }
6290
6291 @override
6292 bool visitTypeArgumentList(TypeArgumentList node) {
6293 TypeArgumentList toNode = this._toNode as TypeArgumentList;
6294 return _and(
6295 _isEqualTokens(node.leftBracket, toNode.leftBracket),
6296 _isEqualNodeLists(node.arguments, toNode.arguments),
6297 _isEqualTokens(node.rightBracket, toNode.rightBracket));
6298 }
6299
6300 @override
6301 bool visitTypeName(TypeName node) {
6302 TypeName toNode = this._toNode as TypeName;
6303 if (_and(_isEqualNodes(node.name, toNode.name),
6304 _isEqualNodes(node.typeArguments, toNode.typeArguments))) {
6305 toNode.type = node.type;
6306 return true;
6307 }
6308 return false;
6309 }
6310
6311 @override
6312 bool visitTypeParameter(TypeParameter node) {
6313 TypeParameter toNode = this._toNode as TypeParameter;
6314 return _and(
6315 _isEqualNodes(node.documentationComment, toNode.documentationComment),
6316 _isEqualNodeLists(node.metadata, toNode.metadata),
6317 _isEqualNodes(node.name, toNode.name),
6318 _isEqualTokens(node.extendsKeyword, toNode.extendsKeyword),
6319 _isEqualNodes(node.bound, toNode.bound));
6320 }
6321
6322 @override
6323 bool visitTypeParameterList(TypeParameterList node) {
6324 TypeParameterList toNode = this._toNode as TypeParameterList;
6325 return _and(
6326 _isEqualTokens(node.leftBracket, toNode.leftBracket),
6327 _isEqualNodeLists(node.typeParameters, toNode.typeParameters),
6328 _isEqualTokens(node.rightBracket, toNode.rightBracket));
6329 }
6330
6331 @override
6332 bool visitVariableDeclaration(VariableDeclaration node) {
6333 VariableDeclaration toNode = this._toNode as VariableDeclaration;
6334 return _and(
6335 _isEqualNodes(node.documentationComment, toNode.documentationComment),
6336 _isEqualNodeLists(node.metadata, toNode.metadata),
6337 _isEqualNodes(node.name, toNode.name),
6338 _isEqualTokens(node.equals, toNode.equals),
6339 _isEqualNodes(node.initializer, toNode.initializer));
6340 }
6341
6342 @override
6343 bool visitVariableDeclarationList(VariableDeclarationList node) {
6344 VariableDeclarationList toNode = this._toNode as VariableDeclarationList;
6345 return _and(
6346 _isEqualNodes(node.documentationComment, toNode.documentationComment),
6347 _isEqualNodeLists(node.metadata, toNode.metadata),
6348 _isEqualTokens(node.keyword, toNode.keyword),
6349 _isEqualNodes(node.type, toNode.type),
6350 _isEqualNodeLists(node.variables, toNode.variables));
6351 }
6352
6353 @override
6354 bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
6355 VariableDeclarationStatement toNode =
6356 this._toNode as VariableDeclarationStatement;
6357 return _and(_isEqualNodes(node.variables, toNode.variables),
6358 _isEqualTokens(node.semicolon, toNode.semicolon));
6359 }
6360
6361 @override
6362 bool visitWhileStatement(WhileStatement node) {
6363 WhileStatement toNode = this._toNode as WhileStatement;
6364 return _and(
6365 _isEqualTokens(node.whileKeyword, toNode.whileKeyword),
6366 _isEqualTokens(node.leftParenthesis, toNode.leftParenthesis),
6367 _isEqualNodes(node.condition, toNode.condition),
6368 _isEqualTokens(node.rightParenthesis, toNode.rightParenthesis),
6369 _isEqualNodes(node.body, toNode.body));
6370 }
6371
6372 @override
6373 bool visitWithClause(WithClause node) {
6374 WithClause toNode = this._toNode as WithClause;
6375 return _and(_isEqualTokens(node.withKeyword, toNode.withKeyword),
6376 _isEqualNodeLists(node.mixinTypes, toNode.mixinTypes));
6377 }
6378
6379 @override
6380 bool visitYieldStatement(YieldStatement node) {
6381 YieldStatement toNode = this._toNode as YieldStatement;
6382 return _and(
6383 _isEqualTokens(node.yieldKeyword, toNode.yieldKeyword),
6384 _isEqualNodes(node.expression, toNode.expression),
6385 _isEqualTokens(node.semicolon, toNode.semicolon));
6386 }
6387
6388 /**
6389 * Return `true` if all of the parameters are `true`.
6390 */
6391 bool _and(bool b1, bool b2,
6392 [bool b3 = true,
6393 bool b4 = true,
6394 bool b5 = true,
6395 bool b6 = true,
6396 bool b7 = true,
6397 bool b8 = true,
6398 bool b9 = true,
6399 bool b10 = true,
6400 bool b11 = true,
6401 bool b12 = true,
6402 bool b13 = true]) {
6403 // TODO(brianwilkerson) Inline this method.
6404 return b1 &&
6405 b2 &&
6406 b3 &&
6407 b4 &&
6408 b5 &&
6409 b6 &&
6410 b7 &&
6411 b8 &&
6412 b9 &&
6413 b10 &&
6414 b11 &&
6415 b12 &&
6416 b13;
6417 }
6418
6419 /**
6420 * Return `true` if the [first] and [second] lists of AST nodes have the same
6421 * size and corresponding elements are equal.
6422 */
6423 bool _isEqualNodeLists(NodeList first, NodeList second) {
6424 if (first == null) {
6425 return second == null;
6426 } else if (second == null) {
6427 return false;
6428 }
6429 int size = first.length;
6430 if (second.length != size) {
6431 return false;
6432 }
6433 bool equal = true;
6434 for (int i = 0; i < size; i++) {
6435 if (!_isEqualNodes(first[i], second[i])) {
6436 equal = false;
6437 }
6438 }
6439 return equal;
6440 }
6441
6442 /**
6443 * Return `true` if the [fromNode] and [toNode] have the same structure. As a
6444 * side-effect, if the nodes do have the same structure, any resolution data
6445 * from the first node will be copied to the second node.
6446 */
6447 bool _isEqualNodes(AstNode fromNode, AstNode toNode) {
6448 if (fromNode == null) {
6449 return toNode == null;
6450 } else if (toNode == null) {
6451 return false;
6452 } else if (fromNode.runtimeType == toNode.runtimeType) {
6453 this._toNode = toNode;
6454 return fromNode.accept(this);
6455 }
6456 //
6457 // Check for a simple transformation caused by entering a period.
6458 //
6459 if (toNode is PrefixedIdentifier) {
6460 SimpleIdentifier prefix = toNode.prefix;
6461 if (fromNode.runtimeType == prefix.runtimeType) {
6462 this._toNode = prefix;
6463 return fromNode.accept(this);
6464 }
6465 } else if (toNode is PropertyAccess) {
6466 Expression target = toNode.target;
6467 if (fromNode.runtimeType == target.runtimeType) {
6468 this._toNode = target;
6469 return fromNode.accept(this);
6470 }
6471 }
6472 return false;
6473 }
6474
6475 /**
6476 * Return `true` if the [first] and [second] arrays of tokens have the same
6477 * length and corresponding elements are equal.
6478 */
6479 bool _isEqualTokenLists(List<Token> first, List<Token> second) {
6480 int length = first.length;
6481 if (second.length != length) {
6482 return false;
6483 }
6484 for (int i = 0; i < length; i++) {
6485 if (!_isEqualTokens(first[i], second[i])) {
6486 return false;
6487 }
6488 }
6489 return true;
6490 }
6491
6492 /**
6493 * Return `true` if the [first] and [second] tokens have the same structure.
6494 */
6495 bool _isEqualTokens(Token first, Token second) {
6496 if (first == null) {
6497 return second == null;
6498 } else if (second == null) {
6499 return false;
6500 }
6501 return first.lexeme == second.lexeme;
6502 }
6503
6504 /**
6505 * Copy resolution data from the [fromNode] to the [toNode].
6506 */
6507 static void copyResolutionData(AstNode fromNode, AstNode toNode) {
6508 ResolutionCopier copier = new ResolutionCopier();
6509 copier._isEqualNodes(fromNode, toNode);
6510 }
6511 }
6512
6513 /**
6514 * Traverse the AST from initial child node to successive parents, building a
6515 * collection of local variable and parameter names visible to the initial child
6516 * node. In case of name shadowing, the first name seen is the most specific one
6517 * so names are not redefined.
6518 *
6519 * Completion test code coverage is 95%. The two basic blocks that are not
6520 * executed cannot be executed. They are included for future reference.
6521 */
6522 class ScopedNameFinder extends GeneralizingAstVisitor<Object> {
6523 Declaration _declarationNode;
6524
6525 AstNode _immediateChild;
6526
6527 Map<String, SimpleIdentifier> _locals =
6528 new HashMap<String, SimpleIdentifier>();
6529
6530 final int _position;
6531
6532 bool _referenceIsWithinLocalFunction = false;
6533
6534 ScopedNameFinder(this._position);
6535
6536 Declaration get declaration => _declarationNode;
6537
6538 Map<String, SimpleIdentifier> get locals => _locals;
6539
6540 @override
6541 Object visitBlock(Block node) {
6542 _checkStatements(node.statements);
6543 return super.visitBlock(node);
6544 }
6545
6546 @override
6547 Object visitCatchClause(CatchClause node) {
6548 _addToScope(node.exceptionParameter);
6549 _addToScope(node.stackTraceParameter);
6550 return super.visitCatchClause(node);
6551 }
6552
6553 @override
6554 Object visitConstructorDeclaration(ConstructorDeclaration node) {
6555 if (!identical(_immediateChild, node.parameters)) {
6556 _addParameters(node.parameters.parameters);
6557 }
6558 _declarationNode = node;
6559 return null;
6560 }
6561
6562 @override
6563 Object visitFieldDeclaration(FieldDeclaration node) {
6564 _declarationNode = node;
6565 return null;
6566 }
6567
6568 @override
6569 Object visitForEachStatement(ForEachStatement node) {
6570 DeclaredIdentifier loopVariable = node.loopVariable;
6571 if (loopVariable != null) {
6572 _addToScope(loopVariable.identifier);
6573 }
6574 return super.visitForEachStatement(node);
6575 }
6576
6577 @override
6578 Object visitForStatement(ForStatement node) {
6579 if (!identical(_immediateChild, node.variables) && node.variables != null) {
6580 _addVariables(node.variables.variables);
6581 }
6582 return super.visitForStatement(node);
6583 }
6584
6585 @override
6586 Object visitFunctionDeclaration(FunctionDeclaration node) {
6587 if (node.parent is! FunctionDeclarationStatement) {
6588 _declarationNode = node;
6589 return null;
6590 }
6591 return super.visitFunctionDeclaration(node);
6592 }
6593
6594 @override
6595 Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
6596 _referenceIsWithinLocalFunction = true;
6597 return super.visitFunctionDeclarationStatement(node);
6598 }
6599
6600 @override
6601 Object visitFunctionExpression(FunctionExpression node) {
6602 if (node.parameters != null &&
6603 !identical(_immediateChild, node.parameters)) {
6604 _addParameters(node.parameters.parameters);
6605 }
6606 return super.visitFunctionExpression(node);
6607 }
6608
6609 @override
6610 Object visitMethodDeclaration(MethodDeclaration node) {
6611 _declarationNode = node;
6612 if (node.parameters == null) {
6613 return null;
6614 }
6615 if (!identical(_immediateChild, node.parameters)) {
6616 _addParameters(node.parameters.parameters);
6617 }
6618 return null;
6619 }
6620
6621 @override
6622 Object visitNode(AstNode node) {
6623 _immediateChild = node;
6624 AstNode parent = node.parent;
6625 if (parent != null) {
6626 parent.accept(this);
6627 }
6628 return null;
6629 }
6630
6631 @override
6632 Object visitSwitchMember(SwitchMember node) {
6633 _checkStatements(node.statements);
6634 return super.visitSwitchMember(node);
6635 }
6636
6637 @override
6638 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
6639 _declarationNode = node;
6640 return null;
6641 }
6642
6643 @override
6644 Object visitTypeAlias(TypeAlias node) {
6645 _declarationNode = node;
6646 return null;
6647 }
6648
6649 void _addParameters(NodeList<FormalParameter> vars) {
6650 for (FormalParameter var2 in vars) {
6651 _addToScope(var2.identifier);
6652 }
6653 }
6654
6655 void _addToScope(SimpleIdentifier identifier) {
6656 if (identifier != null && _isInRange(identifier)) {
6657 String name = identifier.name;
6658 if (!_locals.containsKey(name)) {
6659 _locals[name] = identifier;
6660 }
6661 }
6662 }
6663
6664 void _addVariables(NodeList<VariableDeclaration> variables) {
6665 for (VariableDeclaration variable in variables) {
6666 _addToScope(variable.name);
6667 }
6668 }
6669
6670 /**
6671 * Check the given list of [statements] for any that come before the immediate
6672 * child and that define a name that would be visible to the immediate child.
6673 */
6674 void _checkStatements(List<Statement> statements) {
6675 for (Statement statement in statements) {
6676 if (identical(statement, _immediateChild)) {
6677 return;
6678 }
6679 if (statement is VariableDeclarationStatement) {
6680 _addVariables(statement.variables.variables);
6681 } else if (statement is FunctionDeclarationStatement &&
6682 !_referenceIsWithinLocalFunction) {
6683 _addToScope(statement.functionDeclaration.name);
6684 }
6685 }
6686 }
6687
6688 bool _isInRange(AstNode node) {
6689 if (_position < 0) {
6690 // if source position is not set then all nodes are in range
6691 return true;
6692 // not reached
6693 }
6694 return node.end < _position;
6695 }
6696 }
6697
6698 /**
6699 * A visitor used to write a source representation of a visited AST node (and
6700 * all of it's children) to a writer.
6701 */
6702 class ToSourceVisitor implements AstVisitor<Object> {
6703 /**
6704 * The writer to which the source is to be written.
6705 */
6706 final PrintWriter _writer;
6707
6708 /**
6709 * Initialize a newly created visitor to write source code representing the
6710 * visited nodes to the given [writer].
6711 */
6712 ToSourceVisitor(this._writer);
6713
6714 @override
6715 Object visitAdjacentStrings(AdjacentStrings node) {
6716 _visitNodeListWithSeparator(node.strings, " ");
6717 return null;
6718 }
6719
6720 @override
6721 Object visitAnnotation(Annotation node) {
6722 _writer.print('@');
6723 _visitNode(node.name);
6724 _visitNodeWithPrefix(".", node.constructorName);
6725 _visitNode(node.arguments);
6726 return null;
6727 }
6728
6729 @override
6730 Object visitArgumentList(ArgumentList node) {
6731 _writer.print('(');
6732 _visitNodeListWithSeparator(node.arguments, ", ");
6733 _writer.print(')');
6734 return null;
6735 }
6736
6737 @override
6738 Object visitAsExpression(AsExpression node) {
6739 _visitNode(node.expression);
6740 _writer.print(" as ");
6741 _visitNode(node.type);
6742 return null;
6743 }
6744
6745 @override
6746 Object visitAssertStatement(AssertStatement node) {
6747 _writer.print("assert (");
6748 _visitNode(node.condition);
6749 if (node.message != null) {
6750 _writer.print(', ');
6751 _visitNode(node.message);
6752 }
6753 _writer.print(");");
6754 return null;
6755 }
6756
6757 @override
6758 Object visitAssignmentExpression(AssignmentExpression node) {
6759 _visitNode(node.leftHandSide);
6760 _writer.print(' ');
6761 _writer.print(node.operator.lexeme);
6762 _writer.print(' ');
6763 _visitNode(node.rightHandSide);
6764 return null;
6765 }
6766
6767 @override
6768 Object visitAwaitExpression(AwaitExpression node) {
6769 _writer.print("await ");
6770 _visitNode(node.expression);
6771 return null;
6772 }
6773
6774 @override
6775 Object visitBinaryExpression(BinaryExpression node) {
6776 _visitNode(node.leftOperand);
6777 _writer.print(' ');
6778 _writer.print(node.operator.lexeme);
6779 _writer.print(' ');
6780 _visitNode(node.rightOperand);
6781 return null;
6782 }
6783
6784 @override
6785 Object visitBlock(Block node) {
6786 _writer.print('{');
6787 _visitNodeListWithSeparator(node.statements, " ");
6788 _writer.print('}');
6789 return null;
6790 }
6791
6792 @override
6793 Object visitBlockFunctionBody(BlockFunctionBody node) {
6794 Token keyword = node.keyword;
6795 if (keyword != null) {
6796 _writer.print(keyword.lexeme);
6797 if (node.star != null) {
6798 _writer.print('*');
6799 }
6800 _writer.print(' ');
6801 }
6802 _visitNode(node.block);
6803 return null;
6804 }
6805
6806 @override
6807 Object visitBooleanLiteral(BooleanLiteral node) {
6808 _writer.print(node.literal.lexeme);
6809 return null;
6810 }
6811
6812 @override
6813 Object visitBreakStatement(BreakStatement node) {
6814 _writer.print("break");
6815 _visitNodeWithPrefix(" ", node.label);
6816 _writer.print(";");
6817 return null;
6818 }
6819
6820 @override
6821 Object visitCascadeExpression(CascadeExpression node) {
6822 _visitNode(node.target);
6823 _visitNodeList(node.cascadeSections);
6824 return null;
6825 }
6826
6827 @override
6828 Object visitCatchClause(CatchClause node) {
6829 _visitNodeWithPrefix("on ", node.exceptionType);
6830 if (node.catchKeyword != null) {
6831 if (node.exceptionType != null) {
6832 _writer.print(' ');
6833 }
6834 _writer.print("catch (");
6835 _visitNode(node.exceptionParameter);
6836 _visitNodeWithPrefix(", ", node.stackTraceParameter);
6837 _writer.print(") ");
6838 } else {
6839 _writer.print(" ");
6840 }
6841 _visitNode(node.body);
6842 return null;
6843 }
6844
6845 @override
6846 Object visitClassDeclaration(ClassDeclaration node) {
6847 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
6848 _visitTokenWithSuffix(node.abstractKeyword, " ");
6849 _writer.print("class ");
6850 _visitNode(node.name);
6851 _visitNode(node.typeParameters);
6852 _visitNodeWithPrefix(" ", node.extendsClause);
6853 _visitNodeWithPrefix(" ", node.withClause);
6854 _visitNodeWithPrefix(" ", node.implementsClause);
6855 _writer.print(" {");
6856 _visitNodeListWithSeparator(node.members, " ");
6857 _writer.print("}");
6858 return null;
6859 }
6860
6861 @override
6862 Object visitClassTypeAlias(ClassTypeAlias node) {
6863 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
6864 if (node.abstractKeyword != null) {
6865 _writer.print("abstract ");
6866 }
6867 _writer.print("class ");
6868 _visitNode(node.name);
6869 _visitNode(node.typeParameters);
6870 _writer.print(" = ");
6871 _visitNode(node.superclass);
6872 _visitNodeWithPrefix(" ", node.withClause);
6873 _visitNodeWithPrefix(" ", node.implementsClause);
6874 _writer.print(";");
6875 return null;
6876 }
6877
6878 @override
6879 Object visitComment(Comment node) => null;
6880
6881 @override
6882 Object visitCommentReference(CommentReference node) => null;
6883
6884 @override
6885 Object visitCompilationUnit(CompilationUnit node) {
6886 ScriptTag scriptTag = node.scriptTag;
6887 NodeList<Directive> directives = node.directives;
6888 _visitNode(scriptTag);
6889 String prefix = scriptTag == null ? "" : " ";
6890 _visitNodeListWithSeparatorAndPrefix(prefix, directives, " ");
6891 prefix = scriptTag == null && directives.isEmpty ? "" : " ";
6892 _visitNodeListWithSeparatorAndPrefix(prefix, node.declarations, " ");
6893 return null;
6894 }
6895
6896 @override
6897 Object visitConditionalExpression(ConditionalExpression node) {
6898 _visitNode(node.condition);
6899 _writer.print(" ? ");
6900 _visitNode(node.thenExpression);
6901 _writer.print(" : ");
6902 _visitNode(node.elseExpression);
6903 return null;
6904 }
6905
6906 @override
6907 Object visitConfiguration(Configuration node) {
6908 _writer.print('if (');
6909 _visitNode(node.name);
6910 _visitNodeWithPrefix(" == ", node.value);
6911 _writer.print(') ');
6912 _visitNode(node.uri);
6913 return null;
6914 }
6915
6916 @override
6917 Object visitConstructorDeclaration(ConstructorDeclaration node) {
6918 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
6919 _visitTokenWithSuffix(node.externalKeyword, " ");
6920 _visitTokenWithSuffix(node.constKeyword, " ");
6921 _visitTokenWithSuffix(node.factoryKeyword, " ");
6922 _visitNode(node.returnType);
6923 _visitNodeWithPrefix(".", node.name);
6924 _visitNode(node.parameters);
6925 _visitNodeListWithSeparatorAndPrefix(" : ", node.initializers, ", ");
6926 _visitNodeWithPrefix(" = ", node.redirectedConstructor);
6927 _visitFunctionWithPrefix(" ", node.body);
6928 return null;
6929 }
6930
6931 @override
6932 Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
6933 _visitTokenWithSuffix(node.thisKeyword, ".");
6934 _visitNode(node.fieldName);
6935 _writer.print(" = ");
6936 _visitNode(node.expression);
6937 return null;
6938 }
6939
6940 @override
6941 Object visitConstructorName(ConstructorName node) {
6942 _visitNode(node.type);
6943 _visitNodeWithPrefix(".", node.name);
6944 return null;
6945 }
6946
6947 @override
6948 Object visitContinueStatement(ContinueStatement node) {
6949 _writer.print("continue");
6950 _visitNodeWithPrefix(" ", node.label);
6951 _writer.print(";");
6952 return null;
6953 }
6954
6955 @override
6956 Object visitDeclaredIdentifier(DeclaredIdentifier node) {
6957 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
6958 _visitTokenWithSuffix(node.keyword, " ");
6959 _visitNodeWithSuffix(node.type, " ");
6960 _visitNode(node.identifier);
6961 return null;
6962 }
6963
6964 @override
6965 Object visitDefaultFormalParameter(DefaultFormalParameter node) {
6966 _visitNode(node.parameter);
6967 if (node.separator != null) {
6968 _writer.print(" ");
6969 _writer.print(node.separator.lexeme);
6970 _visitNodeWithPrefix(" ", node.defaultValue);
6971 }
6972 return null;
6973 }
6974
6975 @override
6976 Object visitDoStatement(DoStatement node) {
6977 _writer.print("do ");
6978 _visitNode(node.body);
6979 _writer.print(" while (");
6980 _visitNode(node.condition);
6981 _writer.print(");");
6982 return null;
6983 }
6984
6985 @override
6986 Object visitDottedName(DottedName node) {
6987 _visitNodeListWithSeparator(node.components, ".");
6988 return null;
6989 }
6990
6991 @override
6992 Object visitDoubleLiteral(DoubleLiteral node) {
6993 _writer.print(node.literal.lexeme);
6994 return null;
6995 }
6996
6997 @override
6998 Object visitEmptyFunctionBody(EmptyFunctionBody node) {
6999 _writer.print(';');
7000 return null;
7001 }
7002
7003 @override
7004 Object visitEmptyStatement(EmptyStatement node) {
7005 _writer.print(';');
7006 return null;
7007 }
7008
7009 @override
7010 Object visitEnumConstantDeclaration(EnumConstantDeclaration node) {
7011 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7012 _visitNode(node.name);
7013 return null;
7014 }
7015
7016 @override
7017 Object visitEnumDeclaration(EnumDeclaration node) {
7018 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7019 _writer.print("enum ");
7020 _visitNode(node.name);
7021 _writer.print(" {");
7022 _visitNodeListWithSeparator(node.constants, ", ");
7023 _writer.print("}");
7024 return null;
7025 }
7026
7027 @override
7028 Object visitExportDirective(ExportDirective node) {
7029 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7030 _writer.print("export ");
7031 _visitNode(node.uri);
7032 _visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
7033 _writer.print(';');
7034 return null;
7035 }
7036
7037 @override
7038 Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
7039 Token keyword = node.keyword;
7040 if (keyword != null) {
7041 _writer.print(keyword.lexeme);
7042 _writer.print(' ');
7043 }
7044 _writer.print("=> ");
7045 _visitNode(node.expression);
7046 if (node.semicolon != null) {
7047 _writer.print(';');
7048 }
7049 return null;
7050 }
7051
7052 @override
7053 Object visitExpressionStatement(ExpressionStatement node) {
7054 _visitNode(node.expression);
7055 _writer.print(';');
7056 return null;
7057 }
7058
7059 @override
7060 Object visitExtendsClause(ExtendsClause node) {
7061 _writer.print("extends ");
7062 _visitNode(node.superclass);
7063 return null;
7064 }
7065
7066 @override
7067 Object visitFieldDeclaration(FieldDeclaration node) {
7068 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7069 _visitTokenWithSuffix(node.staticKeyword, " ");
7070 _visitNode(node.fields);
7071 _writer.print(";");
7072 return null;
7073 }
7074
7075 @override
7076 Object visitFieldFormalParameter(FieldFormalParameter node) {
7077 _visitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
7078 _visitTokenWithSuffix(node.keyword, " ");
7079 _visitNodeWithSuffix(node.type, " ");
7080 _writer.print("this.");
7081 _visitNode(node.identifier);
7082 _visitNode(node.typeParameters);
7083 _visitNode(node.parameters);
7084 return null;
7085 }
7086
7087 @override
7088 Object visitForEachStatement(ForEachStatement node) {
7089 DeclaredIdentifier loopVariable = node.loopVariable;
7090 if (node.awaitKeyword != null) {
7091 _writer.print("await ");
7092 }
7093 _writer.print("for (");
7094 if (loopVariable == null) {
7095 _visitNode(node.identifier);
7096 } else {
7097 _visitNode(loopVariable);
7098 }
7099 _writer.print(" in ");
7100 _visitNode(node.iterable);
7101 _writer.print(") ");
7102 _visitNode(node.body);
7103 return null;
7104 }
7105
7106 @override
7107 Object visitFormalParameterList(FormalParameterList node) {
7108 String groupEnd = null;
7109 _writer.print('(');
7110 NodeList<FormalParameter> parameters = node.parameters;
7111 int size = parameters.length;
7112 for (int i = 0; i < size; i++) {
7113 FormalParameter parameter = parameters[i];
7114 if (i > 0) {
7115 _writer.print(", ");
7116 }
7117 if (groupEnd == null && parameter is DefaultFormalParameter) {
7118 if (parameter.kind == ParameterKind.NAMED) {
7119 groupEnd = "}";
7120 _writer.print('{');
7121 } else {
7122 groupEnd = "]";
7123 _writer.print('[');
7124 }
7125 }
7126 parameter.accept(this);
7127 }
7128 if (groupEnd != null) {
7129 _writer.print(groupEnd);
7130 }
7131 _writer.print(')');
7132 return null;
7133 }
7134
7135 @override
7136 Object visitForStatement(ForStatement node) {
7137 Expression initialization = node.initialization;
7138 _writer.print("for (");
7139 if (initialization != null) {
7140 _visitNode(initialization);
7141 } else {
7142 _visitNode(node.variables);
7143 }
7144 _writer.print(";");
7145 _visitNodeWithPrefix(" ", node.condition);
7146 _writer.print(";");
7147 _visitNodeListWithSeparatorAndPrefix(" ", node.updaters, ", ");
7148 _writer.print(") ");
7149 _visitNode(node.body);
7150 return null;
7151 }
7152
7153 @override
7154 Object visitFunctionDeclaration(FunctionDeclaration node) {
7155 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7156 _visitTokenWithSuffix(node.externalKeyword, " ");
7157 _visitNodeWithSuffix(node.returnType, " ");
7158 _visitTokenWithSuffix(node.propertyKeyword, " ");
7159 _visitNode(node.name);
7160 _visitNode(node.functionExpression);
7161 return null;
7162 }
7163
7164 @override
7165 Object visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
7166 _visitNode(node.functionDeclaration);
7167 return null;
7168 }
7169
7170 @override
7171 Object visitFunctionExpression(FunctionExpression node) {
7172 _visitNode(node.typeParameters);
7173 _visitNode(node.parameters);
7174 if (node.body is! EmptyFunctionBody) {
7175 _writer.print(' ');
7176 }
7177 _visitNode(node.body);
7178 return null;
7179 }
7180
7181 @override
7182 Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
7183 _visitNode(node.function);
7184 _visitNode(node.typeArguments);
7185 _visitNode(node.argumentList);
7186 return null;
7187 }
7188
7189 @override
7190 Object visitFunctionTypeAlias(FunctionTypeAlias node) {
7191 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7192 _writer.print("typedef ");
7193 _visitNodeWithSuffix(node.returnType, " ");
7194 _visitNode(node.name);
7195 _visitNode(node.typeParameters);
7196 _visitNode(node.parameters);
7197 _writer.print(";");
7198 return null;
7199 }
7200
7201 @override
7202 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
7203 _visitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
7204 _visitNodeWithSuffix(node.returnType, " ");
7205 _visitNode(node.identifier);
7206 _visitNode(node.typeParameters);
7207 _visitNode(node.parameters);
7208 if (node.question != null) {
7209 _writer.print('?');
7210 }
7211 return null;
7212 }
7213
7214 @override
7215 Object visitHideCombinator(HideCombinator node) {
7216 _writer.print("hide ");
7217 _visitNodeListWithSeparator(node.hiddenNames, ", ");
7218 return null;
7219 }
7220
7221 @override
7222 Object visitIfStatement(IfStatement node) {
7223 _writer.print("if (");
7224 _visitNode(node.condition);
7225 _writer.print(") ");
7226 _visitNode(node.thenStatement);
7227 _visitNodeWithPrefix(" else ", node.elseStatement);
7228 return null;
7229 }
7230
7231 @override
7232 Object visitImplementsClause(ImplementsClause node) {
7233 _writer.print("implements ");
7234 _visitNodeListWithSeparator(node.interfaces, ", ");
7235 return null;
7236 }
7237
7238 @override
7239 Object visitImportDirective(ImportDirective node) {
7240 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7241 _writer.print("import ");
7242 _visitNode(node.uri);
7243 if (node.deferredKeyword != null) {
7244 _writer.print(" deferred");
7245 }
7246 _visitNodeWithPrefix(" as ", node.prefix);
7247 _visitNodeListWithSeparatorAndPrefix(" ", node.combinators, " ");
7248 _writer.print(';');
7249 return null;
7250 }
7251
7252 @override
7253 Object visitIndexExpression(IndexExpression node) {
7254 if (node.isCascaded) {
7255 _writer.print("..");
7256 } else {
7257 _visitNode(node.target);
7258 }
7259 _writer.print('[');
7260 _visitNode(node.index);
7261 _writer.print(']');
7262 return null;
7263 }
7264
7265 @override
7266 Object visitInstanceCreationExpression(InstanceCreationExpression node) {
7267 _visitTokenWithSuffix(node.keyword, " ");
7268 _visitNode(node.constructorName);
7269 _visitNode(node.argumentList);
7270 return null;
7271 }
7272
7273 @override
7274 Object visitIntegerLiteral(IntegerLiteral node) {
7275 _writer.print(node.literal.lexeme);
7276 return null;
7277 }
7278
7279 @override
7280 Object visitInterpolationExpression(InterpolationExpression node) {
7281 if (node.rightBracket != null) {
7282 _writer.print("\${");
7283 _visitNode(node.expression);
7284 _writer.print("}");
7285 } else {
7286 _writer.print("\$");
7287 _visitNode(node.expression);
7288 }
7289 return null;
7290 }
7291
7292 @override
7293 Object visitInterpolationString(InterpolationString node) {
7294 _writer.print(node.contents.lexeme);
7295 return null;
7296 }
7297
7298 @override
7299 Object visitIsExpression(IsExpression node) {
7300 _visitNode(node.expression);
7301 if (node.notOperator == null) {
7302 _writer.print(" is ");
7303 } else {
7304 _writer.print(" is! ");
7305 }
7306 _visitNode(node.type);
7307 return null;
7308 }
7309
7310 @override
7311 Object visitLabel(Label node) {
7312 _visitNode(node.label);
7313 _writer.print(":");
7314 return null;
7315 }
7316
7317 @override
7318 Object visitLabeledStatement(LabeledStatement node) {
7319 _visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
7320 _visitNode(node.statement);
7321 return null;
7322 }
7323
7324 @override
7325 Object visitLibraryDirective(LibraryDirective node) {
7326 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7327 _writer.print("library ");
7328 _visitNode(node.name);
7329 _writer.print(';');
7330 return null;
7331 }
7332
7333 @override
7334 Object visitLibraryIdentifier(LibraryIdentifier node) {
7335 _writer.print(node.name);
7336 return null;
7337 }
7338
7339 @override
7340 Object visitListLiteral(ListLiteral node) {
7341 if (node.constKeyword != null) {
7342 _writer.print(node.constKeyword.lexeme);
7343 _writer.print(' ');
7344 }
7345 _visitNodeWithSuffix(node.typeArguments, " ");
7346 _writer.print("[");
7347 _visitNodeListWithSeparator(node.elements, ", ");
7348 _writer.print("]");
7349 return null;
7350 }
7351
7352 @override
7353 Object visitMapLiteral(MapLiteral node) {
7354 if (node.constKeyword != null) {
7355 _writer.print(node.constKeyword.lexeme);
7356 _writer.print(' ');
7357 }
7358 _visitNodeWithSuffix(node.typeArguments, " ");
7359 _writer.print("{");
7360 _visitNodeListWithSeparator(node.entries, ", ");
7361 _writer.print("}");
7362 return null;
7363 }
7364
7365 @override
7366 Object visitMapLiteralEntry(MapLiteralEntry node) {
7367 _visitNode(node.key);
7368 _writer.print(" : ");
7369 _visitNode(node.value);
7370 return null;
7371 }
7372
7373 @override
7374 Object visitMethodDeclaration(MethodDeclaration node) {
7375 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7376 _visitTokenWithSuffix(node.externalKeyword, " ");
7377 _visitTokenWithSuffix(node.modifierKeyword, " ");
7378 _visitNodeWithSuffix(node.returnType, " ");
7379 _visitTokenWithSuffix(node.propertyKeyword, " ");
7380 _visitTokenWithSuffix(node.operatorKeyword, " ");
7381 _visitNode(node.name);
7382 if (!node.isGetter) {
7383 _visitNode(node.typeParameters);
7384 _visitNode(node.parameters);
7385 }
7386 _visitFunctionWithPrefix(" ", node.body);
7387 return null;
7388 }
7389
7390 @override
7391 Object visitMethodInvocation(MethodInvocation node) {
7392 if (node.isCascaded) {
7393 _writer.print("..");
7394 } else {
7395 if (node.target != null) {
7396 node.target.accept(this);
7397 _writer.print(node.operator.lexeme);
7398 }
7399 }
7400 _visitNode(node.methodName);
7401 _visitNode(node.typeArguments);
7402 _visitNode(node.argumentList);
7403 return null;
7404 }
7405
7406 @override
7407 Object visitNamedExpression(NamedExpression node) {
7408 _visitNode(node.name);
7409 _visitNodeWithPrefix(" ", node.expression);
7410 return null;
7411 }
7412
7413 @override
7414 Object visitNativeClause(NativeClause node) {
7415 _writer.print("native ");
7416 _visitNode(node.name);
7417 return null;
7418 }
7419
7420 @override
7421 Object visitNativeFunctionBody(NativeFunctionBody node) {
7422 _writer.print("native ");
7423 _visitNode(node.stringLiteral);
7424 _writer.print(';');
7425 return null;
7426 }
7427
7428 @override
7429 Object visitNullLiteral(NullLiteral node) {
7430 _writer.print("null");
7431 return null;
7432 }
7433
7434 @override
7435 Object visitParenthesizedExpression(ParenthesizedExpression node) {
7436 _writer.print('(');
7437 _visitNode(node.expression);
7438 _writer.print(')');
7439 return null;
7440 }
7441
7442 @override
7443 Object visitPartDirective(PartDirective node) {
7444 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7445 _writer.print("part ");
7446 _visitNode(node.uri);
7447 _writer.print(';');
7448 return null;
7449 }
7450
7451 @override
7452 Object visitPartOfDirective(PartOfDirective node) {
7453 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7454 _writer.print("part of ");
7455 _visitNode(node.libraryName);
7456 _writer.print(';');
7457 return null;
7458 }
7459
7460 @override
7461 Object visitPostfixExpression(PostfixExpression node) {
7462 _visitNode(node.operand);
7463 _writer.print(node.operator.lexeme);
7464 return null;
7465 }
7466
7467 @override
7468 Object visitPrefixedIdentifier(PrefixedIdentifier node) {
7469 _visitNode(node.prefix);
7470 _writer.print('.');
7471 _visitNode(node.identifier);
7472 return null;
7473 }
7474
7475 @override
7476 Object visitPrefixExpression(PrefixExpression node) {
7477 _writer.print(node.operator.lexeme);
7478 _visitNode(node.operand);
7479 return null;
7480 }
7481
7482 @override
7483 Object visitPropertyAccess(PropertyAccess node) {
7484 if (node.isCascaded) {
7485 _writer.print("..");
7486 } else {
7487 _visitNode(node.target);
7488 _writer.print(node.operator.lexeme);
7489 }
7490 _visitNode(node.propertyName);
7491 return null;
7492 }
7493
7494 @override
7495 Object visitRedirectingConstructorInvocation(
7496 RedirectingConstructorInvocation node) {
7497 _writer.print("this");
7498 _visitNodeWithPrefix(".", node.constructorName);
7499 _visitNode(node.argumentList);
7500 return null;
7501 }
7502
7503 @override
7504 Object visitRethrowExpression(RethrowExpression node) {
7505 _writer.print("rethrow");
7506 return null;
7507 }
7508
7509 @override
7510 Object visitReturnStatement(ReturnStatement node) {
7511 Expression expression = node.expression;
7512 if (expression == null) {
7513 _writer.print("return;");
7514 } else {
7515 _writer.print("return ");
7516 expression.accept(this);
7517 _writer.print(";");
7518 }
7519 return null;
7520 }
7521
7522 @override
7523 Object visitScriptTag(ScriptTag node) {
7524 _writer.print(node.scriptTag.lexeme);
7525 return null;
7526 }
7527
7528 @override
7529 Object visitShowCombinator(ShowCombinator node) {
7530 _writer.print("show ");
7531 _visitNodeListWithSeparator(node.shownNames, ", ");
7532 return null;
7533 }
7534
7535 @override
7536 Object visitSimpleFormalParameter(SimpleFormalParameter node) {
7537 _visitNodeListWithSeparatorAndSuffix(node.metadata, ' ', ' ');
7538 _visitTokenWithSuffix(node.keyword, " ");
7539 _visitNodeWithSuffix(node.type, " ");
7540 _visitNode(node.identifier);
7541 return null;
7542 }
7543
7544 @override
7545 Object visitSimpleIdentifier(SimpleIdentifier node) {
7546 _writer.print(node.token.lexeme);
7547 return null;
7548 }
7549
7550 @override
7551 Object visitSimpleStringLiteral(SimpleStringLiteral node) {
7552 _writer.print(node.literal.lexeme);
7553 return null;
7554 }
7555
7556 @override
7557 Object visitStringInterpolation(StringInterpolation node) {
7558 _visitNodeList(node.elements);
7559 return null;
7560 }
7561
7562 @override
7563 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
7564 _writer.print("super");
7565 _visitNodeWithPrefix(".", node.constructorName);
7566 _visitNode(node.argumentList);
7567 return null;
7568 }
7569
7570 @override
7571 Object visitSuperExpression(SuperExpression node) {
7572 _writer.print("super");
7573 return null;
7574 }
7575
7576 @override
7577 Object visitSwitchCase(SwitchCase node) {
7578 _visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
7579 _writer.print("case ");
7580 _visitNode(node.expression);
7581 _writer.print(": ");
7582 _visitNodeListWithSeparator(node.statements, " ");
7583 return null;
7584 }
7585
7586 @override
7587 Object visitSwitchDefault(SwitchDefault node) {
7588 _visitNodeListWithSeparatorAndSuffix(node.labels, " ", " ");
7589 _writer.print("default: ");
7590 _visitNodeListWithSeparator(node.statements, " ");
7591 return null;
7592 }
7593
7594 @override
7595 Object visitSwitchStatement(SwitchStatement node) {
7596 _writer.print("switch (");
7597 _visitNode(node.expression);
7598 _writer.print(") {");
7599 _visitNodeListWithSeparator(node.members, " ");
7600 _writer.print("}");
7601 return null;
7602 }
7603
7604 @override
7605 Object visitSymbolLiteral(SymbolLiteral node) {
7606 _writer.print("#");
7607 List<Token> components = node.components;
7608 for (int i = 0; i < components.length; i++) {
7609 if (i > 0) {
7610 _writer.print(".");
7611 }
7612 _writer.print(components[i].lexeme);
7613 }
7614 return null;
7615 }
7616
7617 @override
7618 Object visitThisExpression(ThisExpression node) {
7619 _writer.print("this");
7620 return null;
7621 }
7622
7623 @override
7624 Object visitThrowExpression(ThrowExpression node) {
7625 _writer.print("throw ");
7626 _visitNode(node.expression);
7627 return null;
7628 }
7629
7630 @override
7631 Object visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
7632 _visitNodeWithSuffix(node.variables, ";");
7633 return null;
7634 }
7635
7636 @override
7637 Object visitTryStatement(TryStatement node) {
7638 _writer.print("try ");
7639 _visitNode(node.body);
7640 _visitNodeListWithSeparatorAndPrefix(" ", node.catchClauses, " ");
7641 _visitNodeWithPrefix(" finally ", node.finallyBlock);
7642 return null;
7643 }
7644
7645 @override
7646 Object visitTypeArgumentList(TypeArgumentList node) {
7647 _writer.print('<');
7648 _visitNodeListWithSeparator(node.arguments, ", ");
7649 _writer.print('>');
7650 return null;
7651 }
7652
7653 @override
7654 Object visitTypeName(TypeName node) {
7655 _visitNode(node.name);
7656 _visitNode(node.typeArguments);
7657 if (node.question != null) {
7658 _writer.print('?');
7659 }
7660 return null;
7661 }
7662
7663 @override
7664 Object visitTypeParameter(TypeParameter node) {
7665 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7666 _visitNode(node.name);
7667 _visitNodeWithPrefix(" extends ", node.bound);
7668 return null;
7669 }
7670
7671 @override
7672 Object visitTypeParameterList(TypeParameterList node) {
7673 _writer.print('<');
7674 _visitNodeListWithSeparator(node.typeParameters, ", ");
7675 _writer.print('>');
7676 return null;
7677 }
7678
7679 @override
7680 Object visitVariableDeclaration(VariableDeclaration node) {
7681 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7682 _visitNode(node.name);
7683 _visitNodeWithPrefix(" = ", node.initializer);
7684 return null;
7685 }
7686
7687 @override
7688 Object visitVariableDeclarationList(VariableDeclarationList node) {
7689 _visitNodeListWithSeparatorAndSuffix(node.metadata, " ", " ");
7690 _visitTokenWithSuffix(node.keyword, " ");
7691 _visitNodeWithSuffix(node.type, " ");
7692 _visitNodeListWithSeparator(node.variables, ", ");
7693 return null;
7694 }
7695
7696 @override
7697 Object visitVariableDeclarationStatement(VariableDeclarationStatement node) {
7698 _visitNode(node.variables);
7699 _writer.print(";");
7700 return null;
7701 }
7702
7703 @override
7704 Object visitWhileStatement(WhileStatement node) {
7705 _writer.print("while (");
7706 _visitNode(node.condition);
7707 _writer.print(") ");
7708 _visitNode(node.body);
7709 return null;
7710 }
7711
7712 @override
7713 Object visitWithClause(WithClause node) {
7714 _writer.print("with ");
7715 _visitNodeListWithSeparator(node.mixinTypes, ", ");
7716 return null;
7717 }
7718
7719 @override
7720 Object visitYieldStatement(YieldStatement node) {
7721 if (node.star != null) {
7722 _writer.print("yield* ");
7723 } else {
7724 _writer.print("yield ");
7725 }
7726 _visitNode(node.expression);
7727 _writer.print(";");
7728 return null;
7729 }
7730
7731 /**
7732 * Visit the given function [body], printing the [prefix] before if the body
7733 * is not empty.
7734 */
7735 void _visitFunctionWithPrefix(String prefix, FunctionBody body) {
7736 if (body is! EmptyFunctionBody) {
7737 _writer.print(prefix);
7738 }
7739 _visitNode(body);
7740 }
7741
7742 /**
7743 * Safely visit the given [node].
7744 */
7745 void _visitNode(AstNode node) {
7746 if (node != null) {
7747 node.accept(this);
7748 }
7749 }
7750
7751 /**
7752 * Print a list of [nodes] without any separation.
7753 */
7754 void _visitNodeList(NodeList<AstNode> nodes) {
7755 _visitNodeListWithSeparator(nodes, "");
7756 }
7757
7758 /**
7759 * Print a list of [nodes], separated by the given [separator].
7760 */
7761 void _visitNodeListWithSeparator(NodeList<AstNode> nodes, String separator) {
7762 if (nodes != null) {
7763 int size = nodes.length;
7764 for (int i = 0; i < size; i++) {
7765 if (i > 0) {
7766 _writer.print(separator);
7767 }
7768 nodes[i].accept(this);
7769 }
7770 }
7771 }
7772
7773 /**
7774 * Print a list of [nodes], prefixed by the given [prefix] if the list is not
7775 * empty, and separated by the given [separator].
7776 */
7777 void _visitNodeListWithSeparatorAndPrefix(
7778 String prefix, NodeList<AstNode> nodes, String separator) {
7779 if (nodes != null) {
7780 int size = nodes.length;
7781 if (size > 0) {
7782 _writer.print(prefix);
7783 for (int i = 0; i < size; i++) {
7784 if (i > 0) {
7785 _writer.print(separator);
7786 }
7787 nodes[i].accept(this);
7788 }
7789 }
7790 }
7791 }
7792
7793 /**
7794 * Print a list of [nodes], separated by the given [separator], followed by
7795 * the given [suffix] if the list is not empty.
7796 */
7797 void _visitNodeListWithSeparatorAndSuffix(
7798 NodeList<AstNode> nodes, String separator, String suffix) {
7799 if (nodes != null) {
7800 int size = nodes.length;
7801 if (size > 0) {
7802 for (int i = 0; i < size; i++) {
7803 if (i > 0) {
7804 _writer.print(separator);
7805 }
7806 nodes[i].accept(this);
7807 }
7808 _writer.print(suffix);
7809 }
7810 }
7811 }
7812
7813 /**
7814 * Safely visit the given [node], printing the [prefix] before the node if it
7815 * is non-`null`.
7816 */
7817 void _visitNodeWithPrefix(String prefix, AstNode node) {
7818 if (node != null) {
7819 _writer.print(prefix);
7820 node.accept(this);
7821 }
7822 }
7823
7824 /**
7825 * Safely visit the given [node], printing the [suffix] after the node if it
7826 * is non-`null`.
7827 */
7828 void _visitNodeWithSuffix(AstNode node, String suffix) {
7829 if (node != null) {
7830 node.accept(this);
7831 _writer.print(suffix);
7832 }
7833 }
7834
7835 /**
7836 * Safely visit the given [token], printing the [suffix] after the token if it
7837 * is non-`null`.
7838 */
7839 void _visitTokenWithSuffix(Token token, String suffix) {
7840 if (token != null) {
7841 _writer.print(token.lexeme);
7842 _writer.print(suffix);
7843 }
7844 }
7845 }
OLDNEW
« no previous file with comments | « packages/analyzer/lib/src/dart/ast/token.dart ('k') | packages/analyzer/lib/src/dart/constant/evaluation.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698