Split getOverriddenBuiltinWithJvmDescriptor into two extensions
This commit is contained in:
@@ -555,7 +555,7 @@ public class FunctionCodegen {
|
|||||||
// If the function doesn't have a physical declaration among super-functions, it's a SAM adapter or alike and doesn't need bridges
|
// If the function doesn't have a physical declaration among super-functions, it's a SAM adapter or alike and doesn't need bridges
|
||||||
if (CallResolverUtilKt.isOrOverridesSynthesized(descriptor)) return;
|
if (CallResolverUtilKt.isOrOverridesSynthesized(descriptor)) return;
|
||||||
|
|
||||||
boolean isSpecial = SpecialBuiltinMembers.getOverriddenBuiltinWithDifferentJvmDescriptor(descriptor) != null;
|
boolean isSpecial = SpecialBuiltinMembers.getOverriddenBuiltinReflectingJvmDescriptor(descriptor) != null;
|
||||||
|
|
||||||
Set<Bridge<Method>> bridgesToGenerate;
|
Set<Bridge<Method>> bridgesToGenerate;
|
||||||
if (!isSpecial) {
|
if (!isSpecial) {
|
||||||
@@ -589,7 +589,7 @@ public class FunctionCodegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!descriptor.getKind().isReal() && isAbstractMethod(descriptor, OwnerKind.IMPLEMENTATION)) {
|
if (!descriptor.getKind().isReal() && isAbstractMethod(descriptor, OwnerKind.IMPLEMENTATION)) {
|
||||||
CallableDescriptor overridden = SpecialBuiltinMembers.getOverriddenBuiltinWithDifferentJvmDescriptor(descriptor);
|
CallableDescriptor overridden = SpecialBuiltinMembers.getOverriddenBuiltinReflectingJvmDescriptor(descriptor);
|
||||||
assert overridden != null;
|
assert overridden != null;
|
||||||
|
|
||||||
Method method = typeMapper.mapSignature(descriptor).getAsmMethod();
|
Method method = typeMapper.mapSignature(descriptor).getAsmMethod();
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.descriptors.Modality
|
|||||||
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature
|
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature
|
||||||
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.getSpecialSignatureInfo
|
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.getSpecialSignatureInfo
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.getOverriddenBuiltinWithDifferentJvmDescriptor
|
import org.jetbrains.kotlin.load.java.getOverriddenBuiltinReflectingJvmDescriptor
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtPsiUtil
|
import org.jetbrains.kotlin.psi.KtPsiUtil
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
@@ -51,7 +51,7 @@ object BuiltinSpecialBridgesUtil {
|
|||||||
|
|
||||||
val functionHandle = DescriptorBasedFunctionHandle(function)
|
val functionHandle = DescriptorBasedFunctionHandle(function)
|
||||||
val fake = !functionHandle.isDeclaration
|
val fake = !functionHandle.isDeclaration
|
||||||
val overriddenBuiltin = function.getOverriddenBuiltinWithDifferentJvmDescriptor()!!
|
val overriddenBuiltin = function.getOverriddenBuiltinReflectingJvmDescriptor()!!
|
||||||
|
|
||||||
val reachableDeclarations = findAllReachableDeclarations(function)
|
val reachableDeclarations = findAllReachableDeclarations(function)
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@ object BuiltinSpecialBridgesUtil {
|
|||||||
): Boolean {
|
): Boolean {
|
||||||
if (BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(this) == null) return false
|
if (BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(this) == null) return false
|
||||||
|
|
||||||
val builtin = getOverriddenBuiltinWithDifferentJvmDescriptor()!!
|
val builtin = getOverriddenBuiltinReflectingJvmDescriptor()!!
|
||||||
return signatureByDescriptor(this) == signatureByDescriptor(builtin)
|
return signatureByDescriptor(this) == signatureByDescriptor(builtin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,7 +134,7 @@ private fun <Signature> needGenerateSpecialBridge(
|
|||||||
|| originalOverridden.containingDeclaration is JavaClassDescriptor
|
|| originalOverridden.containingDeclaration is JavaClassDescriptor
|
||||||
|| DescriptorUtils.isInterface(originalOverridden.containingDeclaration)) return@firstOverridden false
|
|| DescriptorUtils.isInterface(originalOverridden.containingDeclaration)) return@firstOverridden false
|
||||||
|
|
||||||
val overriddenSpecial = originalOverridden.getOverriddenBuiltinWithDifferentJvmDescriptor()?.original ?: return@firstOverridden false
|
val overriddenSpecial = originalOverridden.getOverriddenBuiltinReflectingJvmDescriptor()?.original ?: return@firstOverridden false
|
||||||
|
|
||||||
signatureByDescriptor(originalOverridden) != signatureByDescriptor(overriddenSpecial)
|
signatureByDescriptor(originalOverridden) != signatureByDescriptor(overriddenSpecial)
|
||||||
} != null) return false
|
} != null) return false
|
||||||
|
|||||||
@@ -788,7 +788,7 @@ public class JetTypeMapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FunctionDescriptor overriddenSpecialBuiltinFunction =
|
FunctionDescriptor overriddenSpecialBuiltinFunction =
|
||||||
SpecialBuiltinMembers.<FunctionDescriptor>getOverriddenBuiltinWithDifferentJvmDescriptor(functionDescriptor.getOriginal());
|
SpecialBuiltinMembers.<FunctionDescriptor>getOverriddenBuiltinReflectingJvmDescriptor(functionDescriptor.getOriginal());
|
||||||
FunctionDescriptor functionToCall = overriddenSpecialBuiltinFunction != null && !superCall
|
FunctionDescriptor functionToCall = overriddenSpecialBuiltinFunction != null && !superCall
|
||||||
? overriddenSpecialBuiltinFunction.getOriginal()
|
? overriddenSpecialBuiltinFunction.getOriginal()
|
||||||
: functionDescriptor.getOriginal();
|
: functionDescriptor.getOriginal();
|
||||||
@@ -967,7 +967,7 @@ public class JetTypeMapper {
|
|||||||
public JvmMethodSignature mapSignature(@NotNull FunctionDescriptor f, @NotNull OwnerKind kind) {
|
public JvmMethodSignature mapSignature(@NotNull FunctionDescriptor f, @NotNull OwnerKind kind) {
|
||||||
if (f.getInitialSignatureDescriptor() != null && f != f.getInitialSignatureDescriptor()) {
|
if (f.getInitialSignatureDescriptor() != null && f != f.getInitialSignatureDescriptor()) {
|
||||||
// Overrides of special builtin in Kotlin classes always have special signature
|
// Overrides of special builtin in Kotlin classes always have special signature
|
||||||
if (SpecialBuiltinMembers.getOverriddenBuiltinWithDifferentJvmDescriptor(f) == null ||
|
if (SpecialBuiltinMembers.getOverriddenBuiltinReflectingJvmDescriptor(f) == null ||
|
||||||
f.getContainingDeclaration().getOriginal() instanceof JavaClassDescriptor) {
|
f.getContainingDeclaration().getOriginal() instanceof JavaClassDescriptor) {
|
||||||
return mapSignature(f.getInitialSignatureDescriptor(), kind);
|
return mapSignature(f.getInitialSignatureDescriptor(), kind);
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-1
@@ -206,7 +206,23 @@ fun <T : CallableMemberDescriptor> T.getOverriddenBuiltinWithDifferentJvmName():
|
|||||||
fun CallableMemberDescriptor.doesOverrideBuiltinWithDifferentJvmName(): Boolean = getOverriddenBuiltinWithDifferentJvmName() != null
|
fun CallableMemberDescriptor.doesOverrideBuiltinWithDifferentJvmName(): Boolean = getOverriddenBuiltinWithDifferentJvmName() != null
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
fun <T : CallableMemberDescriptor> T.getOverriddenBuiltinWithDifferentJvmDescriptor(): T? {
|
fun <T : CallableMemberDescriptor> T.getOverriddenSpecialBuiltin(): T? {
|
||||||
|
getOverriddenBuiltinWithDifferentJvmName()?.let { return it }
|
||||||
|
|
||||||
|
if (!name.sameAsBuiltinMethodWithErasedValueParameters) return null
|
||||||
|
|
||||||
|
return firstOverridden {
|
||||||
|
it.isFromBuiltins() && it.getSpecialSignatureInfo() != null
|
||||||
|
} as T?
|
||||||
|
}
|
||||||
|
|
||||||
|
// The subtle difference between getOverriddenBuiltinReflectingJvmDescriptor and getOverriddenSpecialBuiltin
|
||||||
|
// is that first one return descriptor reflecting JVM signature (JVM descriptor)
|
||||||
|
// E.g. it returns `contains(e: E): Boolean` instead of `contains(e: String): Boolean` for implementation of Collection<String>.contains
|
||||||
|
// Implementation differs by getting 'original' for collection methods with erased value parameters
|
||||||
|
// Also it ignores Collection<String>.containsAll overrides because they have the same JVM descriptor
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
fun <T : CallableMemberDescriptor> T.getOverriddenBuiltinReflectingJvmDescriptor(): T? {
|
||||||
getOverriddenBuiltinWithDifferentJvmName()?.let { return it }
|
getOverriddenBuiltinWithDifferentJvmName()?.let { return it }
|
||||||
|
|
||||||
if (!name.sameAsBuiltinMethodWithErasedValueParameters) return null
|
if (!name.sameAsBuiltinMethodWithErasedValueParameters) return null
|
||||||
|
|||||||
Reference in New Issue
Block a user