From d50cffbf0f7fbdea10acbb44a86ea5a4c33dd3f3 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 20 Nov 2018 18:57:22 +0100 Subject: [PATCH] [java] value breaks: basic highlighting (IDEA-196643) --- .../daemon/impl/analysis/HighlightUtil.java | 102 +++++++++++------- .../impl/analysis/HighlightVisitorImpl.java | 60 ++++++----- .../util/EnclosingLoopMatcherExpression.java | 21 ---- ...nclosingLoopOrSwitchMatcherExpression.java | 17 --- .../src/messages/JavaErrorMessages.properties | 5 + .../EnhancedSwitchUnreachable.java | 4 +- .../advHighlighting12/SwitchExpressions.java | 15 ++- .../advHighlighting12/ValueBreaks.java | 39 +++++++ .../advHighlighting6/UnsupportedFeatures.java | 4 + .../daemon/LightJava12HighlightingTest.kt | 1 + 10 files changed, 164 insertions(+), 104 deletions(-) delete mode 100644 java/java-analysis-impl/src/com/intellij/psi/util/EnclosingLoopMatcherExpression.java delete mode 100644 java/java-analysis-impl/src/com/intellij/psi/util/EnclosingLoopOrSwitchMatcherExpression.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/ValueBreaks.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 7f2ce845a476..0d8d399dec52 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -28,6 +28,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; +import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.source.resolve.JavaResolveUtil; import com.intellij.psi.impl.source.resolve.graphInference.InferenceSession; import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil; @@ -509,6 +510,15 @@ public class HighlightUtil extends HighlightUtilBase { return highlightInfo; } + @Nullable + static HighlightInfo checkReturnOutsideOfSwitchExpr(@NotNull PsiStatement statement) { + if (PsiImplUtil.findEnclosingSwitchOrLoop(statement) instanceof PsiSwitchExpression) { + String message = JavaErrorMessages.message("return.outside.switch.expr"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(message).create(); + } + + return null; + } @Nullable static HighlightInfo checkReturnStatementType(@NotNull PsiReturnStatement statement) { @@ -760,37 +770,66 @@ public class HighlightUtil extends HighlightUtilBase { } @Nullable - static HighlightInfo checkBreakOutsideLoop(@NotNull PsiBreakStatement statement) { - if (statement.getLabelIdentifier() == null) { - if (new PsiMatcherImpl(statement).ancestor(EnclosingLoopOrSwitchMatcherExpression.INSTANCE).getElement() == null) { - String description = JavaErrorMessages.message("break.outside.switch.or.loop"); - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(description).create(); - } - } - else { - // todo labeled + static HighlightInfo checkBreakOutsideSwitchOrLoop(@NotNull PsiBreakStatement statement) { + PsiElement enclosing = PsiImplUtil.findEnclosingSwitchOrLoop(statement); + if (enclosing == null) { + String message = JavaErrorMessages.message("break.outside.switch.or.loop"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(message).create(); } + return null; } + @Nullable + static HighlightInfo checkValueBreakExpression(@NotNull PsiBreakStatement statement, @Nullable PsiExpression expression) { + PsiElement enclosing = PsiImplUtil.findEnclosingSwitchOrLoop(statement); + if (enclosing instanceof PsiSwitchExpression) { + if (expression == null) { + String message = JavaErrorMessages.message("value.break.missing"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(message).create(); + } + if (PsiTreeUtil.isAncestor(statement.findExitedElement(), enclosing, true)) { + String message = JavaErrorMessages.message("break.outside.switch.expr"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(message).create(); + } + } + else if (expression != null && (!PsiImplUtil.isPlainReference(expression) || ((PsiReferenceExpression)expression).resolve() instanceof PsiVariable)) { + String message = JavaErrorMessages.message("value.break.unexpected"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(message).create(); + } + + return null; + } @Nullable static HighlightInfo checkContinueOutsideLoop(@NotNull PsiContinueStatement statement) { - if (statement.getLabelIdentifier() == null) { - if (new PsiMatcherImpl(statement).ancestor(EnclosingLoopMatcherExpression.INSTANCE).getElement() == null) { - String description = JavaErrorMessages.message("continue.outside.loop"); - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(description).create(); - } + if (PsiImplUtil.findEnclosingLoop(statement) == null) { + String message = JavaErrorMessages.message("continue.outside.loop"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(message).create(); } - else { - PsiStatement exitedStatement = statement.findContinuedStatement(); - if (exitedStatement == null) return null; - if (!(exitedStatement instanceof PsiForStatement) && !(exitedStatement instanceof PsiWhileStatement) && - !(exitedStatement instanceof PsiDoWhileStatement) && !(exitedStatement instanceof PsiForeachStatement)) { - String description = JavaErrorMessages.message("not.loop.label", statement.getLabelIdentifier().getText()); - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(description).create(); + + return null; + } + + @Nullable + static HighlightInfo checkContinueTarget(@NotNull PsiContinueStatement statement, @NotNull PsiIdentifier label, @NotNull LanguageLevel level) { + PsiStatement continuedStatement = statement.findContinuedStatement(); + if (continuedStatement == null) { + String message = JavaErrorMessages.message("unresolved.label", label.getText()); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(label).descriptionAndTooltip(message).create(); + } + if (!(continuedStatement instanceof PsiLoopStatement)) { + String message = JavaErrorMessages.message("not.loop.label", label.getText()); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(message).create(); + } + if (level.isAtLeast(LanguageLevel.JDK_12_PREVIEW)) { + PsiElement enclosing = PsiImplUtil.findEnclosingSwitchOrLoop(statement); + if (enclosing instanceof PsiSwitchExpression && PsiTreeUtil.isAncestor(continuedStatement, enclosing, true)) { + String message = JavaErrorMessages.message("continue.outside.switch.expr"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip(message).create(); } } + return null; } @@ -1812,8 +1851,7 @@ public class HighlightUtil extends HighlightUtilBase { if (resolved == null || resolved instanceof PsiVariable) return null; PsiElement parent = expression.getParent(); - // String.class or String() are both correct - if (parent instanceof PsiReferenceExpression || parent instanceof PsiMethodCallExpression) return null; + if (parent instanceof PsiReferenceExpression || parent instanceof PsiMethodCallExpression || parent instanceof PsiBreakStatement) return null; String description = JavaErrorMessages.message("expression.expected"); HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(description).create(); @@ -2705,20 +2743,6 @@ public class HighlightUtil extends HighlightUtilBase { return checkMustBeThrowable(type, context, false); } - - @Nullable - static HighlightInfo checkLabelDefined(@Nullable PsiIdentifier labelIdentifier, @Nullable PsiStatement exitedStatement) { - if (labelIdentifier == null) return null; - String label = labelIdentifier.getText(); - if (label == null) return null; - if (exitedStatement == null) { - String message = JavaErrorMessages.message("unresolved.label", label); - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(labelIdentifier).descriptionAndTooltip(message).create(); - } - return null; - } - - @Nullable static HighlightInfo checkReference(@NotNull PsiJavaCodeReferenceElement ref, @NotNull JavaResolveResult result, @@ -2761,6 +2785,9 @@ public class HighlightUtil extends HighlightUtilBase { String t2 = format(ObjectUtils.notNull(results[1].getElement())); description = JavaErrorMessages.message("ambiguous.reference", refName.getText(), t1, t2); } + else if (refParent instanceof PsiBreakStatement && !(PsiImplUtil.findEnclosingSwitchOrLoop(refParent) instanceof PsiSwitchExpression)) { + description = JavaErrorMessages.message("unresolved.label", refName.getText()); + } else { description = JavaErrorMessages.message("cannot.resolve.symbol", refName.getText()); } @@ -2838,6 +2865,7 @@ public class HighlightUtil extends HighlightUtilBase { if (element instanceof PsiClass) return formatClass((PsiClass)element); if (element instanceof PsiMethod) return JavaHighlightUtil.formatMethod((PsiMethod)element); if (element instanceof PsiField) return formatField((PsiField)element); + if (element instanceof PsiLabeledStatement) return ((PsiLabeledStatement)element).getName() + ':'; return ElementDescriptionUtil.getElementDescription(element, HighlightUsagesDescriptionLocation.INSTANCE); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index d9a5697c093f..3104de13eac6 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -24,6 +24,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.controlFlow.ControlFlowUtil; +import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.source.javadoc.PsiDocMethodOrFieldRef; import com.intellij.psi.impl.source.resolve.JavaResolveUtil; import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil; @@ -398,8 +399,13 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh @Override public void visitBreakStatement(PsiBreakStatement statement) { super.visitBreakStatement(statement); - if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkLabelDefined(statement.getLabelIdentifier(), statement.findExitedStatement())); - if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkBreakOutsideLoop(statement)); + PsiExpression expression = statement.getExpression(); + if (!myHolder.hasErrorResults() && expression == null) { + myHolder.add(HighlightUtil.checkBreakOutsideSwitchOrLoop(statement)); + } + if (!myHolder.hasErrorResults() && myLanguageLevel.isAtLeast(LanguageLevel.JDK_12_PREVIEW)) { + myHolder.add(HighlightUtil.checkValueBreakExpression(statement, expression)); + } } @Override @@ -443,9 +449,10 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh public void visitContinueStatement(PsiContinueStatement statement) { super.visitContinueStatement(statement); if (!myHolder.hasErrorResults()) { - myHolder.add(HighlightUtil.checkLabelDefined(statement.getLabelIdentifier(), statement.findContinuedStatement())); + PsiIdentifier label = statement.getLabelIdentifier(); + myHolder.add(label == null ? HighlightUtil.checkContinueOutsideLoop(statement) + : HighlightUtil.checkContinueTarget(statement, label, myLanguageLevel)); } - if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkContinueOutsideLoop(statement)); } @Override @@ -519,21 +526,21 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh @Override public void visitExpression(PsiExpression expression) { ProgressManager.checkCanceled(); // visitLiteralExpression is invoked very often in array initializers - super.visitExpression(expression); - PsiType type = expression.getType(); - if (myHolder.add(HighlightUtil.checkMustBeBoolean(expression, type))) return; - - if (expression instanceof PsiArrayAccessExpression) { - myHolder.add(HighlightUtil.checkValidArrayAccessExpression((PsiArrayAccessExpression)expression)); - } PsiElement parent = expression.getParent(); - if (parent instanceof PsiNewExpression - && ((PsiNewExpression)parent).getQualifier() != expression - && ((PsiNewExpression)parent).getArrayInitializer() != expression) { - // like in 'new String["s"]' - myHolder.add(HighlightUtil.checkAssignability(PsiType.INT, expression.getType(), expression, expression)); + PsiType type = expression.getType(); + + if (!myHolder.hasErrorResults() && parent instanceof PsiBreakStatement && !PsiImplUtil.isPlainReference(expression)) { + myHolder.add(checkFeature(expression, Feature.SWITCH_EXPRESSION)); + } + if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkMustBeBoolean(expression, type)); + if (!myHolder.hasErrorResults() && expression instanceof PsiArrayAccessExpression) { + myHolder.add(HighlightUtil.checkValidArrayAccessExpression((PsiArrayAccessExpression)expression)); + } + if (!myHolder.hasErrorResults() && parent instanceof PsiNewExpression && + ((PsiNewExpression)parent).getQualifier() != expression && ((PsiNewExpression)parent).getArrayInitializer() != expression) { + myHolder.add(HighlightUtil.checkAssignability(PsiType.INT, expression.getType(), expression, expression)); // like in 'new String["s"]' } if (!myHolder.hasErrorResults()) myHolder.add(HighlightControlFlowUtil.checkCannotWriteToFinal(expression,myFile)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkVariableExpected(expression)); @@ -542,15 +549,10 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkAssertOperatorTypes(expression, type)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkSynchronizedExpressionType(expression, type, myFile)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkConditionalExpressionBranchTypesMatch(expression, type)); - if (!myHolder.hasErrorResults() - && parent instanceof PsiThrowStatement - && ((PsiThrowStatement)parent).getException() == expression && type != null) { + if (!myHolder.hasErrorResults() && parent instanceof PsiThrowStatement && ((PsiThrowStatement)parent).getException() == expression && type != null) { myHolder.add(HighlightUtil.checkMustBeThrowable(type, expression, true)); } - - if (!myHolder.hasErrorResults()) { - myHolder.add(AnnotationsHighlightUtil.checkConstantExpression(expression)); - } + if (!myHolder.hasErrorResults()) myHolder.add(AnnotationsHighlightUtil.checkConstantExpression(expression)); if (!myHolder.hasErrorResults() && parent instanceof PsiForeachStatement && ((PsiForeachStatement)parent).getIteratedValue() == expression) { myHolder.add(GenericsHighlightUtil.checkForeachExpressionTypeIsIterable(expression)); } @@ -1558,10 +1560,16 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh @Override public void visitReturnStatement(PsiReturnStatement statement) { - try { - myHolder.add(HighlightUtil.checkReturnStatementType(statement)); + super.visitStatement(statement); + if (!myHolder.hasErrorResults() && myLanguageLevel.isAtLeast(LanguageLevel.JDK_12_PREVIEW)) { + myHolder.add(HighlightUtil.checkReturnOutsideOfSwitchExpr(statement)); + } + if (!myHolder.hasErrorResults()) { + try { + myHolder.add(HighlightUtil.checkReturnStatementType(statement)); + } + catch (IndexNotReadyException ignore) { } } - catch (IndexNotReadyException ignore) { } } @Override diff --git a/java/java-analysis-impl/src/com/intellij/psi/util/EnclosingLoopMatcherExpression.java b/java/java-analysis-impl/src/com/intellij/psi/util/EnclosingLoopMatcherExpression.java deleted file mode 100644 index 189d3bd02a8c..000000000000 --- a/java/java-analysis-impl/src/com/intellij/psi/util/EnclosingLoopMatcherExpression.java +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.psi.util; - -import com.intellij.psi.*; - -/** - * @author max - */ -public class EnclosingLoopMatcherExpression implements PsiMatcherExpression { - public static final PsiMatcherExpression INSTANCE = new EnclosingLoopMatcherExpression(); - - @Override - public Boolean match(PsiElement element) { - if (element instanceof PsiForStatement) return Boolean.TRUE; - if (element instanceof PsiForeachStatement) return Boolean.TRUE; - if (element instanceof PsiWhileStatement) return Boolean.TRUE; - if (element instanceof PsiDoWhileStatement) return Boolean.TRUE; - if (element instanceof PsiMethod || element instanceof PsiClassInitializer || element instanceof PsiLambdaExpression) return null; - return Boolean.FALSE; - } -} \ No newline at end of file diff --git a/java/java-analysis-impl/src/com/intellij/psi/util/EnclosingLoopOrSwitchMatcherExpression.java b/java/java-analysis-impl/src/com/intellij/psi/util/EnclosingLoopOrSwitchMatcherExpression.java deleted file mode 100644 index e6ad03660dc9..000000000000 --- a/java/java-analysis-impl/src/com/intellij/psi/util/EnclosingLoopOrSwitchMatcherExpression.java +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -package com.intellij.psi.util; - -import com.intellij.psi.*; - -/** - * @author max - */ -public class EnclosingLoopOrSwitchMatcherExpression extends EnclosingLoopMatcherExpression { - public static final PsiMatcherExpression INSTANCE = new EnclosingLoopOrSwitchMatcherExpression(); - - @Override - public Boolean match(PsiElement element) { - if (element instanceof PsiSwitchBlock) return Boolean.TRUE; - return super.match(element); - } -} \ No newline at end of file diff --git a/java/java-psi-impl/src/messages/JavaErrorMessages.properties b/java/java-psi-impl/src/messages/JavaErrorMessages.properties index cc985b3b872a..b818ad6c3aea 100644 --- a/java/java-psi-impl/src/messages/JavaErrorMessages.properties +++ b/java/java-psi-impl/src/messages/JavaErrorMessages.properties @@ -223,6 +223,7 @@ unary.operator.not.applicable=Operator ''{0}'' cannot be applied to ''{1}'' return.outside.method=Return outside method return.from.void.method=Cannot return a value from a method with void result type missing.return.value=Missing return value +return.outside.switch.expr=Return outside of enclosing switch expression #{0} - exceptions list (comma separated), {1} - exceptions count in the list, {2} - exception source unhandled.exceptions=Unhandled {1, choice, 0#exception|2#exceptions}: {0} @@ -230,7 +231,11 @@ unhandled.close.exceptions=Unhandled {1, choice, 0#exception|2#exceptions} from variable.already.defined=Variable ''{0}'' is already defined in the scope break.outside.switch.or.loop=Break outside switch or loop +value.break.unexpected=Value break outside switch expression +value.break.missing=Missing break value +break.outside.switch.expr=Break outside of enclosing switch expression continue.outside.loop=Continue outside of loop +continue.outside.switch.expr=Continue outside of enclosing switch expression not.loop.label=Not a loop label: ''{0}'' incompatible.modifiers=Illegal combination of modifiers: ''{0}'' and ''{1}'' modifier.not.allowed=Modifier ''{0}'' not allowed here diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/EnhancedSwitchUnreachable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/EnhancedSwitchUnreachable.java index 8702dc655179..034238b8db3f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/EnhancedSwitchUnreachable.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/EnhancedSwitchUnreachable.java @@ -101,8 +101,8 @@ class C { int n; return 2; n = switch(s) { - case "a": n= 1;break; - default: n= 0; + case "a": n = 1; break 1; + default: n = 0; break 0; }; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/SwitchExpressions.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/SwitchExpressions.java index c77e80f9436b..c448cad483fb 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/SwitchExpressions.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/SwitchExpressions.java @@ -12,7 +12,7 @@ class SwitchExpressions { System.out.println(switch (new Random().nextInt()) { case 0 -> throw new IllegalStateException("no args"); - case 1: break; + case 1: break "lone"; }); System.out.println( @@ -44,5 +44,18 @@ class SwitchExpressions { case E1 -> 1; case E2 -> 2; }); + + lab: while (true) { + switch (new Random().nextInt()) { + case -1: return; + case -2: continue lab; + default: break lab; + } + System.out.println(switch (new Random().nextInt()) { + case -1: return; + case -2: continue lab; + default: break lab; + }); + } } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/ValueBreaks.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/ValueBreaks.java new file mode 100644 index 000000000000..9ceec4f5f5e5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting12/ValueBreaks.java @@ -0,0 +1,39 @@ +class ValueBreaks { + static final int ref = -1; + + void m() { + l1: break l1; + + break; + break wtf; + break 42; + + switch (0) { + case 0: break 42; + case 1: break ref; + case 2: break wtf; + case 3: ref: break ref; + }; + + sink(switch (0) { + case 0 -> { while (true) break 42; } + case 1 -> { while (true) break ref; } + case 2 -> { while (true) break wtf; } + case 3 -> { break ref; } + case 4 -> { break wtf; } + default -> throw new RuntimeException(); + }); + + ref: sink(switch (0) { + default: break ref; + }); + + while (true) { + sink(switch (0) { + default: break; + }); + } + } + + private static void sink(Object o) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/UnsupportedFeatures.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/UnsupportedFeatures.java index 8a9106d62f25..0eff76328b75 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/UnsupportedFeatures.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/UnsupportedFeatures.java @@ -35,6 +35,10 @@ class UnsupportedFeatures { System.out.println(switch (list.size()) { default -> "whoa!"; }); + switch (list.size()) { + case 0: break null; + case 1: break boo; + } } void f(Object this) { } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightJava12HighlightingTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightJava12HighlightingTest.kt index b8c9daf35335..d2ac4d1b8c78 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightJava12HighlightingTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightJava12HighlightingTest.kt @@ -10,6 +10,7 @@ class LightJava12HighlightingTest : LightCodeInsightFixtureTestCase() { fun testEnhancedSwitchStatements() = doTest() fun testSwitchExpressions() = doTest() + fun testValueBreaks() = doTest() fun testSwitchNumericPromotion() = doTest() fun testSimpleInferenceCases() = doTest() fun testEnhancedSwitchDefinitelyAssigned() = doTest()