[LL] anchor module provider for navigation in monorepo

Use information from IDE about anchor module,
to include everything from that module and dependencies into library session
^ KTIJ-24683
This commit is contained in:
Anna Kozlova
2023-06-30 16:36:04 +02:00
committed by teamcity
parent 19fb6e7458
commit f96b5bae48
2 changed files with 49 additions and 1 deletions
@@ -0,0 +1,26 @@
/*
* Copyright 2010-2023 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.analysis.providers
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
/**
* Provide module which contains dependencies of the library.
*
* Is required for navigation in IJ monorepo from kotlin compiler library sources to IJ platform sources.
* Kotlin compiler depends on platform but this dependency is not represented as jars in monorepo
* but should be replaced with given sources.
*/
public interface KotlinAnchorModuleProvider {
public fun getAnchorModule(libraryModule: KtLibraryModule): KtSourceModule?
public companion object {
public fun getInstance(project: Project): KotlinAnchorModuleProvider? =
project.getService(KotlinAnchorModuleProvider::class.java)
}
}
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirModuleResolveCompone
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.*
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.*
import org.jetbrains.kotlin.analysis.project.structure.*
import org.jetbrains.kotlin.analysis.providers.KotlinAnchorModuleProvider
import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider
import org.jetbrains.kotlin.analysis.providers.createAnnotationResolver
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
@@ -300,7 +301,11 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
val scopeProvider = FirKotlinScopeProvider()
val components = LLFirModuleResolveComponents(module, globalResolveComponents, scopeProvider)
val dependencyTracker = builtinsSession.modificationTracker
val moduleAnchorSession = KotlinAnchorModuleProvider.getInstance(project)?.getAnchorModule(libraryModule)?.let {
LLFirSessionCache.getInstance(project).getSession(it)
}
val dependencyTracker = createLibraryDependencyTracker(moduleAnchorSession, builtinsSession)
val session =
LLFirLibraryOrLibrarySourceResolvableModuleSession(module, dependencyTracker, components, builtinsSession.builtinTypes)
components.session = session
@@ -348,6 +353,13 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
)
addAll(restLibrariesProvider)
moduleAnchorSession?.let {
(it.symbolProvider as LLFirModuleWithDependenciesSymbolProvider).also { moduleSymbolProvider ->
addAll(moduleSymbolProvider.providers)
addAll(moduleSymbolProvider.dependencyProvider.providers)
}
}
}
})
@@ -459,6 +471,16 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
return CompositeModificationTracker.createFlattened(trackers)
}
private fun createLibraryDependencyTracker(moduleAnchorSession: LLFirSession?, builtinsSession: LLFirBuiltinsAndCloneableSession): ModificationTracker {
return moduleAnchorSession?.let {
CompositeModificationTracker.createFlattened(buildList {
add(moduleAnchorSession.modificationTracker)
add(builtinsSession.modificationTracker)
})
}
?: builtinsSession.modificationTracker
}
private fun createModuleData(session: LLFirSession): LLFirModuleData {
return LLFirModuleData(session.ktModule).apply { bindSession(session) }
}