JET-58 Make 'as never succeeds' a warning, or even never check for Java (external) types
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user