@@ -271,7 +271,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
271
271
// `arrange*` functions here.
272
272
before ( node. firstToken ( viewMode: . sourceAccurate) , tokens: . open)
273
273
274
- arrangeAttributeList ( node. attributes)
274
+ arrangeAttributeList ( node. attributes, separateByLineBreaks : config . lineBreakBeforeEachArgument )
275
275
276
276
let hasArguments = !node. signature. parameterClause. parameters. isEmpty
277
277
@@ -326,7 +326,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
326
326
) {
327
327
before ( node. firstToken ( viewMode: . sourceAccurate) , tokens: . open)
328
328
329
- arrangeAttributeList ( attributes)
329
+ arrangeAttributeList ( attributes, separateByLineBreaks : config . lineBreakBetweenDeclarationAttributes )
330
330
331
331
// Prioritize keeping "<modifiers> <keyword> <name>:" together (corresponding group close is
332
332
// below at `lastTokenBeforeBrace`).
@@ -458,7 +458,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
458
458
after ( node. returnClause. lastToken ( viewMode: . sourceAccurate) , tokens: . close)
459
459
}
460
460
461
- arrangeAttributeList ( node. attributes)
461
+ arrangeAttributeList ( node. attributes, separateByLineBreaks : config . lineBreakBetweenDeclarationAttributes )
462
462
463
463
if let genericWhereClause = node. genericWhereClause {
464
464
before ( genericWhereClause. firstToken ( viewMode: . sourceAccurate) , tokens: . break( . same) , . open)
@@ -513,7 +513,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
513
513
) where BodyContents. Element: SyntaxProtocol {
514
514
before ( node. firstToken ( viewMode: . sourceAccurate) , tokens: . open)
515
515
516
- arrangeAttributeList ( attributes)
516
+ arrangeAttributeList ( attributes, separateByLineBreaks : config . lineBreakBetweenDeclarationAttributes )
517
517
arrangeBracesAndContents ( of: body, contentsKeyPath: bodyContentsKeyPath)
518
518
519
519
if let genericWhereClause = genericWhereClause {
@@ -549,7 +549,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
549
549
}
550
550
551
551
override func visit( _ node: AccessorDeclSyntax ) -> SyntaxVisitorContinueKind {
552
- arrangeAttributeList ( node. attributes)
552
+ arrangeAttributeList ( node. attributes, separateByLineBreaks : config . lineBreakBetweenDeclarationAttributes )
553
553
arrangeBracesAndContents ( of: node. body, contentsKeyPath: \. statements)
554
554
return . visitChildren
555
555
}
@@ -1327,7 +1327,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
1327
1327
}
1328
1328
1329
1329
override func visit( _ node: MacroExpansionDeclSyntax ) -> SyntaxVisitorContinueKind {
1330
- arrangeAttributeList ( node. attributes)
1330
+ arrangeAttributeList ( node. attributes, separateByLineBreaks : config . lineBreakBetweenDeclarationAttributes )
1331
1331
1332
1332
before (
1333
1333
node. trailingClosure? . leftBrace,
@@ -1546,7 +1546,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
1546
1546
override func visit( _ node: EnumCaseDeclSyntax ) -> SyntaxVisitorContinueKind {
1547
1547
before ( node. firstToken ( viewMode: . sourceAccurate) , tokens: . open)
1548
1548
1549
- arrangeAttributeList ( node. attributes)
1549
+ arrangeAttributeList ( node. attributes, separateByLineBreaks : config . lineBreakBetweenDeclarationAttributes )
1550
1550
1551
1551
after ( node. caseKeyword, tokens: . break)
1552
1552
after ( node. lastToken ( viewMode: . sourceAccurate) , tokens: . close)
@@ -2179,7 +2179,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
2179
2179
}
2180
2180
2181
2181
override func visit( _ node: VariableDeclSyntax ) -> SyntaxVisitorContinueKind {
2182
- arrangeAttributeList ( node. attributes)
2182
+ arrangeAttributeList ( node. attributes, separateByLineBreaks : config . lineBreakBetweenDeclarationAttributes )
2183
2183
2184
2184
if node. bindings. count == 1 {
2185
2185
// If there is only a single binding, don't allow a break between the `let/var` keyword and
@@ -2285,7 +2285,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
2285
2285
}
2286
2286
2287
2287
override func visit( _ node: TypeAliasDeclSyntax ) -> SyntaxVisitorContinueKind {
2288
- arrangeAttributeList ( node. attributes)
2288
+ arrangeAttributeList ( node. attributes, separateByLineBreaks : config . lineBreakBetweenDeclarationAttributes )
2289
2289
2290
2290
after ( node. typealiasKeyword, tokens: . break)
2291
2291
@@ -2499,7 +2499,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
2499
2499
}
2500
2500
2501
2501
override func visit( _ node: AssociatedTypeDeclSyntax ) -> SyntaxVisitorContinueKind {
2502
- arrangeAttributeList ( node. attributes)
2502
+ arrangeAttributeList ( node. attributes, separateByLineBreaks : config . lineBreakBetweenDeclarationAttributes )
2503
2503
2504
2504
after ( node. associatedtypeKeyword, tokens: . break)
2505
2505
@@ -2890,14 +2890,30 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
2890
2890
/// Applies formatting tokens around and between the attributes in an attribute list.
2891
2891
private func arrangeAttributeList(
2892
2892
_ attributes: AttributeListSyntax ? ,
2893
- suppressFinalBreak: Bool = false
2893
+ suppressFinalBreak: Bool = false ,
2894
+ separateByLineBreaks: Bool = false
2894
2895
) {
2895
2896
if let attributes = attributes {
2897
+ let behavior : NewlineBehavior = separateByLineBreaks ? . hard : . elective
2896
2898
before ( attributes. firstToken ( viewMode: . sourceAccurate) , tokens: . open)
2897
- insertTokens ( . break( . same) , betweenElementsOf: attributes)
2899
+ for element in attributes. dropLast ( ) {
2900
+ if let ifConfig = element. as ( IfConfigDeclSyntax . self) {
2901
+ for clause in ifConfig. clauses {
2902
+ if let nestedAttributes = AttributeListSyntax ( clause. elements) {
2903
+ arrangeAttributeList (
2904
+ nestedAttributes,
2905
+ suppressFinalBreak: true ,
2906
+ separateByLineBreaks: separateByLineBreaks
2907
+ )
2908
+ }
2909
+ }
2910
+ } else {
2911
+ after ( element. lastToken ( viewMode: . sourceAccurate) , tokens: . break( . same, newlines: behavior) )
2912
+ }
2913
+ }
2898
2914
var afterAttributeTokens = [ Token . close]
2899
2915
if !suppressFinalBreak {
2900
- afterAttributeTokens. append ( . break( . same) )
2916
+ afterAttributeTokens. append ( . break( . same, newlines : behavior ) )
2901
2917
}
2902
2918
after ( attributes. lastToken ( viewMode: . sourceAccurate) , tokens: afterAttributeTokens)
2903
2919
}
0 commit comments