From 3805d5155451ea2033d9408d9e974c4030f628bd Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 22 Jun 2016 10:35:59 +0300 Subject: [PATCH] subtyping constraint: apply capture conversion for captured wildcard bound according to the direct supertype of parameterized type specification --- .../com/intellij/psi/impl/JavaClassSupersImpl.java | 3 +++ .../constraints/StrictSubtypingConstraint.java | 3 ++- .../CapturedConversionDuringDirectSuperCheck.java | 14 ++++++++++++++ .../lambda/GraphInferenceHighlightingTest.java | 4 ++++ 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/CapturedConversionDuringDirectSuperCheck.java diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/JavaClassSupersImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/JavaClassSupersImpl.java index c6715b8cc1d4..b2939ec19fa6 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/JavaClassSupersImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/JavaClassSupersImpl.java @@ -94,6 +94,9 @@ public class JavaClassSupersImpl extends JavaClassSupers { } } } + else if (lowerBound instanceof PsiCapturedWildcardType) { + return processLowerBound(((PsiCapturedWildcardType)lowerBound).getUpperBound(), derivedClass, scope, derivedSubstitutor); + } return null; } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java index ef664e38cfc2..770c66081331 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java @@ -20,6 +20,7 @@ import com.intellij.psi.impl.source.resolve.graphInference.InferenceBound; import com.intellij.psi.impl.source.resolve.graphInference.InferenceSession; import com.intellij.psi.impl.source.resolve.graphInference.InferenceVariable; import com.intellij.psi.util.InheritanceUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import java.util.HashSet; @@ -133,7 +134,7 @@ public class StrictSubtypingConstraint implements ConstraintFormula { else if (myS instanceof PsiCapturedWildcardType) { final PsiType upperBound = ((PsiCapturedWildcardType)myS).getUpperBound(); if (upperBound instanceof PsiClassType) { - sType = (PsiClassType)upperBound; + sType = (PsiClassType)PsiUtil.captureToplevelWildcards(upperBound, ((PsiCapturedWildcardType)myS).getContext()); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/CapturedConversionDuringDirectSuperCheck.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/CapturedConversionDuringDirectSuperCheck.java new file mode 100644 index 000000000000..b45cdb562e65 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/graphInference/CapturedConversionDuringDirectSuperCheck.java @@ -0,0 +1,14 @@ +import java.util.List; + +class Test { + void f(List> list) { + foo(list.get(0)); + } + + private T foo(I id) { + return null; + } + + interface I { + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java index 62d5a4ae0720..5dafb947bfdd 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GraphInferenceHighlightingTest.java @@ -472,6 +472,10 @@ public class GraphInferenceHighlightingTest extends LightDaemonAnalyzerTestCase doTest(); } + public void testCapturedConversionDuringDirectSuperCheck() throws Exception { + doTest(); + } + private void doTest() throws Exception { doTest(false); }