From 22b8fd636f2d06188ecadda31ad5af05e649383e Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 19 Jul 2022 09:46:03 +0200 Subject: [PATCH] [Analysis API FIR] fix creating symbol for library declaration the search scope for symbols is limited to the target module, so we can find only a single declaration --- .../structure/LLFirBuiltinsSessionFactory.kt | 2 +- .../structure/LLFirLibrarySessionFactory.kt | 2 +- ...LLFirModuleWithDependenciesSymbolProvider.kt | 6 ++++++ .../LLFirBuiltinsAndCloneableSession.kt | 2 ++ .../api/fir/sessions/LLFirLibrariesSession.kt | 2 ++ ...aryOrLibrarySourceResolvableModuleSession.kt | 5 ++--- .../low/level/api/fir/sessions/LLFirSession.kt | 8 ++------ .../api/fir/sessions/LLFirSessionProvider.kt | 17 +++++++++++++---- .../fir/sessions/LLFirSessionProviderStorage.kt | 2 +- .../api/fir/sessions/LLFirSourcesSession.kt | 2 +- .../fir/state/LLFirResolvableResolveSession.kt | 15 ++++++++------- 11 files changed, 39 insertions(+), 24 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt index 3705c225f10..f69946104cb 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirBuiltinsSessionFactory.kt @@ -45,7 +45,7 @@ import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices private fun createBuiltinsAndCloneableSession(platform: TargetPlatform): LLFirBuiltinsAndCloneableSession { val builtinsModule = KtBuiltinsModule(platform, platform.getAnalyzerServices(), project) - return LLFirBuiltinsAndCloneableSession(project, builtInTypes).apply session@{ + return LLFirBuiltinsAndCloneableSession(builtinsModule, project, builtInTypes).apply session@{ val moduleData = LLFirKtModuleBasedModuleData(builtinsModule).apply { bindSession(this@session) } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirLibrarySessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirLibrarySessionFactory.kt index cd1a4b495d3..471c52ecc43 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirLibrarySessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/LLFirLibrarySessionFactory.kt @@ -56,7 +56,7 @@ internal class LLFirLibrarySessionFactory( ): LLFirLibrarySession { val platform = ktLibraryModule.platform val builtinsSession = LLFirBuiltinsSessionFactory.getInstance(project).getBuiltinsSession(platform) - return LLFirLibrarySession(project, builtinsSession.builtinTypes).apply session@{ + return LLFirLibrarySession(ktLibraryModule, project, builtinsSession.builtinTypes).apply session@{ val moduleData = LLFirKtModuleBasedModuleData(ktLibraryModule).apply { bindSession(this@session) } registerModuleData(moduleData) registerIdeComponents(project) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirModuleWithDependenciesSymbolProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirModuleWithDependenciesSymbolProvider.kt index b66cc998351..3664f13ba19 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirModuleWithDependenciesSymbolProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirModuleWithDependenciesSymbolProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.providers +import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.resolve.providers.FirDependenciesSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider @@ -82,6 +83,11 @@ internal class LLFirDependentModuleProviders( private val providers: List ) : FirDependenciesSymbolProvider(session) { + val dependenciesAsSessions: List + get() = buildList { + providers.mapTo(this) { it.session as LLFirSession } + } + constructor(session: FirSession, createSubProviders: MutableList.() -> Unit) : this(session, buildList { createSubProviders() }) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirBuiltinsAndCloneableSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirBuiltinsAndCloneableSession.kt index aa1cb811bea..d75d6a8e12c 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirBuiltinsAndCloneableSession.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirBuiltinsAndCloneableSession.kt @@ -6,11 +6,13 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.sessions import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.fir.BuiltinTypes import org.jetbrains.kotlin.fir.PrivateSessionConstructor @OptIn(PrivateSessionConstructor::class) class LLFirBuiltinsAndCloneableSession @PrivateSessionConstructor constructor( + override val ktModule: KtModule, project: Project, builtinTypes: BuiltinTypes, ) : LLFirLibraryLikeSession(project, builtinTypes) \ No newline at end of file diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirLibrariesSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirLibrariesSession.kt index cba7d001147..54e056767c8 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirLibrariesSession.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirLibrariesSession.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.sessions import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.fir.BuiltinTypes import org.jetbrains.kotlin.fir.PrivateSessionConstructor @@ -14,6 +15,7 @@ import org.jetbrains.kotlin.fir.PrivateSessionConstructor */ @OptIn(PrivateSessionConstructor::class) internal class LLFirLibrarySession @PrivateSessionConstructor constructor( + override val ktModule: KtModule, project: Project, builtinTypes: BuiltinTypes, ) : LLFirLibraryLikeSession(project, builtinTypes) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirLibraryOrLibrarySourceResolvableModuleSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirLibraryOrLibrarySourceResolvableModuleSession.kt index 102f3470914..8d257963a85 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirLibraryOrLibrarySourceResolvableModuleSession.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirLibraryOrLibrarySourceResolvableModuleSession.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.sessions import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirGlobalResolveComponents import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveComponents import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule import org.jetbrains.kotlin.analysis.project.structure.KtLibrarySourceModule @@ -14,13 +13,13 @@ import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.fir.BuiltinTypes internal class LLFirLibraryOrLibrarySourceResolvableModuleSession( - override val module: KtModule, + override val ktModule: KtModule, override val project: Project, override val moduleComponents: LLFirModuleResolveComponents, builtinTypes: BuiltinTypes, ) : LLFirResolvableModuleSession(builtinTypes) { init { - checkIsValidKtModule(module) + checkIsValidKtModule(ktModule) } companion object { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSession.kt index c89e6d19cfb..c2f9f82d443 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSession.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSession.kt @@ -6,10 +6,8 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.sessions import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.firModuleData import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.fir.BuiltinTypes -import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.PrivateSessionConstructor import org.jetbrains.kotlin.fir.declarations.FirDeclaration @@ -19,14 +17,12 @@ import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol @OptIn(PrivateSessionConstructor::class) abstract class LLFirSession(override val builtinTypes: BuiltinTypes, kind: Kind) : FirSession(sessionProvider = null, kind) { abstract val project: Project + abstract val ktModule: KtModule abstract fun getScopeSession(): ScopeSession } -@OptIn(PrivateSessionConstructor::class) -abstract class LLFirModuleSession(builtinTypes: BuiltinTypes, kind: Kind) : LLFirSession(builtinTypes, kind) { - abstract val module: KtModule -} +abstract class LLFirModuleSession(builtinTypes: BuiltinTypes, kind: Kind) : LLFirSession(builtinTypes, kind) val FirDeclaration.llFirSession: LLFirSession get() = moduleData.session as LLFirSession diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProvider.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProvider.kt index 5231d86f07f..e757929a517 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProvider.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProvider.kt @@ -9,28 +9,37 @@ import com.intellij.openapi.project.Project import org.jetbrains.kotlin.analysis.api.impl.barebone.annotations.Immutable import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirKtModuleBasedModuleData import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirModuleData +import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirDependentModuleProviders import org.jetbrains.kotlin.analysis.project.structure.KtModule import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirSessionProvider +import org.jetbrains.kotlin.fir.resolve.providers.dependenciesSymbolProvider @Immutable class LLFirSessionProvider internal constructor( val project: Project, internal val rootModuleSession: LLFirResolvableModuleSession, - private val moduleToSession: Map + private val moduleToResolvableSession: Map ) : FirSessionProvider() { + private val moduleToSession = moduleToResolvableSession + moduleToResolvableSession.values.flatMap { module -> + (module.dependenciesSymbolProvider as LLFirDependentModuleProviders).dependenciesAsSessions + }.associateBy { it.ktModule } + override fun getSession(moduleData: FirModuleData): LLFirSession { requireIsInstance(moduleData) return when (moduleData) { - is LLFirKtModuleBasedModuleData -> getSession(moduleData.ktModule) + is LLFirKtModuleBasedModuleData -> getResolvableSession(moduleData.ktModule) } } - fun getSession(module: KtModule): LLFirResolvableModuleSession = + fun getSession(module: KtModule): LLFirSession = moduleToSession.getValue(module) + fun getResolvableSession(module: KtModule): LLFirResolvableModuleSession = + moduleToResolvableSession.getValue(module) + val allSessions: Collection - get() = moduleToSession.values + get() = moduleToResolvableSession.values } diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt index c8b31805593..c5c1dee5959 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionProviderStorage.kt @@ -94,7 +94,7 @@ private class FromModuleViewSessionCache { val wasSessionInvalidated = sessions.associateWithTo(hashMapOf()) { false } val reversedDependencies = sessions.reversedDependencies { session -> - session.firSession.module.directRegularDependencies.mapNotNull { mappings[it] } + session.firSession.ktModule.directRegularDependencies.mapNotNull { mappings[it] } } fun markAsInvalidWithDfs(session: FirSessionWithModificationTracker) { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSourcesSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSourcesSession.kt index 2b59a934b52..5a06d9293aa 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSourcesSession.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSourcesSession.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.BuiltinTypes import org.jetbrains.kotlin.fir.PrivateSessionConstructor internal class LLFirSourcesSession @PrivateSessionConstructor constructor( - override val module: KtSourceModule, + override val ktModule: KtSourceModule, override val project: Project, override val moduleComponents: LLFirModuleResolveComponents, builtinTypes: BuiltinTypes, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt index 68c23e5553d..6863b757f8a 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/state/LLFirResolvableResolveSession.kt @@ -11,9 +11,8 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.FirTowerContextProvider import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.getNonLocalContainingOrThisDeclaration import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.firModuleData -import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirResolvableModuleSession -import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession -import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.* +import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirLibrarySession import org.jetbrains.kotlin.analysis.low.level.api.fir.util.FirDeclarationForCompiledElementSearcher import org.jetbrains.kotlin.analysis.low.level.api.fir.util.findSourceNonLocalFirDeclaration import org.jetbrains.kotlin.analysis.low.level.api.fir.util.originalDeclaration @@ -42,7 +41,7 @@ internal abstract class LLFirResolvableResolveSession( final override val useSiteFirSession = sessionProvider.rootModuleSession override fun getSessionFor(module: KtModule): FirSession = - sessionProvider.getSession(module) + sessionProvider.getResolvableSession(module) override fun getScopeSessionFor(firSession: FirSession): ScopeSession { requireIsInstance(firSession) @@ -61,7 +60,7 @@ internal abstract class LLFirResolvableResolveSession( protected fun getModuleComponentsForElement(element: KtElement): LLFirModuleResolveComponents { val ktModule = element.getKtModule() - return sessionProvider.getSession(ktModule).moduleComponents + return sessionProvider.getResolvableSession(ktModule).moduleComponents } override fun resolveToFirSymbol( @@ -80,7 +79,9 @@ internal abstract class LLFirResolvableResolveSession( "This method will only work on compiled declarations, but this declaration is not compiled: ${ktDeclaration.getElementTextInContext()}" } - val searcher = FirDeclarationForCompiledElementSearcher(useSiteFirSession.symbolProvider) + val ktModule = ktDeclaration.getKtModule(project) + val firSession = sessionProvider.getSession(ktModule) as LLFirLibrarySession + val searcher = FirDeclarationForCompiledElementSearcher(firSession.symbolProvider) val firDeclaration = searcher.findNonLocalDeclaration(ktDeclaration) return firDeclaration.symbol } @@ -100,7 +101,7 @@ internal abstract class LLFirResolvableResolveSession( ?: error("Declaration should have non-local container${ktDeclaration.getElementTextInContext()}") if (ktDeclaration == nonLocalNamedDeclaration) { - val session = sessionProvider.getSession(module) + val session = sessionProvider.getResolvableSession(module) return nonLocalNamedDeclaration.findSourceNonLocalFirDeclaration( firFileBuilder = session.moduleComponents.firFileBuilder, provider = session.firProvider,