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