Optimize ErasedOverridabilityCondition
Do not start substitution if some basic conditions are failed
This commit is contained in:
+13
-1
@@ -21,13 +21,25 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
|
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.RawSubstitution
|
||||||
|
import org.jetbrains.kotlin.load.java.lazy.types.RawTypeTag
|
||||||
import org.jetbrains.kotlin.resolve.ExternalOverridabilityCondition
|
import org.jetbrains.kotlin.resolve.ExternalOverridabilityCondition
|
||||||
import org.jetbrains.kotlin.resolve.ExternalOverridabilityCondition.Result
|
import org.jetbrains.kotlin.resolve.ExternalOverridabilityCondition.Result
|
||||||
import org.jetbrains.kotlin.resolve.OverridingUtil
|
import org.jetbrains.kotlin.resolve.OverridingUtil
|
||||||
|
import org.jetbrains.kotlin.types.getCapability
|
||||||
|
import org.jetbrains.kotlin.utils.singletonOrEmptyList
|
||||||
|
|
||||||
class ErasedOverridabilityCondition : ExternalOverridabilityCondition {
|
class ErasedOverridabilityCondition : ExternalOverridabilityCondition {
|
||||||
override fun isOverridable(superDescriptor: CallableDescriptor, subDescriptor: CallableDescriptor, subClassDescriptor: ClassDescriptor?): Result {
|
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<RawTypeTag>() == null }) return Result.UNKNOWN
|
||||||
|
|
||||||
var erasedSuper = superDescriptor.substitute(RawSubstitution.buildSubstitutor()) ?: return Result.UNKNOWN
|
var erasedSuper = superDescriptor.substitute(RawSubstitution.buildSubstitutor()) ?: return Result.UNKNOWN
|
||||||
|
|
||||||
|
|||||||
@@ -143,24 +143,8 @@ public class OverridingUtil {
|
|||||||
@NotNull CallableDescriptor subDescriptor,
|
@NotNull CallableDescriptor subDescriptor,
|
||||||
boolean checkReturnType
|
boolean checkReturnType
|
||||||
) {
|
) {
|
||||||
if (superDescriptor instanceof FunctionDescriptor && !(subDescriptor instanceof FunctionDescriptor) ||
|
OverrideCompatibilityInfo basicOverridability = getBasicOverridabilityProblem(superDescriptor, subDescriptor);
|
||||||
superDescriptor instanceof PropertyDescriptor && !(subDescriptor instanceof PropertyDescriptor)) {
|
if (basicOverridability != null) return basicOverridability;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<KotlinType> superValueParameters = compiledValueParameters(superDescriptor);
|
List<KotlinType> superValueParameters = compiledValueParameters(superDescriptor);
|
||||||
List<KotlinType> subValueParameters = compiledValueParameters(subDescriptor);
|
List<KotlinType> subValueParameters = compiledValueParameters(subDescriptor);
|
||||||
@@ -207,6 +191,33 @@ public class OverridingUtil {
|
|||||||
return OverrideCompatibilityInfo.success();
|
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
|
@NotNull
|
||||||
private KotlinTypeChecker createTypeChecker(
|
private KotlinTypeChecker createTypeChecker(
|
||||||
@NotNull List<TypeParameterDescriptor> firstParameters,
|
@NotNull List<TypeParameterDescriptor> firstParameters,
|
||||||
|
|||||||
Reference in New Issue
Block a user