Skip to content

Commit c60c175

Browse files
authored
Add option to blankLinesAfterGuardStatements rule to have blank line between consecutive guards (#2058)
1 parent 33f021e commit c60c175

File tree

5 files changed

+686
-6
lines changed

5 files changed

+686
-6
lines changed

Rules.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,20 +304,68 @@ which is followed by a closing brace).
304304

305305
Remove blank lines between consecutive guard statements, and insert a blank after the last guard statement.
306306

307+
Option | Description
308+
--- | ---
309+
`--linebtwnguards` | Insert line between guards: "true" or "false" (default)
310+
307311
<details>
308312
<summary>Examples</summary>
309313

314+
`--linebtwnguards false` (default)
315+
310316
```diff
317+
// Multiline guard
311318
guard let spicy = self.makeSpicy() else {
312319
return
320+
}
321+
-
322+
guard let yummy = self.makeYummy() else {
323+
return
324+
}
325+
guard let soap = self.clean() else {
326+
return
313327
}
328+
+
329+
let doTheJob = nikekov()
330+
```
331+
```diff
332+
// Single-line guard
333+
guard let spicy = self.makeSpicy() else { return }
314334
-
335+
guard let yummy = self.makeYummy() else { return }
336+
guard let soap = self.clean() else { return }
337+
+
338+
let doTheJob = nikekov()
339+
```
340+
341+
`--linebtwnguards true`
342+
343+
```diff
344+
// Multiline guard
345+
guard let spicy = self.makeSpicy() else {
346+
return
347+
}
348+
349+
guard let yummy = self.makeYummy() else {
350+
return
351+
}
352+
+
315353
guard let soap = self.clean() else {
316354
return
317355
}
318356
+
319357
let doTheJob = nikekov()
320358
```
359+
```diff
360+
// Single-line guard
361+
guard let spicy = self.makeSpicy() else { return }
362+
363+
guard let yummy = self.makeYummy() else { return }
364+
+
365+
guard let soap = self.clean() else { return }
366+
+
367+
let doTheJob = nikekov()
368+
```
321369

322370
</details>
323371
<br/>

Sources/OptionDescriptor.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,6 +1279,14 @@ struct _Descriptors {
12791279
trueValues: ["#file", "file"],
12801280
falseValues: ["#fileID", "fileID"]
12811281
)
1282+
let lineBetweenConsecutiveGuards = OptionDescriptor(
1283+
argumentName: "linebtwnguards",
1284+
displayName: "Blank Line Between Consecutive Guards",
1285+
help: "Insert line between guards: \"true\" or \"false\" (default)",
1286+
keyPath: \.lineBetweenConsecutiveGuards,
1287+
trueValues: ["true"],
1288+
falseValues: ["false"]
1289+
)
12821290

12831291
// MARK: - Internal
12841292

Sources/Options.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,7 @@ public struct FormatOptions: CustomStringConvertible {
748748
public var additionalXCTestSymbols: Set<String>
749749
public var equatableMacro: EquatableMacro
750750
public var preferFileMacro: Bool
751+
public var lineBetweenConsecutiveGuards: Bool
751752

752753
/// Deprecated
753754
public var indentComments: Bool
@@ -879,6 +880,7 @@ public struct FormatOptions: CustomStringConvertible {
879880
additionalXCTestSymbols: Set<String> = [],
880881
equatableMacro: EquatableMacro = .none,
881882
preferFileMacro: Bool = true,
883+
lineBetweenConsecutiveGuards: Bool = false,
882884
// Doesn't really belong here, but hard to put elsewhere
883885
fragment: Bool = false,
884886
ignoreConflictMarkers: Bool = false,
@@ -1000,6 +1002,7 @@ public struct FormatOptions: CustomStringConvertible {
10001002
self.additionalXCTestSymbols = additionalXCTestSymbols
10011003
self.equatableMacro = equatableMacro
10021004
self.preferFileMacro = preferFileMacro
1005+
self.lineBetweenConsecutiveGuards = lineBetweenConsecutiveGuards
10031006
// Doesn't really belong here, but hard to put elsewhere
10041007
self.fragment = fragment
10051008
self.ignoreConflictMarkers = ignoreConflictMarkers

Sources/Rules/BlankLinesAfterGuardStatements.swift

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import Foundation
66
public extension FormatRule {
77
static let blankLinesAfterGuardStatements = FormatRule(
88
help: "Remove blank lines between consecutive guard statements, and insert a blank after the last guard statement.",
9-
disabledByDefault: true
9+
disabledByDefault: true,
10+
options: ["linebtwnguards"]
1011
) { formatter in
1112
formatter.forEach(.keyword("guard")) { guardIndex, _ in
1213
guard var elseIndex = formatter.index(of: .keyword("else"), after: guardIndex) else {
@@ -34,23 +35,73 @@ public extension FormatRule {
3435
return
3536
}
3637

37-
let linebreaks = nextToken == .keyword("guard") ? 1 : 2
38+
let linebreaks: Int
39+
if formatter.options.lineBetweenConsecutiveGuards {
40+
linebreaks = 2
41+
} else {
42+
linebreaks = nextToken == .keyword("guard") ? 1 : 2
43+
}
44+
3845
let indexesBetween = Set(endOfGuardScope + 1 ..< nextNonSpaceAndNonLinebreakIndex)
3946
formatter.leaveOrSetLinebreaksInIndexes(indexesBetween, linebreaksCount: linebreaks)
4047
}
4148
} examples: {
4249
"""
50+
`--linebtwnguards false` (default)
51+
4352
```diff
53+
// Multiline guard
4454
guard let spicy = self.makeSpicy() else {
4555
return
56+
}
57+
-
58+
guard let yummy = self.makeYummy() else {
59+
return
60+
}
61+
guard let soap = self.clean() else {
62+
return
4663
}
64+
+
65+
let doTheJob = nikekov()
66+
```
67+
```diff
68+
// Single-line guard
69+
guard let spicy = self.makeSpicy() else { return }
4770
-
71+
guard let yummy = self.makeYummy() else { return }
72+
guard let soap = self.clean() else { return }
73+
+
74+
let doTheJob = nikekov()
75+
```
76+
77+
`--linebtwnguards true`
78+
79+
```diff
80+
// Multiline guard
81+
guard let spicy = self.makeSpicy() else {
82+
return
83+
}
84+
85+
guard let yummy = self.makeYummy() else {
86+
return
87+
}
88+
+
4889
guard let soap = self.clean() else {
4990
return
5091
}
5192
+
5293
let doTheJob = nikekov()
5394
```
95+
```diff
96+
// Single-line guard
97+
guard let spicy = self.makeSpicy() else { return }
98+
99+
guard let yummy = self.makeYummy() else { return }
100+
+
101+
guard let soap = self.clean() else { return }
102+
+
103+
let doTheJob = nikekov()
104+
```
54105
"""
55106
}
56107
}

0 commit comments

Comments
 (0)