Skip to content

Commit 5b69fb7

Browse files
authored
Fix switch expression cleanup to handle default case falling through (#1984)
- add logic to SwitchExpressionsFixCore to handle default case falling through and defer the default case until after the fallthrough logic is converted - add new tests to CleanUpTest14 - fixes #1983
1 parent d76582e commit 5b69fb7

File tree

2 files changed

+182
-56
lines changed

2 files changed

+182
-56
lines changed

org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/SwitchExpressionsFixCore.java

+42-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2020, 2023 Red Hat Inc. and others.
2+
* Copyright (c) 2020, 2025 Red Hat Inc. and others.
33
*
44
* This program and the accompanying materials
55
* are made available under the terms of the Eclipse Public License 2.0
@@ -326,6 +326,7 @@ public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModelCore
326326
}
327327

328328
// build switch expression
329+
boolean defaultFallThrough= false;
329330
for (Map.Entry<SwitchCase, List<Statement>> entry : caseMap.entrySet()) {
330331
SwitchCase oldSwitchCase= entry.getKey();
331332
List<Statement> oldStatements= entry.getValue();
@@ -335,15 +336,23 @@ public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModelCore
335336
newSwitchExpression.statements().add(newSwitchCase);
336337
} else {
337338
// fall-through, want all fall-through labels in single case
338-
if (lastSwitchCase == null) {
339-
lastSwitchCase= ast.newSwitchCase();
340-
lastSwitchCase.setSwitchLabeledRule(true);
341-
newSwitchExpression.statements().add(lastSwitchCase);
339+
if (oldSwitchCase.expressions().isEmpty()) {
340+
// default falls through but we can't add default with other labels
341+
// so defer until we have finished the fallthrough case and then
342+
// duplicate statements for default case
343+
defaultFallThrough= true;
342344
}
343-
for (Object obj : oldSwitchCase.expressions()) {
344-
Expression oldExpression= (Expression)obj;
345-
Expression newExpression= (Expression)rewrite.createCopyTarget(oldExpression);
346-
lastSwitchCase.expressions().add(newExpression);
345+
else {
346+
if (lastSwitchCase == null) {
347+
lastSwitchCase= ast.newSwitchCase();
348+
lastSwitchCase.setSwitchLabeledRule(true);
349+
newSwitchExpression.statements().add(lastSwitchCase);
350+
}
351+
for (Object obj : oldSwitchCase.expressions()) {
352+
Expression oldExpression= (Expression)obj;
353+
Expression newExpression= (Expression)rewrite.createCopyTarget(oldExpression);
354+
lastSwitchCase.expressions().add(newExpression);
355+
}
347356
}
348357
}
349358
continue;
@@ -385,21 +394,38 @@ public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModelCore
385394
if (oldStatements.size() == 1) {
386395
Statement oldStatement= oldStatements.get(0);
387396
Statement newStatement= null;
397+
Statement newStatement2= null;
388398
if (oldStatement instanceof ThrowStatement) {
389399
ThrowStatement throwStatement= (ThrowStatement)oldStatement;
390400
newStatement= (Statement)rewrite.createCopyTarget(throwStatement);
401+
if (defaultFallThrough) {
402+
newStatement2= (Statement)rewrite.createCopyTarget(throwStatement);
403+
}
391404
} else if (oldStatement instanceof ReturnStatement && createReturnStatement) {
392405
if (forceOldStyle) {
393406
newStatement= getNewYieldStatementFromReturn(cuRewrite, rewrite, (ReturnStatement)oldStatement);
394407
} else {
395408
newStatement= getNewStatementFromReturn(cuRewrite, rewrite, (ReturnStatement)oldStatement);
409+
if (defaultFallThrough) {
410+
newStatement2= getNewStatementFromReturn(cuRewrite, rewrite, (ReturnStatement)oldStatement);
411+
}
396412
}
397413
} else if (forceOldStyle) {
398414
newStatement= getNewYieldStatement(cuRewrite, rewrite, (ExpressionStatement)oldStatement);
399415
} else {
400416
newStatement= getNewStatementForCase(cuRewrite, rewrite, oldStatement);
417+
if (defaultFallThrough) {
418+
newStatement2= getNewStatementForCase(cuRewrite, rewrite, oldStatement);
419+
}
401420
}
402421
newSwitchExpression.statements().add(newStatement);
422+
if (defaultFallThrough) {
423+
SwitchCase newSwitchCase= ast.newSwitchCase();
424+
newSwitchCase.setSwitchLabeledRule(true);
425+
newSwitchExpression.statements().add(newSwitchCase);
426+
newSwitchExpression.statements().add(newStatement2);
427+
defaultFallThrough= false;
428+
}
403429
} else {
404430
Block newBlock= ast.newBlock();
405431
int statementsLen= oldStatements.size();
@@ -419,6 +445,13 @@ public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModelCore
419445
}
420446
newBlock.statements().add(newStatement);
421447
newSwitchExpression.statements().add(newBlock);
448+
if (defaultFallThrough) {
449+
SwitchCase newSwitchCase= ast.newSwitchCase();
450+
newSwitchCase.setSwitchLabeledRule(true);
451+
newSwitchCase.expressions().add(ast.newCaseDefaultExpression());
452+
newSwitchExpression.statements().add(newSwitchCase);
453+
newSwitchExpression.statements().add(newBlock);
454+
}
422455
}
423456
if (needDuplicateDefault) {
424457
needDuplicateDefault= false;

0 commit comments

Comments
 (0)