FIR: Prepare type resolution phase for running on local classes
This commit is contained in:
+23
-6
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user