From 9032234e1d125fb3c6990ee2b6469da167ca1c4a Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 13 Aug 2020 17:46:52 +0300 Subject: [PATCH] [FIR] Get rid of FirSymbolProvider.getNestedClassifierScope --- .../fir/java/FirJavaModuleBasedSession.kt | 4 +++- .../kotlin/fir/java/JavaSymbolProvider.kt | 21 ++----------------- .../KotlinDeserializedJvmSymbolsProvider.kt | 12 ++--------- .../AbstractFirSymbolProviderWithCache.kt | 3 ++- .../resolve/providers/FirSymbolProvider.kt | 13 +----------- .../impl/FirBuiltinSymbolProvider.kt | 13 +----------- .../impl/FirCloneableSymbolProvider.kt | 7 +------ .../impl/FirCompositeSymbolProvider.kt | 8 ++----- .../impl/FirDependenciesSymbolProviderImpl.kt | 8 +------ .../resolve/providers/impl/FirProviderImpl.kt | 10 +-------- ...irAbstractTreeTransformerWithSuperTypes.kt | 14 ++++++++----- .../transformers/FirSupertypesResolution.kt | 7 ++++--- .../transformers/FirTypeResolveTransformer.kt | 5 +++-- .../org/jetbrains/kotlin/fir/scopes/Scopes.kt | 12 +++++++++++ .../level/api/FirIdeJavaModuleBasedSession.kt | 1 + .../low/level/api/providers/FirIdeProvider.kt | 6 +----- .../level/api/providers/FirProviderHelper.kt | 16 +++----------- .../api/sessions/FirIdeLibrarySession.kt | 5 ++--- 18 files changed, 51 insertions(+), 114 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt index 047309463d6..8be814a4255 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt @@ -13,9 +13,9 @@ import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.registerCheckersComponent import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider +import org.jetbrains.kotlin.fir.resolve.calls.jvm.registerJvmCallConflictResolverFactory import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider -import org.jetbrains.kotlin.fir.resolve.calls.jvm.registerJvmCallConflictResolverFactory import org.jetbrains.kotlin.fir.resolve.providers.impl.* import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider @@ -48,6 +48,7 @@ class FirJavaModuleBasedSession private constructor( register( FirSymbolProvider::class, FirCompositeSymbolProvider( + this, listOf( firProvider.symbolProvider, JavaSymbolProvider(this, sessionProvider.project, scope), @@ -97,6 +98,7 @@ class FirLibrarySession private constructor( register( FirSymbolProvider::class, FirCompositeSymbolProvider( + this, listOf( KotlinDeserializedJvmSymbolsProvider( this, sessionProvider.project, diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index 78413e7f437..8eb5709ed1b 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -24,9 +24,6 @@ import org.jetbrains.kotlin.fir.resolve.providers.AbstractFirSymbolProviderWithC import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals import org.jetbrains.kotlin.fir.resolve.providers.SymbolProviderCache import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped -import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.scopes.impl.lazyNestedClassifierScope -import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef @@ -45,10 +42,10 @@ import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.addIfNotNull class JavaSymbolProvider( - val session: FirSession, + session: FirSession, val project: Project, private val searchScope: GlobalSearchScope, -) : AbstractFirSymbolProviderWithCache() { +) : AbstractFirSymbolProviderWithCache(session) { companion object { private val VALUE_METHOD_NAME = Name.identifier("value") } @@ -66,20 +63,6 @@ class JavaSymbolProvider( @FirSymbolProviderInternals override fun getTopLevelCallableSymbolsTo(destination: MutableList>, packageFqName: FqName, name: Name) {} - override fun getNestedClassifierScope(classId: ClassId): FirScope? { - val symbol = this.getClassLikeSymbolByFqName(classId) ?: return null - val regularClass = symbol.fir - return if (regularClass is FirJavaClass) { - lazyNestedClassifierScope( - classId, - existingNames = regularClass.existingNestedClassifierNames, - symbolProvider = this, - ) - } else { - nestedClassifierScope(regularClass) - } - } - private fun JavaTypeParameter.toFirTypeParameterSymbol( javaTypeParameterStack: JavaTypeParameterStack ): Pair { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt index 103c82048f9..e06443153cd 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt @@ -29,9 +29,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.AbstractFirSymbolProviderWithC import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals import org.jetbrains.kotlin.fir.resolve.providers.SymbolProviderCache import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredCallableSymbols -import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider -import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef @@ -56,14 +54,14 @@ import org.jetbrains.kotlin.serialization.deserialization.getName import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult class KotlinDeserializedJvmSymbolsProvider( - val session: FirSession, + session: FirSession, val project: Project, private val packagePartProvider: PackagePartProvider, private val javaSymbolProvider: JavaSymbolProvider, private val kotlinClassFinder: KotlinClassFinder, private val javaClassFinder: JavaClassFinder, private val kotlinScopeProvider: KotlinScopeProvider, -) : AbstractFirSymbolProviderWithCache() { +) : AbstractFirSymbolProviderWithCache(session) { private val typeAliasCache = SymbolProviderCache() private val packagePartsCache = SymbolProviderCache>() @@ -391,12 +389,6 @@ class KotlinDeserializedJvmSymbolsProvider( } } - override fun getNestedClassifierScope(classId: ClassId): FirScope? { - return findRegularClass(classId)?.let { - nestedClassifierScope(it) - } - } - private fun getPackageParts(packageFqName: FqName): Collection { return packagePartsCache.lookupCacheOrCalculate(packageFqName) { try { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/AbstractFirSymbolProviderWithCache.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/AbstractFirSymbolProviderWithCache.kt index 3ce12721824..d30e870426a 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/AbstractFirSymbolProviderWithCache.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/AbstractFirSymbolProviderWithCache.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.resolve.providers +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.PrivateForInline import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol @@ -12,7 +13,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName -abstract class AbstractFirSymbolProviderWithCache> : FirSymbolProvider() { +abstract class AbstractFirSymbolProviderWithCache>(session: FirSession) : FirSymbolProvider(session) { protected val classCache = SymbolProviderCache() protected val topLevelCallableCache = SymbolProviderCache>>() protected val packageCache = SymbolProviderCache() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt index 52825154a88..b9af72e6c9b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/FirSymbolProvider.kt @@ -7,10 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.providers import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSessionComponent -import org.jetbrains.kotlin.fir.resolve.firSymbolProvider -import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope -import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeClassifierLookupTag @@ -26,7 +23,7 @@ import org.jetbrains.kotlin.name.Name @RequiresOptIn annotation class FirSymbolProviderInternals -abstract class FirSymbolProvider : FirSessionComponent { +abstract class FirSymbolProvider(protected val session: FirSession) : FirSessionComponent { abstract fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? fun getSymbolByLookupTag(lookupTag: ConeClassLikeLookupTag): FirClassLikeSymbol<*>? { @@ -54,17 +51,9 @@ abstract class FirSymbolProvider : FirSessionComponent { @FirSymbolProviderInternals abstract fun getTopLevelCallableSymbolsTo(destination: MutableList>, packageFqName: FqName, name: Name) - abstract fun getNestedClassifierScope(classId: ClassId): FirScope? - abstract fun getPackage(fqName: FqName): FqName? // TODO: Replace to symbol sometime } -fun FirSession.getNestedClassifierScope(lookupTag: ConeClassLikeLookupTag): FirScope? = - when (lookupTag) { - is ConeClassLookupTagWithFixedSymbol -> nestedClassifierScope(lookupTag.symbol.fir) - else -> firSymbolProvider.getNestedClassifierScope(lookupTag.classId) - } - fun FirSymbolProvider.getClassDeclaredCallableSymbols(classId: ClassId, name: Name): List> { val classSymbol = getClassLikeSymbolByFqName(classId) as? FirRegularClassSymbol ?: return emptyList() val declaredMemberScope = declaredMemberScope(classSymbol.fir) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt index 5a8ae652428..5a9905f2cc0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt @@ -25,9 +25,7 @@ import org.jetbrains.kotlin.fir.deserialization.deserializeClassToSymbol import org.jetbrains.kotlin.fir.resolve.getOrPut import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals -import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider -import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.impl.* @@ -49,7 +47,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult import java.io.InputStream -class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider: KotlinScopeProvider) : FirSymbolProvider() { +class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: KotlinScopeProvider) : FirSymbolProvider(session) { private data class SyntheticFunctionalInterfaceSymbolKey(val kind: FunctionClassDescriptor.Kind, val arity: Int) @@ -251,15 +249,6 @@ class FirBuiltinSymbolProvider(val session: FirSession, val kotlinScopeProvider: } } - override fun getNestedClassifierScope(classId: ClassId): FirScope? { - return findRegularClass(classId)?.let { - nestedClassifierScope(it) - } - } - - private fun findRegularClass(classId: ClassId): FirRegularClass? = - getClassLikeSymbolByFqName(classId)?.fir - private class BuiltInsPackageFragment( stream: InputStream, val fqName: FqName, val session: FirSession, val kotlinScopeProvider: KotlinScopeProvider, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCloneableSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCloneableSymbolProvider.kt index 40318572c6d..f508f2d3f1e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCloneableSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCloneableSymbolProvider.kt @@ -17,7 +17,6 @@ import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals -import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol @@ -29,7 +28,7 @@ import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -class FirCloneableSymbolProvider(session: FirSession, scopeProvider: FirScopeProvider) : FirSymbolProvider() { +class FirCloneableSymbolProvider(session: FirSession, scopeProvider: FirScopeProvider) : FirSymbolProvider(session) { companion object { val CLONEABLE: Name = Name.identifier("Cloneable") val CLONEABLE_CLASS_ID: ClassId = ClassId(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME, CLONEABLE) @@ -69,10 +68,6 @@ class FirCloneableSymbolProvider(session: FirSession, scopeProvider: FirScopePro @FirSymbolProviderInternals override fun getTopLevelCallableSymbolsTo(destination: MutableList>, packageFqName: FqName, name: Name) {} - override fun getNestedClassifierScope(classId: ClassId): FirScope? { - return null - } - override fun getPackage(fqName: FqName): FqName? { return null } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCompositeSymbolProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCompositeSymbolProvider.kt index efd871dd039..5baa540ff0f 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCompositeSymbolProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirCompositeSymbolProvider.kt @@ -5,9 +5,9 @@ package org.jetbrains.kotlin.fir.resolve.providers.impl +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals -import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.name.ClassId @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult -class FirCompositeSymbolProvider(val providers: List) : FirSymbolProvider() { +class FirCompositeSymbolProvider(session: FirSession, val providers: List) : FirSymbolProvider(session) { override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List> { return providers.flatMap { it.getTopLevelCallableSymbols(packageFqName, name) } } @@ -25,10 +25,6 @@ class FirCompositeSymbolProvider(val providers: List) : FirSy destination += getTopLevelCallableSymbols(packageFqName, name) } - override fun getNestedClassifierScope(classId: ClassId): FirScope? { - return providers.firstNotNullResult { it.getNestedClassifierScope(classId) } - } - override fun getPackage(fqName: FqName): FqName? { return providers.firstNotNullResult { it.getPackage(fqName) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirDependenciesSymbolProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirDependenciesSymbolProviderImpl.kt index 49c472fbe4b..7839fae5b22 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirDependenciesSymbolProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirDependenciesSymbolProviderImpl.kt @@ -10,16 +10,14 @@ import org.jetbrains.kotlin.fir.dependenciesWithoutSelf import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.AbstractFirSymbolProviderWithCache import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals -import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult -open class FirDependenciesSymbolProviderImpl(val session: FirSession) : AbstractFirSymbolProviderWithCache>() { +open class FirDependenciesSymbolProviderImpl(session: FirSession) : AbstractFirSymbolProviderWithCache>(session) { protected open val dependencyProviders by lazy { val moduleInfo = session.moduleInfo ?: return@lazy emptyList() moduleInfo.dependenciesWithoutSelf().mapNotNull { @@ -38,10 +36,6 @@ open class FirDependenciesSymbolProviderImpl(val session: FirSession) : Abstract } ?: emptyList() } - override fun getNestedClassifierScope(classId: ClassId): FirScope? { - return dependencyProviders.firstNotNullResult { it.getNestedClassifierScope(classId) } - } - override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? { return classCache.lookupCacheOrCalculate(classId) { for (provider in dependencyProviders) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirProviderImpl.kt index 3cb186cf7dc..3ea9a27a4a2 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirProviderImpl.kt @@ -14,9 +14,7 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals -import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider -import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol @@ -54,7 +52,7 @@ class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: KotlinSc recordFile(file, state) } - private inner class SymbolProvider : FirSymbolProvider() { + private inner class SymbolProvider : FirSymbolProvider(session) { override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? { return getFirClassifierByFqName(classId)?.symbol } @@ -68,12 +66,6 @@ class FirProviderImpl(val session: FirSession, val kotlinScopeProvider: KotlinSc destination += getTopLevelCallableSymbols(packageFqName, name) } - override fun getNestedClassifierScope(classId: ClassId): FirScope? { - return (getFirClassifierByFqName(classId) as? FirRegularClass)?.let { - nestedClassifierScope(it) - } - } - override fun getPackage(fqName: FqName): FqName? { if (getFirFilesByPackage(fqName).isNotEmpty()) return fqName return null diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt index a49f60911c7..6669abe2da7 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractTreeTransformerWithSuperTypes.kt @@ -13,21 +13,25 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.expressions.FirStatement +import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes -import org.jetbrains.kotlin.fir.resolve.providers.getNestedClassifierScope import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.FirCompositeScope import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.scopes.impl.* +import org.jetbrains.kotlin.fir.scopes.getNestedClassifierScope +import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope +import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope +import org.jetbrains.kotlin.fir.scopes.impl.wrapNestedClassifierScopeWithSubstitutionForSuperType import org.jetbrains.kotlin.fir.types.ConeClassErrorType import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult abstract class FirAbstractTreeTransformerWithSuperTypes( - phase: FirResolvePhase + phase: FirResolvePhase, + protected val scopeSession: ScopeSession ) : FirAbstractTreeTransformer(phase) { protected val scopes = mutableListOf() protected val towerScope = FirCompositeScope(scopes.asReversed()) @@ -57,7 +61,7 @@ abstract class FirAbstractTreeTransformerWithSuperTypes( useSiteSession = session ).asReversed() for (superType in superTypes) { - session.getNestedClassifierScope(superType.lookupTag)?.let { nestedClassifierScope -> + session.getNestedClassifierScope(superType.lookupTag, scopeSession)?.let { nestedClassifierScope -> val scope = nestedClassifierScope.wrapNestedClassifierScopeWithSubstitutionForSuperType(superType, session) scopes.add(scope) } @@ -90,4 +94,4 @@ fun createSubstitutionForSupertype(superType: ConeLookupTagBasedType, session: F } val mapping = klass.typeParameters.map { it.symbol }.zip(arguments).toMap() return ConeSubstitutorByMap(mapping) -} \ No newline at end of file +} 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 139a15763d8..e507a819cbc 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 @@ -14,11 +14,11 @@ import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider import org.jetbrains.kotlin.fir.extensions.supertypeGenerators import org.jetbrains.kotlin.fir.resolve.* -import org.jetbrains.kotlin.fir.resolve.providers.getNestedClassifierScope import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.LocalClassesNavigationInfo 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 import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.scopes.impl.wrapNestedClassifierScopeWithSubstitutionForSuperType @@ -141,6 +141,7 @@ private fun FirClassLikeDeclaration<*>.typeParametersScope(): FirScope? { private fun createScopesForNestedClasses( klass: FirClass<*>, session: FirSession, + scopeSession: ScopeSession, supertypeComputationSession: SupertypeComputationSession ): Collection = mutableListOf().apply { @@ -149,7 +150,7 @@ private fun createScopesForNestedClasses( lookupInterfaces = false, deep = true, substituteTypes = true, useSiteSession = session, supertypeSupplier = supertypeComputationSession.supertypesSupplier ).asReversed().mapNotNullTo(this) { - session.getNestedClassifierScope(it.lookupTag) + session.getNestedClassifierScope(it.lookupTag, scopeSession) ?.wrapNestedClassifierScopeWithSubstitutionForSuperType(it, session) } addIfNotNull(klass.typeParametersScope()) @@ -188,7 +189,7 @@ private class FirSupertypeResolverVisitor( resolveAllSupertypes(klass, klass.superTypeRefs) - scopes.pushAll(createScopesForNestedClasses(klass, session, supertypeComputationSession)) + scopes.pushAll(createScopesForNestedClasses(klass, session, scopeSession, supertypeComputationSession)) } } 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 27b5599d1e7..32e929b97b2 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 @@ -33,10 +33,11 @@ fun > F.runTypeResolvePhaseForLocalClass( class FirTypeResolveTransformer( override val session: FirSession, - private val scopeSession: ScopeSession, + scopeSession: ScopeSession, initialScopes: List = emptyList() ) : FirAbstractTreeTransformerWithSuperTypes( - phase = FirResolvePhase.TYPES + phase = FirResolvePhase.TYPES, + scopeSession ) { init { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/Scopes.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/Scopes.kt index 7761a6e638e..b81414eaa09 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/Scopes.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/Scopes.kt @@ -7,10 +7,14 @@ package org.jetbrains.kotlin.fir.scopes import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirFile +import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSessionKey +import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.scopeSessionKey import org.jetbrains.kotlin.fir.scopes.impl.* +import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag +import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLookupTagWithFixedSymbol import org.jetbrains.kotlin.name.FqName private object FirDefaultStarImportingScopeKey : ScopeSessionKey() @@ -61,3 +65,11 @@ private fun doCreateImportingScopes( } private val PACKAGE_MEMBER = scopeSessionKey() + +fun FirSession.getNestedClassifierScope(lookupTag: ConeClassLikeLookupTag, scopeSession: ScopeSession): FirScope? { + val klass = when (lookupTag) { + is ConeClassLookupTagWithFixedSymbol -> lookupTag.symbol.fir + else -> firSymbolProvider.getClassLikeSymbolByFqName(lookupTag.classId)?.fir as? FirRegularClass ?: return null + } + return klass.scopeProvider.getNestedClassifierScope(klass, this, scopeSession) +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt index b7f54168a99..5b87424388c 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt @@ -80,6 +80,7 @@ internal class FirIdeJavaModuleBasedSession private constructor( register( FirSymbolProvider::class, FirCompositeSymbolProvider( + this, @OptIn(ExperimentalStdlibApi::class) buildList { add(provider.symbolProvider) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt index 8928a64266c..923e4457d19 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.fir.resolve.providers.FirProvider import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals -import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider import org.jetbrains.kotlin.fir.symbols.impl.FirAccessorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol @@ -117,7 +116,7 @@ internal class FirIdeProvider( return emptySet() } - private inner class SymbolProvider : FirSymbolProvider() { + private inner class SymbolProvider : FirSymbolProvider(session) { override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List> = providerHelper.getTopLevelCallableSymbols(packageFqName, name) @@ -129,9 +128,6 @@ internal class FirIdeProvider( override fun getPackage(fqName: FqName): FqName? = providerHelper.getPackage(fqName) - override fun getNestedClassifierScope(classId: ClassId): FirScope? = - providerHelper.getNestedClassifierScope(classId) - override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? { return getFirClassifierByFqName(classId)?.symbol } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirProviderHelper.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirProviderHelper.kt index 91cab9b9d96..6fc57b5be25 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirProviderHelper.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirProviderHelper.kt @@ -9,19 +9,14 @@ import com.google.common.collect.Sets import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.declarations.FirRegularClass -import org.jetbrains.kotlin.fir.psi -import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.scopes.impl.nestedClassifierScope import org.jetbrains.kotlin.fir.symbols.CallableId -import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol -import org.jetbrains.kotlin.idea.fir.low.level.api.util.FirElementFinder import org.jetbrains.kotlin.idea.fir.low.level.api.IndexHelper import org.jetbrains.kotlin.idea.fir.low.level.api.PackageExistenceChecker -import org.jetbrains.kotlin.idea.fir.low.level.api.util.executeOrReturnDefaultValueOnPCE import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache +import org.jetbrains.kotlin.idea.fir.low.level.api.util.FirElementFinder +import org.jetbrains.kotlin.idea.fir.low.level.api.util.executeOrReturnDefaultValueOnPCE import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -80,11 +75,6 @@ internal class FirProviderHelper( } } - fun getNestedClassifierScope(classId: ClassId): FirScope? = - (getFirClassifierByFqName(classId) as? FirRegularClass)?.let { - nestedClassifierScope(it) - } - fun getPackage(fqName: FqName): FqName? = fqName.takeIf(packageExistenceChecker::isPackageExists) -} \ No newline at end of file +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt index 8414de96efc..b52efa8cdfd 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeLibrarySession.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.sessions import com.intellij.openapi.project.Project -import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.JavaSymbolProvider @@ -21,7 +20,6 @@ import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider import org.jetbrains.kotlin.idea.fir.low.level.api.IdeSessionComponents -import org.jetbrains.kotlin.idea.search.minus import org.jetbrains.kotlin.load.java.JavaClassFinderImpl import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory @@ -52,6 +50,7 @@ class FirIdeModuleLibraryDependenciesSession private constructor( register( FirSymbolProvider::class, FirCompositeSymbolProvider( + this, listOf( KotlinDeserializedJvmSymbolsProvider( this, @@ -71,4 +70,4 @@ class FirIdeModuleLibraryDependenciesSession private constructor( } } } -} \ No newline at end of file +}