@@ -31,35 +31,35 @@ public final class UseLetInEveryBoundCaseVariable: SyntaxFormatRule {
31
31
result. pattern = PatternSyntax ( replacement)
32
32
return result
33
33
}
34
-
34
+
35
35
return super. visit ( node)
36
36
}
37
-
37
+
38
38
public override func visit( _ node: SwitchCaseItemSyntax ) -> SwitchCaseItemSyntax {
39
39
if let ( replacement, specifier) = distributeLetVarThroughPattern ( node. pattern) {
40
40
diagnose ( . useLetInBoundCaseVariables( specifier) , on: node. pattern)
41
-
41
+
42
42
var result = node
43
43
result. pattern = PatternSyntax ( replacement)
44
44
return result
45
45
}
46
-
46
+
47
47
return super. visit ( node)
48
48
}
49
-
49
+
50
50
public override func visit( _ node: ForStmtSyntax ) -> StmtSyntax {
51
51
guard node. caseKeyword != nil else {
52
52
return super. visit ( node)
53
53
}
54
-
54
+
55
55
if let ( replacement, specifier) = distributeLetVarThroughPattern ( node. pattern) {
56
56
diagnose ( . useLetInBoundCaseVariables( specifier) , on: node. pattern)
57
57
58
58
var result = node
59
59
result. pattern = PatternSyntax ( replacement)
60
60
return StmtSyntax ( result)
61
61
}
62
-
62
+
63
63
return super. visit ( node)
64
64
}
65
65
}
@@ -78,22 +78,30 @@ extension UseLetInEveryBoundCaseVariable {
78
78
) -> ExprSyntax {
79
79
var patternStack = patternStack
80
80
var result = expr
81
-
81
+
82
82
// As we unwind the stack, wrap the expression in optional chaining
83
83
// or force unwrap expressions.
84
84
while let ( kind, trivia) = patternStack. popLast ( ) {
85
85
if kind == . chained {
86
- result = ExprSyntax ( OptionalChainingExprSyntax (
87
- expression: result, trailingTrivia: trivia) )
86
+ result = ExprSyntax (
87
+ OptionalChainingExprSyntax (
88
+ expression: result,
89
+ trailingTrivia: trivia
90
+ )
91
+ )
88
92
} else {
89
- result = ExprSyntax ( ForceUnwrapExprSyntax (
90
- expression: result, trailingTrivia: trivia) )
93
+ result = ExprSyntax (
94
+ ForceUnwrapExprSyntax (
95
+ expression: result,
96
+ trailingTrivia: trivia
97
+ )
98
+ )
91
99
}
92
100
}
93
-
101
+
94
102
return result
95
103
}
96
-
104
+
97
105
/// Returns a rewritten version of the given pattern if bindings can be moved
98
106
/// into bound cases.
99
107
///
@@ -105,13 +113,13 @@ extension UseLetInEveryBoundCaseVariable {
105
113
_ pattern: PatternSyntax
106
114
) -> ( ExpressionPatternSyntax , TokenSyntax ) ? {
107
115
guard let bindingPattern = pattern. as ( ValueBindingPatternSyntax . self) ,
108
- let exprPattern = bindingPattern. pattern. as ( ExpressionPatternSyntax . self)
116
+ let exprPattern = bindingPattern. pattern. as ( ExpressionPatternSyntax . self)
109
117
else { return nil }
110
118
111
119
// Grab the `let` or `var` used in the binding pattern.
112
120
let specifier = bindingPattern. bindingSpecifier
113
121
let identifierBinder = BindIdentifiersRewriter ( bindingSpecifier: specifier)
114
-
122
+
115
123
// Drill down into any optional patterns that we encounter (e.g., `case let .foo(x)?`).
116
124
var patternStack : [ ( OptionalPatternKind , Trivia ) ] = [ ]
117
125
var expression = exprPattern. expression
@@ -137,7 +145,8 @@ extension UseLetInEveryBoundCaseVariable {
137
145
functionCall. arguments = newArguments. as ( LabeledExprListSyntax . self) !
138
146
result. expression = restoreOptionalChainingAndForcing (
139
147
ExprSyntax ( functionCall) ,
140
- patternStack: patternStack)
148
+ patternStack: patternStack
149
+ )
141
150
return ( result, specifier)
142
151
}
143
152
@@ -148,7 +157,8 @@ extension UseLetInEveryBoundCaseVariable {
148
157
tupleExpr. elements = newElements. as ( LabeledExprListSyntax . self) !
149
158
result. expression = restoreOptionalChainingAndForcing (
150
159
ExprSyntax ( tupleExpr) ,
151
- patternStack: patternStack)
160
+ patternStack: patternStack
161
+ )
152
162
return ( result, specifier)
153
163
}
154
164
@@ -169,19 +179,20 @@ extension Finding.Message {
169
179
/// with the given specifier.
170
180
private final class BindIdentifiersRewriter : SyntaxRewriter {
171
181
var bindingSpecifier : TokenSyntax
172
-
182
+
173
183
init ( bindingSpecifier: TokenSyntax ) {
174
184
self . bindingSpecifier = bindingSpecifier
175
185
}
176
-
186
+
177
187
override func visit( _ node: PatternExprSyntax ) -> ExprSyntax {
178
188
guard let identifier = node. pattern. as ( IdentifierPatternSyntax . self) else {
179
189
return super. visit ( node)
180
190
}
181
-
191
+
182
192
let binding = ValueBindingPatternSyntax (
183
193
bindingSpecifier: bindingSpecifier,
184
- pattern: identifier)
194
+ pattern: identifier
195
+ )
185
196
var result = node
186
197
result. pattern = PatternSyntax ( binding)
187
198
return ExprSyntax ( result)
0 commit comments