Checking for return type in kotlin signature if have super methods.

This commit is contained in:
Evgeny Gerashchenko
2012-12-04 16:01:34 +04:00
parent 6975691e7a
commit 5e86cbe004
6 changed files with 71 additions and 6 deletions
@@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.*;
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import java.util.ArrayList;
@@ -76,22 +77,23 @@ public class AlternativeMethodSignatureData extends ElementAlternativeSignatureD
computeTypeParameters(methodTypeParameters);
computeValueParameters(valueParameterDescriptors);
if (hasSuperMethods) {
checkSameParameterTypes(valueParameterDescriptors, methodTypeParameters);
}
if (originalReturnType != null) {
altReturnType = computeReturnType(originalReturnType, altFunDeclaration.getReturnTypeRef(), originalToAltTypeParameters);
}
if (hasSuperMethods) {
checkParameterAndReturnTypesForOverridingMethods(valueParameterDescriptors, methodTypeParameters, originalReturnType);
}
}
catch (AlternativeSignatureMismatchException e) {
setError(e.getMessage());
}
}
private void checkSameParameterTypes(
private void checkParameterAndReturnTypesForOverridingMethods(
@NotNull JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors,
@NotNull List<TypeParameterDescriptor> methodTypeParameters
@NotNull List<TypeParameterDescriptor> methodTypeParameters,
@Nullable JetType returnType
) {
TypeSubstitutor substitutor = SignaturesUtil.createSubstitutorForFunctionTypeParameters(originalToAltTypeParameters);
@@ -123,6 +125,16 @@ public class AlternativeMethodSignatureData extends ElementAlternativeSignatureD
+ altTypeParameters.get(index).getUpperBoundsAsType() + ", was: " + parameter.getUpperBoundsAsType());
}
}
if (returnType != null) {
JetType substitutedReturnType = substitutor.substitute(returnType, Variance.INVARIANT);
assert substitutedReturnType != null;
if (!JetTypeChecker.INSTANCE.isSubtypeOf(altReturnType, substitutedReturnType)) {
throw new AlternativeSignatureMismatchException(
"Return type is changed to not subtype for method which overrides another: " + altReturnType + ", was: " + returnType);
}
}
}
@NotNull