Skip to content

Commit a5993e2

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 f439f9c commit a5993e2

File tree

2 files changed

+77
-6
lines changed

2 files changed

+77
-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+
int start = getStartPosition(getLast(statements));
1679+
if (getLast(statements) instanceof 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

+70
Original file line numberDiff line numberDiff line change
@@ -2235,6 +2235,76 @@ 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 Test(int foo) {}
2255+
2256+
public int invoke() {
2257+
return 123;
2258+
}
2259+
2260+
public int foo(Side side) {
2261+
switch (side) {
2262+
case HEART:
2263+
case DIAMOND:
2264+
return invoke();
2265+
case SPADE:
2266+
System.out.println("hello");
2267+
throw new RuntimeException();
2268+
default:
2269+
throw new NullPointerException();
2270+
}
2271+
}
2272+
}
2273+
""")
2274+
.addOutputLines(
2275+
"Test.java",
2276+
"""
2277+
class Test {
2278+
enum Side {
2279+
HEART,
2280+
SPADE,
2281+
DIAMOND,
2282+
CLUB
2283+
};
2284+
2285+
public Test(int foo) {}
2286+
2287+
public int invoke() {
2288+
return 123;
2289+
}
2290+
2291+
public int foo(Side side) {
2292+
return switch (side) {
2293+
case HEART, DIAMOND -> invoke();
2294+
case SPADE -> {
2295+
System.out.println("hello");
2296+
throw new RuntimeException();
2297+
}
2298+
default -> throw new NullPointerException();
2299+
};
2300+
}
2301+
}
2302+
""")
2303+
.setArgs("-XepOpt:StatementSwitchToExpressionSwitch:EnableReturnSwitchConversion")
2304+
.setFixChooser(StatementSwitchToExpressionSwitchTest::assertOneFixAndChoose)
2305+
.doTest();
2306+
}
2307+
22382308
@Test
22392309
public void switchByEnum_returnSwitchWithShouldNeverHappen_error() {
22402310

0 commit comments

Comments
 (0)