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:
+5
-3
@@ -376,11 +376,13 @@ open class ClassCodegen protected constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun generateMethod(method: IrFunction) {
|
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
|
val signature = FunctionCodegen(method, this).generate().asmMethod
|
||||||
|
jvmSignatureClashDetector.trackMethod(method, RawSignature(signature.name, signature.descriptor, MemberKind.METHOD))
|
||||||
when (val metadata = method.metadata) {
|
when (val metadata = method.metadata) {
|
||||||
is MetadataSource.Property -> {
|
is MetadataSource.Property -> {
|
||||||
// We can't check for JvmLoweredDeclarationOrigin.SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS because for interface methods
|
// We can't check for JvmLoweredDeclarationOrigin.SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS because for interface methods
|
||||||
|
|||||||
+7
-7
@@ -27,9 +27,13 @@ class JvmSignatureClashDetector(
|
|||||||
fieldsBySignature.getOrPut(rawSignature) { SmartSet.create() }.add(irField)
|
fieldsBySignature.getOrPut(rawSignature) { SmartSet.create() }.add(irField)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun trackMethod(irFunction: IrFunction) {
|
fun trackMethod(irFunction: IrFunction, rawSignature: RawSignature) {
|
||||||
if (irFunction is IrSimpleFunction && irFunction.isFakeOverride && irFunction.dispatchReceiverParameter != null) {
|
methodsBySignature.getOrPut(rawSignature) { SmartSet.create() }.add(irFunction)
|
||||||
for (overriddenFunction in getOverriddenFunctions(irFunction)) {
|
}
|
||||||
|
|
||||||
|
fun trackFakeOverrideMethod(irFunction: IrFunction) {
|
||||||
|
if (irFunction.dispatchReceiverParameter != null) {
|
||||||
|
for (overriddenFunction in getOverriddenFunctions(irFunction as IrSimpleFunction)) {
|
||||||
trackMethod(irFunction, mapRawSignature(overriddenFunction))
|
trackMethod(irFunction, mapRawSignature(overriddenFunction))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -42,10 +46,6 @@ class JvmSignatureClashDetector(
|
|||||||
return RawSignature(jvmSignature.asmMethod.name, jvmSignature.asmMethod.descriptor, MemberKind.METHOD)
|
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> {
|
private fun getOverriddenFunctions(irFunction: IrSimpleFunction): Set<IrFunction> {
|
||||||
val result = HashSet<IrFunction>()
|
val result = HashSet<IrFunction>()
|
||||||
collectOverridesOf(irFunction, result)
|
collectOverridesOf(irFunction, result)
|
||||||
|
|||||||
Reference in New Issue
Block a user