JET-58 Make 'as never succeeds' a warning, or even never check for Java (external) types

This commit is contained in:
Andrey Breslav
2011-05-26 19:55:36 +04:00
parent 94788b77f4
commit 009e983b41
3 changed files with 29 additions and 10 deletions
@@ -1,6 +1,7 @@
package org.jetbrains.jet.lang.types;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
@@ -465,21 +466,32 @@ public class JetTypeInferrer {
if (resolutionResult.isSuccess()) {
final FunctionDescriptor functionDescriptor = resolutionResult.getFunctionDescriptor();
List<TypeParameterDescriptor> typeParameters = functionDescriptor.getOriginal().getTypeParameters();
for (int i = 0, typeParametersSize = typeParameters.size(); i < typeParametersSize; i++) {
TypeParameterDescriptor typeParameterDescriptor = typeParameters.get(i);
final JetType typeArgument = typeArguments.get(i);
if (!semanticServices.getTypeChecker().isSubtypeOf(typeArgument, typeParameterDescriptor.getBoundsAsType())) {
trace.getErrorHandler().genericError(jetTypeArguments.get(i).getNode(), "Bound of the type parameter " + DescriptorRenderer.TEXT.render(typeParameterDescriptor) + " is not respected by the type " + typeArgument);
}
}
checkGenericBoundsInAFunctionCall(jetTypeArguments, typeArguments, functionDescriptor);
return functionDescriptor.getUnsubstitutedReturnType();
}
}
return null;
}
private void checkGenericBoundsInAFunctionCall(List<JetTypeProjection> jetTypeArguments, List<JetType> typeArguments, FunctionDescriptor functionDescriptor) {
Map<TypeConstructor, TypeProjection> context = Maps.newHashMap();
List<TypeParameterDescriptor> typeParameters = functionDescriptor.getOriginal().getTypeParameters();
for (int i = 0, typeParametersSize = typeParameters.size(); i < typeParametersSize; i++) {
TypeParameterDescriptor typeParameter = typeParameters.get(i);
JetType typeArgument = typeArguments.get(i);
context.put(typeParameter.getTypeConstructor(), new TypeProjection(typeArgument));
}
TypeSubstitutor substitutor = TypeSubstitutor.create(context);
for (int i = 0, typeParametersSize = typeParameters.size(); i < typeParametersSize; i++) {
TypeParameterDescriptor typeParameterDescriptor = typeParameters.get(i);
JetType typeArgument = typeArguments.get(i);
JetTypeReference typeReference = jetTypeArguments.get(i).getTypeReference();
assert typeReference != null;
classDescriptorResolver.checkBounds(typeReference, typeArgument, typeParameterDescriptor, substitutor);
}
}
@Nullable
public JetType checkConstructorCall(JetScope scope, @NotNull JetTypeReference typeReference, @NotNull JetCall call) {
JetTypeElement typeElement = typeReference.getTypeElement();
@@ -891,7 +903,8 @@ public class JetTypeInferrer {
trace.getErrorHandler().genericWarning(expression.getOperationSign().getNode(), "No cast needed, use ':' instead");
}
else {
trace.getErrorHandler().genericError(expression.getOperationSign().getNode(), "This cast can never succeed");
// See JET-58 Make 'as never succeeds' a warning, or even never check for Java (external) types
trace.getErrorHandler().genericWarning(expression.getOperationSign().getNode(), "This cast can never succeed");
}
}
else {
+4
View File
@@ -22,4 +22,8 @@ fun test(l : java.util.List<Int>) {
Collections.singleton<Int><error>(1.0)</error>
<error>new List<Int></error>
// Collections.sort<Integer>(new ArrayList<Integer>())
val o = "sdf" <warning>as</warning> Object
}
@@ -277,6 +277,8 @@ public class JetTypeCheckerTest extends LightDaemonAnalyzerTestCase {
assertSubtype("Derived_T<Int>", "Base_T<in Int>");
assertSubtype("MDerived_T<Int>", "Base_T<in Int>");
assertSubtype("ArrayList<Int>", "List<in Int>");
assertSubtype("Integer", "java.lang.Comparable<Integer>?");
}
public void testNullable() throws Exception {