FIR: Prepare type resolution phase for running on local classes

This commit is contained in:
Denis Zharkov
2020-03-23 17:58:33 +03:00
parent b8fb83e34c
commit 6894962e3a
3 changed files with 26 additions and 13 deletions
@@ -5,30 +5,47 @@
package org.jetbrains.kotlin.fir.resolve.transformers package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.fir.FirElement
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.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.ScopeSession 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.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitBuiltinTypeRef
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.compose 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<Nothing?>() {
override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> {
error("Should not be called for ${element::class}, only for files")
}
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirDeclaration> {
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, phase = FirResolvePhase.TYPES,
reversedScopePriority = true 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<FirFile> { override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
session = file.session
return withScopeCleanup { return withScopeCleanup {
towerScope.addImportingScopes(file, session, scopeSession) towerScope.addScopes(createImportingScopes(file, session, scopeSession))
typeResolverTransformer = FirSpecificTypeResolverTransformer(towerScope, session)
super.transformFile(file, data) super.transformFile(file, data)
} }
} }
@@ -19,7 +19,7 @@ fun FirResolvePhase.createTransformerByPhase(scopeSession: ScopeSession): FirTra
IMPORTS -> FirImportResolveTransformer() IMPORTS -> FirImportResolveTransformer()
SUPER_TYPES -> FirSupertypeResolverTransformer(scopeSession) SUPER_TYPES -> FirSupertypeResolverTransformer(scopeSession)
SEALED_CLASS_INHERITORS -> FirSealedClassInheritorsTransformer() SEALED_CLASS_INHERITORS -> FirSealedClassInheritorsTransformer()
TYPES -> FirTypeResolveTransformer(scopeSession) TYPES -> FirTypeResolveTransformerAdapter(scopeSession)
STATUS -> FirStatusResolveTransformer() STATUS -> FirStatusResolveTransformer()
IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveTransformerAdapter(scopeSession) IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveTransformerAdapter(scopeSession)
BODY_RESOLVE -> FirBodyResolveTransformerAdapter(scopeSession) BODY_RESOLVE -> FirBodyResolveTransformerAdapter(scopeSession)
@@ -5,12 +5,8 @@
package org.jetbrains.kotlin.fir.scopes.impl 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.FirIterableScope
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.createImportingScopes
class FirCompositeScope( class FirCompositeScope(
private val scopeList: MutableList<FirScope>, private val scopeList: MutableList<FirScope>,
@@ -18,8 +14,8 @@ class FirCompositeScope(
) : FirIterableScope() { ) : FirIterableScope() {
override val scopes get() = if (reversedPriority) scopeList.asReversed() else scopeList override val scopes get() = if (reversedPriority) scopeList.asReversed() else scopeList
fun addImportingScopes(file: FirFile, session: FirSession, scopeSession: ScopeSession) { fun addScopes(scopes: List<FirScope>) {
scopeList += createImportingScopes(file, session, scopeSession) scopeList += scopes
} }
fun addScope(scope: FirScope) { fun addScope(scope: FirScope) {