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

Side by Side Diff: pkg/analyzer_experimental/lib/src/services/formatter_impl.dart

Issue 23301021: Formatter checkpoint (String literal elimination). (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | pkg/analyzer_experimental/test/services/formatter_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer_experimental/test/services/formatter_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698