From 6894962e3a7ae55ce4ca1986390185a1839e992f Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 23 Mar 2020 17:58:33 +0300 Subject: [PATCH] FIR: Prepare type resolution phase for running on local classes --- .../transformers/FirTypeResolveTransformer.kt | 29 +++++++++++++++---- .../resolve/transformers/ResolvePhaseUtils.kt | 2 +- .../fir/scopes/impl/FirCompositeScope.kt | 8 ++--- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt index d1d614365cc..59059677c25 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirTypeResolveTransformer.kt @@ -5,30 +5,47 @@ package org.jetbrains.kotlin.fir.resolve.transformers +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.scopes.createImportingScopes import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult +import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.compose -class FirTypeResolveTransformer(private val scopeSession: ScopeSession) : FirAbstractTreeTransformerWithSuperTypes( +@Deprecated("Should be used just once from createTransformerByPhase", level = DeprecationLevel.WARNING) +class FirTypeResolveTransformerAdapter( + private val scopeSession: ScopeSession +) : FirTransformer() { + override fun transformElement(element: E, data: Nothing?): CompositeTransformResult { + error("Should not be called for ${element::class}, only for files") + } + + override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { + val transformer = FirTypeResolveTransformer(scopeSession, file.session) + return file.transform(transformer, null) + } +} + +class FirTypeResolveTransformer( + private val scopeSession: ScopeSession, + override val session: FirSession, +) : FirAbstractTreeTransformerWithSuperTypes( phase = FirResolvePhase.TYPES, reversedScopePriority = true ) { - override lateinit var session: FirSession - private lateinit var typeResolverTransformer: FirSpecificTypeResolverTransformer + private val typeResolverTransformer: FirSpecificTypeResolverTransformer = FirSpecificTypeResolverTransformer(towerScope, session) override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult { - session = file.session return withScopeCleanup { - towerScope.addImportingScopes(file, session, scopeSession) - typeResolverTransformer = FirSpecificTypeResolverTransformer(towerScope, session) + towerScope.addScopes(createImportingScopes(file, session, scopeSession)) super.transformFile(file, data) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt index afc1f2828f8..aab5e31b118 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ResolvePhaseUtils.kt @@ -19,7 +19,7 @@ fun FirResolvePhase.createTransformerByPhase(scopeSession: ScopeSession): FirTra IMPORTS -> FirImportResolveTransformer() SUPER_TYPES -> FirSupertypeResolverTransformer(scopeSession) SEALED_CLASS_INHERITORS -> FirSealedClassInheritorsTransformer() - TYPES -> FirTypeResolveTransformer(scopeSession) + TYPES -> FirTypeResolveTransformerAdapter(scopeSession) STATUS -> FirStatusResolveTransformer() IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveTransformerAdapter(scopeSession) BODY_RESOLVE -> FirBodyResolveTransformerAdapter(scopeSession) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirCompositeScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirCompositeScope.kt index c6bfe4a5963..faba26d9811 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirCompositeScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirCompositeScope.kt @@ -5,12 +5,8 @@ package org.jetbrains.kotlin.fir.scopes.impl -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.scopes.FirIterableScope import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.scopes.createImportingScopes class FirCompositeScope( private val scopeList: MutableList, @@ -18,8 +14,8 @@ class FirCompositeScope( ) : FirIterableScope() { override val scopes get() = if (reversedPriority) scopeList.asReversed() else scopeList - fun addImportingScopes(file: FirFile, session: FirSession, scopeSession: ScopeSession) { - scopeList += createImportingScopes(file, session, scopeSession) + fun addScopes(scopes: List) { + scopeList += scopes } fun addScope(scope: FirScope) {