[FIR] Fix incorrect updating of callable reference type in delegated property
... if the delegate happens to be a function call whose second argument is a callable reference but not actually a provideDelegate call. The fix is to ensure that the call is _actually_ a desugared provideDelegate call. This fixes a CCE in a case where the delegate expression is a regular function call and the second argument is a callable reference. #KT-65165 Fixed
This commit is contained in:
committed by
Space Team
parent
fced126c9f
commit
853ad54699
+6
@@ -15789,6 +15789,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/beforeDeclarationContainerOptimization.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("callableReferenceAsSecondArgumentOfDelegate.kt")
|
||||
public void testCallableReferenceAsSecondArgumentOfDelegate() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/callableReferenceAsSecondArgumentOfDelegate.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("capturePropertyInClosure.kt")
|
||||
public void testCapturePropertyInClosure() throws Exception {
|
||||
|
||||
+6
@@ -15789,6 +15789,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/beforeDeclarationContainerOptimization.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("callableReferenceAsSecondArgumentOfDelegate.kt")
|
||||
public void testCallableReferenceAsSecondArgumentOfDelegate() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/callableReferenceAsSecondArgumentOfDelegate.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("capturePropertyInClosure.kt")
|
||||
public void testCapturePropertyInClosure() throws Exception {
|
||||
|
||||
+6
@@ -15789,6 +15789,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/beforeDeclarationContainerOptimization.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("callableReferenceAsSecondArgumentOfDelegate.kt")
|
||||
public void testCallableReferenceAsSecondArgumentOfDelegate() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/callableReferenceAsSecondArgumentOfDelegate.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("capturePropertyInClosure.kt")
|
||||
public void testCapturePropertyInClosure() throws Exception {
|
||||
|
||||
+8
-1
@@ -53,6 +53,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.buildCurrentSubstitutor
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.components.TypeVariableDirectionCalculator
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.ProvideDelegateFixationPosition
|
||||
import org.jetbrains.kotlin.types.model.TypeConstructorMarker
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
import org.jetbrains.kotlin.util.PrivateForInline
|
||||
import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
|
||||
|
||||
@@ -323,7 +324,13 @@ open class FirDeclarationsResolveTransformer(
|
||||
(property.setter?.body?.statements?.singleOrNull() as? FirReturnExpression)?.let { returnExpression ->
|
||||
(returnExpression.result as? FirFunctionCall)?.replacePropertyReferenceTypeInDelegateAccessors(property)
|
||||
}
|
||||
(property.delegate as? FirFunctionCall)?.replacePropertyReferenceTypeInDelegateAccessors(property)
|
||||
val delegate = property.delegate
|
||||
if (delegate is FirFunctionCall &&
|
||||
delegate.calleeReference.name == OperatorNameConventions.PROVIDE_DELEGATE &&
|
||||
delegate.source?.kind == KtFakeSourceElementKind.DelegatedPropertyAccessor
|
||||
) {
|
||||
delegate.replacePropertyReferenceTypeInDelegateAccessors(property)
|
||||
}
|
||||
}
|
||||
|
||||
private fun transformPropertyAccessorsWithDelegate(
|
||||
|
||||
Vendored
+23
@@ -0,0 +1,23 @@
|
||||
// WITH_STDLIB
|
||||
// ISSUE: KT-65165
|
||||
|
||||
import kotlin.properties.ReadOnlyProperty
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
private class TransformedConfigPropertyString(
|
||||
defaultValue: String,
|
||||
private val transform: (String) -> Regex
|
||||
) : ReadOnlyProperty<SampleClass, Regex> {
|
||||
override fun getValue(thisRef: SampleClass, property: KProperty<*>): Regex {
|
||||
return transform("string")
|
||||
}
|
||||
}
|
||||
|
||||
class SampleClass {
|
||||
val ignoreStringsRegex: Regex by TransformedConfigPropertyString("$^", String::toRegex)
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
SampleClass().ignoreStringsRegex
|
||||
return "OK"
|
||||
}
|
||||
+6
@@ -15789,6 +15789,12 @@ public class JvmAbiConsistencyTestBoxGenerated extends AbstractJvmAbiConsistency
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/beforeDeclarationContainerOptimization.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("callableReferenceAsSecondArgumentOfDelegate.kt")
|
||||
public void testCallableReferenceAsSecondArgumentOfDelegate() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/callableReferenceAsSecondArgumentOfDelegate.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("capturePropertyInClosure.kt")
|
||||
public void testCapturePropertyInClosure() throws Exception {
|
||||
|
||||
+6
@@ -15423,6 +15423,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/beforeDeclarationContainerOptimization.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("callableReferenceAsSecondArgumentOfDelegate.kt")
|
||||
public void testCallableReferenceAsSecondArgumentOfDelegate() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/callableReferenceAsSecondArgumentOfDelegate.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("capturePropertyInClosure.kt")
|
||||
public void testCapturePropertyInClosure() throws Exception {
|
||||
|
||||
+6
@@ -15789,6 +15789,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/beforeDeclarationContainerOptimization.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("callableReferenceAsSecondArgumentOfDelegate.kt")
|
||||
public void testCallableReferenceAsSecondArgumentOfDelegate() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/callableReferenceAsSecondArgumentOfDelegate.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("capturePropertyInClosure.kt")
|
||||
public void testCapturePropertyInClosure() throws Exception {
|
||||
|
||||
+6
@@ -15789,6 +15789,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/beforeDeclarationContainerOptimization.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("callableReferenceAsSecondArgumentOfDelegate.kt")
|
||||
public void testCallableReferenceAsSecondArgumentOfDelegate() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/callableReferenceAsSecondArgumentOfDelegate.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("capturePropertyInClosure.kt")
|
||||
public void testCapturePropertyInClosure() throws Exception {
|
||||
|
||||
+5
@@ -13005,6 +13005,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/beforeDeclarationContainerOptimization.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("callableReferenceAsSecondArgumentOfDelegate.kt")
|
||||
public void testCallableReferenceAsSecondArgumentOfDelegate() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/callableReferenceAsSecondArgumentOfDelegate.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("capturePropertyInClosure.kt")
|
||||
public void testCapturePropertyInClosure() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/delegatedProperty/capturePropertyInClosure.kt");
|
||||
|
||||
Reference in New Issue
Block a user