@@ -580,7 +580,20 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
580580 let catchPrecedingBreak = config. lineBreakBeforeControlFlowKeywords
581581 ? Token . break ( . same, newlines: . soft) : Token . space
582582 before ( node. catchKeyword, tokens: catchPrecedingBreak)
583- before ( node. pattern? . firstToken, tokens: . space)
583+
584+ if let catchItems = node. catchItems {
585+ // If there are multiple items in the `catch` clause, wrap each in open/close breaks so that
586+ // their internal breaks stack correctly. Otherwise, if there is only a single clause, use the
587+ // old (pre-SE-0276) behavior (a fixed space after the `catch` keyword).
588+ if catchItems. count > 1 {
589+ for catchItem in catchItems {
590+ before ( catchItem. firstToken, tokens: . break( . open( kind: . continuation) ) )
591+ after ( catchItem. lastToken, tokens: . break( . close( mustBreak: false ) , size: 0 ) )
592+ }
593+ } else {
594+ before ( node. catchItems? . firstToken, tokens: . space)
595+ }
596+ }
584597
585598 arrangeBracesAndContents ( of: node. body, contentsKeyPath: \. statements)
586599
@@ -1499,7 +1512,9 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
14991512 // }
15001513 //
15011514 let wherePrecedingBreak : Token
1502- if !config. lineBreakBeforeControlFlowKeywords, let parent = node. parent, parent. is ( CatchClauseSyntax . self) {
1515+ if !config. lineBreakBeforeControlFlowKeywords,
1516+ let parent = node. parent, parent. is ( CatchItemSyntax . self)
1517+ {
15031518 wherePrecedingBreak = . break( . continue)
15041519 } else {
15051520 wherePrecedingBreak = . break( . same)
@@ -2100,21 +2115,6 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
21002115 needsBreakBeforeWhereClause = true
21012116 }
21022117
2103- // TODO: These properties will likely go away in a future version since the parser no longer
2104- // reads the `vjp:` and `jvp:` arguments to `@differentiable`.
2105- if let vjp = node. maybeVJP {
2106- before ( vjp. firstToken, tokens: . open)
2107- after ( vjp. lastToken, tokens: . close)
2108- after ( vjp. trailingComma, tokens: . break( . same) )
2109- needsBreakBeforeWhereClause = true
2110- }
2111- if let jvp = node. maybeJVP {
2112- before ( jvp. firstToken, tokens: . open)
2113- after ( jvp. lastToken, tokens: . close)
2114- after ( jvp. trailingComma, tokens: . break( . same) )
2115- needsBreakBeforeWhereClause = true
2116- }
2117-
21182118 if let whereClause = node. whereClause {
21192119 if needsBreakBeforeWhereClause {
21202120 before ( whereClause. firstToken, tokens: . break( . same) )
@@ -2125,24 +2125,13 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
21252125 return . visitChildren
21262126 }
21272127
2128- override func visit( _ node: DifferentiableAttributeFuncSpecifierSyntax )
2129- -> SyntaxVisitorContinueKind
2130- {
2131- // This node encapsulates the `vjp:` or `jvp:` label and decl name in a `@differentiable`
2132- // attribute.
2133- // TODO: This node will likely go away in a future version since the parser no longer reads the
2134- // `vjp:` and `jvp:` arguments to `@differentiable`.
2135- after ( node. colon, tokens: . break( . continue, newlines: . elective( ignoresDiscretionary: true ) ) )
2136- return . visitChildren
2137- }
2138-
2139- override func visit( _ node: DifferentiationParamsSyntax ) -> SyntaxVisitorContinueKind {
2128+ override func visit( _ node: DifferentiabilityParamsSyntax ) -> SyntaxVisitorContinueKind {
21402129 after ( node. leftParen, tokens: . break( . open, size: 0 ) , . open)
21412130 before ( node. rightParen, tokens: . break( . close, size: 0 ) , . close)
21422131 return . visitChildren
21432132 }
21442133
2145- override func visit( _ node: DifferentiationParamSyntax ) -> SyntaxVisitorContinueKind {
2134+ override func visit( _ node: DifferentiabilityParamSyntax ) -> SyntaxVisitorContinueKind {
21462135 after ( node. trailingComma, tokens: . break( . same) )
21472136 return . visitChildren
21482137 }
@@ -2168,7 +2157,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
21682157 }
21692158 #endif
21702159
2171- override func visit( _ node: DifferentiationParamsClauseSyntax ) -> SyntaxVisitorContinueKind {
2160+ override func visit( _ node: DifferentiabilityParamsClauseSyntax ) -> SyntaxVisitorContinueKind {
21722161 // This node encapsulates the `wrt:` label and value/variable in a `@differentiable`,
21732162 // `@derivative`, or `@transpose` attribute.
21742163 after ( node. colon, tokens: . break( . continue, newlines: . elective( ignoresDiscretionary: true ) ) )
0 commit comments