/*
- * 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.
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;
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;
}
--- /dev/null
+
+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);
+ }
+}
+
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;
public void testTypeParameterBoundsWithSubstitutionWhenMethodHierarchyIsChecked() throws Exception {
doTest();
}
+
+ public void testBoundsPromotionForDerivedType() throws Exception {
+ doTest();
+ }
}