[FE] Refactor: provide FirExpectActualMatchingContext as session component
This will be needed in subsequent commits because context must be accessible from `:fir:checkers` module, but it is in `:fir:resolve` Intermediate interface `FirExpectActualMatchingContext` is needed because `FirExpectActualResolver` relies on some FIR-specific methods, and providing common `ExpectActualMatchingContext` interface is not enough. Also in `FirExpectActualMatcherTransformer` context extracted to field to not create context for each processed element. "session" made final to calm down warning "accessing non-final property in constructor". ^KT-58551
This commit is contained in:
committed by
Space Team
parent
72de540fc9
commit
b1bdb619d8
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.impl.FirQualifierResolverImpl
|
|||||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirTypeResolverImpl
|
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirTypeResolverImpl
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirDummyCompilerLazyDeclarationResolver
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirDummyCompilerLazyDeclarationResolver
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.PlatformSupertypeUpdater
|
import org.jetbrains.kotlin.fir.resolve.transformers.PlatformSupertypeUpdater
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.transformers.mpp.FirExpectActualMatchingContextImpl
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.CompilerRequiredAnnotationEnhancementProvider
|
import org.jetbrains.kotlin.fir.resolve.transformers.plugin.CompilerRequiredAnnotationEnhancementProvider
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker
|
import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirOverrideService
|
import org.jetbrains.kotlin.fir.scopes.FirOverrideService
|
||||||
@@ -142,6 +143,7 @@ fun FirSession.registerResolveComponents(lookupTracker: LookupTracker? = null, e
|
|||||||
IncrementalPassThroughEnumWhenTrackerComponent(enumWhenTracker)
|
IncrementalPassThroughEnumWhenTrackerComponent(enumWhenTracker)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
register(FirExpectActualMatchingContextFactory::class, FirExpectActualMatchingContextImpl.Factory)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.fir
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||||
|
import org.jetbrains.kotlin.mpp.RegularClassSymbolMarker
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.mpp.ExpectActualMatchingContext
|
||||||
|
|
||||||
|
interface FirExpectActualMatchingContext : ExpectActualMatchingContext<FirBasedSymbol<*>> {
|
||||||
|
fun FirClassSymbol<*>.getConstructors(
|
||||||
|
scopeSession: ScopeSession,
|
||||||
|
session: FirSession = moduleData.session,
|
||||||
|
): Collection<FirConstructorSymbol>
|
||||||
|
|
||||||
|
override fun RegularClassSymbolMarker.getMembersForExpectClass(name: Name): List<FirCallableSymbol<*>>
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FirExpectActualMatchingContextFactory : FirSessionComponent {
|
||||||
|
fun create(session: FirSession, scopeSession: ScopeSession): FirExpectActualMatchingContext
|
||||||
|
}
|
||||||
|
|
||||||
|
val FirSession.expectActualMatchingContextFactory: FirExpectActualMatchingContextFactory by FirSession.sessionComponentAccessor()
|
||||||
+6
-2
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.*
|
|||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor
|
import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isActual
|
import org.jetbrains.kotlin.fir.declarations.utils.isActual
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isInline
|
import org.jetbrains.kotlin.fir.declarations.utils.isInline
|
||||||
|
import org.jetbrains.kotlin.fir.expectActualMatchingContextFactory
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
import org.jetbrains.kotlin.fir.expressions.FirStatement
|
||||||
import org.jetbrains.kotlin.fir.languageVersionSettings
|
import org.jetbrains.kotlin.fir.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
@@ -35,10 +36,12 @@ class FirExpectActualMatcherProcessor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
open class FirExpectActualMatcherTransformer(
|
open class FirExpectActualMatcherTransformer(
|
||||||
override val session: FirSession,
|
final override val session: FirSession,
|
||||||
private val scopeSession: ScopeSession,
|
private val scopeSession: ScopeSession,
|
||||||
) : FirAbstractTreeTransformer<Nothing?>(FirResolvePhase.EXPECT_ACTUAL_MATCHING) {
|
) : FirAbstractTreeTransformer<Nothing?>(FirResolvePhase.EXPECT_ACTUAL_MATCHING) {
|
||||||
|
|
||||||
|
private val expectActualMatchingContext = session.expectActualMatchingContextFactory.create(session, scopeSession)
|
||||||
|
|
||||||
// --------------------------- classifiers ---------------------------
|
// --------------------------- classifiers ---------------------------
|
||||||
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Nothing?): FirStatement {
|
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Nothing?): FirStatement {
|
||||||
transformMemberDeclaration(typeAlias)
|
transformMemberDeclaration(typeAlias)
|
||||||
@@ -89,7 +92,8 @@ open class FirExpectActualMatcherTransformer(
|
|||||||
val expectForActualData = FirExpectActualResolver.findExpectForActual(
|
val expectForActualData = FirExpectActualResolver.findExpectForActual(
|
||||||
actualSymbol,
|
actualSymbol,
|
||||||
session,
|
session,
|
||||||
scopeSession
|
scopeSession,
|
||||||
|
expectActualMatchingContext,
|
||||||
) ?: mapOf()
|
) ?: mapOf()
|
||||||
memberDeclaration.expectForActual = expectForActualData
|
memberDeclaration.expectForActual = expectForActualData
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-6
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.fir.resolve.transformers.mpp
|
|||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
|
import org.jetbrains.kotlin.fir.FirExpectActualMatchingContext
|
||||||
|
import org.jetbrains.kotlin.fir.FirExpectActualMatchingContextFactory
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
@@ -24,18 +26,20 @@ import org.jetbrains.kotlin.mpp.*
|
|||||||
import org.jetbrains.kotlin.name.CallableId
|
import org.jetbrains.kotlin.name.CallableId
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.calls.mpp.ExpectActualMatchingContext
|
|
||||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
import org.jetbrains.kotlin.types.TypeCheckerState
|
import org.jetbrains.kotlin.types.TypeCheckerState
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
import org.jetbrains.kotlin.types.model.*
|
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
|
||||||
|
import org.jetbrains.kotlin.types.model.SimpleTypeMarker
|
||||||
|
import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker
|
||||||
|
import org.jetbrains.kotlin.types.model.TypeSystemContext
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction
|
import org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.castAll
|
import org.jetbrains.kotlin.utils.addToStdlib.castAll
|
||||||
|
|
||||||
class FirExpectActualMatchingContext(
|
class FirExpectActualMatchingContextImpl private constructor(
|
||||||
private val actualSession: FirSession,
|
private val actualSession: FirSession,
|
||||||
private val scopeSession: ScopeSession
|
private val scopeSession: ScopeSession
|
||||||
) : ExpectActualMatchingContext<FirBasedSymbol<*>>, TypeSystemContext by actualSession.typeContext {
|
) : FirExpectActualMatchingContext, TypeSystemContext by actualSession.typeContext {
|
||||||
override val shouldCheckReturnTypesOfCallables: Boolean
|
override val shouldCheckReturnTypesOfCallables: Boolean
|
||||||
get() = false
|
get() = false
|
||||||
|
|
||||||
@@ -48,6 +52,7 @@ class FirExpectActualMatchingContext(
|
|||||||
override val allowTransitiveSupertypesActualization: Boolean
|
override val allowTransitiveSupertypesActualization: Boolean
|
||||||
get() = true
|
get() = true
|
||||||
|
|
||||||
|
private fun DeclarationSymbolMarker.asSymbol(): FirBasedSymbol<*> = this as FirBasedSymbol<*>
|
||||||
private fun CallableSymbolMarker.asSymbol(): FirCallableSymbol<*> = this as FirCallableSymbol<*>
|
private fun CallableSymbolMarker.asSymbol(): FirCallableSymbol<*> = this as FirCallableSymbol<*>
|
||||||
private fun FunctionSymbolMarker.asSymbol(): FirFunctionSymbol<*> = this as FirFunctionSymbol<*>
|
private fun FunctionSymbolMarker.asSymbol(): FirFunctionSymbol<*> = this as FirFunctionSymbol<*>
|
||||||
private fun PropertySymbolMarker.asSymbol(): FirPropertySymbol = this as FirPropertySymbol
|
private fun PropertySymbolMarker.asSymbol(): FirPropertySymbol = this as FirPropertySymbol
|
||||||
@@ -197,9 +202,9 @@ class FirExpectActualMatchingContext(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun FirClassSymbol<*>.getConstructors(
|
override fun FirClassSymbol<*>.getConstructors(
|
||||||
scopeSession: ScopeSession,
|
scopeSession: ScopeSession,
|
||||||
session: FirSession = moduleData.session
|
session: FirSession,
|
||||||
): Collection<FirConstructorSymbol> = mutableListOf<FirConstructorSymbol>().apply {
|
): Collection<FirConstructorSymbol> = mutableListOf<FirConstructorSymbol>().apply {
|
||||||
getConstructorsTo(
|
getConstructorsTo(
|
||||||
this,
|
this,
|
||||||
@@ -305,4 +310,9 @@ class FirExpectActualMatchingContext(
|
|||||||
|
|
||||||
override val CallableSymbolMarker.hasStableParameterNames: Boolean
|
override val CallableSymbolMarker.hasStableParameterNames: Boolean
|
||||||
get() = asSymbol().rawStatus.hasStableParameterNames
|
get() = asSymbol().rawStatus.hasStableParameterNames
|
||||||
|
|
||||||
|
object Factory : FirExpectActualMatchingContextFactory {
|
||||||
|
override fun create(session: FirSession, scopeSession: ScopeSession): FirExpectActualMatchingContextImpl =
|
||||||
|
FirExpectActualMatchingContextImpl(session, scopeSession)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+4
-3
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.resolve.transformers.mpp
|
package org.jetbrains.kotlin.fir.resolve.transformers.mpp
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.FirExpectActualMatchingContext
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.*
|
import org.jetbrains.kotlin.fir.resolve.*
|
||||||
@@ -15,17 +16,17 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope
|
|||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.mpp.AbstractExpectActualCompatibilityChecker
|
|
||||||
import org.jetbrains.kotlin.mpp.CallableSymbolMarker
|
import org.jetbrains.kotlin.mpp.CallableSymbolMarker
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.mpp.AbstractExpectActualCompatibilityChecker
|
||||||
import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility
|
import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility
|
||||||
|
|
||||||
object FirExpectActualResolver {
|
object FirExpectActualResolver {
|
||||||
fun findExpectForActual(
|
fun findExpectForActual(
|
||||||
actualSymbol: FirBasedSymbol<*>,
|
actualSymbol: FirBasedSymbol<*>,
|
||||||
useSiteSession: FirSession,
|
useSiteSession: FirSession,
|
||||||
scopeSession: ScopeSession
|
scopeSession: ScopeSession,
|
||||||
|
context: FirExpectActualMatchingContext,
|
||||||
): ExpectForActualData? {
|
): ExpectForActualData? {
|
||||||
val context = FirExpectActualMatchingContext(useSiteSession, scopeSession)
|
|
||||||
with(context) {
|
with(context) {
|
||||||
val result = when (actualSymbol) {
|
val result = when (actualSymbol) {
|
||||||
is FirCallableSymbol<*> -> {
|
is FirCallableSymbol<*> -> {
|
||||||
|
|||||||
Reference in New Issue
Block a user