| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library formatter_impl; | 5 library formatter_impl; |
| 6 | 6 |
| 7 import 'dart:math'; | 7 import 'dart:math'; |
| 8 | 8 |
| 9 import 'package:analyzer_experimental/analyzer.dart'; | 9 import 'package:analyzer_experimental/analyzer.dart'; |
| 10 import 'package:analyzer_experimental/src/generated/parser.dart'; | 10 import 'package:analyzer_experimental/src/generated/parser.dart'; |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 /// the next token. | 157 /// the next token. |
| 158 bool preservePrecedingNewlines = false; | 158 bool preservePrecedingNewlines = false; |
| 159 | 159 |
| 160 /// Initialize a newly created visitor to write source code representing | 160 /// Initialize a newly created visitor to write source code representing |
| 161 /// the visited nodes to the given [writer]. | 161 /// the visited nodes to the given [writer]. |
| 162 SourceVisitor(FormatterOptions options, this.lineInfo) : | 162 SourceVisitor(FormatterOptions options, this.lineInfo) : |
| 163 writer = new SourceWriter(indentCount: options.initialIndentationLevel, | 163 writer = new SourceWriter(indentCount: options.initialIndentationLevel, |
| 164 lineSeparator: options.lineSeparator); | 164 lineSeparator: options.lineSeparator); |
| 165 | 165 |
| 166 visitAdjacentStrings(AdjacentStrings node) { | 166 visitAdjacentStrings(AdjacentStrings node) { |
| 167 visitList(node.strings, ' '); | 167 visitNodes(node.strings, separatedBy: space); |
| 168 } | 168 } |
| 169 | 169 |
| 170 visitAnnotation(Annotation node) { | 170 visitAnnotation(Annotation node) { |
| 171 token(node.atSign); | 171 token(node.atSign); |
| 172 visit(node.name); | 172 visit(node.name); |
| 173 visitPrefixed('.', node.constructorName); | 173 token(node.period); |
| 174 visit(node.constructorName); |
| 174 visit(node.arguments); | 175 visit(node.arguments); |
| 175 } | 176 } |
| 176 | 177 |
| 177 visitArgumentDefinitionTest(ArgumentDefinitionTest node) { | 178 visitArgumentDefinitionTest(ArgumentDefinitionTest node) { |
| 178 token(node.question); | 179 token(node.question); |
| 179 visit(node.identifier); | 180 visit(node.identifier); |
| 180 } | 181 } |
| 181 | 182 |
| 182 visitArgumentList(ArgumentList node) { | 183 visitArgumentList(ArgumentList node) { |
| 183 token(node.leftParenthesis); | 184 token(node.leftParenthesis); |
| 184 visitList(node.arguments, ', '); | 185 visitNodes(node.arguments, separatedBy: commaSeperator); |
| 185 token(node.rightParenthesis); | 186 token(node.rightParenthesis); |
| 186 } | 187 } |
| 187 | 188 |
| 188 visitAsExpression(AsExpression node) { | 189 visitAsExpression(AsExpression node) { |
| 189 visit(node.expression); | 190 visit(node.expression); |
| 190 space(); | 191 space(); |
| 191 token(node.asOperator); | 192 token(node.asOperator); |
| 192 space(); | 193 space(); |
| 193 visit(node.type); | 194 visit(node.type); |
| 194 } | 195 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 213 visitBinaryExpression(BinaryExpression node) { | 214 visitBinaryExpression(BinaryExpression node) { |
| 214 visit(node.leftOperand); | 215 visit(node.leftOperand); |
| 215 space(); | 216 space(); |
| 216 token(node.operator); | 217 token(node.operator); |
| 217 space(); | 218 space(); |
| 218 visit(node.rightOperand); | 219 visit(node.rightOperand); |
| 219 } | 220 } |
| 220 | 221 |
| 221 visitBlock(Block node) { | 222 visitBlock(Block node) { |
| 222 token(node.leftBracket); | 223 token(node.leftBracket); |
| 223 needsNewline = true; | |
| 224 indent(); | 224 indent(); |
| 225 | 225 |
| 226 for (var stmt in node.statements) { | 226 visitNodes(node.statements, precededBy: newlines, separatedBy: newlines); |
| 227 visit(stmt); | 227 |
| 228 } | |
| 229 | |
| 230 unindent(); | 228 unindent(); |
| 231 preservePrecedingNewlines = true; | 229 newlines(); |
| 232 needsNewline = true; | |
| 233 token(node.rightBracket); | 230 token(node.rightBracket); |
| 234 } | 231 } |
| 235 | 232 |
| 236 visitBlockFunctionBody(BlockFunctionBody node) { | 233 visitBlockFunctionBody(BlockFunctionBody node) { |
| 237 visit(node.block); | 234 visit(node.block); |
| 238 } | 235 } |
| 239 | 236 |
| 240 visitBooleanLiteral(BooleanLiteral node) { | 237 visitBooleanLiteral(BooleanLiteral node) { |
| 241 token(node.literal); | 238 token(node.literal); |
| 242 } | 239 } |
| 243 | 240 |
| 244 visitBreakStatement(BreakStatement node) { | 241 visitBreakStatement(BreakStatement node) { |
| 245 preservePrecedingNewlines = true; | |
| 246 token(node.keyword); | 242 token(node.keyword); |
| 247 visitPrefixed(' ', node.label); | 243 visitNode(node.label, precededBy: space); |
| 248 token(node.semicolon); | 244 token(node.semicolon); |
| 249 needsNewline = true; | |
| 250 } | 245 } |
| 251 | 246 |
| 252 visitCascadeExpression(CascadeExpression node) { | 247 visitCascadeExpression(CascadeExpression node) { |
| 253 visit(node.target); | 248 visit(node.target); |
| 254 visitList(node.cascadeSections); | 249 visitNodes(node.cascadeSections); |
| 255 } | 250 } |
| 256 | 251 |
| 257 visitCatchClause(CatchClause node) { | 252 visitCatchClause(CatchClause node) { |
| 258 visitPrefixed('on ', node.exceptionType); | 253 |
| 254 token(node.onKeyword, precededBy: space, followedBy: space); |
| 255 visit(node.exceptionType); |
| 256 |
| 259 if (node.catchKeyword != null) { | 257 if (node.catchKeyword != null) { |
| 260 if (node.exceptionType != null) { | 258 if (node.exceptionType != null) { |
| 261 space(); | 259 space(); |
| 262 } | 260 } |
| 263 token(node.catchKeyword); | 261 token(node.catchKeyword); |
| 264 space(); | 262 space(); |
| 265 token(node.leftParenthesis); | 263 token(node.leftParenthesis); |
| 266 visit(node.exceptionParameter); | 264 visit(node.exceptionParameter); |
| 267 visitPrefixed(', ', node.stackTraceParameter); | 265 token(node.comma, followedBy: space); |
| 266 visit(node.stackTraceParameter); |
| 268 token(node.rightParenthesis); | 267 token(node.rightParenthesis); |
| 269 space(); | 268 space(); |
| 270 } else { | 269 } else { |
| 271 space(); | 270 space(); |
| 272 } | 271 } |
| 273 visit(node.body); | 272 visit(node.body); |
| 274 needsNewline = true; | |
| 275 } | 273 } |
| 276 | 274 |
| 277 visitClassDeclaration(ClassDeclaration node) { | 275 visitClassDeclaration(ClassDeclaration node) { |
| 278 preservePrecedingNewlines = true; | |
| 279 modifier(node.abstractKeyword); | 276 modifier(node.abstractKeyword); |
| 280 token(node.classKeyword); | 277 token(node.classKeyword); |
| 281 space(); | 278 space(); |
| 282 visit(node.name); | 279 visit(node.name); |
| 283 visit(node.typeParameters); | 280 visit(node.typeParameters); |
| 284 visitPrefixed(' ', node.extendsClause); | 281 visitNode(node.extendsClause, precededBy: space); |
| 285 visitPrefixed(' ', node.withClause); | 282 visitNode(node.withClause, precededBy: space); |
| 286 visitPrefixed(' ', node.implementsClause); | 283 visitNode(node.implementsClause, precededBy: space); |
| 287 space(); | 284 space(); |
| 288 token(node.leftBracket); | 285 token(node.leftBracket); |
| 286 |
| 289 indent(); | 287 indent(); |
| 290 | 288 visitNodes(node.members, precededBy: newlines, separatedBy: newlines); |
| 291 for (var i = 0; i < node.members.length; i++) { | |
| 292 visit(node.members[i]); | |
| 293 } | |
| 294 | |
| 295 unindent(); | 289 unindent(); |
| 296 | 290 newlines(); |
| 297 emitPrecedingNewlines(node.rightBracket, min: 1); | 291 |
| 298 token(node.rightBracket); | 292 token(node.rightBracket); |
| 299 } | 293 } |
| 300 | 294 |
| 301 visitClassTypeAlias(ClassTypeAlias node) { | 295 visitClassTypeAlias(ClassTypeAlias node) { |
| 302 token(node.keyword); | 296 token(node.keyword); |
| 303 space(); | 297 space(); |
| 304 visit(node.name); | 298 visit(node.name); |
| 305 visit(node.typeParameters); | 299 visit(node.typeParameters); |
| 306 space(); | 300 space(); |
| 307 token(node.equals); | 301 token(node.equals); |
| 308 space(); | 302 space(); |
| 309 if (node.abstractKeyword != null) { | 303 if (node.abstractKeyword != null) { |
| 310 token(node.abstractKeyword); | 304 token(node.abstractKeyword); |
| 311 space(); | 305 space(); |
| 312 } | 306 } |
| 313 visit(node.superclass); | 307 visit(node.superclass); |
| 314 visitPrefixed(' ', node.withClause); | 308 visitNode(node.withClause, precededBy: space); |
| 315 visitPrefixed(' ', node.implementsClause); | 309 visitNode(node.implementsClause, precededBy: space); |
| 316 token(node.semicolon); | 310 token(node.semicolon); |
| 317 } | 311 } |
| 318 | 312 |
| 319 visitComment(Comment node) => null; | 313 visitComment(Comment node) => null; |
| 320 | 314 |
| 321 visitCommentReference(CommentReference node) => null; | 315 visitCommentReference(CommentReference node) => null; |
| 322 | 316 |
| 323 visitCompilationUnit(CompilationUnit node) { | 317 visitCompilationUnit(CompilationUnit node) { |
| 324 | 318 |
| 325 // Cache EOF for leading whitespace calculation | 319 // Cache EOF for leading whitespace calculation |
| 326 var start = node.beginToken.previous; | 320 var start = node.beginToken.previous; |
| 327 if (start != null && start.type is TokenType_EOF) { | 321 if (start != null && start.type is TokenType_EOF) { |
| 328 previousToken = start; | 322 previousToken = start; |
| 329 } | 323 } |
| 330 | 324 |
| 331 var scriptTag = node.scriptTag; | 325 var scriptTag = node.scriptTag; |
| 332 var directives = node.directives; | 326 var directives = node.directives; |
| 333 visit(scriptTag); | 327 visit(scriptTag); |
| 334 visitList(directives); | 328 |
| 335 visitList(node.declarations); | 329 preservePrecedingNewlines = true; |
| 330 visitNodes(directives, separatedBy: newlines); |
| 331 |
| 332 preservePrecedingNewlines = true; |
| 333 visitNodes(node.declarations, separatedBy: newlines); |
| 336 | 334 |
| 337 // Handle trailing whitespace | 335 // Handle trailing whitespace |
| 338 preservePrecedingNewlines = true; | 336 preservePrecedingNewlines = true; |
| 339 token(node.endToken /* EOF */); | 337 token(node.endToken /* EOF */); |
| 340 } | 338 } |
| 341 | 339 |
| 342 visitConditionalExpression(ConditionalExpression node) { | 340 visitConditionalExpression(ConditionalExpression node) { |
| 343 visit(node.condition); | 341 visit(node.condition); |
| 344 space(); | 342 space(); |
| 345 token(node.question); | 343 token(node.question); |
| 346 space(); | 344 space(); |
| 347 visit(node.thenExpression); | 345 visit(node.thenExpression); |
| 348 space(); | 346 space(); |
| 349 token(node.colon); | 347 token(node.colon); |
| 350 space(); | 348 space(); |
| 351 visit(node.elseExpression); | 349 visit(node.elseExpression); |
| 352 } | 350 } |
| 353 | 351 |
| 354 visitConstructorDeclaration(ConstructorDeclaration node) { | 352 visitConstructorDeclaration(ConstructorDeclaration node) { |
| 355 modifier(node.externalKeyword); | 353 modifier(node.externalKeyword); |
| 356 modifier(node.constKeyword); | 354 modifier(node.constKeyword); |
| 357 modifier(node.factoryKeyword); | 355 modifier(node.factoryKeyword); |
| 358 visit(node.returnType); | 356 visit(node.returnType); |
| 359 visitPrefixed('.', node.name); | 357 token(node.period); |
| 358 visit(node.name); |
| 360 visit(node.parameters); | 359 visit(node.parameters); |
| 361 visitPrefixedList(' : ', node.initializers, ', '); | 360 token(node.separator /* = or : */, precededBy: space, followedBy: space); |
| 362 visitPrefixed(' = ', node.redirectedConstructor); | 361 visitNodes(node.initializers, separatedBy: commaSeperator); |
| 363 visitPrefixedBody(' ', node.body); | 362 visit(node.redirectedConstructor); |
| 363 |
| 364 visitPrefixedBody(space, node.body); |
| 364 } | 365 } |
| 365 | 366 |
| 366 visitConstructorFieldInitializer(ConstructorFieldInitializer node) { | 367 visitConstructorFieldInitializer(ConstructorFieldInitializer node) { |
| 367 token(node.keyword); | 368 token(node.keyword); |
| 368 token(node.period); | 369 token(node.period); |
| 369 visit(node.fieldName); | 370 visit(node.fieldName); |
| 370 space(); | 371 space(); |
| 371 token(node.equals); | 372 token(node.equals); |
| 372 space(); | 373 space(); |
| 373 visit(node.expression); | 374 visit(node.expression); |
| 374 } | 375 } |
| 375 | 376 |
| 376 visitConstructorName(ConstructorName node) { | 377 visitConstructorName(ConstructorName node) { |
| 377 visit(node.type); | 378 visit(node.type); |
| 378 visitPrefixed('.', node.name); | 379 token(node.period); |
| 380 visit(node.name); |
| 379 } | 381 } |
| 380 | 382 |
| 381 visitContinueStatement(ContinueStatement node) { | 383 visitContinueStatement(ContinueStatement node) { |
| 382 token(node.keyword); | 384 token(node.keyword); |
| 383 visitPrefixed(' ', node.label); | 385 visitNode(node.label, precededBy: space); |
| 384 token(node.semicolon); | 386 token(node.semicolon); |
| 385 } | 387 } |
| 386 | 388 |
| 387 visitDeclaredIdentifier(DeclaredIdentifier node) { | 389 visitDeclaredIdentifier(DeclaredIdentifier node) { |
| 388 token(node.keyword); | 390 token(node.keyword); |
| 389 space(); | 391 space(); |
| 390 visit(node.type); | 392 visit(node.type); |
| 391 //TODO(pquitslund): avoiding visitSuffixed(..) but we can do better | 393 //TODO(pquitslund): avoiding visitSuffixed(..) but we can do better |
| 392 if (node.type != null) { | 394 if (node.type != null) { |
| 393 space(); | 395 space(); |
| 394 } | 396 } |
| 395 visit(node.identifier); | 397 visit(node.identifier); |
| 396 } | 398 } |
| 397 | 399 |
| 398 visitDefaultFormalParameter(DefaultFormalParameter node) { | 400 visitDefaultFormalParameter(DefaultFormalParameter node) { |
| 399 visit(node.parameter); | 401 visit(node.parameter); |
| 400 if (node.separator != null) { | 402 if (node.separator != null) { |
| 401 space(); | 403 // The '=' separator is preceded by a space |
| 404 if (node.separator.type == TokenType.EQ) { |
| 405 space(); |
| 406 } |
| 402 token(node.separator); | 407 token(node.separator); |
| 403 visitPrefixed(' ', node.defaultValue); | 408 visitNode(node.defaultValue, precededBy: space); |
| 404 } | 409 } |
| 405 } | 410 } |
| 406 | 411 |
| 407 visitDoStatement(DoStatement node) { | 412 visitDoStatement(DoStatement node) { |
| 408 token(node.doKeyword); | 413 token(node.doKeyword); |
| 409 space(); | 414 space(); |
| 410 visit(node.body); | 415 visit(node.body); |
| 411 space(); | 416 space(); |
| 412 token(node.whileKeyword); | 417 token(node.whileKeyword); |
| 413 space(); | 418 space(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 426 } | 431 } |
| 427 | 432 |
| 428 visitEmptyStatement(EmptyStatement node) { | 433 visitEmptyStatement(EmptyStatement node) { |
| 429 token(node.semicolon); | 434 token(node.semicolon); |
| 430 } | 435 } |
| 431 | 436 |
| 432 visitExportDirective(ExportDirective node) { | 437 visitExportDirective(ExportDirective node) { |
| 433 token(node.keyword); | 438 token(node.keyword); |
| 434 space(); | 439 space(); |
| 435 visit(node.uri); | 440 visit(node.uri); |
| 436 visitPrefixedList(' ', node.combinators, ' '); | 441 visitNodes(node.combinators, precededBy: space, separatedBy: space); |
| 437 token(node.semicolon); | 442 token(node.semicolon); |
| 438 } | 443 } |
| 439 | 444 |
| 440 visitExpressionFunctionBody(ExpressionFunctionBody node) { | 445 visitExpressionFunctionBody(ExpressionFunctionBody node) { |
| 441 token(node.functionDefinition); | 446 token(node.functionDefinition); |
| 442 space(); | 447 space(); |
| 443 visit(node.expression); | 448 visit(node.expression); |
| 444 token(node.semicolon); | 449 token(node.semicolon); |
| 445 } | 450 } |
| 446 | 451 |
| 447 visitExpressionStatement(ExpressionStatement node) { | 452 visitExpressionStatement(ExpressionStatement node) { |
| 448 visit(node.expression); | 453 visit(node.expression); |
| 449 token(node.semicolon); | 454 token(node.semicolon); |
| 450 } | 455 } |
| 451 | 456 |
| 452 visitExtendsClause(ExtendsClause node) { | 457 visitExtendsClause(ExtendsClause node) { |
| 453 token(node.keyword); | 458 token(node.keyword); |
| 454 space(); | 459 space(); |
| 455 visit(node.superclass); | 460 visit(node.superclass); |
| 456 } | 461 } |
| 457 | 462 |
| 458 visitFieldDeclaration(FieldDeclaration node) { | 463 visitFieldDeclaration(FieldDeclaration node) { |
| 459 needsNewline = true; | |
| 460 preservePrecedingNewlines = true; | |
| 461 modifier(node.keyword); | 464 modifier(node.keyword); |
| 462 visit(node.fields); | 465 visit(node.fields); |
| 463 token(node.semicolon); | 466 token(node.semicolon); |
| 464 } | 467 } |
| 465 | 468 |
| 466 visitFieldFormalParameter(FieldFormalParameter node) { | 469 visitFieldFormalParameter(FieldFormalParameter node) { |
| 467 token(node.keyword); | 470 token(node.keyword); |
| 468 space(); | 471 space(); |
| 469 visit(node.type); | 472 visit(node.type); |
| 470 space(); | 473 space(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 if (groupEnd != null) { | 515 if (groupEnd != null) { |
| 513 append(groupEnd); | 516 append(groupEnd); |
| 514 } | 517 } |
| 515 token(node.rightParenthesis); | 518 token(node.rightParenthesis); |
| 516 } | 519 } |
| 517 | 520 |
| 518 visitForStatement(ForStatement node) { | 521 visitForStatement(ForStatement node) { |
| 519 token(node.forKeyword); | 522 token(node.forKeyword); |
| 520 space(); | 523 space(); |
| 521 token(node.leftParenthesis); | 524 token(node.leftParenthesis); |
| 522 var initialization = node.initialization; | 525 if (node.initialization != null) { |
| 523 if (initialization != null) { | 526 visit(node.initialization); |
| 524 visit(initialization); | |
| 525 } else { | 527 } else { |
| 526 visit(node.variables); | 528 visit(node.variables); |
| 527 } | 529 } |
| 528 token(node.leftSeparator); | 530 token(node.leftSeparator); |
| 529 visitPrefixed(' ', node.condition); | 531 space(); |
| 532 visit(node.condition); |
| 530 token(node.rightSeparator); | 533 token(node.rightSeparator); |
| 531 visitPrefixedList(' ', node.updaters, ', '); | 534 visitNodes(node.updaters, precededBy: space, separatedBy: space); |
| 532 token(node.leftParenthesis); | 535 token(node.rightParenthesis); |
| 533 space(); | 536 space(); |
| 534 visit(node.body); | 537 visit(node.body); |
| 535 } | 538 } |
| 536 | 539 |
| 537 visitFunctionDeclaration(FunctionDeclaration node) { | 540 visitFunctionDeclaration(FunctionDeclaration node) { |
| 538 needsNewline = true; | 541 visitNode(node.returnType, followedBy: space); |
| 539 preservePrecedingNewlines = true; | |
| 540 visitSuffixed(node.returnType, ' '); | |
| 541 token(node.propertyKeyword, followedBy: space); | 542 token(node.propertyKeyword, followedBy: space); |
| 542 visit(node.name); | 543 visit(node.name); |
| 543 visit(node.functionExpression); | 544 visit(node.functionExpression); |
| 544 } | 545 } |
| 545 | 546 |
| 546 visitFunctionDeclarationStatement(FunctionDeclarationStatement node) { | 547 visitFunctionDeclarationStatement(FunctionDeclarationStatement node) { |
| 547 visit(node.functionDeclaration); | 548 visit(node.functionDeclaration); |
| 548 // TODO(pquitslund): fix and handle in function body | 549 // TODO(pquitslund): fix and handle in function body |
| 549 append(';'); | 550 append(';'); |
| 550 } | 551 } |
| 551 | 552 |
| 552 visitFunctionExpression(FunctionExpression node) { | 553 visitFunctionExpression(FunctionExpression node) { |
| 553 visit(node.parameters); | 554 visit(node.parameters); |
| 554 space(); | 555 space(); |
| 555 visit(node.body); | 556 visit(node.body); |
| 556 } | 557 } |
| 557 | 558 |
| 558 visitFunctionExpressionInvocation(FunctionExpressionInvocation node) { | 559 visitFunctionExpressionInvocation(FunctionExpressionInvocation node) { |
| 559 visit(node.function); | 560 visit(node.function); |
| 560 visit(node.argumentList); | 561 visit(node.argumentList); |
| 561 } | 562 } |
| 562 | 563 |
| 563 visitFunctionTypeAlias(FunctionTypeAlias node) { | 564 visitFunctionTypeAlias(FunctionTypeAlias node) { |
| 564 token(node.keyword); | 565 token(node.keyword); |
| 565 space(); | 566 space(); |
| 566 visitSuffixed(node.returnType, ' '); | 567 visitNode(node.returnType, followedBy: space); |
| 567 visit(node.name); | 568 visit(node.name); |
| 568 visit(node.typeParameters); | 569 visit(node.typeParameters); |
| 569 visit(node.parameters); | 570 visit(node.parameters); |
| 570 token(node.semicolon); | 571 token(node.semicolon); |
| 571 } | 572 } |
| 572 | 573 |
| 573 visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { | 574 visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { |
| 574 visitSuffixed(node.returnType, ' '); | 575 visitNode(node.returnType, followedBy: space); |
| 575 visit(node.identifier); | 576 visit(node.identifier); |
| 576 visit(node.parameters); | 577 visit(node.parameters); |
| 577 } | 578 } |
| 578 | 579 |
| 579 visitHideCombinator(HideCombinator node) { | 580 visitHideCombinator(HideCombinator node) { |
| 580 token(node.keyword); | 581 token(node.keyword); |
| 581 space(); | 582 space(); |
| 582 visitList(node.hiddenNames, ', '); | 583 visitNodes(node.hiddenNames, separatedBy: commaSeperator); |
| 583 } | 584 } |
| 584 | 585 |
| 585 visitIfStatement(IfStatement node) { | 586 visitIfStatement(IfStatement node) { |
| 586 preservePrecedingNewlines = true; | |
| 587 token(node.ifKeyword); | 587 token(node.ifKeyword); |
| 588 space(); | 588 space(); |
| 589 token(node.leftParenthesis); | 589 token(node.leftParenthesis); |
| 590 visit(node.condition); | 590 visit(node.condition); |
| 591 token(node.rightParenthesis); | 591 token(node.rightParenthesis); |
| 592 space(); | 592 space(); |
| 593 visit(node.thenStatement); | 593 visit(node.thenStatement); |
| 594 //visitPrefixed(' else ', node.elseStatement); | 594 //visitPrefixed(' else ', node.elseStatement); |
| 595 if (node.elseStatement != null) { | 595 if (node.elseStatement != null) { |
| 596 space(); | 596 space(); |
| 597 token(node.elseKeyword); | 597 token(node.elseKeyword); |
| 598 space(); | 598 space(); |
| 599 visit(node.elseStatement); | 599 visit(node.elseStatement); |
| 600 } | 600 } |
| 601 needsNewline = true; | |
| 602 } | 601 } |
| 603 | 602 |
| 604 visitImplementsClause(ImplementsClause node) { | 603 visitImplementsClause(ImplementsClause node) { |
| 605 token(node.keyword); | 604 token(node.keyword); |
| 606 space(); | 605 space(); |
| 607 visitList(node.interfaces, ', '); | 606 visitNodes(node.interfaces, separatedBy: commaSeperator); |
| 608 } | 607 } |
| 609 | 608 |
| 610 visitImportDirective(ImportDirective node) { | 609 visitImportDirective(ImportDirective node) { |
| 611 preservePrecedingNewlines = true; | |
| 612 token(node.keyword); | 610 token(node.keyword); |
| 613 space(); | 611 space(); |
| 614 visit(node.uri); | 612 visit(node.uri); |
| 615 visitPrefixed(' as ', node.prefix); | 613 token(node.asToken, precededBy: space, followedBy: space); |
| 616 visitPrefixedList(' ', node.combinators, ' '); | 614 visit(node.prefix); |
| 615 visitNodes(node.combinators, precededBy: space, separatedBy: space); |
| 617 token(node.semicolon); | 616 token(node.semicolon); |
| 618 needsNewline = true; | |
| 619 } | 617 } |
| 620 | 618 |
| 621 visitIndexExpression(IndexExpression node) { | 619 visitIndexExpression(IndexExpression node) { |
| 622 if (node.isCascaded) { | 620 if (node.isCascaded) { |
| 623 token(node.period); | 621 token(node.period); |
| 624 } else { | 622 } else { |
| 625 visit(node.target); | 623 visit(node.target); |
| 626 } | 624 } |
| 627 token(node.leftBracket); | 625 token(node.leftBracket); |
| 628 visit(node.index); | 626 visit(node.index); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 663 space(); | 661 space(); |
| 664 visit(node.type); | 662 visit(node.type); |
| 665 } | 663 } |
| 666 | 664 |
| 667 visitLabel(Label node) { | 665 visitLabel(Label node) { |
| 668 visit(node.label); | 666 visit(node.label); |
| 669 token(node.colon); | 667 token(node.colon); |
| 670 } | 668 } |
| 671 | 669 |
| 672 visitLabeledStatement(LabeledStatement node) { | 670 visitLabeledStatement(LabeledStatement node) { |
| 673 visitSuffixedList(node.labels, ' ', ' '); | 671 visitNodes(node.labels, separatedBy: space, followedBy: space); |
| 674 visit(node.statement); | 672 visit(node.statement); |
| 675 } | 673 } |
| 676 | 674 |
| 677 visitLibraryDirective(LibraryDirective node) { | 675 visitLibraryDirective(LibraryDirective node) { |
| 678 token(node.keyword); | 676 token(node.keyword); |
| 679 space(); | 677 space(); |
| 680 visit(node.name); | 678 visit(node.name); |
| 681 token(node.semicolon); | 679 token(node.semicolon); |
| 682 } | 680 } |
| 683 | 681 |
| 684 visitLibraryIdentifier(LibraryIdentifier node) { | 682 visitLibraryIdentifier(LibraryIdentifier node) { |
| 685 append(node.name); | 683 append(node.name); |
| 686 } | 684 } |
| 687 | 685 |
| 688 visitListLiteral(ListLiteral node) { | 686 visitListLiteral(ListLiteral node) { |
| 689 if (node.modifier != null) { | 687 modifier(node.modifier); |
| 690 token(node.modifier); | |
| 691 space(); | |
| 692 } | |
| 693 visit(node.typeArguments); | 688 visit(node.typeArguments); |
| 694 token(node.leftBracket); | 689 token(node.leftBracket); |
| 695 visitList(node.elements, ', '); | 690 visitNodes(node.elements, separatedBy: commaSeperator); |
| 696 token(node.rightBracket); | 691 token(node.rightBracket); |
| 697 } | 692 } |
| 698 | 693 |
| 699 visitMapLiteral(MapLiteral node) { | 694 visitMapLiteral(MapLiteral node) { |
| 700 modifier(node.modifier); | 695 modifier(node.modifier); |
| 701 visitSuffixed(node.typeArguments, ' '); | 696 visitNode(node.typeArguments, followedBy: space); |
| 702 token(node.leftBracket); | 697 token(node.leftBracket); |
| 703 visitList(node.entries, ', '); | 698 visitNodes(node.entries, separatedBy: commaSeperator); |
| 704 token(node.rightBracket); | 699 token(node.rightBracket); |
| 705 } | 700 } |
| 706 | 701 |
| 707 visitMapLiteralEntry(MapLiteralEntry node) { | 702 visitMapLiteralEntry(MapLiteralEntry node) { |
| 708 visit(node.key); | 703 visit(node.key); |
| 709 space(); | 704 space(); |
| 710 token(node.separator); | 705 token(node.separator); |
| 711 space(); | 706 space(); |
| 712 visit(node.value); | 707 visit(node.value); |
| 713 } | 708 } |
| 714 | 709 |
| 715 visitMethodDeclaration(MethodDeclaration node) { | 710 visitMethodDeclaration(MethodDeclaration node) { |
| 716 needsNewline = true; | |
| 717 preservePrecedingNewlines = true; | |
| 718 modifier(node.externalKeyword); | 711 modifier(node.externalKeyword); |
| 719 modifier(node.modifierKeyword); | 712 modifier(node.modifierKeyword); |
| 720 visitSuffixed(node.returnType, ' '); | 713 visitNode(node.returnType, followedBy: space); |
| 721 modifier(node.propertyKeyword); | 714 modifier(node.propertyKeyword); |
| 722 modifier(node.operatorKeyword); | 715 modifier(node.operatorKeyword); |
| 723 visit(node.name); | 716 visit(node.name); |
| 724 if (!node.isGetter) { | 717 if (!node.isGetter) { |
| 725 visit(node.parameters); | 718 visit(node.parameters); |
| 726 } | 719 } |
| 727 visitPrefixedBody(' ', node.body); | 720 visitPrefixedBody(space, node.body); |
| 728 } | 721 } |
| 729 | 722 |
| 730 visitMethodInvocation(MethodInvocation node) { | 723 visitMethodInvocation(MethodInvocation node) { |
| 731 if (node.isCascaded) { | 724 visit(node.target); |
| 732 token(node.period); | 725 token(node.period); |
| 733 } else { | |
| 734 visitSuffixed(node.target, '.'); | |
| 735 } | |
| 736 visit(node.methodName); | 726 visit(node.methodName); |
| 737 visit(node.argumentList); | 727 visit(node.argumentList); |
| 738 } | 728 } |
| 739 | 729 |
| 740 visitNamedExpression(NamedExpression node) { | 730 visitNamedExpression(NamedExpression node) { |
| 741 visit(node.name); | 731 visit(node.name); |
| 742 visitPrefixed(' ', node.expression); | 732 visitNode(node.expression, precededBy: space); |
| 743 } | 733 } |
| 744 | 734 |
| 745 visitNativeClause(NativeClause node) { | 735 visitNativeClause(NativeClause node) { |
| 746 token(node.keyword); | 736 token(node.keyword); |
| 747 space(); | 737 space(); |
| 748 visit(node.name); | 738 visit(node.name); |
| 749 } | 739 } |
| 750 | 740 |
| 751 visitNativeFunctionBody(NativeFunctionBody node) { | 741 visitNativeFunctionBody(NativeFunctionBody node) { |
| 752 token(node.nativeToken); | 742 token(node.nativeToken); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 800 token(node.operator); | 790 token(node.operator); |
| 801 } else { | 791 } else { |
| 802 visit(node.target); | 792 visit(node.target); |
| 803 token(node.operator); | 793 token(node.operator); |
| 804 } | 794 } |
| 805 visit(node.propertyName); | 795 visit(node.propertyName); |
| 806 } | 796 } |
| 807 | 797 |
| 808 visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) { | 798 visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) { |
| 809 token(node.keyword); | 799 token(node.keyword); |
| 810 visitPrefixed('.', node.constructorName); | 800 token(node.period); |
| 801 visit(node.constructorName); |
| 811 visit(node.argumentList); | 802 visit(node.argumentList); |
| 812 } | 803 } |
| 813 | 804 |
| 814 visitRethrowExpression(RethrowExpression node) { | 805 visitRethrowExpression(RethrowExpression node) { |
| 815 token(node.keyword); | 806 token(node.keyword); |
| 816 } | 807 } |
| 817 | 808 |
| 818 visitReturnStatement(ReturnStatement node) { | 809 visitReturnStatement(ReturnStatement node) { |
| 819 preservePrecedingNewlines = true; | |
| 820 var expression = node.expression; | 810 var expression = node.expression; |
| 821 if (expression == null) { | 811 if (expression == null) { |
| 822 token(node.keyword); | 812 token(node.keyword); |
| 823 token(node.semicolon); | 813 token(node.semicolon); |
| 824 } else { | 814 } else { |
| 825 token(node.keyword); | 815 token(node.keyword); |
| 826 space(); | 816 space(); |
| 827 expression.accept(this); | 817 expression.accept(this); |
| 828 token(node.semicolon); | 818 token(node.semicolon); |
| 829 } | 819 } |
| 830 } | 820 } |
| 831 | 821 |
| 832 visitScriptTag(ScriptTag node) { | 822 visitScriptTag(ScriptTag node) { |
| 833 token(node.scriptTag); | 823 token(node.scriptTag); |
| 834 } | 824 } |
| 835 | 825 |
| 836 visitShowCombinator(ShowCombinator node) { | 826 visitShowCombinator(ShowCombinator node) { |
| 837 token(node.keyword); | 827 token(node.keyword); |
| 838 space(); | 828 space(); |
| 839 visitList(node.shownNames, ', '); | 829 visitNodes(node.shownNames, separatedBy: commaSeperator); |
| 840 } | 830 } |
| 841 | 831 |
| 842 visitSimpleFormalParameter(SimpleFormalParameter node) { | 832 visitSimpleFormalParameter(SimpleFormalParameter node) { |
| 843 modifier(node.keyword); | 833 modifier(node.keyword); |
| 844 visitSuffixed(node.type, ' '); | 834 visitNode(node.type, followedBy: space); |
| 845 visit(node.identifier); | 835 visit(node.identifier); |
| 846 } | 836 } |
| 847 | 837 |
| 848 visitSimpleIdentifier(SimpleIdentifier node) { | 838 visitSimpleIdentifier(SimpleIdentifier node) { |
| 849 token(node.token); | 839 token(node.token); |
| 850 } | 840 } |
| 851 | 841 |
| 852 visitSimpleStringLiteral(SimpleStringLiteral node) { | 842 visitSimpleStringLiteral(SimpleStringLiteral node) { |
| 853 token(node.literal); | 843 token(node.literal); |
| 854 } | 844 } |
| 855 | 845 |
| 856 visitStringInterpolation(StringInterpolation node) { | 846 visitStringInterpolation(StringInterpolation node) { |
| 857 visitList(node.elements); | 847 visitNodes(node.elements); |
| 858 } | 848 } |
| 859 | 849 |
| 860 visitSuperConstructorInvocation(SuperConstructorInvocation node) { | 850 visitSuperConstructorInvocation(SuperConstructorInvocation node) { |
| 861 token(node.keyword); | 851 token(node.keyword); |
| 862 visitPrefixed('.', node.constructorName); | 852 token(node.period); |
| 853 visit(node.constructorName); |
| 863 visit(node.argumentList); | 854 visit(node.argumentList); |
| 864 } | 855 } |
| 865 | 856 |
| 866 visitSuperExpression(SuperExpression node) { | 857 visitSuperExpression(SuperExpression node) { |
| 867 token(node.keyword); | 858 token(node.keyword); |
| 868 } | 859 } |
| 869 | 860 |
| 870 visitSwitchCase(SwitchCase node) { | 861 visitSwitchCase(SwitchCase node) { |
| 871 preservePrecedingNewlines = true; | 862 visitNodes(node.labels, separatedBy: space, followedBy: space); |
| 872 visitSuffixedList(node.labels, ' ', ' '); | |
| 873 token(node.keyword); | 863 token(node.keyword); |
| 874 space(); | 864 space(); |
| 875 visit(node.expression); | 865 visit(node.expression); |
| 876 token(node.colon); | 866 token(node.colon); |
| 867 newlines(); |
| 877 indent(); | 868 indent(); |
| 878 needsNewline = true; | 869 visitNodes(node.statements, separatedBy: newlines); |
| 879 visitList(node.statements); | |
| 880 unindent(); | 870 unindent(); |
| 881 } | 871 } |
| 882 | 872 |
| 883 visitSwitchDefault(SwitchDefault node) { | 873 visitSwitchDefault(SwitchDefault node) { |
| 884 preservePrecedingNewlines = true; | 874 visitNodes(node.labels, separatedBy: space, followedBy: space); |
| 885 visitSuffixedList(node.labels, ' ', ' '); | |
| 886 token(node.keyword); | 875 token(node.keyword); |
| 887 token(node.colon); | 876 token(node.colon); |
| 888 space(); | 877 space(); |
| 889 visitList(node.statements, ' '); | 878 visitNodes(node.statements, separatedBy: space); |
| 890 } | 879 } |
| 891 | 880 |
| 892 visitSwitchStatement(SwitchStatement node) { | 881 visitSwitchStatement(SwitchStatement node) { |
| 893 token(node.keyword); | 882 token(node.keyword); |
| 894 space(); | 883 space(); |
| 895 token(node.leftParenthesis); | 884 token(node.leftParenthesis); |
| 896 visit(node.expression); | 885 visit(node.expression); |
| 897 token(node.rightParenthesis); | 886 token(node.rightParenthesis); |
| 898 space(); | 887 space(); |
| 899 token(node.leftBracket); | 888 token(node.leftBracket); |
| 900 indent(); | 889 indent(); |
| 901 visitList(node.members); | 890 newlines(); |
| 891 visitNodes(node.members, separatedBy: newlines, followedBy: newlines); |
| 902 unindent(); | 892 unindent(); |
| 903 token(node.rightBracket); | 893 token(node.rightBracket); |
| 904 needsNewline = true; | |
| 905 } | 894 } |
| 906 | 895 |
| 907 visitSymbolLiteral(SymbolLiteral node) { | 896 visitSymbolLiteral(SymbolLiteral node) { |
| 908 // No-op ? | 897 // No-op ? |
| 909 } | 898 } |
| 910 | 899 |
| 911 visitThisExpression(ThisExpression node) { | 900 visitThisExpression(ThisExpression node) { |
| 912 token(node.keyword); | 901 token(node.keyword); |
| 913 } | 902 } |
| 914 | 903 |
| 915 visitThrowExpression(ThrowExpression node) { | 904 visitThrowExpression(ThrowExpression node) { |
| 916 token(node.keyword); | 905 token(node.keyword); |
| 917 space(); | 906 space(); |
| 918 visit(node.expression); | 907 visit(node.expression); |
| 919 } | 908 } |
| 920 | 909 |
| 921 visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { | 910 visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { |
| 922 preservePrecedingNewlines = true; | |
| 923 visit(node.variables); | 911 visit(node.variables); |
| 924 token(node.semicolon); | 912 token(node.semicolon); |
| 925 } | 913 } |
| 926 | 914 |
| 927 visitTryStatement(TryStatement node) { | 915 visitTryStatement(TryStatement node) { |
| 928 preservePrecedingNewlines = true; | |
| 929 token(node.tryKeyword); | 916 token(node.tryKeyword); |
| 930 space(); | 917 space(); |
| 931 visit(node.body); | 918 visit(node.body); |
| 932 visitPrefixedList(' ', node.catchClauses, ' '); | 919 visitNodes(node.catchClauses, precededBy: space, separatedBy: space); |
| 933 visitPrefixed(' finally ', node.finallyClause); | 920 token(node.finallyKeyword, precededBy: space, followedBy: space); |
| 921 visit(node.finallyClause); |
| 934 } | 922 } |
| 935 | 923 |
| 936 visitTypeArgumentList(TypeArgumentList node) { | 924 visitTypeArgumentList(TypeArgumentList node) { |
| 937 token(node.leftBracket); | 925 token(node.leftBracket); |
| 938 visitList(node.arguments, ', '); | 926 visitNodes(node.arguments, separatedBy: commaSeperator); |
| 939 token(node.rightBracket); | 927 token(node.rightBracket); |
| 940 } | 928 } |
| 941 | 929 |
| 942 visitTypeName(TypeName node) { | 930 visitTypeName(TypeName node) { |
| 943 visit(node.name); | 931 visit(node.name); |
| 944 visit(node.typeArguments); | 932 visit(node.typeArguments); |
| 945 } | 933 } |
| 946 | 934 |
| 947 visitTypeParameter(TypeParameter node) { | 935 visitTypeParameter(TypeParameter node) { |
| 948 visit(node.name); | 936 visit(node.name); |
| 949 visitPrefixed(' extends ', node.bound); | 937 token(node.keyword /* extends */, precededBy: space, followedBy: space); |
| 938 visit(node.bound); |
| 950 } | 939 } |
| 951 | 940 |
| 952 visitTypeParameterList(TypeParameterList node) { | 941 visitTypeParameterList(TypeParameterList node) { |
| 953 token(node.leftBracket); | 942 token(node.leftBracket); |
| 954 visitList(node.typeParameters, ', '); | 943 visitNodes(node.typeParameters, separatedBy: commaSeperator); |
| 955 token(node.rightBracket); | 944 token(node.rightBracket); |
| 956 } | 945 } |
| 957 | 946 |
| 958 visitVariableDeclaration(VariableDeclaration node) { | 947 visitVariableDeclaration(VariableDeclaration node) { |
| 959 visit(node.name); | 948 visit(node.name); |
| 960 if (node.initializer != null) { | 949 if (node.initializer != null) { |
| 961 space(); | 950 space(); |
| 962 token(node.equals); | 951 token(node.equals); |
| 963 space(); | 952 space(); |
| 964 visit(node.initializer); | 953 visit(node.initializer); |
| 965 } | 954 } |
| 966 } | 955 } |
| 967 | 956 |
| 968 visitVariableDeclarationList(VariableDeclarationList node) { | 957 visitVariableDeclarationList(VariableDeclarationList node) { |
| 969 token(node.keyword); | 958 modifier(node.keyword); |
| 970 space(); | 959 visitNode(node.type, followedBy: space); |
| 971 visitSuffixed(node.type, ' '); | 960 visitNodes(node.variables, separatedBy: commaSeperator); |
| 972 visitList(node.variables, ', '); | |
| 973 } | 961 } |
| 974 | 962 |
| 975 visitVariableDeclarationStatement(VariableDeclarationStatement node) { | 963 visitVariableDeclarationStatement(VariableDeclarationStatement node) { |
| 976 visit(node.variables); | 964 visit(node.variables); |
| 977 token(node.semicolon); | 965 token(node.semicolon); |
| 978 needsNewline = true; | |
| 979 } | 966 } |
| 980 | 967 |
| 981 visitWhileStatement(WhileStatement node) { | 968 visitWhileStatement(WhileStatement node) { |
| 982 token(node.keyword); | 969 token(node.keyword); |
| 983 space(); | 970 space(); |
| 984 token(node.leftParenthesis); | 971 token(node.leftParenthesis); |
| 985 visit(node.condition); | 972 visit(node.condition); |
| 986 token(node.rightParenthesis); | 973 token(node.rightParenthesis); |
| 987 space(); | 974 space(); |
| 988 visit(node.body); | 975 visit(node.body); |
| 989 } | 976 } |
| 990 | 977 |
| 991 visitWithClause(WithClause node) { | 978 visitWithClause(WithClause node) { |
| 992 token(node.withKeyword); | 979 token(node.withKeyword); |
| 993 space(); | 980 space(); |
| 994 visitList(node.mixinTypes, ', '); | 981 visitNodes(node.mixinTypes, separatedBy: commaSeperator); |
| 995 } | 982 } |
| 996 | 983 |
| 997 /// Safely visit the given [node]. | 984 /// Safely visit the given [node]. |
| 998 visit(ASTNode node) { | 985 visit(ASTNode node) { |
| 999 if (node != null) { | 986 if (node != null) { |
| 1000 node.accept(this); | 987 node.accept(this); |
| 1001 } | 988 } |
| 1002 } | 989 } |
| 1003 | 990 |
| 1004 /// Safely visit the given [node], printing the [suffix] after the node if it | |
| 1005 /// is non-null. | |
| 1006 visitSuffixed(ASTNode node, String suffix) { | |
| 1007 if (node != null) { | |
| 1008 node.accept(this); | |
| 1009 append(suffix); | |
| 1010 } | |
| 1011 } | |
| 1012 | |
| 1013 /// Safely visit the given [node], printing the [prefix] before the node if | |
| 1014 /// it is non-null. | |
| 1015 visitPrefixed(String prefix, ASTNode node) { | |
| 1016 if (node != null) { | |
| 1017 append(prefix); | |
| 1018 node.accept(this); | |
| 1019 } | |
| 1020 } | |
| 1021 | |
| 1022 /// Visit the given function [body], printing the [prefix] before if given | 991 /// Visit the given function [body], printing the [prefix] before if given |
| 1023 /// body is not empty. | 992 /// body is not empty. |
| 1024 visitPrefixedBody(String prefix, FunctionBody body) { | 993 visitPrefixedBody(prefix(), FunctionBody body) { |
| 1025 if (body is! EmptyFunctionBody) { | 994 if (body is! EmptyFunctionBody) { |
| 1026 append(prefix); | 995 prefix(); |
| 1027 } | 996 } |
| 1028 visit(body); | 997 visit(body); |
| 1029 } | 998 } |
| 1030 | 999 |
| 1031 /// Print a list of [nodes], optionally separated by the given [separator]. | 1000 /// Visit a list of [nodes] if not null, optionally separated and/or preceded |
| 1032 visitList(NodeList<ASTNode> nodes, [String separator = '']) { | 1001 /// and followed by the given functions. |
| 1002 visitNodes(NodeList<ASTNode> nodes, {precededBy(): null, |
| 1003 separatedBy() : null, followedBy(): null}) { |
| 1033 if (nodes != null) { | 1004 if (nodes != null) { |
| 1034 var size = nodes.length; | 1005 var size = nodes.length; |
| 1035 for (var i = 0; i < size; i++) { | 1006 if (size > 0) { |
| 1036 if (i > 0) { | 1007 if (precededBy != null) { |
| 1037 append(separator); | 1008 precededBy(); |
| 1038 } | 1009 } |
| 1039 nodes[i].accept(this); | 1010 for (var i = 0; i < size; i++) { |
| 1011 if (i > 0 && separatedBy != null) { |
| 1012 separatedBy(); |
| 1013 } |
| 1014 nodes[i].accept(this); |
| 1015 } |
| 1016 if (followedBy != null) { |
| 1017 followedBy(); |
| 1018 } |
| 1019 } |
| 1020 } |
| 1021 } |
| 1022 |
| 1023 /// Visit a [node], and if not null, optionally preceded or followed by the |
| 1024 /// specified functions. |
| 1025 visitNode(ASTNode node, {precededBy(): null, followedBy(): null}) { |
| 1026 if (node != null) { |
| 1027 if (precededBy != null) { |
| 1028 precededBy(); |
| 1029 } |
| 1030 node.accept(this); |
| 1031 if (followedBy != null) { |
| 1032 followedBy(); |
| 1040 } | 1033 } |
| 1041 } | 1034 } |
| 1042 } | 1035 } |
| 1043 | 1036 |
| 1044 /// Print a list of [nodes], separated by the given [separator]. | |
| 1045 visitSuffixedList(NodeList<ASTNode> nodes, String separator, String suffix) { | |
| 1046 if (nodes != null) { | |
| 1047 var size = nodes.length; | |
| 1048 if (size > 0) { | |
| 1049 for (var i = 0; i < size; i++) { | |
| 1050 if (i > 0) { | |
| 1051 append(separator); | |
| 1052 } | |
| 1053 nodes[i].accept(this); | |
| 1054 } | |
| 1055 append(suffix); | |
| 1056 } | |
| 1057 } | |
| 1058 } | |
| 1059 | |
| 1060 /// Print a list of [nodes], separated by the given [separator]. | |
| 1061 visitPrefixedList(String prefix, NodeList<ASTNode> nodes, | |
| 1062 [String separator = null]) { | |
| 1063 if (nodes != null) { | |
| 1064 var size = nodes.length; | |
| 1065 if (size > 0) { | |
| 1066 append(prefix); | |
| 1067 for (var i = 0; i < size; i++) { | |
| 1068 if (i > 0 && separator != null) { | |
| 1069 append(separator); | |
| 1070 } | |
| 1071 nodes[i].accept(this); | |
| 1072 } | |
| 1073 } | |
| 1074 } | |
| 1075 } | |
| 1076 | 1037 |
| 1077 /// Emit the given [modifier] if it's non null, followed by non-breaking | 1038 /// Emit the given [modifier] if it's non null, followed by non-breaking |
| 1078 /// whitespace. | 1039 /// whitespace. |
| 1079 modifier(Token modifier) { | 1040 modifier(Token modifier) { |
| 1080 token(modifier, followedBy: space); | 1041 token(modifier, followedBy: space); |
| 1081 } | 1042 } |
| 1082 | 1043 |
| 1083 token(Token token, {followedBy(), int minNewlines: 0}) { | 1044 |
| 1045 /// Indicate that at least one newline should be emitted and possibly more |
| 1046 /// if the source has them. |
| 1047 newlines() { |
| 1048 preservePrecedingNewlines = true; |
| 1049 needsNewline = true; |
| 1050 } |
| 1051 |
| 1052 token(Token token, {precededBy(), followedBy(), int minNewlines: 0}) { |
| 1084 if (token != null) { | 1053 if (token != null) { |
| 1085 if (needsNewline) { | 1054 if (needsNewline) { |
| 1086 minNewlines = max(1, minNewlines); | 1055 minNewlines = max(1, minNewlines); |
| 1087 } | 1056 } |
| 1088 if (preservePrecedingNewlines || minNewlines > 0) { | 1057 if (preservePrecedingNewlines || minNewlines > 0) { |
| 1089 var emitted = emitPrecedingNewlines(token, min: minNewlines); | 1058 var emitted = emitPrecedingNewlines(token, min: minNewlines); |
| 1090 preservePrecedingNewlines = false; | 1059 preservePrecedingNewlines = false; |
| 1091 if (emitted > 0) { | 1060 if (emitted > 0) { |
| 1092 needsNewline = false; | 1061 needsNewline = false; |
| 1093 } | 1062 } |
| 1094 } | 1063 } |
| 1064 if (precededBy !=null) { |
| 1065 precededBy(); |
| 1066 } |
| 1095 append(token.lexeme); | 1067 append(token.lexeme); |
| 1096 if (followedBy != null) { | 1068 if (followedBy != null) { |
| 1097 followedBy(); | 1069 followedBy(); |
| 1098 } | 1070 } |
| 1099 previousToken = token; | 1071 previousToken = token; |
| 1100 } | 1072 } |
| 1101 } | 1073 } |
| 1102 | 1074 |
| 1075 commaSeperator() { |
| 1076 comma(); |
| 1077 space(); |
| 1078 } |
| 1079 |
| 1080 comma() { |
| 1081 append(','); |
| 1082 } |
| 1083 |
| 1103 /// Emit a non-breakable space. | 1084 /// Emit a non-breakable space. |
| 1104 space() { | 1085 space() { |
| 1105 //TODO(pquitslund): replace with a proper space token | 1086 //TODO(pquitslund): replace with a proper space token |
| 1106 append(' '); | 1087 append(' '); |
| 1107 } | 1088 } |
| 1108 | 1089 |
| 1109 /// Emit a breakable space | 1090 /// Emit a breakable space |
| 1110 breakableSpace() { | 1091 breakableSpace() { |
| 1111 //Implement | 1092 //Implement |
| 1112 } | 1093 } |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1164 var lastLine = | 1145 var lastLine = |
| 1165 lineInfo.getLocation(last.offset).lineNumber; | 1146 lineInfo.getLocation(last.offset).lineNumber; |
| 1166 var currentLine = | 1147 var currentLine = |
| 1167 lineInfo.getLocation(current.offset).lineNumber; | 1148 lineInfo.getLocation(current.offset).lineNumber; |
| 1168 return currentLine - lastLine; | 1149 return currentLine - lastLine; |
| 1169 } | 1150 } |
| 1170 | 1151 |
| 1171 String toString() => writer.toString(); | 1152 String toString() => writer.toString(); |
| 1172 | 1153 |
| 1173 } | 1154 } |
| OLD | NEW |