Add --trailingcommas collections-only option to opt out of Swift 6.1 trailing comma support (#2081)

Co-authored-by: Cal Stephens <cal.stephens@airbnb.com>
This commit is contained in:
Cameron Pulsford
2025-06-11 10:37:06 -04:00
committed by Cal Stephens
parent d2fba2c7fe
commit a65ea804ca
9 changed files with 200 additions and 80 deletions
+1 -1
View File
@@ -77,7 +77,7 @@ class PerformanceTests: XCTestCase {
spaceAroundOperatorDeclarations: .remove,
useVoid: false,
indentCase: true,
trailingCommas: false,
trailingCommas: .never,
indentComments: false,
truncateBlankLines: false,
allmanBraces: true,
+1 -1
View File
@@ -3233,7 +3233,7 @@ Add or remove trailing commas in comma-separated lists.
Option | Description
--- | ---
`--commas` | Commas in collection literals: "always" (default) or "inline"
`--trailingcommas` | Trailing commas: "always" (default), "never", or "collections-only"
<details>
<summary>Examples</summary>
+1 -1
View File
@@ -235,7 +235,7 @@ private struct Inference {
noTrailing += 1
}
}
options.trailingCommas = (trailing >= noTrailing)
options.trailingCommas = (trailing >= noTrailing) ? .always : .never
}
let truncateBlankLines = OptionInferrer { formatter, options in
+16 -6
View File
@@ -516,12 +516,10 @@ struct _Descriptors {
falseValues: ["false"]
)
let trailingCommas = OptionDescriptor(
argumentName: "commas",
displayName: "Commas",
help: "Commas in collection literals: \"always\" (default) or \"inline\"",
keyPath: \.trailingCommas,
trueValues: ["always", "true"],
falseValues: ["inline", "false"]
argumentName: "trailingcommas",
displayName: "Trailing commas",
help: "Trailing commas: \"always\" (default), \"never\", or \"collections-only\"",
keyPath: \.trailingCommas
)
let truncateBlankLines = OptionDescriptor(
argumentName: "trimwhitespace",
@@ -1361,6 +1359,18 @@ struct _Descriptors {
deprecationMessage: "Use with `--storedvarattributes` or `--computedvarattributes` instead.",
keyPath: \.varAttributes
)
let commas = OptionDescriptor(
argumentName: "commas",
displayName: "Trailing commas",
help: "deprecated",
deprecationMessage: "Use '--trailingcommas' instead",
keyPath: \.trailingCommas,
altOptions: [
"inline": .never,
"false": .never,
"true": .always,
]
)
// MARK: - RENAMED
+8 -2
View File
@@ -178,6 +178,12 @@ public enum ClosureVoidReturn: String, CaseIterable {
case preserve
}
public enum TrailingCommas: String, CaseIterable {
case never
case always
case collectionsOnly = "collections-only"
}
/// Whether to insert, remove, or preserve spaces around operators
public enum OperatorSpacingMode: String, CaseIterable {
case insert = "spaced"
@@ -651,7 +657,7 @@ public struct FormatOptions: CustomStringConvertible {
public var spaceAroundOperatorDeclarations: OperatorSpacingMode
public var useVoid: Bool
public var indentCase: Bool
public var trailingCommas: Bool
public var trailingCommas: TrailingCommas
public var truncateBlankLines: Bool
public var insertBlankLines: Bool
public var removeBlankLines: Bool
@@ -782,7 +788,7 @@ public struct FormatOptions: CustomStringConvertible {
spaceAroundOperatorDeclarations: OperatorSpacingMode = .insert,
useVoid: Bool = true,
indentCase: Bool = false,
trailingCommas: Bool = true,
trailingCommas: TrailingCommas = .always,
indentComments: Bool = true,
truncateBlankLines: Bool = true,
insertBlankLines: Bool = true,
+42 -5
View File
@@ -11,7 +11,7 @@ import Foundation
public extension FormatRule {
static let trailingCommas = FormatRule(
help: "Add or remove trailing commas in comma-separated lists.",
options: ["commas"]
options: ["trailingcommas"]
) { formatter in
formatter.forEachToken { i, token in
switch token {
@@ -20,7 +20,18 @@ public extension FormatRule {
case .array, .dictionary:
formatter.addOrRemoveTrailingComma(before: i, trailingCommaSupported: true)
case .subscript, .captureList:
formatter.addOrRemoveTrailingComma(before: i, trailingCommaSupported: formatter.options.swiftVersion >= "6.1")
var trailingCommaSupported = false
if formatter.options.swiftVersion >= "6.1" {
switch formatter.options.trailingCommas {
case .always:
trailingCommaSupported = true
case .never, .collectionsOnly:
break
}
}
formatter.addOrRemoveTrailingComma(before: i, trailingCommaSupported: trailingCommaSupported)
default:
return
}
@@ -84,6 +95,13 @@ public extension FormatRule {
}
}
switch formatter.options.trailingCommas {
case .always:
break
case .never, .collectionsOnly:
trailingCommaSupported = false
}
formatter.addOrRemoveTrailingComma(before: i, trailingCommaSupported: trailingCommaSupported)
case .endOfScope(">"):
@@ -104,6 +122,13 @@ public extension FormatRule {
trailingCommaSupported = true
}
switch formatter.options.trailingCommas {
case .always:
break
case .never, .collectionsOnly:
trailingCommaSupported = false
}
formatter.addOrRemoveTrailingComma(before: i, trailingCommaSupported: trailingCommaSupported)
default:
@@ -154,7 +179,8 @@ public extension FormatRule {
extension Formatter {
/// Adds or removes a trailing comma before the given index that marks the end of a comma-separated list.
/// Trailing commas can always be removed. `trailingCommaSupported` indicates whether or not a trailing
/// comma is allowed at this position.
/// comma is allowed at this position. A comma being supported is a combination of language support
/// and enabled options.
func addOrRemoveTrailingComma(before endOfListIndex: Int, trailingCommaSupported: Bool) {
guard let prevTokenIndex = index(of: .nonSpaceOrComment, before: endOfListIndex) else { return }
@@ -169,11 +195,11 @@ extension Formatter {
case .startOfScope("["), .delimiter(":"), .startOfScope("("):
break // do nothing
case .delimiter(","):
if !options.trailingCommas {
if !options.trailingCommas.enabled || !trailingCommaSupported {
removeToken(at: prevTokenIndex)
}
default:
if options.trailingCommas, trailingCommaSupported {
if options.trailingCommas.enabled, trailingCommaSupported {
insert(.delimiter(","), at: prevTokenIndex + 1)
}
}
@@ -184,3 +210,14 @@ extension Formatter {
}
}
}
extension TrailingCommas {
var enabled: Bool {
switch self {
case .never:
return false
case .always, .collectionsOnly:
return true
}
}
}
+2 -2
View File
@@ -149,13 +149,13 @@ class InferenceTests: XCTestCase {
func testInferTrailingCommas() {
let input = "let foo = [\nbar,\n]\n let baz = [\nquux\n]"
let options = inferFormatOptions(from: tokenize(input))
XCTAssertTrue(options.trailingCommas)
XCTAssertEqual(options.trailingCommas, .always)
}
func testInferNoTrailingCommas() {
let input = "let foo = [\nbar\n]\n let baz = [\nquux\n]"
let options = inferFormatOptions(from: tokenize(input))
XCTAssertFalse(options.trailingCommas)
XCTAssertEqual(options.trailingCommas, .never)
}
// MARK: truncateBlankLines
+121 -54
View File
@@ -22,6 +22,13 @@ class TrailingCommasTests: XCTestCase {
testFormatting(for: input, output, rule: .trailingCommas)
}
func testCommaAddedToLastItemCollectionsOnly() {
let input = "[\n foo,\n bar\n]"
let output = "[\n foo,\n bar,\n]"
let options = FormatOptions(trailingCommas: .collectionsOnly)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
func testCommaAddedToDictionary() {
let input = "[\n foo: bar\n]"
let output = "[\n foo: bar,\n]"
@@ -262,14 +269,14 @@ class TrailingCommasTests: XCTestCase {
func testCommaNotAddedToLastItem() {
let input = "[\n foo,\n bar\n]"
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, rule: .trailingCommas, options: options)
}
func testCommaRemovedFromLastItem() {
let input = "[\n foo,\n bar,\n]"
let output = "[\n foo,\n bar\n]"
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -294,7 +301,7 @@ class TrailingCommasTests: XCTestCase {
}
}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -304,7 +311,7 @@ class TrailingCommasTests: XCTestCase {
bar _: Int
) {}
"""
let options = FormatOptions(trailingCommas: true)
let options = FormatOptions(trailingCommas: .always)
testFormatting(for: input, rule: .trailingCommas, options: options)
}
@@ -319,7 +326,7 @@ class TrailingCommasTests: XCTestCase {
bar _: Int
) {}
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -336,7 +343,7 @@ class TrailingCommasTests: XCTestCase {
baaz _: Int)
{}
"""
let options = FormatOptions(trailingCommas: false, closingParenPosition: .sameLine)
let options = FormatOptions(trailingCommas: .never, closingParenPosition: .sameLine)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -353,7 +360,7 @@ class TrailingCommasTests: XCTestCase {
baaz _: Int)
{}
"""
let options = FormatOptions(trailingCommas: true, closingParenPosition: .sameLine)
let options = FormatOptions(trailingCommas: .always, closingParenPosition: .sameLine)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -368,7 +375,7 @@ class TrailingCommasTests: XCTestCase {
bar _: Int,
) {}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -383,7 +390,7 @@ class TrailingCommasTests: XCTestCase {
bar _: Int
) {}
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -402,7 +409,7 @@ class TrailingCommasTests: XCTestCase {
)
}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -421,7 +428,7 @@ class TrailingCommasTests: XCTestCase {
)
}
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -436,7 +443,7 @@ class TrailingCommasTests: XCTestCase {
1,
)
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -451,7 +458,7 @@ class TrailingCommasTests: XCTestCase {
1
)
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -478,7 +485,7 @@ class TrailingCommasTests: XCTestCase {
baz: 2,
)
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -513,7 +520,7 @@ class TrailingCommasTests: XCTestCase {
)
}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options, exclude: [.redundantReturn])
}
@@ -537,7 +544,7 @@ class TrailingCommasTests: XCTestCase {
),
)
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options, exclude: [.redundantReturn])
}
@@ -552,7 +559,7 @@ class TrailingCommasTests: XCTestCase {
0,
)
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options, exclude: [.redundantParens])
}
@@ -569,7 +576,7 @@ class TrailingCommasTests: XCTestCase {
1,
)
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -586,7 +593,7 @@ class TrailingCommasTests: XCTestCase {
baz: 1
)
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -600,7 +607,7 @@ class TrailingCommasTests: XCTestCase {
)
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, rule: .trailingCommas, options: options)
}
@@ -619,7 +626,7 @@ class TrailingCommasTests: XCTestCase {
)]]()
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, rule: .trailingCommas, options: options, exclude: [.propertyTypes])
}
@@ -638,7 +645,7 @@ class TrailingCommasTests: XCTestCase {
)>()
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, rule: .trailingCommas, options: options, exclude: [.typeSugar, .propertyTypes])
}
@@ -654,7 +661,7 @@ class TrailingCommasTests: XCTestCase {
) {}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, rule: .trailingCommas, options: options)
}
@@ -700,7 +707,7 @@ class TrailingCommasTests: XCTestCase {
) -> Void) {}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, rule: .trailingCommas, options: options)
}
@@ -715,7 +722,7 @@ class TrailingCommasTests: XCTestCase {
)?) {}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, rule: .trailingCommas, options: options)
}
@@ -743,7 +750,7 @@ class TrailingCommasTests: XCTestCase {
)?
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, rule: .trailingCommas, options: options)
}
@@ -770,7 +777,7 @@ class TrailingCommasTests: XCTestCase {
)
}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -797,7 +804,7 @@ class TrailingCommasTests: XCTestCase {
)
}
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -824,7 +831,7 @@ class TrailingCommasTests: XCTestCase {
)
}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -851,7 +858,7 @@ class TrailingCommasTests: XCTestCase {
)
}
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -888,7 +895,7 @@ class TrailingCommasTests: XCTestCase {
default: break
}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -899,7 +906,7 @@ class TrailingCommasTests: XCTestCase {
baz: Int
)
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, rule: .trailingCommas, options: options)
}
@@ -922,7 +929,7 @@ class TrailingCommasTests: XCTestCase {
): break
}
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -939,7 +946,7 @@ class TrailingCommasTests: XCTestCase {
bar
) = (0, 1)
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -949,7 +956,7 @@ class TrailingCommasTests: XCTestCase {
)
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, rule: .trailingCommas,
options: options, exclude: [
.blankLinesAtEndOfScope,
@@ -974,7 +981,7 @@ class TrailingCommasTests: XCTestCase {
)
\"""
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -993,7 +1000,7 @@ class TrailingCommasTests: XCTestCase {
)
struct Qux {}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1038,7 +1045,7 @@ class TrailingCommasTests: XCTestCase {
extension CoreFoundation.CGFloat: Swift.SignedNumeric {}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, rule: .trailingCommas, options: options)
}
@@ -1057,7 +1064,7 @@ class TrailingCommasTests: XCTestCase {
)
struct Qux {}
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1074,7 +1081,7 @@ class TrailingCommasTests: XCTestCase {
"baz",
)
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1091,7 +1098,7 @@ class TrailingCommasTests: XCTestCase {
"baz"
)
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1130,7 +1137,7 @@ class TrailingCommasTests: XCTestCase {
T2,
>() -> (T1, T2) {}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1170,7 +1177,7 @@ class TrailingCommasTests: XCTestCase {
> {}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, rule: .trailingCommas, options: options, exclude: [.emptyExtensions, .typeSugar])
}
@@ -1189,7 +1196,7 @@ class TrailingCommasTests: XCTestCase {
T3
> {}
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1200,7 +1207,7 @@ class TrailingCommasTests: XCTestCase {
let output = """
struct S<T1, T2, T3> {}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1219,7 +1226,7 @@ class TrailingCommasTests: XCTestCase {
] in
}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1238,7 +1245,7 @@ class TrailingCommasTests: XCTestCase {
] in
}
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1253,7 +1260,7 @@ class TrailingCommasTests: XCTestCase {
print(capturedValue1, capturedValue2)
}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1270,7 +1277,24 @@ class TrailingCommasTests: XCTestCase {
y,
]
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
func testTrailingCommasRemoveFromSubscriptWhenCollectionsOnly() {
let input = """
let value = m[
x,
y,
]
"""
let output = """
let value = m[
x,
y
]
"""
let options = FormatOptions(trailingCommas: .collectionsOnly, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1287,7 +1311,7 @@ class TrailingCommasTests: XCTestCase {
y
]
"""
let options = FormatOptions(trailingCommas: false)
let options = FormatOptions(trailingCommas: .never)
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1298,7 +1322,7 @@ class TrailingCommasTests: XCTestCase {
let output = """
let value = m[x, y]
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
@@ -1325,10 +1349,22 @@ class TrailingCommasTests: XCTestCase {
}
"""
let options = FormatOptions(trailingCommas: true, swiftVersion: "6.1")
let options = FormatOptions(trailingCommas: .always, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
func testSingleLineArrayWithMultipleElements() {
let input = """
for file in files where
file != "build" && !file.hasPrefix(".") && ![
".build", ".app", ".framework", ".xcodeproj", ".xcassets",
].contains(where: { file.hasSuffix($0) }) {}
"""
let options = FormatOptions(trailingCommas: .always)
testFormatting(for: input, rule: .trailingCommas, options: options)
}
func testSingleLineArrayWithMultipleElementsFollowingNotOperator() {
let input = """
for file in files where
@@ -1337,7 +1373,7 @@ class TrailingCommasTests: XCTestCase {
].contains(where: { file.hasSuffix($0) }) {}
"""
let options = FormatOptions(trailingCommas: true)
let options = FormatOptions(trailingCommas: .always)
testFormatting(for: input, rule: .trailingCommas, options: options)
}
@@ -1352,7 +1388,38 @@ class TrailingCommasTests: XCTestCase {
].throwingOperation()
"""
let options = FormatOptions(trailingCommas: true)
let options = FormatOptions(trailingCommas: .always)
testFormatting(for: input, rule: .trailingCommas, options: options)
}
func testCollectionsOnlyAddsCollectionCommasAndRemovesNonCollectionCommas() {
let input = """
let array = [
1,
2
]
func foo(
a: Int,
b: Int,
) {
print(a, b)
}
"""
let output = """
let array = [
1,
2,
]
func foo(
a: Int,
b: Int
) {
print(a, b)
}
"""
let options = FormatOptions(trailingCommas: .collectionsOnly, swiftVersion: "6.1")
testFormatting(for: input, output, rule: .trailingCommas, options: options)
}
}
+8 -8
View File
@@ -1209,7 +1209,7 @@ class WrapArgumentsTests: XCTestCase {
func testNoDoubleSpaceAddedToWrappedArray() {
let input = "[ foo,\n bar ]"
let output = "[\n foo,\n bar\n]"
let options = FormatOptions(trailingCommas: false, wrapCollections: .beforeFirst)
let options = FormatOptions(trailingCommas: .never, wrapCollections: .beforeFirst)
testFormatting(for: input, [output], rules: [.wrapArguments, .spaceInsideBrackets],
options: options)
}
@@ -1217,7 +1217,7 @@ class WrapArgumentsTests: XCTestCase {
func testTrailingCommasAddedToWrappedArray() {
let input = "[foo,\n bar]"
let output = "[\n foo,\n bar,\n]"
let options = FormatOptions(trailingCommas: true, wrapCollections: .beforeFirst)
let options = FormatOptions(trailingCommas: .always, wrapCollections: .beforeFirst)
testFormatting(for: input, [output], rules: [.wrapArguments, .trailingCommas],
options: options)
}
@@ -1225,7 +1225,7 @@ class WrapArgumentsTests: XCTestCase {
func testTrailingCommasAddedToWrappedNestedDictionary() {
let input = "[foo: [bar: baz,\n bar2: baz2]]"
let output = "[foo: [\n bar: baz,\n bar2: baz2,\n]]"
let options = FormatOptions(trailingCommas: true, wrapCollections: .beforeFirst)
let options = FormatOptions(trailingCommas: .always, wrapCollections: .beforeFirst)
testFormatting(for: input, [output], rules: [.wrapArguments, .trailingCommas],
options: options)
}
@@ -1233,7 +1233,7 @@ class WrapArgumentsTests: XCTestCase {
func testTrailingCommasAddedToSingleLineNestedDictionary() {
let input = "[\n foo: [bar: baz, bar2: baz2]]"
let output = "[\n foo: [bar: baz, bar2: baz2],\n]"
let options = FormatOptions(trailingCommas: true, wrapCollections: .beforeFirst)
let options = FormatOptions(trailingCommas: .always, wrapCollections: .beforeFirst)
testFormatting(for: input, [output], rules: [.wrapArguments, .trailingCommas],
options: options)
}
@@ -1241,7 +1241,7 @@ class WrapArgumentsTests: XCTestCase {
func testTrailingCommasAddedToWrappedNestedDictionaries() {
let input = "[foo: [bar: baz,\n bar2: baz2],\n foo2: [bar: baz,\n bar2: baz2]]"
let output = "[\n foo: [\n bar: baz,\n bar2: baz2,\n ],\n foo2: [\n bar: baz,\n bar2: baz2,\n ],\n]"
let options = FormatOptions(trailingCommas: true, wrapCollections: .beforeFirst)
let options = FormatOptions(trailingCommas: .always, wrapCollections: .beforeFirst)
testFormatting(for: input, [output], rules: [.wrapArguments, .trailingCommas],
options: options)
}
@@ -1311,7 +1311,7 @@ class WrapArgumentsTests: XCTestCase {
func testNoBeforeFirstPreservedAndTrailingCommaIgnoredInMultilineNestedDictionary() {
let input = "[foo: [bar: baz,\n bar2: baz2]]"
let output = "[foo: [bar: baz,\n bar2: baz2]]"
let options = FormatOptions(trailingCommas: true, wrapCollections: .preserve)
let options = FormatOptions(trailingCommas: .always, wrapCollections: .preserve)
testFormatting(for: input, [output], rules: [.wrapArguments, .trailingCommas],
options: options)
}
@@ -1319,7 +1319,7 @@ class WrapArgumentsTests: XCTestCase {
func testBeforeFirstPreservedAndTrailingCommaAddedInSingleLineNestedDictionary() {
let input = "[\n foo: [bar: baz, bar2: baz2]]"
let output = "[\n foo: [bar: baz, bar2: baz2],\n]"
let options = FormatOptions(trailingCommas: true, wrapCollections: .preserve)
let options = FormatOptions(trailingCommas: .always, wrapCollections: .preserve)
testFormatting(for: input, [output], rules: [.wrapArguments, .trailingCommas],
options: options)
}
@@ -1327,7 +1327,7 @@ class WrapArgumentsTests: XCTestCase {
func testBeforeFirstPreservedAndTrailingCommaAddedInSingleLineNestedDictionaryWithOneNestedItem() {
let input = "[\n foo: [bar: baz]]"
let output = "[\n foo: [bar: baz],\n]"
let options = FormatOptions(trailingCommas: true, wrapCollections: .preserve)
let options = FormatOptions(trailingCommas: .always, wrapCollections: .preserve)
testFormatting(for: input, [output], rules: [.wrapArguments, .trailingCommas],
options: options)
}