Skip to content

Commit 80ce1ed

Browse files
authored
Merge pull request #192 from allevato/property-wrappers
Format property wrappers correctly.
2 parents 52626da + d6a37ce commit 80ce1ed

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

Sources/SwiftFormatPrettyPrint/TokenStreamCreator.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,6 +1391,22 @@ fileprivate final class TokenStreamCreator: SyntaxVisitor {
13911391
return .visitChildren
13921392
}
13931393

1394+
override func visit(_ node: CustomAttributeSyntax) -> SyntaxVisitorContinueKind {
1395+
// "Custom attributes" are better known to users as "property wrappers".
1396+
before(node.firstToken, tokens: .open)
1397+
if let argumentList = node.argumentList,
1398+
let leftParen = node.leftParen, let rightParen = node.rightParen
1399+
{
1400+
arrangeFunctionCallArgumentList(
1401+
argumentList,
1402+
leftDelimiter: leftParen,
1403+
rightDelimiter: rightParen,
1404+
forcesBreakBeforeRightDelimiter: false)
1405+
}
1406+
after(node.lastToken, tokens: .close)
1407+
return .visitChildren
1408+
}
1409+
13941410
override func visit(_ node: AvailabilitySpecListSyntax) -> SyntaxVisitorContinueKind {
13951411
insertTokens(.break(.same, size: 1), betweenElementsOf: node)
13961412
return .visitChildren

Tests/SwiftFormatPrettyPrintTests/AttributeTests.swift

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,4 +314,49 @@ final class AttributeTests: PrettyPrintTestCase {
314314

315315
assertPrettyPrintEqual(input: input, expected: expected, linelength: 30)
316316
}
317+
318+
func testPropertyWrappers() {
319+
// Property wrappers are `CustomAttributeSyntax` nodes (not `AttributeSyntax`) and their
320+
// arguments are `TupleExprElementListSyntax` (like regular function call argument lists), so
321+
// make sure that those are formatted properly.
322+
let input =
323+
"""
324+
struct X {
325+
@Wrapper var value: String
326+
327+
@Wrapper ( ) var value: String
328+
329+
@Wrapper (arg1:"value")var value: String
330+
331+
@Wrapper (arg1:"value")
332+
var value: String
333+
334+
@Wrapper (arg1:"value",arg2:otherValue)
335+
var value: String
336+
}
337+
"""
338+
339+
let expected =
340+
"""
341+
struct X {
342+
@Wrapper var value: String
343+
344+
@Wrapper() var value: String
345+
346+
@Wrapper(arg1: "value")
347+
var value: String
348+
349+
@Wrapper(arg1: "value")
350+
var value: String
351+
352+
@Wrapper(
353+
arg1: "value",
354+
arg2: otherValue)
355+
var value: String
356+
}
357+
358+
"""
359+
360+
assertPrettyPrintEqual(input: input, expected: expected, linelength: 32)
361+
}
317362
}

Tests/SwiftFormatPrettyPrintTests/XCTestManifests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ extension AttributeTests {
6969
("testObjCAttributesDiscretionaryLineBreaking", testObjCAttributesDiscretionaryLineBreaking),
7070
("testObjCAttributesPerLineBreaking", testObjCAttributesPerLineBreaking),
7171
("testObjCBinPackedAttributes", testObjCBinPackedAttributes),
72+
("testPropertyWrappers", testPropertyWrappers),
7273
]
7374
}
7475

0 commit comments

Comments
 (0)