@@ -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 ) )
@@ -3304,7 +3293,11 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
3304
3293
private func mustBreakBeforeClosingDelimiter< T: ExprSyntaxProtocol > (
3305
3294
of expr: T , argumentListPath: KeyPath < T , TupleExprElementListSyntax >
3306
3295
) -> Bool {
3307
- guard let parent = expr. parent, parent. is ( MemberAccessExprSyntax . self) else { return false }
3296
+ guard
3297
+ let parent = expr. parent,
3298
+ parent. is ( MemberAccessExprSyntax . self) || parent. is ( PostfixIfConfigExprSyntax . self)
3299
+ else { return false }
3300
+
3308
3301
let argumentList = expr [ keyPath: argumentListPath]
3309
3302
3310
3303
// When there's a single compact argument, there is no extra indentation for the argument and
@@ -3739,6 +3732,23 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
3739
3732
after ( expr. lastToken ( viewMode: . sourceAccurate) , tokens: . contextualBreakingEnd)
3740
3733
}
3741
3734
return ( hasCompoundExpression, true )
3735
+ } else if let postfixIfExpr = expr. as ( PostfixIfConfigExprSyntax . self) ,
3736
+ let base = postfixIfExpr. base
3737
+ {
3738
+ // For postfix-if expressions with bases (i.e., they aren't the first `#if` nested inside
3739
+ // another `#if`), add contextual breaks before the top-level clauses (and the terminating
3740
+ // `#endif`) so that they nest or line-up properly based on the preceding node. We don't do
3741
+ // this for initial nested `#if`s because they will already get open/close breaks to control
3742
+ // their indentation from their parent clause.
3743
+ before ( postfixIfExpr. firstToken ( viewMode: . sourceAccurate) , tokens: . contextualBreakingStart)
3744
+ after ( postfixIfExpr. lastToken ( viewMode: . sourceAccurate) , tokens: . contextualBreakingEnd)
3745
+
3746
+ for clause in postfixIfExpr. config. clauses {
3747
+ before ( clause. poundKeyword, tokens: . break( . contextual, size: 0 ) )
3748
+ }
3749
+ before ( postfixIfExpr. config. poundEndif, tokens: . break( . contextual, size: 0 ) )
3750
+
3751
+ return insertContextualBreaks ( base, isTopLevel: false )
3742
3752
} else if let callingExpr = expr. asProtocol ( CallingExprSyntaxProtocol . self) {
3743
3753
let calledExpression = callingExpr. calledExpression
3744
3754
let ( hasCompoundExpression, hasMemberAccess) =
@@ -3805,20 +3815,6 @@ private func isNestedInPostfixIfConfig(node: Syntax) -> Bool {
3805
3815
return false
3806
3816
}
3807
3817
3808
- private func isNestedInIfConfig( node: Syntax ) -> Bool {
3809
- var this : Syntax ? = node
3810
-
3811
- while this? . parent != nil {
3812
- if this? . is ( IfConfigClauseSyntax . self) == true {
3813
- return true
3814
- }
3815
-
3816
- this = this? . parent
3817
- }
3818
-
3819
- return false
3820
- }
3821
-
3822
3818
extension Syntax {
3823
3819
/// Creates a pretty-printable token stream for the provided Syntax node.
3824
3820
func makeTokenStream( configuration: Configuration , operatorTable: OperatorTable ) -> [ Token ] {
0 commit comments