[java] [switch expressions] avoid dbl work when checking types of switch return expressions

IJ-CR-14340

GitOrigin-RevId: 40e79767d794f7b7fcc9bc4d3930051a1698ea86
This commit is contained in:
Anna Kozlova
2021-09-28 19:15:38 +02:00
committed by intellij-monorepo-bot
parent 3434af89eb
commit 49edf8a29d
3 changed files with 19 additions and 12 deletions

View File

@@ -74,7 +74,6 @@ import java.util.*;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static com.intellij.util.ObjectUtils.tryCast;
@@ -876,8 +875,7 @@ public final class HighlightUtil {
return null;
}
static HighlightInfo checkYieldExpressionType(@NotNull PsiYieldStatement statement) {
PsiExpression expression = statement.getExpression();
static HighlightInfo checkYieldExpressionType(PsiExpression expression) {
if (expression != null && PsiType.VOID.equals(expression.getType())) {
String message = JavaErrorBundle.message("yield.void");
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(message).create();
@@ -1580,14 +1578,7 @@ public final class HighlightUtil {
@NotNull
static Collection<HighlightInfo> checkSwitchExpressionReturnTypeCompatible(@NotNull PsiSwitchExpression switchExpression) {
if (!PsiPolyExpressionUtil.isPolyExpression(switchExpression)) {
return PsiUtil.getSwitchResultExpressions(switchExpression).stream().map(expression -> {
if (PsiType.VOID.equals(expression.getType())) {
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
.range(expression)
.descriptionAndTooltip(JavaErrorBundle.message("yield.void")).create();
}
return null;
}).filter(Objects::nonNull).collect(Collectors.toList());
return Collections.emptyList();
}
List<HighlightInfo> infos = new ArrayList<>();
PsiType switchExpressionType = switchExpression.getType();

View File

@@ -470,7 +470,19 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
public void visitYieldStatement(PsiYieldStatement statement) {
super.visitYieldStatement(statement);
if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkYieldOutsideSwitchExpression(statement));
if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkYieldExpressionType(statement));
if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkYieldExpressionType(statement.getExpression()));
}
@Override
public void visitExpressionStatement(PsiExpressionStatement statement) {
super.visitExpressionStatement(statement);
PsiElement parent = statement.getParent();
if (parent instanceof PsiSwitchLabeledRuleStatement) {
PsiSwitchBlock switchBlock = ((PsiSwitchLabeledRuleStatement)parent).getEnclosingSwitchBlock();
if (switchBlock instanceof PsiSwitchExpression && !PsiPolyExpressionUtil.isPolyExpression((PsiExpression)switchBlock)) {
myHolder.add(HighlightUtil.checkYieldExpressionType(statement.getExpression()));
}
}
}
@Override

View File

@@ -110,6 +110,10 @@ class MyTest {
case 0 -> 42;
default -> <error descr="Expression type should not be 'void'">System.out.println(42)</error>;
};
<error descr="Cannot infer type: variable initializer is 'null'">var</error> rv1 = switch (0) {
default -> null;
};
}
static void test(boolean b, int i) {