diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeInfoProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeInfoProvider.kt index f9bfc7cbd37..aefb1c8ff76 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeInfoProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeInfoProvider.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.analysis.api.fir.types.PublicTypeApproximator import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.builtins.functions.FunctionClassKind -import org.jetbrains.kotlin.fir.resolve.FirSamResolverImpl +import org.jetbrains.kotlin.fir.resolve.FirSamResolver import org.jetbrains.kotlin.fir.types.* internal class KtFirTypeInfoProvider( @@ -23,7 +23,7 @@ internal class KtFirTypeInfoProvider( override fun isFunctionalInterfaceType(type: KtType): Boolean { val coneType = (type as KtFirType).coneType val firSession = analysisSession.useSiteSession - val samResolver = FirSamResolverImpl( + val samResolver = FirSamResolver( firSession, analysisSession.getScopeSessionFor(firSession), ) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt index 33701abe658..c4dad45d6bc 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference import org.jetbrains.kotlin.fir.render -import org.jetbrains.kotlin.fir.resolve.FirSamResolverImpl +import org.jetbrains.kotlin.fir.resolve.FirSamResolver import org.jetbrains.kotlin.fir.resolve.calls.FirFakeArgumentForCallableReference import org.jetbrains.kotlin.fir.resolve.calls.ResolvedCallArgument import org.jetbrains.kotlin.fir.resolve.calls.getExpectedType @@ -59,7 +59,7 @@ internal class AdapterGenerator( private val conversionScope: Fir2IrConversionScope ) : Fir2IrComponents by components { - private val samResolver = FirSamResolverImpl(session, scopeSession) + private val samResolver = FirSamResolver(session, scopeSession) private val starProjectionApproximator = object : AbstractConeSubstitutor(session.typeContext) { override fun substituteType(type: ConeKotlinType): ConeKotlinType? { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt index cdcc205d329..b7508c946db 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt @@ -41,29 +41,23 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.types.Variance -abstract class FirSamResolver { - abstract fun shouldRunSamConversionForFunction(firFunction: FirFunction): Boolean - abstract fun getSamConstructor(firClassOrTypeAlias: FirClassLikeDeclaration): FirSimpleFunction? - abstract fun getFunctionTypeForPossibleSamType(type: ConeKotlinType): ConeKotlinType? - - fun isSamType(type: ConeKotlinType): Boolean = - getFunctionTypeForPossibleSamType(type) != null -} - private val SAM_PARAMETER_NAME = Name.identifier("function") data class SAMInfo(internal val symbol: FirNamedFunctionSymbol, val type: C) -class FirSamResolverImpl( +class FirSamResolver( private val session: FirSession, private val scopeSession: ScopeSession, private val outerClassManager: FirOuterClassManager? = null, -) : FirSamResolver() { +) { private val resolvedFunctionType: NullableMap?> = NullableMap() private val samConstructorsCache = session.samConstructorStorage.samConstructors private val samConversionTransformers = session.extensionService.samConversionTransformers - override fun getFunctionTypeForPossibleSamType(type: ConeKotlinType): ConeKotlinType? { + fun isSamType(type: ConeKotlinType): Boolean = + getFunctionTypeForPossibleSamType(type) != null + + fun getFunctionTypeForPossibleSamType(type: ConeKotlinType): ConeKotlinType? { return when (type) { is ConeClassLikeType -> getFunctionTypeForPossibleSamType(type.fullyExpandedType(session)) is ConeFlexibleType -> { @@ -97,7 +91,7 @@ class FirSamResolverImpl( return functionType.withNullability(ConeNullability.create(type.isMarkedNullable), session.typeContext) } - override fun getSamConstructor(firClassOrTypeAlias: FirClassLikeDeclaration): FirSimpleFunction? { + fun getSamConstructor(firClassOrTypeAlias: FirClassLikeDeclaration): FirSimpleFunction? { if (firClassOrTypeAlias is FirTypeAlias) { // Precompute the constructor for the base type to avoid deadlocks in the IDE. firClassOrTypeAlias.expandedTypeRef.coneTypeSafe() @@ -268,7 +262,8 @@ class FirSamResolverImpl( } } - override fun shouldRunSamConversionForFunction(firFunction: FirFunction): Boolean { + @Suppress("UNUSED_PARAMETER") + fun shouldRunSamConversionForFunction(firFunction: FirFunction): Boolean { // TODO: properly support, see org.jetbrains.kotlin.load.java.sam.JvmSamConversionTransformer.shouldRunSamConversionForFunction return true } @@ -427,7 +422,7 @@ private fun FirSimpleFunction.getFunctionTypeForAbstractMethod(): ConeLookupTagB } class FirSamConstructorStorage(session: FirSession) : FirSessionComponent { - val samConstructors: FirCache, FirNamedFunctionSymbol?, FirSamResolverImpl> = + val samConstructors: FirCache, FirNamedFunctionSymbol?, FirSamResolver> = session.firCachesFactory.createCache { classSymbol, samResolver -> when (classSymbol) { is FirRegularClassSymbol -> samResolver.buildSamConstructorForRegularClass(classSymbol) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index 85ead629384..432b023f8f0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -74,7 +74,7 @@ class FirCallCompletionResultsWriterTransformer( private val arrayOfCallTransformer = FirArrayOfCallTransformer() private var enableArrayOfCallTransformation = false - private val samResolver: FirSamResolver = FirSamResolverImpl(session, ScopeSession()) + private val samResolver: FirSamResolver = FirSamResolver(session, ScopeSession()) enum class Mode { Normal, DelegatedPropertyCompletion diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt index b53ff996232..6cc51f1b0f9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt @@ -108,7 +108,7 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb override val syntheticCallGenerator: FirSyntheticCallGenerator = FirSyntheticCallGenerator(this) override val doubleColonExpressionResolver: FirDoubleColonExpressionResolver = FirDoubleColonExpressionResolver(session) override val outerClassManager: FirOuterClassManager = FirOuterClassManager(session, context.outerLocalClassForNested) - override val samResolver: FirSamResolver = FirSamResolverImpl(session, scopeSession, outerClassManager) + override val samResolver: FirSamResolver = FirSamResolver(session, scopeSession, outerClassManager) override val integerLiteralAndOperatorApproximationTransformer: IntegerLiteralAndOperatorApproximationTransformer = IntegerLiteralAndOperatorApproximationTransformer(session, scopeSession) }