Fix optimization of property delegates of platform types
The old code didn't replace the delegate field access because it was wrapped into a TYPE_OP IMPLICIT_NOTNULL. #KT-54463 Fixed
This commit is contained in:
committed by
Space Team
parent
ac74ce5f27
commit
8812f632cc
+6
@@ -15016,6 +15016,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/initializeContainerOfTopLevelProperties.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/initializeContainerOfTopLevelProperties.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt54463_platformType.kt")
|
||||||
|
public void testKt54463_platformType() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/kt54463_platformType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("memberExtensionPropertyAndImportFromObject.kt")
|
@TestMetadata("memberExtensionPropertyAndImportFromObject.kt")
|
||||||
public void testMemberExtensionPropertyAndImportFromObject() throws Exception {
|
public void testMemberExtensionPropertyAndImportFromObject() throws Exception {
|
||||||
|
|||||||
+6
-17
@@ -16,10 +16,7 @@ import org.jetbrains.kotlin.ir.declarations.*
|
|||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
|
||||||
|
|
||||||
internal val singletonOrConstantDelegationPhase = makeIrFilePhase(
|
internal val singletonOrConstantDelegationPhase = makeIrFilePhase(
|
||||||
::SingletonOrConstantDelegationLowering,
|
::SingletonOrConstantDelegationLowering,
|
||||||
@@ -47,22 +44,14 @@ private class SingletonOrConstantDelegationTransformer(val context: JvmBackendCo
|
|||||||
if (!isDelegated || isFakeOverride || backingField == null) return null
|
if (!isDelegated || isFakeOverride || backingField == null) return null
|
||||||
val delegate = backingField?.initializer?.expression?.takeIf { it.isInlineable() } ?: return null
|
val delegate = backingField?.initializer?.expression?.takeIf { it.isInlineable() } ?: return null
|
||||||
val originalThis = parentAsClass.thisReceiver
|
val originalThis = parentAsClass.thisReceiver
|
||||||
val receiverMapper = object : IrElementTransformer<Pair<Name, IrExpression>> {
|
|
||||||
override fun visitCall(expression: IrCall, data: Pair<Name, IrExpression>): IrExpression {
|
class DelegateFieldAccessTransformer(val newReceiver: IrExpression) : IrElementTransformerVoid() {
|
||||||
val (name, newReceiver) = data
|
override fun visitGetField(expression: IrGetField): IrExpression =
|
||||||
if (expression.symbol.owner.name == name) {
|
if (expression.symbol == backingField?.symbol) newReceiver else super.visitGetField(expression)
|
||||||
if ((expression.dispatchReceiver as? IrGetField)?.symbol == backingField?.symbol) {
|
|
||||||
expression.dispatchReceiver = newReceiver
|
|
||||||
} else if ((expression.extensionReceiver as? IrGetField)?.symbol == backingField?.symbol) {
|
|
||||||
expression.extensionReceiver = newReceiver
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return expression
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getter?.transform(receiverMapper,OperatorNameConventions.GET_VALUE to delegate.remapReceiver(originalThis, getter?.dispatchReceiverParameter))
|
getter?.transform(DelegateFieldAccessTransformer(delegate.remapReceiver(originalThis, getter?.dispatchReceiverParameter)), null)
|
||||||
setter?.transform(receiverMapper,OperatorNameConventions.SET_VALUE to delegate.remapReceiver(originalThis, setter?.dispatchReceiverParameter))
|
setter?.transform(DelegateFieldAccessTransformer(delegate.remapReceiver(originalThis, setter?.dispatchReceiverParameter)), null)
|
||||||
|
|
||||||
backingField = null
|
backingField = null
|
||||||
|
|
||||||
|
|||||||
Vendored
+22
@@ -0,0 +1,22 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// FILE: A.java
|
||||||
|
|
||||||
|
public class A {
|
||||||
|
public static A create() { return new A(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: box.kt
|
||||||
|
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
class C {
|
||||||
|
private val valueState = A.create()
|
||||||
|
private val value by valueState
|
||||||
|
|
||||||
|
fun get(): String = value
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun A.getValue(thisRef: Any?, property: KProperty<*>): String = "OK"
|
||||||
|
|
||||||
|
fun box(): String =
|
||||||
|
C().get()
|
||||||
+6
@@ -14782,6 +14782,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/initializeContainerOfTopLevelProperties.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/initializeContainerOfTopLevelProperties.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt54463_platformType.kt")
|
||||||
|
public void testKt54463_platformType() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/kt54463_platformType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("memberExtensionPropertyAndImportFromObject.kt")
|
@TestMetadata("memberExtensionPropertyAndImportFromObject.kt")
|
||||||
public void testMemberExtensionPropertyAndImportFromObject() throws Exception {
|
public void testMemberExtensionPropertyAndImportFromObject() throws Exception {
|
||||||
|
|||||||
+6
@@ -15016,6 +15016,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/initializeContainerOfTopLevelProperties.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/initializeContainerOfTopLevelProperties.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt54463_platformType.kt")
|
||||||
|
public void testKt54463_platformType() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/kt54463_platformType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("memberExtensionPropertyAndImportFromObject.kt")
|
@TestMetadata("memberExtensionPropertyAndImportFromObject.kt")
|
||||||
public void testMemberExtensionPropertyAndImportFromObject() throws Exception {
|
public void testMemberExtensionPropertyAndImportFromObject() throws Exception {
|
||||||
|
|||||||
+5
@@ -12091,6 +12091,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/initializeContainerOfTopLevelProperties.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/initializeContainerOfTopLevelProperties.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt54463_platformType.kt")
|
||||||
|
public void testKt54463_platformType() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/kt54463_platformType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("memberExtensionPropertyAndImportFromObject.kt")
|
@TestMetadata("memberExtensionPropertyAndImportFromObject.kt")
|
||||||
public void testMemberExtensionPropertyAndImportFromObject() throws Exception {
|
public void testMemberExtensionPropertyAndImportFromObject() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/memberExtensionPropertyAndImportFromObject.kt");
|
runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/memberExtensionPropertyAndImportFromObject.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user