[FIR] Add contracts resolve for local classes

This commit is contained in:
Dmitriy Novozhilov
2020-04-13 14:47:00 +03:00
parent cecbf53ee8
commit fea7872359
4 changed files with 35 additions and 5 deletions
@@ -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.AdapterForResolvePhase
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
import org.jetbrains.kotlin.fir.resolve.transformers.TransformImplicitType 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.FirAccessorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
@@ -52,13 +53,13 @@ class FirImplicitTypeBodyResolveTransformerAdapter(private val scopeSession: Sco
} }
} }
fun <F : FirClass<F>> F.runBodiesResolutionForLocalClass( fun <F : FirClass<F>> F.runContractAndBodiesResolutionForLocalClass(
components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents, components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents,
resolutionMode: ResolutionMode, resolutionMode: ResolutionMode,
localClassesNavigationInfo: LocalClassesNavigationInfo, localClassesNavigationInfo: LocalClassesNavigationInfo,
): F { ): F {
val (designationMap, targetedClasses) = localClassesNavigationInfo.run { val (designationMap, targetedClasses) = localClassesNavigationInfo.run {
designationMap to parentForClass.keys + this@runBodiesResolutionForLocalClass designationMap to parentForClass.keys + this@runContractAndBodiesResolutionForLocalClass
} }
val implicitBodyResolveComputationSession = val implicitBodyResolveComputationSession =
@@ -74,6 +75,8 @@ fun <F : FirClass<F>> F.runBodiesResolutionForLocalClass(
val newContext = components.context.createSnapshotForLocalClasses(returnTypeCalculator, targetedClasses) val newContext = components.context.createSnapshotForLocalClasses(returnTypeCalculator, targetedClasses)
returnTypeCalculator.outerBodyResolveContext = newContext returnTypeCalculator.outerBodyResolveContext = newContext
runContractResolveForLocalClass(components.session, components.scopeSession, components.context, targetedClasses)
val transformer = FirImplicitAwareBodyResolveTransformer( val transformer = FirImplicitAwareBodyResolveTransformer(
components.session, components.scopeSession, components.session, components.scopeSession,
implicitBodyResolveComputationSession, implicitBodyResolveComputationSession,
@@ -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.FirClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.resolve.ResolutionMode 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.runStatusResolveForLocalClass
import org.jetbrains.kotlin.fir.resolve.transformers.runSupertypeResolvePhaseForLocalClass import org.jetbrains.kotlin.fir.resolve.transformers.runSupertypeResolvePhaseForLocalClass
import org.jetbrains.kotlin.fir.resolve.transformers.runTypeResolvePhaseForLocalClass import org.jetbrains.kotlin.fir.resolve.transformers.runTypeResolvePhaseForLocalClass
@@ -33,6 +34,6 @@ fun <F : FirClass<F>> F.runAllPhasesForLocalClass(
components.createCurrentScopeList() components.createCurrentScopeList()
) )
runStatusResolveForLocalClass(components.session) runStatusResolveForLocalClass(components.session)
runBodiesResolutionForLocalClass(components, resolutionMode, localClassesNavigationInfo) runContractAndBodiesResolutionForLocalClass(components, resolutionMode, localClassesNavigationInfo)
return this return this
} }
@@ -25,11 +25,16 @@ import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
import org.jetbrains.kotlin.fir.visitors.transformSingle 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, session,
FirResolvePhase.CONTRACTS, FirResolvePhase.CONTRACTS,
implicitTypeOnly = false, implicitTypeOnly = false,
scopeSession scopeSession,
outerBodyResolveContext = outerBodyResolveContext
) { ) {
override val declarationsTransformer: FirDeclarationsResolveTransformer = FirDeclarationsContractResolveTransformer(this) override val declarationsTransformer: FirDeclarationsResolveTransformer = FirDeclarationsContractResolveTransformer(this)
@@ -6,14 +6,20 @@
package org.jetbrains.kotlin.fir.resolve.transformers.contracts package org.jetbrains.kotlin.fir.resolve.transformers.contracts
import org.jetbrains.kotlin.fir.FirElement 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.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile 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.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.AdapterForResolvePhase 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.CompositeTransformResult
import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
import org.jetbrains.kotlin.fir.visitors.transformSingle
@AdapterForResolvePhase @AdapterForResolvePhase
class FirContractResolveTransformerAdapter(private val scopeSession: ScopeSession) : FirTransformer<Nothing?>() { class FirContractResolveTransformerAdapter(private val scopeSession: ScopeSession) : FirTransformer<Nothing?>() {
@@ -28,4 +34,19 @@ class FirContractResolveTransformerAdapter(private val scopeSession: ScopeSessio
) )
return file.transform(transformer, ResolutionMode.ContextIndependent) return file.transform(transformer, ResolutionMode.ContextIndependent)
} }
}
fun <F : FirClass<F>> F.runContractResolveForLocalClass(
session: FirSession,
scopeSession: ScopeSession,
outerBodyResolveContext: FirAbstractBodyResolveTransformer.BodyResolveContext,
targetedClasses: Set<FirClass<*>>
): F {
val newContext = outerBodyResolveContext.createSnapshotForLocalClasses(
ReturnTypeCalculatorForFullBodyResolve(),
targetedClasses
)
val transformer = FirContractResolveTransformer(session, scopeSession, newContext)
return this.transformSingle(transformer, ResolutionMode.ContextIndependent)
} }