[analysis api fir] put every library into a separate KtModule in tests

This commit is contained in:
Ilya Kirillov
2022-04-07 08:09:00 +02:00
parent 252d8e283b
commit 2649788b87
43 changed files with 778 additions and 399 deletions
@@ -6,8 +6,22 @@
package org.jetbrains.kotlin.analysis.api.standalone.base.project.structure
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule
import org.jetbrains.kotlin.analysis.project.structure.KtModule
data class KtModuleProjectStructure(
val mainModules: List<KtModuleWithFiles>,
val binaryModules: Iterable<KtBinaryModule>,
val stdlibFor: (KtModule) -> KtLibraryModule,
) {
fun allKtModules(): List<KtModule> = buildList {
mainModules.mapTo(this) { it.ktModule }
addAll(binaryModules)
}
}
data class KtModuleWithFiles(
val ktModule: KtModule,
val files: List<PsiFile>
@@ -10,20 +10,20 @@ import org.jetbrains.kotlin.analysis.project.structure.*
import org.jetbrains.kotlin.psi.psiUtil.contains
class KtStaticModuleProvider(
private val modules: List<KtModule>,
private val stdlibs: Set<KtModule>
private val testProjectStructure: KtModuleProjectStructure,
) : ProjectStructureProvider() {
override fun getKtModuleForKtElement(element: PsiElement): KtModule {
return modules.first { module ->
module.contentScope.contains(element)
}
return testProjectStructure.mainModules
.first { module ->
module.ktModule.contentScope.contains(element)
}.ktModule
}
override fun getKtLibraryModules(): Collection<KtLibraryModule> {
return modules.filterIsInstance<KtLibraryModule>()
return testProjectStructure.allKtModules().filterIsInstance<KtLibraryModule>()
}
override fun getStdlibModule(module: KtModule): KtLibraryModule? {
return module.allDirectDependenciesOfType<KtLibraryModule>().firstOrNull { it in stdlibs }
override fun getStdlibWithBuiltinsModule(module: KtModule): KtLibraryModule {
return testProjectStructure.stdlibFor(module)
}
}
}
@@ -46,7 +46,7 @@ object StandaloneProjectFactory {
fun registerServicesForProjectEnvironment(
environment: KotlinCoreProjectEnvironment,
modules: List<KtModuleWithFiles>,
modules: KtModuleProjectStructure,
languageVersionSettings: LanguageVersionSettings,
jdkHome: Path?,
) {
@@ -55,7 +55,7 @@ object StandaloneProjectFactory {
KotlinCoreEnvironment.registerProjectExtensionPoints(project.extensionArea)
KotlinCoreEnvironment.registerProjectServices(project)
project.registerService(ProjectStructureProvider::class.java, KtStaticModuleProvider(modules.map { it.ktModule }, emptySet()))
project.registerService(ProjectStructureProvider::class.java, KtStaticModuleProvider(modules))
initialiseVirtualFinderFinderServices(modules, environment, jdkHome, languageVersionSettings)
initialiseAnnotationServices(project)
@@ -68,7 +68,7 @@ object StandaloneProjectFactory {
}
private fun initialiseVirtualFinderFinderServices(
modules: List<KtModuleWithFiles>,
modules: KtModuleProjectStructure,
environment: KotlinCoreProjectEnvironment,
jdkHome: Path?,
languageVersionSettings: LanguageVersionSettings
@@ -76,12 +76,12 @@ object StandaloneProjectFactory {
val project = environment.project
val allSourceFiles = buildList {
val files = modules.flatMap { it.files }
val files = modules.mainModules.flatMap { it.files }
addAll(files)
addAll(findJvmRootsForJavaFiles(files.filterIsInstance<PsiJavaFile>()))
}
val allSourceFileRoots = allSourceFiles.map { JavaRoot(it.virtualFile, JavaRoot.RootType.SOURCE) }
val libraryRoots = getAllBinaryRoots(modules.map { it.ktModule }, environment)
val libraryRoots = getAllBinaryRoots(modules.allKtModules(), environment)
libraryRoots.forEach { environment.addSourcesToClasspath(it.file) }
val sourceAndLibraryRoots = buildList {
@@ -133,7 +133,7 @@ object StandaloneProjectFactory {
modules: List<KtModule>,
environment: KotlinCoreProjectEnvironment
): List<JavaRoot> = withAllTransitiveDependencies(modules)
.filterIsInstance<KtLibraryModule>()
.filterIsInstance<KtBinaryModule>()
.flatMap { it.getBinaryRoots() }
.map {
val jar = environment.environment.jarFileSystem.findFileByPath(it.toAbsolutePath().toString() + "!/")!!