[AA] Turn KtModuleWithFiles into KtTestModule (AA test framework)

- `KtModuleWithFiles` isn't actually used in a production Standalone API
  context, but it was exposed via `analysis-api-standalone-base`. In
  current production usages, the project structure is built with the
  module builder DSL.
- Hence, `KtModuleWithFiles` is only relevant for tests. This commit
  moves `KtModuleWithFiles` to the Analysis API test framework and
  renames it to `KtTestModule`. This removes any risk that an outside
  user could start using `KtModuleWithFiles` and completely uncouples
  the test project structure from production APIs.
- In addition, we can add the `TestModule` to `KtTestModule`, allowing
  tests to quickly access the original test module, for example to check
  the test module kind.
- The commit also removes the data class status of `KtTestModule` and
  `KtTestModuleProjectStructure` to avoid issues with destructuring when
  properties are added or removed.

^KT-65960
This commit is contained in:
Marco Pennekamp
2024-02-20 20:37:23 +01:00
committed by Space Team
parent 878eba7d52
commit 2060709c03
23 changed files with 128 additions and 115 deletions
@@ -10,9 +10,9 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiBaseTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiDecompiledCodeTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtModuleFactory
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtSourceModuleFactory
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure
import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.AnalysisApiBinaryLibraryIndexingMode
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.AnalysisApiJvmEnvironmentConfigurator
@@ -63,7 +63,7 @@ object AnalysisApiFe10TestConfigurator : AnalysisApiTestConfigurator() {
moduleStructure: TestModuleStructure,
testServices: TestServices,
project: Project,
): KtModuleProjectStructure {
): KtTestModuleProjectStructure {
return TestModuleStructureFactory.createProjectStructureByTestStructure(moduleStructure, testServices, project)
}
@@ -1,34 +0,0 @@
/*
* Copyright 2010-2022 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.api.standalone.base.project.structure
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiFileSystemItem
import com.intellij.psi.PsiJavaFile
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory.findJvmRootsForJavaFiles
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
import org.jetbrains.kotlin.analysis.project.structure.KtModule
data class KtModuleProjectStructure(
val mainModules: List<KtModuleWithFiles>,
val binaryModules: Iterable<KtBinaryModule>,
) {
fun allKtModules(): List<KtModule> = buildList {
mainModules.mapTo(this) { it.ktModule }
addAll(binaryModules)
}
fun allSourceFiles(): List<PsiFileSystemItem> = buildList {
val files = mainModules.flatMap { it.files }
addAll(files)
addAll(findJvmRootsForJavaFiles(files.filterIsInstance<PsiJavaFile>()))
}
}
data class KtModuleWithFiles(
val ktModule: KtModule,
val files: List<PsiFile>
)
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.analysis.api.standalone.fir.test.configurators
import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.services.TestModuleStructure
@@ -32,7 +32,7 @@ object StandaloneModeConfigurator : StandaloneModeConfiguratorBase() {
moduleStructure: TestModuleStructure,
testServices: TestServices,
project: Project
): KtModuleProjectStructure {
): KtTestModuleProjectStructure {
return sourceConfigurator.createModules(moduleStructure, testServices, project)
}
}
@@ -9,11 +9,11 @@ import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiBaseTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiLibraryBaseTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AnalysisApiFirTestServiceRegistrar
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.configureOptionalTestCompilerPlugin
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtLibraryBinaryModuleFactory
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtModuleFactory
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure
import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.AnalysisApiJvmEnvironmentConfigurator
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.DispatchingTestModuleCompiler
@@ -58,7 +58,7 @@ object StandaloneModeLibraryBinaryTestConfigurator : StandaloneModeConfiguratorB
moduleStructure: TestModuleStructure,
testServices: TestServices,
project: Project,
): KtModuleProjectStructure {
): KtTestModuleProjectStructure {
return TestModuleStructureFactory.createProjectStructureByTestStructure(moduleStructure, testServices, project)
}
}
@@ -6,8 +6,6 @@
package org.jetbrains.kotlin.analysis.test.framework.project.structure
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.analysis.project.structure.*
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.model.TestModule
@@ -17,20 +15,21 @@ import org.jetbrains.kotlin.test.services.moduleStructure
abstract class AnalysisApiKtModuleProvider : TestService {
protected abstract val testServices: TestServices
abstract fun getModule(moduleName: String): KtModule
abstract fun getModuleFiles(module: TestModule): List<PsiFile>
abstract fun registerProjectStructure(modules: KtModuleProjectStructure)
abstract fun registerProjectStructure(modules: KtTestModuleProjectStructure)
abstract fun getModuleStructure(): KtModuleProjectStructure
abstract fun getModuleStructure(): KtTestModuleProjectStructure
}
class AnalysisApiKtModuleProviderImpl(
override val testServices: TestServices,
) : AnalysisApiKtModuleProvider() {
private lateinit var modulesStructure: KtModuleProjectStructure
private lateinit var modulesByName: Map<String, KtModuleWithFiles>
private lateinit var modulesStructure: KtTestModuleProjectStructure
private lateinit var modulesByName: Map<String, KtTestModule>
override fun getModule(moduleName: String): KtModule {
return modulesByName.getValue(moduleName).ktModule
@@ -39,7 +38,7 @@ class AnalysisApiKtModuleProviderImpl(
override fun getModuleFiles(module: TestModule): List<PsiFile> =
(modulesByName[module.name] ?: modulesByName.getValue(module.files.single().name)).files
override fun registerProjectStructure(modules: KtModuleProjectStructure) {
override fun registerProjectStructure(modules: KtTestModuleProjectStructure) {
require(!this::modulesStructure.isInitialized)
require(!this::modulesByName.isInitialized)
@@ -47,7 +46,7 @@ class AnalysisApiKtModuleProviderImpl(
this.modulesByName = modulesStructure.mainModules.associateByName()
}
override fun getModuleStructure(): KtModuleProjectStructure = modulesStructure
override fun getModuleStructure(): KtTestModuleProjectStructure = modulesStructure
}
fun AnalysisApiKtModuleProvider.getKtFiles(module: TestModule): List<KtFile> = getModuleFiles(module).filterIsInstance<KtFile>()
@@ -56,9 +55,9 @@ fun TestServices.allKtFiles(): List<KtFile> = moduleStructure.modules.flatMap(kt
val TestServices.ktModuleProvider: AnalysisApiKtModuleProvider by TestServices.testServiceAccessor()
fun List<KtModuleWithFiles>.associateByName(): Map<String, KtModuleWithFiles> {
return associateBy { (ktModule, _) ->
when (ktModule) {
fun List<KtTestModule>.associateByName(): Map<String, KtTestModule> {
return associateBy { ktTestModule ->
when (val ktModule = ktTestModule.ktModule) {
is KtModuleByCompilerConfiguration -> ktModule.moduleName
is KtSourceModule -> ktModule.moduleName
is KtLibraryModule -> ktModule.libraryName
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.analysis.test.framework.project.structure
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.analysis.project.structure.DanglingFileResolutionMode
import org.jetbrains.kotlin.analysis.project.structure.impl.KtDanglingFileModuleImpl
import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider
@@ -28,11 +27,11 @@ import java.nio.file.Path
object KtCodeFragmentModuleFactory : KtModuleFactory {
override fun createModule(
testModule: TestModule,
contextModule: KtModuleWithFiles?,
contextModule: KtTestModule?,
dependencyPaths: Collection<Path>,
testServices: TestServices,
project: Project,
): KtModuleWithFiles {
): KtTestModule {
requireNotNull(contextModule) { "Code fragment requires a context module" }
val testFile = testModule.files.singleOrNull() ?: error("A single file is expected for a code fragment module")
@@ -69,7 +68,7 @@ object KtCodeFragmentModuleFactory : KtModuleFactory {
DanglingFileResolutionMode.PREFER_SELF
)
return KtModuleWithFiles(module, listOf(codeFragment))
return KtTestModule(testModule, module, listOf(codeFragment))
}
private fun findContextElement(file: KtFile, testServices: TestServices): KtElement? {
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.analysis.test.framework.project.structure
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory
import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider
@@ -21,15 +20,16 @@ import java.nio.file.Path
object KtLibraryBinaryModuleFactory : KtModuleFactory {
override fun createModule(
testModule: TestModule,
contextModule: KtModuleWithFiles?,
contextModule: KtTestModule?,
dependencyPaths: Collection<Path>,
testServices: TestServices,
project: Project,
): KtModuleWithFiles {
): KtTestModule {
val library = testServices.compiledLibraryProvider.compileToLibrary(testModule, dependencyPaths).artifact
val decompiledFiles = testServices.testModuleDecompiler.getAllPsiFilesFromLibrary(library, project)
return KtModuleWithFiles(
return KtTestModule(
testModule,
KtLibraryModuleImpl(
testModule.name,
testModule.targetPlatform,
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.analysis.test.framework.project.structure
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.api.impl.base.util.LibraryUtils
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory
import org.jetbrains.kotlin.analysis.test.framework.services.environmentManager
import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider
@@ -24,11 +23,11 @@ import java.nio.file.Path
object KtLibrarySourceModuleFactory : KtModuleFactory {
override fun createModule(
testModule: TestModule,
contextModule: KtModuleWithFiles?,
contextModule: KtTestModule?,
dependencyPaths: Collection<Path>,
testServices: TestServices,
project: Project,
): KtModuleWithFiles {
): KtTestModule {
Assume.assumeFalse("Compilation of multi-platform libraries is not supported", testModule.targetPlatform.isMultiPlatform())
val (libraryJar, librarySourcesJar) = testServices.compiledLibraryProvider.compileToLibrary(testModule)
@@ -51,7 +50,7 @@ fun createKtLibrarySourceModule(
testModule: TestModule,
project: Project,
testServices: TestServices,
): KtModuleWithFiles {
): KtTestModule {
val libraryKtModule = KtLibraryModuleImpl(
testModule.name,
testModule.targetPlatform,
@@ -74,5 +73,5 @@ fun createKtLibrarySourceModule(
)
libraryKtModule.librarySources = librarySourceKtModule
return KtModuleWithFiles(librarySourceKtModule, decompiledPsiFilesFromSourceJar)
return KtTestModule(testModule, librarySourceKtModule, decompiledPsiFilesFromSourceJar)
}
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.analysis.test.framework.project.structure
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.moduleKind
import org.jetbrains.kotlin.test.model.TestModule
@@ -19,18 +18,18 @@ fun interface KtModuleFactory : TestService {
* Creates a [KtModule](org.jetbrains.kotlin.analysis.project.structure.KtModule) for the given [testModule].
*
* @param contextModule a module to use as a context module. Some kinds of modules (such as dangling file modules) require a
* context module. Modules representing code fragments also require a context element that is why the [KtModuleWithFiles] is passed,
* instead of a plain (KtModule)[org.jetbrains.kotlin.analysis.project.structure.KtModule].
* context module. Modules representing code fragments also require a context element. That is why the [KtTestModule] is passed
* instead of a plain [KtModule][org.jetbrains.kotlin.analysis.project.structure.KtModule].
*
* @param dependencyPaths Paths of directories containing dependency libraries. The paths will be set as class paths for compilation.
*/
fun createModule(
testModule: TestModule,
contextModule: KtModuleWithFiles?,
contextModule: KtTestModule?,
dependencyPaths: Collection<Path>,
testServices: TestServices,
project: Project,
): KtModuleWithFiles
): KtTestModule
}
private val TestServices.ktModuleFactory: KtModuleFactory by TestServices.testServiceAccessor()
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.analysis.test.framework.project.structure
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices
@@ -18,11 +17,11 @@ import java.nio.file.Path
object KtScriptModuleFactory : KtModuleFactory {
override fun createModule(
testModule: TestModule,
contextModule: KtModuleWithFiles?,
contextModule: KtTestModule?,
dependencyPaths: Collection<Path>,
testServices: TestServices,
project: Project,
): KtModuleWithFiles {
): KtTestModule {
val ktFile = TestModuleStructureFactory.createSourcePsiFiles(testModule, testServices, project).single() as KtFile
val module = KtScriptModuleImpl(
ktFile,
@@ -31,6 +30,6 @@ object KtScriptModuleFactory : KtModuleFactory {
project,
)
return KtModuleWithFiles(module, listOf(ktFile))
return KtTestModule(testModule, module, listOf(ktFile))
}
}
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.analysis.test.framework.project.structure
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.TestServices
import java.nio.file.Path
@@ -18,11 +17,11 @@ import java.nio.file.Path
object KtSourceModuleFactory : KtModuleFactory {
override fun createModule(
testModule: TestModule,
contextModule: KtModuleWithFiles?,
contextModule: KtTestModule?,
dependencyPaths: Collection<Path>,
testServices: TestServices,
project: Project,
): KtModuleWithFiles {
): KtTestModule {
val psiFiles = TestModuleStructureFactory.createSourcePsiFiles(testModule, testServices, project)
val module = KtSourceModuleImpl(
@@ -33,6 +32,6 @@ object KtSourceModuleFactory : KtModuleFactory {
GlobalSearchScope.filesScope(project, psiFiles.mapTo(mutableSetOf()) { it.virtualFile }),
)
return KtModuleWithFiles(module, psiFiles)
return KtTestModule(testModule, module, psiFiles)
}
}
@@ -0,0 +1,51 @@
/*
* Copyright 2010-2024 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.test.framework.project.structure
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiFileSystemItem
import com.intellij.psi.PsiJavaFile
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory.findJvmRootsForJavaFiles
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.test.model.TestModule
import kotlin.collections.addAll
import kotlin.collections.filterIsInstance
import kotlin.collections.flatMap
import kotlin.collections.mapTo
/**
* [KtTestModule] describes a [KtModule] originating from a [TestModule] with any number of associated [PsiFile]s. It is used to describe
* the module structure configured by Analysis API tests.
*/
class KtTestModule(
val testModule: TestModule,
val ktModule: KtModule,
val files: List<PsiFile>,
)
/**
* A project structure of [KtTestModule]s, and additional [KtBinaryModule]s not originating from test modules. This project structure
* is created by [AnalysisApiTestConfigurator.createModules][org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator.createModules].
*
* [mainModules] are created from the configured [TestModule]s and must be in the same order as
* [TestModuleStructure.modules][org.jetbrains.kotlin.test.services.TestModuleStructure.modules].
*/
class KtTestModuleProjectStructure(
val mainModules: List<KtTestModule>,
val binaryModules: Iterable<KtBinaryModule>,
) {
fun allKtModules(): List<KtModule> = buildList {
mainModules.mapTo(this) { it.ktModule }
addAll(binaryModules)
}
fun allSourceFiles(): List<PsiFileSystemItem> = buildList {
val files = mainModules.flatMap { it.files }
addAll(files)
addAll(findJvmRootsForJavaFiles(files.filterIsInstance<PsiJavaFile>()))
}
}
@@ -9,8 +9,6 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
import org.jetbrains.kotlin.analysis.project.structure.KtDanglingFileModule
@@ -40,7 +38,7 @@ import kotlin.io.path.nameWithoutExtension
private typealias LibraryCache = MutableMap<Set<Path>, KtBinaryModule>
private typealias ModulesByName = Map<String, KtModuleWithFiles>
private typealias ModulesByName = Map<String, KtTestModule>
/**
* A function to run the topological sort (or post-order sort) for [TestModule]s based on the dependency graph.
@@ -72,7 +70,7 @@ object TestModuleStructureFactory {
moduleStructure: TestModuleStructure,
testServices: TestServices,
project: Project
): KtModuleProjectStructure {
): KtTestModuleProjectStructure {
val modules = createModules(moduleStructure, testServices, project)
val modulesByName = modules.associateByName()
@@ -86,7 +84,7 @@ object TestModuleStructureFactory {
ktModule.addDependencies(testModule, testServices, modulesByName, libraryCache)
}
return KtModuleProjectStructure(modules, libraryCache.values)
return KtTestModuleProjectStructure(modules, libraryCache.values)
}
/**
@@ -103,11 +101,11 @@ object TestModuleStructureFactory {
moduleStructure: TestModuleStructure,
testServices: TestServices,
project: Project,
): List<KtModuleWithFiles> {
): List<KtTestModule> {
val moduleCount = moduleStructure.modules.size
val result = ArrayList<KtModuleWithFiles>(moduleCount)
val result = ArrayList<KtTestModule>(moduleCount)
val processedModules = HashMap<String, KtModuleWithFiles>(moduleCount)
val processedModules = HashMap<String, KtTestModule>(moduleCount)
val processedDependencies = mutableMapOf<String, Collection<Path>>()
for (testModule in sortInDependencyPostOrder(moduleStructure.modules)) {
@@ -134,7 +132,7 @@ object TestModuleStructureFactory {
return result
}
private fun ModulesByName.getByTestModule(testModule: TestModule): KtModuleWithFiles =
private fun ModulesByName.getByTestModule(testModule: TestModule): KtTestModule =
this[testModule.name] ?: this.getValue(testModule.files.single().name)
/**
@@ -54,7 +54,7 @@ class AnalysisApiEnvironmentManagerImpl(
}
override fun initializeProjectStructure() {
val ktModuleProjectStructure = testServices.ktModuleProvider.getModuleStructure()
val ktTestModuleProjectStructure = testServices.ktModuleProvider.getModuleStructure()
val useSiteModule = testServices.moduleStructure.modules.first()
val useSiteCompilerConfiguration = testServices.compilerConfigurationProvider.getCompilerConfiguration(useSiteModule)
val builtinsModule = KtBuiltinsModule(
@@ -67,7 +67,7 @@ class AnalysisApiEnvironmentManagerImpl(
StandaloneProjectFactory.registerServicesForProjectEnvironment(
_projectEnvironment,
KtTestProjectStructureProvider(globalLanguageVersionSettings, builtinsModule, ktModuleProjectStructure),
KtTestProjectStructureProvider(globalLanguageVersionSettings, builtinsModule, ktTestModuleProjectStructure),
useSiteCompilerConfiguration.languageVersionSettings,
useSiteCompilerConfiguration.get(JVMConfigurationKeys.JDK_HOME)?.toPath(),
)
@@ -8,9 +8,9 @@ package org.jetbrains.kotlin.analysis.test.framework.services
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFileSystemItem
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtStaticProjectStructureProvider
import org.jetbrains.kotlin.analysis.project.structure.*
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.psi.psiUtil.contains
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments
class KtTestProjectStructureProvider(
override val globalLanguageVersionSettings: LanguageVersionSettings,
private val builtinsModule: KtBuiltinsModule,
private val projectStructure: KtModuleProjectStructure,
private val projectStructure: KtTestModuleProjectStructure,
) : KtStaticProjectStructureProvider() {
override fun getNotUnderContentRootModule(project: Project): KtNotUnderContentRootModule {
error("Not-under content root modules most be initialized explicitly in tests")
@@ -12,7 +12,6 @@ import com.intellij.openapi.application.Application
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Key
import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.psi.NotNullableUserDataProperty
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.model.TestModule
@@ -24,6 +23,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock
import kotlin.concurrent.withLock
import kotlin.reflect.KClass
import org.jetbrains.kotlin.analysis.providers.KotlinGlobalModificationService
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure
abstract class AnalysisApiTestConfigurator {
open val testPrefix: String? get() = null
@@ -44,7 +44,11 @@ abstract class AnalysisApiTestConfigurator {
open fun computeTestDataPath(path: Path): Path = path
abstract fun createModules(moduleStructure: TestModuleStructure, testServices: TestServices, project: Project): KtModuleProjectStructure
abstract fun createModules(
moduleStructure: TestModuleStructure,
testServices: TestServices,
project: Project,
): KtTestModuleProjectStructure
fun registerProjectExtensionPoints(project: MockProject, testServices: TestServices) {
serviceRegistrars.forEach { it.registerProjectExtensionPoints(project, testServices) }
@@ -10,12 +10,12 @@ import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiBaseTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiDecompiledCodeTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiScriptTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
import org.jetbrains.kotlin.analysis.project.structure.allDirectDependenciesOfType
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtScriptModuleByCompilerConfiguration
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtSourceModuleByCompilerConfiguration
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModule
import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.AnalysisApiBinaryLibraryIndexingMode
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.AnalysisApiIndexingConfiguration
@@ -48,7 +48,7 @@ object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator()
moduleStructure: TestModuleStructure,
testServices: TestServices,
project: Project
): KtModuleProjectStructure {
): KtTestModuleProjectStructure {
val mainModules = moduleStructure.modules.map { testModule ->
val files = TestModuleStructureFactory.createSourcePsiFiles(testModule, testServices, project)
val scriptFile = files.singleOrNull() as? KtFile
@@ -58,10 +58,10 @@ object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator()
KtSourceModuleByCompilerConfiguration(project, testModule, files, testServices)
}
KtModuleWithFiles(ktModule, files)
KtTestModule(testModule, ktModule, files)
}
return KtModuleProjectStructure(
return KtTestModuleProjectStructure(
mainModules = mainModules,
binaryModules = mainModules.asSequence().flatMap { it.ktModule.allDirectDependenciesOfType<KtBinaryModule>() }.asIterable(),
)
@@ -10,11 +10,11 @@ import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiBaseTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiDecompiledCodeTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiLibraryBaseTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AnalysisApiFirTestServiceRegistrar
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.configureOptionalTestCompilerPlugin
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtLibraryBinaryModuleFactory
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtModuleFactory
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure
import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.AnalysisApiBinaryLibraryIndexingMode
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.AnalysisApiJvmEnvironmentConfigurator
@@ -58,7 +58,7 @@ object AnalysisApiFirLibraryBinaryTestConfigurator : AnalysisApiTestConfigurator
moduleStructure: TestModuleStructure,
testServices: TestServices,
project: Project
): KtModuleProjectStructure {
): KtTestModuleProjectStructure {
return TestModuleStructureFactory.createProjectStructureByTestStructure(moduleStructure, testServices, project)
}
@@ -10,11 +10,11 @@ import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiBaseTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiDecompiledCodeTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiLibraryBaseTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.SealedClassesInheritorsCalculatorPreAnalysisHandler
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AnalysisApiFirTestServiceRegistrar
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtLibrarySourceModuleFactory
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtModuleFactory
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure
import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.AnalysisApiBinaryLibraryIndexingMode
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.AnalysisApiJvmEnvironmentConfigurator
@@ -53,7 +53,7 @@ object AnalysisApiFirLibrarySourceTestConfigurator : AnalysisApiTestConfigurator
moduleStructure: TestModuleStructure,
testServices: TestServices,
project: Project
): KtModuleProjectStructure {
): KtTestModuleProjectStructure {
return TestModuleStructureFactory.createProjectStructureByTestStructure(moduleStructure, testServices, project)
}
@@ -9,12 +9,12 @@ import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiFile
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.LLFirBuiltinsSessionFactory
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.project.structure.KtNotUnderContentRootModule
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtModuleFactory
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModule
import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory
import org.jetbrains.kotlin.analysis.test.framework.utils.SkipTestException
import org.jetbrains.kotlin.platform.TargetPlatform
@@ -45,7 +45,7 @@ object AnalysisApiFirOutOfContentRootTestConfigurator : AnalysisApiFirSourceLike
moduleStructure: TestModuleStructure,
testServices: TestServices,
project: Project
): KtModuleProjectStructure {
): KtTestModuleProjectStructure {
if (Directives.SKIP_WHEN_OUT_OF_CONTENT_ROOT in moduleStructure.allDirectives) {
throw SkipWhenOutOfContentRootException()
}
@@ -66,15 +66,15 @@ private class SkipWhenOutOfContentRootException : SkipTestException()
private object KtOutOfContentRootModuleFactory : KtModuleFactory {
override fun createModule(
testModule: TestModule,
contextModule: KtModuleWithFiles?,
contextModule: KtTestModule?,
dependencyPaths: Collection<Path>,
testServices: TestServices,
project: Project,
): KtModuleWithFiles {
): KtTestModule {
val psiFiles = TestModuleStructureFactory.createSourcePsiFiles(testModule, testServices, project)
val platform = testModule.targetPlatform
val module = KtNotUnderContentRootModuleForTest(testModule.name, psiFiles.first(), platform)
return KtModuleWithFiles(module, psiFiles)
val ktModule = KtNotUnderContentRootModuleForTest(testModule.name, psiFiles.first(), platform)
return KtTestModule(testModule, ktModule, psiFiles)
}
}
@@ -9,10 +9,10 @@ import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiBaseTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiDecompiledCodeTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.SealedClassesInheritorsCalculatorPreAnalysisHandler
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AnalysisApiFirTestServiceRegistrar
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.configureOptionalTestCompilerPlugin
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure
import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.AnalysisApiBinaryLibraryIndexingMode
import org.jetbrains.kotlin.analysis.test.framework.services.configuration.AnalysisApiJvmEnvironmentConfigurator
@@ -57,7 +57,7 @@ abstract class AnalysisApiFirSourceLikeTestConfigurator(override val analyseInDe
moduleStructure: TestModuleStructure,
testServices: TestServices,
project: Project
): KtModuleProjectStructure {
): KtTestModuleProjectStructure {
return TestModuleStructureFactory.createProjectStructureByTestStructure(moduleStructure, testServices, project)
}
}
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators
import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtModuleFactory
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModule
import org.jetbrains.kotlin.analysis.test.framework.project.structure.createKtLibrarySourceModule
import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
@@ -28,11 +28,11 @@ object AnalysisApiFirStdlibSourceTestConfigurator : AnalysisApiFirSourceLikeTest
private object KtStdlibSourceModuleFactory : KtModuleFactory {
override fun createModule(
testModule: TestModule,
contextModule: KtModuleWithFiles?,
contextModule: KtTestModule?,
dependencyPaths: Collection<Path>,
testServices: TestServices,
project: Project,
): KtModuleWithFiles {
): KtTestModule {
val libraryJar = ForTestCompileRuntime.runtimeJarForTests().toPath()
val librarySourcesJar = ForTestCompileRuntime.runtimeSourcesJarForTests().toPath()
return createKtLibrarySourceModule(
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.light.classes.symbol.decompiled.test.configurators
import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirLibraryBinaryTestConfigurator
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtTestModuleProjectStructure
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind
@@ -32,7 +32,7 @@ object AnalysisApiSymbolLightClassesDecompiledTestConfigurator : AnalysisApiTest
moduleStructure: TestModuleStructure,
testServices: TestServices,
project: Project
): KtModuleProjectStructure {
): KtTestModuleProjectStructure {
return AnalysisApiFirLibraryBinaryTestConfigurator.createModules(moduleStructure, testServices, project)
}
}