@@ -367,157 +367,125 @@ private final class TokenStreamCreator: SyntaxVisitor {
367
367
// MARK: - Control flow statement nodes
368
368
369
369
override func visit( _ node: IfStmtSyntax ) {
370
- before ( node. ifKeyword, tokens: . open( . inconsistent, 3 ) )
371
370
after ( node. ifKeyword, tokens: . space)
372
- before ( node. body. leftBrace, tokens: . break( offset: - 3 ) , . close)
373
371
374
- if !areBracesCompletelyEmpty( node. body, contentsKeyPath: \. statements) {
375
- after ( node. body. leftBrace, tokens: . break( offset: 2 ) , . open( . consistent, 0 ) )
376
- before ( node. body. rightBrace, tokens: . break( offset: - 2 ) , . close)
377
- } else {
378
- before ( node. body. rightBrace, tokens: . break( size: 0 ) )
379
- }
372
+ before ( node. conditions. firstToken, tokens: . open( . consistent, 0 ) , . open( . inconsistent, 2 ) )
373
+ after ( node. conditions. lastToken, tokens: . close)
374
+ before ( node. body. leftBrace, tokens: . break( size: 0 ) , . close, . break)
380
375
381
- before ( node. elseKeyword, tokens: . break)
382
- after ( node. elseKeyword, tokens: . break)
376
+ arrangeBracesAndContents ( of: node. body, contentsKeyPath: \. statements)
377
+
378
+ before ( node. elseKeyword, tokens: . break( size: maxlinelength) )
379
+ after ( node. elseKeyword, tokens: . space)
383
380
384
381
if let elseBody = node. elseBody as? CodeBlockSyntax {
385
- if !areBracesCompletelyEmpty( elseBody, contentsKeyPath: \. statements) {
386
- after ( elseBody. leftBrace, tokens: . break( offset: 2 ) , . open( . consistent, 0 ) )
387
- before ( elseBody. rightBrace, tokens: . break( offset: - 2 ) , . close)
388
- } else {
389
- before ( elseBody. rightBrace, tokens: . break( size: 0 ) )
390
- }
382
+ arrangeBracesAndContents ( of: elseBody, contentsKeyPath: \. statements)
391
383
}
392
384
393
385
super. visit ( node)
394
386
}
395
387
396
388
override func visit( _ node: GuardStmtSyntax ) {
397
- before ( node. guardKeyword, tokens: . open( . inconsistent, 6 ) )
398
- after ( node. guardKeyword, tokens: . break)
399
- before ( node. elseKeyword, tokens: . close, . break)
400
- after ( node. elseKeyword, tokens: . break)
401
-
402
- if !areBracesCompletelyEmpty( node. body, contentsKeyPath: \. statements) {
403
- after ( node. body. leftBrace, tokens: . break( offset: 2 ) , . open( . consistent, 0 ) )
404
- before ( node. body. rightBrace, tokens: . break( offset: - 2 ) , . close)
405
- } else {
406
- before ( node. body. rightBrace, tokens: . break( size: 0 ) )
407
- }
389
+ after ( node. guardKeyword, tokens: . space)
390
+ after ( node. elseKeyword, tokens: . space)
391
+
392
+ before ( node. conditions. firstToken, tokens: . open( . consistent, 0 ) , . open( . inconsistent, 2 ) )
393
+ after ( node. conditions. lastToken, tokens: . close)
394
+ before ( node. elseKeyword, tokens: . break( size: 0 ) , . close, . break)
395
+
396
+ arrangeBracesAndContents ( of: node. body, contentsKeyPath: \. statements)
408
397
409
398
super. visit ( node)
410
399
}
411
400
412
401
override func visit( _ node: ForInStmtSyntax ) {
413
- before ( node. firstToken, tokens: . open( . inconsistent, 4 ) )
414
- after ( node. labelColon, tokens: . break)
402
+ after ( node. labelColon, tokens: . space)
415
403
after ( node. forKeyword, tokens: . space)
416
- before ( node. inKeyword, tokens: . break)
404
+
405
+ before ( node. pattern. firstToken, tokens: . open( . consistent, 0 ) , . open( . inconsistent, 0 ) )
406
+
407
+ before ( node. inKeyword, tokens: . break( offset: 2 ) , . open( . inconsistent, 2 ) )
417
408
after ( node. inKeyword, tokens: . space)
409
+ after ( node. sequenceExpr. lastToken, tokens: . close)
418
410
419
- if let whereClause = node. whereClause {
420
- before (
421
- whereClause. firstToken,
422
- tokens: . close, . break, . open( . inconsistent, 0 ) , . break( size: 0 ) , . open( . consistent, 0 )
423
- )
424
- before ( node. body. leftBrace, tokens: . break, . close, . close)
425
- } else {
426
- before ( node. body. leftBrace, tokens: . close, . break)
427
- }
411
+ before ( node. whereClause? . whereKeyword, tokens: . break)
412
+ before ( node. body. leftBrace, tokens: . close, . break( size: 0 ) , . close, . break)
428
413
429
- if !areBracesCompletelyEmpty( node. body, contentsKeyPath: \. statements) {
430
- after ( node. body. leftBrace, tokens: . break( offset: 2 ) , . open( . consistent, 0 ) )
431
- before ( node. body. rightBrace, tokens: . break( offset: - 2 ) , . close)
432
- } else {
433
- before ( node. body. rightBrace, tokens: . break( size: 0 ) )
434
- }
414
+ arrangeBracesAndContents ( of: node. body, contentsKeyPath: \. statements)
435
415
436
416
super. visit ( node)
437
417
}
438
418
439
419
override func visit( _ node: WhileStmtSyntax ) {
440
- before ( node. firstToken, tokens: . open( . inconsistent, 6 ) )
441
420
after ( node. labelColon, tokens: . space)
442
421
after ( node. whileKeyword, tokens: . space)
443
- before ( node. body. leftBrace, tokens: . break( offset: - 6 ) , . close)
444
422
445
- if !areBracesCompletelyEmpty( node. body, contentsKeyPath: \. statements) {
446
- after ( node. body. leftBrace, tokens: . break( offset: 2 ) , . open( . consistent, 0 ) )
447
- before ( node. body. rightBrace, tokens: . break( offset: - 2 ) , . close)
448
- } else {
449
- before ( node. body. rightBrace, tokens: . break( size: 0 ) )
450
- }
423
+ before ( node. conditions. firstToken, tokens: . open( . consistent, 0 ) , . open( . inconsistent, 2 ) )
424
+ after ( node. conditions. lastToken, tokens: . close)
425
+ before ( node. body. leftBrace, tokens: . break( size: 0 ) , . close, . break)
426
+
427
+ arrangeBracesAndContents ( of: node. body, contentsKeyPath: \. statements)
451
428
452
429
super. visit ( node)
453
430
}
454
431
455
432
override func visit( _ node: RepeatWhileStmtSyntax ) {
456
- after ( node. repeatKeyword, tokens: . break)
433
+ before ( node. repeatKeyword, tokens: . reset, . open( . consistent, 0 ) , . open( . inconsistent, 0 ) )
434
+ after ( node. repeatKeyword, tokens: . space)
457
435
458
- if !areBracesCompletelyEmpty( node. body, contentsKeyPath: \. statements) {
459
- after ( node. body. leftBrace, tokens: . break( offset: 2 ) , . open( . consistent, 0 ) )
460
- before ( node. body. rightBrace, tokens: . break( offset: - 2 ) , . close, . open( . inconsistent, 8 ) )
461
- } else {
462
- before ( node. body. rightBrace, tokens: . break( size: 0 ) , . open( . inconsistent, 0 ) )
463
- }
436
+ arrangeBracesAndContents ( of: node. body, contentsKeyPath: \. statements)
464
437
465
- before ( node. whileKeyword, tokens: . space )
438
+ before ( node. whileKeyword, tokens: . close , . break , . open ( . inconsistent , 0 ) )
466
439
after ( node. whileKeyword, tokens: . space)
467
- after ( node. condition. lastToken, tokens: . close)
440
+
441
+ before ( node. condition. firstToken, tokens: . open( . inconsistent, 2 ) )
442
+ after ( node. condition. lastToken, tokens: . close, . close, . close)
443
+
468
444
super. visit ( node)
469
445
}
470
446
471
447
override func visit( _ node: DoStmtSyntax ) {
448
+ before ( node. doKeyword, tokens: . reset, . open( . consistent, 0 ) , . open( . inconsistent, 0 ) )
472
449
after ( node. doKeyword, tokens: . space)
473
450
474
- if !areBracesCompletelyEmpty( node. body, contentsKeyPath: \. statements) {
475
- // Use a maxlinelength break to force the body of a "do" to wrap even if it would fit on one
476
- // line, unlike the other braced constructs.
477
- after (
478
- node. body. leftBrace, tokens: . break( size: maxlinelength, offset: 2 ) , . open( . consistent, 0 ) )
479
- before ( node. body. rightBrace, tokens: . break( size: maxlinelength, offset: - 2 ) , . close)
480
- } else {
481
- before ( node. body. rightBrace, tokens: . break( size: 0 ) )
451
+ arrangeBracesAndContents ( of: node. body, contentsKeyPath: \. statements)
452
+
453
+ if let catchClauses = node. catchClauses {
454
+ // If there is only a single `catch` clause, we precede it with a default break so that it
455
+ // only moves to the next line if necessary. If there are multiple `catch` clauses, we use a
456
+ // max-line-length break so that each case is forced onto its own line.
457
+ if catchClauses. count > 1 {
458
+ for catchClause in catchClauses {
459
+ before ( catchClause. catchKeyword, tokens: . break( size: maxlinelength) )
460
+ }
461
+ } else {
462
+ before ( catchClauses [ 0 ] . catchKeyword, tokens: . close, . break, . open( . inconsistent, 0 ) )
463
+ }
482
464
}
483
465
466
+ after ( node. lastToken, tokens: . close, . close)
467
+
484
468
super. visit ( node)
485
469
}
486
470
487
471
override func visit( _ node: CatchClauseSyntax ) {
488
- before ( node. catchKeyword, tokens: . space)
489
472
before ( node. pattern? . firstToken, tokens: . break)
490
473
491
474
if let whereClause = node. whereClause {
492
- // Use a maxlinelength break to force the body of a "catch" to wrap even if it would fit on
493
- // one line, unlike the other braced constructs.
494
- before ( whereClause. firstToken, tokens: . break( offset: 2 ) , . open( . consistent, 0 ) )
495
- before ( node. body. leftBrace, tokens: . break( offset: - 2 ) , . close)
475
+ before ( whereClause. whereKeyword, tokens: . break, . open( . consistent, 0 ) )
476
+ before ( node. body. leftBrace, tokens: . break, . close)
496
477
} else {
497
478
before ( node. body. leftBrace, tokens: . break)
498
479
}
499
480
500
- if !areBracesCompletelyEmpty( node. body, contentsKeyPath: \. statements) {
501
- after (
502
- node. body. leftBrace, tokens: . break( size: maxlinelength, offset: 2 ) , . open( . consistent, 0 ) )
503
- before ( node. body. rightBrace, tokens: . break( size: maxlinelength, offset: - 2 ) , . close)
504
- } else {
505
- before ( node. body. rightBrace, tokens: . break( size: 0 ) )
506
- }
481
+ arrangeBracesAndContents ( of: node. body, contentsKeyPath: \. statements)
507
482
508
483
super. visit ( node)
509
484
}
510
485
511
486
override func visit( _ node: DeferStmtSyntax ) {
512
- after ( node. deferKeyword, tokens: . break)
513
-
514
- if !areBracesCompletelyEmpty( node. body, contentsKeyPath: \. statements) {
515
- after ( node. body. leftBrace, tokens: . break( offset: 2 ) , . open( . consistent, 0 ) )
516
- before ( node. body. rightBrace, tokens: . break( offset: - 2 ) , . close)
517
- } else {
518
- before ( node. body. rightBrace, tokens: . break( size: 0 ) )
519
- }
520
-
487
+ after ( node. deferKeyword, tokens: . space)
488
+ arrangeBracesAndContents ( of: node. body, contentsKeyPath: \. statements)
521
489
super. visit ( node)
522
490
}
523
491
@@ -1510,6 +1478,25 @@ private final class TokenStreamCreator: SyntaxVisitor {
1510
1478
return node [ keyPath: contentsKeyPath] . isEmpty && !commentPrecedesRightBrace
1511
1479
}
1512
1480
1481
+ /// Applies consistent formatting to the braces and contents of the given node.
1482
+ ///
1483
+ /// - Parameters:
1484
+ /// - node: A node that conforms to `BracedSyntax`.
1485
+ /// - contentsKeyPath: A keypath describing how to get from `node` to the contents of the node
1486
+ /// (a `Collection` whose elements conform to `Syntax`; this will most likely be an instance
1487
+ /// of one of the `*ListSyntax` types).
1488
+ private func arrangeBracesAndContents< Node: BracedSyntax , BodyContents: Collection > (
1489
+ of node: Node ,
1490
+ contentsKeyPath: KeyPath < Node , BodyContents >
1491
+ ) where BodyContents. Element: Syntax {
1492
+ if !areBracesCompletelyEmpty( node, contentsKeyPath: contentsKeyPath) {
1493
+ after ( node. leftBrace, tokens: . break( offset: 2 ) , . open( . consistent, 0 ) )
1494
+ before ( node. rightBrace, tokens: . break( offset: - 2 ) , . close)
1495
+ } else {
1496
+ before ( node. rightBrace, tokens: . break( size: 0 ) )
1497
+ }
1498
+ }
1499
+
1513
1500
private func extractTrailingComment( _ token: TokenSyntax ) {
1514
1501
let nextToken = token. nextToken
1515
1502
guard let trivia = nextToken? . leadingTrivia,
0 commit comments