From b1bdb619d8aaf28b942bb0367c81cac0d22db741 Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Thu, 22 Jun 2023 15:07:09 +0200 Subject: [PATCH] [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 --- .../fir/session/ComponentsContainers.kt | 2 ++ .../fir/FirExpectActualMatchingContext.kt | 30 +++++++++++++++++++ .../mpp/FirExpectActualMatcherTransformer.kt | 8 +++-- ... => FirExpectActualMatchingContextImpl.kt} | 22 ++++++++++---- .../mpp/FirExpectActualResolver.kt | 7 +++-- 5 files changed, 58 insertions(+), 11 deletions(-) create mode 100644 compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirExpectActualMatchingContext.kt rename compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/{FirExpectActualMatchingContext.kt => FirExpectActualMatchingContextImpl.kt} (93%) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt index 5542c37dd01..c7d30fd4e48 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/ComponentsContainers.kt @@ -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.transformers.FirDummyCompilerLazyDeclarationResolver 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.scopes.FirOverrideChecker import org.jetbrains.kotlin.fir.scopes.FirOverrideService @@ -142,6 +143,7 @@ fun FirSession.registerResolveComponents(lookupTracker: LookupTracker? = null, e IncrementalPassThroughEnumWhenTrackerComponent(enumWhenTracker) ) } + register(FirExpectActualMatchingContextFactory::class, FirExpectActualMatchingContextImpl.Factory) } /* diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirExpectActualMatchingContext.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirExpectActualMatchingContext.kt new file mode 100644 index 00000000000..101e246d80d --- /dev/null +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirExpectActualMatchingContext.kt @@ -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> { + fun FirClassSymbol<*>.getConstructors( + scopeSession: ScopeSession, + session: FirSession = moduleData.session, + ): Collection + + override fun RegularClassSymbolMarker.getMembersForExpectClass(name: Name): List> +} + +interface FirExpectActualMatchingContextFactory : FirSessionComponent { + fun create(session: FirSession, scopeSession: ScopeSession): FirExpectActualMatchingContext +} + +val FirSession.expectActualMatchingContextFactory: FirExpectActualMatchingContextFactory by FirSession.sessionComponentAccessor() \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatcherTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatcherTransformer.kt index f47f6a1e25f..156cffd5bdf 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatcherTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatcherTransformer.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor import org.jetbrains.kotlin.fir.declarations.utils.isActual 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.languageVersionSettings import org.jetbrains.kotlin.fir.resolve.ScopeSession @@ -35,10 +36,12 @@ class FirExpectActualMatcherProcessor( } open class FirExpectActualMatcherTransformer( - override val session: FirSession, + final override val session: FirSession, private val scopeSession: ScopeSession, ) : FirAbstractTreeTransformer(FirResolvePhase.EXPECT_ACTUAL_MATCHING) { + private val expectActualMatchingContext = session.expectActualMatchingContextFactory.create(session, scopeSession) + // --------------------------- classifiers --------------------------- override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Nothing?): FirStatement { transformMemberDeclaration(typeAlias) @@ -89,7 +92,8 @@ open class FirExpectActualMatcherTransformer( val expectForActualData = FirExpectActualResolver.findExpectForActual( actualSymbol, session, - scopeSession + scopeSession, + expectActualMatchingContext, ) ?: mapOf() memberDeclaration.expectForActual = expectForActualData } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContextImpl.kt similarity index 93% rename from compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt rename to compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContextImpl.kt index 301d9d13492..fc9d6a72377 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContextImpl.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.fir.resolve.transformers.mpp import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality 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.declarations.FirDeclarationOrigin 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.ClassId 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.TypeCheckerState 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.castAll -class FirExpectActualMatchingContext( +class FirExpectActualMatchingContextImpl private constructor( private val actualSession: FirSession, private val scopeSession: ScopeSession -) : ExpectActualMatchingContext>, TypeSystemContext by actualSession.typeContext { +) : FirExpectActualMatchingContext, TypeSystemContext by actualSession.typeContext { override val shouldCheckReturnTypesOfCallables: Boolean get() = false @@ -48,6 +52,7 @@ class FirExpectActualMatchingContext( override val allowTransitiveSupertypesActualization: Boolean get() = true + private fun DeclarationSymbolMarker.asSymbol(): FirBasedSymbol<*> = this as FirBasedSymbol<*> private fun CallableSymbolMarker.asSymbol(): FirCallableSymbol<*> = this as FirCallableSymbol<*> private fun FunctionSymbolMarker.asSymbol(): FirFunctionSymbol<*> = this as FirFunctionSymbol<*> private fun PropertySymbolMarker.asSymbol(): FirPropertySymbol = this as FirPropertySymbol @@ -197,9 +202,9 @@ class FirExpectActualMatchingContext( } } - fun FirClassSymbol<*>.getConstructors( + override fun FirClassSymbol<*>.getConstructors( scopeSession: ScopeSession, - session: FirSession = moduleData.session + session: FirSession, ): Collection = mutableListOf().apply { getConstructorsTo( this, @@ -305,4 +310,9 @@ class FirExpectActualMatchingContext( override val CallableSymbolMarker.hasStableParameterNames: Boolean get() = asSymbol().rawStatus.hasStableParameterNames + + object Factory : FirExpectActualMatchingContextFactory { + override fun create(session: FirSession, scopeSession: ScopeSession): FirExpectActualMatchingContextImpl = + FirExpectActualMatchingContextImpl(session, scopeSession) + } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt index 4116dcc5d09..8fc84028bda 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt @@ -5,6 +5,7 @@ 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.declarations.* 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.impl.* import org.jetbrains.kotlin.fir.types.* -import org.jetbrains.kotlin.resolve.calls.mpp.AbstractExpectActualCompatibilityChecker import org.jetbrains.kotlin.mpp.CallableSymbolMarker +import org.jetbrains.kotlin.resolve.calls.mpp.AbstractExpectActualCompatibilityChecker import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility object FirExpectActualResolver { fun findExpectForActual( actualSymbol: FirBasedSymbol<*>, useSiteSession: FirSession, - scopeSession: ScopeSession + scopeSession: ScopeSession, + context: FirExpectActualMatchingContext, ): ExpectForActualData? { - val context = FirExpectActualMatchingContext(useSiteSession, scopeSession) with(context) { val result = when (actualSymbol) { is FirCallableSymbol<*> -> {