JVM_IR: don't remap current method signature when detecting clashes

TODO: don't repeatedly map signatures of inherited functions either.
This commit is contained in:
pyos
2020-02-27 12:11:54 +01:00
committed by Dmitry Petrov
parent ad0070ed8a
commit 035cc57cf4
2 changed files with 12 additions and 10 deletions
@@ -376,11 +376,13 @@ open class ClassCodegen protected constructor(
}
private fun generateMethod(method: IrFunction) {
jvmSignatureClashDetector.trackMethod(method)
if (method.origin == IrDeclarationOrigin.FAKE_OVERRIDE) {
jvmSignatureClashDetector.trackFakeOverrideMethod(method)
return
}
if (method.origin == IrDeclarationOrigin.FAKE_OVERRIDE) return
val signature = FunctionCodegen(method, this).generate().asmMethod
jvmSignatureClashDetector.trackMethod(method, RawSignature(signature.name, signature.descriptor, MemberKind.METHOD))
when (val metadata = method.metadata) {
is MetadataSource.Property -> {
// We can't check for JvmLoweredDeclarationOrigin.SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS because for interface methods
@@ -27,9 +27,13 @@ class JvmSignatureClashDetector(
fieldsBySignature.getOrPut(rawSignature) { SmartSet.create() }.add(irField)
}
fun trackMethod(irFunction: IrFunction) {
if (irFunction is IrSimpleFunction && irFunction.isFakeOverride && irFunction.dispatchReceiverParameter != null) {
for (overriddenFunction in getOverriddenFunctions(irFunction)) {
fun trackMethod(irFunction: IrFunction, rawSignature: RawSignature) {
methodsBySignature.getOrPut(rawSignature) { SmartSet.create() }.add(irFunction)
}
fun trackFakeOverrideMethod(irFunction: IrFunction) {
if (irFunction.dispatchReceiverParameter != null) {
for (overriddenFunction in getOverriddenFunctions(irFunction as IrSimpleFunction)) {
trackMethod(irFunction, mapRawSignature(overriddenFunction))
}
} else {
@@ -42,10 +46,6 @@ class JvmSignatureClashDetector(
return RawSignature(jvmSignature.asmMethod.name, jvmSignature.asmMethod.descriptor, MemberKind.METHOD)
}
private fun trackMethod(irFunction: IrFunction, rawSignature: RawSignature) {
methodsBySignature.getOrPut(rawSignature) { SmartSet.create() }.add(irFunction)
}
private fun getOverriddenFunctions(irFunction: IrSimpleFunction): Set<IrFunction> {
val result = HashSet<IrFunction>()
collectOverridesOf(irFunction, result)