Skip to content

Commit eb887c2

Browse files
stereotype441Commit Queue
authored and
Commit Queue
committed
Fix dead code removal when multiple cases share a body.
Fixes #56485. Bug: #56485 Change-Id: Idea150d9b00bdf90ecff184da14ecbdbe5902a30 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/380901 Commit-Queue: Paul Berry <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]>
1 parent e5704ea commit eb887c2

File tree

3 files changed

+43
-5
lines changed

3 files changed

+43
-5
lines changed

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,19 @@ class RemoveDeadCode extends ResolvedCorrectionProducer {
102102
if (forStatement is! ForStatement) return;
103103

104104
await _computeForStatementParts(builder, forStatement, coveringNode);
105-
} else if (coveringNode is SwitchPatternCase) {
105+
} else if (coveringNode is SwitchMember) {
106+
var parent = coveringNode.parent as SwitchStatement;
107+
var memberIndex = parent.members.indexOf(coveringNode);
108+
Token? overrideEnd;
109+
if (memberIndex > 0 &&
110+
parent.members[memberIndex - 1].statements.isEmpty) {
111+
// Previous member "falls through" to the one being removed, so don't
112+
// remove the statements.
113+
overrideEnd = coveringNode.colon;
114+
}
106115
await builder.addDartFileEdit(file, (builder) {
107-
builder.addDeletion(range.deletionRange(coveringNode));
116+
builder.addDeletion(
117+
range.deletionRange(coveringNode, overrideEnd: overrideEnd));
108118
});
109119
}
110120
}

pkg/analysis_server/test/src/services/correction/fix/remove_dead_code_test.dart

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,30 @@ void f() {
493493
''');
494494
}
495495

496+
Future<void> test_switchCase_sharedStatements_last() async {
497+
await resolveTestCode('''
498+
void f() {
499+
var m = 5;
500+
switch(m) {
501+
case 5:
502+
case 3:
503+
case 5:
504+
break;
505+
}
506+
}
507+
''');
508+
await assertHasFix('''
509+
void f() {
510+
var m = 5;
511+
switch(m) {
512+
case 5:
513+
case 3:
514+
break;
515+
}
516+
}
517+
''');
518+
}
519+
496520
Future<void> test_switchCase_uniqueStatements() async {
497521
await resolveTestCode('''
498522
void f() {

pkg/analyzer_plugin/lib/utilities/range_factory.dart

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,15 @@ class RangeFactory {
6363

6464
/// Return the deletion range of the [node], considering the spaces and
6565
/// comments before and after it.
66-
SourceRange deletionRange(AstNode node) {
66+
///
67+
/// If a non-`null` [overrideEnd] is supplied, it will be used in place of
68+
/// [AstNode.endToken] to determine the range of tokens to delete.
69+
SourceRange deletionRange(AstNode node, {Token? overrideEnd}) {
6770
var begin = node.beginToken;
6871
begin = begin.precedingComments ?? begin;
6972

70-
var end = node.endToken.next!;
73+
var initialEndToken = overrideEnd ?? node.endToken;
74+
var end = initialEndToken.next!;
7175
end = end.precedingComments ?? end;
7276

7377
int startOffset;
@@ -84,7 +88,7 @@ class RangeFactory {
8488
} else {
8589
startOffset = begin.previous!.end;
8690
}
87-
endOffset = node.endToken.end;
91+
endOffset = initialEndToken.end;
8892
} else {
8993
startOffset = begin.offset;
9094
endOffset = end.offset;

0 commit comments

Comments
 (0)