[FIR] Add contracts resolve for local classes
This commit is contained in:
+5
-2
@@ -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,
|
||||||
|
|||||||
+2
-1
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-2
@@ -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)
|
||||||
|
|
||||||
|
|||||||
+21
@@ -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?>() {
|
||||||
@@ -29,3 +35,18 @@ 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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user