@@ -412,6 +412,21 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
412
412
return . visitChildren
413
413
}
414
414
415
+ override func visit( _ node: AccessorEffectSpecifiersSyntax ) -> SyntaxVisitorContinueKind {
416
+ arrangeEffectSpecifiers ( node)
417
+ return . visitChildren
418
+ }
419
+
420
+ override func visit( _ node: FunctionEffectSpecifiersSyntax ) -> SyntaxVisitorContinueKind {
421
+ arrangeEffectSpecifiers ( node)
422
+ return . visitChildren
423
+ }
424
+
425
+ override func visit( _ node: TypeEffectSpecifiersSyntax ) -> SyntaxVisitorContinueKind {
426
+ arrangeEffectSpecifiers ( node)
427
+ return . visitChildren
428
+ }
429
+
415
430
/// Applies formatting tokens to the tokens in the given function or function-like declaration
416
431
/// node (e.g., initializers, deinitiailizers, and subscripts).
417
432
private func arrangeFunctionLikeDecl< Node: BracedSyntax , BodyContents: SyntaxCollection > (
@@ -434,6 +449,17 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
434
449
after ( node. lastToken ( viewMode: . sourceAccurate) , tokens: . close)
435
450
}
436
451
452
+ /// Arranges the `async` and `throws` effect specifiers of a function or accessor declaration.
453
+ private func arrangeEffectSpecifiers< Node: EffectSpecifiersSyntax > ( _ node: Node ) {
454
+ before ( node. asyncSpecifier, tokens: . break)
455
+ before ( node. throwsSpecifier, tokens: . break)
456
+ // Keep them together if both `async` and `throws` are present.
457
+ if let asyncSpecifier = node. asyncSpecifier, let throwsSpecifier = node. throwsSpecifier {
458
+ before ( asyncSpecifier, tokens: . open)
459
+ after ( throwsSpecifier, tokens: . close)
460
+ }
461
+ }
462
+
437
463
// MARK: - Property and subscript accessor block nodes
438
464
439
465
override func visit( _ node: AccessorListSyntax ) -> SyntaxVisitorContinueKind {
@@ -449,22 +475,6 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
449
475
450
476
override func visit( _ node: AccessorDeclSyntax ) -> SyntaxVisitorContinueKind {
451
477
arrangeAttributeList ( node. attributes)
452
-
453
- if let asyncKeyword = node. effectSpecifiers? . asyncSpecifier {
454
- if node. effectSpecifiers? . throwsSpecifier != nil {
455
- before ( asyncKeyword, tokens: . break, . open)
456
- } else {
457
- before ( asyncKeyword, tokens: . break)
458
- }
459
- }
460
-
461
- if let throwsKeyword = node. effectSpecifiers? . throwsSpecifier {
462
- before ( node. effectSpecifiers? . throwsSpecifier, tokens: . break)
463
- if node. effectSpecifiers? . asyncSpecifier != nil {
464
- after ( throwsKeyword, tokens: . close)
465
- }
466
- }
467
-
468
478
arrangeBracesAndContents ( of: node. body, contentsKeyPath: \. statements)
469
479
return . visitChildren
470
480
}
@@ -1160,13 +1170,6 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
1160
1170
}
1161
1171
}
1162
1172
1163
- before ( node. effectSpecifiers? . asyncSpecifier, tokens: . break)
1164
- before ( node. effectSpecifiers? . throwsSpecifier, tokens: . break)
1165
- if let asyncKeyword = node. effectSpecifiers? . asyncSpecifier, let throwsTok = node. effectSpecifiers? . throwsSpecifier {
1166
- before ( asyncKeyword, tokens: . open)
1167
- after ( throwsTok, tokens: . close)
1168
- }
1169
-
1170
1173
before ( node. output? . arrow, tokens: . break)
1171
1174
after ( node. lastToken ( viewMode: . sourceAccurate) , tokens: . close)
1172
1175
before ( node. inTok, tokens: . break( . same) )
@@ -1606,8 +1609,6 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
1606
1609
override func visit( _ node: FunctionTypeSyntax ) -> SyntaxVisitorContinueKind {
1607
1610
after ( node. leftParen, tokens: . break( . open, size: 0 ) , . open)
1608
1611
before ( node. rightParen, tokens: . break( . close, size: 0 ) , . close)
1609
- before ( node. effectSpecifiers? . asyncSpecifier, tokens: . break)
1610
- before ( node. effectSpecifiers? . throwsSpecifier, tokens: . break)
1611
1612
return . visitChildren
1612
1613
}
1613
1614
@@ -1832,14 +1833,6 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
1832
1833
}
1833
1834
1834
1835
override func visit( _ node: FunctionSignatureSyntax ) -> SyntaxVisitorContinueKind {
1835
- before ( node. effectSpecifiers? . asyncSpecifier, tokens: . break)
1836
- before ( node. effectSpecifiers? . throwsSpecifier, tokens: . break)
1837
- if let asyncOrReasyncKeyword = node. effectSpecifiers? . asyncSpecifier,
1838
- let throwsOrRethrowsKeyword = node. effectSpecifiers? . throwsSpecifier
1839
- {
1840
- before ( asyncOrReasyncKeyword, tokens: . open)
1841
- after ( throwsOrRethrowsKeyword, tokens: . close)
1842
- }
1843
1836
before ( node. output? . firstToken ( viewMode: . sourceAccurate) , tokens: . break)
1844
1837
return . visitChildren
1845
1838
}
@@ -1872,6 +1865,14 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
1872
1865
}
1873
1866
1874
1867
let binOp = node. operatorOperand
1868
+ if binOp. is ( ArrowExprSyntax . self) {
1869
+ // `ArrowExprSyntax` nodes occur when a function type is written in an expression context;
1870
+ // for example, `let x = [(Int) throws -> Void]()`. We want to treat those consistently like
1871
+ // we do other function return clauses and not treat them as regular binary operators, so
1872
+ // handle that behavior there instead.
1873
+ return . visitChildren
1874
+ }
1875
+
1875
1876
let rhs = node. rightOperand
1876
1877
maybeGroupAroundSubexpression ( rhs, combiningOperator: binOp)
1877
1878
@@ -1985,9 +1986,8 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
1985
1986
}
1986
1987
1987
1988
override func visit( _ node: ArrowExprSyntax ) -> SyntaxVisitorContinueKind {
1988
- // The break before the `throws` keyword is inserted at the `InfixOperatorExpr` level so that it
1989
- // is placed in the correct relative position to the group surrounding the "operator".
1990
- after ( node. effectSpecifiers? . throwsSpecifier, tokens: . break)
1989
+ before ( node. arrowToken, tokens: . break)
1990
+ after ( node. arrowToken, tokens: . space)
1991
1991
return . visitChildren
1992
1992
}
1993
1993
0 commit comments