[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
This commit is contained in:
-1
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.LLFirDesi
|
|||||||
internal object PersistentCheckerContextFactory {
|
internal object PersistentCheckerContextFactory {
|
||||||
fun createEmptyPersistenceCheckerContext(sessionHolder: SessionHolder): PersistentCheckerContext {
|
fun createEmptyPersistenceCheckerContext(sessionHolder: SessionHolder): PersistentCheckerContext {
|
||||||
val returnTypeCalculator = createReturnTypeCalculatorForIDE(
|
val returnTypeCalculator = createReturnTypeCalculatorForIDE(
|
||||||
sessionHolder.session,
|
|
||||||
sessionHolder.scopeSession,
|
sessionHolder.scopeSession,
|
||||||
ImplicitBodyResolveComputationSession(),
|
ImplicitBodyResolveComputationSession(),
|
||||||
::LLFirDesignatedImpliciteTypesBodyResolveTransformerForReturnTypeCalculator
|
::LLFirDesignatedImpliciteTypesBodyResolveTransformerForReturnTypeCalculator
|
||||||
|
|||||||
-1
@@ -36,7 +36,6 @@ internal class LLFirDesignatedBodyResolveTransformer(
|
|||||||
implicitTypeOnly = false,
|
implicitTypeOnly = false,
|
||||||
scopeSession = scopeSession,
|
scopeSession = scopeSession,
|
||||||
returnTypeCalculator = createReturnTypeCalculatorForIDE(
|
returnTypeCalculator = createReturnTypeCalculatorForIDE(
|
||||||
session,
|
|
||||||
scopeSession,
|
scopeSession,
|
||||||
ImplicitBodyResolveComputationSession(),
|
ImplicitBodyResolveComputationSession(),
|
||||||
::LLFirEnsureBasedTransformerForReturnTypeCalculator
|
::LLFirEnsureBasedTransformerForReturnTypeCalculator
|
||||||
|
|||||||
-1
@@ -38,7 +38,6 @@ internal class LLFirDesignatedImplicitTypesTransformer(
|
|||||||
scopeSession = scopeSession,
|
scopeSession = scopeSession,
|
||||||
firTowerDataContextCollector = towerDataContextCollector,
|
firTowerDataContextCollector = towerDataContextCollector,
|
||||||
returnTypeCalculator = createReturnTypeCalculatorForIDE(
|
returnTypeCalculator = createReturnTypeCalculatorForIDE(
|
||||||
session,
|
|
||||||
scopeSession,
|
scopeSession,
|
||||||
implicitBodyResolveComputationSession,
|
implicitBodyResolveComputationSession,
|
||||||
::LLFirDesignatedImpliciteTypesBodyResolveTransformerForReturnTypeCalculator
|
::LLFirDesignatedImpliciteTypesBodyResolveTransformerForReturnTypeCalculator
|
||||||
|
|||||||
-1
@@ -28,7 +28,6 @@ internal class LLFirFileAnnotationsResolveTransformer(
|
|||||||
implicitTypeOnly = false,
|
implicitTypeOnly = false,
|
||||||
scopeSession = scopeSession,
|
scopeSession = scopeSession,
|
||||||
returnTypeCalculator = createReturnTypeCalculatorForIDE(
|
returnTypeCalculator = createReturnTypeCalculatorForIDE(
|
||||||
session,
|
|
||||||
scopeSession,
|
scopeSession,
|
||||||
implicitBodyResolveComputationSession,
|
implicitBodyResolveComputationSession,
|
||||||
::LLFirDesignatedImpliciteTypesBodyResolveTransformerForReturnTypeCalculator
|
::LLFirDesignatedImpliciteTypesBodyResolveTransformerForReturnTypeCalculator
|
||||||
|
|||||||
+6
@@ -254,6 +254,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis
|
|||||||
runTest("compiler/fir/analysis-tests/testData/resolve/genericReceiverPropertyOverride.kt");
|
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
|
@Test
|
||||||
@TestMetadata("implicitTypeInFakeOverride.kt")
|
@TestMetadata("implicitTypeInFakeOverride.kt")
|
||||||
public void testImplicitTypeInFakeOverride() throws Exception {
|
public void testImplicitTypeInFakeOverride() throws Exception {
|
||||||
|
|||||||
+5
@@ -219,6 +219,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract
|
|||||||
runTest("compiler/fir/analysis-tests/testData/resolve/genericReceiverPropertyOverride.kt");
|
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")
|
@TestMetadata("implicitTypeInFakeOverride.kt")
|
||||||
public void testImplicitTypeInFakeOverride() throws Exception {
|
public void testImplicitTypeInFakeOverride() throws Exception {
|
||||||
runTest("compiler/fir/analysis-tests/testData/resolve/implicitTypeInFakeOverride.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/implicitTypeInFakeOverride.kt");
|
||||||
|
|||||||
+30
@@ -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<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class Lib : R|kotlin/Any| {
|
||||||
|
public constructor(): R|dependency/Lib| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
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| {
|
||||||
|
}
|
||||||
@@ -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) {}
|
||||||
+6
@@ -254,6 +254,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest {
|
|||||||
runTest("compiler/fir/analysis-tests/testData/resolve/genericReceiverPropertyOverride.kt");
|
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
|
@Test
|
||||||
@TestMetadata("implicitTypeInFakeOverride.kt")
|
@TestMetadata("implicitTypeInFakeOverride.kt")
|
||||||
public void testImplicitTypeInFakeOverride() throws Exception {
|
public void testImplicitTypeInFakeOverride() throws Exception {
|
||||||
|
|||||||
+6
@@ -254,6 +254,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
|
|||||||
runTest("compiler/fir/analysis-tests/testData/resolve/genericReceiverPropertyOverride.kt");
|
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
|
@Test
|
||||||
@TestMetadata("implicitTypeInFakeOverride.kt")
|
@TestMetadata("implicitTypeInFakeOverride.kt")
|
||||||
public void testImplicitTypeInFakeOverride() throws Exception {
|
public void testImplicitTypeInFakeOverride() throws Exception {
|
||||||
|
|||||||
+5
-6
@@ -40,7 +40,7 @@ class FirImplicitTypeBodyResolveProcessor(
|
|||||||
@AdapterForResolveProcessor
|
@AdapterForResolveProcessor
|
||||||
class FirImplicitTypeBodyResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer<Any?>() {
|
class FirImplicitTypeBodyResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer<Any?>() {
|
||||||
private val implicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession()
|
private val implicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession()
|
||||||
private val returnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession)
|
private val returnTypeCalculator = ReturnTypeCalculatorWithJump(scopeSession, implicitBodyResolveComputationSession)
|
||||||
|
|
||||||
private val transformer = FirImplicitAwareBodyResolveTransformer(
|
private val transformer = FirImplicitAwareBodyResolveTransformer(
|
||||||
session,
|
session,
|
||||||
@@ -77,7 +77,6 @@ fun <F : FirClassLikeDeclaration> F.runContractAndBodiesResolutionForLocalClass(
|
|||||||
((components.returnTypeCalculator as? ReturnTypeCalculatorWithJump)?.implicitBodyResolveComputationSession
|
((components.returnTypeCalculator as? ReturnTypeCalculatorWithJump)?.implicitBodyResolveComputationSession
|
||||||
?: ImplicitBodyResolveComputationSession())
|
?: ImplicitBodyResolveComputationSession())
|
||||||
val returnTypeCalculator = ReturnTypeCalculatorWithJump(
|
val returnTypeCalculator = ReturnTypeCalculatorWithJump(
|
||||||
components.session,
|
|
||||||
components.scopeSession,
|
components.scopeSession,
|
||||||
implicitBodyResolveComputationSession,
|
implicitBodyResolveComputationSession,
|
||||||
designationMap,
|
designationMap,
|
||||||
@@ -114,7 +113,6 @@ private fun ReturnTypeCalculator.getTransformerCreator() = when (this) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun createReturnTypeCalculatorForIDE(
|
fun createReturnTypeCalculatorForIDE(
|
||||||
session: FirSession,
|
|
||||||
scopeSession: ScopeSession,
|
scopeSession: ScopeSession,
|
||||||
implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
|
implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
|
||||||
createTransformer: (
|
createTransformer: (
|
||||||
@@ -126,7 +124,7 @@ fun createReturnTypeCalculatorForIDE(
|
|||||||
BodyResolveContext?
|
BodyResolveContext?
|
||||||
) -> FirDesignatedBodyResolveTransformerForReturnTypeCalculator
|
) -> FirDesignatedBodyResolveTransformerForReturnTypeCalculator
|
||||||
): ReturnTypeCalculator =
|
): ReturnTypeCalculator =
|
||||||
ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession, createTransformer = createTransformer)
|
ReturnTypeCalculatorWithJump(scopeSession, implicitBodyResolveComputationSession, createTransformer = createTransformer)
|
||||||
|
|
||||||
open class FirImplicitAwareBodyResolveTransformer(
|
open class FirImplicitAwareBodyResolveTransformer(
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
@@ -193,7 +191,6 @@ open class FirImplicitAwareBodyResolveTransformer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class ReturnTypeCalculatorWithJump(
|
private class ReturnTypeCalculatorWithJump(
|
||||||
private val session: FirSession,
|
|
||||||
private val scopeSession: ScopeSession,
|
private val scopeSession: ScopeSession,
|
||||||
val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
|
val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
|
||||||
val designationMapForLocalClasses: Map<FirCallableDeclaration, List<FirClassLikeDeclaration>> = mapOf(),
|
val designationMapForLocalClasses: Map<FirCallableDeclaration, List<FirClassLikeDeclaration>> = mapOf(),
|
||||||
@@ -262,12 +259,14 @@ private class ReturnTypeCalculatorWithJump(
|
|||||||
|
|
||||||
@OptIn(PrivateForInline::class)
|
@OptIn(PrivateForInline::class)
|
||||||
private fun computeReturnTypeRef(declaration: FirCallableDeclaration): FirResolvedTypeRef {
|
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 symbol = declaration.symbol
|
||||||
val provider = session.firProvider
|
|
||||||
|
|
||||||
val (designation, outerBodyResolveContext) = if (declaration in designationMapForLocalClasses) {
|
val (designation, outerBodyResolveContext) = if (declaration in designationMapForLocalClasses) {
|
||||||
designationMapForLocalClasses.getValue(declaration) to outerBodyResolveContext
|
designationMapForLocalClasses.getValue(declaration) to outerBodyResolveContext
|
||||||
} else {
|
} else {
|
||||||
|
val provider = session.firProvider
|
||||||
val file = provider.getFirCallableContainerFile(symbol)
|
val file = provider.getFirCallableContainerFile(symbol)
|
||||||
|
|
||||||
val outerClasses = generateSequence(symbol.containingClass()?.classId) { classId ->
|
val outerClasses = generateSequence(symbol.containingClass()?.classId) { classId ->
|
||||||
|
|||||||
Reference in New Issue
Block a user