Skip to content

Commit 3b71f4c

Browse files
authored
Merge pull request #415 from allevato/lotsa-primary-associated-types
Fix formatting of primary associated type clauses in protocols.
2 parents 043fd58 + 21e4e9e commit 3b71f4c

File tree

2 files changed

+113
-8
lines changed

2 files changed

+113
-8
lines changed

Sources/SwiftFormatPrettyPrint/TokenStreamCreator.swift

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
159159
modifiers: node.modifiers,
160160
typeKeyword: node.classKeyword,
161161
identifier: node.identifier,
162-
genericParameterClause: node.genericParameterClause,
162+
genericParameterOrPrimaryAssociatedTypeClause: node.genericParameterClause.map(Syntax.init),
163163
inheritanceClause: node.inheritanceClause,
164164
genericWhereClause: node.genericWhereClause,
165165
members: node.members)
@@ -173,7 +173,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
173173
modifiers: node.modifiers,
174174
typeKeyword: node.actorKeyword,
175175
identifier: node.identifier,
176-
genericParameterClause: node.genericParameterClause,
176+
genericParameterOrPrimaryAssociatedTypeClause: node.genericParameterClause.map(Syntax.init),
177177
inheritanceClause: node.inheritanceClause,
178178
genericWhereClause: node.genericWhereClause,
179179
members: node.members)
@@ -187,7 +187,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
187187
modifiers: node.modifiers,
188188
typeKeyword: node.structKeyword,
189189
identifier: node.identifier,
190-
genericParameterClause: node.genericParameterClause,
190+
genericParameterOrPrimaryAssociatedTypeClause: node.genericParameterClause.map(Syntax.init),
191191
inheritanceClause: node.inheritanceClause,
192192
genericWhereClause: node.genericWhereClause,
193193
members: node.members)
@@ -201,7 +201,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
201201
modifiers: node.modifiers,
202202
typeKeyword: node.enumKeyword,
203203
identifier: node.identifier,
204-
genericParameterClause: node.genericParameters,
204+
genericParameterOrPrimaryAssociatedTypeClause: node.genericParameters.map(Syntax.init),
205205
inheritanceClause: node.inheritanceClause,
206206
genericWhereClause: node.genericWhereClause,
207207
members: node.members)
@@ -215,7 +215,8 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
215215
modifiers: node.modifiers,
216216
typeKeyword: node.protocolKeyword,
217217
identifier: node.identifier,
218-
genericParameterClause: nil,
218+
genericParameterOrPrimaryAssociatedTypeClause:
219+
node.primaryAssociatedTypeClause.map(Syntax.init),
219220
inheritanceClause: node.inheritanceClause,
220221
genericWhereClause: node.genericWhereClause,
221222
members: node.members)
@@ -232,7 +233,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
232233
modifiers: node.modifiers,
233234
typeKeyword: node.extensionKeyword,
234235
identifier: lastTokenOfExtendedType,
235-
genericParameterClause: nil,
236+
genericParameterOrPrimaryAssociatedTypeClause: nil,
236237
inheritanceClause: node.inheritanceClause,
237238
genericWhereClause: node.genericWhereClause,
238239
members: node.members)
@@ -247,7 +248,7 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
247248
modifiers: ModifierListSyntax?,
248249
typeKeyword: TokenSyntax,
249250
identifier: TokenSyntax,
250-
genericParameterClause: GenericParameterClauseSyntax?,
251+
genericParameterOrPrimaryAssociatedTypeClause: Syntax?,
251252
inheritanceClause: TypeInheritanceClauseSyntax?,
252253
genericWhereClause: GenericWhereClauseSyntax?,
253254
members: MemberDeclBlockSyntax
@@ -269,7 +270,8 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
269270
after(members.leftBrace, tokens: .close)
270271
}
271272

272-
let lastTokenBeforeBrace = inheritanceClause?.colon ?? genericParameterClause?.rightAngleBracket
273+
let lastTokenBeforeBrace = inheritanceClause?.colon
274+
?? genericParameterOrPrimaryAssociatedTypeClause?.lastToken
273275
?? identifier
274276
after(lastTokenBeforeBrace, tokens: .close)
275277

@@ -1484,6 +1486,12 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
14841486
return .visitChildren
14851487
}
14861488

1489+
override func visit(_ node: PrimaryAssociatedTypeClauseSyntax) -> SyntaxVisitorContinueKind {
1490+
after(node.leftAngleBracket, tokens: .break(.open, size: 0), .open(argumentListConsistency()))
1491+
before(node.rightAngleBracket, tokens: .break(.close, size: 0), .close)
1492+
return .visitChildren
1493+
}
1494+
14871495
override func visit(_ node: ArrayTypeSyntax) -> SyntaxVisitorContinueKind {
14881496
return .visitChildren
14891497
}
@@ -2098,6 +2106,16 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
20982106
return .visitChildren
20992107
}
21002108

2109+
override func visit(_ node: PrimaryAssociatedTypeSyntax) -> SyntaxVisitorContinueKind {
2110+
before(node.firstToken, tokens: .open)
2111+
if let trailingComma = node.trailingComma {
2112+
after(trailingComma, tokens: .close, .break(.same))
2113+
} else {
2114+
after(node.lastToken, tokens: .close)
2115+
}
2116+
return .visitChildren
2117+
}
2118+
21012119
override func visit(_ node: PoundWarningDeclSyntax) -> SyntaxVisitorContinueKind {
21022120
return .visitChildren
21032121
}

Tests/SwiftFormatPrettyPrintTests/ProtocolDeclTests.swift

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import SwiftFormatConfiguration
2+
13
final class ProtocolDeclTests: PrettyPrintTestCase {
24
func testBasicProtocolDeclarations() {
35
let input =
@@ -256,4 +258,89 @@ final class ProtocolDeclTests: PrettyPrintTestCase {
256258
let input = "protocol Foo { var bar: Int { get } }"
257259
assertPrettyPrintEqual(input: input, expected: input + "\n", linelength: 50)
258260
}
261+
262+
func testPrimaryAssociatedTypes_noPackArguments() {
263+
let input =
264+
"""
265+
protocol MyProtocol<T> {
266+
var a: Int { get }
267+
var b: Bool { get }
268+
}
269+
protocol MyProtocol<T, S> {
270+
var a: Int { get }
271+
var b: Bool { get }
272+
}
273+
protocol MyProtocol<One, Two, Three, Four> {
274+
var a: Int { get }
275+
var b: Bool { get }
276+
}
277+
"""
278+
279+
let expected =
280+
"""
281+
protocol MyProtocol<T> {
282+
var a: Int { get }
283+
var b: Bool { get }
284+
}
285+
protocol MyProtocol<T, S> {
286+
var a: Int { get }
287+
var b: Bool { get }
288+
}
289+
protocol MyProtocol<
290+
One,
291+
Two,
292+
Three,
293+
Four
294+
> {
295+
var a: Int { get }
296+
var b: Bool { get }
297+
}
298+
299+
"""
300+
301+
var config = Configuration()
302+
config.lineBreakBeforeEachArgument = true
303+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 30, configuration: config)
304+
}
305+
306+
func testPrimaryAssociatedTypes_packArguments() {
307+
let input =
308+
"""
309+
protocol MyProtocol<T> {
310+
var a: Int { get }
311+
var b: Bool { get }
312+
}
313+
protocol MyProtocol<T, S> {
314+
var a: Int { get }
315+
var b: Bool { get }
316+
}
317+
protocol MyProtocol<One, Two, Three, Four> {
318+
var a: Int { get }
319+
var b: Bool { get }
320+
}
321+
"""
322+
323+
let expected =
324+
"""
325+
protocol MyProtocol<T> {
326+
var a: Int { get }
327+
var b: Bool { get }
328+
}
329+
protocol MyProtocol<T, S> {
330+
var a: Int { get }
331+
var b: Bool { get }
332+
}
333+
protocol MyProtocol<
334+
One, Two, Three, Four
335+
> {
336+
var a: Int { get }
337+
var b: Bool { get }
338+
}
339+
340+
"""
341+
342+
var config = Configuration()
343+
config.lineBreakBeforeEachArgument = false
344+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 30, configuration: config)
345+
}
259346
}

0 commit comments

Comments
 (0)