From 0f2aca3280b20a172197c782505a661f19f9c21c Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 31 Dec 2020 12:22:47 +0100 Subject: [PATCH] FIR: use session symbolProvider from symbol for getting it's file --- .../kotlin/fir/session/FirSessionFactory.kt | 33 +++++----- .../impl/FirLibrarySessionProvider.kt | 38 ++++++++++++ .../FirStatusResolveTransformer.kt | 2 +- ...rIdeBuiltinsAndCloneableSessionProvider.kt | 36 +++++++++++ .../FirIdeLibrariesSessionProvider.kt | 45 ++++++++++++++ .../api/sessions/FirIdeSessionFactory.kt | 62 ++++++++++--------- 6 files changed, 168 insertions(+), 48 deletions(-) create mode 100644 compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirLibrarySessionProvider.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeBuiltinsAndCloneableSessionProvider.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeLibrariesSessionProvider.kt diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt index c5a9e6dd782..9593d047d8b 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactory.kt @@ -125,26 +125,25 @@ object FirSessionFactory { val kotlinScopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped) - register( - FirSymbolProvider::class, - FirCompositeSymbolProvider( - this, - listOf( - KotlinDeserializedJvmSymbolsProvider( - this, project, - packagePartProvider, - javaSymbolProvider, - kotlinClassFinder, - javaClassFinder, - kotlinScopeProvider - ), - FirBuiltinSymbolProvider(this, kotlinScopeProvider), - FirCloneableSymbolProvider(this, kotlinScopeProvider), + val symbolProvider = FirCompositeSymbolProvider( + this, + listOf( + KotlinDeserializedJvmSymbolsProvider( + this, project, + packagePartProvider, javaSymbolProvider, - FirDependenciesSymbolProviderImpl(this) - ) + kotlinClassFinder, + javaClassFinder, + kotlinScopeProvider + ), + FirBuiltinSymbolProvider(this, kotlinScopeProvider), + FirCloneableSymbolProvider(this, kotlinScopeProvider), + javaSymbolProvider, + FirDependenciesSymbolProviderImpl(this) ) ) + register(FirSymbolProvider::class, symbolProvider) + register(FirProvider::class, FirLibrarySessionProvider(symbolProvider)) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirLibrarySessionProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirLibrarySessionProvider.kt new file mode 100644 index 00000000000..078cb5cfb30 --- /dev/null +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirLibrarySessionProvider.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.resolve.providers.impl + +import org.jetbrains.kotlin.fir.declarations.* +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.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name + +class FirLibrarySessionProvider( + override val symbolProvider: FirSymbolProvider +) : FirProvider() { + override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? = + symbolProvider.getClassLikeSymbolByFqName(classId)?.fir + + override fun getFirClassifierContainerFile(fqName: ClassId): FirFile = shouldNotBeCalled() + + override fun getFirClassifierContainerFileIfAny(fqName: ClassId): FirFile? = null + override fun getFirCallableContainerFile(symbol: FirCallableSymbol<*>): FirFile? = null + override fun getFirFilesByPackage(fqName: FqName): List = emptyList() + + @FirProviderInternals + override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) = shouldNotBeCalled() + + @FirProviderInternals + override fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration) = shouldNotBeCalled() + + override fun getClassNamesInPackage(fqName: FqName): Set = shouldNotBeCalled() + + private fun shouldNotBeCalled(): Nothing = error("Should not be called for FirLibrarySessionProvider") +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt index aed18b27dc9..2eafe99a899 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt @@ -234,7 +234,6 @@ abstract class AbstractFirStatusResolveTransformer( protected val containingClass: FirClass<*>? get() = classes.lastOrNull() - private val firProvider = session.firProvider private val symbolProvider = session.symbolProvider protected abstract fun FirDeclaration.needResolveMembers(): Boolean @@ -383,6 +382,7 @@ abstract class AbstractFirStatusResolveTransformer( @OptIn(ExperimentalStdlibApi::class) private fun forceResolveStatusesOfClass(regularClass: FirRegularClass) { + val firProvider = regularClass.session.firProvider if (statusComputationSession[regularClass] == StatusComputationSession.StatusComputationStatus.Computed) return val file = firProvider.getFirClassifierContainerFileIfAny(regularClass.symbol) if (regularClass.status is FirResolvedDeclarationStatus) { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeBuiltinsAndCloneableSessionProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeBuiltinsAndCloneableSessionProvider.kt new file mode 100644 index 00000000000..fc8799a3a2b --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeBuiltinsAndCloneableSessionProvider.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api.providers + +import org.jetbrains.kotlin.fir.declarations.* +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.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name + +internal class FirIdeBuiltinsAndCloneableSessionProvider(override val symbolProvider: FirSymbolProvider) : FirProvider() { + override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? = + symbolProvider.getClassLikeSymbolByFqName(classId)?.fir + + override fun getFirClassifierContainerFile(fqName: ClassId): FirFile = shouldNotBeCalled() + + override fun getFirClassifierContainerFileIfAny(fqName: ClassId): FirFile? = null + override fun getFirCallableContainerFile(symbol: FirCallableSymbol<*>): FirFile? = null + override fun getFirFilesByPackage(fqName: FqName): List = emptyList() + + @FirProviderInternals + override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) = shouldNotBeCalled() + + @FirProviderInternals + override fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration) = shouldNotBeCalled() + + override fun getClassNamesInPackage(fqName: FqName): Set = shouldNotBeCalled() + + private fun shouldNotBeCalled(): Nothing = error("Should not be called for FirIdeBuiltinsAndCloneableSession") +} \ 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/providers/FirIdeLibrariesSessionProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeLibrariesSessionProvider.kt new file mode 100644 index 00000000000..df88a27e2ae --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeLibrariesSessionProvider.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api.providers + +import org.jetbrains.kotlin.fir.declarations.* +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.impl.FirBuiltinSymbolProvider +import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCloneableSymbolProvider +import org.jetbrains.kotlin.fir.resolve.providers.impl.FirCompositeSymbolProvider +import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped +import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeBuiltinsAndCloneableSession +import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeLibrariesSession +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name + +internal class FirIdeLibrariesSessionProvider( + override val symbolProvider: FirSymbolProvider +) : FirProvider() { + override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? = + symbolProvider.getClassLikeSymbolByFqName(classId)?.fir + + override fun getFirClassifierContainerFile(fqName: ClassId): FirFile = shouldNotBeCalled() + + override fun getFirClassifierContainerFileIfAny(fqName: ClassId): FirFile? = null + override fun getFirCallableContainerFile(symbol: FirCallableSymbol<*>): FirFile? = null + override fun getFirFilesByPackage(fqName: FqName): List = emptyList() + + @FirProviderInternals + override fun recordGeneratedClass(owner: FirAnnotatedDeclaration, klass: FirRegularClass) = shouldNotBeCalled() + + @FirProviderInternals + override fun recordGeneratedMember(owner: FirAnnotatedDeclaration, klass: FirDeclaration) = shouldNotBeCalled() + + override fun getClassNamesInPackage(fqName: FqName): Set = shouldNotBeCalled() + + private fun shouldNotBeCalled(): Nothing = error("Should not be called for FirIdeLibrariesSessionProvider") +} \ 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/FirIdeSessionFactory.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt index d6d5e0881ba..1fb00089bf1 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt @@ -37,9 +37,13 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCacheImpl import org.jetbrains.kotlin.idea.fir.low.level.api.fir.caches.FirThreadSafeCachesFactory import org.jetbrains.kotlin.idea.fir.low.level.api.lazy.resolve.FirLazyDeclarationResolver -import org.jetbrains.kotlin.idea.fir.low.level.api.providers.FirModuleWithDependenciesSymbolProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.providers.* +import org.jetbrains.kotlin.idea.fir.low.level.api.providers.FirIdeBuiltinsAndCloneableSessionProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.providers.FirIdeLibrariesSessionProvider import org.jetbrains.kotlin.idea.fir.low.level.api.providers.FirIdeProvider +import org.jetbrains.kotlin.idea.fir.low.level.api.providers.FirModuleWithDependenciesSymbolProvider import org.jetbrains.kotlin.idea.fir.low.level.api.providers.FirThreadSafeSymbolProviderWrapper +import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSessionFactory.registerIdeComponents import org.jetbrains.kotlin.idea.fir.low.level.api.util.ModuleLibrariesSearchScope import org.jetbrains.kotlin.idea.fir.low.level.api.util.checkCanceled import org.jetbrains.kotlin.load.java.JavaClassFinderImpl @@ -172,30 +176,29 @@ internal object FirIdeSessionFactory { val kotlinScopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped) - @OptIn(ExperimentalStdlibApi::class) - register( - FirSymbolProvider::class, - FirCompositeSymbolProvider( - this, - buildList { - add( - FirThreadSafeSymbolProviderWrapper( - KotlinDeserializedJvmSymbolsProvider( - this@apply, - project, - packagePartProvider, - javaSymbolProvider, - kotlinClassFinder, - javaClassFinder, - kotlinScopeProvider - ) + val symbolProvider = FirCompositeSymbolProvider( + this, + @OptIn(ExperimentalStdlibApi::class) + buildList { + add( + FirThreadSafeSymbolProviderWrapper( + KotlinDeserializedJvmSymbolsProvider( + this@apply, + project, + packagePartProvider, + javaSymbolProvider, + kotlinClassFinder, + javaClassFinder, + kotlinScopeProvider ) ) - add(javaSymbolProvider) - addAll((builtinsAndCloneableSession.symbolProvider as FirCompositeSymbolProvider).providers) - } - ) + ) + add(javaSymbolProvider) + addAll((builtinsAndCloneableSession.symbolProvider as FirCompositeSymbolProvider).providers) + } ) + register(FirProvider::class, FirIdeLibrariesSessionProvider(symbolProvider)) + register(FirSymbolProvider::class, symbolProvider) register(FirJvmTypeMapper::class, FirJvmTypeMapper(this)) configureSession?.invoke(this) } @@ -212,16 +215,15 @@ internal object FirIdeSessionFactory { registerCommonComponents(languageVersionSettings) val kotlinScopeProvider = KotlinScopeProvider(::wrapScopeWithJvmMapped) - register( - FirSymbolProvider::class, - FirCompositeSymbolProvider( - this, - listOf( - FirBuiltinSymbolProvider(this, kotlinScopeProvider), - FirCloneableSymbolProvider(this, kotlinScopeProvider), - ) + val symbolProvider = FirCompositeSymbolProvider( + this, + listOf( + FirBuiltinSymbolProvider(this, kotlinScopeProvider), + FirCloneableSymbolProvider(this, kotlinScopeProvider), ) ) + register(FirSymbolProvider::class, symbolProvider) + register(FirProvider::class, FirIdeBuiltinsAndCloneableSessionProvider(symbolProvider)) register(FirJvmTypeMapper::class, FirJvmTypeMapper(this)) configureSession?.invoke(this) }