diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java index 5b0a7a82b43e..67b59a40ca36 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java @@ -498,6 +498,9 @@ public final class HighlightMethodUtil { if (mismatchedExpressions.size() == 1) { toolTip = createOneArgMismatchTooltip(candidateInfo, mismatchedExpressions, expressions, parameters); } + else if (mismatchedExpressions.isEmpty()) { + toolTip = description; + } if (toolTip == null) { toolTip = createMismatchedArgumentsHtmlTooltip(candidateInfo, list); } 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 22d246ffba94..c1eb47b4fb1e 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 @@ -1899,13 +1899,6 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh public void visitConditionalExpression(PsiConditionalExpression expression) { super.visitConditionalExpression(expression); if (myLanguageLevel.isAtLeast(LanguageLevel.JDK_1_8) && PsiPolyExpressionUtil.isPolyExpression(expression)) { - PsiElement element = PsiUtil.skipParenthesizedExprUp(expression.getParent()); - if (element instanceof PsiExpressionList) { - PsiElement parent = element.getParent(); - if (parent instanceof PsiCall && !((PsiCall)parent).resolveMethodGenerics().isValidResult()) { - return; - } - } final PsiExpression thenExpression = expression.getThenExpression(); final PsiExpression elseExpression = expression.getElseExpression(); if (thenExpression != null && elseExpression != null) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java index 36a39fb5aa18..1ade90cd960e 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiConditionalExpressionImpl.java @@ -32,6 +32,8 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import org.jetbrains.annotations.NotNull; +import java.util.Objects; + public class PsiConditionalExpressionImpl extends ExpressionPsiElement implements PsiConditionalExpression { private static final Logger LOG = Logger.getInstance(PsiConditionalExpressionImpl.class); @@ -64,18 +66,17 @@ public class PsiConditionalExpressionImpl extends ExpressionPsiElement implement PsiExpression expr2 = getElseExpression(); PsiType type1 = expr1 == null ? null : expr1.getType(); PsiType type2 = expr2 == null ? null : expr2.getType(); - if (type1 == null) return type2; - if (type2 == null) return type1; - - if (type1.equals(type2)) return type1; + if (Objects.equals(type1, type2)) return type1; if (PsiUtil.isLanguageLevel8OrHigher(this) && PsiPolyExpressionUtil.isPolyExpression(this)) { //15.25.3 Reference Conditional Expressions // The type of a poly reference conditional expression is the same as its target type. PsiType targetType = InferenceSession.getTargetType(this); - if (MethodCandidateInfo.isOverloadCheck(PsiUtil.skipParenthesizedExprUp(this.getParent()))) { + if (MethodCandidateInfo.isOverloadCheck()) { return targetType != null && + type1 != null && + type2 != null && targetType.isAssignableFrom(type1) && targetType.isAssignableFrom(type2) ? targetType : null; } @@ -85,6 +86,9 @@ public class PsiConditionalExpressionImpl extends ExpressionPsiElement implement } } + if (type1 == null) return type2; + if (type2 == null) return type1; + final int typeRank1 = TypeConversionUtil.getTypeRank(type1); final int typeRank2 = TypeConversionUtil.getTypeRank(type2); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting8/NestedConditionalWithOverloads.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting8/NestedConditionalWithOverloads.java new file mode 100644 index 000000000000..b3ac1f40e07f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting8/NestedConditionalWithOverloads.java @@ -0,0 +1,14 @@ +class MyTest { + + static void n(boolean f) { + m(f ? (f ? 0 : "-") : ""); + m(f ? 0 : ""); + m1(f ? (f ? 0 : "-") : ""); + m1(f ? 0 : ""); + } + + static void m(String s) {} + static void m(Object o) {} + + static void m1(String o) {} +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/redundantCast/ConditionalNoType.java b/java/java-tests/testData/inspection/redundantCast/ConditionalNoType.java index 4ac4b68e4933..e74156e50b44 100644 --- a/java/java-tests/testData/inspection/redundantCast/ConditionalNoType.java +++ b/java/java-tests/testData/inspection/redundantCast/ConditionalNoType.java @@ -3,6 +3,6 @@ class X { void foo(String str) {} void test(Object obj, boolean b) { - foo((Object)(b ? obj : ())); + foo((Object)(b ? obj : ())); } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk8Test.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk8Test.java index 243e65369bc8..cd9fdac78da6 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk8Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk8Test.java @@ -53,4 +53,5 @@ public class LightAdvHighlightingJdk8Test extends LightDaemonAnalyzerTestCase { } public void testNoArraySuperType() { doTest(true, true);} public void testCaptureItself() { doTest(true, true); } + public void testNestedConditionalWithOverloads() { doTest(true, true); } } \ No newline at end of file