From 568bb75fbcc08019b62574d229ce10acbcb7e8f6 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Sat, 29 Apr 2017 18:47:26 +0200 Subject: [PATCH] don't highlight part of poly conditional expression when it's type is not defined, would be highlighted on top level (IDEA-171431) --- .../daemon/impl/analysis/HighlightUtil.java | 4 ++++ .../ConditionalExpressionInIncompleteCall.java | 10 ++++++++++ .../daemon/lambda/GenericsHighlighting8Test.java | 4 ++++ 3 files changed, 18 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/ConditionalExpressionInIncompleteCall.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 6aeb04a5bbf9..156ffe31311b 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 @@ -50,6 +50,7 @@ import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; 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; import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl; import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl; import com.intellij.psi.javadoc.PsiDocComment; @@ -2540,6 +2541,9 @@ public class HighlightUtil extends HighlightUtilBase { PsiType thenType = thenExpression.getType(); if (thenType == null || type == null) return null; if (conditionalExpression.getType() == null) { + if (PsiUtil.isLanguageLevel8OrHigher(conditionalExpression) && PsiPolyExpressionUtil.isPolyExpression(conditionalExpression)) { + return null; + } // cannot derive type of conditional expression // elseType will never be cast-able to thenType, so no quick fix here return createIncompatibleTypeHighlightInfo(thenType, type, expression.getTextRange(), 0); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/ConditionalExpressionInIncompleteCall.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/ConditionalExpressionInIncompleteCall.java new file mode 100644 index 000000000000..6efc6cdc9ce5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/ConditionalExpressionInIncompleteCall.java @@ -0,0 +1,10 @@ + +class Test{ + void test() { + B b = new B(true == false ? "bar" : null); + } + + class B { + B(String c, String d ) {} + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index 1447275e3aef..e788e1529931 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -1024,4 +1024,8 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { public void testSameErasureForStaticMethodsInInterfaces() throws Exception { doTest(); } + + public void testConditionalExpressionInIncompleteCall() throws Exception { + doTest(); + } }