Skip to content

Commit 98e547c

Browse files
markhbradyError Prone Team
authored and
Error Prone Team
committed
[StatementSwitchToExpressionSwitch]: for return switch conversion, fix incorrect assumption that last of multiple statements is always a return
PiperOrigin-RevId: 735952238
1 parent 9546ee4 commit 98e547c

File tree

2 files changed

+65
-6
lines changed

2 files changed

+65
-6
lines changed

core/src/main/java/com/google/errorprone/bugpatterns/StatementSwitchToExpressionSwitch.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -1675,12 +1675,13 @@ private static String transformReturnOrThrowBlock(
16751675
int offset = transformedBlockBuilder.length();
16761676
transformedBlockBuilder.append(state.getSourceCode(), codeBlockStart, codeBlockEnd);
16771677
transformedBlockBuilder.append("\n}");
1678-
ReturnTree returnTree = (ReturnTree) getLast(statements);
1679-
int start = getStartPosition(returnTree);
1680-
transformedBlockBuilder.replace(
1681-
offset + start - codeBlockStart,
1682-
offset + start - codeBlockStart + "return".length(),
1683-
"yield");
1678+
if (getLast(statements) instanceof ReturnTree returnTree) {
1679+
int start = getStartPosition(returnTree);
1680+
transformedBlockBuilder.replace(
1681+
offset + start - codeBlockStart,
1682+
offset + start - codeBlockStart + "return".length(),
1683+
"yield");
1684+
}
16841685
} else if (statements.size() == 1 && statements.get(0).getKind().equals(RETURN)) {
16851686
// For "return x;", we want to take source starting after the "return"
16861687
int unused = extractLhsComments(caseTree, state, transformedBlockBuilder);

core/src/test/java/com/google/errorprone/bugpatterns/StatementSwitchToExpressionSwitchTest.java

+58
Original file line numberDiff line numberDiff line change
@@ -2235,6 +2235,64 @@ public int foo(Side side) {
22352235
.doTest();
22362236
}
22372237

2238+
@Test
2239+
public void switchByEnum_multipleStatementsAndTheLastNotReturn_error() {
2240+
2241+
// Check correct generated code
2242+
refactoringHelper
2243+
.addInputLines(
2244+
"Test.java",
2245+
"""
2246+
class Test {
2247+
enum Side {
2248+
HEART,
2249+
SPADE,
2250+
DIAMOND,
2251+
CLUB
2252+
};
2253+
2254+
public int foo(Side side) {
2255+
switch (side) {
2256+
case HEART:
2257+
case DIAMOND:
2258+
return 1;
2259+
case SPADE:
2260+
System.out.println("hello");
2261+
throw new RuntimeException();
2262+
default:
2263+
throw new NullPointerException();
2264+
}
2265+
}
2266+
}
2267+
""")
2268+
.addOutputLines(
2269+
"Test.java",
2270+
"""
2271+
class Test {
2272+
enum Side {
2273+
HEART,
2274+
SPADE,
2275+
DIAMOND,
2276+
CLUB
2277+
};
2278+
2279+
public int foo(Side side) {
2280+
return switch (side) {
2281+
case HEART, DIAMOND -> 1;
2282+
case SPADE -> {
2283+
System.out.println("hello");
2284+
throw new RuntimeException();
2285+
}
2286+
default -> throw new NullPointerException();
2287+
};
2288+
}
2289+
}
2290+
""")
2291+
.setArgs("-XepOpt:StatementSwitchToExpressionSwitch:EnableReturnSwitchConversion")
2292+
.setFixChooser(StatementSwitchToExpressionSwitchTest::assertOneFixAndChoose)
2293+
.doTest();
2294+
}
2295+
22382296
@Test
22392297
public void switchByEnum_returnSwitchWithShouldNeverHappen_error() {
22402298

0 commit comments

Comments
 (0)