From 2620647b0323e17f853de6f1bb5483fd591063f2 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Wed, 27 Oct 2021 09:35:10 +0000 Subject: [PATCH] [FIR] KT-46968: Remove FirCompositeScope-s from the type resolution --- .../providers/impl/FirTypeResolverImpl.kt | 45 ++++++++++--------- .../FirSpecificTypeResolverTransformer.kt | 6 ++- .../transformers/FirSupertypesResolution.kt | 5 ++- .../transformers/FirTypeResolveTransformer.kt | 3 +- .../transformers/ScopeClassDeclaration.kt | 2 +- .../body/resolve/FirBodyResolveTransformer.kt | 2 +- ...FirAbstractAnnotationResolveTransformer.kt | 4 +- .../FirPluginAnnotationsResolveTransformer.kt | 2 +- 8 files changed, 38 insertions(+), 31 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirTypeResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirTypeResolverImpl.kt index a014082da23..332ad0db40d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirTypeResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirTypeResolverImpl.kt @@ -55,7 +55,7 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver() { private fun resolveToSymbol( typeRef: FirTypeRef, - scope: FirScope, + scopes: List, ): Pair?, ConeSubstitutor?> { return when (typeRef) { is FirResolvedTypeRef -> { @@ -68,25 +68,30 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver() { var resolvedSymbol: FirBasedSymbol<*>? = null var substitutor: ConeSubstitutor? = null val qualifier = typeRef.qualifier - scope.processClassifiersByNameWithSubstitution(qualifier.first().name) { symbol, substitutorFromScope -> - if (resolvedSymbol != null) return@processClassifiersByNameWithSubstitution - resolvedSymbol = when (symbol) { - is FirClassLikeSymbol<*> -> { - if (qualifier.size == 1) { - symbol - } else { - resolveLocalClassChain(symbol, qualifier) - ?: qualifierResolver.resolveSymbolWithPrefix(qualifier, symbol.classId) - ?: qualifierResolver.resolveEnumEntrySymbol(qualifier, symbol.classId) - } - } - is FirTypeParameterSymbol -> { - assert(qualifier.size == 1) - symbol - } - else -> error("!") + for (scope in scopes) { + if (resolvedSymbol != null) { + break + } + scope.processClassifiersByNameWithSubstitution(qualifier.first().name) { symbol, substitutorFromScope -> + if (resolvedSymbol != null) return@processClassifiersByNameWithSubstitution + resolvedSymbol = when (symbol) { + is FirClassLikeSymbol<*> -> { + if (qualifier.size == 1) { + symbol + } else { + resolveLocalClassChain(symbol, qualifier) + ?: qualifierResolver.resolveSymbolWithPrefix(qualifier, symbol.classId) + ?: qualifierResolver.resolveEnumEntrySymbol(qualifier, symbol.classId) + } + } + is FirTypeParameterSymbol -> { + assert(qualifier.size == 1) + symbol + } + else -> error("!") + } + substitutor = substitutorFromScope } - substitutor = substitutorFromScope } // TODO: Imports @@ -376,7 +381,7 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver() { return when (typeRef) { is FirResolvedTypeRef -> typeRef.type is FirUserTypeRef -> { - val (symbol, substitutor) = resolveToSymbol(typeRef, scopeClassDeclaration.scope) + val (symbol, substitutor) = resolveToSymbol(typeRef, scopeClassDeclaration.scopes) resolveUserType( typeRef, symbol, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt index f4d7446faf0..5131f0e06ee 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSpecificTypeResolverTransformer.kt @@ -67,7 +67,8 @@ class FirSpecificTypeResolverTransformer( @OptIn(PrivateForInline::class) override fun transformTypeRef(typeRef: FirTypeRef, data: ScopeClassDeclaration): FirResolvedTypeRef { - session.lookupTracker?.recordTypeLookup(typeRef, data.scope.scopeOwnerLookupNames, currentFile?.source) + val scopeOwnerLookupNames = data.scopes.flatMap { it.scopeOwnerLookupNames } + session.lookupTracker?.recordTypeLookup(typeRef, scopeOwnerLookupNames, currentFile?.source) typeRef.transformChildren(this, data) return transformType(typeRef, typeResolver.resolveType(typeRef, data, areBareTypesAllowed, isOperandOfIsOperator)) } @@ -78,7 +79,8 @@ class FirSpecificTypeResolverTransformer( data: ScopeClassDeclaration ): FirResolvedTypeRef { functionTypeRef.transformChildren(this, data) - session.lookupTracker?.recordTypeLookup(functionTypeRef, data.scope.scopeOwnerLookupNames, currentFile?.source) + val scopeOwnerLookupNames = data.scopes.flatMap { it.scopeOwnerLookupNames } + session.lookupTracker?.recordTypeLookup(functionTypeRef, scopeOwnerLookupNames, currentFile?.source) val resolvedType = typeResolver.resolveType(functionTypeRef, data, areBareTypesAllowed, isOperandOfIsOperator).takeIfAcceptable() return if (resolvedType != null && resolvedType !is ConeClassErrorType) { buildResolvedTypeRef { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt index d50fb4ccf2f..31f7032a962 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt @@ -303,7 +303,7 @@ open class FirSupertypeResolverVisitor( val transformer = FirSpecificTypeResolverTransformer(session) val resolvedTypesRefs = resolveSuperTypeRefs( transformer, - ScopeClassDeclaration(FirCompositeScope(scopes), classDeclarationsStack.lastOrNull()) + ScopeClassDeclaration(scopes, classDeclarationsStack.lastOrNull()) ) supertypeComputationSession.storeSupertypes(classLikeDeclaration, resolvedTypesRefs) @@ -335,7 +335,8 @@ open class FirSupertypeResolverVisitor( session.lookupTracker?.let { val fileSource = getFirClassifierContainerFileIfAny(classLikeDeclaration.symbol)?.source for (supertypeRef in supertypeRefs) { - it.recordTypeLookup(supertypeRef, scopeDeclaration.scope.scopeOwnerLookupNames, fileSource) + val scopeOwnerLookupNames = scopeDeclaration.scopes.flatMap { scope -> scope.scopeOwnerLookupNames } + it.recordTypeLookup(supertypeRef, scopeOwnerLookupNames, fileSource) } } } 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 951b1b8dc2f..9d8ca42a4f5 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 @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeCyclicTypeBound import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes -import org.jetbrains.kotlin.fir.scopes.FirCompositeScope import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.createImportingScopes import org.jetbrains.kotlin.fir.scopes.getNestedClassifierScope @@ -47,7 +46,7 @@ open class FirTypeResolveTransformer( ) : FirAbstractTreeTransformer(FirResolvePhase.TYPES) { private val classDeclarationsStack = ArrayDeque() private val scopes = mutableListOf() - private val towerScope = FirCompositeScope(scopes.asReversed()) + private val towerScope = scopes.asReversed() init { scopes.addAll(initialScopes.asReversed()) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ScopeClassDeclaration.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ScopeClassDeclaration.kt index 0e055cd98a4..f15b12320de 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ScopeClassDeclaration.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/ScopeClassDeclaration.kt @@ -9,6 +9,6 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.scopes.FirScope data class ScopeClassDeclaration( - val scope: FirScope, + val scopes: List, val topDeclaration: FirRegularClass? ) \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt index 00176846427..d69c3e0ff5e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt @@ -69,7 +69,7 @@ open class FirBodyResolveTransformer( transformTypeRef( typeRef, ScopeClassDeclaration( - FirCompositeScope(components.createCurrentScopeList()), + components.createCurrentScopeList(), context.topClassDeclaration ) ) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAbstractAnnotationResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAbstractAnnotationResolveTransformer.kt index 83a5bdffcff..4943da9cf61 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAbstractAnnotationResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirAbstractAnnotationResolveTransformer.kt @@ -24,10 +24,10 @@ internal abstract class FirAbstractAnnotationResolveTransformer( ) : FirDefaultTransformer() { abstract override fun transformAnnotation(annotation: FirAnnotation, data: D): FirStatement - protected lateinit var scope: FirScope + protected lateinit var scopes: List override fun transformFile(file: FirFile, data: D): FirFile { - scope = FirCompositeScope(createImportingScopes(file, session, scopeSession, useCaching = false)) + scopes = createImportingScopes(file, session, scopeSession, useCaching = false) val state = beforeChildren(file) file.transformDeclarations(this, data) afterChildren(state) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirPluginAnnotationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirPluginAnnotationsResolveTransformer.kt index f3c309ed4b4..b57e43772c3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirPluginAnnotationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/plugin/FirPluginAnnotationsResolveTransformer.kt @@ -115,7 +115,7 @@ private class FirAnnotationResolveTransformer( ): FirStatement { return annotation.transformAnnotationTypeRef( typeResolverTransformer, - ScopeClassDeclaration(scope, classDeclarationsStack.lastOrNull()) + ScopeClassDeclaration(scopes, classDeclarationsStack.lastOrNull()) ) }