[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
This commit is contained in:
+1
-1
@@ -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)
|
||||
}
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
+6
@@ -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<FirSymbolProvider>
|
||||
) : FirDependenciesSymbolProvider(session) {
|
||||
|
||||
val dependenciesAsSessions: List<LLFirSession>
|
||||
get() = buildList {
|
||||
providers.mapTo(this) { it.session as LLFirSession }
|
||||
}
|
||||
|
||||
constructor(session: FirSession, createSubProviders: MutableList<FirSymbolProvider>.() -> Unit)
|
||||
: this(session, buildList { createSubProviders() })
|
||||
|
||||
|
||||
+2
@@ -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)
|
||||
+2
@@ -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)
|
||||
|
||||
+2
-3
@@ -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 {
|
||||
|
||||
+2
-6
@@ -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
|
||||
|
||||
+13
-4
@@ -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<KtModule, LLFirResolvableModuleSession>
|
||||
private val moduleToResolvableSession: Map<KtModule, LLFirResolvableModuleSession>
|
||||
) : FirSessionProvider() {
|
||||
|
||||
private val moduleToSession = moduleToResolvableSession + moduleToResolvableSession.values.flatMap { module ->
|
||||
(module.dependenciesSymbolProvider as LLFirDependentModuleProviders).dependenciesAsSessions
|
||||
}.associateBy { it.ktModule }
|
||||
|
||||
override fun getSession(moduleData: FirModuleData): LLFirSession {
|
||||
requireIsInstance<LLFirModuleData>(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<LLFirModuleSession>
|
||||
get() = moduleToSession.values
|
||||
get() = moduleToResolvableSession.values
|
||||
}
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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,
|
||||
|
||||
+8
-7
@@ -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<LLFirSession>(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,
|
||||
|
||||
Reference in New Issue
Block a user