Skip to content

Commit db80d18

Browse files
pqCommit Queue
authored and
Commit Queue
committed
support converting to switch expressions when cases have no breaks
Fixes: #51826 (Note: a pass to refactor some shared logic to follow.) Change-Id: If82854f0d5fa5f6596308a04248bd6f4e7231a0d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/290661 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Phil Quitslund <[email protected]>
1 parent 9640bef commit db80d18

File tree

2 files changed

+98
-14
lines changed

2 files changed

+98
-14
lines changed

pkg/analysis_server/lib/src/services/correction/dart/convert_to_switch_expression.dart

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -205,15 +205,15 @@ class ConvertToSwitchExpression extends CorrectionProducer {
205205
if (member is! SwitchPatternCase) return false;
206206
if (member.labels.isNotEmpty) return false;
207207
var statements = member.statements;
208-
209-
if (statements.length == 1 &&
210-
statements.first.isThrowExpressionStatement) {
211-
continue;
208+
if (statements.length == 1) {
209+
if (statements.first.isThrowExpressionStatement) continue;
210+
} else if (statements.length == 2) {
211+
if (statements[1] is! BreakStatement) return false;
212+
} else {
213+
return false;
212214
}
213215

214-
if (statements.length != 2) return false;
215-
if (statements[1] is! BreakStatement) return false;
216-
var s = statements[0];
216+
var s = statements.first;
217217
if (s is! ExpressionStatement) return false;
218218
var expression = s.expression;
219219
if (expression is! MethodInvocation) return false;
@@ -234,15 +234,15 @@ class ConvertToSwitchExpression extends CorrectionProducer {
234234
if (member is! SwitchPatternCase) return false;
235235
if (member.labels.isNotEmpty) return false;
236236
var statements = member.statements;
237-
238-
if (statements.length == 1 &&
239-
statements.first.isThrowExpressionStatement) {
240-
continue;
237+
if (statements.length == 1) {
238+
if (statements.first.isThrowExpressionStatement) continue;
239+
} else if (statements.length == 2) {
240+
if (statements[1] is! BreakStatement) return false;
241+
} else {
242+
return false;
241243
}
242244

243-
if (statements.length != 2) return false;
244-
if (statements[1] is! BreakStatement) return false;
245-
var s = statements[0];
245+
var s = statements.first;
246246
if (s is! ExpressionStatement) return false;
247247
var expression = s.expression;
248248
if (expression is! AssignmentExpression) return false;

pkg/analysis_server/test/src/services/correction/assist/convert_to_switch_expression_test.dart

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,46 @@ enum Color {
4848
red, blue, green, yellow
4949
}
5050
51+
void f(Color color) {
52+
print(switch (color) {
53+
Color.red => 'red', // Red.
54+
Color.blue => 'blue',
55+
// Not green.
56+
Color.green => throw 'Green is bad',
57+
Color.yellow =>
58+
// Yellow is OK.
59+
'yellow'
60+
});
61+
}
62+
''');
63+
}
64+
65+
Future<void> test_argument_switchExpression_noBreaks() async {
66+
await resolveTestCode('''
67+
enum Color {
68+
red, blue, green, yellow
69+
}
70+
71+
void f(Color color) {
72+
switch (color) {
73+
case Color.red:
74+
print('red'); // Red.
75+
case Color.blue:
76+
print('blue');
77+
// Not green.
78+
case Color.green:
79+
throw 'Green is bad';
80+
case Color.yellow:
81+
// Yellow is OK.
82+
print('yellow');
83+
}
84+
}
85+
''');
86+
await assertHasAssistAt('(color)', '''
87+
enum Color {
88+
red, blue, green, yellow
89+
}
90+
5191
void f(Color color) {
5292
print(switch (color) {
5393
Color.red => 'red', // Red.
@@ -93,6 +133,50 @@ enum Color {
93133
red, blue, green, yellow
94134
}
95135
136+
String f(Color color) {
137+
var name = '';
138+
name = switch (color) {
139+
Color.red => 'red',
140+
Color.blue => 'blue', // Blue!
141+
// Not green.
142+
Color.green => throw 'Green is bad',
143+
Color.yellow =>
144+
// Yellow is OK.
145+
'yellow'
146+
};
147+
return name;
148+
}
149+
''');
150+
}
151+
152+
Future<void> test_assignment_switchExpression_noBreaks() async {
153+
await resolveTestCode('''
154+
enum Color {
155+
red, blue, green, yellow
156+
}
157+
158+
String f(Color color) {
159+
var name = '';
160+
switch (color) {
161+
case Color.red:
162+
name = 'red';
163+
case Color.blue:
164+
name = 'blue'; // Blue!
165+
// Not green.
166+
case Color.green:
167+
throw 'Green is bad';
168+
case Color.yellow:
169+
// Yellow is OK.
170+
name = 'yellow';
171+
}
172+
return name;
173+
}
174+
''');
175+
await assertHasAssistAt('(color)', '''
176+
enum Color {
177+
red, blue, green, yellow
178+
}
179+
96180
String f(Color color) {
97181
var name = '';
98182
name = switch (color) {

0 commit comments

Comments
 (0)