| OLD | NEW |
| (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> && |
| 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> & e<sub>2</sub></i>, |
| 2149 * > <i>e<sub>1</sub> | e<sub>2</sub></i>, <i>e<sub>1</sub> >> |
| 2150 * > e<sub>2</sub></i> or <i>e<sub>1</sub> << 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> > e<sub>2</sub></i>, <i>e<sub>1</sub> < |
| 2160 * > e<sub>2</sub></i>, <i>e<sub>1</sub> >= e<sub>2</sub></i>, |
| 2161 * > <i>e<sub>1</sub> <= 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 } |
| OLD | NEW |