diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.kt index 2338e44f2fd..7bf1e7f9f75 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.kt @@ -632,16 +632,18 @@ class DelegatedPropertyResolver( result?.let { recordResolvedDelegateOrReportError(it.overloadResolutionResults, isGet) } } - val resolvedDelegateType = extractResolvedDelegateType(delegateExpression, trace) + val resolvedDelegateType = extractResolvedDelegateType(delegateExpression, trace, delegateType) trace.recordType(delegateExpression, resolvedDelegateType) trace.commit() return resolvedDelegateType.unwrap() } - private fun extractResolvedDelegateType(delegateExpression: KtExpression, trace: BindingTrace): KotlinType { + private fun extractResolvedDelegateType(delegateExpression: KtExpression, trace: BindingTrace, delegateType: KotlinType): KotlinType { val call = delegateExpression.getCall(trace.bindingContext) val pretendReturnType = call.getResolvedCall(trace.bindingContext)?.resultingDescriptor?.returnType - return pretendReturnType?.takeUnless { !it.isProperType() } ?: ErrorUtils.createErrorType("Type for ${delegateExpression.text}") + return pretendReturnType?.takeIf { it.isProperType() } + ?: delegateType.takeIf { it.isProperType() } + ?: ErrorUtils.createErrorType("Type for ${delegateExpression.text}") } private fun KotlinType.isProperType(): Boolean { diff --git a/compiler/testData/codegen/box/delegatedProperty/kt35707.kt b/compiler/testData/codegen/box/delegatedProperty/kt35707.kt new file mode 100644 index 00000000000..f749a7f485c --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/kt35707.kt @@ -0,0 +1,20 @@ +// !LANGUAGE: +NewInference +// ISSUE: KT-35707 + +import kotlin.reflect.KProperty + +interface PropertyDelegate { + operator fun getValue(thisRef: A, property: KProperty<*>): Boolean = true + operator fun setValue(thisRef: A, property: KProperty<*>, value: Boolean) {} +} +class A { + val b by object : PropertyDelegate {} +} + +fun box(): String { + return if (A().b) { + "OK" + } else { + "FAIL" + } +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 9e2872d1f61..f0bc1d166cc 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -9711,6 +9711,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/delegatedProperty/insideInlinedObjectMultiModule.kt"); } + @TestMetadata("kt35707.kt") + public void testKt35707() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/kt35707.kt"); + } + @TestMetadata("kt4138.kt") public void testKt4138() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/kt4138.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 52672a43b4a..8c3bf28d6bd 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -9711,6 +9711,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/delegatedProperty/insideInlinedObjectMultiModule.kt"); } + @TestMetadata("kt35707.kt") + public void testKt35707() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/kt35707.kt"); + } + @TestMetadata("kt4138.kt") public void testKt4138() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/kt4138.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 1641eadfa9f..c4b86aff4be 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -8561,6 +8561,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/delegatedProperty/insideInlinedObjectMultiModule.kt"); } + @TestMetadata("kt35707.kt") + public void testKt35707() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/kt35707.kt"); + } + @TestMetadata("kt4138.kt") public void testKt4138() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/kt4138.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index b0a19582cbb..52312ad568a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -8561,6 +8561,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/delegatedProperty/insideInlinedObjectMultiModule.kt"); } + @TestMetadata("kt35707.kt") + public void testKt35707() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/kt35707.kt"); + } + @TestMetadata("kt4138.kt") public void testKt4138() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/kt4138.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 21584933cad..5af312a66e2 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -7361,6 +7361,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/delegatedProperty/insideInlinedObjectMultiModule.kt"); } + @TestMetadata("kt35707.kt") + public void testKt35707() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/kt35707.kt"); + } + @TestMetadata("kt4138.kt") public void testKt4138() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/kt4138.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 290ab604107..0f7c1e23b33 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -8436,6 +8436,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/delegatedProperty/insideInlinedObjectMultiModule.kt"); } + @TestMetadata("kt35707.kt") + public void testKt35707() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/kt35707.kt"); + } + @TestMetadata("kt4138.kt") public void testKt4138() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/kt4138.kt");