diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition.kt index a3678ef962b..dbfc4e39549 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/ErasedOverridabilityCondition.kt @@ -21,13 +21,25 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.load.java.lazy.types.RawSubstitution +import org.jetbrains.kotlin.load.java.lazy.types.RawTypeTag import org.jetbrains.kotlin.resolve.ExternalOverridabilityCondition import org.jetbrains.kotlin.resolve.ExternalOverridabilityCondition.Result import org.jetbrains.kotlin.resolve.OverridingUtil +import org.jetbrains.kotlin.types.getCapability +import org.jetbrains.kotlin.utils.singletonOrEmptyList class ErasedOverridabilityCondition : ExternalOverridabilityCondition { override fun isOverridable(superDescriptor: CallableDescriptor, subDescriptor: CallableDescriptor, subClassDescriptor: ClassDescriptor?): Result { - if (subDescriptor !is JavaMethodDescriptor) return Result.UNKNOWN + if (subDescriptor !is JavaMethodDescriptor || subDescriptor.typeParameters.isNotEmpty()) return Result.UNKNOWN + + val basicOverridability = OverridingUtil.getBasicOverridabilityProblem(superDescriptor, subDescriptor)?.result + if (basicOverridability != null) return Result.UNKNOWN + + val signatureTypes = subDescriptor.valueParameters.asSequence().map { it.type } + + subDescriptor.returnType!! + + subDescriptor.extensionReceiverParameter?.type.singletonOrEmptyList() + + if (signatureTypes.any { it.arguments.isNotEmpty() && it.getCapability() == null }) return Result.UNKNOWN var erasedSuper = superDescriptor.substitute(RawSubstitution.buildSubstitutor()) ?: return Result.UNKNOWN diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java index 364eb4c36fd..ef3a67d8d6d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java @@ -143,24 +143,8 @@ public class OverridingUtil { @NotNull CallableDescriptor subDescriptor, boolean checkReturnType ) { - if (superDescriptor instanceof FunctionDescriptor && !(subDescriptor instanceof FunctionDescriptor) || - superDescriptor instanceof PropertyDescriptor && !(subDescriptor instanceof PropertyDescriptor)) { - return OverrideCompatibilityInfo.incompatible("Member kind mismatch"); - } - - if (!(superDescriptor instanceof FunctionDescriptor) && !(superDescriptor instanceof PropertyDescriptor)) { - throw new IllegalArgumentException("This type of CallableDescriptor cannot be checked for overridability: " + superDescriptor); - } - - // TODO: check outside of this method - if (!superDescriptor.getName().equals(subDescriptor.getName())) { - return OverrideCompatibilityInfo.incompatible("Name mismatch"); - } - - OverrideCompatibilityInfo receiverAndParameterResult = checkReceiverAndParameterCount(superDescriptor, subDescriptor); - if (receiverAndParameterResult != null) { - return receiverAndParameterResult; - } + OverrideCompatibilityInfo basicOverridability = getBasicOverridabilityProblem(superDescriptor, subDescriptor); + if (basicOverridability != null) return basicOverridability; List superValueParameters = compiledValueParameters(superDescriptor); List subValueParameters = compiledValueParameters(subDescriptor); @@ -207,6 +191,33 @@ public class OverridingUtil { return OverrideCompatibilityInfo.success(); } + @Nullable + public static OverrideCompatibilityInfo getBasicOverridabilityProblem( + @NotNull CallableDescriptor superDescriptor, + @NotNull CallableDescriptor subDescriptor + ) { + if (superDescriptor instanceof FunctionDescriptor && !(subDescriptor instanceof FunctionDescriptor) || + superDescriptor instanceof PropertyDescriptor && !(subDescriptor instanceof PropertyDescriptor)) { + return OverrideCompatibilityInfo.incompatible("Member kind mismatch"); + } + + if (!(superDescriptor instanceof FunctionDescriptor) && !(superDescriptor instanceof PropertyDescriptor)) { + throw new IllegalArgumentException("This type of CallableDescriptor cannot be checked for overridability: " + superDescriptor); + } + + // TODO: check outside of this method + if (!superDescriptor.getName().equals(subDescriptor.getName())) { + return OverrideCompatibilityInfo.incompatible("Name mismatch"); + } + + OverrideCompatibilityInfo receiverAndParameterResult = checkReceiverAndParameterCount(superDescriptor, subDescriptor); + if (receiverAndParameterResult != null) { + return receiverAndParameterResult; + } + + return null; + } + @NotNull private KotlinTypeChecker createTypeChecker( @NotNull List firstParameters,