ensure bounds are promoted on derived type otherwise bounds from super could appear... appcode/171.666 clion/171.667
authorAnna.Kozlova <anna.kozlova@jetbrains.com>
Wed, 2 Nov 2016 14:43:49 +0000 (15:43 +0100)
committerAnna.Kozlova <anna.kozlova@jetbrains.com>
Wed, 2 Nov 2016 14:51:14 +0000 (15:51 +0100)
java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java
java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/BoundsPromotionForDerivedType.java [new file with mode: 0644]
java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java

index 115a67f4d9cecf991b3f8fcf5acc9fd175d065a4..298228c3f40848a3a9bace34a6aa54f8486713a0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2016 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,7 +20,6 @@ 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;
@@ -141,15 +140,23 @@ public class StrictSubtypingConstraint implements ConstraintFormula {
         if (sType == null) return false;
         final PsiClassType.ClassResolveResult SResult = sType.resolveGenerics();
         PsiClass SClass = SResult.getElement();
+
+        if (SClass == null) return false;
+
+        PsiSubstitutor substitutor = SResult.getSubstitutor();
+        for (PsiTypeParameter typeParameter : SClass.getTypeParameters()) {
+          substitutor = substitutor.put(typeParameter, substitutor.substituteWithBoundsPromotion(typeParameter));
+        }
+
         if (((PsiClassType)myT).isRaw()) {
-          return SClass != null && InheritanceUtil.isInheritorOrSelf(SClass, CClass, true);
+          return InheritanceUtil.isInheritorOrSelf(SClass, CClass, true);
         }
         final PsiSubstitutor tSubstitutor = TResult.getSubstitutor();
-        final PsiSubstitutor sSubstitutor = SClass != null ? TypeConversionUtil.getClassSubstitutor(CClass, SClass, SResult.getSubstitutor()) : null;
+        final PsiSubstitutor sSubstitutor = TypeConversionUtil.getClassSubstitutor(CClass, SClass, substitutor);
         if (sSubstitutor != null) {
           for (PsiTypeParameter parameter : CClass.getTypeParameters()) {
             final PsiType tSubstituted = tSubstitutor.substitute(parameter);
-            final PsiType sSubstituted = sSubstitutor.substituteWithBoundsPromotion(parameter);
+            final PsiType sSubstituted = sSubstitutor.substitute(parameter);
             if (tSubstituted == null ^ sSubstituted == null) {
               return false;
             }
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/BoundsPromotionForDerivedType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/BoundsPromotionForDerivedType.java
new file mode 100644 (file)
index 0000000..d294504
--- /dev/null
@@ -0,0 +1,23 @@
+
+import java.util.Collection;
+
+interface NumberCollection<N extends Number> extends Collection<N> {
+}
+
+interface IntegerCollection<I extends Integer> extends NumberCollection<I> {}
+interface IntegerCollection1<I extends Integer, L extends I> extends NumberCollection<L> {}
+
+class Test {
+  <T extends Number, C extends NumberCollection<? extends T>> Collection<T> filter(Collection<C> input) {
+    return null;
+  }
+
+  public void foo(Collection<IntegerCollection<?>> input) {
+    Collection<Integer> filtered = filter(input);
+  }
+
+  public void foo1(Collection<IntegerCollection1<?, ?>> input) {
+    Collection<Integer> filtered = filter(input);
+  }
+}
+
index 630785397c4b48ace244fc5092190c15319dd6c5..c74c36172b7abb0cd834b510112d101a72f9b808 100644 (file)
@@ -21,7 +21,6 @@ import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection;
 import com.intellij.codeInspection.uncheckedWarnings.UncheckedWarningLocalInspection;
 import com.intellij.codeInspection.unusedImport.UnusedImportLocalInspection;
 import com.intellij.openapi.projectRoots.JavaSdkVersion;
-import com.intellij.openapi.projectRoots.Sdk;
 import com.intellij.openapi.roots.LanguageLevelProjectExtension;
 import com.intellij.pom.java.LanguageLevel;
 import com.intellij.testFramework.IdeaTestUtil;
@@ -1009,4 +1008,8 @@ public class GenericsHighlighting8Test extends LightDaemonAnalyzerTestCase {
   public void testTypeParameterBoundsWithSubstitutionWhenMethodHierarchyIsChecked() throws Exception {
     doTest();
   }
+
+  public void testBoundsPromotionForDerivedType() throws Exception {
+    doTest();
+  }
 }