From 034671ad786f7614bf77c0cb5ab91dc1b3aefa00 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Tue, 8 Aug 2023 12:33:05 +0200 Subject: [PATCH] K2: Update substituted member candidate if it contains type variables See the comment at updateSubstitutedMemberIfReceiverContainsTypeVariable It became necessary after delegate inference is rewritten, since before that happened, stub types were being left there and FIR2IR handled them accidentally properly because stub types are equal to anything. But that wasn't really correct even there because stub types are not intended to leak out of the FIR ^KT-61060 --- .../testdata/lazyResolve/lazyProperty.txt | 8 +- .../lazyResolve/lazyPropertyScript.txt | 8 +- .../delegates/delegateInference.fir.txt | 4 +- .../delegates/delegateWithLambda.fir.txt | 2 +- .../resolve/delegates/provideDelegate.fir.txt | 4 +- .../delegates/receiverInference.fir.txt | 4 +- .../delegates/delegateTypeMismatch.fir.txt | 2 +- .../delegates/delegateWithAnonymousObject.dot | 4 +- .../delegateWithAnonymousObject.fir.txt | 2 +- .../delegates/kt41917.fir.txt | 4 +- .../delegates/nullableTypeDelegate.fir.txt | 2 +- .../propertyWithFunctionalType.fir.txt | 2 +- .../intellij/hideBySeverity.fir.txt | 6 +- .../problems/WithValidityAssertion.fir.txt | 2 +- ...LightTreeBlackBoxCodegenTestGenerated.java | 6 + .../FirPsiBlackBoxCodegenTestGenerated.java | 6 + .../kotlin/fir/resolve/calls/Candidate.kt | 19 +++- .../fir/resolve/inference/FirCallCompleter.kt | 4 +- ...rCallCompletionResultsWriterTransformer.kt | 105 +++++++++++++++++- .../delegatedProperty/noTypeVariablesLeft.kt | 18 +++ .../inference/delegates/kt50994.fir.txt | 14 +-- .../delegates/kt50994.reversed.fir.txt | 8 +- .../codegen/BlackBoxCodegenTestGenerated.java | 6 + .../IrBlackBoxCodegenTestGenerated.java | 6 + ...kBoxCodegenWithIrInlinerTestGenerated.java | 6 + .../LightAnalysisModeTestGenerated.java | 5 + .../fir/FirJsCodegenBoxTestGenerated.java | 6 + .../fir/FirJsES6CodegenBoxTestGenerated.java | 6 + .../test/ir/IrJsCodegenBoxTestGenerated.java | 6 + .../ir/IrJsES6CodegenBoxTestGenerated.java | 6 + .../FirNativeCodegenBoxTestGenerated.java | 6 + .../FirNativeCodegenBoxTestNoPLGenerated.java | 6 + .../NativeCodegenBoxTestGenerated.java | 6 + .../NativeCodegenBoxTestNoPLGenerated.java | 6 + .../test/FirWasmCodegenBoxTestGenerated.java | 6 + .../test/K1WasmCodegenBoxTestGenerated.java | 6 + 36 files changed, 272 insertions(+), 45 deletions(-) create mode 100644 compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/lazyProperty.txt b/analysis/low-level-api-fir/testdata/lazyResolve/lazyProperty.txt index b889e181488..2a0f409a8c0 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/lazyProperty.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/lazyProperty.txt @@ -311,7 +311,7 @@ FILE: [ResolvedTo(IMPORTS)] lazyProperty.kt } ) public [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] [ContainingClassKey=Test] get(): R|kotlin/String| { - ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) + ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) } } @@ -346,7 +346,7 @@ FILE: [ResolvedTo(IMPORTS)] lazyProperty.kt } ) public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=Test] get(): R|kotlin/String| { - ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) + ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) } } @@ -381,7 +381,7 @@ FILE: [ResolvedTo(IMPORTS)] lazyProperty.kt } ) public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Test] get(): R|kotlin/String| { - ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) + ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) } } @@ -420,7 +420,7 @@ FILE: [ResolvedTo(BODY_RESOLVE)] lazyProperty.kt } ) public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Test] get(): R|kotlin/String| { - ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) + ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) } } diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/lazyPropertyScript.txt b/analysis/low-level-api-fir/testdata/lazyResolve/lazyPropertyScript.txt index 9c0882e260a..5f0a8fae9e9 100644 --- a/analysis/low-level-api-fir/testdata/lazyResolve/lazyPropertyScript.txt +++ b/analysis/low-level-api-fir/testdata/lazyResolve/lazyPropertyScript.txt @@ -409,7 +409,7 @@ FILE: [ResolvedTo(IMPORTS)] lazyPropertyScript.kts } ) public [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] [ContainingClassKey=Test] get(): R|kotlin/String| { - ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) + ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) } } @@ -453,7 +453,7 @@ FILE: [ResolvedTo(IMPORTS)] lazyPropertyScript.kts } ) public [ResolvedTo(ANNOTATIONS_ARGUMENTS_MAPPING)] [ContainingClassKey=Test] get(): R|kotlin/String| { - ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) + ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) } } @@ -497,7 +497,7 @@ FILE: [ResolvedTo(IMPORTS)] lazyPropertyScript.kts } ) public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Test] get(): R|kotlin/String| { - ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) + ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) } } @@ -545,7 +545,7 @@ FILE: [ResolvedTo(BODY_RESOLVE)] lazyPropertyScript.kts } ) public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Test] get(): R|kotlin/String| { - ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) + ^ this@R|/Test|.D|/Test.resolveMe|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.resolveMe|) } } diff --git a/compiler/fir/analysis-tests/testData/resolve/delegates/delegateInference.fir.txt b/compiler/fir/analysis-tests/testData/resolve/delegates/delegateInference.fir.txt index 0e1971f4e89..fd9025982c7 100644 --- a/compiler/fir/analysis-tests/testData/resolve/delegates/delegateInference.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/delegates/delegateInference.fir.txt @@ -42,7 +42,7 @@ FILE: delegateInference.kt public final var x: R|kotlin/Boolean|by R|/FreezableVar.FreezableVar|(Boolean(true)) public get(): R|kotlin/Boolean| { - ^ this@R|/Test|.D|/Test.x|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.x|) + ^ this@R|/Test|.D|/Test.x|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.x|) } public set(: R|kotlin/Boolean|): R|kotlin/Unit| { ^ this@R|/Test|.D|/Test.x|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.x|, R|/x|) @@ -50,7 +50,7 @@ FILE: delegateInference.kt public final var y: R|kotlin/String|by R|/FreezableVar.FreezableVar|(String()) public get(): R|kotlin/String| { - ^ this@R|/Test|.D|/Test.y|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.y|) + ^ this@R|/Test|.D|/Test.y|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.y|) } public set(: R|kotlin/String|): R|kotlin/Unit| { ^ this@R|/Test|.D|/Test.y|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.y|, R|/y|) diff --git a/compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithLambda.fir.txt b/compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithLambda.fir.txt index dd2ce2b97aa..7c1efc63dae 100644 --- a/compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithLambda.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/delegates/delegateWithLambda.fir.txt @@ -31,7 +31,7 @@ FILE: delegateWithLambda.kt } ) public get(): R|kotlin/String| { - ^ this@R|/Test|.D|/Test.x|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.x|) + ^ this@R|/Test|.D|/Test.x|.R|SubstitutionOverride|(this@R|/Test|, ::R|/Test.x|) } } diff --git a/compiler/fir/analysis-tests/testData/resolve/delegates/provideDelegate.fir.txt b/compiler/fir/analysis-tests/testData/resolve/delegates/provideDelegate.fir.txt index 366318bff69..a1eda8acb41 100644 --- a/compiler/fir/analysis-tests/testData/resolve/delegates/provideDelegate.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/delegates/provideDelegate.fir.txt @@ -38,9 +38,9 @@ FILE: provideDelegate.kt super() } - public final val x: R|kotlin/Int|by R|/delegate|(Int(1)).R|SubstitutionOverride|>|(this@R|/A|, ::R|/A.x|) + public final val x: R|kotlin/Int|by R|/delegate|(Int(1)).R|SubstitutionOverride|>|(this@R|/A|, ::R|/A.x|) public get(): R|kotlin/Int| { - ^ this@R|/A|.D|/A.x|.R|SubstitutionOverride|(this@R|/A|, ::R|/A.x|) + ^ this@R|/A|.D|/A.x|.R|SubstitutionOverride|(this@R|/A|, ::R|/A.x|) } } diff --git a/compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.fir.txt b/compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.fir.txt index 0cbd29b9f79..713c7e6a4ce 100644 --- a/compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/delegates/receiverInference.fir.txt @@ -29,9 +29,9 @@ FILE: receiverInference.kt super() } - public final val d: R|kotlin/String|by R|/mkProp|().R|SubstitutionOverride|>|(this@R|/MyEnt|, ::R|/MyEnt.d|) + 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|) + ^ this@R|/MyEnt|.D|/MyEnt.d|.R|SubstitutionOverride|(this@R|/MyEnt|, ::R|/MyEnt.d|) } } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateTypeMismatch.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateTypeMismatch.fir.txt index 1d9faccd665..4f1cc3eed9f 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateTypeMismatch.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateTypeMismatch.fir.txt @@ -35,7 +35,7 @@ FILE: delegateTypeMismatch.kt public final var classifierNamePolicy: R|ClassifierNamePolicy|by this@R|/A|.R|/A.property|(Q|ClassifierNamePolicy.SOURCE_CODE_QUALIFIED|) public get(): R|ClassifierNamePolicy| { - ^ this@R|/A|.D|/A.classifierNamePolicy|.R|SubstitutionOverride|(this@R|/A|, ::R|/A.classifierNamePolicy|) + ^ this@R|/A|.D|/A.classifierNamePolicy|.R|SubstitutionOverride|(this@R|/A|, ::R|/A.classifierNamePolicy|) } public set(: R|ClassifierNamePolicy|): R|kotlin/Unit| { ^ this@R|/A|.D|/A.classifierNamePolicy|.R|SubstitutionOverride|(this@R|/A|, ::R|/A.classifierNamePolicy|, R|/classifierNamePolicy|) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot index 5ccaab568c0..f1f7f2262ec 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.dot @@ -212,8 +212,8 @@ digraph delegateWithAnonymousObject_kt { color=blue 65 [label="Enter block"]; 66 [label="Access variable D|/IssuesListUserProfile.issueListView|"]; - 67 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(...)" style="filled" fillcolor=yellow]; - 68 [label="Jump: ^ this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|)"]; + 67 [label="Function call: this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(...)" style="filled" fillcolor=yellow]; + 68 [label="Jump: ^ this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|)"]; 69 [label="Stub" style="filled" fillcolor=gray]; 70 [label="Exit block" style="filled" fillcolor=gray]; } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.fir.txt index 4c4284ad189..42caf3dcf0d 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/delegateWithAnonymousObject.fir.txt @@ -41,7 +41,7 @@ FILE: delegateWithAnonymousObject.kt } ) public get(): R|IssueListView| { - ^ this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|) + ^ this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|) } public set(: R|IssueListView|): R|kotlin/Unit| { ^ this@R|/IssuesListUserProfile|.D|/IssuesListUserProfile.issueListView|.R|SubstitutionOverride|(this@R|/IssuesListUserProfile|, ::R|/IssuesListUserProfile.issueListView|, R|/issueListView|) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/kt41917.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/kt41917.fir.txt index 6f62f64f9e4..5ec004ee783 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/kt41917.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/kt41917.fir.txt @@ -25,12 +25,12 @@ FILE: kt41917.kt public final val implicit: R|kotlin/String|by R|/DummyDelegate.DummyDelegate|(String(hello)) public get(): R|kotlin/String| { - ^ this@R|/A|.D|/A.implicit|.R|SubstitutionOverride|(this@R|/A|, ::R|/A.implicit|) + ^ this@R|/A|.D|/A.implicit|.R|SubstitutionOverride|(this@R|/A|, ::R|/A.implicit|) } public final val explicit: R|kotlin/String|by R|/DummyDelegate.DummyDelegate|(String(hello)) public get(): R|kotlin/String| { - ^ this@R|/A|.D|/A.explicit|.R|SubstitutionOverride|(this@R|/A|, ::R|/A.explicit|) + ^ this@R|/A|.D|/A.explicit|.R|SubstitutionOverride|(this@R|/A|, ::R|/A.explicit|) } } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/nullableTypeDelegate.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/nullableTypeDelegate.fir.txt index 1426ca2921e..84d7ea93248 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/nullableTypeDelegate.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/nullableTypeDelegate.fir.txt @@ -19,7 +19,7 @@ FILE: nullableTypeDelegate.kt public final var other: R|MyClassSome?|by this@R|/MyClassSome|.R|/directed|((Q|MyClassSome|).R|kotlin/jvm/java|) public get(): R|MyClassSome?| { - ^ this@R|/MyClassSome|.D|/MyClassSome.other|.R|SubstitutionOverride|(this@R|/MyClassSome|, ::R|/MyClassSome.other|) + ^ this@R|/MyClassSome|.D|/MyClassSome.other|.R|SubstitutionOverride|(this@R|/MyClassSome|, ::R|/MyClassSome.other|) } public set(: R|MyClassSome?|): R|kotlin/Unit| { ^ this@R|/MyClassSome|.D|/MyClassSome.other|.R|SubstitutionOverride|(this@R|/MyClassSome|, ::R|/MyClassSome.other|, R|/other|) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/propertyWithFunctionalType.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/propertyWithFunctionalType.fir.txt index 5984fafbc39..c8e687ff0cc 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/propertyWithFunctionalType.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/delegates/propertyWithFunctionalType.fir.txt @@ -26,7 +26,7 @@ FILE: propertyWithFunctionalType.kt } ) public get(): R|(B) -> B| { - ^ this@R|/A|.D|/A.conventerWithExpectedType|.R|SubstitutionOverride|(this@R|/A|, ::R|/A.conventerWithExpectedType|) + ^ this@R|/A|.D|/A.conventerWithExpectedType|.R|SubstitutionOverride B|>|(this@R|/A|, ::R|/A.conventerWithExpectedType|) } public set(: R|(B) -> B|): R|kotlin/Unit| { ^ this@R|/A|.D|/A.conventerWithExpectedType|.R|SubstitutionOverride|(this@R|/A|, ::R|/A.conventerWithExpectedType|, R|/conventerWithExpectedType|) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/hideBySeverity.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/hideBySeverity.fir.txt index ea90fd5e36f..604cf0dfc7f 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/hideBySeverity.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/hideBySeverity.fir.txt @@ -30,14 +30,14 @@ FILE: hideBySeverity.kt super() } - public final val hideBySeverityDerived: R|kotlin/collections/MutableSet|by this@R|/Some|.R|/BaseState.propertyDerived||>(R|kotlin/collections/mutableSetOf|()).R|SubstitutionOverride|>|(this@R|/Some|, ::R|/Some.hideBySeverityDerived|) + public final val hideBySeverityDerived: R|kotlin/collections/MutableSet|by this@R|/Some|.R|/BaseState.propertyDerived||>(R|kotlin/collections/mutableSetOf|()).R|SubstitutionOverride>|>|(this@R|/Some|, ::R|/Some.hideBySeverityDerived|) public get(): R|kotlin/collections/MutableSet| { - ^ this@R|/Some|.D|/Some.hideBySeverityDerived|.R|SubstitutionOverride|(this@R|/Some|, ::R|/Some.hideBySeverityDerived|) + ^ this@R|/Some|.D|/Some.hideBySeverityDerived|.R|SubstitutionOverride|>|(this@R|/Some|, ::R|/Some.hideBySeverityDerived|) } public final val hideBySeverityBase: R|kotlin/collections/MutableSet|by this@R|/Some|.R|/BaseState.propertyBase||>(R|kotlin/collections/mutableSetOf|()) public get(): R|kotlin/collections/MutableSet| { - ^ this@R|/Some|.D|/Some.hideBySeverityBase|.R|SubstitutionOverride|(this@R|/Some|, ::R|/Some.hideBySeverityBase|) + ^ this@R|/Some|.D|/Some.hideBySeverityBase|.R|SubstitutionOverride|>|(this@R|/Some|, ::R|/Some.hideBySeverityBase|) } } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/WithValidityAssertion.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/WithValidityAssertion.fir.txt index 9e70aebe8eb..86191a0097a 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/WithValidityAssertion.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/WithValidityAssertion.fir.txt @@ -61,7 +61,7 @@ FILE: WithValidityAssertion.kt } ) private get(): R|kotlin/collections/List| { - ^ this@R|/KtFirNonStarImportingScope|.D|/KtFirNonStarImportingScope.imports|.R|SubstitutionOverride|(this@R|/KtFirNonStarImportingScope|, ::R|/KtFirNonStarImportingScope.imports|) + ^ this@R|/KtFirNonStarImportingScope|.D|/KtFirNonStarImportingScope.imports|.R|SubstitutionOverride|>|(this@R|/KtFirNonStarImportingScope|, ::R|/KtFirNonStarImportingScope.imports|) } public final fun getCallableSymbols(nameFilter: R|KtScopeNameFilter|): R|kotlin/sequences/Sequence| { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index 043a257b35d..0860901f18a 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -15405,6 +15405,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateInSubClass.kt") public void testPrivateInSubClass() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index c81cca3b6c1..6fca82c1316 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -15405,6 +15405,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateInSubClass.kt") public void testPrivateInSubClass() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt index 96008604668..b39be1fa2ff 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/Candidate.kt @@ -30,7 +30,7 @@ import org.jetbrains.kotlin.resolve.calls.tower.isSuccess import org.jetbrains.kotlin.util.CodeFragmentAdjustment class Candidate( - override val symbol: FirBasedSymbol<*>, + symbol: FirBasedSymbol<*>, // Here we may have an ExpressionReceiverValue // - in case a use-site receiver is explicit // - in some cases with static entities, no matter is a use-site receiver explicit or not @@ -49,6 +49,23 @@ class Candidate( val isFromOriginalTypeInPresenceOfSmartCast: Boolean = false, ) : AbstractCandidate() { + override var symbol: FirBasedSymbol<*> = symbol + private set + + + /** + * Please avoid updating symbol in the candidate whenever it's possible. + * The only case when currently it seems to be unavoidable is at + * [org.jetbrains.kotlin.fir.resolve.transformers.FirCallCompletionResultsWriterTransformer.refineSubstitutedMemberIfReceiverContainsTypeVariable] + */ + @RequiresOptIn + annotation class UpdatingSymbol + + @UpdatingSymbol + fun updateSymbol(symbol: FirBasedSymbol<*>) { + this.symbol = symbol + } + private var systemInitialized: Boolean = false val system: NewConstraintSystemImpl by lazy(LazyThreadSafetyMode.NONE) { val system = constraintSystemFactory.createConstraintSystem() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt index e8a3b6172f7..3b18153cec7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirCallCompleter.kt @@ -105,7 +105,7 @@ class FirCallCompleter( .buildAbstractResultingSubstitutor(session.typeContext) as ConeSubstitutor val completedCall = call.transformSingle( FirCallCompletionResultsWriterTransformer( - session, finalSubstitutor, + session, components.scopeSession, finalSubstitutor, components.returnTypeCalculator, session.typeApproximator, components.dataFlowAnalyzer, @@ -222,7 +222,7 @@ class FirCallCompleter( mode: FirCallCompletionResultsWriterTransformer.Mode = FirCallCompletionResultsWriterTransformer.Mode.Normal ): FirCallCompletionResultsWriterTransformer { return FirCallCompletionResultsWriterTransformer( - session, substitutor, components.returnTypeCalculator, + session, components.scopeSession, substitutor, components.returnTypeCalculator, session.typeApproximator, components.dataFlowAnalyzer, components.integerLiteralAndOperatorApproximationTransformer, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index bfb326fdad2..1e2c30d76ef 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -18,21 +18,22 @@ import org.jetbrains.kotlin.fir.references.builder.buildResolvedCallableReferenc import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.Candidate -import org.jetbrains.kotlin.fir.resolve.calls.ResolutionResultOverridesOtherToPreserveCompatibility import org.jetbrains.kotlin.fir.resolve.calls.FirErrorReferenceWithCandidate import org.jetbrains.kotlin.fir.resolve.calls.FirNamedReferenceWithCandidate +import org.jetbrains.kotlin.fir.resolve.calls.ResolutionResultOverridesOtherToPreserveCompatibility import org.jetbrains.kotlin.fir.resolve.dfa.FirDataFlowAnalyzer import org.jetbrains.kotlin.fir.resolve.diagnostics.* import org.jetbrains.kotlin.fir.resolve.inference.ResolvedLambdaAtom import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor +import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.* +import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator import org.jetbrains.kotlin.fir.scopes.impl.ConvertibleIntegerOperators.binaryOperatorsWithSignedArgument +import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope import org.jetbrains.kotlin.fir.scopes.impl.isWrappedIntegerOperator import org.jetbrains.kotlin.fir.scopes.impl.isWrappedIntegerOperatorForUnsignedType import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef import org.jetbrains.kotlin.fir.types.builder.buildStarProjection @@ -52,6 +53,7 @@ import kotlin.collections.component2 class FirCallCompletionResultsWriterTransformer( override val session: FirSession, + private val scopeSession: ScopeSession, private val finalSubstitutor: ConeSubstitutor, private val typeCalculator: ReturnTypeCalculator, private val typeApproximator: ConeTypeApproximator, @@ -95,6 +97,8 @@ class FirCallCompletionResultsWriterTransformer( ): T { val subCandidate = calleeReference.candidate + subCandidate.updateSubstitutedMemberIfReceiverContainsTypeVariable() + val declaration = subCandidate.symbol.fir val typeArguments = computeTypeArguments(qualifiedAccessExpression, subCandidate) val type = if (declaration is FirCallableDeclaration) { @@ -159,6 +163,99 @@ class FirCallCompletionResultsWriterTransformer( return qualifiedAccessExpression } + /** + * Currently, it's only necessary for delegate inference, e.g. when the delegate expression returns some generic type + * with non-fixed yet type variables and inside its member scope we find the `getValue` function that might still contain + * the type variables, too and they even might be used to adding some constraints for them. + * + * After the completion ends and all the variables are fixed, this member candidate still contains them, so what this function does + * is replace the candidate from Delegate scope to the same candidate from Delegate. + * + * The fun fact is that it wasn't necessary before Delegate Inference refactoring because there were stub types left and FIR2IR + * handled them properly as equal-to-anything unlike the type variable types. + * + * See codegen/box/delegatedProperty/noTypeVariablesLeft.kt + * + * That all looks a bit ugly, but there are not many options. + * In an ideal world, we wouldn't have substitution overrides in FIR, but instead used a pair original symbol and substitution + * everywhere, but we're not there yet. + * + * TODO: In future, it would be nice to get rid of it and there's actually a way to do it – not using substitution overrides (see KT-61618) + */ + private fun Candidate.updateSubstitutedMemberIfReceiverContainsTypeVariable() { + val updatedSymbol = symbol.updateSubstitutedMemberIfReceiverContainsTypeVariable() ?: return + val oldSymbol = symbol + + @OptIn(Candidate.UpdatingSymbol::class) + updateSymbol(updatedSymbol) + + check(updatedSymbol is FirCallableSymbol<*>) + + substitutor = substitutorByMap( + updatedSymbol.typeParameterSymbols.zip(freshVariables).associate { (typeParameter, typeVariable) -> + typeParameter to typeVariable.defaultType + }, + session, + ) + + if (updatedSymbol !is FirFunctionSymbol) return + require(oldSymbol is FirFunctionSymbol) + + val oldArgumentMapping = argumentMapping ?: return + val oldValueParametersToNewMap = oldSymbol.valueParameterSymbols.zip(updatedSymbol.valueParameterSymbols).toMap() + + argumentMapping = oldArgumentMapping.mapValuesTo(linkedMapOf()) { + oldValueParametersToNewMap[it.value.symbol]!!.fir + } + } + + private fun FirBasedSymbol<*>.updateSubstitutedMemberIfReceiverContainsTypeVariable(): FirBasedSymbol<*>? { + // TODO: Add assertion that this function returns not-null only for BI and delegation inference + if (mode != Mode.DelegatedPropertyCompletion) return null + + val fir = fir + if (fir !is FirCallableDeclaration) return null + + val dispatchReceiverType = fir.dispatchReceiverType ?: return null + val updatedDispatchReceiverType = finalSubstitutor.substituteOrNull(dispatchReceiverType) ?: return null + + val scope = + updatedDispatchReceiverType.scope( + session, + scopeSession, + FakeOverrideTypeCalculator.DoNothing, + FirResolvePhase.STATUS + ) as? FirClassSubstitutionScope ?: return null + + val original = fir.originalForSubstitutionOverride ?: return null + return findSingleSubstitutedSymbolWithOriginal(original.symbol) { processor -> + when (original) { + is FirSimpleFunction -> scope.processFunctionsByName(original.name, processor) + is FirProperty -> scope.processFunctionsByName(original.name, processor) + is FirConstructor -> scope.processDeclaredConstructors(processor) + else -> error("Unexpected declaration kind ${original.render()}") + } + } + } + + private fun findSingleSubstitutedSymbolWithOriginal( + original: FirBasedSymbol<*>, + processCallables: ((FirCallableSymbol<*>) -> Unit) -> Unit, + ): FirBasedSymbol<*> { + var result: FirBasedSymbol<*>? = null + + processCallables { symbol -> + if (symbol.originalForSubstitutionOverride == original) { + check(result == null) { + "Expected single, but ${result!!.fir.render()} and ${symbol.fir.render()} found" + } + result = symbol + } + } + + return result ?: error("No symbol found for ${original.fir.render()}") + } + override fun transformQualifiedAccessExpression( qualifiedAccessExpression: FirQualifiedAccessExpression, data: ExpectedArgumentType?, diff --git a/compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt b/compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt new file mode 100644 index 00000000000..51a67933c90 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt @@ -0,0 +1,18 @@ +import kotlin.reflect.KProperty + +var foo: (() -> String)? by property(null) + +private fun property(initialValue: T): RwProperty = RwProperty(initialValue) + +class RwProperty(var v: V) { + operator fun getValue(thisRef: Any?, property: KProperty<*>): V = v + + operator fun setValue(thisRef: Any?, property: KProperty<*>, value: V) { + this.v = value + } +} + +fun box(): String { + foo = { "OK" } + return foo!!.invoke() +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/delegates/kt50994.fir.txt b/compiler/testData/diagnostics/testsWithStdLib/inference/delegates/kt50994.fir.txt index 5401745ac20..0c43ed18384 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/inference/delegates/kt50994.fir.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/delegates/kt50994.fir.txt @@ -6,7 +6,7 @@ FILE: kt50994.fir.kt public final var processor: R|ProcessorWithChildren?|by this@R|/ProcessorWithParent|.R|/parent|(Q|ProcessorWithChildren|::R|/ProcessorWithChildren.processors|) public get(): R|ProcessorWithChildren?| { - ^ this@R|/ProcessorWithParent|.D|/ProcessorWithParent.processor|.R|SubstitutionOverride|(this@R|/ProcessorWithParent|, ::R|/ProcessorWithParent.processor|) + ^ this@R|/ProcessorWithParent|.D|/ProcessorWithParent.processor|.R|SubstitutionOverride|(this@R|/ProcessorWithParent|, ::R|/ProcessorWithParent.processor|) } public set(: R|ProcessorWithChildren?|): R|kotlin/Unit| { ^ this@R|/ProcessorWithParent|.D|/ProcessorWithParent.processor|.R|SubstitutionOverride|(this@R|/ProcessorWithParent|, ::R|/ProcessorWithParent.processor|, R|/processor|) @@ -18,11 +18,11 @@ FILE: kt50994.fir.kt super() } - public final var processors: R|kotlin/collections/MutableCollection|by this@R|/ProcessorWithChildren|.R|/children#|<, >((Q|ProcessorWithParent|).R|kotlin/jvm/java|, Q|ProcessorWithParent|::#) - public get(): R|kotlin/collections/MutableCollection| { - ^ this@R|/ProcessorWithChildren|.D|/ProcessorWithChildren.processors|.R|SubstitutionOverride|>|(this@R|/ProcessorWithChildren|, ::R|/ProcessorWithChildren.processors|) + public final var processors: R|kotlin/collections/MutableCollection|by this@R|/ProcessorWithChildren|.R|/children#|((Q|ProcessorWithParent|).R|kotlin/jvm/java|, Q|ProcessorWithParent|::#) + public get(): R|kotlin/collections/MutableCollection| { + ^ this@R|/ProcessorWithChildren|.D|/ProcessorWithChildren.processors|.R|SubstitutionOverride|>|(this@R|/ProcessorWithChildren|, ::R|/ProcessorWithChildren.processors|) } - public set(: R|kotlin/collections/MutableCollection|): R|kotlin/Unit| { + public set(: R|kotlin/collections/MutableCollection|): R|kotlin/Unit| { ^ this@R|/ProcessorWithChildren|.D|/ProcessorWithChildren.processors|.R|SubstitutionOverride|(this@R|/ProcessorWithChildren|, ::R|/ProcessorWithChildren.processors|, R|/processors|) } @@ -48,7 +48,7 @@ FILE: kt50994.fir.kt public final var processors: R|kotlin/collections/MutableCollection|by this@R|/Processor2WithChildren|.R|/children|((Q|Processor2WithParent|).R|kotlin/jvm/java|, Q|Processor2WithParent|::R|/Processor2WithParent.processor|) public get(): R|kotlin/collections/MutableCollection| { - ^ this@R|/Processor2WithChildren|.D|/Processor2WithChildren.processors|.R|SubstitutionOverride|>|(this@R|/Processor2WithChildren|, ::R|/Processor2WithChildren.processors|) + ^ this@R|/Processor2WithChildren|.D|/Processor2WithChildren.processors|.R|SubstitutionOverride|>|(this@R|/Processor2WithChildren|, ::R|/Processor2WithChildren.processors|) } public set(: R|kotlin/collections/MutableCollection|): R|kotlin/Unit| { ^ this@R|/Processor2WithChildren|.D|/Processor2WithChildren.processors|.R|SubstitutionOverride|(this@R|/Processor2WithChildren|, ::R|/Processor2WithChildren.processors|, R|/processors|) @@ -76,7 +76,7 @@ FILE: kt50994.fir.kt public final var processors: R|kotlin/collections/MutableCollection|by this@R|/Processor3WithChildren|.R|/children|((Q|Processor3WithParent|).R|kotlin/jvm/java|, Q|Processor3WithParent|::R|/Processor3WithParent.processor|) public get(): R|kotlin/collections/MutableCollection| { - ^ this@R|/Processor3WithChildren|.D|/Processor3WithChildren.processors|.R|SubstitutionOverride|>|(this@R|/Processor3WithChildren|, ::R|/Processor3WithChildren.processors|) + ^ this@R|/Processor3WithChildren|.D|/Processor3WithChildren.processors|.R|SubstitutionOverride|>|(this@R|/Processor3WithChildren|, ::R|/Processor3WithChildren.processors|) } public set(: R|kotlin/collections/MutableCollection|): R|kotlin/Unit| { ^ this@R|/Processor3WithChildren|.D|/Processor3WithChildren.processors|.R|SubstitutionOverride|(this@R|/Processor3WithChildren|, ::R|/Processor3WithChildren.processors|, R|/processors|) diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/delegates/kt50994.reversed.fir.txt b/compiler/testData/diagnostics/testsWithStdLib/inference/delegates/kt50994.reversed.fir.txt index 344db56b48a..2470fb579ec 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/inference/delegates/kt50994.reversed.fir.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/delegates/kt50994.reversed.fir.txt @@ -6,7 +6,7 @@ FILE: kt50994.reversed.kt public final var processor: R|ProcessorWithChildren?|by this@R|/ProcessorWithParent|.R|/parent|(Q|ProcessorWithChildren|::R|/ProcessorWithChildren.processors|) public get(): R|ProcessorWithChildren?| { - ^ this@R|/ProcessorWithParent|.D|/ProcessorWithParent.processor|.R|SubstitutionOverride|(this@R|/ProcessorWithParent|, ::R|/ProcessorWithParent.processor|) + ^ this@R|/ProcessorWithParent|.D|/ProcessorWithParent.processor|.R|SubstitutionOverride|(this@R|/ProcessorWithParent|, ::R|/ProcessorWithParent.processor|) } public set(: R|ProcessorWithChildren?|): R|kotlin/Unit| { ^ this@R|/ProcessorWithParent|.D|/ProcessorWithParent.processor|.R|SubstitutionOverride|(this@R|/ProcessorWithParent|, ::R|/ProcessorWithParent.processor|, R|/processor|) @@ -20,7 +20,7 @@ FILE: kt50994.reversed.kt public final var processors: R|kotlin/collections/MutableCollection|by this@R|/ProcessorWithChildren|.R|/children|((Q|ProcessorWithParent|).R|kotlin/jvm/java|, Q|ProcessorWithParent|::R|/ProcessorWithParent.processor|) public get(): R|kotlin/collections/MutableCollection| { - ^ this@R|/ProcessorWithChildren|.D|/ProcessorWithChildren.processors|.R|SubstitutionOverride|>|(this@R|/ProcessorWithChildren|, ::R|/ProcessorWithChildren.processors|) + ^ this@R|/ProcessorWithChildren|.D|/ProcessorWithChildren.processors|.R|SubstitutionOverride|>|(this@R|/ProcessorWithChildren|, ::R|/ProcessorWithChildren.processors|) } public set(: R|kotlin/collections/MutableCollection|): R|kotlin/Unit| { ^ this@R|/ProcessorWithChildren|.D|/ProcessorWithChildren.processors|.R|SubstitutionOverride|(this@R|/ProcessorWithChildren|, ::R|/ProcessorWithChildren.processors|, R|/processors|) @@ -48,7 +48,7 @@ FILE: kt50994.reversed.kt public final var processors: R|kotlin/collections/MutableCollection|by this@R|/Processor2WithChildren|.R|/children|((Q|Processor2WithParent|).R|kotlin/jvm/java|, Q|Processor2WithParent|::R|/Processor2WithParent.processor|) public get(): R|kotlin/collections/MutableCollection| { - ^ this@R|/Processor2WithChildren|.D|/Processor2WithChildren.processors|.R|SubstitutionOverride|>|(this@R|/Processor2WithChildren|, ::R|/Processor2WithChildren.processors|) + ^ this@R|/Processor2WithChildren|.D|/Processor2WithChildren.processors|.R|SubstitutionOverride|>|(this@R|/Processor2WithChildren|, ::R|/Processor2WithChildren.processors|) } public set(: R|kotlin/collections/MutableCollection|): R|kotlin/Unit| { ^ this@R|/Processor2WithChildren|.D|/Processor2WithChildren.processors|.R|SubstitutionOverride|(this@R|/Processor2WithChildren|, ::R|/Processor2WithChildren.processors|, R|/processors|) @@ -76,7 +76,7 @@ FILE: kt50994.reversed.kt public final var processors: R|kotlin/collections/MutableCollection|by this@R|/Processor3WithChildren|.R|/children|((Q|Processor3WithParent|).R|kotlin/jvm/java|, Q|Processor3WithParent|::R|/Processor3WithParent.processor|) public get(): R|kotlin/collections/MutableCollection| { - ^ this@R|/Processor3WithChildren|.D|/Processor3WithChildren.processors|.R|SubstitutionOverride|>|(this@R|/Processor3WithChildren|, ::R|/Processor3WithChildren.processors|) + ^ this@R|/Processor3WithChildren|.D|/Processor3WithChildren.processors|.R|SubstitutionOverride|>|(this@R|/Processor3WithChildren|, ::R|/Processor3WithChildren.processors|) } public set(: R|kotlin/collections/MutableCollection|): R|kotlin/Unit| { ^ this@R|/Processor3WithChildren|.D|/Processor3WithChildren.processors|.R|SubstitutionOverride|(this@R|/Processor3WithChildren|, ::R|/Processor3WithChildren.processors|, R|/processors|) diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 38820a56029..ac779c1a535 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -15045,6 +15045,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateInSubClass.kt") public void testPrivateInSubClass() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 7a633a947cd..13a3ad59e71 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -15405,6 +15405,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateInSubClass.kt") public void testPrivateInSubClass() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index 4a10ae8128c..02065bfdfc7 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -15405,6 +15405,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateInSubClass.kt") public void testPrivateInSubClass() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index e12751ff9ed..bb2588511bf 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12643,6 +12643,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @TestMetadata("privateInSubClass.kt") public void testPrivateInSubClass() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/privateInSubClass.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java index 7d3b7851359..1e7d0a64ce4 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java @@ -11517,6 +11517,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest { runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateVar.kt") public void testPrivateVar() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6CodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6CodegenBoxTestGenerated.java index 53cb1f458b2..9392b765562 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6CodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6CodegenBoxTestGenerated.java @@ -11517,6 +11517,12 @@ public class FirJsES6CodegenBoxTestGenerated extends AbstractFirJsES6CodegenBoxT runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateVar.kt") public void testPrivateVar() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index 04a42e2e9a6..be7846383c1 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -11517,6 +11517,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateVar.kt") public void testPrivateVar() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java index 744ae66e5df..6038ebe663d 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java @@ -11517,6 +11517,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateVar.kt") public void testPrivateVar() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java index 3aecad84210..27a1afceb6a 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestGenerated.java @@ -12536,6 +12536,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateVar.kt") public void testPrivateVar() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java index 442be8281c2..8312a432242 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeCodegenBoxTestNoPLGenerated.java @@ -12826,6 +12826,12 @@ public class FirNativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenB runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateVar.kt") public void testPrivateVar() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index 82bbe0199a3..f3945e96be2 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -12392,6 +12392,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateVar.kt") public void testPrivateVar() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java index ff97f7c4766..3ffb308bde2 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestNoPLGenerated.java @@ -12537,6 +12537,12 @@ public class NativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenBoxT runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateVar.kt") public void testPrivateVar() throws Exception { diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmCodegenBoxTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmCodegenBoxTestGenerated.java index 10027c1076f..dbb1bcfcd60 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmCodegenBoxTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/FirWasmCodegenBoxTestGenerated.java @@ -11493,6 +11493,12 @@ public class FirWasmCodegenBoxTestGenerated extends AbstractFirWasmCodegenBoxTes runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateVar.kt") public void testPrivateVar() throws Exception { diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmCodegenBoxTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmCodegenBoxTestGenerated.java index 52e6532acd6..7cefa33e7f6 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmCodegenBoxTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/K1WasmCodegenBoxTestGenerated.java @@ -11493,6 +11493,12 @@ public class K1WasmCodegenBoxTestGenerated extends AbstractK1WasmCodegenBoxTest runTest("compiler/testData/codegen/box/delegatedProperty/kt9712.kt"); } + @Test + @TestMetadata("noTypeVariablesLeft.kt") + public void testNoTypeVariablesLeft() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/noTypeVariablesLeft.kt"); + } + @Test @TestMetadata("privateVar.kt") public void testPrivateVar() throws Exception {