diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 540ed9e2442..920a680ab2f 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -9611,6 +9611,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericDelegateWithNoAdditionalInfo.kt"); } + @TestMetadata("genericProvideDelegateOnNumberLiteral.kt") + public void testGenericProvideDelegateOnNumberLiteral() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericProvideDelegateOnNumberLiteral.kt"); + } + @TestMetadata("hostCheck.kt") public void testHostCheck() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/hostCheck.kt"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.kt index 910b3a3516d..d05476d5756 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatedPropertyResolver.kt @@ -551,6 +551,8 @@ class DelegatedPropertyResolver( if (delegateTypeConstructor is IntegerLiteralTypeConstructor) delegateType = delegateTypeConstructor.getApproximatedType() + val delegateTypeForProperType = if (delegateType.isProperType()) delegateType else null + if (languageVersionSettings.supportsFeature(LanguageFeature.OperatorProvideDelegate)) { val traceForProvideDelegate = TemporaryBindingTrace.create(traceToResolveDelegatedProperty, "Trace to resolve provide delegate") @@ -584,7 +586,9 @@ class DelegatedPropertyResolver( } } return inferDelegateTypeFromGetSetValueMethods( - delegateExpression, variableDescriptor, scopeForDelegate, traceToResolveDelegatedProperty, delegateType, delegateDataFlow + delegateExpression, variableDescriptor, scopeForDelegate, + traceToResolveDelegatedProperty, delegateType, delegateTypeForProperType, + delegateDataFlow ) } @@ -626,6 +630,7 @@ class DelegatedPropertyResolver( scopeForDelegate: LexicalScope, trace: TemporaryBindingTrace, delegateType: KotlinType, + delegateTypeForProperType: KotlinType?, delegateDataFlow: DataFlowInfo ): UnwrappedType { val expectedType = if (variableDescriptor.type !is DeferredType) variableDescriptor.type.unwrap() else null @@ -683,7 +688,7 @@ class DelegatedPropertyResolver( } val resolvedDelegateType = extractResolvedDelegateType(delegateExpression, trace, delegateType) - trace.recordType(delegateExpression, resolvedDelegateType) + trace.recordType(delegateExpression, delegateTypeForProperType ?: resolvedDelegateType) trace.commit() return resolvedDelegateType.unwrap() } diff --git a/compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericProvideDelegateOnNumberLiteral.kt b/compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericProvideDelegateOnNumberLiteral.kt new file mode 100644 index 00000000000..42df13c19cb --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericProvideDelegateOnNumberLiteral.kt @@ -0,0 +1,29 @@ +// !LANGUAGE: +NewInference +// WITH_RUNTIME + +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty + +operator fun T.provideDelegate(thisRef: C, property: KProperty<*>) = + object : ReadOnlyProperty { + override operator fun getValue(thisRef: C, property: KProperty<*>) = this@provideDelegate + } + +val byInt by 42 +val byIntAsLong: Long by 42L +val byIntNullable: Int? by 42 + +val byString by "str" +val byStringNullable: String? = "strNullable" + + +fun box(): String { + if (byInt != 42) return "fail1" + if (byIntAsLong != 42L) return "fail2" + if (byIntNullable != 42) return "fail3" + + if (byString != "str") return "fail4" + if (byStringNullable != "strNullable") return "fail5" + + return "OK" +} \ 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 295dbaeeaaf..c715000b72c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -10836,6 +10836,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericDelegateWithNoAdditionalInfo.kt"); } + @TestMetadata("genericProvideDelegateOnNumberLiteral.kt") + public void testGenericProvideDelegateOnNumberLiteral() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericProvideDelegateOnNumberLiteral.kt"); + } + @TestMetadata("hostCheck.kt") public void testHostCheck() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/hostCheck.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 481a8b716ad..535eb66a749 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -10836,6 +10836,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericDelegateWithNoAdditionalInfo.kt"); } + @TestMetadata("genericProvideDelegateOnNumberLiteral.kt") + public void testGenericProvideDelegateOnNumberLiteral() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericProvideDelegateOnNumberLiteral.kt"); + } + @TestMetadata("hostCheck.kt") public void testHostCheck() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/hostCheck.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index b68c85e3687..0078395e61a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -9611,6 +9611,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericDelegateWithNoAdditionalInfo.kt"); } + @TestMetadata("genericProvideDelegateOnNumberLiteral.kt") + public void testGenericProvideDelegateOnNumberLiteral() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericProvideDelegateOnNumberLiteral.kt"); + } + @TestMetadata("hostCheck.kt") public void testHostCheck() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/hostCheck.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index ac96c557cba..53ed9829264 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -8266,6 +8266,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericDelegateWithNoAdditionalInfo.kt"); } + @TestMetadata("genericProvideDelegateOnNumberLiteral.kt") + public void testGenericProvideDelegateOnNumberLiteral() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericProvideDelegateOnNumberLiteral.kt"); + } + @TestMetadata("hostCheck.kt") public void testHostCheck() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/hostCheck.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 eb2f6ff3061..8088b77cb41 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 @@ -8266,6 +8266,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericDelegateWithNoAdditionalInfo.kt"); } + @TestMetadata("genericProvideDelegateOnNumberLiteral.kt") + public void testGenericProvideDelegateOnNumberLiteral() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericProvideDelegateOnNumberLiteral.kt"); + } + @TestMetadata("hostCheck.kt") public void testHostCheck() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/hostCheck.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 9b15085f25f..d9a44fcdfbd 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 @@ -8266,6 +8266,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericDelegateWithNoAdditionalInfo.kt"); } + @TestMetadata("genericProvideDelegateOnNumberLiteral.kt") + public void testGenericProvideDelegateOnNumberLiteral() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/genericProvideDelegateOnNumberLiteral.kt"); + } + @TestMetadata("hostCheck.kt") public void testHostCheck() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/provideDelegate/hostCheck.kt");