@@ -988,14 +988,22 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
988
988
989
989
override func visit( _ node: MemberAccessExprSyntax ) -> SyntaxVisitorContinueKind {
990
990
preVisitInsertingContextualBreaks ( node)
991
-
992
991
return . visitChildren
993
992
}
994
993
995
994
override func visitPost( _ node: MemberAccessExprSyntax ) {
996
995
clearContextualBreakState ( node)
997
996
}
998
997
998
+ override func visit( _ node: PostfixIfConfigExprSyntax ) -> SyntaxVisitorContinueKind {
999
+ preVisitInsertingContextualBreaks ( node)
1000
+ return . visitChildren
1001
+ }
1002
+
1003
+ override func visitPost( _ node: PostfixIfConfigExprSyntax ) {
1004
+ clearContextualBreakState ( node)
1005
+ }
1006
+
999
1007
override func visit( _ node: FunctionCallExprSyntax ) -> SyntaxVisitorContinueKind {
1000
1008
preVisitInsertingContextualBreaks ( node)
1001
1009
@@ -1456,29 +1464,10 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
1456
1464
before ( tokenToOpenWith. nextToken ( viewMode: . all) , tokens: . break( breakKindClose, newlines: . soft) , . close)
1457
1465
}
1458
1466
1459
- if isNestedInPostfixIfConfig ( node: Syntax ( node) ) {
1460
- let breakToken : Token
1461
- let currentIfConfigDecl = node. parent? . parent? . as ( IfConfigDeclSyntax . self)
1462
-
1463
- if let currentIfConfigDecl = currentIfConfigDecl,
1464
- let tokenBeforeCurrentIfConfigDecl = currentIfConfigDecl. previousToken ( viewMode: . sourceAccurate) ,
1465
- isNestedInIfConfig ( node: Syntax ( tokenBeforeCurrentIfConfigDecl) ) ||
1466
- tokenBeforeCurrentIfConfigDecl. text == " } " {
1467
- breakToken = . break( . reset)
1468
- } else {
1469
- breakToken = . break
1470
- before ( currentIfConfigDecl? . poundEndif, tokens: [ . break] )
1471
- }
1472
-
1467
+ if !isNestedInPostfixIfConfig( node: Syntax ( node) ) , let condition = node. condition {
1473
1468
before (
1474
- node. firstToken ( viewMode: . sourceAccurate) ,
1475
- tokens: [
1476
- . printerControl( kind: . enableBreaking) ,
1477
- breakToken,
1478
- ]
1479
- )
1480
- } else if let condition = node. condition {
1481
- before ( condition. firstToken ( viewMode: . sourceAccurate) , tokens: . printerControl( kind: . disableBreaking( allowDiscretionary: true ) ) )
1469
+ condition. firstToken ( viewMode: . sourceAccurate) ,
1470
+ tokens: . printerControl( kind: . disableBreaking( allowDiscretionary: true ) ) )
1482
1471
after (
1483
1472
condition. lastToken ( viewMode: . sourceAccurate) ,
1484
1473
tokens: . printerControl( kind: . enableBreaking) , . break( . reset, size: 0 ) )
@@ -3287,7 +3276,11 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
3287
3276
private func mustBreakBeforeClosingDelimiter< T: ExprSyntaxProtocol > (
3288
3277
of expr: T , argumentListPath: KeyPath < T , TupleExprElementListSyntax >
3289
3278
) -> Bool {
3290
- guard let parent = expr. parent, parent. is ( MemberAccessExprSyntax . self) else { return false }
3279
+ guard
3280
+ let parent = expr. parent,
3281
+ parent. is ( MemberAccessExprSyntax . self) || parent. is ( PostfixIfConfigExprSyntax . self)
3282
+ else { return false }
3283
+
3291
3284
let argumentList = expr [ keyPath: argumentListPath]
3292
3285
3293
3286
// When there's a single compact argument, there is no extra indentation for the argument and
@@ -3722,6 +3715,23 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
3722
3715
after ( expr. lastToken ( viewMode: . sourceAccurate) , tokens: . contextualBreakingEnd)
3723
3716
}
3724
3717
return ( hasCompoundExpression, true )
3718
+ } else if let postfixIfExpr = expr. as ( PostfixIfConfigExprSyntax . self) ,
3719
+ let base = postfixIfExpr. base
3720
+ {
3721
+ // For postfix-if expressions with bases (i.e., they aren't the first `#if` nested inside
3722
+ // another `#if`), add contextual breaks before the top-level clauses (and the terminating
3723
+ // `#endif`) so that they nest or line-up properly based on the preceding node. We don't do
3724
+ // this for initial nested `#if`s because they will already get open/close breaks to control
3725
+ // their indentation from their parent clause.
3726
+ before ( postfixIfExpr. firstToken ( viewMode: . sourceAccurate) , tokens: . contextualBreakingStart)
3727
+ after ( postfixIfExpr. lastToken ( viewMode: . sourceAccurate) , tokens: . contextualBreakingEnd)
3728
+
3729
+ for clause in postfixIfExpr. config. clauses {
3730
+ before ( clause. poundKeyword, tokens: . break( . contextual, size: 0 ) )
3731
+ }
3732
+ before ( postfixIfExpr. config. poundEndif, tokens: . break( . contextual, size: 0 ) )
3733
+
3734
+ return insertContextualBreaks ( base, isTopLevel: false )
3725
3735
} else if let callingExpr = expr. asProtocol ( CallingExprSyntaxProtocol . self) {
3726
3736
let calledExpression = callingExpr. calledExpression
3727
3737
let ( hasCompoundExpression, hasMemberAccess) =
@@ -3788,20 +3798,6 @@ private func isNestedInPostfixIfConfig(node: Syntax) -> Bool {
3788
3798
return false
3789
3799
}
3790
3800
3791
- private func isNestedInIfConfig( node: Syntax ) -> Bool {
3792
- var this : Syntax ? = node
3793
-
3794
- while this? . parent != nil {
3795
- if this? . is ( IfConfigClauseSyntax . self) == true {
3796
- return true
3797
- }
3798
-
3799
- this = this? . parent
3800
- }
3801
-
3802
- return false
3803
- }
3804
-
3805
3801
extension Syntax {
3806
3802
/// Creates a pretty-printable token stream for the provided Syntax node.
3807
3803
func makeTokenStream( configuration: Configuration , operatorTable: OperatorTable ) -> [ Token ] {
0 commit comments