From fea78723591ba33824f9f867c3f9799615eb28e4 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 13 Apr 2020 14:47:00 +0300 Subject: [PATCH] [FIR] Add contracts resolve for local classes --- .../body/resolve/FirImplicitBodyResolve.kt | 7 +++++-- .../body/resolve/LocalClassesResolution.kt | 3 ++- .../FirContractResolveTransformer.kt | 9 ++++++-- .../FirContractResolveTransformerAdapter.kt | 21 +++++++++++++++++++ 4 files changed, 35 insertions(+), 5 deletions(-) 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 065aa63b3ce..e7396d91a26 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 @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.transformers.AdapterForResolvePhase import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator import org.jetbrains.kotlin.fir.resolve.transformers.TransformImplicitType +import org.jetbrains.kotlin.fir.resolve.transformers.contracts.runContractResolveForLocalClass import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef @@ -52,13 +53,13 @@ class FirImplicitTypeBodyResolveTransformerAdapter(private val scopeSession: Sco } } -fun > F.runBodiesResolutionForLocalClass( +fun > F.runContractAndBodiesResolutionForLocalClass( components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents, resolutionMode: ResolutionMode, localClassesNavigationInfo: LocalClassesNavigationInfo, ): F { val (designationMap, targetedClasses) = localClassesNavigationInfo.run { - designationMap to parentForClass.keys + this@runBodiesResolutionForLocalClass + designationMap to parentForClass.keys + this@runContractAndBodiesResolutionForLocalClass } val implicitBodyResolveComputationSession = @@ -74,6 +75,8 @@ fun > F.runBodiesResolutionForLocalClass( val newContext = components.context.createSnapshotForLocalClasses(returnTypeCalculator, targetedClasses) returnTypeCalculator.outerBodyResolveContext = newContext + runContractResolveForLocalClass(components.session, components.scopeSession, components.context, targetedClasses) + val transformer = FirImplicitAwareBodyResolveTransformer( components.session, components.scopeSession, implicitBodyResolveComputationSession, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesResolution.kt index a2616b59479..dbb80f6f5f1 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/LocalClassesResolution.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.resolve.ResolutionMode +import org.jetbrains.kotlin.fir.resolve.transformers.contracts.runContractResolveForLocalClass import org.jetbrains.kotlin.fir.resolve.transformers.runStatusResolveForLocalClass import org.jetbrains.kotlin.fir.resolve.transformers.runSupertypeResolvePhaseForLocalClass import org.jetbrains.kotlin.fir.resolve.transformers.runTypeResolvePhaseForLocalClass @@ -33,6 +34,6 @@ fun > F.runAllPhasesForLocalClass( components.createCurrentScopeList() ) runStatusResolveForLocalClass(components.session) - runBodiesResolutionForLocalClass(components, resolutionMode, localClassesNavigationInfo) + runContractAndBodiesResolutionForLocalClass(components, resolutionMode, localClassesNavigationInfo) return this } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt index 4e47a5ca104..c0e156a70d2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformer.kt @@ -25,11 +25,16 @@ import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.transformSingle -class FirContractResolveTransformer(session: FirSession, scopeSession: ScopeSession) : FirBodyResolveTransformer( +class FirContractResolveTransformer( + session: FirSession, + scopeSession: ScopeSession, + outerBodyResolveContext: BodyResolveContext? = null +) : FirBodyResolveTransformer( session, FirResolvePhase.CONTRACTS, implicitTypeOnly = false, - scopeSession + scopeSession, + outerBodyResolveContext = outerBodyResolveContext ) { override val declarationsTransformer: FirDeclarationsResolveTransformer = FirDeclarationsContractResolveTransformer(this) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformerAdapter.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformerAdapter.kt index 217da0afd43..af1133908a7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformerAdapter.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirContractResolveTransformerAdapter.kt @@ -6,14 +6,20 @@ package org.jetbrains.kotlin.fir.resolve.transformers.contracts import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile +import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.ResolutionMode import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.AdapterForResolvePhase +import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve +import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformer import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.compose +import org.jetbrains.kotlin.fir.visitors.transformSingle @AdapterForResolvePhase class FirContractResolveTransformerAdapter(private val scopeSession: ScopeSession) : FirTransformer() { @@ -28,4 +34,19 @@ class FirContractResolveTransformerAdapter(private val scopeSession: ScopeSessio ) return file.transform(transformer, ResolutionMode.ContextIndependent) } +} + +fun > F.runContractResolveForLocalClass( + session: FirSession, + scopeSession: ScopeSession, + outerBodyResolveContext: FirAbstractBodyResolveTransformer.BodyResolveContext, + targetedClasses: Set> +): F { + val newContext = outerBodyResolveContext.createSnapshotForLocalClasses( + ReturnTypeCalculatorForFullBodyResolve(), + targetedClasses + ) + val transformer = FirContractResolveTransformer(session, scopeSession, newContext) + + return this.transformSingle(transformer, ResolutionMode.ContextIndependent) } \ No newline at end of file