diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index 51498ba384e8..27ae57350355 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -992,8 +992,14 @@ public class InferenceSession { } return false; } - for (PsiType psiType : classType.getParameters()) { - if (!psiType.accept(this)) return false; + PsiClassType.ClassResolveResult result = classType.resolveGenerics(); + PsiClass aClass = result.getElement(); + if (aClass != null) { + PsiSubstitutor substitutor = result.getSubstitutor(); + for (PsiTypeParameter typeParameter : PsiUtil.typeParametersIterable(aClass)) { + PsiType psiType = substitutor.substitute(typeParameter); + if (psiType != null && !psiType.accept(this)) return false; + } } return true; } 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 9773c2fb3c9a..6250e2d24f62 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 @@ -150,18 +150,19 @@ public class StrictSubtypingConstraint implements ConstraintFormula { if (SClass == null) return false; + if (((PsiClassType)myT).isRaw()) { + return InheritanceUtil.isInheritorOrSelf(SClass, CClass, true); + } + PsiSubstitutor substitutor = SResult.getSubstitutor(); for (PsiTypeParameter typeParameter : SClass.getTypeParameters()) { substitutor = substitutor.put(typeParameter, substitutor.substituteWithBoundsPromotion(typeParameter)); } - if (((PsiClassType)myT).isRaw()) { - return InheritanceUtil.isInheritorOrSelf(SClass, CClass, true); - } final PsiSubstitutor tSubstitutor = TResult.getSubstitutor(); final PsiSubstitutor sSubstitutor = TypeConversionUtil.getClassSubstitutor(CClass, SClass, substitutor); if (sSubstitutor != null) { - for (PsiTypeParameter parameter : CClass.getTypeParameters()) { + for (PsiTypeParameter parameter : PsiUtil.typeParametersIterable(CClass)) { final PsiType tSubstituted = tSubstitutor.substitute(parameter); final PsiType sSubstituted = sSubstitutor.substitute(parameter); if (tSubstituted == null ^ sSubstituted == null) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/TypeEqualityConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/TypeEqualityConstraint.java index 5ce3b2b6376a..813968f67ed9 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/TypeEqualityConstraint.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/TypeEqualityConstraint.java @@ -21,6 +21,7 @@ import com.intellij.psi.*; 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.PsiUtil; import java.util.List; @@ -98,7 +99,7 @@ public class TypeEqualityConstraint implements ConstraintFormula { if (tClass != null && tClass.getManager().areElementsEquivalent(tClass, sResult.getElement())) { final PsiSubstitutor tSubstitutor = tResult.getSubstitutor(); final PsiSubstitutor sSubstitutor = sResult.getSubstitutor(); - for (PsiTypeParameter typeParameter : tClass.getTypeParameters()) { + for (PsiTypeParameter typeParameter : PsiUtil.typeParametersIterable(tClass)) { final PsiType tSubstituted = tSubstitutor.substitute(typeParameter); final PsiType sSubstituted = sSubstitutor.substitute(typeParameter); if (tSubstituted != null && sSubstituted != null) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/NonGenericInnerOfGenericOuter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/NonGenericInnerOfGenericOuter.java new file mode 100644 index 000000000000..b31062b8c43d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/NonGenericInnerOfGenericOuter.java @@ -0,0 +1,60 @@ + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +class OuterClass { + private class InnerClass {} + + private static void someMethod(OuterClass.InnerClass inner) {} + + static void callSomeMethod(OuterClass.InnerClass inner) { + someMethod(inner); + } +} + +class Outer { + public static Outer loopback(Outer.Inner u){ + return foo(u); + } + private static Outer foo(Outer.Inner u){ + return null; + } + private class Inner{} +} + + +class Outer1 { + public static void loopback(List.Inner> u){ + Outer1.Inner a = foo(u); + } + private static Outer1.Inner foo(List.Inner> u){ + return null; + } + private class Inner {} +} + +class Outer2 { + public static void loopback(List.Inner> u){ + Outer2.Inner a = foo(u); + } + + private static Outer2.Inner foo(List.Inner> u){ + return null; + } + private class Inner {} +} + + +class Outer3 { + { + bar(Outer3.Inner::new, new ArrayList<>()); + bar(Inner::new, new ArrayList<>()); + } + + private void bar(final Supplier.Inner> s, List l) { + + } + + private class Inner {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/GenericsHighlighting8Test.java index 9d457a196fe8..9f0e3061d8ad 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/GenericsHighlighting8Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/lambda/GenericsHighlighting8Test.java @@ -1013,6 +1013,8 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase { doTest(); } + public void testNonGenericInnerOfGenericOuter() { doTest(); } + public void testTypeParameterBoundsWithSubstitutionWhenMethodHierarchyIsChecked() throws Exception { doTest(); }