[LL FIR] create separate library session for each library

This commit is contained in:
Ilya Kirillov
2022-07-18 20:20:02 +02:00
parent dbfeeae696
commit dc4527462f
18 changed files with 254 additions and 184 deletions
@@ -12,11 +12,12 @@ import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.Stand
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.platform.TargetPlatform
data class KtModuleProjectStructure(
val mainModules: List<KtModuleWithFiles>,
val binaryModules: Iterable<KtBinaryModule>,
val stdlibFor: (KtModule) -> KtLibraryModule,
val stdlibFor: (TargetPlatform) -> KtLibraryModule,
) {
fun allKtModules(): List<KtModule> = buildList {
mainModules.mapTo(this) { it.ktModule }
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.standalone.base.project.structure
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.project.structure.*
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.psi.psiUtil.contains
class KtStaticModuleProvider(
@@ -23,7 +24,7 @@ class KtStaticModuleProvider(
return projectStructure.allKtModules().filterIsInstance<KtBinaryModule>()
}
override fun getStdlibWithBuiltinsModule(module: KtModule): KtLibraryModule {
return projectStructure.stdlibFor(module)
override fun getStdlibWithBuiltinsModule(platform: TargetPlatform): KtLibraryModule {
return projectStructure.stdlibFor(platform)
}
}
@@ -14,6 +14,7 @@ import com.intellij.mock.MockProject
import com.intellij.openapi.Disposable
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.roots.PackageIndex
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.psi.PsiDirectory
import com.intellij.psi.PsiFileSystemItem
@@ -181,6 +182,28 @@ object StandaloneProjectFactory {
.filterIsInstance<KtBinaryModule>()
.flatMap { it.getJavaRoots(environment) }
fun getVirtualFilesForLibraryRoots(
roots: Collection<Path>,
environment: KotlinCoreProjectEnvironment
): List<VirtualFile> {
return roots.mapNotNull { path ->
val pathString = path.toAbsolutePath().toString()
when {
pathString.endsWith(JAR_PROTOCOL) -> {
environment.environment.jarFileSystem.findFileByPath(pathString + JAR_SEPARATOR)
}
pathString.contains(JAR_SEPARATOR) -> {
environment.environment.jrtFileSystem?.findFileByPath(adjustModulePath(pathString))
}
else -> {
VirtualFileManager.getInstance().findFileByNioPath(path)
}
}
}
}
private fun withAllTransitiveDependencies(ktModules: List<KtModule>): List<KtModule> {
val visited = hashSetOf<KtModule>()
val stack = ktModules.toMutableList()
@@ -212,24 +235,7 @@ object StandaloneProjectFactory {
private fun KtBinaryModule.getJavaRoots(
environment: KotlinCoreProjectEnvironment,
): List<JavaRoot> {
return buildList {
getBinaryRoots().forEach { path ->
val pathString = path.toAbsolutePath().toString()
when {
pathString.endsWith(JAR_PROTOCOL) -> {
environment.environment.jarFileSystem.findFileByPath(pathString + JAR_SEPARATOR)
}
pathString.contains(JAR_SEPARATOR) -> {
environment.environment.jrtFileSystem?.findFileByPath(adjustModulePath(pathString))
}
else -> {
VirtualFileManager.getInstance().findFileByNioPath(path)
}
}?.let { root ->
add(JavaRoot(root, JavaRoot.RootType.BINARY))
}
}
}
return getVirtualFilesForLibraryRoots(getBinaryRoots(), environment).map { root -> JavaRoot(root, JavaRoot.RootType.BINARY)}
}
private fun adjustModulePath(pathString: String): String {