From a9d3854aa5a29b248bc68a6338ba2d91fe5c7342 Mon Sep 17 00:00:00 2001 From: Ilyas Selimov Date: Tue, 20 Jul 2021 15:18:09 +0700 Subject: [PATCH] IDEA-273932 - added highlighting for incorrect guarding expressions within guarded patterns GitOrigin-RevId: 9ccee2cd8d848cc8ac1896eaa13781e4700e00d3 --- .../impl/analysis/HighlightVisitorImpl.java | 10 ++++++ .../GuardedPatterns.java | 31 +++++++++++++++++++ ...ightPatternsForSwitchHighlightingTest.java | 4 +++ 3 files changed, 45 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/GuardedPatterns.java 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 fb650e30e219..1a7cb38ecc74 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 @@ -2026,6 +2026,16 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh public void visitGuardedPattern(PsiGuardedPattern pattern) { super.visitGuardedPattern(pattern); myHolder.add(checkFeature(pattern, HighlightingFeature.GUARDED_AND_PARENTHESIZED_PATTERNS)); + if (myHolder.hasErrorResults()) return; + PsiExpression guardingExpr = pattern.getGuardingExpression(); + if (guardingExpr == null) return; + // 14.30.1 Kinds of Patterns GuardedPattern: PrimaryPattern && ConditionalAndExpression + // 15.23. ConditionalAndExpression: Each operand of the conditional-and operator must be of type boolean or Boolean, or a compile-time error occurs. + if (!TypeConversionUtil.isBooleanType(guardingExpr.getType())) { + String message = JavaErrorBundle.message("incompatible.types", JavaHighlightUtil.formatType(PsiType.BOOLEAN), + JavaHighlightUtil.formatType(guardingExpr.getType())); + myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(guardingExpr).descriptionAndTooltip(message).create()); + } } @Override diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/GuardedPatterns.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/GuardedPatterns.java new file mode 100644 index 000000000000..3f3e39a923a1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/GuardedPatterns.java @@ -0,0 +1,31 @@ +class Test { + void test(Object o, Integer integer) { + switch (o) { + case String s && integer -> System.out.println(); + default -> {} + } + + switch (o) { + case String s && isBool() -> System.out.println(); + default -> {} + } + + switch (o) { + case Integer i && isInt(): + break; + default: + break; + } + + switch (o) { + case Integer i && null: + break; + default: + break; + } + } + + private native boolean isBool(); + + private native int isInt(); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java index 3ce54226cf6c..187f7133d045 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java @@ -59,6 +59,10 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight doTest(); } + public void testGuardedPatterns() { + doTest(); + } + public void testIdentifierHighlighterForPatternVariable() { PsiFile file = myFixture.configureByFile(getTestName(false) + ".java"); PsiElement element = myFixture.getElementAtCaret();