Checking for return type in kotlin signature if have super methods.
This commit is contained in:
+18
-6
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user