diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java index e638ee7135c..935780b6698 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java @@ -1207,6 +1207,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis runTest("compiler/fir/analysis-tests/testData/resolve/delegates/delegateInference.kt"); } + @Test + @TestMetadata("delegateWithArgInference.kt") + public void testDelegateWithArgInference() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithArgInference.kt"); + } + @Test @TestMetadata("delegateWithLambda.kt") public void testDelegateWithLambda() throws Exception { @@ -1236,6 +1242,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis public void testProvideDelegate() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/delegates/provideDelegate.kt"); } + + @Test + @TestMetadata("receiverInference.kt") + public void testReceiverInference() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.kt"); + } } @Nested diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java index a71c2e22c11..a26c351db8e 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java @@ -1055,6 +1055,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract runTest("compiler/fir/analysis-tests/testData/resolve/delegates/delegateInference.kt"); } + @TestMetadata("delegateWithArgInference.kt") + public void testDelegateWithArgInference() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithArgInference.kt"); + } + @TestMetadata("delegateWithLambda.kt") public void testDelegateWithLambda() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithLambda.kt"); @@ -1079,6 +1084,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract public void testProvideDelegate() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/delegates/provideDelegate.kt"); } + + @TestMetadata("receiverInference.kt") + public void testReceiverInference() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.kt"); + } } @TestMetadata("compiler/fir/analysis-tests/testData/resolve/diagnostics") diff --git a/compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithArgInference.fir.txt b/compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithArgInference.fir.txt new file mode 100644 index 00000000000..54a5637e627 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithArgInference.fir.txt @@ -0,0 +1,27 @@ +FILE: delegateWithArgInference.kt + public final class Delegate : R|kotlin/Any| { + public constructor(data: R|T|): R|Delegate| { + super() + } + + public final val data: R|T| = R|/data| + public get(): R|T| + + public final operator fun getValue(thisRef: R|kotlin/Nothing?|, prop: R|kotlin/reflect/KProperty<*>|): R|T| { + ^getValue this@R|/Delegate|.R|/Delegate.data| + } + + } + public final fun makeIntDelegate(t: R|kotlin/Int|): R|Delegate| { + ^makeIntDelegate R|/Delegate.Delegate|(R|/t|) + } + public final fun materialize(): R|M| { + ^materialize Null(null)!! + } + public final fun id(v: R|Q|): R|Q| { + ^id R|/v| + } + public final val x: R|kotlin/Int|by R|/makeIntDelegate|(R|/id|(R|/materialize|())) + public get(): R|kotlin/Int| { + ^ D|/x|.R|SubstitutionOverride|(Null(null), ::R|/x|) + } diff --git a/compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithArgInference.kt b/compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithArgInference.kt new file mode 100644 index 00000000000..42658b68043 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithArgInference.kt @@ -0,0 +1,16 @@ +import kotlin.reflect.KProperty + +class Delegate(val data: T) { + operator fun getValue(thisRef: Nothing?, prop: KProperty<*>): T = data +} + +fun makeIntDelegate(t: Int): Delegate = Delegate(t) +fun makeDelegate(t: TT): Delegate = Delegate(t) +fun materialize(): M = null!! +fun materialize2(): M2 = null!! +fun id(v: Q): Q = v + +val x by makeIntDelegate(run { + val x: String = materialize() + materialize2() +}) diff --git a/compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.fir.txt b/compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.fir.txt new file mode 100644 index 00000000000..07af82957ec --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.fir.txt @@ -0,0 +1,37 @@ +FILE: receiverInference.kt + public abstract interface XEntity : R|kotlin/Any| { + } + public final class Provider : R|kotlin/Any| { + public constructor(): R|Provider| { + super() + } + + public final operator fun provideDelegate(thisRef: R|XEntity|, prop: R|kotlin/Any|): R|R| { + ^provideDelegate Null(null)!! + } + + } + public final class Prop : R|kotlin/Any| { + public constructor(): R|Prop| { + super() + } + + public final operator fun getValue(receiver: R|E|, prop: R|kotlin/Any|): R|V| { + ^getValue Null(null)!! + } + + } + public final fun mkProp(): R|Provider>| { + ^mkProp R|/Provider.Provider||>() + } + public final class MyEnt : R|XEntity| { + public constructor(): R|MyEnt| { + super() + } + + public final val d: R|kotlin/String|by R|/mkProp|().R|SubstitutionOverride|>|(this@R|/MyEnt|, ::R|/MyEnt.d|) + public get(): R|kotlin/String| { + ^ this@R|/MyEnt|.D|/MyEnt.d|.R|SubstitutionOverride|(this@R|/MyEnt|, ::R|/MyEnt.d|) + } + + } diff --git a/compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.kt b/compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.kt new file mode 100644 index 00000000000..3e6252f4ed1 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.kt @@ -0,0 +1,17 @@ +import kotlin.reflect.KProperty + + +interface XEntity +class Provider { + operator fun provideDelegate(thisRef: XEntity, prop: Any): R = null!! +} + +class Prop { + operator fun getValue(receiver: E, prop: Any): V = null!! +} + +fun mkProp(): Provider> = Provider() + +class MyEnt: XEntity { + val d: String by mkProp() +} \ No newline at end of file diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index 2f305681265..039b391527f 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -1207,6 +1207,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { runTest("compiler/fir/analysis-tests/testData/resolve/delegates/delegateInference.kt"); } + @Test + @TestMetadata("delegateWithArgInference.kt") + public void testDelegateWithArgInference() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithArgInference.kt"); + } + @Test @TestMetadata("delegateWithLambda.kt") public void testDelegateWithLambda() throws Exception { @@ -1236,6 +1242,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { public void testProvideDelegate() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/delegates/provideDelegate.kt"); } + + @Test + @TestMetadata("receiverInference.kt") + public void testReceiverInference() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.kt"); + } } @Nested diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 2d5477087cf..4eb05a205fd 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -1207,6 +1207,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolve/delegates/delegateInference.kt"); } + @Test + @TestMetadata("delegateWithArgInference.kt") + public void testDelegateWithArgInference() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithArgInference.kt"); + } + @Test @TestMetadata("delegateWithLambda.kt") public void testDelegateWithLambda() throws Exception { @@ -1236,6 +1242,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos public void testProvideDelegate() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/delegates/provideDelegate.kt"); } + + @Test + @TestMetadata("receiverInference.kt") + public void testReceiverInference() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.kt"); + } } @Nested