import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
import static com.intellij.psi.CommonClassNames.JAVA_LANG_STRING;
return false; // must be TypeCook's PsiTypeVariable
}
if (left instanceof PsiPrimitiveType) {
- return isUnboxable((PsiPrimitiveType)left, (PsiClassType)right);
+ return isUnboxable((PsiPrimitiveType)left, (PsiClassType)right, new HashSet<PsiClassType>());
}
final PsiClassType.ClassResolveResult leftResult = PsiUtil.resolveGenericsClassInType(left);
final PsiClassType.ClassResolveResult rightResult = PsiUtil.resolveGenericsClassInType(right);
return isAssignable(wildcardType.getExtendsBound(), right);
}
- private static boolean isUnboxable(@NotNull PsiPrimitiveType left, @NotNull PsiClassType right) {
+ private static boolean isUnboxable(@NotNull PsiPrimitiveType left, @NotNull PsiClassType right, @NotNull Set<PsiClassType> types) {
+ if (!right.getLanguageLevel().isAtLeast(LanguageLevel.JDK_1_5)) return false;
+ final PsiClass psiClass = right.resolve();
+ if (psiClass == null) return false;
+
+ if (psiClass instanceof PsiTypeParameter) {
+ for (PsiClassType bound : psiClass.getExtendsListTypes()) {
+ if (types.add(bound) && isUnboxable(left, bound, types)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
final PsiPrimitiveType rightUnboxedType = PsiPrimitiveType.getUnboxedType(right);
return rightUnboxedType != null && isAssignable(left, rightUnboxedType);
}
doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false);
}
+ public void testUnboxingFromTypeParameter() throws Exception {
+ doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false);
+ }
+
public void testLeastUpperBoundWithRecursiveTypes() throws Exception {
final PsiManager manager = getPsiManager();
final GlobalSearchScope scope = GlobalSearchScope.allScope(getProject());