Skip to content

Commit

Permalink
Fix switch expression cleanup to handle default case falling through (e…
Browse files Browse the repository at this point in the history
…clipse-jdt#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 eclipse-jdt#1983
  • Loading branch information
jjohnstn authored Jan 27, 2025
1 parent d76582e commit 5b69fb7
Show file tree
Hide file tree
Showing 2 changed files with 182 additions and 56 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2020, 2023 Red Hat Inc. and others.
* Copyright (c) 2020, 2025 Red Hat Inc. and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
Expand Down Expand Up @@ -326,6 +326,7 @@ public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModelCore
}

// build switch expression
boolean defaultFallThrough= false;
for (Map.Entry<SwitchCase, List<Statement>> entry : caseMap.entrySet()) {
SwitchCase oldSwitchCase= entry.getKey();
List<Statement> oldStatements= entry.getValue();
Expand All @@ -335,15 +336,23 @@ public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModelCore
newSwitchExpression.statements().add(newSwitchCase);
} else {
// fall-through, want all fall-through labels in single case
if (lastSwitchCase == null) {
lastSwitchCase= ast.newSwitchCase();
lastSwitchCase.setSwitchLabeledRule(true);
newSwitchExpression.statements().add(lastSwitchCase);
if (oldSwitchCase.expressions().isEmpty()) {
// default falls through but we can't add default with other labels
// so defer until we have finished the fallthrough case and then
// duplicate statements for default case
defaultFallThrough= true;
}
for (Object obj : oldSwitchCase.expressions()) {
Expression oldExpression= (Expression)obj;
Expression newExpression= (Expression)rewrite.createCopyTarget(oldExpression);
lastSwitchCase.expressions().add(newExpression);
else {
if (lastSwitchCase == null) {
lastSwitchCase= ast.newSwitchCase();
lastSwitchCase.setSwitchLabeledRule(true);
newSwitchExpression.statements().add(lastSwitchCase);
}
for (Object obj : oldSwitchCase.expressions()) {
Expression oldExpression= (Expression)obj;
Expression newExpression= (Expression)rewrite.createCopyTarget(oldExpression);
lastSwitchCase.expressions().add(newExpression);
}
}
}
continue;
Expand Down Expand Up @@ -385,21 +394,38 @@ public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModelCore
if (oldStatements.size() == 1) {
Statement oldStatement= oldStatements.get(0);
Statement newStatement= null;
Statement newStatement2= null;
if (oldStatement instanceof ThrowStatement) {
ThrowStatement throwStatement= (ThrowStatement)oldStatement;
newStatement= (Statement)rewrite.createCopyTarget(throwStatement);
if (defaultFallThrough) {
newStatement2= (Statement)rewrite.createCopyTarget(throwStatement);
}
} else if (oldStatement instanceof ReturnStatement && createReturnStatement) {
if (forceOldStyle) {
newStatement= getNewYieldStatementFromReturn(cuRewrite, rewrite, (ReturnStatement)oldStatement);
} else {
newStatement= getNewStatementFromReturn(cuRewrite, rewrite, (ReturnStatement)oldStatement);
if (defaultFallThrough) {
newStatement2= getNewStatementFromReturn(cuRewrite, rewrite, (ReturnStatement)oldStatement);
}
}
} else if (forceOldStyle) {
newStatement= getNewYieldStatement(cuRewrite, rewrite, (ExpressionStatement)oldStatement);
} else {
newStatement= getNewStatementForCase(cuRewrite, rewrite, oldStatement);
if (defaultFallThrough) {
newStatement2= getNewStatementForCase(cuRewrite, rewrite, oldStatement);
}
}
newSwitchExpression.statements().add(newStatement);
if (defaultFallThrough) {
SwitchCase newSwitchCase= ast.newSwitchCase();
newSwitchCase.setSwitchLabeledRule(true);
newSwitchExpression.statements().add(newSwitchCase);
newSwitchExpression.statements().add(newStatement2);
defaultFallThrough= false;
}
} else {
Block newBlock= ast.newBlock();
int statementsLen= oldStatements.size();
Expand All @@ -419,6 +445,13 @@ public void rewriteAST(CompilationUnitRewrite cuRewrite, LinkedProposalModelCore
}
newBlock.statements().add(newStatement);
newSwitchExpression.statements().add(newBlock);
if (defaultFallThrough) {
SwitchCase newSwitchCase= ast.newSwitchCase();
newSwitchCase.setSwitchLabeledRule(true);
newSwitchCase.expressions().add(ast.newCaseDefaultExpression());
newSwitchExpression.statements().add(newSwitchCase);
newSwitchExpression.statements().add(newBlock);
}
}
if (needDuplicateDefault) {
needDuplicateDefault= false;
Expand Down
Loading

0 comments on commit 5b69fb7

Please sign in to comment.