From 1d5cb8ab75ebdb1c0bbd271fcc908cbbaa8673d2 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Thu, 21 Apr 2022 17:05:23 +0400 Subject: [PATCH] [FIR] Get FirSession from declaration in ReturnTypeCalculatorWithJump If the session is from the other module, it might not know about FirFiles which are relevant for transforming and resolving the declaration ^KT-52136 Fixed --- .../fir/PersistentCheckerContextFactory.kt | 1 - .../LLFirDesignatedBodyResolveTransformer.kt | 1 - ...LLFirDesignatedImplicitTypesTransformer.kt | 1 - .../LLFirFileAnnotationsResolveTransformer.kt | 1 - ...nosisCompilerFirTestdataTestGenerated.java | 6 ++++ ...TouchedTilContractsPhaseTestGenerated.java | 5 ++++ .../implicitTypeFromOtherModule.fir.txt | 30 +++++++++++++++++++ .../resolve/implicitTypeFromOtherModule.kt | 27 +++++++++++++++++ .../runners/FirDiagnosticTestGenerated.java | 6 ++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++ .../body/resolve/FirImplicitBodyResolve.kt | 11 ++++--- 11 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 compiler/fir/analysis-tests/testData/resolve/implicitTypeFromOtherModule.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolve/implicitTypeFromOtherModule.kt diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/fir/PersistentCheckerContextFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/fir/PersistentCheckerContextFactory.kt index c428372f5a7..b3708cecef8 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/fir/PersistentCheckerContextFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostics/fir/PersistentCheckerContextFactory.kt @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.LLFirDesi internal object PersistentCheckerContextFactory { fun createEmptyPersistenceCheckerContext(sessionHolder: SessionHolder): PersistentCheckerContext { val returnTypeCalculator = createReturnTypeCalculatorForIDE( - sessionHolder.session, sessionHolder.scopeSession, ImplicitBodyResolveComputationSession(), ::LLFirDesignatedImpliciteTypesBodyResolveTransformerForReturnTypeCalculator diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedBodyResolveTransformer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedBodyResolveTransformer.kt index e1032ef0b28..06b25413c78 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedBodyResolveTransformer.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedBodyResolveTransformer.kt @@ -36,7 +36,6 @@ internal class LLFirDesignatedBodyResolveTransformer( implicitTypeOnly = false, scopeSession = scopeSession, returnTypeCalculator = createReturnTypeCalculatorForIDE( - session, scopeSession, ImplicitBodyResolveComputationSession(), ::LLFirEnsureBasedTransformerForReturnTypeCalculator diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedImplicitTypesTransformer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedImplicitTypesTransformer.kt index e3f8924c292..3b2af0a1aeb 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedImplicitTypesTransformer.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirDesignatedImplicitTypesTransformer.kt @@ -38,7 +38,6 @@ internal class LLFirDesignatedImplicitTypesTransformer( scopeSession = scopeSession, firTowerDataContextCollector = towerDataContextCollector, returnTypeCalculator = createReturnTypeCalculatorForIDE( - session, scopeSession, implicitBodyResolveComputationSession, ::LLFirDesignatedImpliciteTypesBodyResolveTransformerForReturnTypeCalculator diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirFileAnnotationsResolveTransformer.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirFileAnnotationsResolveTransformer.kt index 6cf7b938ab5..fff066a4ca3 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirFileAnnotationsResolveTransformer.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/transformers/LLFirFileAnnotationsResolveTransformer.kt @@ -28,7 +28,6 @@ internal class LLFirFileAnnotationsResolveTransformer( implicitTypeOnly = false, scopeSession = scopeSession, returnTypeCalculator = createReturnTypeCalculatorForIDE( - session, scopeSession, implicitBodyResolveComputationSession, ::LLFirDesignatedImpliciteTypesBodyResolveTransformerForReturnTypeCalculator 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 d417674f93a..182e5877db6 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 @@ -254,6 +254,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis runTest("compiler/fir/analysis-tests/testData/resolve/genericReceiverPropertyOverride.kt"); } + @Test + @TestMetadata("implicitTypeFromOtherModule.kt") + public void testImplicitTypeFromOtherModule() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/implicitTypeFromOtherModule.kt"); + } + @Test @TestMetadata("implicitTypeInFakeOverride.kt") public void testImplicitTypeInFakeOverride() throws Exception { 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 94da56cbe73..0be5b64181b 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 @@ -219,6 +219,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract runTest("compiler/fir/analysis-tests/testData/resolve/genericReceiverPropertyOverride.kt"); } + @TestMetadata("implicitTypeFromOtherModule.kt") + public void testImplicitTypeFromOtherModule() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/implicitTypeFromOtherModule.kt"); + } + @TestMetadata("implicitTypeInFakeOverride.kt") public void testImplicitTypeInFakeOverride() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/implicitTypeInFakeOverride.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/implicitTypeFromOtherModule.fir.txt b/compiler/fir/analysis-tests/testData/resolve/implicitTypeFromOtherModule.fir.txt new file mode 100644 index 00000000000..f64da6d8366 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/implicitTypeFromOtherModule.fir.txt @@ -0,0 +1,30 @@ +Module: lib +FILE: module_lib_implicitTypeFromOtherModule.kt + package dependency + + public final class Other : R|kotlin/Any| { + public constructor(): R|dependency/Other| { + super() + } + + } + public final class Lib : R|kotlin/Any| { + public constructor(): R|dependency/Lib| { + super() + } + + } + public final fun test(): R|dependency/Lib| { + ^test R|dependency/Lib.Lib|() + } +Module: main +FILE: module_main_implicitTypeFromOtherModule.kt + package main + + public final fun usage(): R|kotlin/Unit| { + R|main/take|(R|dependency/test|()) + } + public final fun take(a: R|dependency/Lib|): R|kotlin/Unit| { + } + public final fun take(a: R|dependency/Other|): R|kotlin/Unit| { + } diff --git a/compiler/fir/analysis-tests/testData/resolve/implicitTypeFromOtherModule.kt b/compiler/fir/analysis-tests/testData/resolve/implicitTypeFromOtherModule.kt new file mode 100644 index 00000000000..5396de8565b --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/implicitTypeFromOtherModule.kt @@ -0,0 +1,27 @@ +// SKIP_JAVAC +// This directive is needed to skip this test in LazyBodyIsNotTouchedTilContractsPhaseTestGenerated, +// because it fails to parse module structure of multimodule test + +// MODULE: lib +package dependency + +class Other + +class Lib + +fun test() = Lib() + +// MODULE: main(lib) +package main + +import dependency.test +import dependency.Lib +import dependency.Other + +fun usage() { + take(test()) +} + +fun take(a: Lib) {} + +fun take(a: Other) {} 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 df438c76cdc..ea08e5fe15b 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 @@ -254,6 +254,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { runTest("compiler/fir/analysis-tests/testData/resolve/genericReceiverPropertyOverride.kt"); } + @Test + @TestMetadata("implicitTypeFromOtherModule.kt") + public void testImplicitTypeFromOtherModule() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/implicitTypeFromOtherModule.kt"); + } + @Test @TestMetadata("implicitTypeInFakeOverride.kt") public void testImplicitTypeInFakeOverride() throws Exception { 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 0ea20b745d6..80da6e8d3fd 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 @@ -254,6 +254,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolve/genericReceiverPropertyOverride.kt"); } + @Test + @TestMetadata("implicitTypeFromOtherModule.kt") + public void testImplicitTypeFromOtherModule() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/implicitTypeFromOtherModule.kt"); + } + @Test @TestMetadata("implicitTypeInFakeOverride.kt") public void testImplicitTypeInFakeOverride() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt index 81cd629c2e0..1aa94f051ad 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt @@ -40,7 +40,7 @@ class FirImplicitTypeBodyResolveProcessor( @AdapterForResolveProcessor class FirImplicitTypeBodyResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer() { private val implicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession() - private val returnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession) + private val returnTypeCalculator = ReturnTypeCalculatorWithJump(scopeSession, implicitBodyResolveComputationSession) private val transformer = FirImplicitAwareBodyResolveTransformer( session, @@ -77,7 +77,6 @@ fun F.runContractAndBodiesResolutionForLocalClass( ((components.returnTypeCalculator as? ReturnTypeCalculatorWithJump)?.implicitBodyResolveComputationSession ?: ImplicitBodyResolveComputationSession()) val returnTypeCalculator = ReturnTypeCalculatorWithJump( - components.session, components.scopeSession, implicitBodyResolveComputationSession, designationMap, @@ -114,7 +113,6 @@ private fun ReturnTypeCalculator.getTransformerCreator() = when (this) { } fun createReturnTypeCalculatorForIDE( - session: FirSession, scopeSession: ScopeSession, implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession, createTransformer: ( @@ -126,7 +124,7 @@ fun createReturnTypeCalculatorForIDE( BodyResolveContext? ) -> FirDesignatedBodyResolveTransformerForReturnTypeCalculator ): ReturnTypeCalculator = - ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession, createTransformer = createTransformer) + ReturnTypeCalculatorWithJump(scopeSession, implicitBodyResolveComputationSession, createTransformer = createTransformer) open class FirImplicitAwareBodyResolveTransformer( session: FirSession, @@ -193,7 +191,6 @@ open class FirImplicitAwareBodyResolveTransformer( } private class ReturnTypeCalculatorWithJump( - private val session: FirSession, private val scopeSession: ScopeSession, val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession, val designationMapForLocalClasses: Map> = mapOf(), @@ -262,12 +259,14 @@ private class ReturnTypeCalculatorWithJump( @OptIn(PrivateForInline::class) private fun computeReturnTypeRef(declaration: FirCallableDeclaration): FirResolvedTypeRef { + // To properly transform and resolve declaration's type, we need to use its module's session + val session = declaration.moduleData.session val symbol = declaration.symbol - val provider = session.firProvider val (designation, outerBodyResolveContext) = if (declaration in designationMapForLocalClasses) { designationMapForLocalClasses.getValue(declaration) to outerBodyResolveContext } else { + val provider = session.firProvider val file = provider.getFirCallableContainerFile(symbol) val outerClasses = generateSequence(symbol.containingClass()?.classId) { classId ->