red code is green wildcard problems ++(IDEA-66750;IDEA-75178;IDEA-73377)

This commit is contained in:
anna
2012-03-29 15:17:24 +02:00
parent cfbdc39e46
commit 1563df17f1
4 changed files with 54 additions and 49 deletions
@@ -688,7 +688,7 @@ public class GenericsHighlightUtil {
return true;
}
}
if (isUncheckedTypeArgumentConversion(lTypeArg, rTypeArg)) return true;
if (!TypeConversionUtil.typesAgree(lTypeArg, rTypeArg, false)) return true;
}
return false;
}
@@ -730,48 +730,6 @@ public class GenericsHighlightUtil {
return false;
}
private static boolean isUncheckedTypeArgumentConversion (PsiType lTypeArg, PsiType rTypeArg) {
if (lTypeArg instanceof PsiPrimitiveType || rTypeArg instanceof PsiPrimitiveType) return false;
if (lTypeArg.equals(rTypeArg)) return false;
if (lTypeArg instanceof PsiCapturedWildcardType) {
//ignore capture conversion
return isUncheckedTypeArgumentConversion(((PsiCapturedWildcardType)lTypeArg).getWildcard(), rTypeArg);
}
if (rTypeArg instanceof PsiCapturedWildcardType) {
//ignore capture conversion
return isUncheckedTypeArgumentConversion(lTypeArg, ((PsiCapturedWildcardType)rTypeArg).getWildcard());
}
if (lTypeArg instanceof PsiWildcardType || rTypeArg instanceof PsiWildcardType) {
return !lTypeArg.isAssignableFrom(rTypeArg);
}
if (lTypeArg instanceof PsiArrayType && rTypeArg instanceof PsiArrayType) {
return isUncheckedTypeArgumentConversion(((PsiArrayType)rTypeArg).getComponentType(), ((PsiArrayType)lTypeArg).getComponentType());
}
if (lTypeArg instanceof PsiArrayType || rTypeArg instanceof PsiArrayType) return false;
if (lTypeArg instanceof PsiIntersectionType) {
for (PsiType type : ((PsiIntersectionType)lTypeArg).getConjuncts()) {
if (!isUncheckedTypeArgumentConversion(type, rTypeArg)) return false;
}
return true;
}
if (!(lTypeArg instanceof PsiClassType)) {
LOG.error("left: "+lTypeArg + "; "+lTypeArg.getClass());
}
if (rTypeArg instanceof PsiIntersectionType) {
for (PsiType type : ((PsiIntersectionType)rTypeArg).getConjuncts()) {
if (!isUncheckedTypeArgumentConversion(lTypeArg, type)) return false;
}
return true;
}
if (!(rTypeArg instanceof PsiClassType)) {
LOG.error("right :"+rTypeArg + "; "+rTypeArg.getClass());
}
return ((PsiClassType)lTypeArg).resolve() instanceof PsiTypeParameter ||
((PsiClassType)rTypeArg).resolve() instanceof PsiTypeParameter;
}
@Nullable
public static HighlightInfo checkForeachLoopParameterType(PsiForeachStatement statement) {
final PsiParameter parameter = statement.getIterationParameter();