JVM IR: slightly optimize keepTrackOfOverridesForPossiblyClashingFakeOverride

Collecting all outer classes into a hash set and looking up classifiers
in that set for each type of each fake override is noticeably slow.
Instead, check that function types reference any type parameter whose
container is a class; if the function is not local, it means such type
parameter belongs to one of the outer classes.

 #KT-42020
This commit is contained in:
Alexander Udalov
2021-08-26 19:46:01 +02:00
parent d3dc9b19b8
commit 6e93006a94
@@ -15,13 +15,13 @@ import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageFragment
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe
import org.jetbrains.kotlin.resolve.descriptorUtil.overriddenTreeAsSequence
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.typeUtil.contains
import org.jetbrains.kotlin.utils.addToStdlib.cast
class JvmIdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMangler) : IdSignatureDescriptor(mangler) {
private inner class JvmDescriptorBasedSignatureBuilder(mangler: KotlinMangler.DescriptorMangler, type: SpecialDeclarationType) : DescriptorBasedSignatureBuilder(mangler, type) {
private inner class JvmDescriptorBasedSignatureBuilder(mangler: KotlinMangler.DescriptorMangler, type: SpecialDeclarationType) :
DescriptorBasedSignatureBuilder(mangler, type) {
override fun platformSpecificFunction(descriptor: FunctionDescriptor) {
keepTrackOfOverridesForPossiblyClashingFakeOverride(descriptor)
}
@@ -78,34 +78,17 @@ class JvmIdSignatureDescriptor(private val mangler: KotlinMangler.DescriptorMang
}
}
private fun isCapturingTypeParameter(member: CallableMemberDescriptor): Boolean {
val containingClasses = collectContainingClasses(member)
return member.extensionReceiverParameter?.isCapturingTypeParameter(containingClasses) == true ||
member.valueParameters.any { it.isCapturingTypeParameter(containingClasses) }
}
private fun isCapturingTypeParameter(member: CallableMemberDescriptor): Boolean =
member.extensionReceiverParameter?.isCapturingTypeParameter() == true ||
member.valueParameters.any { it.isCapturingTypeParameter() }
private fun collectContainingClasses(member: CallableMemberDescriptor): Set<ClassDescriptor> {
val result = HashSet<ClassDescriptor>()
var pointer: DeclarationDescriptor = member
while (true) {
val containingClass = pointer.containingDeclaration as? ClassDescriptor ?: break
result.add(containingClass)
if (!containingClass.isInner) break
pointer = containingClass
}
return result
}
private fun ParameterDescriptor.isCapturingTypeParameter(containingClasses: Set<ClassDescriptor>): Boolean =
type.containsTypeParametersOf(containingClasses)
private fun KotlinType.containsTypeParametersOf(containingClasses: Set<ClassDescriptor>): Boolean =
contains {
private fun ParameterDescriptor.isCapturingTypeParameter(): Boolean =
type.contains {
val descriptor = it.constructor.declarationDescriptor
descriptor is TypeParameterDescriptor && descriptor.containingDeclaration in containingClasses
descriptor is TypeParameterDescriptor && descriptor.containingDeclaration is ClassDescriptor
}
}
override fun createSignatureBuilder(type: SpecialDeclarationType): DescriptorBasedSignatureBuilder =
JvmDescriptorBasedSignatureBuilder(mangler, type)
}
}